diff options
110 files changed, 14665 insertions, 1367 deletions
diff --git a/ChangeLog b/ChangeLog index 1c6189f7071..062dcc02b5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-12-22 Geoff Norton <gnorton@novell.com> + + * configure.in: Fix invalid escaping. Patch from Spina from + www.slacky.eu. + +2009-12-21 Zoltan Varga <vargaz@gmail.com> + + * configure.in: Add an LLVM_CFLAGS automake variable. + 2009-12-11 Zoltan Varga <vargaz@gmail.com> * configure.in: Applied patch from Matt McClellan (matt@mc-c.net). Add a check diff --git a/configure.in b/configure.in index c57b25a0d0d..0a9ed0f3dc4 100644 --- a/configure.in +++ b/configure.in @@ -6,7 +6,7 @@ AC_CANONICAL_SYSTEM m4_ifdef([_A][M_PROG_TAR],[_A][M_SET_OPTION([tar-ustar])]) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(mono,2.6) +AM_INIT_AUTOMAKE(mono,2.6.1) AM_MAINTAINER_MODE API_VER=1.0 @@ -1896,11 +1896,26 @@ if test "x$enable_llvm" = "xyes"; then AC_MSG_ERROR([llvm-config not found.]) fi - LLVM_CXXFLAGS=`$LLVM_CONFIG --cflags` + # The output of --cflags seems to include optimizations flags too + LLVM_CFLAGS=`$LLVM_CONFIG --cflags | sed -e 's/-O2//g' | sed -e 's/-O0//g' | sed -e 's/-fomit-frame-pointer//g' | sed -e 's/-fPIC//g'` + LLVM_CXXFLAGS=`$LLVM_CONFIG --cxxflags` LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags` LLVM_LIBS=`$LLVM_CONFIG --libs core bitwriter jit x86codegen` LLVM_LIBS="$LLVM_LDFLAGS $LLVM_LIBS -lstdc++" + # Should be something like '2.6' or '2.7svn' + llvm_version=`$LLVM_CONFIG --version` + major_version=`echo $llvm_version | cut -c 1` + minor_version=`echo $llvm_version | cut -c 3` + + AC_DEFINE_UNQUOTED(LLVM_MAJOR_VERSION, $major_version, [Major version of LLVM libraries]) + AC_DEFINE_UNQUOTED(LLVM_MINOR_VERSION, $minor_version, [Minor version of LLVM libraries]) + + # Have to pass these on the command line since mini-llvm-cpp.h already includes + # llvm's config.h + LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_MAJOR_VERSION=$major_version -DLLVM_MINOR_VERSION=$minor_version" + + AC_SUBST(LLVM_CFLAGS) AC_SUBST(LLVM_CXXFLAGS) AC_SUBST(LLVM_LIBS) AC_SUBST(LLVM_LDFLAGS) @@ -2428,7 +2443,7 @@ if test x$platform_win32 = xyes; then if test "x$cross_compiling" = "xno"; then mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc else - mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\\'`\\etc + mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc fi else mono_cfg_dir=$mono_cfg_root/etc diff --git a/docs/AgilityPack.dll b/docs/AgilityPack.dll Binary files differdeleted file mode 100755 index 881836dcb59..00000000000 --- a/docs/AgilityPack.dll +++ /dev/null diff --git a/docs/ChangeLog b/docs/ChangeLog index 20f2e861732..4ad7435db8b 100644 --- a/docs/ChangeLog +++ b/docs/ChangeLog @@ -1,3 +1,16 @@ +2009-12-22 Jo Shields <directhex@apebox.org> + * HtmlAgilityPack/LICENSE: Include upstream license (Ms-PL) since the + file headers don't specify it + +2009-12-22 Jo Shields <directhex@apebox.org> + + * HtmlAgilityPack/*: Bundle HtmlAgilityPack 1.4~beta2 from + http://www.codeplex.com/htmlagilitypack in source form. + + * AgilityPack.dll: Remove binary assembly, use source instead. + + * docs.make Makefile.am README: Reflect above changes + 2009-02-12 Zoltan Varga <vargaz@gmail.com> * Makefile.am (EXTRA_DIST): Remove removed files. diff --git a/docs/HtmlAgilityPack/EncodingFoundException.cs b/docs/HtmlAgilityPack/EncodingFoundException.cs new file mode 100644 index 00000000000..bffdc025561 --- /dev/null +++ b/docs/HtmlAgilityPack/EncodingFoundException.cs @@ -0,0 +1,33 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Text;
+
+namespace HtmlAgilityPack
+{
+ internal class EncodingFoundException : Exception
+ {
+ #region Fields
+
+ private Encoding _encoding;
+
+ #endregion
+
+ #region Constructors
+
+ internal EncodingFoundException(Encoding encoding)
+ {
+ _encoding = encoding;
+ }
+
+ #endregion
+
+ #region Properties
+
+ internal Encoding Encoding
+ {
+ get { return _encoding; }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlAttribute.cs b/docs/HtmlAgilityPack/HtmlAttribute.cs new file mode 100644 index 00000000000..7a3de047bea --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlAttribute.cs @@ -0,0 +1,260 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+
+#region
+
+using System;
+using System.Diagnostics;
+
+#endregion
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML attribute.
+ /// </summary>
+ [DebuggerDisplay("Name: {OriginalName}, Value: {Value}")]
+ public class HtmlAttribute : IComparable
+ {
+ #region Fields
+
+ private int _line;
+ internal int _lineposition;
+ internal string _name;
+ internal int _namelength;
+ internal int _namestartindex;
+ internal HtmlDocument _ownerdocument; // attribute can exists without a node
+ internal HtmlNode _ownernode;
+ private AttributeValueQuote _quoteType = AttributeValueQuote.DoubleQuote;
+ internal int _streamposition;
+ internal string _value;
+ internal int _valuelength;
+ internal int _valuestartindex;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlAttribute(HtmlDocument ownerdocument)
+ {
+ _ownerdocument = ownerdocument;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the line number of this attribute in the document.
+ /// </summary>
+ public int Line
+ {
+ get { return _line; }
+ internal set { _line = value; }
+ }
+
+ /// <summary>
+ /// Gets the column number of this attribute in the document.
+ /// </summary>
+ public int LinePosition
+ {
+ get { return _lineposition; }
+ }
+
+ /// <summary>
+ /// Gets the qualified name of the attribute.
+ /// </summary>
+ public string Name
+ {
+ get
+ {
+ if (_name == null)
+ {
+ _name = _ownerdocument._text.Substring(_namestartindex, _namelength);
+ }
+ return _name.ToLower();
+ }
+ set
+ {
+ if (value == null)
+ {
+ throw new ArgumentNullException("value");
+ }
+ _name = value;
+ if (_ownernode != null)
+ {
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Name of attribute with original case
+ /// </summary>
+ public string OriginalName
+ {
+ get { return _name; }
+ }
+
+ /// <summary>
+ /// Gets the HTML document to which this attribute belongs.
+ /// </summary>
+ public HtmlDocument OwnerDocument
+ {
+ get { return _ownerdocument; }
+ }
+
+ /// <summary>
+ /// Gets the HTML node to which this attribute belongs.
+ /// </summary>
+ public HtmlNode OwnerNode
+ {
+ get { return _ownernode; }
+ }
+
+ /// <summary>
+ /// Specifies what type of quote the data should be wrapped in
+ /// </summary>
+ public AttributeValueQuote QuoteType
+ {
+ get { return _quoteType; }
+ set { _quoteType = value; }
+ }
+
+ /// <summary>
+ /// Gets the stream position of this attribute in the document, relative to the start of the document.
+ /// </summary>
+ public int StreamPosition
+ {
+ get { return _streamposition; }
+ }
+
+ /// <summary>
+ /// Gets or sets the value of the attribute.
+ /// </summary>
+ public string Value
+ {
+ get
+ {
+ if (_value == null)
+ {
+ _value = _ownerdocument._text.Substring(_valuestartindex, _valuelength);
+ }
+ return _value;
+ }
+ set
+ {
+ _value = value;
+ if (_ownernode != null)
+ {
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+ }
+ }
+
+ internal string XmlName
+ {
+ get { return HtmlDocument.GetXmlName(Name); }
+ }
+
+ internal string XmlValue
+ {
+ get { return Value; }
+ }
+
+ /// <summary>
+ /// Gets a valid XPath string that points to this Attribute
+ /// </summary>
+ public string XPath
+ {
+ get
+ {
+ string basePath = (OwnerNode == null) ? "/" : OwnerNode.XPath + "/";
+ return basePath + GetRelativeXpath();
+ }
+ }
+
+ #endregion
+
+ #region IComparable Members
+
+ /// <summary>
+ /// Compares the current instance with another attribute. Comparison is based on attributes' name.
+ /// </summary>
+ /// <param name="obj">An attribute to compare with this instance.</param>
+ /// <returns>A 32-bit signed integer that indicates the relative order of the names comparison.</returns>
+ public int CompareTo(object obj)
+ {
+ HtmlAttribute att = obj as HtmlAttribute;
+ if (att == null)
+ {
+ throw new ArgumentException("obj");
+ }
+ return Name.CompareTo(att.Name);
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Creates a duplicate of this attribute.
+ /// </summary>
+ /// <returns>The cloned attribute.</returns>
+ public HtmlAttribute Clone()
+ {
+ HtmlAttribute att = new HtmlAttribute(_ownerdocument);
+ att.Name = Name;
+ att.Value = Value;
+ return att;
+ }
+
+ /// <summary>
+ /// Removes this attribute from it's parents collection
+ /// </summary>
+ public void Remove()
+ {
+ _ownernode.Attributes.Remove(this);
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private string GetRelativeXpath()
+ {
+ if (OwnerNode == null)
+ return Name;
+
+ int i = 1;
+ foreach (HtmlAttribute node in OwnerNode.Attributes)
+ {
+ if (node.Name != Name) continue;
+
+ if (node == this)
+ break;
+
+ i++;
+ }
+ return "@" + Name + "[" + i + "]";
+ }
+
+ #endregion
+ }
+
+ /// <summary>
+ /// An Enum representing different types of Quotes used for surrounding attribute values
+ /// </summary>
+ public enum AttributeValueQuote
+ {
+ /// <summary>
+ /// A single quote mark '
+ /// </summary>
+ SingleQuote,
+ /// <summary>
+ /// A double quote mark "
+ /// </summary>
+ DoubleQuote
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlAttributeCollection.cs b/docs/HtmlAgilityPack/HtmlAttributeCollection.cs new file mode 100644 index 00000000000..07af9979ddb --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlAttributeCollection.cs @@ -0,0 +1,394 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a combined list and collection of HTML nodes.
+ /// </summary>
+ public class HtmlAttributeCollection : IList<HtmlAttribute>
+ {
+ #region Fields
+
+ internal Dictionary<string, HtmlAttribute> Hashitems = new Dictionary<string, HtmlAttribute>();
+ private HtmlNode _ownernode;
+ private List<HtmlAttribute> items = new List<HtmlAttribute>();
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlAttributeCollection(HtmlNode ownernode)
+ {
+ _ownernode = ownernode;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets a given attribute from the list using its name.
+ /// </summary>
+ public HtmlAttribute this[string name]
+ {
+ get
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ return Hashitems.ContainsKey(name.ToLower()) ? Hashitems[name.ToLower()] : null;
+ }
+ set { Append(value); }
+ }
+
+ #endregion
+
+ #region IList<HtmlAttribute> Members
+
+ /// <summary>
+ /// Gets the number of elements actually contained in the list.
+ /// </summary>
+ public int Count
+ {
+ get { return items.Count; }
+ }
+
+ /// <summary>
+ /// Gets readonly status of colelction
+ /// </summary>
+ public bool IsReadOnly
+ {
+ get { return false; }
+ }
+
+ /// <summary>
+ /// Gets the attribute at the specified index.
+ /// </summary>
+ public HtmlAttribute this[int index]
+ {
+ get { return items[index]; }
+ set { items[index] = value; }
+ }
+
+ /// <summary>
+ /// Adds supplied item to collection
+ /// </summary>
+ /// <param name="item"></param>
+ public void Add(HtmlAttribute item)
+ {
+ Append(item);
+ }
+
+ /// <summary>
+ /// Explicit clear
+ /// </summary>
+ void ICollection<HtmlAttribute>.Clear()
+ {
+ items.Clear();
+ }
+
+ /// <summary>
+ /// Retreives existence of supplied item
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Contains(HtmlAttribute item)
+ {
+ return items.Contains(item);
+ }
+
+ /// <summary>
+ /// Copies collection to array
+ /// </summary>
+ /// <param name="array"></param>
+ /// <param name="arrayIndex"></param>
+ public void CopyTo(HtmlAttribute[] array, int arrayIndex)
+ {
+ items.CopyTo(array, arrayIndex);
+ }
+
+ /// <summary>
+ /// Get Explicit enumerator
+ /// </summary>
+ /// <returns></returns>
+ IEnumerator<HtmlAttribute> IEnumerable<HtmlAttribute>.GetEnumerator()
+ {
+ return items.GetEnumerator();
+ }
+
+ /// <summary>
+ /// Explicit non-generic enumerator
+ /// </summary>
+ /// <returns></returns>
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return items.GetEnumerator();
+ }
+
+ /// <summary>
+ /// Retrieves the index for the supplied item, -1 if not found
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public int IndexOf(HtmlAttribute item)
+ {
+ return items.IndexOf(item);
+ }
+
+ /// <summary>
+ /// Inserts given item into collection at supplied index
+ /// </summary>
+ /// <param name="index"></param>
+ /// <param name="item"></param>
+ public void Insert(int index, HtmlAttribute item)
+ {
+ if (item == null)
+ {
+ throw new ArgumentNullException("item");
+ }
+
+ Hashitems[item.Name] = item;
+ item._ownernode = _ownernode;
+ items.Insert(index, item);
+
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+
+ /// <summary>
+ /// Explicit collection remove
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ bool ICollection<HtmlAttribute>.Remove(HtmlAttribute item)
+ {
+ return items.Remove(item);
+ }
+
+ /// <summary>
+ /// Removes the attribute at the specified index.
+ /// </summary>
+ /// <param name="index">The index of the attribute to remove.</param>
+ public void RemoveAt(int index)
+ {
+ HtmlAttribute att = items[index];
+ Hashitems.Remove(att.Name);
+ items.RemoveAt(index);
+
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Adds a new attribute to the collection with the given values
+ /// </summary>
+ /// <param name="name"></param>
+ /// <param name="value"></param>
+ public void Add(string name, string value)
+ {
+ Append(name, value);
+ }
+
+ /// <summary>
+ /// Inserts the specified attribute as the last attribute in the collection.
+ /// </summary>
+ /// <param name="newAttribute">The attribute to insert. May not be null.</param>
+ /// <returns>The appended attribute.</returns>
+ public HtmlAttribute Append(HtmlAttribute newAttribute)
+ {
+ if (newAttribute == null)
+ {
+ throw new ArgumentNullException("newAttribute");
+ }
+
+ Hashitems[newAttribute.Name] = newAttribute;
+ newAttribute._ownernode = _ownernode;
+ items.Add(newAttribute);
+
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ return newAttribute;
+ }
+
+ /// <summary>
+ /// Creates and inserts a new attribute as the last attribute in the collection.
+ /// </summary>
+ /// <param name="name">The name of the attribute to insert.</param>
+ /// <returns>The appended attribute.</returns>
+ public HtmlAttribute Append(string name)
+ {
+ HtmlAttribute att = _ownernode._ownerdocument.CreateAttribute(name);
+ return Append(att);
+ }
+
+ /// <summary>
+ /// Creates and inserts a new attribute as the last attribute in the collection.
+ /// </summary>
+ /// <param name="name">The name of the attribute to insert.</param>
+ /// <param name="value">The value of the attribute to insert.</param>
+ /// <returns>The appended attribute.</returns>
+ public HtmlAttribute Append(string name, string value)
+ {
+ HtmlAttribute att = _ownernode._ownerdocument.CreateAttribute(name, value);
+ return Append(att);
+ }
+
+ /// <summary>
+ /// Checks for existance of attribute with given name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public bool Contains(string name)
+ {
+ for (int i = 0; i < items.Count; i++)
+ {
+ if (items[i].Name.Equals(name.ToLower()))
+ return true;
+ }
+ return false;
+ }
+
+ /// <summary>
+ /// Inserts the specified attribute as the first node in the collection.
+ /// </summary>
+ /// <param name="newAttribute">The attribute to insert. May not be null.</param>
+ /// <returns>The prepended attribute.</returns>
+ public HtmlAttribute Prepend(HtmlAttribute newAttribute)
+ {
+ Insert(0, newAttribute);
+ return newAttribute;
+ }
+
+ /// <summary>
+ /// Removes a given attribute from the list.
+ /// </summary>
+ /// <param name="attribute">The attribute to remove. May not be null.</param>
+ public void Remove(HtmlAttribute attribute)
+ {
+ if (attribute == null)
+ {
+ throw new ArgumentNullException("attribute");
+ }
+ int index = GetAttributeIndex(attribute);
+ if (index == -1)
+ {
+ throw new IndexOutOfRangeException();
+ }
+ RemoveAt(index);
+ }
+
+ /// <summary>
+ /// Removes an attribute from the list, using its name. If there are more than one attributes with this name, they will all be removed.
+ /// </summary>
+ /// <param name="name">The attribute's name. May not be null.</param>
+ public void Remove(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ string lname = name.ToLower();
+ for (int i = 0; i < items.Count; i++)
+ {
+ HtmlAttribute att = items[i];
+ if (att.Name == lname)
+ {
+ RemoveAt(i);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Remove all attributes in the list.
+ /// </summary>
+ public void RemoveAll()
+ {
+ Hashitems.Clear();
+ items.Clear();
+
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+
+ #endregion
+
+ #region LINQ Methods
+
+ /// <summary>
+ /// Returns all attributes with specified name. Handles case insentivity
+ /// </summary>
+ /// <param name="attributeName">Name of the attribute</param>
+ /// <returns></returns>
+ public IEnumerable<HtmlAttribute> AttributesWithName(string attributeName)
+ {
+ attributeName = attributeName.ToLower();
+ for (int i = 0; i < items.Count; i++)
+ {
+ if (items[i].Name.Equals(attributeName))
+ yield return items[i];
+ }
+ }
+
+ /// <summary>
+ /// Removes all attributes from the collection
+ /// </summary>
+ public void Remove()
+ {
+ foreach (HtmlAttribute item in items)
+ item.Remove();
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ /// <summary>
+ /// Clears the attribute collection
+ /// </summary>
+ internal void Clear()
+ {
+ Hashitems.Clear();
+ items.Clear();
+ }
+
+ internal int GetAttributeIndex(HtmlAttribute attribute)
+ {
+ if (attribute == null)
+ {
+ throw new ArgumentNullException("attribute");
+ }
+ for (int i = 0; i < items.Count; i++)
+ {
+ if ((items[i]) == attribute)
+ return i;
+ }
+ return -1;
+ }
+
+ internal int GetAttributeIndex(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ string lname = name.ToLower();
+ for (int i = 0; i < items.Count; i++)
+ {
+ if ((items[i]).Name == lname)
+ return i;
+ }
+ return -1;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlCmdLine.cs b/docs/HtmlAgilityPack/HtmlCmdLine.cs new file mode 100644 index 00000000000..1421765252f --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlCmdLine.cs @@ -0,0 +1,142 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+
+namespace HtmlAgilityPack
+{
+ internal class HtmlCmdLine
+ {
+ #region Static Members
+
+ internal static bool Help;
+
+ #endregion
+
+ #region Constructors
+
+ static HtmlCmdLine()
+ {
+ Help = false;
+ ParseArgs();
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal static string GetOption(string name, string def)
+ {
+ string p = def;
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ GetStringArg(args[i], name, ref p);
+ }
+ return p;
+ }
+
+ internal static string GetOption(int index, string def)
+ {
+ string p = def;
+ string[] args = Environment.GetCommandLineArgs();
+ int j = 0;
+ for (int i = 1; i < args.Length; i++)
+ {
+ if (GetStringArg(args[i], ref p))
+ {
+ if (index == j)
+ return p;
+ else
+ p = def;
+ j++;
+ }
+ }
+ return p;
+ }
+
+ internal static bool GetOption(string name, bool def)
+ {
+ bool p = def;
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ GetBoolArg(args[i], name, ref p);
+ }
+ return p;
+ }
+
+ internal static int GetOption(string name, int def)
+ {
+ int p = def;
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ GetIntArg(args[i], name, ref p);
+ }
+ return p;
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private static void GetBoolArg(string Arg, string Name, ref bool ArgValue)
+ {
+ if (Arg.Length < (Name.Length + 1)) // -name is 1 more than name
+ return;
+ if (('/' != Arg[0]) && ('-' != Arg[0])) // not a param
+ return;
+ if (Arg.Substring(1, Name.Length).ToLower() == Name.ToLower())
+ ArgValue = true;
+ }
+
+ private static void GetIntArg(string Arg, string Name, ref int ArgValue)
+ {
+ if (Arg.Length < (Name.Length + 3)) // -name:12 is 3 more than name
+ return;
+ if (('/' != Arg[0]) && ('-' != Arg[0])) // not a param
+ return;
+ if (Arg.Substring(1, Name.Length).ToLower() == Name.ToLower())
+ {
+ try
+ {
+ ArgValue = Convert.ToInt32(Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2));
+ }
+ catch
+ {
+ }
+ }
+ }
+
+ private static bool GetStringArg(string Arg, ref string ArgValue)
+ {
+ if (('/' == Arg[0]) || ('-' == Arg[0]))
+ return false;
+ ArgValue = Arg;
+ return true;
+ }
+
+ private static void GetStringArg(string Arg, string Name, ref string ArgValue)
+ {
+ if (Arg.Length < (Name.Length + 3)) // -name:x is 3 more than name
+ return;
+ if (('/' != Arg[0]) && ('-' != Arg[0])) // not a param
+ return;
+ if (Arg.Substring(1, Name.Length).ToLower() == Name.ToLower())
+ ArgValue = Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2);
+ }
+
+ private static void ParseArgs()
+ {
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ // help
+ GetBoolArg(args[i], "?", ref Help);
+ GetBoolArg(args[i], "h", ref Help);
+ GetBoolArg(args[i], "help", ref Help);
+ }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlCommentNode.cs b/docs/HtmlAgilityPack/HtmlCommentNode.cs new file mode 100644 index 00000000000..1091dcb13c7 --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlCommentNode.cs @@ -0,0 +1,76 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML comment.
+ /// </summary>
+ public class HtmlCommentNode : HtmlNode
+ {
+ #region Fields
+
+ private string _comment;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlCommentNode(HtmlDocument ownerdocument, int index)
+ :
+ base(HtmlNodeType.Comment, ownerdocument, index)
+ {
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or Sets the comment text of the node.
+ /// </summary>
+ public string Comment
+ {
+ get
+ {
+ if (_comment == null)
+ {
+ return base.InnerHtml;
+ }
+ return _comment;
+ }
+ set { _comment = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the HTML between the start and end tags of the object. In the case of a text node, it is equals to OuterHtml.
+ /// </summary>
+ public override string InnerHtml
+ {
+ get
+ {
+ if (_comment == null)
+ {
+ return base.InnerHtml;
+ }
+ return _comment;
+ }
+ set { _comment = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the object and its content in HTML.
+ /// </summary>
+ public override string OuterHtml
+ {
+ get
+ {
+ if (_comment == null)
+ {
+ return base.OuterHtml;
+ }
+ return "<!--" + _comment + "-->";
+ }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlConsoleListener.cs b/docs/HtmlAgilityPack/HtmlConsoleListener.cs new file mode 100644 index 00000000000..bd14a7a244d --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlConsoleListener.cs @@ -0,0 +1,33 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Diagnostics;
+
+namespace HtmlAgilityPack
+{
+ internal class HtmlConsoleListener : TraceListener
+ {
+ #region Public Methods
+
+ public override void Write(string Message)
+ {
+ Write(Message, "");
+ }
+
+ public override void Write(string Message, string Category)
+ {
+ Console.Write("T:" + Category + ": " + Message);
+ }
+
+ public override void WriteLine(string Message)
+ {
+ Write(Message + "\n");
+ }
+
+ public override void WriteLine(string Message, string Category)
+ {
+ Write(Message + "\n", Category);
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlDocument.cs b/docs/HtmlAgilityPack/HtmlDocument.cs new file mode 100644 index 00000000000..7233da0dfbe --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlDocument.cs @@ -0,0 +1,1962 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Xml;
+using System.Xml.XPath;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a complete HTML document.
+ /// </summary>
+ public class HtmlDocument : IXPathNavigable
+ {
+ #region Fields
+
+ private int _c;
+ private Crc32 _crc32;
+ private HtmlAttribute _currentattribute;
+ private HtmlNode _currentnode;
+ private Encoding _declaredencoding;
+ private HtmlNode _documentnode;
+ private bool _fullcomment;
+ private int _index;
+ internal Hashtable _lastnodes = new Hashtable();
+ private HtmlNode _lastparentnode;
+ private int _line;
+ private int _lineposition, _maxlineposition;
+ internal Hashtable _nodesid;
+ private ParseState _oldstate;
+ private bool _onlyDetectEncoding;
+ internal Hashtable _openednodes;
+ private List<HtmlParseError> _parseerrors = new List<HtmlParseError>();
+ private string _remainder;
+ private int _remainderOffset;
+ private ParseState _state;
+ private Encoding _streamencoding;
+ internal string _text;
+
+ // public props
+
+ /// <summary>
+ /// Adds Debugging attributes to node. Default is false.
+ /// </summary>
+ public bool OptionAddDebuggingAttributes;
+
+ /// <summary>
+ /// Defines if closing for non closed nodes must be done at the end or directly in the document.
+ /// Setting this to true can actually change how browsers render the page. Default is false.
+ /// </summary>
+ public bool OptionAutoCloseOnEnd; // close errors at the end
+
+ /// <summary>
+ /// Defines if non closed nodes will be checked at the end of parsing. Default is true.
+ /// </summary>
+ public bool OptionCheckSyntax = true;
+
+ /// <summary>
+ /// Defines if a checksum must be computed for the document while parsing. Default is false.
+ /// </summary>
+ public bool OptionComputeChecksum;
+
+ /// <summary>
+ /// Defines the default stream encoding to use. Default is System.Text.Encoding.Default.
+ /// </summary>
+ public Encoding OptionDefaultStreamEncoding = Encoding.Default;
+
+ /// <summary>
+ /// Defines if source text must be extracted while parsing errors.
+ /// If the document has a lot of errors, or cascading errors, parsing performance can be dramatically affected if set to true.
+ /// Default is false.
+ /// </summary>
+ public bool OptionExtractErrorSourceText;
+
+ // turning this on can dramatically slow performance if a lot of errors are detected
+
+ /// <summary>
+ /// Defines the maximum length of source text or parse errors. Default is 100.
+ /// </summary>
+ public int OptionExtractErrorSourceTextMaxLength = 100;
+
+ /// <summary>
+ /// Defines if LI, TR, TH, TD tags must be partially fixed when nesting errors are detected. Default is false.
+ /// </summary>
+ public bool OptionFixNestedTags; // fix li, tr, th, td tags
+
+ /// <summary>
+ /// Defines if output must conform to XML, instead of HTML.
+ /// </summary>
+ public bool OptionOutputAsXml;
+
+ /// <summary>
+ /// Defines if attribute value output must be optimized (not bound with double quotes if it is possible). Default is false.
+ /// </summary>
+ public bool OptionOutputOptimizeAttributeValues;
+
+ /// <summary>
+ /// Defines if name must be output with it's original case. Useful for asp.net tags and attributes
+ /// </summary>
+ public bool OptionOutputOriginalCase;
+
+ /// <summary>
+ /// Defines if name must be output in uppercase. Default is false.
+ /// </summary>
+ public bool OptionOutputUpperCase;
+
+ /// <summary>
+ /// Defines if declared encoding must be read from the document.
+ /// Declared encoding is determined using the meta http-equiv="content-type" content="text/html;charset=XXXXX" html node.
+ /// Default is true.
+ /// </summary>
+ public bool OptionReadEncoding = true;
+
+ /// <summary>
+ /// Defines the name of a node that will throw the StopperNodeException when found as an end node. Default is null.
+ /// </summary>
+ public string OptionStopperNodeName;
+
+ /// <summary>
+ /// Defines if the 'id' attribute must be specifically used. Default is true.
+ /// </summary>
+ public bool OptionUseIdAttribute = true;
+
+ /// <summary>
+ /// Defines if empty nodes must be written as closed during output. Default is false.
+ /// </summary>
+ public bool OptionWriteEmptyNodes;
+
+ #endregion
+
+ #region Static Members
+
+ internal static readonly string HtmlExceptionRefNotChild = "Reference node must be a child of this node";
+
+ internal static readonly string HtmlExceptionUseIdAttributeFalse =
+ "You need to set UseIdAttribute property to true to enable this feature";
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Creates an instance of an HTML document.
+ /// </summary>
+ public HtmlDocument()
+ {
+ _documentnode = CreateNode(HtmlNodeType.Document, 0);
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the document CRC32 checksum if OptionComputeChecksum was set to true before parsing, 0 otherwise.
+ /// </summary>
+ public int CheckSum
+ {
+ get
+ {
+ if (_crc32 == null)
+ {
+ return 0;
+ }
+ else
+ {
+ return (int) _crc32.CheckSum;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets the document's declared encoding.
+ /// Declared encoding is determined using the meta http-equiv="content-type" content="text/html;charset=XXXXX" html node.
+ /// </summary>
+ public Encoding DeclaredEncoding
+ {
+ get { return _declaredencoding; }
+ }
+
+ /// <summary>
+ /// Gets the root node of the document.
+ /// </summary>
+ public HtmlNode DocumentNode
+ {
+ get { return _documentnode; }
+ }
+
+ /// <summary>
+ /// Gets the document's output encoding.
+ /// </summary>
+ public Encoding Encoding
+ {
+ get { return GetOutEncoding(); }
+ }
+
+ /// <summary>
+ /// Gets a list of parse errors found in the document.
+ /// </summary>
+ public IEnumerable<HtmlParseError> ParseErrors
+ {
+ get { return _parseerrors; }
+ }
+
+ /// <summary>
+ /// Gets the remaining text.
+ /// Will always be null if OptionStopperNodeName is null.
+ /// </summary>
+ public string Remainder
+ {
+ get { return _remainder; }
+ }
+
+ /// <summary>
+ /// Gets the offset of Remainder in the original Html text.
+ /// If OptionStopperNodeName is null, this will return the length of the original Html text.
+ /// </summary>
+ public int RemainderOffset
+ {
+ get { return _remainderOffset; }
+ }
+
+ /// <summary>
+ /// Gets the document's stream encoding.
+ /// </summary>
+ public Encoding StreamEncoding
+ {
+ get { return _streamencoding; }
+ }
+
+ #endregion
+
+ #region IXPathNavigable Members
+
+ /// <summary>
+ /// Creates a new XPathNavigator object for navigating this HTML document.
+ /// </summary>
+ /// <returns>An XPathNavigator object. The XPathNavigator is positioned on the root of the document.</returns>
+ public XPathNavigator CreateNavigator()
+ {
+ return new HtmlNodeNavigator(this, _documentnode);
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Gets a valid XML name.
+ /// </summary>
+ /// <param name="name">Any text.</param>
+ /// <returns>A string that is a valid XML name.</returns>
+ public static string GetXmlName(string name)
+ {
+ string xmlname = string.Empty;
+ bool nameisok = true;
+ for (int i = 0; i < name.Length; i++)
+ {
+ // names are lcase
+ // note: we are very limited here, too much?
+ if (((name[i] >= 'a') && (name[i] <= 'z')) ||
+ ((name[i] >= '0') && (name[i] <= '9')) ||
+ // (name[i]==':') || (name[i]=='_') || (name[i]=='-') || (name[i]=='.')) // these are bads in fact
+ (name[i] == '_') || (name[i] == '-') || (name[i] == '.'))
+ {
+ xmlname += name[i];
+ }
+ else
+ {
+ nameisok = false;
+ byte[] bytes = Encoding.UTF8.GetBytes(new char[] {name[i]});
+ for (int j = 0; j < bytes.Length; j++)
+ {
+ xmlname += bytes[j].ToString("x2");
+ }
+ xmlname += "_";
+ }
+ }
+ if (nameisok)
+ {
+ return xmlname;
+ }
+ return "_" + xmlname;
+ }
+
+ /// <summary>
+ /// Applies HTML encoding to a specified string.
+ /// </summary>
+ /// <param name="html">The input string to encode. May not be null.</param>
+ /// <returns>The encoded string.</returns>
+ public static string HtmlEncode(string html)
+ {
+ if (html == null)
+ {
+ throw new ArgumentNullException("html");
+ }
+ // replace & by & but only once!
+ Regex rx = new Regex("&(?!(amp;)|(lt;)|(gt;)|(quot;))", RegexOptions.IgnoreCase);
+ return rx.Replace(html, "&").Replace("<", "<").Replace(">", ">").Replace("\"", """);
+ }
+
+ /// <summary>
+ /// Determines if the specified character is considered as a whitespace character.
+ /// </summary>
+ /// <param name="c">The character to check.</param>
+ /// <returns>true if if the specified character is considered as a whitespace character.</returns>
+ public static bool IsWhiteSpace(int c)
+ {
+ if ((c == 10) || (c == 13) || (c == 32) || (c == 9))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ /// <summary>
+ /// Creates an HTML attribute with the specified name.
+ /// </summary>
+ /// <param name="name">The name of the attribute. May not be null.</param>
+ /// <returns>The new HTML attribute.</returns>
+ public HtmlAttribute CreateAttribute(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ HtmlAttribute att = CreateAttribute();
+ att.Name = name;
+ return att;
+ }
+
+ /// <summary>
+ /// Creates an HTML attribute with the specified name.
+ /// </summary>
+ /// <param name="name">The name of the attribute. May not be null.</param>
+ /// <param name="value">The value of the attribute.</param>
+ /// <returns>The new HTML attribute.</returns>
+ public HtmlAttribute CreateAttribute(string name, string value)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ HtmlAttribute att = CreateAttribute(name);
+ att.Value = value;
+ return att;
+ }
+
+ /// <summary>
+ /// Creates an HTML comment node.
+ /// </summary>
+ /// <returns>The new HTML comment node.</returns>
+ public HtmlCommentNode CreateComment()
+ {
+ return (HtmlCommentNode) CreateNode(HtmlNodeType.Comment);
+ }
+
+ /// <summary>
+ /// Creates an HTML comment node with the specified comment text.
+ /// </summary>
+ /// <param name="comment">The comment text. May not be null.</param>
+ /// <returns>The new HTML comment node.</returns>
+ public HtmlCommentNode CreateComment(string comment)
+ {
+ if (comment == null)
+ {
+ throw new ArgumentNullException("comment");
+ }
+ HtmlCommentNode c = CreateComment();
+ c.Comment = comment;
+ return c;
+ }
+
+ /// <summary>
+ /// Creates an HTML element node with the specified name.
+ /// </summary>
+ /// <param name="name">The qualified name of the element. May not be null.</param>
+ /// <returns>The new HTML node.</returns>
+ public HtmlNode CreateElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ HtmlNode node = CreateNode(HtmlNodeType.Element);
+ node.Name = name;
+ return node;
+ }
+
+ /// <summary>
+ /// Creates an HTML text node.
+ /// </summary>
+ /// <returns>The new HTML text node.</returns>
+ public HtmlTextNode CreateTextNode()
+ {
+ return (HtmlTextNode) CreateNode(HtmlNodeType.Text);
+ }
+
+ /// <summary>
+ /// Creates an HTML text node with the specified text.
+ /// </summary>
+ /// <param name="text">The text of the node. May not be null.</param>
+ /// <returns>The new HTML text node.</returns>
+ public HtmlTextNode CreateTextNode(string text)
+ {
+ if (text == null)
+ {
+ throw new ArgumentNullException("text");
+ }
+ HtmlTextNode t = CreateTextNode();
+ t.Text = text;
+ return t;
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML stream.
+ /// </summary>
+ /// <param name="stream">The input stream. May not be null.</param>
+ /// <returns>The detected encoding.</returns>
+ public Encoding DetectEncoding(Stream stream)
+ {
+ if (stream == null)
+ {
+ throw new ArgumentNullException("stream");
+ }
+ return DetectEncoding(new StreamReader(stream));
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML file.
+ /// </summary>
+ /// <param name="path">Path for the file containing the HTML document to detect. May not be null.</param>
+ /// <returns>The detected encoding.</returns>
+ public Encoding DetectEncoding(string path)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ StreamReader sr = new StreamReader(path, OptionDefaultStreamEncoding);
+ Encoding encoding = DetectEncoding(sr);
+ sr.Close();
+ return encoding;
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML text provided on a TextReader.
+ /// </summary>
+ /// <param name="reader">The TextReader used to feed the HTML. May not be null.</param>
+ /// <returns>The detected encoding.</returns>
+ public Encoding DetectEncoding(TextReader reader)
+ {
+ if (reader == null)
+ {
+ throw new ArgumentNullException("reader");
+ }
+ _onlyDetectEncoding = true;
+ if (OptionCheckSyntax)
+ {
+ _openednodes = new Hashtable();
+ }
+ else
+ {
+ _openednodes = null;
+ }
+
+ if (OptionUseIdAttribute)
+ {
+ _nodesid = new Hashtable();
+ }
+ else
+ {
+ _nodesid = null;
+ }
+
+ StreamReader sr = reader as StreamReader;
+ if (sr != null)
+ {
+ _streamencoding = sr.CurrentEncoding;
+ }
+ else
+ {
+ _streamencoding = null;
+ }
+ _declaredencoding = null;
+
+ _text = reader.ReadToEnd();
+ _documentnode = CreateNode(HtmlNodeType.Document, 0);
+
+ // this is almost a hack, but it allows us not to muck with the original parsing code
+ try
+ {
+ Parse();
+ }
+ catch (EncodingFoundException ex)
+ {
+ return ex.Encoding;
+ }
+ return null;
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML document from a file first, and then loads the file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ public void DetectEncodingAndLoad(string path)
+ {
+ DetectEncodingAndLoad(path, true);
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML document from a file first, and then loads the file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="detectEncoding">true to detect encoding, false otherwise.</param>
+ public void DetectEncodingAndLoad(string path, bool detectEncoding)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ Encoding enc;
+ if (detectEncoding)
+ {
+ enc = DetectEncoding(path);
+ }
+ else
+ {
+ enc = null;
+ }
+
+ if (enc == null)
+ {
+ Load(path);
+ }
+ else
+ {
+ Load(path, enc);
+ }
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML text.
+ /// </summary>
+ /// <param name="html">The input html text. May not be null.</param>
+ /// <returns>The detected encoding.</returns>
+ public Encoding DetectEncodingHtml(string html)
+ {
+ if (html == null)
+ {
+ throw new ArgumentNullException("html");
+ }
+ StringReader sr = new StringReader(html);
+ Encoding encoding = DetectEncoding(sr);
+ sr.Close();
+ return encoding;
+ }
+
+ /// <summary>
+ /// Gets the HTML node with the specified 'id' attribute value.
+ /// </summary>
+ /// <param name="id">The attribute id to match. May not be null.</param>
+ /// <returns>The HTML node with the matching id or null if not found.</returns>
+ public HtmlNode GetElementbyId(string id)
+ {
+ if (id == null)
+ {
+ throw new ArgumentNullException("id");
+ }
+ if (_nodesid == null)
+ {
+ throw new Exception(HtmlExceptionUseIdAttributeFalse);
+ }
+
+ return _nodesid[id.ToLower()] as HtmlNode;
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ public void Load(Stream stream)
+ {
+ Load(new StreamReader(stream, OptionDefaultStreamEncoding));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ public void Load(Stream stream, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(stream, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Load(Stream stream, Encoding encoding)
+ {
+ Load(new StreamReader(stream, encoding));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks, buffersize));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ public void Load(string path)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ StreamReader sr = new StreamReader(path, OptionDefaultStreamEncoding);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(string path, bool detectEncodingFromByteOrderMarks)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ StreamReader sr = new StreamReader(path, detectEncodingFromByteOrderMarks);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ public void Load(string path, Encoding encoding)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamReader sr = new StreamReader(path, encoding);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamReader sr = new StreamReader(path, encoding, detectEncodingFromByteOrderMarks);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamReader sr = new StreamReader(path, encoding, detectEncodingFromByteOrderMarks, buffersize);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads the HTML document from the specified TextReader.
+ /// </summary>
+ /// <param name="reader">The TextReader used to feed the HTML data into the document. May not be null.</param>
+ public void Load(TextReader reader)
+ {
+ // all Load methods pass down to this one
+ if (reader == null)
+ {
+ throw new ArgumentNullException("reader");
+ }
+
+ _onlyDetectEncoding = false;
+
+ if (OptionCheckSyntax)
+ {
+ _openednodes = new Hashtable();
+ }
+ else
+ {
+ _openednodes = null;
+ }
+
+ if (OptionUseIdAttribute)
+ {
+ _nodesid = new Hashtable();
+ }
+ else
+ {
+ _nodesid = null;
+ }
+
+ StreamReader sr = reader as StreamReader;
+ if (sr != null)
+ {
+ try
+ {
+ // trigger bom read if needed
+ sr.Peek();
+ }
+ // ReSharper disable EmptyGeneralCatchClause
+ catch (Exception)
+ // ReSharper restore EmptyGeneralCatchClause
+ {
+ // void on purpose
+ }
+ _streamencoding = sr.CurrentEncoding;
+ }
+ else
+ {
+ _streamencoding = null;
+ }
+ _declaredencoding = null;
+
+ _text = reader.ReadToEnd();
+ _documentnode = CreateNode(HtmlNodeType.Document, 0);
+ Parse();
+
+ if (OptionCheckSyntax)
+ {
+ foreach (HtmlNode node in _openednodes.Values)
+ {
+ if (!node._starttag) // already reported
+ {
+ continue;
+ }
+
+ string html;
+ if (OptionExtractErrorSourceText)
+ {
+ html = node.OuterHtml;
+ if (html.Length > OptionExtractErrorSourceTextMaxLength)
+ {
+ html = html.Substring(0, OptionExtractErrorSourceTextMaxLength);
+ }
+ }
+ else
+ {
+ html = string.Empty;
+ }
+ AddError(
+ HtmlParseErrorCode.TagNotClosed,
+ node._line, node._lineposition,
+ node._streamposition, html,
+ "End tag </" + node.Name + "> was not found");
+ }
+
+ // we don't need this anymore
+ _openednodes.Clear();
+ }
+ }
+
+ /// <summary>
+ /// Loads the HTML document from the specified string.
+ /// </summary>
+ /// <param name="html">String containing the HTML document to load. May not be null.</param>
+ public void LoadHtml(string html)
+ {
+ if (html == null)
+ {
+ throw new ArgumentNullException("html");
+ }
+ StringReader sr = new StringReader(html);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified stream.
+ /// </summary>
+ /// <param name="outStream">The stream to which you want to save.</param>
+ public void Save(Stream outStream)
+ {
+ StreamWriter sw = new StreamWriter(outStream, GetOutEncoding());
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified stream.
+ /// </summary>
+ /// <param name="outStream">The stream to which you want to save. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ public void Save(Stream outStream, Encoding encoding)
+ {
+ if (outStream == null)
+ {
+ throw new ArgumentNullException("outStream");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamWriter sw = new StreamWriter(outStream, encoding);
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified file.
+ /// </summary>
+ /// <param name="filename">The location of the file where you want to save the document.</param>
+ public void Save(string filename)
+ {
+ StreamWriter sw = new StreamWriter(filename, false, GetOutEncoding());
+ Save(sw);
+ sw.Close();
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified file.
+ /// </summary>
+ /// <param name="filename">The location of the file where you want to save the document. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ public void Save(string filename, Encoding encoding)
+ {
+ if (filename == null)
+ {
+ throw new ArgumentNullException("filename");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamWriter sw = new StreamWriter(filename, false, encoding);
+ Save(sw);
+ sw.Close();
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified StreamWriter.
+ /// </summary>
+ /// <param name="writer">The StreamWriter to which you want to save.</param>
+ public void Save(StreamWriter writer)
+ {
+ Save((TextWriter) writer);
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified TextWriter.
+ /// </summary>
+ /// <param name="writer">The TextWriter to which you want to save. May not be null.</param>
+ public void Save(TextWriter writer)
+ {
+ if (writer == null)
+ {
+ throw new ArgumentNullException("writer");
+ }
+ DocumentNode.WriteTo(writer);
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified XmlWriter.
+ /// </summary>
+ /// <param name="writer">The XmlWriter to which you want to save.</param>
+ public void Save(XmlWriter writer)
+ {
+ DocumentNode.WriteTo(writer);
+ writer.Flush();
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal HtmlAttribute CreateAttribute()
+ {
+ return new HtmlAttribute(this);
+ }
+
+ internal HtmlNode CreateNode(HtmlNodeType type)
+ {
+ return CreateNode(type, -1);
+ }
+
+ internal HtmlNode CreateNode(HtmlNodeType type, int index)
+ {
+ switch (type)
+ {
+ case HtmlNodeType.Comment:
+ return new HtmlCommentNode(this, index);
+
+ case HtmlNodeType.Text:
+ return new HtmlTextNode(this, index);
+
+ default:
+ return new HtmlNode(type, this, index);
+ }
+ }
+
+ internal Encoding GetOutEncoding()
+ {
+ // when unspecified, use the stream encoding first
+ if (_declaredencoding != null)
+ {
+ return _declaredencoding;
+ }
+ else
+ {
+ if (_streamencoding != null)
+ {
+ return _streamencoding;
+ }
+ }
+ return OptionDefaultStreamEncoding;
+ }
+
+ internal HtmlNode GetXmlDeclaration()
+ {
+ if (!_documentnode.HasChildNodes)
+ {
+ return null;
+ }
+
+ foreach (HtmlNode node in _documentnode._childnodes)
+ {
+ if (node.Name == "?xml") // it's ok, names are case sensitive
+ {
+ return node;
+ }
+ }
+ return null;
+ }
+
+ internal void SetIdForNode(HtmlNode node, string id)
+ {
+ if (!OptionUseIdAttribute)
+ {
+ return;
+ }
+
+ if ((_nodesid == null) || (id == null))
+ {
+ return;
+ }
+
+ if (node == null)
+ {
+ _nodesid.Remove(id.ToLower());
+ }
+ else
+ {
+ _nodesid[id.ToLower()] = node;
+ }
+ }
+
+ internal void UpdateLastParentNode()
+ {
+ do
+ {
+ if (_lastparentnode.Closed)
+ {
+ _lastparentnode = _lastparentnode.ParentNode;
+ }
+ } while ((_lastparentnode != null) && (_lastparentnode.Closed));
+ if (_lastparentnode == null)
+ {
+ _lastparentnode = _documentnode;
+ }
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private HtmlParseError AddError(
+ HtmlParseErrorCode code,
+ int line,
+ int linePosition,
+ int streamPosition,
+ string sourceText,
+ string reason)
+ {
+ HtmlParseError err = new HtmlParseError(code, line, linePosition, streamPosition, sourceText, reason);
+ _parseerrors.Add(err);
+ return err;
+ }
+
+ private void CloseCurrentNode()
+ {
+ if (_currentnode.Closed) // text or document are by def closed
+ return;
+
+ bool error = false;
+
+ // find last node of this kind
+ HtmlNode prev = (HtmlNode) _lastnodes[_currentnode.Name];
+ if (prev == null)
+ {
+ if (HtmlNode.IsClosedElement(_currentnode.Name))
+ {
+ // </br> will be seen as <br>
+ _currentnode.CloseNode(_currentnode);
+
+ // add to parent node
+ if (_lastparentnode != null)
+ {
+ HtmlNode foundNode = null;
+ Stack futureChild = new Stack();
+ for (HtmlNode node = _lastparentnode.LastChild; node != null; node = node.PreviousSibling)
+ {
+ if ((node.Name == _currentnode.Name) && (!node.HasChildNodes))
+ {
+ foundNode = node;
+ break;
+ }
+ futureChild.Push(node);
+ }
+ if (foundNode != null)
+ {
+ HtmlNode node = null;
+ while (futureChild.Count != 0)
+ {
+ node = (HtmlNode) futureChild.Pop();
+ _lastparentnode.RemoveChild(node);
+ foundNode.AppendChild(node);
+ }
+ }
+ else
+ {
+ _lastparentnode.AppendChild(_currentnode);
+ }
+ }
+ }
+ else
+ {
+ // node has no parent
+ // node is not a closed node
+
+ if (HtmlNode.CanOverlapElement(_currentnode.Name))
+ {
+ // this is a hack: add it as a text node
+ HtmlNode closenode = CreateNode(HtmlNodeType.Text, _currentnode._outerstartindex);
+ closenode._outerlength = _currentnode._outerlength;
+ ((HtmlTextNode) closenode).Text = ((HtmlTextNode) closenode).Text.ToLower();
+ if (_lastparentnode != null)
+ {
+ _lastparentnode.AppendChild(closenode);
+ }
+ }
+ else
+ {
+ if (HtmlNode.IsEmptyElement(_currentnode.Name))
+ {
+ AddError(
+ HtmlParseErrorCode.EndTagNotRequired,
+ _currentnode._line, _currentnode._lineposition,
+ _currentnode._streamposition, _currentnode.OuterHtml,
+ "End tag </" + _currentnode.Name + "> is not required");
+ }
+ else
+ {
+ // node cannot overlap, node is not empty
+ AddError(
+ HtmlParseErrorCode.TagNotOpened,
+ _currentnode._line, _currentnode._lineposition,
+ _currentnode._streamposition, _currentnode.OuterHtml,
+ "Start tag <" + _currentnode.Name + "> was not found");
+ error = true;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (OptionFixNestedTags)
+ {
+ if (FindResetterNodes(prev, GetResetters(_currentnode.Name)))
+ {
+ AddError(
+ HtmlParseErrorCode.EndTagInvalidHere,
+ _currentnode._line, _currentnode._lineposition,
+ _currentnode._streamposition, _currentnode.OuterHtml,
+ "End tag </" + _currentnode.Name + "> invalid here");
+ error = true;
+ }
+ }
+
+ if (!error)
+ {
+ _lastnodes[_currentnode.Name] = prev._prevwithsamename;
+ prev.CloseNode(_currentnode);
+ }
+ }
+
+
+ // we close this node, get grandparent
+ if (!error)
+ {
+ if ((_lastparentnode != null) &&
+ ((!HtmlNode.IsClosedElement(_currentnode.Name)) ||
+ (_currentnode._starttag)))
+ {
+ UpdateLastParentNode();
+ }
+ }
+ }
+
+ private string CurrentAttributeName()
+ {
+ return _text.Substring(_currentattribute._namestartindex, _currentattribute._namelength);
+ }
+
+ private string CurrentAttributeValue()
+ {
+ return _text.Substring(_currentattribute._valuestartindex, _currentattribute._valuelength);
+ }
+
+ private string CurrentNodeInner()
+ {
+ return _text.Substring(_currentnode._innerstartindex, _currentnode._innerlength);
+ }
+
+ private string CurrentNodeName()
+ {
+ return _text.Substring(_currentnode._namestartindex, _currentnode._namelength);
+ }
+
+ private string CurrentNodeOuter()
+ {
+ return _text.Substring(_currentnode._outerstartindex, _currentnode._outerlength);
+ }
+
+
+ private void DecrementPosition()
+ {
+ _index--;
+ if (_lineposition == 1)
+ {
+ _lineposition = _maxlineposition;
+ _line--;
+ }
+ else
+ {
+ _lineposition--;
+ }
+ }
+
+ private HtmlNode FindResetterNode(HtmlNode node, string name)
+ {
+ HtmlNode resetter = (HtmlNode) _lastnodes[name];
+ if (resetter == null)
+ return null;
+ if (resetter.Closed)
+ {
+ return null;
+ }
+ if (resetter._streamposition < node._streamposition)
+ {
+ return null;
+ }
+ return resetter;
+ }
+
+ private bool FindResetterNodes(HtmlNode node, string[] names)
+ {
+ if (names == null)
+ {
+ return false;
+ }
+ for (int i = 0; i < names.Length; i++)
+ {
+ if (FindResetterNode(node, names[i]) != null)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void FixNestedTag(string name, string[] resetters)
+ {
+ if (resetters == null)
+ return;
+
+ HtmlNode prev;
+
+ // if we find a previous unclosed same name node, without a resetter node between, we must close it
+ prev = (HtmlNode) _lastnodes[name];
+ if ((prev != null) && (!prev.Closed))
+ {
+ // try to find a resetter node, if found, we do nothing
+ if (FindResetterNodes(prev, resetters))
+ {
+ return;
+ }
+
+ // ok we need to close the prev now
+ // create a fake closer node
+ HtmlNode close = new HtmlNode(prev.NodeType, this, -1);
+ close._endnode = close;
+ prev.CloseNode(close);
+ }
+ }
+
+ private void FixNestedTags()
+ {
+ // we are only interested by start tags, not closing tags
+ if (!_currentnode._starttag)
+ return;
+
+ string name = CurrentNodeName();
+ FixNestedTag(name, GetResetters(name));
+ }
+
+ private string[] GetResetters(string name)
+ {
+ switch (name)
+ {
+ case "li":
+ return new string[] {"ul"};
+
+ case "tr":
+ return new string[] {"table"};
+
+ case "th":
+ case "td":
+ return new string[] {"tr", "table"};
+
+ default:
+ return null;
+ }
+ }
+
+ private void IncrementPosition()
+ {
+ if (_crc32 != null)
+ {
+ // REVIEW: should we add some checksum code in DecrementPosition too?
+ _crc32.AddToCRC32(_c);
+ }
+
+ _index++;
+ _maxlineposition = _lineposition;
+ if (_c == 10)
+ {
+ _lineposition = 1;
+ _line++;
+ }
+ else
+ {
+ _lineposition++;
+ }
+ }
+
+ private bool NewCheck()
+ {
+ if (_c != '<')
+ {
+ return false;
+ }
+ if (_index < _text.Length)
+ {
+ if (_text[_index] == '%')
+ {
+ switch (_state)
+ {
+ case ParseState.AttributeAfterEquals:
+ PushAttributeValueStart(_index - 1);
+ break;
+
+ case ParseState.BetweenAttributes:
+ PushAttributeNameStart(_index - 1);
+ break;
+
+ case ParseState.WhichTag:
+ PushNodeNameStart(true, _index - 1);
+ _state = ParseState.Tag;
+ break;
+ }
+ _oldstate = _state;
+ _state = ParseState.ServerSideCode;
+ return true;
+ }
+ }
+
+ if (!PushNodeEnd(_index - 1, true))
+ {
+ // stop parsing
+ _index = _text.Length;
+ return true;
+ }
+ _state = ParseState.WhichTag;
+ if ((_index - 1) <= (_text.Length - 2))
+ {
+ if (_text[_index] == '!')
+ {
+ PushNodeStart(HtmlNodeType.Comment, _index - 1);
+ PushNodeNameStart(true, _index);
+ PushNodeNameEnd(_index + 1);
+ _state = ParseState.Comment;
+ if (_index < (_text.Length - 2))
+ {
+ if ((_text[_index + 1] == '-') &&
+ (_text[_index + 2] == '-'))
+ {
+ _fullcomment = true;
+ }
+ else
+ {
+ _fullcomment = false;
+ }
+ }
+ return true;
+ }
+ }
+ PushNodeStart(HtmlNodeType.Element, _index - 1);
+ return true;
+ }
+
+ private void Parse()
+ {
+ int lastquote = 0;
+ if (OptionComputeChecksum)
+ {
+ _crc32 = new Crc32();
+ }
+
+ _lastnodes = new Hashtable();
+ _c = 0;
+ _fullcomment = false;
+ _parseerrors = new List<HtmlParseError>();
+ _line = 1;
+ _lineposition = 1;
+ _maxlineposition = 1;
+
+ _state = ParseState.Text;
+ _oldstate = _state;
+ _documentnode._innerlength = _text.Length;
+ _documentnode._outerlength = _text.Length;
+ _remainderOffset = _text.Length;
+
+ _lastparentnode = _documentnode;
+ _currentnode = CreateNode(HtmlNodeType.Text, 0);
+ _currentattribute = null;
+
+ _index = 0;
+ PushNodeStart(HtmlNodeType.Text, 0);
+ while (_index < _text.Length)
+ {
+ _c = _text[_index];
+ IncrementPosition();
+
+ switch (_state)
+ {
+ case ParseState.Text:
+ if (NewCheck())
+ continue;
+ break;
+
+ case ParseState.WhichTag:
+ if (NewCheck())
+ continue;
+ if (_c == '/')
+ {
+ PushNodeNameStart(false, _index);
+ }
+ else
+ {
+ PushNodeNameStart(true, _index - 1);
+ DecrementPosition();
+ }
+ _state = ParseState.Tag;
+ break;
+
+ case ParseState.Tag:
+ if (NewCheck())
+ continue;
+ if (IsWhiteSpace(_c))
+ {
+ PushNodeNameEnd(_index - 1);
+ if (_state != ParseState.Tag)
+ continue;
+ _state = ParseState.BetweenAttributes;
+ continue;
+ }
+ if (_c == '/')
+ {
+ PushNodeNameEnd(_index - 1);
+ if (_state != ParseState.Tag)
+ continue;
+ _state = ParseState.EmptyTag;
+ continue;
+ }
+ if (_c == '>')
+ {
+ PushNodeNameEnd(_index - 1);
+ if (_state != ParseState.Tag)
+ continue;
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.Tag)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ }
+ break;
+
+ case ParseState.BetweenAttributes:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ continue;
+
+ if ((_c == '/') || (_c == '?'))
+ {
+ _state = ParseState.EmptyTag;
+ continue;
+ }
+
+ if (_c == '>')
+ {
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+
+ if (_state != ParseState.BetweenAttributes)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+
+ PushAttributeNameStart(_index - 1);
+ _state = ParseState.AttributeName;
+ break;
+
+ case ParseState.EmptyTag:
+ if (NewCheck())
+ continue;
+
+ if (_c == '>')
+ {
+ if (!PushNodeEnd(_index, true))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+
+ if (_state != ParseState.EmptyTag)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ _state = ParseState.BetweenAttributes;
+ break;
+
+ case ParseState.AttributeName:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ {
+ PushAttributeNameEnd(_index - 1);
+ _state = ParseState.AttributeBeforeEquals;
+ continue;
+ }
+ if (_c == '=')
+ {
+ PushAttributeNameEnd(_index - 1);
+ _state = ParseState.AttributeAfterEquals;
+ continue;
+ }
+ if (_c == '>')
+ {
+ PushAttributeNameEnd(_index - 1);
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.AttributeName)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ break;
+
+ case ParseState.AttributeBeforeEquals:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ continue;
+ if (_c == '>')
+ {
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.AttributeBeforeEquals)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ if (_c == '=')
+ {
+ _state = ParseState.AttributeAfterEquals;
+ continue;
+ }
+ // no equals, no whitespace, it's a new attrribute starting
+ _state = ParseState.BetweenAttributes;
+ DecrementPosition();
+ break;
+
+ case ParseState.AttributeAfterEquals:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ continue;
+
+ if ((_c == '\'') || (_c == '"'))
+ {
+ _state = ParseState.QuotedAttributeValue;
+ PushAttributeValueStart(_index, _c);
+ lastquote = _c;
+ continue;
+ }
+ if (_c == '>')
+ {
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.AttributeAfterEquals)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ PushAttributeValueStart(_index - 1);
+ _state = ParseState.AttributeValue;
+ break;
+
+ case ParseState.AttributeValue:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ {
+ PushAttributeValueEnd(_index - 1);
+ _state = ParseState.BetweenAttributes;
+ continue;
+ }
+
+ if (_c == '>')
+ {
+ PushAttributeValueEnd(_index - 1);
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.AttributeValue)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ break;
+
+ case ParseState.QuotedAttributeValue:
+ if (_c == lastquote)
+ {
+ PushAttributeValueEnd(_index - 1);
+ _state = ParseState.BetweenAttributes;
+ continue;
+ }
+ if (_c == '<')
+ {
+ if (_index < _text.Length)
+ {
+ if (_text[_index] == '%')
+ {
+ _oldstate = _state;
+ _state = ParseState.ServerSideCode;
+ continue;
+ }
+ }
+ }
+ break;
+
+ case ParseState.Comment:
+ if (_c == '>')
+ {
+ if (_fullcomment)
+ {
+ if ((_text[_index - 2] != '-') ||
+ (_text[_index - 3] != '-'))
+ {
+ continue;
+ }
+ }
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ break;
+
+ case ParseState.ServerSideCode:
+ if (_c == '%')
+ {
+ if (_index < _text.Length)
+ {
+ if (_text[_index] == '>')
+ {
+ switch (_oldstate)
+ {
+ case ParseState.AttributeAfterEquals:
+ _state = ParseState.AttributeValue;
+ break;
+
+ case ParseState.BetweenAttributes:
+ PushAttributeNameEnd(_index + 1);
+ _state = ParseState.BetweenAttributes;
+ break;
+
+ default:
+ _state = _oldstate;
+ break;
+ }
+ IncrementPosition();
+ }
+ }
+ }
+ break;
+
+ case ParseState.PcData:
+ // look for </tag + 1 char
+
+ // check buffer end
+ if ((_currentnode._namelength + 3) <= (_text.Length - (_index - 1)))
+ {
+ if (string.Compare(_text.Substring(_index - 1, _currentnode._namelength + 2),
+ "</" + _currentnode.Name, true) == 0)
+ {
+ int c = _text[_index - 1 + 2 + _currentnode.Name.Length];
+ if ((c == '>') || (IsWhiteSpace(c)))
+ {
+ // add the script as a text node
+ HtmlNode script = CreateNode(HtmlNodeType.Text,
+ _currentnode._outerstartindex +
+ _currentnode._outerlength);
+ script._outerlength = _index - 1 - script._outerstartindex;
+ _currentnode.AppendChild(script);
+
+
+ PushNodeStart(HtmlNodeType.Element, _index - 1);
+ PushNodeNameStart(false, _index - 1 + 2);
+ _state = ParseState.Tag;
+ IncrementPosition();
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ // finish the current work
+ if (_currentnode._namestartindex > 0)
+ {
+ PushNodeNameEnd(_index);
+ }
+ PushNodeEnd(_index, false);
+
+ // we don't need this anymore
+ _lastnodes.Clear();
+ }
+
+ private void PushAttributeNameEnd(int index)
+ {
+ _currentattribute._namelength = index - _currentattribute._namestartindex;
+ _currentnode.Attributes.Append(_currentattribute);
+ }
+
+ private void PushAttributeNameStart(int index)
+ {
+ _currentattribute = CreateAttribute();
+ _currentattribute._namestartindex = index;
+ _currentattribute.Line = _line;
+ _currentattribute._lineposition = _lineposition;
+ _currentattribute._streamposition = index;
+ }
+
+ private void PushAttributeValueEnd(int index)
+ {
+ _currentattribute._valuelength = index - _currentattribute._valuestartindex;
+ }
+
+ private void PushAttributeValueStart(int index)
+ {
+ PushAttributeValueStart(index, 0);
+ }
+
+ private void PushAttributeValueStart(int index, int quote)
+ {
+ _currentattribute._valuestartindex = index;
+ if (quote == '\'')
+ _currentattribute.QuoteType = AttributeValueQuote.SingleQuote;
+ }
+
+ private bool PushNodeEnd(int index, bool close)
+ {
+ _currentnode._outerlength = index - _currentnode._outerstartindex;
+
+ if ((_currentnode._nodetype == HtmlNodeType.Text) ||
+ (_currentnode._nodetype == HtmlNodeType.Comment))
+ {
+ // forget about void nodes
+ if (_currentnode._outerlength > 0)
+ {
+ _currentnode._innerlength = _currentnode._outerlength;
+ _currentnode._innerstartindex = _currentnode._outerstartindex;
+ if (_lastparentnode != null)
+ {
+ _lastparentnode.AppendChild(_currentnode);
+ }
+ }
+ }
+ else
+ {
+ if ((_currentnode._starttag) && (_lastparentnode != _currentnode))
+ {
+ // add to parent node
+ if (_lastparentnode != null)
+ {
+ _lastparentnode.AppendChild(_currentnode);
+ }
+
+ ReadDocumentEncoding(_currentnode);
+
+ // remember last node of this kind
+ HtmlNode prev = (HtmlNode) _lastnodes[_currentnode.Name];
+ _currentnode._prevwithsamename = prev;
+ _lastnodes[_currentnode.Name] = _currentnode;
+
+ // change parent?
+ if ((_currentnode.NodeType == HtmlNodeType.Document) ||
+ (_currentnode.NodeType == HtmlNodeType.Element))
+ {
+ _lastparentnode = _currentnode;
+ }
+
+ if (HtmlNode.IsCDataElement(CurrentNodeName()))
+ {
+ _state = ParseState.PcData;
+ return true;
+ }
+
+ if ((HtmlNode.IsClosedElement(_currentnode.Name)) ||
+ (HtmlNode.IsEmptyElement(_currentnode.Name)))
+ {
+ close = true;
+ }
+ }
+ }
+
+ if ((close) || (!_currentnode._starttag))
+ {
+ if ((OptionStopperNodeName != null) && (_remainder == null) &&
+ (string.Compare(_currentnode.Name, OptionStopperNodeName, true) == 0))
+ {
+ _remainderOffset = index;
+ _remainder = _text.Substring(_remainderOffset);
+ CloseCurrentNode();
+ return false; // stop parsing
+ }
+ CloseCurrentNode();
+ }
+ return true;
+ }
+
+ private void PushNodeNameEnd(int index)
+ {
+ _currentnode._namelength = index - _currentnode._namestartindex;
+ if (OptionFixNestedTags)
+ {
+ FixNestedTags();
+ }
+ }
+
+ private void PushNodeNameStart(bool starttag, int index)
+ {
+ _currentnode._starttag = starttag;
+ _currentnode._namestartindex = index;
+ }
+
+ private void PushNodeStart(HtmlNodeType type, int index)
+ {
+ _currentnode = CreateNode(type, index);
+ _currentnode._line = _line;
+ _currentnode._lineposition = _lineposition;
+ if (type == HtmlNodeType.Element)
+ {
+ _currentnode._lineposition--;
+ }
+ _currentnode._streamposition = index;
+ }
+
+ private void ReadDocumentEncoding(HtmlNode node)
+ {
+ if (!OptionReadEncoding)
+ return;
+ // format is
+ // <meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
+
+ // when we append a child, we are in node end, so attributes are already populated
+ if (node._namelength == 4) // quick check, avoids string alloc
+ {
+ if (node.Name == "meta") // all nodes names are lowercase
+ {
+ HtmlAttribute att = node.Attributes["http-equiv"];
+ if (att != null)
+ {
+ if (string.Compare(att.Value, "content-type", true) == 0)
+ {
+ HtmlAttribute content = node.Attributes["content"];
+ if (content != null)
+ {
+ string charset = NameValuePairList.GetNameValuePairsValue(content.Value, "charset");
+ if (charset != null && (charset = charset.Trim()).Length > 0)
+ {
+ _declaredencoding = Encoding.GetEncoding(charset.Trim());
+ if (_onlyDetectEncoding)
+ {
+ throw new EncodingFoundException(_declaredencoding);
+ }
+
+ if (_streamencoding != null)
+ {
+ if (_declaredencoding.WindowsCodePage != _streamencoding.WindowsCodePage)
+ {
+ AddError(
+ HtmlParseErrorCode.CharsetMismatch,
+ _line, _lineposition,
+ _index, node.OuterHtml,
+ "Encoding mismatch between StreamEncoding: " +
+ _streamencoding.WebName + " and DeclaredEncoding: " +
+ _declaredencoding.WebName);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region Nested type: ParseState
+
+ private enum ParseState
+ {
+ Text,
+ WhichTag,
+ Tag,
+ BetweenAttributes,
+ EmptyTag,
+ AttributeName,
+ AttributeBeforeEquals,
+ AttributeAfterEquals,
+ AttributeValue,
+ Comment,
+ QuotedAttributeValue,
+ ServerSideCode,
+ PcData
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlElementFlag.cs b/docs/HtmlAgilityPack/HtmlElementFlag.cs new file mode 100644 index 00000000000..01232cda8ed --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlElementFlag.cs @@ -0,0 +1,32 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Flags that describe the behavior of an Element node.
+ /// </summary>
+ [Flags]
+ public enum HtmlElementFlag
+ {
+ /// <summary>
+ /// The node is a CDATA node.
+ /// </summary>
+ CData = 1,
+
+ /// <summary>
+ /// The node is empty. META or IMG are example of such nodes.
+ /// </summary>
+ Empty = 2,
+
+ /// <summary>
+ /// The node will automatically be closed during parsing.
+ /// </summary>
+ Closed = 4,
+
+ /// <summary>
+ /// The node can overlap.
+ /// </summary>
+ CanOverlap = 8
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlEntity.cs b/docs/HtmlAgilityPack/HtmlEntity.cs new file mode 100644 index 00000000000..b79404dc4b6 --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlEntity.cs @@ -0,0 +1,826 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Text;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// A utility class to replace special characters by entities and vice-versa.
+ /// Follows HTML 4.0 specification found at http://www.w3.org/TR/html4/sgml/entities.html
+ /// </summary>
+ public class HtmlEntity
+ {
+ #region Static Members
+
+ private static readonly int _maxEntitySize;
+ private static Hashtable _entityName;
+ private static Hashtable _entityValue;
+
+ /// <summary>
+ /// A collection of entities indexed by name.
+ /// </summary>
+ public static Hashtable EntityName
+ {
+ get { return _entityName; }
+ }
+
+ /// <summary>
+ /// A collection of entities indexed by value.
+ /// </summary>
+ public static Hashtable EntityValue
+ {
+ get { return _entityValue; }
+ }
+
+ #endregion
+
+ #region Constructors
+
+ static HtmlEntity()
+ {
+ _entityName = new Hashtable();
+ _entityValue = new Hashtable();
+
+ #region Entities Definition
+
+ _entityValue.Add("nbsp", 160); // no-break space = non-breaking space, U+00A0 ISOnum
+ _entityName.Add(160, "nbsp");
+ _entityValue.Add("iexcl", 161); // inverted exclamation mark, U+00A1 ISOnum
+ _entityName.Add(161, "iexcl");
+ _entityValue.Add("cent", 162); // cent sign, U+00A2 ISOnum
+ _entityName.Add(162, "cent");
+ _entityValue.Add("pound", 163); // pound sign, U+00A3 ISOnum
+ _entityName.Add(163, "pound");
+ _entityValue.Add("curren", 164); // currency sign, U+00A4 ISOnum
+ _entityName.Add(164, "curren");
+ _entityValue.Add("yen", 165); // yen sign = yuan sign, U+00A5 ISOnum
+ _entityName.Add(165, "yen");
+ _entityValue.Add("brvbar", 166); // broken bar = broken vertical bar, U+00A6 ISOnum
+ _entityName.Add(166, "brvbar");
+ _entityValue.Add("sect", 167); // section sign, U+00A7 ISOnum
+ _entityName.Add(167, "sect");
+ _entityValue.Add("uml", 168); // diaeresis = spacing diaeresis, U+00A8 ISOdia
+ _entityName.Add(168, "uml");
+ _entityValue.Add("copy", 169); // copyright sign, U+00A9 ISOnum
+ _entityName.Add(169, "copy");
+ _entityValue.Add("ordf", 170); // feminine ordinal indicator, U+00AA ISOnum
+ _entityName.Add(170, "ordf");
+ _entityValue.Add("laquo", 171);
+ // left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum
+ _entityName.Add(171, "laquo");
+ _entityValue.Add("not", 172); // not sign, U+00AC ISOnum
+ _entityName.Add(172, "not");
+ _entityValue.Add("shy", 173); // soft hyphen = discretionary hyphen, U+00AD ISOnum
+ _entityName.Add(173, "shy");
+ _entityValue.Add("reg", 174); // registered sign = registered trade mark sign, U+00AE ISOnum
+ _entityName.Add(174, "reg");
+ _entityValue.Add("macr", 175); // macron = spacing macron = overline = APL overbar, U+00AF ISOdia
+ _entityName.Add(175, "macr");
+ _entityValue.Add("deg", 176); // degree sign, U+00B0 ISOnum
+ _entityName.Add(176, "deg");
+ _entityValue.Add("plusmn", 177); // plus-minus sign = plus-or-minus sign, U+00B1 ISOnum
+ _entityName.Add(177, "plusmn");
+ _entityValue.Add("sup2", 178); // superscript two = superscript digit two = squared, U+00B2 ISOnum
+ _entityName.Add(178, "sup2");
+ _entityValue.Add("sup3", 179); // superscript three = superscript digit three = cubed, U+00B3 ISOnum
+ _entityName.Add(179, "sup3");
+ _entityValue.Add("acute", 180); // acute accent = spacing acute, U+00B4 ISOdia
+ _entityName.Add(180, "acute");
+ _entityValue.Add("micro", 181); // micro sign, U+00B5 ISOnum
+ _entityName.Add(181, "micro");
+ _entityValue.Add("para", 182); // pilcrow sign = paragraph sign, U+00B6 ISOnum
+ _entityName.Add(182, "para");
+ _entityValue.Add("middot", 183); // middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum
+ _entityName.Add(183, "middot");
+ _entityValue.Add("cedil", 184); // cedilla = spacing cedilla, U+00B8 ISOdia
+ _entityName.Add(184, "cedil");
+ _entityValue.Add("sup1", 185); // superscript one = superscript digit one, U+00B9 ISOnum
+ _entityName.Add(185, "sup1");
+ _entityValue.Add("ordm", 186); // masculine ordinal indicator, U+00BA ISOnum
+ _entityName.Add(186, "ordm");
+ _entityValue.Add("raquo", 187);
+ // right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum
+ _entityName.Add(187, "raquo");
+ _entityValue.Add("frac14", 188); // vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum
+ _entityName.Add(188, "frac14");
+ _entityValue.Add("frac12", 189); // vulgar fraction one half = fraction one half, U+00BD ISOnum
+ _entityName.Add(189, "frac12");
+ _entityValue.Add("frac34", 190); // vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum
+ _entityName.Add(190, "frac34");
+ _entityValue.Add("iquest", 191); // inverted question mark = turned question mark, U+00BF ISOnum
+ _entityName.Add(191, "iquest");
+ _entityValue.Add("Agrave", 192);
+ // latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1
+ _entityName.Add(192, "Agrave");
+ _entityValue.Add("Aacute", 193); // latin capital letter A with acute, U+00C1 ISOlat1
+ _entityName.Add(193, "Aacute");
+ _entityValue.Add("Acirc", 194); // latin capital letter A with circumflex, U+00C2 ISOlat1
+ _entityName.Add(194, "Acirc");
+ _entityValue.Add("Atilde", 195); // latin capital letter A with tilde, U+00C3 ISOlat1
+ _entityName.Add(195, "Atilde");
+ _entityValue.Add("Auml", 196); // latin capital letter A with diaeresis, U+00C4 ISOlat1
+ _entityName.Add(196, "Auml");
+ _entityValue.Add("Aring", 197);
+ // latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1
+ _entityName.Add(197, "Aring");
+ _entityValue.Add("AElig", 198); // latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1
+ _entityName.Add(198, "AElig");
+ _entityValue.Add("Ccedil", 199); // latin capital letter C with cedilla, U+00C7 ISOlat1
+ _entityName.Add(199, "Ccedil");
+ _entityValue.Add("Egrave", 200); // latin capital letter E with grave, U+00C8 ISOlat1
+ _entityName.Add(200, "Egrave");
+ _entityValue.Add("Eacute", 201); // latin capital letter E with acute, U+00C9 ISOlat1
+ _entityName.Add(201, "Eacute");
+ _entityValue.Add("Ecirc", 202); // latin capital letter E with circumflex, U+00CA ISOlat1
+ _entityName.Add(202, "Ecirc");
+ _entityValue.Add("Euml", 203); // latin capital letter E with diaeresis, U+00CB ISOlat1
+ _entityName.Add(203, "Euml");
+ _entityValue.Add("Igrave", 204); // latin capital letter I with grave, U+00CC ISOlat1
+ _entityName.Add(204, "Igrave");
+ _entityValue.Add("Iacute", 205); // latin capital letter I with acute, U+00CD ISOlat1
+ _entityName.Add(205, "Iacute");
+ _entityValue.Add("Icirc", 206); // latin capital letter I with circumflex, U+00CE ISOlat1
+ _entityName.Add(206, "Icirc");
+ _entityValue.Add("Iuml", 207); // latin capital letter I with diaeresis, U+00CF ISOlat1
+ _entityName.Add(207, "Iuml");
+ _entityValue.Add("ETH", 208); // latin capital letter ETH, U+00D0 ISOlat1
+ _entityName.Add(208, "ETH");
+ _entityValue.Add("Ntilde", 209); // latin capital letter N with tilde, U+00D1 ISOlat1
+ _entityName.Add(209, "Ntilde");
+ _entityValue.Add("Ograve", 210); // latin capital letter O with grave, U+00D2 ISOlat1
+ _entityName.Add(210, "Ograve");
+ _entityValue.Add("Oacute", 211); // latin capital letter O with acute, U+00D3 ISOlat1
+ _entityName.Add(211, "Oacute");
+ _entityValue.Add("Ocirc", 212); // latin capital letter O with circumflex, U+00D4 ISOlat1
+ _entityName.Add(212, "Ocirc");
+ _entityValue.Add("Otilde", 213); // latin capital letter O with tilde, U+00D5 ISOlat1
+ _entityName.Add(213, "Otilde");
+ _entityValue.Add("Ouml", 214); // latin capital letter O with diaeresis, U+00D6 ISOlat1
+ _entityName.Add(214, "Ouml");
+ _entityValue.Add("times", 215); // multiplication sign, U+00D7 ISOnum
+ _entityName.Add(215, "times");
+ _entityValue.Add("Oslash", 216);
+ // latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1
+ _entityName.Add(216, "Oslash");
+ _entityValue.Add("Ugrave", 217); // latin capital letter U with grave, U+00D9 ISOlat1
+ _entityName.Add(217, "Ugrave");
+ _entityValue.Add("Uacute", 218); // latin capital letter U with acute, U+00DA ISOlat1
+ _entityName.Add(218, "Uacute");
+ _entityValue.Add("Ucirc", 219); // latin capital letter U with circumflex, U+00DB ISOlat1
+ _entityName.Add(219, "Ucirc");
+ _entityValue.Add("Uuml", 220); // latin capital letter U with diaeresis, U+00DC ISOlat1
+ _entityName.Add(220, "Uuml");
+ _entityValue.Add("Yacute", 221); // latin capital letter Y with acute, U+00DD ISOlat1
+ _entityName.Add(221, "Yacute");
+ _entityValue.Add("THORN", 222); // latin capital letter THORN, U+00DE ISOlat1
+ _entityName.Add(222, "THORN");
+ _entityValue.Add("szlig", 223); // latin small letter sharp s = ess-zed, U+00DF ISOlat1
+ _entityName.Add(223, "szlig");
+ _entityValue.Add("agrave", 224);
+ // latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1
+ _entityName.Add(224, "agrave");
+ _entityValue.Add("aacute", 225); // latin small letter a with acute, U+00E1 ISOlat1
+ _entityName.Add(225, "aacute");
+ _entityValue.Add("acirc", 226); // latin small letter a with circumflex, U+00E2 ISOlat1
+ _entityName.Add(226, "acirc");
+ _entityValue.Add("atilde", 227); // latin small letter a with tilde, U+00E3 ISOlat1
+ _entityName.Add(227, "atilde");
+ _entityValue.Add("auml", 228); // latin small letter a with diaeresis, U+00E4 ISOlat1
+ _entityName.Add(228, "auml");
+ _entityValue.Add("aring", 229);
+ // latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1
+ _entityName.Add(229, "aring");
+ _entityValue.Add("aelig", 230); // latin small letter ae = latin small ligature ae, U+00E6 ISOlat1
+ _entityName.Add(230, "aelig");
+ _entityValue.Add("ccedil", 231); // latin small letter c with cedilla, U+00E7 ISOlat1
+ _entityName.Add(231, "ccedil");
+ _entityValue.Add("egrave", 232); // latin small letter e with grave, U+00E8 ISOlat1
+ _entityName.Add(232, "egrave");
+ _entityValue.Add("eacute", 233); // latin small letter e with acute, U+00E9 ISOlat1
+ _entityName.Add(233, "eacute");
+ _entityValue.Add("ecirc", 234); // latin small letter e with circumflex, U+00EA ISOlat1
+ _entityName.Add(234, "ecirc");
+ _entityValue.Add("euml", 235); // latin small letter e with diaeresis, U+00EB ISOlat1
+ _entityName.Add(235, "euml");
+ _entityValue.Add("igrave", 236); // latin small letter i with grave, U+00EC ISOlat1
+ _entityName.Add(236, "igrave");
+ _entityValue.Add("iacute", 237); // latin small letter i with acute, U+00ED ISOlat1
+ _entityName.Add(237, "iacute");
+ _entityValue.Add("icirc", 238); // latin small letter i with circumflex, U+00EE ISOlat1
+ _entityName.Add(238, "icirc");
+ _entityValue.Add("iuml", 239); // latin small letter i with diaeresis, U+00EF ISOlat1
+ _entityName.Add(239, "iuml");
+ _entityValue.Add("eth", 240); // latin small letter eth, U+00F0 ISOlat1
+ _entityName.Add(240, "eth");
+ _entityValue.Add("ntilde", 241); // latin small letter n with tilde, U+00F1 ISOlat1
+ _entityName.Add(241, "ntilde");
+ _entityValue.Add("ograve", 242); // latin small letter o with grave, U+00F2 ISOlat1
+ _entityName.Add(242, "ograve");
+ _entityValue.Add("oacute", 243); // latin small letter o with acute, U+00F3 ISOlat1
+ _entityName.Add(243, "oacute");
+ _entityValue.Add("ocirc", 244); // latin small letter o with circumflex, U+00F4 ISOlat1
+ _entityName.Add(244, "ocirc");
+ _entityValue.Add("otilde", 245); // latin small letter o with tilde, U+00F5 ISOlat1
+ _entityName.Add(245, "otilde");
+ _entityValue.Add("ouml", 246); // latin small letter o with diaeresis, U+00F6 ISOlat1
+ _entityName.Add(246, "ouml");
+ _entityValue.Add("divide", 247); // division sign, U+00F7 ISOnum
+ _entityName.Add(247, "divide");
+ _entityValue.Add("oslash", 248);
+ // latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1
+ _entityName.Add(248, "oslash");
+ _entityValue.Add("ugrave", 249); // latin small letter u with grave, U+00F9 ISOlat1
+ _entityName.Add(249, "ugrave");
+ _entityValue.Add("uacute", 250); // latin small letter u with acute, U+00FA ISOlat1
+ _entityName.Add(250, "uacute");
+ _entityValue.Add("ucirc", 251); // latin small letter u with circumflex, U+00FB ISOlat1
+ _entityName.Add(251, "ucirc");
+ _entityValue.Add("uuml", 252); // latin small letter u with diaeresis, U+00FC ISOlat1
+ _entityName.Add(252, "uuml");
+ _entityValue.Add("yacute", 253); // latin small letter y with acute, U+00FD ISOlat1
+ _entityName.Add(253, "yacute");
+ _entityValue.Add("thorn", 254); // latin small letter thorn, U+00FE ISOlat1
+ _entityName.Add(254, "thorn");
+ _entityValue.Add("yuml", 255); // latin small letter y with diaeresis, U+00FF ISOlat1
+ _entityName.Add(255, "yuml");
+ _entityValue.Add("fnof", 402); // latin small f with hook = function = florin, U+0192 ISOtech
+ _entityName.Add(402, "fnof");
+ _entityValue.Add("Alpha", 913); // greek capital letter alpha, U+0391
+ _entityName.Add(913, "Alpha");
+ _entityValue.Add("Beta", 914); // greek capital letter beta, U+0392
+ _entityName.Add(914, "Beta");
+ _entityValue.Add("Gamma", 915); // greek capital letter gamma, U+0393 ISOgrk3
+ _entityName.Add(915, "Gamma");
+ _entityValue.Add("Delta", 916); // greek capital letter delta, U+0394 ISOgrk3
+ _entityName.Add(916, "Delta");
+ _entityValue.Add("Epsilon", 917); // greek capital letter epsilon, U+0395
+ _entityName.Add(917, "Epsilon");
+ _entityValue.Add("Zeta", 918); // greek capital letter zeta, U+0396
+ _entityName.Add(918, "Zeta");
+ _entityValue.Add("Eta", 919); // greek capital letter eta, U+0397
+ _entityName.Add(919, "Eta");
+ _entityValue.Add("Theta", 920); // greek capital letter theta, U+0398 ISOgrk3
+ _entityName.Add(920, "Theta");
+ _entityValue.Add("Iota", 921); // greek capital letter iota, U+0399
+ _entityName.Add(921, "Iota");
+ _entityValue.Add("Kappa", 922); // greek capital letter kappa, U+039A
+ _entityName.Add(922, "Kappa");
+ _entityValue.Add("Lambda", 923); // greek capital letter lambda, U+039B ISOgrk3
+ _entityName.Add(923, "Lambda");
+ _entityValue.Add("Mu", 924); // greek capital letter mu, U+039C
+ _entityName.Add(924, "Mu");
+ _entityValue.Add("Nu", 925); // greek capital letter nu, U+039D
+ _entityName.Add(925, "Nu");
+ _entityValue.Add("Xi", 926); // greek capital letter xi, U+039E ISOgrk3
+ _entityName.Add(926, "Xi");
+ _entityValue.Add("Omicron", 927); // greek capital letter omicron, U+039F
+ _entityName.Add(927, "Omicron");
+ _entityValue.Add("Pi", 928); // greek capital letter pi, U+03A0 ISOgrk3
+ _entityName.Add(928, "Pi");
+ _entityValue.Add("Rho", 929); // greek capital letter rho, U+03A1
+ _entityName.Add(929, "Rho");
+ _entityValue.Add("Sigma", 931); // greek capital letter sigma, U+03A3 ISOgrk3
+ _entityName.Add(931, "Sigma");
+ _entityValue.Add("Tau", 932); // greek capital letter tau, U+03A4
+ _entityName.Add(932, "Tau");
+ _entityValue.Add("Upsilon", 933); // greek capital letter upsilon, U+03A5 ISOgrk3
+ _entityName.Add(933, "Upsilon");
+ _entityValue.Add("Phi", 934); // greek capital letter phi, U+03A6 ISOgrk3
+ _entityName.Add(934, "Phi");
+ _entityValue.Add("Chi", 935); // greek capital letter chi, U+03A7
+ _entityName.Add(935, "Chi");
+ _entityValue.Add("Psi", 936); // greek capital letter psi, U+03A8 ISOgrk3
+ _entityName.Add(936, "Psi");
+ _entityValue.Add("Omega", 937); // greek capital letter omega, U+03A9 ISOgrk3
+ _entityName.Add(937, "Omega");
+ _entityValue.Add("alpha", 945); // greek small letter alpha, U+03B1 ISOgrk3
+ _entityName.Add(945, "alpha");
+ _entityValue.Add("beta", 946); // greek small letter beta, U+03B2 ISOgrk3
+ _entityName.Add(946, "beta");
+ _entityValue.Add("gamma", 947); // greek small letter gamma, U+03B3 ISOgrk3
+ _entityName.Add(947, "gamma");
+ _entityValue.Add("delta", 948); // greek small letter delta, U+03B4 ISOgrk3
+ _entityName.Add(948, "delta");
+ _entityValue.Add("epsilon", 949); // greek small letter epsilon, U+03B5 ISOgrk3
+ _entityName.Add(949, "epsilon");
+ _entityValue.Add("zeta", 950); // greek small letter zeta, U+03B6 ISOgrk3
+ _entityName.Add(950, "zeta");
+ _entityValue.Add("eta", 951); // greek small letter eta, U+03B7 ISOgrk3
+ _entityName.Add(951, "eta");
+ _entityValue.Add("theta", 952); // greek small letter theta, U+03B8 ISOgrk3
+ _entityName.Add(952, "theta");
+ _entityValue.Add("iota", 953); // greek small letter iota, U+03B9 ISOgrk3
+ _entityName.Add(953, "iota");
+ _entityValue.Add("kappa", 954); // greek small letter kappa, U+03BA ISOgrk3
+ _entityName.Add(954, "kappa");
+ _entityValue.Add("lambda", 955); // greek small letter lambda, U+03BB ISOgrk3
+ _entityName.Add(955, "lambda");
+ _entityValue.Add("mu", 956); // greek small letter mu, U+03BC ISOgrk3
+ _entityName.Add(956, "mu");
+ _entityValue.Add("nu", 957); // greek small letter nu, U+03BD ISOgrk3
+ _entityName.Add(957, "nu");
+ _entityValue.Add("xi", 958); // greek small letter xi, U+03BE ISOgrk3
+ _entityName.Add(958, "xi");
+ _entityValue.Add("omicron", 959); // greek small letter omicron, U+03BF NEW
+ _entityName.Add(959, "omicron");
+ _entityValue.Add("pi", 960); // greek small letter pi, U+03C0 ISOgrk3
+ _entityName.Add(960, "pi");
+ _entityValue.Add("rho", 961); // greek small letter rho, U+03C1 ISOgrk3
+ _entityName.Add(961, "rho");
+ _entityValue.Add("sigmaf", 962); // greek small letter final sigma, U+03C2 ISOgrk3
+ _entityName.Add(962, "sigmaf");
+ _entityValue.Add("sigma", 963); // greek small letter sigma, U+03C3 ISOgrk3
+ _entityName.Add(963, "sigma");
+ _entityValue.Add("tau", 964); // greek small letter tau, U+03C4 ISOgrk3
+ _entityName.Add(964, "tau");
+ _entityValue.Add("upsilon", 965); // greek small letter upsilon, U+03C5 ISOgrk3
+ _entityName.Add(965, "upsilon");
+ _entityValue.Add("phi", 966); // greek small letter phi, U+03C6 ISOgrk3
+ _entityName.Add(966, "phi");
+ _entityValue.Add("chi", 967); // greek small letter chi, U+03C7 ISOgrk3
+ _entityName.Add(967, "chi");
+ _entityValue.Add("psi", 968); // greek small letter psi, U+03C8 ISOgrk3
+ _entityName.Add(968, "psi");
+ _entityValue.Add("omega", 969); // greek small letter omega, U+03C9 ISOgrk3
+ _entityName.Add(969, "omega");
+ _entityValue.Add("thetasym", 977); // greek small letter theta symbol, U+03D1 NEW
+ _entityName.Add(977, "thetasym");
+ _entityValue.Add("upsih", 978); // greek upsilon with hook symbol, U+03D2 NEW
+ _entityName.Add(978, "upsih");
+ _entityValue.Add("piv", 982); // greek pi symbol, U+03D6 ISOgrk3
+ _entityName.Add(982, "piv");
+ _entityValue.Add("bull", 8226); // bullet = black small circle, U+2022 ISOpub
+ _entityName.Add(8226, "bull");
+ _entityValue.Add("hellip", 8230); // horizontal ellipsis = three dot leader, U+2026 ISOpub
+ _entityName.Add(8230, "hellip");
+ _entityValue.Add("prime", 8242); // prime = minutes = feet, U+2032 ISOtech
+ _entityName.Add(8242, "prime");
+ _entityValue.Add("Prime", 8243); // double prime = seconds = inches, U+2033 ISOtech
+ _entityName.Add(8243, "Prime");
+ _entityValue.Add("oline", 8254); // overline = spacing overscore, U+203E NEW
+ _entityName.Add(8254, "oline");
+ _entityValue.Add("frasl", 8260); // fraction slash, U+2044 NEW
+ _entityName.Add(8260, "frasl");
+ _entityValue.Add("weierp", 8472); // script capital P = power set = Weierstrass p, U+2118 ISOamso
+ _entityName.Add(8472, "weierp");
+ _entityValue.Add("image", 8465); // blackletter capital I = imaginary part, U+2111 ISOamso
+ _entityName.Add(8465, "image");
+ _entityValue.Add("real", 8476); // blackletter capital R = real part symbol, U+211C ISOamso
+ _entityName.Add(8476, "real");
+ _entityValue.Add("trade", 8482); // trade mark sign, U+2122 ISOnum
+ _entityName.Add(8482, "trade");
+ _entityValue.Add("alefsym", 8501); // alef symbol = first transfinite cardinal, U+2135 NEW
+ _entityName.Add(8501, "alefsym");
+ _entityValue.Add("larr", 8592); // leftwards arrow, U+2190 ISOnum
+ _entityName.Add(8592, "larr");
+ _entityValue.Add("uarr", 8593); // upwards arrow, U+2191 ISOnum
+ _entityName.Add(8593, "uarr");
+ _entityValue.Add("rarr", 8594); // rightwards arrow, U+2192 ISOnum
+ _entityName.Add(8594, "rarr");
+ _entityValue.Add("darr", 8595); // downwards arrow, U+2193 ISOnum
+ _entityName.Add(8595, "darr");
+ _entityValue.Add("harr", 8596); // left right arrow, U+2194 ISOamsa
+ _entityName.Add(8596, "harr");
+ _entityValue.Add("crarr", 8629); // downwards arrow with corner leftwards = carriage return, U+21B5 NEW
+ _entityName.Add(8629, "crarr");
+ _entityValue.Add("lArr", 8656); // leftwards double arrow, U+21D0 ISOtech
+ _entityName.Add(8656, "lArr");
+ _entityValue.Add("uArr", 8657); // upwards double arrow, U+21D1 ISOamsa
+ _entityName.Add(8657, "uArr");
+ _entityValue.Add("rArr", 8658); // rightwards double arrow, U+21D2 ISOtech
+ _entityName.Add(8658, "rArr");
+ _entityValue.Add("dArr", 8659); // downwards double arrow, U+21D3 ISOamsa
+ _entityName.Add(8659, "dArr");
+ _entityValue.Add("hArr", 8660); // left right double arrow, U+21D4 ISOamsa
+ _entityName.Add(8660, "hArr");
+ _entityValue.Add("forall", 8704); // for all, U+2200 ISOtech
+ _entityName.Add(8704, "forall");
+ _entityValue.Add("part", 8706); // partial differential, U+2202 ISOtech
+ _entityName.Add(8706, "part");
+ _entityValue.Add("exist", 8707); // there exists, U+2203 ISOtech
+ _entityName.Add(8707, "exist");
+ _entityValue.Add("empty", 8709); // empty set = null set = diameter, U+2205 ISOamso
+ _entityName.Add(8709, "empty");
+ _entityValue.Add("nabla", 8711); // nabla = backward difference, U+2207 ISOtech
+ _entityName.Add(8711, "nabla");
+ _entityValue.Add("isin", 8712); // element of, U+2208 ISOtech
+ _entityName.Add(8712, "isin");
+ _entityValue.Add("notin", 8713); // not an element of, U+2209 ISOtech
+ _entityName.Add(8713, "notin");
+ _entityValue.Add("ni", 8715); // contains as member, U+220B ISOtech
+ _entityName.Add(8715, "ni");
+ _entityValue.Add("prod", 8719); // n-ary product = product sign, U+220F ISOamsb
+ _entityName.Add(8719, "prod");
+ _entityValue.Add("sum", 8721); // n-ary sumation, U+2211 ISOamsb
+ _entityName.Add(8721, "sum");
+ _entityValue.Add("minus", 8722); // minus sign, U+2212 ISOtech
+ _entityName.Add(8722, "minus");
+ _entityValue.Add("lowast", 8727); // asterisk operator, U+2217 ISOtech
+ _entityName.Add(8727, "lowast");
+ _entityValue.Add("radic", 8730); // square root = radical sign, U+221A ISOtech
+ _entityName.Add(8730, "radic");
+ _entityValue.Add("prop", 8733); // proportional to, U+221D ISOtech
+ _entityName.Add(8733, "prop");
+ _entityValue.Add("infin", 8734); // infinity, U+221E ISOtech
+ _entityName.Add(8734, "infin");
+ _entityValue.Add("ang", 8736); // angle, U+2220 ISOamso
+ _entityName.Add(8736, "ang");
+ _entityValue.Add("and", 8743); // logical and = wedge, U+2227 ISOtech
+ _entityName.Add(8743, "and");
+ _entityValue.Add("or", 8744); // logical or = vee, U+2228 ISOtech
+ _entityName.Add(8744, "or");
+ _entityValue.Add("cap", 8745); // intersection = cap, U+2229 ISOtech
+ _entityName.Add(8745, "cap");
+ _entityValue.Add("cup", 8746); // union = cup, U+222A ISOtech
+ _entityName.Add(8746, "cup");
+ _entityValue.Add("int", 8747); // integral, U+222B ISOtech
+ _entityName.Add(8747, "int");
+ _entityValue.Add("there4", 8756); // therefore, U+2234 ISOtech
+ _entityName.Add(8756, "there4");
+ _entityValue.Add("sim", 8764); // tilde operator = varies with = similar to, U+223C ISOtech
+ _entityName.Add(8764, "sim");
+ _entityValue.Add("cong", 8773); // approximately equal to, U+2245 ISOtech
+ _entityName.Add(8773, "cong");
+ _entityValue.Add("asymp", 8776); // almost equal to = asymptotic to, U+2248 ISOamsr
+ _entityName.Add(8776, "asymp");
+ _entityValue.Add("ne", 8800); // not equal to, U+2260 ISOtech
+ _entityName.Add(8800, "ne");
+ _entityValue.Add("equiv", 8801); // identical to, U+2261 ISOtech
+ _entityName.Add(8801, "equiv");
+ _entityValue.Add("le", 8804); // less-than or equal to, U+2264 ISOtech
+ _entityName.Add(8804, "le");
+ _entityValue.Add("ge", 8805); // greater-than or equal to, U+2265 ISOtech
+ _entityName.Add(8805, "ge");
+ _entityValue.Add("sub", 8834); // subset of, U+2282 ISOtech
+ _entityName.Add(8834, "sub");
+ _entityValue.Add("sup", 8835); // superset of, U+2283 ISOtech
+ _entityName.Add(8835, "sup");
+ _entityValue.Add("nsub", 8836); // not a subset of, U+2284 ISOamsn
+ _entityName.Add(8836, "nsub");
+ _entityValue.Add("sube", 8838); // subset of or equal to, U+2286 ISOtech
+ _entityName.Add(8838, "sube");
+ _entityValue.Add("supe", 8839); // superset of or equal to, U+2287 ISOtech
+ _entityName.Add(8839, "supe");
+ _entityValue.Add("oplus", 8853); // circled plus = direct sum, U+2295 ISOamsb
+ _entityName.Add(8853, "oplus");
+ _entityValue.Add("otimes", 8855); // circled times = vector product, U+2297 ISOamsb
+ _entityName.Add(8855, "otimes");
+ _entityValue.Add("perp", 8869); // up tack = orthogonal to = perpendicular, U+22A5 ISOtech
+ _entityName.Add(8869, "perp");
+ _entityValue.Add("sdot", 8901); // dot operator, U+22C5 ISOamsb
+ _entityName.Add(8901, "sdot");
+ _entityValue.Add("lceil", 8968); // left ceiling = apl upstile, U+2308 ISOamsc
+ _entityName.Add(8968, "lceil");
+ _entityValue.Add("rceil", 8969); // right ceiling, U+2309 ISOamsc
+ _entityName.Add(8969, "rceil");
+ _entityValue.Add("lfloor", 8970); // left floor = apl downstile, U+230A ISOamsc
+ _entityName.Add(8970, "lfloor");
+ _entityValue.Add("rfloor", 8971); // right floor, U+230B ISOamsc
+ _entityName.Add(8971, "rfloor");
+ _entityValue.Add("lang", 9001); // left-pointing angle bracket = bra, U+2329 ISOtech
+ _entityName.Add(9001, "lang");
+ _entityValue.Add("rang", 9002); // right-pointing angle bracket = ket, U+232A ISOtech
+ _entityName.Add(9002, "rang");
+ _entityValue.Add("loz", 9674); // lozenge, U+25CA ISOpub
+ _entityName.Add(9674, "loz");
+ _entityValue.Add("spades", 9824); // black spade suit, U+2660 ISOpub
+ _entityName.Add(9824, "spades");
+ _entityValue.Add("clubs", 9827); // black club suit = shamrock, U+2663 ISOpub
+ _entityName.Add(9827, "clubs");
+ _entityValue.Add("hearts", 9829); // black heart suit = valentine, U+2665 ISOpub
+ _entityName.Add(9829, "hearts");
+ _entityValue.Add("diams", 9830); // black diamond suit, U+2666 ISOpub
+ _entityName.Add(9830, "diams");
+ _entityValue.Add("quot", 34); // quotation mark = APL quote, U+0022 ISOnum
+ _entityName.Add(34, "quot");
+ _entityValue.Add("amp", 38); // ampersand, U+0026 ISOnum
+ _entityName.Add(38, "amp");
+ _entityValue.Add("lt", 60); // less-than sign, U+003C ISOnum
+ _entityName.Add(60, "lt");
+ _entityValue.Add("gt", 62); // greater-than sign, U+003E ISOnum
+ _entityName.Add(62, "gt");
+ _entityValue.Add("OElig", 338); // latin capital ligature OE, U+0152 ISOlat2
+ _entityName.Add(338, "OElig");
+ _entityValue.Add("oelig", 339); // latin small ligature oe, U+0153 ISOlat2
+ _entityName.Add(339, "oelig");
+ _entityValue.Add("Scaron", 352); // latin capital letter S with caron, U+0160 ISOlat2
+ _entityName.Add(352, "Scaron");
+ _entityValue.Add("scaron", 353); // latin small letter s with caron, U+0161 ISOlat2
+ _entityName.Add(353, "scaron");
+ _entityValue.Add("Yuml", 376); // latin capital letter Y with diaeresis, U+0178 ISOlat2
+ _entityName.Add(376, "Yuml");
+ _entityValue.Add("circ", 710); // modifier letter circumflex accent, U+02C6 ISOpub
+ _entityName.Add(710, "circ");
+ _entityValue.Add("tilde", 732); // small tilde, U+02DC ISOdia
+ _entityName.Add(732, "tilde");
+ _entityValue.Add("ensp", 8194); // en space, U+2002 ISOpub
+ _entityName.Add(8194, "ensp");
+ _entityValue.Add("emsp", 8195); // em space, U+2003 ISOpub
+ _entityName.Add(8195, "emsp");
+ _entityValue.Add("thinsp", 8201); // thin space, U+2009 ISOpub
+ _entityName.Add(8201, "thinsp");
+ _entityValue.Add("zwnj", 8204); // zero width non-joiner, U+200C NEW RFC 2070
+ _entityName.Add(8204, "zwnj");
+ _entityValue.Add("zwj", 8205); // zero width joiner, U+200D NEW RFC 2070
+ _entityName.Add(8205, "zwj");
+ _entityValue.Add("lrm", 8206); // left-to-right mark, U+200E NEW RFC 2070
+ _entityName.Add(8206, "lrm");
+ _entityValue.Add("rlm", 8207); // right-to-left mark, U+200F NEW RFC 2070
+ _entityName.Add(8207, "rlm");
+ _entityValue.Add("ndash", 8211); // en dash, U+2013 ISOpub
+ _entityName.Add(8211, "ndash");
+ _entityValue.Add("mdash", 8212); // em dash, U+2014 ISOpub
+ _entityName.Add(8212, "mdash");
+ _entityValue.Add("lsquo", 8216); // left single quotation mark, U+2018 ISOnum
+ _entityName.Add(8216, "lsquo");
+ _entityValue.Add("rsquo", 8217); // right single quotation mark, U+2019 ISOnum
+ _entityName.Add(8217, "rsquo");
+ _entityValue.Add("sbquo", 8218); // single low-9 quotation mark, U+201A NEW
+ _entityName.Add(8218, "sbquo");
+ _entityValue.Add("ldquo", 8220); // left double quotation mark, U+201C ISOnum
+ _entityName.Add(8220, "ldquo");
+ _entityValue.Add("rdquo", 8221); // right double quotation mark, U+201D ISOnum
+ _entityName.Add(8221, "rdquo");
+ _entityValue.Add("bdquo", 8222); // double low-9 quotation mark, U+201E NEW
+ _entityName.Add(8222, "bdquo");
+ _entityValue.Add("dagger", 8224); // dagger, U+2020 ISOpub
+ _entityName.Add(8224, "dagger");
+ _entityValue.Add("Dagger", 8225); // double dagger, U+2021 ISOpub
+ _entityName.Add(8225, "Dagger");
+ _entityValue.Add("permil", 8240); // per mille sign, U+2030 ISOtech
+ _entityName.Add(8240, "permil");
+ _entityValue.Add("lsaquo", 8249); // single left-pointing angle quotation mark, U+2039 ISO proposed
+ _entityName.Add(8249, "lsaquo");
+ _entityValue.Add("rsaquo", 8250); // single right-pointing angle quotation mark, U+203A ISO proposed
+ _entityName.Add(8250, "rsaquo");
+ _entityValue.Add("euro", 8364); // euro sign, U+20AC NEW
+ _entityName.Add(8364, "euro");
+
+ _maxEntitySize = 8 + 1; // we add the # char
+
+ #endregion
+ }
+
+ private HtmlEntity()
+ {
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Replace known entities by characters.
+ /// </summary>
+ /// <param name="text">The source text.</param>
+ /// <returns>The result text.</returns>
+ public static string DeEntitize(string text)
+ {
+ if (text == null)
+ return null;
+
+ if (text.Length == 0)
+ return text;
+
+ StringBuilder sb = new StringBuilder(text.Length);
+ ParseState state = ParseState.Text;
+ StringBuilder entity = new StringBuilder(10);
+
+ for (int i = 0; i < text.Length; i++)
+ {
+ switch (state)
+ {
+ case ParseState.Text:
+ switch (text[i])
+ {
+ case '&':
+ state = ParseState.EntityStart;
+ break;
+
+ default:
+ sb.Append(text[i]);
+ break;
+ }
+ break;
+
+ case ParseState.EntityStart:
+ switch (text[i])
+ {
+ case ';':
+ if (entity.Length == 0)
+ {
+ sb.Append("&;");
+ }
+ else
+ {
+ if (entity[0] == '#')
+ {
+ string e = entity.ToString();
+ try
+ {
+ int code = Convert.ToInt32(e.Substring(1, e.Length - 1));
+ sb.Append(Convert.ToChar(code));
+ }
+ catch
+ {
+ sb.Append("&#" + e + ";");
+ }
+ }
+ else
+ {
+ // named entity?
+ int code;
+ object o = _entityValue[entity.ToString()];
+ if (o == null)
+ {
+ // nope
+ sb.Append("&" + entity + ";");
+ }
+ else
+ {
+ // we found one
+ code = (int) o;
+ sb.Append(Convert.ToChar(code));
+ }
+ }
+ entity.Remove(0, entity.Length);
+ }
+ state = ParseState.Text;
+ break;
+
+ case '&':
+ // new entity start without end, it was not an entity...
+ sb.Append("&" + entity);
+ entity.Remove(0, entity.Length);
+ break;
+
+ default:
+ entity.Append(text[i]);
+ if (entity.Length > _maxEntitySize)
+ {
+ // unknown stuff, just don't touch it
+ state = ParseState.Text;
+ sb.Append("&" + entity);
+ entity.Remove(0, entity.Length);
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ // finish the work
+ if (state == ParseState.EntityStart)
+ {
+ sb.Append("&" + entity);
+ }
+ return sb.ToString();
+ }
+
+ /// <summary>
+ /// Clone and entitize an HtmlNode. This will affect attribute values and nodes' text. It will also entitize all child nodes.
+ /// </summary>
+ /// <param name="node">The node to entitize.</param>
+ /// <returns>An entitized cloned node.</returns>
+ public static HtmlNode Entitize(HtmlNode node)
+ {
+ if (node == null)
+ {
+ throw new ArgumentNullException("node");
+ }
+ HtmlNode result = node.CloneNode(true);
+ if (result.HasAttributes)
+ Entitize(result.Attributes);
+
+ if (result.HasChildNodes)
+ {
+ Entitize(result.ChildNodes);
+ }
+ else
+ {
+ if (result.NodeType == HtmlNodeType.Text)
+ {
+ ((HtmlTextNode) result).Text = Entitize(((HtmlTextNode) result).Text, true, true);
+ }
+ }
+ return result;
+ }
+
+
+ /// <summary>
+ /// Replace characters above 127 by entities.
+ /// </summary>
+ /// <param name="text">The source text.</param>
+ /// <returns>The result text.</returns>
+ public static string Entitize(string text)
+ {
+ return Entitize(text, true);
+ }
+
+ /// <summary>
+ /// Replace characters above 127 by entities.
+ /// </summary>
+ /// <param name="text">The source text.</param>
+ /// <param name="useNames">If set to false, the function will not use known entities name. Default is true.</param>
+ /// <returns>The result text.</returns>
+ public static string Entitize(string text, bool useNames)
+ {
+ return Entitize(text, useNames, false);
+ }
+
+ /// <summary>
+ /// Replace characters above 127 by entities.
+ /// </summary>
+ /// <param name="text">The source text.</param>
+ /// <param name="useNames">If set to false, the function will not use known entities name. Default is true.</param>
+ /// <param name="entitizeQuotAmpAndLtGt">If set to true, the [quote], [ampersand], [lower than] and [greather than] characters will be entitized.</param>
+ /// <returns>The result text</returns>
+ public static string Entitize(string text, bool useNames, bool entitizeQuotAmpAndLtGt)
+// _entityValue.Add("quot", 34); // quotation mark = APL quote, U+0022 ISOnum
+// _entityName.Add(34, "quot");
+// _entityValue.Add("amp", 38); // ampersand, U+0026 ISOnum
+// _entityName.Add(38, "amp");
+// _entityValue.Add("lt", 60); // less-than sign, U+003C ISOnum
+// _entityName.Add(60, "lt");
+// _entityValue.Add("gt", 62); // greater-than sign, U+003E ISOnum
+// _entityName.Add(62, "gt");
+ {
+ if (text == null)
+ return null;
+
+ if (text.Length == 0)
+ return text;
+
+ StringBuilder sb = new StringBuilder(text.Length);
+ for (int i = 0; i < text.Length; i++)
+ {
+ int code = text[i];
+ if ((code > 127) ||
+ (entitizeQuotAmpAndLtGt && ((code == 34) || (code == 38) || (code == 60) || (code == 62))))
+ {
+ string entity = _entityName[code] as string;
+ if ((entity == null) || (!useNames))
+ {
+ sb.Append("&#" + code + ";");
+ }
+ else
+ {
+ sb.Append("&" + entity + ";");
+ }
+ }
+ else
+ {
+ sb.Append(text[i]);
+ }
+ }
+
+ return sb.ToString();
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private static void Entitize(HtmlAttributeCollection collection)
+ {
+ foreach (HtmlAttribute at in collection)
+ {
+ at.Value = Entitize(at.Value);
+ }
+ }
+
+ private static void Entitize(HtmlNodeCollection collection)
+ {
+ foreach (HtmlNode node in collection)
+ {
+ if (node.HasAttributes)
+ Entitize(node.Attributes);
+
+ if (node.HasChildNodes)
+ {
+ Entitize(node.ChildNodes);
+ }
+ else
+ {
+ if (node.NodeType == HtmlNodeType.Text)
+ {
+ ((HtmlTextNode) node).Text = Entitize(((HtmlTextNode) node).Text, true, true);
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region Nested type: ParseState
+
+ private enum ParseState
+ {
+ Text,
+ EntityStart
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlNameTable.cs b/docs/HtmlAgilityPack/HtmlNameTable.cs new file mode 100644 index 00000000000..2b9ffd3cb62 --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlNameTable.cs @@ -0,0 +1,52 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System.Xml;
+
+namespace HtmlAgilityPack
+{
+ internal class HtmlNameTable : XmlNameTable
+ {
+ #region Fields
+
+ private NameTable _nametable = new NameTable();
+
+ #endregion
+
+ #region Public Methods
+
+ public override string Add(string array)
+ {
+ return _nametable.Add(array);
+ }
+
+ public override string Add(char[] array, int offset, int length)
+ {
+ return _nametable.Add(array, offset, length);
+ }
+
+ public override string Get(string array)
+ {
+ return _nametable.Get(array);
+ }
+
+ public override string Get(char[] array, int offset, int length)
+ {
+ return _nametable.Get(array, offset, length);
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal string GetOrAdd(string array)
+ {
+ string s = Get(array);
+ if (s == null)
+ {
+ return Add(array);
+ }
+ return s;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlNode.cs b/docs/HtmlAgilityPack/HtmlNode.cs new file mode 100644 index 00000000000..ecc915e13df --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlNode.cs @@ -0,0 +1,1996 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Xml;
+using System.Xml.XPath;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML node.
+ /// </summary>
+ [DebuggerDisplay("Name: {OriginalName}}")]
+ public class HtmlNode : IXPathNavigable
+ {
+ #region Fields
+
+ internal HtmlAttributeCollection _attributes;
+ internal HtmlNodeCollection _childnodes;
+ internal HtmlNode _endnode;
+
+ internal bool _innerchanged;
+ internal string _innerhtml;
+ internal int _innerlength;
+ internal int _innerstartindex;
+ internal int _line;
+ internal int _lineposition;
+ private string _name;
+ internal int _namelength;
+ internal int _namestartindex;
+ internal HtmlNode _nextnode;
+ internal HtmlNodeType _nodetype;
+ internal bool _outerchanged;
+ internal string _outerhtml;
+ internal int _outerlength;
+ internal int _outerstartindex;
+ internal HtmlDocument _ownerdocument;
+ internal HtmlNode _parentnode;
+ internal HtmlNode _prevnode;
+ internal HtmlNode _prevwithsamename;
+ internal bool _starttag;
+ internal int _streamposition;
+
+ #endregion
+
+ #region Static Members
+
+ /// <summary>
+ /// Gets the name of a comment node. It is actually defined as '#comment'.
+ /// </summary>
+ public static readonly string HtmlNodeTypeNameComment = "#comment";
+
+ /// <summary>
+ /// Gets the name of the document node. It is actually defined as '#document'.
+ /// </summary>
+ public static readonly string HtmlNodeTypeNameDocument = "#document";
+
+ /// <summary>
+ /// Gets the name of a text node. It is actually defined as '#text'.
+ /// </summary>
+ public static readonly string HtmlNodeTypeNameText = "#text";
+
+ /// <summary>
+ /// Gets a collection of flags that define specific behaviors for specific element nodes.
+ /// The table contains a DictionaryEntry list with the lowercase tag name as the Key, and a combination of HtmlElementFlags as the Value.
+ /// </summary>
+ public static Hashtable ElementsFlags;
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Initialize HtmlNode. Builds a list of all tags that have special allowances
+ /// </summary>
+ static HtmlNode()
+ {
+ // tags whose content may be anything
+ ElementsFlags = new Hashtable();
+ ElementsFlags.Add("script", HtmlElementFlag.CData);
+ ElementsFlags.Add("style", HtmlElementFlag.CData);
+ ElementsFlags.Add("noxhtml", HtmlElementFlag.CData);
+
+ // tags that can not contain other tags
+ ElementsFlags.Add("base", HtmlElementFlag.Empty);
+ ElementsFlags.Add("link", HtmlElementFlag.Empty);
+ ElementsFlags.Add("meta", HtmlElementFlag.Empty);
+ ElementsFlags.Add("isindex", HtmlElementFlag.Empty);
+ ElementsFlags.Add("hr", HtmlElementFlag.Empty);
+ ElementsFlags.Add("col", HtmlElementFlag.Empty);
+ ElementsFlags.Add("img", HtmlElementFlag.Empty);
+ ElementsFlags.Add("param", HtmlElementFlag.Empty);
+ ElementsFlags.Add("embed", HtmlElementFlag.Empty);
+ ElementsFlags.Add("frame", HtmlElementFlag.Empty);
+ ElementsFlags.Add("wbr", HtmlElementFlag.Empty);
+ ElementsFlags.Add("bgsound", HtmlElementFlag.Empty);
+ ElementsFlags.Add("spacer", HtmlElementFlag.Empty);
+ ElementsFlags.Add("keygen", HtmlElementFlag.Empty);
+ ElementsFlags.Add("area", HtmlElementFlag.Empty);
+ ElementsFlags.Add("input", HtmlElementFlag.Empty);
+ ElementsFlags.Add("basefont", HtmlElementFlag.Empty);
+
+ ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
+
+ // they sometimes contain, and sometimes they don 't...
+ ElementsFlags.Add("option", HtmlElementFlag.Empty);
+
+ // tag whose closing tag is equivalent to open tag:
+ // <p>bla</p>bla will be transformed into <p>bla</p>bla
+ // <p>bla<p>bla will be transformed into <p>bla<p>bla and not <p>bla></p><p>bla</p> or <p>bla<p>bla</p></p>
+ //<br> see above
+ ElementsFlags.Add("br", HtmlElementFlag.Empty | HtmlElementFlag.Closed);
+ ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed);
+ }
+
+ /// <summary>
+ /// Initializes HtmlNode, providing type, owner and where it exists in a collection
+ /// </summary>
+ /// <param name="type"></param>
+ /// <param name="ownerdocument"></param>
+ /// <param name="index"></param>
+ public HtmlNode(HtmlNodeType type, HtmlDocument ownerdocument, int index)
+ {
+ _nodetype = type;
+ _ownerdocument = ownerdocument;
+ _outerstartindex = index;
+
+ switch (type)
+ {
+ case HtmlNodeType.Comment:
+ Name = HtmlNodeTypeNameComment;
+ _endnode = this;
+ break;
+
+ case HtmlNodeType.Document:
+ Name = HtmlNodeTypeNameDocument;
+ _endnode = this;
+ break;
+
+ case HtmlNodeType.Text:
+ Name = HtmlNodeTypeNameText;
+ _endnode = this;
+ break;
+ }
+
+ if (_ownerdocument._openednodes != null)
+ {
+ if (!Closed)
+ {
+ // we use the index as the key
+
+ // -1 means the node comes from public
+ if (-1 != index)
+ {
+ _ownerdocument._openednodes.Add(index, this);
+ }
+ }
+ }
+
+ if ((-1 != index) || (type == HtmlNodeType.Comment) || (type == HtmlNodeType.Text)) return;
+ // innerhtml and outerhtml must be calculated
+ _outerchanged = true;
+ _innerchanged = true;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the collection of HTML attributes for this node. May not be null.
+ /// </summary>
+ public HtmlAttributeCollection Attributes
+ {
+ get
+ {
+ if (!HasAttributes)
+ {
+ _attributes = new HtmlAttributeCollection(this);
+ }
+ return _attributes;
+ }
+ internal set { _attributes = value; }
+ }
+
+ /// <summary>
+ /// Gets all the children of the node.
+ /// </summary>
+ public HtmlNodeCollection ChildNodes
+ {
+ get
+ {
+ if (_childnodes == null)
+ {
+ _childnodes = new HtmlNodeCollection(this);
+ }
+ return _childnodes;
+ }
+ internal set { _childnodes = value; }
+ }
+
+ /// <summary>
+ /// Gets a value indicating if this node has been closed or not.
+ /// </summary>
+ public bool Closed
+ {
+ get { return (_endnode != null); }
+ }
+
+ /// <summary>
+ /// Gets the collection of HTML attributes for the closing tag. May not be null.
+ /// </summary>
+ public HtmlAttributeCollection ClosingAttributes
+ {
+ get
+ {
+ if (!HasClosingAttributes)
+ {
+ return new HtmlAttributeCollection(this);
+ }
+ return _endnode.Attributes;
+ }
+ }
+
+ internal HtmlNode EndNode
+ {
+ get { return _endnode; }
+ }
+
+ /// <summary>
+ /// Gets the first child of the node.
+ /// </summary>
+ public HtmlNode FirstChild
+ {
+ get
+ {
+ if (!HasChildNodes)
+ {
+ return null;
+ }
+ return _childnodes[0];
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node has any attributes.
+ /// </summary>
+ public bool HasAttributes
+ {
+ get
+ {
+ if (_attributes == null)
+ {
+ return false;
+ }
+
+ if (_attributes.Count <= 0)
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether this node has any child nodes.
+ /// </summary>
+ public bool HasChildNodes
+ {
+ get
+ {
+ if (_childnodes == null)
+ {
+ return false;
+ }
+
+ if (_childnodes.Count <= 0)
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node has any attributes on the closing tag.
+ /// </summary>
+ public bool HasClosingAttributes
+ {
+ get
+ {
+ if ((_endnode == null) || (_endnode == this))
+ {
+ return false;
+ }
+
+ if (_endnode._attributes == null)
+ {
+ return false;
+ }
+
+ if (_endnode._attributes.Count <= 0)
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the value of the 'id' HTML attribute. The document must have been parsed using the OptionUseIdAttribute set to true.
+ /// </summary>
+ public string Id
+ {
+ get
+ {
+ if (_ownerdocument._nodesid == null)
+ {
+ throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse);
+ }
+ return GetId();
+ }
+ set
+ {
+ if (_ownerdocument._nodesid == null)
+ {
+ throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse);
+ }
+
+ if (value == null)
+ {
+ throw new ArgumentNullException("value");
+ }
+ SetId(value);
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets the HTML between the start and end tags of the object.
+ /// </summary>
+ public virtual string InnerHtml
+ {
+ get
+ {
+ if (_innerchanged)
+ {
+ _innerhtml = WriteContentTo();
+ _innerchanged = false;
+ return _innerhtml;
+ }
+ if (_innerhtml != null)
+ {
+ return _innerhtml;
+ }
+
+ if (_innerstartindex < 0)
+ {
+ return string.Empty;
+ }
+
+ return _ownerdocument._text.Substring(_innerstartindex, _innerlength);
+ }
+ set
+ {
+ HtmlDocument doc = new HtmlDocument();
+ doc.LoadHtml(value);
+
+ RemoveAllChildren();
+ AppendChildren(doc.DocumentNode.ChildNodes);
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets the text between the start and end tags of the object.
+ /// </summary>
+ public virtual string InnerText
+ {
+ get
+ {
+ if (_nodetype == HtmlNodeType.Text)
+ {
+ return ((HtmlTextNode) this).Text;
+ }
+
+ if (_nodetype == HtmlNodeType.Comment)
+ {
+ return ((HtmlCommentNode) this).Comment;
+ }
+
+ // note: right now, this method is *slow*, because we recompute everything.
+ // it could be optimised like innerhtml
+ if (!HasChildNodes)
+ {
+ return string.Empty;
+ }
+
+ string s = null;
+ foreach (HtmlNode node in ChildNodes)
+ {
+ s += node.InnerText;
+ }
+ return s;
+ }
+ }
+
+ /// <summary>
+ /// Gets the last child of the node.
+ /// </summary>
+ public HtmlNode LastChild
+ {
+ get
+ {
+ return !HasChildNodes ? null : _childnodes[_childnodes.Count - 1];
+ }
+ }
+
+ /// <summary>
+ /// Gets the line number of this node in the document.
+ /// </summary>
+ public int Line
+ {
+ get { return _line; }
+ internal set { _line = value; }
+ }
+
+ /// <summary>
+ /// Gets the column number of this node in the document.
+ /// </summary>
+ public int LinePosition
+ {
+ get { return _lineposition; }
+ internal set { _lineposition = value; }
+ }
+
+ /// <summary>
+ /// Gets or sets this node's name.
+ /// </summary>
+ public string Name
+ {
+ get
+ {
+ if (_name == null)
+ {
+ Name = _ownerdocument._text.Substring(_namestartindex, _namelength);
+ }
+ return _name != null ? _name.ToLower() : string.Empty;
+ }
+ set { _name = value; }
+ }
+
+ /// <summary>
+ /// Gets the HTML node immediately following this element.
+ /// </summary>
+ public HtmlNode NextSibling
+ {
+ get { return _nextnode; }
+ internal set { _nextnode = value; }
+ }
+
+ /// <summary>
+ /// Gets the type of this node.
+ /// </summary>
+ public HtmlNodeType NodeType
+ {
+ get { return _nodetype; }
+ internal set { _nodetype = value; }
+ }
+
+ /// <summary>
+ /// The original unaltered name of the tag
+ /// </summary>
+ public string OriginalName
+ {
+ get { return _name; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the object and its content in HTML.
+ /// </summary>
+ public virtual string OuterHtml
+ {
+ get
+ {
+ if (_outerchanged)
+ {
+ _outerhtml = WriteTo();
+ _outerchanged = false;
+ return _outerhtml;
+ }
+
+ if (_outerhtml != null)
+ {
+ return _outerhtml;
+ }
+
+ if (_outerstartindex < 0)
+ {
+ return string.Empty;
+ }
+
+ return _ownerdocument._text.Substring(_outerstartindex, _outerlength);
+ }
+ }
+
+ /// <summary>
+ /// Gets the <see cref="HtmlDocument"/> to which this node belongs.
+ /// </summary>
+ public HtmlDocument OwnerDocument
+ {
+ get { return _ownerdocument; }
+ internal set { _ownerdocument = value; }
+ }
+
+ /// <summary>
+ /// Gets the parent of this node (for nodes that can have parents).
+ /// </summary>
+ public HtmlNode ParentNode
+ {
+ get { return _parentnode; }
+ internal set { _parentnode = value; }
+ }
+
+ /// <summary>
+ /// Gets the node immediately preceding this node.
+ /// </summary>
+ public HtmlNode PreviousSibling
+ {
+ get { return _prevnode; }
+ internal set { _prevnode = value; }
+ }
+
+ /// <summary>
+ /// Gets the stream position of this node in the document, relative to the start of the document.
+ /// </summary>
+ public int StreamPosition
+ {
+ get { return _streamposition; }
+ }
+
+ /// <summary>
+ /// Gets a valid XPath string that points to this node
+ /// </summary>
+ public string XPath
+ {
+ get
+ {
+ string basePath = (ParentNode == null || ParentNode.NodeType == HtmlNodeType.Document)
+ ? "/"
+ : ParentNode.XPath + "/";
+ return basePath + GetRelativeXpath();
+ }
+ }
+
+ #endregion
+
+ #region IXPathNavigable Members
+
+ /// <summary>
+ /// Creates a new XPathNavigator object for navigating this HTML node.
+ /// </summary>
+ /// <returns>An XPathNavigator object. The XPathNavigator is positioned on the node from which the method was called. It is not positioned on the root of the document.</returns>
+ public XPathNavigator CreateNavigator()
+ {
+ return new HtmlNodeNavigator(_ownerdocument, this);
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Determines if an element node can be kept overlapped.
+ /// </summary>
+ /// <param name="name">The name of the element node to check. May not be <c>null</c>.</param>
+ /// <returns>true if the name is the name of an element node that can be kept overlapped, <c>false</c> otherwise.</returns>
+ public static bool CanOverlapElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ object flag = ElementsFlags[name.ToLower()];
+ if (flag == null)
+ {
+ return false;
+ }
+ return (((HtmlElementFlag) flag) & HtmlElementFlag.CanOverlap) != 0;
+ }
+
+ /// <summary>
+ /// Creates an HTML node from a string representing literal HTML.
+ /// </summary>
+ /// <param name="html">The HTML text.</param>
+ /// <returns>The newly created node instance.</returns>
+ public static HtmlNode CreateNode(string html)
+ {
+ // REVIEW: this is *not* optimum...
+ HtmlDocument doc = new HtmlDocument();
+ doc.LoadHtml(html);
+ return doc.DocumentNode.FirstChild;
+ }
+
+ /// <summary>
+ /// Determines if an element node is a CDATA element node.
+ /// </summary>
+ /// <param name="name">The name of the element node to check. May not be null.</param>
+ /// <returns>true if the name is the name of a CDATA element node, false otherwise.</returns>
+ public static bool IsCDataElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ object flag = ElementsFlags[name.ToLower()];
+ if (flag == null)
+ {
+ return false;
+ }
+ return (((HtmlElementFlag) flag) & HtmlElementFlag.CData) != 0;
+ }
+
+ /// <summary>
+ /// Determines if an element node is closed.
+ /// </summary>
+ /// <param name="name">The name of the element node to check. May not be null.</param>
+ /// <returns>true if the name is the name of a closed element node, false otherwise.</returns>
+ public static bool IsClosedElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ object flag = ElementsFlags[name.ToLower()];
+ if (flag == null)
+ {
+ return false;
+ }
+ return (((HtmlElementFlag) flag) & HtmlElementFlag.Closed) != 0;
+ }
+
+ /// <summary>
+ /// Determines if an element node is defined as empty.
+ /// </summary>
+ /// <param name="name">The name of the element node to check. May not be null.</param>
+ /// <returns>true if the name is the name of an empty element node, false otherwise.</returns>
+ public static bool IsEmptyElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ if (name.Length == 0)
+ {
+ return true;
+ }
+
+ // <!DOCTYPE ...
+ if ('!' == name[0])
+ {
+ return true;
+ }
+
+ // <?xml ...
+ if ('?' == name[0])
+ {
+ return true;
+ }
+
+ object flag = ElementsFlags[name.ToLower()];
+ if (flag == null)
+ {
+ return false;
+ }
+ return (((HtmlElementFlag) flag) & HtmlElementFlag.Empty) != 0;
+ }
+
+ /// <summary>
+ /// Determines if a text corresponds to the closing tag of an node that can be kept overlapped.
+ /// </summary>
+ /// <param name="text">The text to check. May not be null.</param>
+ /// <returns>true or false.</returns>
+ public static bool IsOverlappedClosingElement(string text)
+ {
+ if (text == null)
+ {
+ throw new ArgumentNullException("text");
+ }
+ // min is </x>: 4
+ if (text.Length <= 4)
+ return false;
+
+ if ((text[0] != '<') ||
+ (text[text.Length - 1] != '>') ||
+ (text[1] != '/'))
+ return false;
+
+ string name = text.Substring(2, text.Length - 3);
+ return CanOverlapElement(name);
+ }
+
+ /// <summary>
+ /// Returns a collection of all ancestor nodes of this element.
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Ancestors()
+ {
+ HtmlNode node = ParentNode;
+ while (node.ParentNode != null)
+ {
+ yield return node.ParentNode;
+ node = node.ParentNode;
+ }
+ }
+
+ /// <summary>
+ /// Get Ancestors with matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Ancestors(string name)
+ {
+ for (HtmlNode n = ParentNode; n != null; n = n.ParentNode)
+ if (n.Name == name)
+ yield return n;
+ }
+
+ /// <summary>
+ /// Returns a collection of all ancestor nodes of this element.
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> AncestorsAndSelf()
+ {
+ for (HtmlNode n = this; n != null; n = n.ParentNode)
+ yield return n;
+ }
+
+ /// <summary>
+ /// Gets all anscestor nodes and the current node
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> AncestorsAndSelf(string name)
+ {
+ for (HtmlNode n = this; n != null; n = n.ParentNode)
+ if (n.Name == name)
+ yield return n;
+ }
+
+ /// <summary>
+ /// Adds the specified node to the end of the list of children of this node.
+ /// </summary>
+ /// <param name="newChild">The node to add. May not be null.</param>
+ /// <returns>The node added.</returns>
+ public HtmlNode AppendChild(HtmlNode newChild)
+ {
+ if (newChild == null)
+ {
+ throw new ArgumentNullException("newChild");
+ }
+
+ ChildNodes.Append(newChild);
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Adds the specified node to the end of the list of children of this node.
+ /// </summary>
+ /// <param name="newChildren">The node list to add. May not be null.</param>
+ public void AppendChildren(HtmlNodeCollection newChildren)
+ {
+ if (newChildren == null)
+ throw new ArgumentNullException("newChildrend");
+
+ foreach (HtmlNode newChild in newChildren)
+ {
+ AppendChild(newChild);
+ }
+ }
+
+ /// <summary>
+ /// Gets all Attributes with name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlAttribute> ChildAttributes(string name)
+ {
+ return Attributes.AttributesWithName(name);
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node
+ /// </summary>
+ /// <returns></returns>
+ public HtmlNode Clone()
+ {
+ return CloneNode(true);
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node and changes its name at the same time.
+ /// </summary>
+ /// <param name="newName">The new name of the cloned node. May not be <c>null</c>.</param>
+ /// <returns>The cloned node.</returns>
+ public HtmlNode CloneNode(string newName)
+ {
+ return CloneNode(newName, true);
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node and changes its name at the same time.
+ /// </summary>
+ /// <param name="newName">The new name of the cloned node. May not be null.</param>
+ /// <param name="deep">true to recursively clone the subtree under the specified node; false to clone only the node itself.</param>
+ /// <returns>The cloned node.</returns>
+ public HtmlNode CloneNode(string newName, bool deep)
+ {
+ if (newName == null)
+ {
+ throw new ArgumentNullException("newName");
+ }
+
+ HtmlNode node = CloneNode(deep);
+ node.Name = newName;
+ return node;
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node.
+ /// </summary>
+ /// <param name="deep">true to recursively clone the subtree under the specified node; false to clone only the node itself.</param>
+ /// <returns>The cloned node.</returns>
+ public HtmlNode CloneNode(bool deep)
+ {
+ HtmlNode node = _ownerdocument.CreateNode(_nodetype);
+ node.Name = Name;
+
+ switch (_nodetype)
+ {
+ case HtmlNodeType.Comment:
+ ((HtmlCommentNode) node).Comment = ((HtmlCommentNode) this).Comment;
+ return node;
+
+ case HtmlNodeType.Text:
+ ((HtmlTextNode) node).Text = ((HtmlTextNode) this).Text;
+ return node;
+ }
+
+ // attributes
+ if (HasAttributes)
+ {
+ foreach (HtmlAttribute att in _attributes)
+ {
+ HtmlAttribute newatt = att.Clone();
+ node.Attributes.Append(newatt);
+ }
+ }
+
+ // closing attributes
+ if (HasClosingAttributes)
+ {
+ node._endnode = _endnode.CloneNode(false);
+ foreach (HtmlAttribute att in _endnode._attributes)
+ {
+ HtmlAttribute newatt = att.Clone();
+ node._endnode._attributes.Append(newatt);
+ }
+ }
+ if (!deep)
+ {
+ return node;
+ }
+
+ if (!HasChildNodes)
+ {
+ return node;
+ }
+
+ // child nodes
+ foreach (HtmlNode child in _childnodes)
+ {
+ HtmlNode newchild = child.Clone();
+ node.AppendChild(newchild);
+ }
+ return node;
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node and the subtree under it.
+ /// </summary>
+ /// <param name="node">The node to duplicate. May not be <c>null</c>.</param>
+ public void CopyFrom(HtmlNode node)
+ {
+ CopyFrom(node, true);
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node.
+ /// </summary>
+ /// <param name="node">The node to duplicate. May not be <c>null</c>.</param>
+ /// <param name="deep">true to recursively clone the subtree under the specified node, false to clone only the node itself.</param>
+ public void CopyFrom(HtmlNode node, bool deep)
+ {
+ if (node == null)
+ {
+ throw new ArgumentNullException("node");
+ }
+
+ Attributes.RemoveAll();
+ if (node.HasAttributes)
+ {
+ foreach (HtmlAttribute att in node.Attributes)
+ {
+ SetAttributeValue(att.Name, att.Value);
+ }
+ }
+
+ if (!deep)
+ {
+ RemoveAllChildren();
+ if (node.HasChildNodes)
+ {
+ foreach (HtmlNode child in node.ChildNodes)
+ {
+ AppendChild(child.CloneNode(true));
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Creates an XPathNavigator using the root of this document.
+ /// </summary>
+ /// <returns></returns>
+ public XPathNavigator CreateRootNavigator()
+ {
+ return new HtmlNodeNavigator(_ownerdocument, _ownerdocument.DocumentNode);
+ }
+
+ /// <summary>
+ /// Gets all Descendant nodes for this node and each of child nodes
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantNodes()
+ {
+ foreach (HtmlNode node in ChildNodes)
+ {
+ yield return node;
+ foreach (HtmlNode descendant in node.DescendantNodes())
+ yield return descendant;
+ }
+ }
+
+ /// <summary>
+ /// Returns a collection of all descendant nodes of this element, in document order
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantNodesAndSelf()
+ {
+ return DescendantsAndSelf();
+ }
+
+ /// <summary>
+ /// Gets all Descendant nodes in enumerated list
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Descendants()
+ {
+ foreach (HtmlNode node in DescendantNodes())
+ {
+ yield return node;
+ }
+ }
+
+ /// <summary>
+ /// Get all descendant nodes with matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Descendants(string name)
+ {
+ foreach (HtmlNode node in Descendants())
+ if (node.Name == name)
+ yield return node;
+ }
+
+ /// <summary>
+ /// Returns a collection of all descendant nodes of this element, in document order
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantsAndSelf()
+ {
+ yield return this;
+ foreach (HtmlNode n in DescendantNodes())
+ {
+ HtmlNode el = n;
+ if (el != null)
+ yield return el;
+ }
+ }
+
+ /// <summary>
+ /// Gets all descendant nodes including this node
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantsAndSelf(string name)
+ {
+ yield return this;
+ foreach (HtmlNode node in Descendants())
+ if (node.Name == name)
+ yield return node;
+ }
+
+ /// <summary>
+ /// Gets first generation child node matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public HtmlNode Element(string name)
+ {
+ foreach (HtmlNode node in ChildNodes)
+ if (node.Name == name)
+ return node;
+ return null;
+ }
+
+ /// <summary>
+ /// Gets matching first generation child nodes matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Elements(string name)
+ {
+ foreach (HtmlNode node in ChildNodes)
+ if (node.Name == name)
+ yield return node;
+ }
+
+ /// <summary>
+ /// Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned.
+ /// </summary>
+ /// <param name="name">The name of the attribute to get. May not be <c>null</c>.</param>
+ /// <param name="def">The default value to return if not found.</param>
+ /// <returns>The value of the attribute if found, the default value if not found.</returns>
+ public string GetAttributeValue(string name, string def)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ if (!HasAttributes)
+ {
+ return def;
+ }
+ HtmlAttribute att = Attributes[name];
+ if (att == null)
+ {
+ return def;
+ }
+ return att.Value;
+ }
+
+ /// <summary>
+ /// Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned.
+ /// </summary>
+ /// <param name="name">The name of the attribute to get. May not be <c>null</c>.</param>
+ /// <param name="def">The default value to return if not found.</param>
+ /// <returns>The value of the attribute if found, the default value if not found.</returns>
+ public int GetAttributeValue(string name, int def)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ if (!HasAttributes)
+ {
+ return def;
+ }
+ HtmlAttribute att = Attributes[name];
+ if (att == null)
+ {
+ return def;
+ }
+ try
+ {
+ return Convert.ToInt32(att.Value);
+ }
+ catch
+ {
+ return def;
+ }
+ }
+
+ /// <summary>
+ /// Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned.
+ /// </summary>
+ /// <param name="name">The name of the attribute to get. May not be <c>null</c>.</param>
+ /// <param name="def">The default value to return if not found.</param>
+ /// <returns>The value of the attribute if found, the default value if not found.</returns>
+ public bool GetAttributeValue(string name, bool def)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ if (!HasAttributes)
+ {
+ return def;
+ }
+ HtmlAttribute att = Attributes[name];
+ if (att == null)
+ {
+ return def;
+ }
+ try
+ {
+ return Convert.ToBoolean(att.Value);
+ }
+ catch
+ {
+ return def;
+ }
+ }
+
+ /// <summary>
+ /// Inserts the specified node immediately after the specified reference node.
+ /// </summary>
+ /// <param name="newChild">The node to insert. May not be <c>null</c>.</param>
+ /// <param name="refChild">The node that is the reference node. The newNode is placed after the refNode.</param>
+ /// <returns>The node being inserted.</returns>
+ public HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild)
+ {
+ if (newChild == null)
+ {
+ throw new ArgumentNullException("newChild");
+ }
+
+ if (refChild == null)
+ {
+ return PrependChild(newChild);
+ }
+
+ if (newChild == refChild)
+ {
+ return newChild;
+ }
+
+ int index = -1;
+
+ if (_childnodes != null)
+ {
+ index = _childnodes[refChild];
+ }
+ if (index == -1)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+
+ if (_childnodes != null) _childnodes.Insert(index + 1, newChild);
+
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Inserts the specified node immediately before the specified reference node.
+ /// </summary>
+ /// <param name="newChild">The node to insert. May not be <c>null</c>.</param>
+ /// <param name="refChild">The node that is the reference node. The newChild is placed before this node.</param>
+ /// <returns>The node being inserted.</returns>
+ public HtmlNode InsertBefore(HtmlNode newChild, HtmlNode refChild)
+ {
+ if (newChild == null)
+ {
+ throw new ArgumentNullException("newChild");
+ }
+
+ if (refChild == null)
+ {
+ return AppendChild(newChild);
+ }
+
+ if (newChild == refChild)
+ {
+ return newChild;
+ }
+
+ int index = -1;
+
+ if (_childnodes != null)
+ {
+ index = _childnodes[refChild];
+ }
+
+ if (index == -1)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+
+ if (_childnodes != null) _childnodes.Insert(index, newChild);
+
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Adds the specified node to the beginning of the list of children of this node.
+ /// </summary>
+ /// <param name="newChild">The node to add. May not be <c>null</c>.</param>
+ /// <returns>The node added.</returns>
+ public HtmlNode PrependChild(HtmlNode newChild)
+ {
+ if (newChild == null)
+ {
+ throw new ArgumentNullException("newChild");
+ }
+ ChildNodes.Prepend(newChild);
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Adds the specified node list to the beginning of the list of children of this node.
+ /// </summary>
+ /// <param name="newChildren">The node list to add. May not be <c>null</c>.</param>
+ public void PrependChildren(HtmlNodeCollection newChildren)
+ {
+ if (newChildren == null)
+ {
+ throw new ArgumentNullException("newChildren");
+ }
+
+ foreach (HtmlNode newChild in newChildren)
+ {
+ PrependChild(newChild);
+ }
+ }
+
+ /// <summary>
+ /// Removes node from parent collection
+ /// </summary>
+ public void Remove()
+ {
+ if (ParentNode != null)
+ ParentNode.ChildNodes.Remove(this);
+ }
+
+ /// <summary>
+ /// Removes all the children and/or attributes of the current node.
+ /// </summary>
+ public void RemoveAll()
+ {
+ RemoveAllChildren();
+
+ if (HasAttributes)
+ {
+ _attributes.Clear();
+ }
+
+ if ((_endnode != null) && (_endnode != this))
+ {
+ if (_endnode._attributes != null)
+ {
+ _endnode._attributes.Clear();
+ }
+ }
+ _outerchanged = true;
+ _innerchanged = true;
+ }
+
+ /// <summary>
+ /// Removes all the children of the current node.
+ /// </summary>
+ public void RemoveAllChildren()
+ {
+ if (!HasChildNodes)
+ {
+ return;
+ }
+
+ if (_ownerdocument.OptionUseIdAttribute)
+ {
+ // remove nodes from id list
+ foreach (HtmlNode node in _childnodes)
+ {
+ _ownerdocument.SetIdForNode(null, node.GetId());
+ }
+ }
+ _childnodes.Clear();
+ _outerchanged = true;
+ _innerchanged = true;
+ }
+
+ /// <summary>
+ /// Removes the specified child node.
+ /// </summary>
+ /// <param name="oldChild">The node being removed. May not be <c>null</c>.</param>
+ /// <returns>The node removed.</returns>
+ public HtmlNode RemoveChild(HtmlNode oldChild)
+ {
+ if (oldChild == null)
+ {
+ throw new ArgumentNullException("oldChild");
+ }
+
+ int index = -1;
+
+ if (_childnodes != null)
+ {
+ index = _childnodes[oldChild];
+ }
+
+ if (index == -1)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+
+ if (_childnodes != null)
+ _childnodes.Remove(index);
+
+ _ownerdocument.SetIdForNode(null, oldChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return oldChild;
+ }
+
+ /// <summary>
+ /// Removes the specified child node.
+ /// </summary>
+ /// <param name="oldChild">The node being removed. May not be <c>null</c>.</param>
+ /// <param name="keepGrandChildren">true to keep grand children of the node, false otherwise.</param>
+ /// <returns>The node removed.</returns>
+ public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren)
+ {
+ if (oldChild == null)
+ {
+ throw new ArgumentNullException("oldChild");
+ }
+
+ if ((oldChild._childnodes != null) && keepGrandChildren)
+ {
+ // get prev sibling
+ HtmlNode prev = oldChild.PreviousSibling;
+
+ // reroute grand children to ourselves
+ foreach (HtmlNode grandchild in oldChild._childnodes)
+ {
+ InsertAfter(grandchild, prev);
+ }
+ }
+ RemoveChild(oldChild);
+ _outerchanged = true;
+ _innerchanged = true;
+ return oldChild;
+ }
+
+ /// <summary>
+ /// Replaces the child node oldChild with newChild node.
+ /// </summary>
+ /// <param name="newChild">The new node to put in the child list.</param>
+ /// <param name="oldChild">The node being replaced in the list.</param>
+ /// <returns>The node replaced.</returns>
+ public HtmlNode ReplaceChild(HtmlNode newChild, HtmlNode oldChild)
+ {
+ if (newChild == null)
+ {
+ return RemoveChild(oldChild);
+ }
+
+ if (oldChild == null)
+ {
+ return AppendChild(newChild);
+ }
+
+ int index = -1;
+
+ if (_childnodes != null)
+ {
+ index = _childnodes[oldChild];
+ }
+
+ if (index == -1)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+
+ if (_childnodes != null) _childnodes.Replace(index, newChild);
+
+ _ownerdocument.SetIdForNode(null, oldChild.GetId());
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Selects a list of nodes matching the <see cref="XPath"/> expression.
+ /// </summary>
+ /// <param name="xpath">The XPath expression.</param>
+ /// <returns>An <see cref="HtmlNodeCollection"/> containing a collection of nodes matching the <see cref="XPath"/> query, or <c>null</c> if no node matched the XPath expression.</returns>
+ public HtmlNodeCollection SelectNodes(string xpath)
+ {
+ HtmlNodeCollection list = new HtmlNodeCollection(null);
+
+ HtmlNodeNavigator nav = new HtmlNodeNavigator(_ownerdocument, this);
+ XPathNodeIterator it = nav.Select(xpath);
+ while (it.MoveNext())
+ {
+ HtmlNodeNavigator n = (HtmlNodeNavigator) it.Current;
+ list.Add(n.CurrentNode);
+ }
+ if (list.Count == 0)
+ {
+ return null;
+ }
+ return list;
+ }
+
+ /// <summary>
+ /// Selects the first XmlNode that matches the XPath expression.
+ /// </summary>
+ /// <param name="xpath">The XPath expression. May not be null.</param>
+ /// <returns>The first <see cref="HtmlNode"/> that matches the XPath query or a null reference if no matching node was found.</returns>
+ public HtmlNode SelectSingleNode(string xpath)
+ {
+ if (xpath == null)
+ {
+ throw new ArgumentNullException("xpath");
+ }
+
+ HtmlNodeNavigator nav = new HtmlNodeNavigator(_ownerdocument, this);
+ XPathNodeIterator it = nav.Select(xpath);
+ if (!it.MoveNext())
+ {
+ return null;
+ }
+
+ HtmlNodeNavigator node = (HtmlNodeNavigator) it.Current;
+ return node.CurrentNode;
+ }
+
+ /// <summary>
+ /// Helper method to set the value of an attribute of this node. If the attribute is not found, it will be created automatically.
+ /// </summary>
+ /// <param name="name">The name of the attribute to set. May not be null.</param>
+ /// <param name="value">The value for the attribute.</param>
+ /// <returns>The corresponding attribute instance.</returns>
+ public HtmlAttribute SetAttributeValue(string name, string value)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ HtmlAttribute att = Attributes[name];
+ if (att == null)
+ {
+ return Attributes.Append(_ownerdocument.CreateAttribute(name, value));
+ }
+ att.Value = value;
+ return att;
+ }
+
+ /// <summary>
+ /// Saves all the children of the node to the specified TextWriter.
+ /// </summary>
+ /// <param name="outText">The TextWriter to which you want to save.</param>
+ public void WriteContentTo(TextWriter outText)
+ {
+ if (_childnodes == null)
+ {
+ return;
+ }
+
+ foreach (HtmlNode node in _childnodes)
+ {
+ node.WriteTo(outText);
+ }
+ }
+
+ /// <summary>
+ /// Saves all the children of the node to a string.
+ /// </summary>
+ /// <returns>The saved string.</returns>
+ public string WriteContentTo()
+ {
+ StringWriter sw = new StringWriter();
+ WriteContentTo(sw);
+ sw.Flush();
+ return sw.ToString();
+ }
+
+ /// <summary>
+ /// Saves the current node to the specified TextWriter.
+ /// </summary>
+ /// <param name="outText">The TextWriter to which you want to save.</param>
+ public void WriteTo(TextWriter outText)
+ {
+ string html;
+ switch (_nodetype)
+ {
+ case HtmlNodeType.Comment:
+ html = ((HtmlCommentNode) this).Comment;
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ outText.Write("<!--" + GetXmlComment((HtmlCommentNode) this) + " -->");
+ }
+ else
+ {
+ outText.Write(html);
+ }
+ break;
+
+ case HtmlNodeType.Document:
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ outText.Write("<?xml version=\"1.0\" encoding=\"" + _ownerdocument.GetOutEncoding().BodyName +
+ "\"?>");
+
+ // check there is a root element
+ if (_ownerdocument.DocumentNode.HasChildNodes)
+ {
+ int rootnodes = _ownerdocument.DocumentNode._childnodes.Count;
+ if (rootnodes > 0)
+ {
+ HtmlNode xml = _ownerdocument.GetXmlDeclaration();
+ if (xml != null)
+ {
+ rootnodes --;
+ }
+
+ if (rootnodes > 1)
+ {
+ if (_ownerdocument.OptionOutputUpperCase)
+ {
+ outText.Write("<SPAN>");
+ WriteContentTo(outText);
+ outText.Write("</SPAN>");
+ }
+ else
+ {
+ outText.Write("<span>");
+ WriteContentTo(outText);
+ outText.Write("</span>");
+ }
+ break;
+ }
+ }
+ }
+ }
+ WriteContentTo(outText);
+ break;
+
+ case HtmlNodeType.Text:
+ html = ((HtmlTextNode) this).Text;
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ outText.Write(HtmlDocument.HtmlEncode(html));
+ }
+ else
+ {
+ outText.Write(html);
+ }
+ break;
+
+ case HtmlNodeType.Element:
+ string name;
+ if (_ownerdocument.OptionOutputUpperCase)
+ {
+ name = Name.ToUpper();
+ }
+ else
+ {
+ name = Name;
+ }
+
+ if (_ownerdocument.OptionOutputOriginalCase)
+ name = OriginalName;
+
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ if (name.Length > 0)
+ {
+ if (name[0] == '?')
+ {
+ // forget this one, it's been done at the document level
+ break;
+ }
+
+ if (name.Trim().Length == 0)
+ {
+ break;
+ }
+ name = HtmlDocument.GetXmlName(name);
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ outText.Write("<" + name);
+ WriteAttributes(outText, false);
+
+ if (!HasChildNodes)
+ {
+ if (IsEmptyElement(Name))
+ {
+ if ((_ownerdocument.OptionWriteEmptyNodes) || (_ownerdocument.OptionOutputAsXml))
+ {
+ outText.Write(" />");
+ }
+ else
+ {
+ if (Name.Length > 0)
+ {
+ if (Name[0] == '?')
+ {
+ outText.Write("?");
+ }
+ }
+
+ outText.Write(">");
+ }
+ }
+ else
+ {
+ outText.Write("></" + name + ">");
+ }
+ }
+ else
+ {
+ outText.Write(">");
+ bool cdata = false;
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ if (IsCDataElement(Name))
+ {
+ // this code and the following tries to output things as nicely as possible for old browsers.
+ cdata = true;
+ outText.Write("\r\n//<![CDATA[\r\n");
+ }
+ }
+
+ if (cdata)
+ {
+ if (HasChildNodes)
+ {
+ // child must be a text
+ ChildNodes[0].WriteTo(outText);
+ }
+ outText.Write("\r\n//]]>//\r\n");
+ }
+ else
+ {
+ WriteContentTo(outText);
+ }
+
+ outText.Write("</" + name);
+ if (!_ownerdocument.OptionOutputAsXml)
+ {
+ WriteAttributes(outText, true);
+ }
+ outText.Write(">");
+ }
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Saves the current node to the specified XmlWriter.
+ /// </summary>
+ /// <param name="writer">The XmlWriter to which you want to save.</param>
+ public void WriteTo(XmlWriter writer)
+ {
+ switch (_nodetype)
+ {
+ case HtmlNodeType.Comment:
+ writer.WriteComment(GetXmlComment((HtmlCommentNode) this));
+ break;
+
+ case HtmlNodeType.Document:
+ writer.WriteProcessingInstruction("xml",
+ "version=\"1.0\" encoding=\"" +
+ _ownerdocument.GetOutEncoding().BodyName + "\"");
+ if (HasChildNodes)
+ {
+ foreach (HtmlNode subnode in ChildNodes)
+ {
+ subnode.WriteTo(writer);
+ }
+ }
+ break;
+
+ case HtmlNodeType.Text:
+ string html = ((HtmlTextNode) this).Text;
+ writer.WriteString(html);
+ break;
+
+ case HtmlNodeType.Element:
+ string name = _ownerdocument.OptionOutputUpperCase ? Name.ToUpper() : Name;
+
+ if (_ownerdocument.OptionOutputOriginalCase)
+ name = OriginalName;
+
+ writer.WriteStartElement(name);
+ WriteAttributes(writer, this);
+
+ if (HasChildNodes)
+ {
+ foreach (HtmlNode subnode in ChildNodes)
+ {
+ subnode.WriteTo(writer);
+ }
+ }
+ writer.WriteEndElement();
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Saves the current node to a string.
+ /// </summary>
+ /// <returns>The saved string.</returns>
+ public string WriteTo()
+ {
+ using (StringWriter sw = new StringWriter())
+ {
+ WriteTo(sw);
+ sw.Flush();
+ return sw.ToString();
+ }
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal static string GetXmlComment(HtmlCommentNode comment)
+ {
+ string s = comment.Comment;
+ return s.Substring(4, s.Length - 7).Replace("--", " - -");
+ }
+
+ internal static void WriteAttributes(XmlWriter writer, HtmlNode node)
+ {
+ if (!node.HasAttributes)
+ {
+ return;
+ }
+ // we use Hashitems to make sure attributes are written only once
+ foreach (HtmlAttribute att in node.Attributes.Hashitems.Values)
+ {
+ writer.WriteAttributeString(att.XmlName, att.Value);
+ }
+ }
+
+ internal void CloseNode(HtmlNode endnode)
+ {
+ if (!_ownerdocument.OptionAutoCloseOnEnd)
+ {
+ // close all children
+ if (_childnodes != null)
+ {
+ foreach (HtmlNode child in _childnodes)
+ {
+ if (child.Closed)
+ continue;
+
+ // create a fake closer node
+ HtmlNode close = new HtmlNode(NodeType, _ownerdocument, -1);
+ close._endnode = close;
+ child.CloseNode(close);
+ }
+ }
+ }
+
+ if (!Closed)
+ {
+ _endnode = endnode;
+
+ if (_ownerdocument._openednodes != null)
+ {
+ _ownerdocument._openednodes.Remove(_outerstartindex);
+ }
+
+ HtmlNode self = _ownerdocument._lastnodes[Name] as HtmlNode;
+ if (self == this)
+ {
+ _ownerdocument._lastnodes.Remove(Name);
+ _ownerdocument.UpdateLastParentNode();
+ }
+
+ if (endnode == this)
+ return;
+
+ // create an inner section
+ _innerstartindex = _outerstartindex + _outerlength;
+ _innerlength = endnode._outerstartindex - _innerstartindex;
+
+ // update full length
+ _outerlength = (endnode._outerstartindex + endnode._outerlength) - _outerstartindex;
+ }
+ }
+
+ internal string GetId()
+ {
+ HtmlAttribute att = Attributes["id"];
+ if (att == null)
+ {
+ return null;
+ }
+ return att.Value;
+ }
+
+ internal void SetId(string id)
+ {
+ HtmlAttribute att = Attributes["id"];
+ if (att == null)
+ {
+ att = _ownerdocument.CreateAttribute("id");
+ }
+ att.Value = id;
+ _ownerdocument.SetIdForNode(this, att.Value);
+ _outerchanged = true;
+ }
+
+ internal void WriteAttribute(TextWriter outText, HtmlAttribute att)
+ {
+ string name;
+ string quote = att.QuoteType == AttributeValueQuote.DoubleQuote ? "\"" : "'";
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ if (_ownerdocument.OptionOutputUpperCase)
+ {
+ name = att.XmlName.ToUpper();
+ }
+ else
+ {
+ name = att.XmlName;
+ }
+ if (_ownerdocument.OptionOutputOriginalCase)
+ name = att.OriginalName;
+
+ outText.Write(" " + name + "=" + quote + HtmlDocument.HtmlEncode(att.XmlValue) + quote);
+ }
+ else
+ {
+ if (_ownerdocument.OptionOutputUpperCase)
+ {
+ name = att.Name.ToUpper();
+ }
+ else
+ {
+ name = att.Name;
+ }
+
+ if (att.Name.Length >= 4)
+ {
+ if ((att.Name[0] == '<') && (att.Name[1] == '%') &&
+ (att.Name[att.Name.Length - 1] == '>') && (att.Name[att.Name.Length - 2] == '%'))
+ {
+ outText.Write(" " + name);
+ return;
+ }
+ }
+ if (_ownerdocument.OptionOutputOptimizeAttributeValues)
+ {
+ if (att.Value.IndexOfAny(new Char[] {(char) 10, (char) 13, (char) 9, ' '}) < 0)
+ {
+ outText.Write(" " + name + "=" + att.Value);
+ }
+ else
+ {
+ outText.Write(" " + name + "=" + quote + att.Value + quote);
+ }
+ }
+ else
+ {
+ outText.Write(" " + name + "=" + quote + att.Value + quote);
+ }
+ }
+ }
+
+ internal void WriteAttributes(TextWriter outText, bool closing)
+ {
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ if (_attributes == null)
+ {
+ return;
+ }
+ // we use Hashitems to make sure attributes are written only once
+ foreach (HtmlAttribute att in _attributes.Hashitems.Values)
+ {
+ WriteAttribute(outText, att);
+ }
+ return;
+ }
+
+ if (!closing)
+ {
+ if (_attributes != null)
+ {
+ foreach (HtmlAttribute att in _attributes)
+ {
+ WriteAttribute(outText, att);
+ }
+ }
+ if (_ownerdocument.OptionAddDebuggingAttributes)
+ {
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_closed", Closed.ToString()));
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_children", ChildNodes.Count.ToString()));
+
+ int i = 0;
+ foreach (HtmlNode n in ChildNodes)
+ {
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_child_" + i,
+ n.Name));
+ i++;
+ }
+ }
+ }
+ else
+ {
+ if (_endnode == null)
+ {
+ return;
+ }
+
+ if (_endnode._attributes == null)
+ {
+ return;
+ }
+
+ if (_endnode == this)
+ {
+ return;
+ }
+
+ foreach (HtmlAttribute att in _endnode._attributes)
+ {
+ WriteAttribute(outText, att);
+ }
+ if (_ownerdocument.OptionAddDebuggingAttributes)
+ {
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_closed", Closed.ToString()));
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_children", ChildNodes.Count.ToString()));
+ }
+ }
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private string GetRelativeXpath()
+ {
+ if (ParentNode == null)
+ return Name;
+ if (NodeType == HtmlNodeType.Document)
+ return string.Empty;
+
+ int i = 1;
+ foreach (HtmlNode node in ParentNode.ChildNodes)
+ {
+ if (node.Name != Name) continue;
+
+ if (node == this)
+ break;
+
+ i++;
+ }
+ return Name + "[" + i + "]";
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlNodeCollection.cs b/docs/HtmlAgilityPack/HtmlNodeCollection.cs new file mode 100644 index 00000000000..379e37082d7 --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlNodeCollection.cs @@ -0,0 +1,512 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a combined list and collection of HTML nodes.
+ /// </summary>
+ public class HtmlNodeCollection : IList<HtmlNode>
+ {
+ #region Fields
+
+ private readonly HtmlNode _parentnode;
+ private readonly List<HtmlNode> _items = new List<HtmlNode>();
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Initialize the HtmlNodeCollection with the base parent node
+ /// </summary>
+ /// <param name="parentnode">The base node of the collection</param>
+ public HtmlNodeCollection(HtmlNode parentnode)
+ {
+ _parentnode = parentnode; // may be null
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets a given node from the list.
+ /// </summary>
+ public int this[HtmlNode node]
+ {
+ get
+ {
+ int index = GetNodeIndex(node);
+ if (index == -1)
+ {
+ throw new ArgumentOutOfRangeException("node",
+ "Node \"" + node.CloneNode(false).OuterHtml +
+ "\" was not found in the collection");
+ }
+ return index;
+ }
+ }
+
+ /// <summary>
+ /// Get node with tag name
+ /// </summary>
+ /// <param name="nodeName"></param>
+ /// <returns></returns>
+ public HtmlNode this[string nodeName]
+ {
+ get
+ {
+ nodeName = nodeName.ToLower();
+ for (int i = 0; i < _items.Count; i++)
+ if (_items[i].Equals(nodeName))
+ return _items[i];
+
+ return null;
+ }
+ }
+
+ #endregion
+
+ #region IList<HtmlNode> Members
+
+ /// <summary>
+ /// Gets the number of elements actually contained in the list.
+ /// </summary>
+ public int Count
+ {
+ get { return _items.Count; }
+ }
+
+ /// <summary>
+ /// Is collection read only
+ /// </summary>
+ public bool IsReadOnly
+ {
+ get { return false; }
+ }
+
+ /// <summary>
+ /// Gets the node at the specified index.
+ /// </summary>
+ public HtmlNode this[int index]
+ {
+ get { return _items[index]; }
+ set { _items[index] = value; }
+ }
+
+ /// <summary>
+ /// Add node to the collection
+ /// </summary>
+ /// <param name="node"></param>
+ public void Add(HtmlNode node)
+ {
+ _items.Add(node);
+ }
+
+ /// <summary>
+ /// Clears out the collection of HtmlNodes. Removes each nodes reference to parentnode, nextnode and prevnode
+ /// </summary>
+ public void Clear()
+ {
+ foreach (HtmlNode node in _items)
+ {
+ node.ParentNode = null;
+ node.NextSibling = null;
+ node.PreviousSibling = null;
+ }
+ _items.Clear();
+ }
+
+ /// <summary>
+ /// Gets existence of node in collection
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Contains(HtmlNode item)
+ {
+ return _items.Contains(item);
+ }
+
+ /// <summary>
+ /// Copy collection to array
+ /// </summary>
+ /// <param name="array"></param>
+ /// <param name="arrayIndex"></param>
+ public void CopyTo(HtmlNode[] array, int arrayIndex)
+ {
+ _items.CopyTo(array, arrayIndex);
+ }
+
+ /// <summary>
+ /// Get Enumerator
+ /// </summary>
+ /// <returns></returns>
+ IEnumerator<HtmlNode> IEnumerable<HtmlNode>.GetEnumerator()
+ {
+ return _items.GetEnumerator();
+ }
+
+ /// <summary>
+ /// Get Explicit Enumerator
+ /// </summary>
+ /// <returns></returns>
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return _items.GetEnumerator();
+ }
+
+ /// <summary>
+ /// Get index of node
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public int IndexOf(HtmlNode item)
+ {
+ return _items.IndexOf(item);
+ }
+
+ /// <summary>
+ /// Insert node at index
+ /// </summary>
+ /// <param name="index"></param>
+ /// <param name="node"></param>
+ public void Insert(int index, HtmlNode node)
+ {
+ HtmlNode next = null;
+ HtmlNode prev = null;
+
+ if (index > 0)
+ {
+ prev = _items[index - 1];
+ }
+
+ if (index < _items.Count)
+ {
+ next = _items[index];
+ }
+
+ _items.Insert(index, node);
+
+ if (prev != null)
+ {
+ if (node == prev)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ prev._nextnode = node;
+ }
+
+ if (next != null)
+ {
+ next._prevnode = node;
+ }
+
+ node._prevnode = prev;
+ if (next == node)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ node._nextnode = next;
+ node._parentnode = _parentnode;
+ }
+
+ /// <summary>
+ /// Remove node
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Remove(HtmlNode item)
+ {
+ int i = _items.IndexOf(item);
+ RemoveAt(i);
+ return true;
+ }
+
+ /// <summary>
+ /// Remove <see cref="HtmlNode"/> at index
+ /// </summary>
+ /// <param name="index"></param>
+ public void RemoveAt(int index)
+ {
+ HtmlNode next = null;
+ HtmlNode prev = null;
+ HtmlNode oldnode = _items[index];
+
+ if (index > 0)
+ {
+ prev = _items[index - 1];
+ }
+
+ if (index < (_items.Count - 1))
+ {
+ next = _items[index + 1];
+ }
+
+ _items.RemoveAt(index);
+
+ if (prev != null)
+ {
+ if (next == prev)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ prev._nextnode = next;
+ }
+
+ if (next != null)
+ {
+ next._prevnode = prev;
+ }
+
+ oldnode._prevnode = null;
+ oldnode._nextnode = null;
+ oldnode._parentnode = null;
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Get first instance of node in supplied collection
+ /// </summary>
+ /// <param name="items"></param>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public static HtmlNode FindFirst(HtmlNodeCollection items, string name)
+ {
+ foreach (HtmlNode node in items)
+ {
+ if (node.Name.ToLower().Contains(name))
+ return node;
+ if (node.HasChildNodes)
+ {
+ HtmlNode returnNode = FindFirst(node.ChildNodes, name);
+ if (returnNode != null)
+ return returnNode;
+ }
+ }
+ return null;
+ }
+
+ /// <summary>
+ /// Add node to the end of the collection
+ /// </summary>
+ /// <param name="node"></param>
+ public void Append(HtmlNode node)
+ {
+ HtmlNode last = null;
+ if (_items.Count > 0)
+ {
+ last = _items[_items.Count - 1];
+ }
+
+ _items.Add(node);
+ node._prevnode = last;
+ node._nextnode = null;
+ node._parentnode = _parentnode;
+ if (last != null)
+ {
+ if (last == node)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ last._nextnode = node;
+ }
+ }
+
+ /// <summary>
+ /// Get first instance of node with name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public HtmlNode FindFirst(string name)
+ {
+ return FindFirst(this, name);
+ }
+
+ /// <summary>
+ /// Get index of node
+ /// </summary>
+ /// <param name="node"></param>
+ /// <returns></returns>
+ public int GetNodeIndex(HtmlNode node)
+ {
+ // TODO: should we rewrite this? what would be the key of a node?
+ for (int i = 0; i < _items.Count; i++)
+ {
+ if (node == (_items[i]))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ /// <summary>
+ /// Add node to the beginning of the collection
+ /// </summary>
+ /// <param name="node"></param>
+ public void Prepend(HtmlNode node)
+ {
+ HtmlNode first = null;
+ if (_items.Count > 0)
+ {
+ first = _items[0];
+ }
+
+ _items.Insert(0, node);
+
+ if (node == first)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ node._nextnode = first;
+ node._prevnode = null;
+ node._parentnode = _parentnode;
+ if (first != null)
+ {
+ first._prevnode = node;
+ }
+ }
+
+ /// <summary>
+ /// Remove node at index
+ /// </summary>
+ /// <param name="index"></param>
+ /// <returns></returns>
+ public bool Remove(int index)
+ {
+ RemoveAt(index);
+ return true;
+ }
+
+ /// <summary>
+ /// Replace node at index
+ /// </summary>
+ /// <param name="index"></param>
+ /// <param name="node"></param>
+ public void Replace(int index, HtmlNode node)
+ {
+ HtmlNode next = null;
+ HtmlNode prev = null;
+ HtmlNode oldnode = _items[index];
+
+ if (index > 0)
+ {
+ prev = _items[index - 1];
+ }
+
+ if (index < (_items.Count - 1))
+ {
+ next = _items[index + 1];
+ }
+
+ _items[index] = node;
+
+ if (prev != null)
+ {
+ if (node == prev)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ prev._nextnode = node;
+ }
+
+ if (next != null)
+ {
+ next._prevnode = node;
+ }
+
+ node._prevnode = prev;
+
+ if (next == node)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+
+ node._nextnode = next;
+ node._parentnode = _parentnode;
+
+ oldnode._prevnode = null;
+ oldnode._nextnode = null;
+ oldnode._parentnode = null;
+ }
+
+ #endregion
+
+ #region LINQ Methods
+
+ /// <summary>
+ /// Get all node descended from this collection
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantNodes()
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.DescendantNodes())
+ yield return n;
+ }
+
+ /// <summary>
+ /// Get all node descended from this collection
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Descendants()
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.Descendants())
+ yield return n;
+ }
+
+ /// <summary>
+ /// Get all node descended from this collection with matching name
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Descendants(string name)
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.Descendants(name))
+ yield return n;
+ }
+
+ /// <summary>
+ /// Gets all first generation elements in collection
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Elements()
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.ChildNodes)
+ yield return n;
+ }
+
+ /// <summary>
+ /// Gets all first generation elements matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Elements(string name)
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.Elements(name))
+ yield return n;
+ }
+
+ /// <summary>
+ /// All first generation nodes in collection
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Nodes()
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.ChildNodes)
+ yield return n;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlNodeNavigator.cs b/docs/HtmlAgilityPack/HtmlNodeNavigator.cs new file mode 100644 index 00000000000..78375ed72a1 --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlNodeNavigator.cs @@ -0,0 +1,768 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Text;
+using System.Xml;
+using System.Xml.XPath;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML navigator on an HTML document seen as a data store.
+ /// </summary>
+ public class HtmlNodeNavigator : XPathNavigator
+ {
+ #region Fields
+
+ private int _attindex;
+ private HtmlNode _currentnode;
+ private HtmlDocument _doc = new HtmlDocument();
+ private HtmlNameTable _nametable = new HtmlNameTable();
+
+ internal bool Trace;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlNodeNavigator()
+ {
+ Reset();
+ }
+
+ internal HtmlNodeNavigator(HtmlDocument doc, HtmlNode currentNode)
+ {
+ if (currentNode == null)
+ {
+ throw new ArgumentNullException("currentNode");
+ }
+ if (currentNode.OwnerDocument != doc)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+ InternalTrace(null);
+
+ _doc = doc;
+ Reset();
+ _currentnode = currentNode;
+ }
+
+ private HtmlNodeNavigator(HtmlNodeNavigator nav)
+ {
+ if (nav == null)
+ {
+ throw new ArgumentNullException("nav");
+ }
+ InternalTrace(null);
+
+ _doc = nav._doc;
+ _currentnode = nav._currentnode;
+ _attindex = nav._attindex;
+ _nametable = nav._nametable; // REVIEW: should we do this?
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ public HtmlNodeNavigator(Stream stream)
+ {
+ _doc.Load(stream);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ public HtmlNodeNavigator(Stream stream, bool detectEncodingFromByteOrderMarks)
+ {
+ _doc.Load(stream, detectEncodingFromByteOrderMarks);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public HtmlNodeNavigator(Stream stream, Encoding encoding)
+ {
+ _doc.Load(stream, encoding);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ public HtmlNodeNavigator(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ _doc.Load(stream, encoding, detectEncodingFromByteOrderMarks);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public HtmlNodeNavigator(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ _doc.Load(stream, encoding, detectEncodingFromByteOrderMarks, buffersize);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a TextReader.
+ /// </summary>
+ /// <param name="reader">The TextReader used to feed the HTML data into the document.</param>
+ public HtmlNodeNavigator(TextReader reader)
+ {
+ _doc.Load(reader);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ public HtmlNodeNavigator(string path)
+ {
+ _doc.Load(path);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public HtmlNodeNavigator(string path, bool detectEncodingFromByteOrderMarks)
+ {
+ _doc.Load(path, detectEncodingFromByteOrderMarks);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public HtmlNodeNavigator(string path, Encoding encoding)
+ {
+ _doc.Load(path, encoding);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public HtmlNodeNavigator(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ _doc.Load(path, encoding, detectEncodingFromByteOrderMarks);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public HtmlNodeNavigator(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ _doc.Load(path, encoding, detectEncodingFromByteOrderMarks, buffersize);
+ Reset();
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the base URI for the current node.
+ /// Always returns string.Empty in the case of HtmlNavigator implementation.
+ /// </summary>
+ public override string BaseURI
+ {
+ get
+ {
+ InternalTrace(">");
+ return _nametable.GetOrAdd(string.Empty);
+ }
+ }
+
+ /// <summary>
+ /// Gets the current HTML document.
+ /// </summary>
+ public HtmlDocument CurrentDocument
+ {
+ get { return _doc; }
+ }
+
+ /// <summary>
+ /// Gets the current HTML node.
+ /// </summary>
+ public HtmlNode CurrentNode
+ {
+ get { return _currentnode; }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node has child nodes.
+ /// </summary>
+ public override bool HasAttributes
+ {
+ get
+ {
+ InternalTrace(">" + (_currentnode.Attributes.Count > 0));
+ return (_currentnode.Attributes.Count > 0);
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node has child nodes.
+ /// </summary>
+ public override bool HasChildren
+ {
+ get
+ {
+ InternalTrace(">" + (_currentnode.ChildNodes.Count > 0));
+ return (_currentnode.ChildNodes.Count > 0);
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node is an empty element.
+ /// </summary>
+ public override bool IsEmptyElement
+ {
+ get
+ {
+ InternalTrace(">" + !HasChildren);
+ // REVIEW: is this ok?
+ return !HasChildren;
+ }
+ }
+
+ /// <summary>
+ /// Gets the name of the current HTML node without the namespace prefix.
+ /// </summary>
+ public override string LocalName
+ {
+ get
+ {
+ if (_attindex != -1)
+ {
+ InternalTrace("att>" + _currentnode.Attributes[_attindex].Name);
+ return _nametable.GetOrAdd(_currentnode.Attributes[_attindex].Name);
+ }
+ InternalTrace("node>" + _currentnode.Name);
+ return _nametable.GetOrAdd(_currentnode.Name);
+ }
+ }
+
+ /// <summary>
+ /// Gets the qualified name of the current node.
+ /// </summary>
+ public override string Name
+ {
+ get
+ {
+ InternalTrace(">" + _currentnode.Name);
+ return _nametable.GetOrAdd(_currentnode.Name);
+ }
+ }
+
+ /// <summary>
+ /// Gets the namespace URI (as defined in the W3C Namespace Specification) of the current node.
+ /// Always returns string.Empty in the case of HtmlNavigator implementation.
+ /// </summary>
+ public override string NamespaceURI
+ {
+ get
+ {
+ InternalTrace(">");
+ return _nametable.GetOrAdd(string.Empty);
+ }
+ }
+
+ /// <summary>
+ /// Gets the <see cref="XmlNameTable"/> associated with this implementation.
+ /// </summary>
+ public override XmlNameTable NameTable
+ {
+ get
+ {
+ InternalTrace(null);
+ return _nametable;
+ }
+ }
+
+ /// <summary>
+ /// Gets the type of the current node.
+ /// </summary>
+ public override XPathNodeType NodeType
+ {
+ get
+ {
+ switch (_currentnode.NodeType)
+ {
+ case HtmlNodeType.Comment:
+ InternalTrace(">" + XPathNodeType.Comment);
+ return XPathNodeType.Comment;
+
+ case HtmlNodeType.Document:
+ InternalTrace(">" + XPathNodeType.Root);
+ return XPathNodeType.Root;
+
+ case HtmlNodeType.Text:
+ InternalTrace(">" + XPathNodeType.Text);
+ return XPathNodeType.Text;
+
+ case HtmlNodeType.Element:
+ {
+ if (_attindex != -1)
+ {
+ InternalTrace(">" + XPathNodeType.Attribute);
+ return XPathNodeType.Attribute;
+ }
+ InternalTrace(">" + XPathNodeType.Element);
+ return XPathNodeType.Element;
+ }
+
+ default:
+ throw new NotImplementedException("Internal error: Unhandled HtmlNodeType: " +
+ _currentnode.NodeType);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets the prefix associated with the current node.
+ /// Always returns string.Empty in the case of HtmlNavigator implementation.
+ /// </summary>
+ public override string Prefix
+ {
+ get
+ {
+ InternalTrace(null);
+ return _nametable.GetOrAdd(string.Empty);
+ }
+ }
+
+ /// <summary>
+ /// Gets the text value of the current node.
+ /// </summary>
+ public override string Value
+ {
+ get
+ {
+ InternalTrace("nt=" + _currentnode.NodeType);
+ switch (_currentnode.NodeType)
+ {
+ case HtmlNodeType.Comment:
+ InternalTrace(">" + ((HtmlCommentNode) _currentnode).Comment);
+ return ((HtmlCommentNode) _currentnode).Comment;
+
+ case HtmlNodeType.Document:
+ InternalTrace(">");
+ return "";
+
+ case HtmlNodeType.Text:
+ InternalTrace(">" + ((HtmlTextNode) _currentnode).Text);
+ return ((HtmlTextNode) _currentnode).Text;
+
+ case HtmlNodeType.Element:
+ {
+ if (_attindex != -1)
+ {
+ InternalTrace(">" + _currentnode.Attributes[_attindex].Value);
+ return _currentnode.Attributes[_attindex].Value;
+ }
+ return _currentnode.InnerText;
+ }
+
+ default:
+ throw new NotImplementedException("Internal error: Unhandled HtmlNodeType: " +
+ _currentnode.NodeType);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets the xml:lang scope for the current node.
+ /// Always returns string.Empty in the case of HtmlNavigator implementation.
+ /// </summary>
+ public override string XmlLang
+ {
+ get
+ {
+ InternalTrace(null);
+ return _nametable.GetOrAdd(string.Empty);
+ }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Creates a new HtmlNavigator positioned at the same node as this HtmlNavigator.
+ /// </summary>
+ /// <returns>A new HtmlNavigator object positioned at the same node as the original HtmlNavigator.</returns>
+ public override XPathNavigator Clone()
+ {
+ InternalTrace(null);
+ return new HtmlNodeNavigator(this);
+ }
+
+ /// <summary>
+ /// Gets the value of the HTML attribute with the specified LocalName and NamespaceURI.
+ /// </summary>
+ /// <param name="localName">The local name of the HTML attribute.</param>
+ /// <param name="namespaceURI">The namespace URI of the attribute. Unsupported with the HtmlNavigator implementation.</param>
+ /// <returns>The value of the specified HTML attribute. String.Empty or null if a matching attribute is not found or if the navigator is not positioned on an element node.</returns>
+ public override string GetAttribute(string localName, string namespaceURI)
+ {
+ InternalTrace("localName=" + localName + ", namespaceURI=" + namespaceURI);
+ HtmlAttribute att = _currentnode.Attributes[localName];
+ if (att == null)
+ {
+ InternalTrace(">null");
+ return null;
+ }
+ InternalTrace(">" + att.Value);
+ return att.Value;
+ }
+
+ /// <summary>
+ /// Returns the value of the namespace node corresponding to the specified local name.
+ /// Always returns string.Empty for the HtmlNavigator implementation.
+ /// </summary>
+ /// <param name="name">The local name of the namespace node.</param>
+ /// <returns>Always returns string.Empty for the HtmlNavigator implementation.</returns>
+ public override string GetNamespace(string name)
+ {
+ InternalTrace("name=" + name);
+ return string.Empty;
+ }
+
+ /// <summary>
+ /// Determines whether the current HtmlNavigator is at the same position as the specified HtmlNavigator.
+ /// </summary>
+ /// <param name="other">The HtmlNavigator that you want to compare against.</param>
+ /// <returns>true if the two navigators have the same position, otherwise, false.</returns>
+ public override bool IsSamePosition(XPathNavigator other)
+ {
+ HtmlNodeNavigator nav = other as HtmlNodeNavigator;
+ if (nav == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ InternalTrace(">" + (nav._currentnode == _currentnode));
+ return (nav._currentnode == _currentnode);
+ }
+
+ /// <summary>
+ /// Moves to the same position as the specified HtmlNavigator.
+ /// </summary>
+ /// <param name="other">The HtmlNavigator positioned on the node that you want to move to.</param>
+ /// <returns>true if successful, otherwise false. If false, the position of the navigator is unchanged.</returns>
+ public override bool MoveTo(XPathNavigator other)
+ {
+ HtmlNodeNavigator nav = other as HtmlNodeNavigator;
+ if (nav == null)
+ {
+ InternalTrace(">false (nav is not an HtmlNodeNavigator)");
+ return false;
+ }
+ InternalTrace("moveto oid=" + nav.GetHashCode()
+ + ", n:" + nav._currentnode.Name
+ + ", a:" + nav._attindex);
+
+ if (nav._doc == _doc)
+ {
+ _currentnode = nav._currentnode;
+ _attindex = nav._attindex;
+ InternalTrace(">true");
+ return true;
+ }
+ // we don't know how to handle that
+ InternalTrace(">false (???)");
+ return false;
+ }
+
+ /// <summary>
+ /// Moves to the HTML attribute with matching LocalName and NamespaceURI.
+ /// </summary>
+ /// <param name="localName">The local name of the HTML attribute.</param>
+ /// <param name="namespaceURI">The namespace URI of the attribute. Unsupported with the HtmlNavigator implementation.</param>
+ /// <returns>true if the HTML attribute is found, otherwise, false. If false, the position of the navigator does not change.</returns>
+ public override bool MoveToAttribute(string localName, string namespaceURI)
+ {
+ InternalTrace("localName=" + localName + ", namespaceURI=" + namespaceURI);
+ int index = _currentnode.Attributes.GetAttributeIndex(localName);
+ if (index == -1)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _attindex = index;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the first sibling of the current node.
+ /// </summary>
+ /// <returns>true if the navigator is successful moving to the first sibling node, false if there is no first sibling or if the navigator is currently positioned on an attribute node.</returns>
+ public override bool MoveToFirst()
+ {
+ if (_currentnode.ParentNode == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ if (_currentnode.ParentNode.FirstChild == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = _currentnode.ParentNode.FirstChild;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the first HTML attribute.
+ /// </summary>
+ /// <returns>true if the navigator is successful moving to the first HTML attribute, otherwise, false.</returns>
+ public override bool MoveToFirstAttribute()
+ {
+ if (!HasAttributes)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _attindex = 0;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the first child of the current node.
+ /// </summary>
+ /// <returns>true if there is a first child node, otherwise false.</returns>
+ public override bool MoveToFirstChild()
+ {
+ if (!_currentnode.HasChildNodes)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = _currentnode.ChildNodes[0];
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves the XPathNavigator to the first namespace node of the current element.
+ /// Always returns false for the HtmlNavigator implementation.
+ /// </summary>
+ /// <param name="scope">An XPathNamespaceScope value describing the namespace scope.</param>
+ /// <returns>Always returns false for the HtmlNavigator implementation.</returns>
+ public override bool MoveToFirstNamespace(XPathNamespaceScope scope)
+ {
+ InternalTrace(null);
+ return false;
+ }
+
+ /// <summary>
+ /// Moves to the node that has an attribute of type ID whose value matches the specified string.
+ /// </summary>
+ /// <param name="id">A string representing the ID value of the node to which you want to move. This argument does not need to be atomized.</param>
+ /// <returns>true if the move was successful, otherwise false. If false, the position of the navigator is unchanged.</returns>
+ public override bool MoveToId(string id)
+ {
+ InternalTrace("id=" + id);
+ HtmlNode node = _doc.GetElementbyId(id);
+ if (node == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = node;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves the XPathNavigator to the namespace node with the specified local name.
+ /// Always returns false for the HtmlNavigator implementation.
+ /// </summary>
+ /// <param name="name">The local name of the namespace node.</param>
+ /// <returns>Always returns false for the HtmlNavigator implementation.</returns>
+ public override bool MoveToNamespace(string name)
+ {
+ InternalTrace("name=" + name);
+ return false;
+ }
+
+ /// <summary>
+ /// Moves to the next sibling of the current node.
+ /// </summary>
+ /// <returns>true if the navigator is successful moving to the next sibling node, false if there are no more siblings or if the navigator is currently positioned on an attribute node. If false, the position of the navigator is unchanged.</returns>
+ public override bool MoveToNext()
+ {
+ if (_currentnode.NextSibling == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ InternalTrace("_c=" + _currentnode.CloneNode(false).OuterHtml);
+ InternalTrace("_n=" + _currentnode.NextSibling.CloneNode(false).OuterHtml);
+ _currentnode = _currentnode.NextSibling;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the next HTML attribute.
+ /// </summary>
+ /// <returns></returns>
+ public override bool MoveToNextAttribute()
+ {
+ InternalTrace(null);
+ if (_attindex >= (_currentnode.Attributes.Count - 1))
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _attindex++;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves the XPathNavigator to the next namespace node.
+ /// Always returns falsefor the HtmlNavigator implementation.
+ /// </summary>
+ /// <param name="scope">An XPathNamespaceScope value describing the namespace scope.</param>
+ /// <returns>Always returns false for the HtmlNavigator implementation.</returns>
+ public override bool MoveToNextNamespace(XPathNamespaceScope scope)
+ {
+ InternalTrace(null);
+ return false;
+ }
+
+ /// <summary>
+ /// Moves to the parent of the current node.
+ /// </summary>
+ /// <returns>true if there is a parent node, otherwise false.</returns>
+ public override bool MoveToParent()
+ {
+ if (_currentnode.ParentNode == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = _currentnode.ParentNode;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the previous sibling of the current node.
+ /// </summary>
+ /// <returns>true if the navigator is successful moving to the previous sibling node, false if there is no previous sibling or if the navigator is currently positioned on an attribute node.</returns>
+ public override bool MoveToPrevious()
+ {
+ if (_currentnode.PreviousSibling == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = _currentnode.PreviousSibling;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the root node to which the current node belongs.
+ /// </summary>
+ public override void MoveToRoot()
+ {
+ _currentnode = _doc.DocumentNode;
+ InternalTrace(null);
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ [Conditional("TRACE")]
+ internal void InternalTrace(object traceValue)
+ {
+ if (!Trace)
+ {
+ return;
+ }
+ StackFrame sf = new StackFrame(1, true);
+ string name = sf.GetMethod().Name;
+ string nodename = _currentnode == null ? "(null)" : _currentnode.Name;
+ string nodevalue;
+ if (_currentnode == null)
+ {
+ nodevalue = "(null)";
+ }
+ else
+ {
+ switch (_currentnode.NodeType)
+ {
+ case HtmlNodeType.Comment:
+ nodevalue = ((HtmlCommentNode) _currentnode).Comment;
+ break;
+
+ case HtmlNodeType.Document:
+ nodevalue = "";
+ break;
+
+ case HtmlNodeType.Text:
+ nodevalue = ((HtmlTextNode) _currentnode).Text;
+ break;
+
+ default:
+ nodevalue = _currentnode.CloneNode(false).OuterHtml;
+ break;
+ }
+ }
+ System.Diagnostics.Trace.WriteLine(string.Format("oid={0},n={1},a={2},v={3},{4}", GetHashCode(), nodename, _attindex, nodevalue, traceValue), "N!" + name);
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private void Reset()
+ {
+ InternalTrace(null);
+ _currentnode = _doc.DocumentNode;
+ _attindex = -1;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlNodeType.cs b/docs/HtmlAgilityPack/HtmlNodeType.cs new file mode 100644 index 00000000000..a84e4af4705 --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlNodeType.cs @@ -0,0 +1,29 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents the type of a node.
+ /// </summary>
+ public enum HtmlNodeType
+ {
+ /// <summary>
+ /// The root of a document.
+ /// </summary>
+ Document,
+
+ /// <summary>
+ /// An HTML element.
+ /// </summary>
+ Element,
+
+ /// <summary>
+ /// An HTML comment.
+ /// </summary>
+ Comment,
+
+ /// <summary>
+ /// A text node is always the child of an element or a document node.
+ /// </summary>
+ Text,
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlParseError.cs b/docs/HtmlAgilityPack/HtmlParseError.cs new file mode 100644 index 00000000000..d3d5e78ba19 --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlParseError.cs @@ -0,0 +1,92 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a parsing error found during document parsing.
+ /// </summary>
+ public class HtmlParseError
+ {
+ #region Fields
+
+ private HtmlParseErrorCode _code;
+ private int _line;
+ private int _linePosition;
+ private string _reason;
+ private string _sourceText;
+ private int _streamPosition;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlParseError(
+ HtmlParseErrorCode code,
+ int line,
+ int linePosition,
+ int streamPosition,
+ string sourceText,
+ string reason)
+ {
+ _code = code;
+ _line = line;
+ _linePosition = linePosition;
+ _streamPosition = streamPosition;
+ _sourceText = sourceText;
+ _reason = reason;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the type of error.
+ /// </summary>
+ public HtmlParseErrorCode Code
+ {
+ get { return _code; }
+ }
+
+ /// <summary>
+ /// Gets the line number of this error in the document.
+ /// </summary>
+ public int Line
+ {
+ get { return _line; }
+ }
+
+ /// <summary>
+ /// Gets the column number of this error in the document.
+ /// </summary>
+ public int LinePosition
+ {
+ get { return _linePosition; }
+ }
+
+ /// <summary>
+ /// Gets a description for the error.
+ /// </summary>
+ public string Reason
+ {
+ get { return _reason; }
+ }
+
+ /// <summary>
+ /// Gets the the full text of the line containing the error.
+ /// </summary>
+ public string SourceText
+ {
+ get { return _sourceText; }
+ }
+
+ /// <summary>
+ /// Gets the absolute stream position of this error in the document, relative to the start of the document.
+ /// </summary>
+ public int StreamPosition
+ {
+ get { return _streamPosition; }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlParseErrorCode.cs b/docs/HtmlAgilityPack/HtmlParseErrorCode.cs new file mode 100644 index 00000000000..f92128de605 --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlParseErrorCode.cs @@ -0,0 +1,34 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents the type of parsing error.
+ /// </summary>
+ public enum HtmlParseErrorCode
+ {
+ /// <summary>
+ /// A tag was not closed.
+ /// </summary>
+ TagNotClosed,
+
+ /// <summary>
+ /// A tag was not opened.
+ /// </summary>
+ TagNotOpened,
+
+ /// <summary>
+ /// There is a charset mismatch between stream and declared (META) encoding.
+ /// </summary>
+ CharsetMismatch,
+
+ /// <summary>
+ /// An end tag was not required.
+ /// </summary>
+ EndTagNotRequired,
+
+ /// <summary>
+ /// An end tag is invalid at this position.
+ /// </summary>
+ EndTagInvalidHere
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlTextNode.cs b/docs/HtmlAgilityPack/HtmlTextNode.cs new file mode 100644 index 00000000000..cdf8bcedfeb --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlTextNode.cs @@ -0,0 +1,69 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML text node.
+ /// </summary>
+ public class HtmlTextNode : HtmlNode
+ {
+ #region Fields
+
+ private string _text;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlTextNode(HtmlDocument ownerdocument, int index)
+ :
+ base(HtmlNodeType.Text, ownerdocument, index)
+ {
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or Sets the HTML between the start and end tags of the object. In the case of a text node, it is equals to OuterHtml.
+ /// </summary>
+ public override string InnerHtml
+ {
+ get { return OuterHtml; }
+ set { _text = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the object and its content in HTML.
+ /// </summary>
+ public override string OuterHtml
+ {
+ get
+ {
+ if (_text == null)
+ {
+ return base.OuterHtml;
+ }
+ return _text;
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets the text of the node.
+ /// </summary>
+ public string Text
+ {
+ get
+ {
+ if (_text == null)
+ {
+ return base.OuterHtml;
+ }
+ return _text;
+ }
+ set { _text = value; }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlWeb.cs b/docs/HtmlAgilityPack/HtmlWeb.cs new file mode 100644 index 00000000000..39dd4267569 --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlWeb.cs @@ -0,0 +1,907 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Xml;
+using System.Xml.Serialization;
+using System.Xml.Xsl;
+using Microsoft.Win32;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// A utility class to get HTML document from HTTP.
+ /// </summary>
+ public class HtmlWeb
+ {
+ #region Delegates
+
+ /// <summary>
+ /// Represents the method that will handle the PostResponse event.
+ /// </summary>
+ public delegate void PostResponseHandler(HttpWebRequest request, HttpWebResponse response);
+
+ /// <summary>
+ /// Represents the method that will handle the PreHandleDocument event.
+ /// </summary>
+ public delegate void PreHandleDocumentHandler(HtmlDocument document);
+
+ /// <summary>
+ /// Represents the method that will handle the PreRequest event.
+ /// </summary>
+ public delegate bool PreRequestHandler(HttpWebRequest request);
+
+ #endregion
+
+ #region Fields
+
+ private bool _autoDetectEncoding = true;
+ private bool _cacheOnly;
+
+ private string _cachePath;
+ private bool _fromCache;
+ private int _requestDuration;
+ private Uri _responseUri;
+ private HttpStatusCode _statusCode = HttpStatusCode.OK;
+ private int _streamBufferSize = 1024;
+ private bool _useCookies;
+ private bool _usingCache;
+
+ /// <summary>
+ /// Occurs after an HTTP request has been executed.
+ /// </summary>
+ public PostResponseHandler PostResponse;
+
+ /// <summary>
+ /// Occurs before an HTML document is handled.
+ /// </summary>
+ public PreHandleDocumentHandler PreHandleDocument;
+
+ /// <summary>
+ /// Occurs before an HTTP request is executed.
+ /// </summary>
+ public PreRequestHandler PreRequest;
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or Sets a value indicating if document encoding must be automatically detected.
+ /// </summary>
+ public bool AutoDetectEncoding
+ {
+ get { return _autoDetectEncoding; }
+ set { _autoDetectEncoding = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets a value indicating whether to get document only from the cache.
+ /// If this is set to true and document is not found in the cache, nothing will be loaded.
+ /// </summary>
+ public bool CacheOnly
+ {
+ get { return _cacheOnly; }
+ set
+ {
+ if ((value) && !UsingCache)
+ {
+ throw new HtmlWebException("Cache is not enabled. Set UsingCache to true first.");
+ }
+ _cacheOnly = value;
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets the cache path. If null, no caching mechanism will be used.
+ /// </summary>
+ public string CachePath
+ {
+ get { return _cachePath; }
+ set { _cachePath = value; }
+ }
+
+ /// <summary>
+ /// Gets a value indicating if the last document was retrieved from the cache.
+ /// </summary>
+ public bool FromCache
+ {
+ get { return _fromCache; }
+ }
+
+ /// <summary>
+ /// Gets the last request duration in milliseconds.
+ /// </summary>
+ public int RequestDuration
+ {
+ get { return _requestDuration; }
+ }
+
+ /// <summary>
+ /// Gets the URI of the Internet resource that actually responded to the request.
+ /// </summary>
+ public Uri ResponseUri
+ {
+ get { return _responseUri; }
+ }
+
+ /// <summary>
+ /// Gets the last request status.
+ /// </summary>
+ public HttpStatusCode StatusCode
+ {
+ get { return _statusCode; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the size of the buffer used for memory operations.
+ /// </summary>
+ public int StreamBufferSize
+ {
+ get { return _streamBufferSize; }
+ set
+ {
+ if (_streamBufferSize <= 0)
+ {
+ throw new ArgumentException("Size must be greater than zero.");
+ }
+ _streamBufferSize = value;
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets a value indicating if cookies will be stored.
+ /// </summary>
+ public bool UseCookies
+ {
+ get { return _useCookies; }
+ set { _useCookies = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets a value indicating whether the caching mechanisms should be used or not.
+ /// </summary>
+ public bool UsingCache
+ {
+ get
+ {
+ if (_cachePath == null)
+ {
+ return false;
+ }
+ return _usingCache;
+ }
+ set
+ {
+ if ((value) && (_cachePath == null))
+ {
+ throw new HtmlWebException("You need to define a CachePath first.");
+ }
+ _usingCache = value;
+ }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Gets the MIME content type for a given path extension.
+ /// </summary>
+ /// <param name="extension">The input path extension.</param>
+ /// <param name="def">The default content type to return if any error occurs.</param>
+ /// <returns>The path extension's MIME content type.</returns>
+ public static string GetContentTypeForExtension(string extension, string def)
+ {
+ if (string.IsNullOrEmpty(extension))
+ {
+ return def;
+ }
+ string contentType = "";
+ try
+ {
+ RegistryKey reg = Registry.ClassesRoot;
+ reg = reg.OpenSubKey(extension, false);
+ if (reg != null) contentType = (string)reg.GetValue("", def);
+ }
+ catch (Exception)
+ {
+ contentType = def;
+ }
+ return contentType;
+ }
+
+ /// <summary>
+ /// Gets the path extension for a given MIME content type.
+ /// </summary>
+ /// <param name="contentType">The input MIME content type.</param>
+ /// <param name="def">The default path extension to return if any error occurs.</param>
+ /// <returns>The MIME content type's path extension.</returns>
+ public static string GetExtensionForContentType(string contentType, string def)
+ {
+ if (string.IsNullOrEmpty(contentType))
+ {
+ return def;
+ }
+ string ext = "";
+ try
+ {
+ RegistryKey reg = Registry.ClassesRoot;
+ reg = reg.OpenSubKey(@"MIME\Database\Content Type\" + contentType, false);
+ if (reg != null) ext = (string)reg.GetValue("Extension", def);
+ }
+ catch (Exception)
+ {
+ ext = def;
+ }
+ return ext;
+ }
+
+ /// <summary>
+ /// Creates an instance of the given type from the specified Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="type">The requested type.</param>
+ /// <returns>An newly created instance.</returns>
+ public object CreateInstance(string url, Type type)
+ {
+ return CreateInstance(url, null, null, type);
+ }
+
+ /// <summary>
+ /// Creates an instance of the given type from the specified Internet resource.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="xsltUrl">The URL that specifies the XSLT stylesheet to load.</param>
+ /// <param name="xsltArgs">An <see cref="XsltArgumentList"/> containing the namespace-qualified arguments used as input to the transform.</param>
+ /// <param name="type">The requested type.</param>
+ /// <returns>An newly created instance.</returns>
+ public object CreateInstance(string htmlUrl, string xsltUrl, XsltArgumentList xsltArgs, Type type)
+ {
+ return CreateInstance(htmlUrl, xsltUrl, xsltArgs, type, null);
+ }
+
+ /// <summary>
+ /// Creates an instance of the given type from the specified Internet resource.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="xsltUrl">The URL that specifies the XSLT stylesheet to load.</param>
+ /// <param name="xsltArgs">An <see cref="XsltArgumentList"/> containing the namespace-qualified arguments used as input to the transform.</param>
+ /// <param name="type">The requested type.</param>
+ /// <param name="xmlPath">A file path where the temporary XML before transformation will be saved. Mostly used for debugging purposes.</param>
+ /// <returns>An newly created instance.</returns>
+ public object CreateInstance(string htmlUrl, string xsltUrl, XsltArgumentList xsltArgs, Type type,
+ string xmlPath)
+ {
+ StringWriter sw = new StringWriter();
+ XmlTextWriter writer = new XmlTextWriter(sw);
+ if (xsltUrl == null)
+ {
+ LoadHtmlAsXml(htmlUrl, writer);
+ }
+ else
+ {
+ if (xmlPath == null)
+ {
+ LoadHtmlAsXml(htmlUrl, xsltUrl, xsltArgs, writer);
+ }
+ else
+ {
+ LoadHtmlAsXml(htmlUrl, xsltUrl, xsltArgs, writer, xmlPath);
+ }
+ }
+ writer.Flush();
+ StringReader sr = new StringReader(sw.ToString());
+ XmlTextReader reader = new XmlTextReader(sr);
+ XmlSerializer serializer = new XmlSerializer(type);
+ object o;
+ try
+ {
+ o = serializer.Deserialize(reader);
+ }
+ catch (InvalidOperationException ex)
+ {
+ throw new Exception(ex + ", --- xml:" + sw);
+ }
+ return o;
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource and saves it to the specified file.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="path">The location of the file where you want to save the document.</param>
+ public void Get(string url, string path)
+ {
+ Get(url, path, "GET");
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource and saves it to the specified file. - Proxy aware
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="path">The location of the file where you want to save the document.</param>
+ /// <param name="proxy"></param>
+ /// <param name="credentials"></param>
+ public void Get(string url, string path, WebProxy proxy, NetworkCredential credentials)
+ {
+ Get(url, path, proxy, credentials, "GET");
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource and saves it to the specified file.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="path">The location of the file where you want to save the document.</param>
+ /// <param name="method">The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.</param>
+ public void Get(string url, string path, string method)
+ {
+ Uri uri = new Uri(url);
+ if ((uri.Scheme == Uri.UriSchemeHttps) ||
+ (uri.Scheme == Uri.UriSchemeHttp))
+ {
+ Get(uri, method, path, null, null, null);
+ }
+ else
+ {
+ throw new HtmlWebException("Unsupported uri scheme: '" + uri.Scheme + "'.");
+ }
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource and saves it to the specified file. Understands Proxies
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="path">The location of the file where you want to save the document.</param>
+ /// <param name="credentials"></param>
+ /// <param name="method">The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.</param>
+ /// <param name="proxy"></param>
+ public void Get(string url, string path, WebProxy proxy, NetworkCredential credentials, string method)
+ {
+ Uri uri = new Uri(url);
+ if ((uri.Scheme == Uri.UriSchemeHttps) ||
+ (uri.Scheme == Uri.UriSchemeHttp))
+ {
+ Get(uri, method, path, null, proxy, credentials);
+ }
+ else
+ {
+ throw new HtmlWebException("Unsupported uri scheme: '" + uri.Scheme + "'.");
+ }
+ }
+
+ /// <summary>
+ /// Gets the cache file path for a specified url.
+ /// </summary>
+ /// <param name="uri">The url fo which to retrieve the cache path. May not be null.</param>
+ /// <returns>The cache file path.</returns>
+ public string GetCachePath(Uri uri)
+ {
+ if (uri == null)
+ {
+ throw new ArgumentNullException("uri");
+ }
+ if (!UsingCache)
+ {
+ throw new HtmlWebException("Cache is not enabled. Set UsingCache to true first.");
+ }
+ string cachePath;
+ if (uri.AbsolutePath == "/")
+ {
+ cachePath = Path.Combine(_cachePath, ".htm");
+ }
+ else
+ {
+ cachePath = Path.Combine(_cachePath, (uri.Host + uri.AbsolutePath).Replace('/', '\\'));
+ }
+ return cachePath;
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <returns>A new HTML document.</returns>
+ public HtmlDocument Load(string url)
+ {
+ return Load(url, "GET");
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="proxyHost">Host to use for Proxy</param>
+ /// <param name="proxyPort">Port the Proxy is on</param>
+ /// <param name="userId">User Id for Authentication</param>
+ /// <param name="password">Password for Authentication</param>
+ /// <returns>A new HTML document.</returns>
+ public HtmlDocument Load(string url, string proxyHost, int proxyPort, string userId, string password)
+ {
+ //Create my proxy
+ WebProxy myProxy = new WebProxy(proxyHost, proxyPort);
+ myProxy.BypassProxyOnLocal = true;
+
+ //Create my credentials
+ NetworkCredential myCreds = null;
+ if ((userId != null) && (password != null))
+ {
+ myCreds = new NetworkCredential(userId, password);
+ CredentialCache credCache = new CredentialCache();
+ //Add the creds
+ credCache.Add(myProxy.Address, "Basic", myCreds);
+ credCache.Add(myProxy.Address, "Digest", myCreds);
+ }
+
+ return Load(url, "GET", myProxy, myCreds);
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="method">The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.</param>
+ /// <returns>A new HTML document.</returns>
+ public HtmlDocument Load(string url, string method)
+ {
+ Uri uri = new Uri(url);
+ HtmlDocument doc;
+ if ((uri.Scheme == Uri.UriSchemeHttps) ||
+ (uri.Scheme == Uri.UriSchemeHttp))
+ {
+ doc = LoadUrl(uri, method, null, null);
+ }
+ else
+ {
+ if (uri.Scheme == Uri.UriSchemeFile)
+ {
+ doc = new HtmlDocument();
+ doc.OptionAutoCloseOnEnd = false;
+ doc.OptionAutoCloseOnEnd = true;
+ doc.DetectEncodingAndLoad(url, _autoDetectEncoding);
+ }
+ else
+ {
+ throw new HtmlWebException("Unsupported uri scheme: '" + uri.Scheme + "'.");
+ }
+ }
+ if (PreHandleDocument != null)
+ {
+ PreHandleDocument(doc);
+ }
+ return doc;
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="method">The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.</param>
+ /// <param name="proxy">Proxy to use with this request</param>
+ /// <param name="credentials">Credentials to use when authenticating</param>
+ /// <returns>A new HTML document.</returns>
+ public HtmlDocument Load(string url, string method, WebProxy proxy, NetworkCredential credentials)
+ {
+ Uri uri = new Uri(url);
+ HtmlDocument doc;
+ if ((uri.Scheme == Uri.UriSchemeHttps) ||
+ (uri.Scheme == Uri.UriSchemeHttp))
+ {
+ doc = LoadUrl(uri, method, proxy, credentials);
+ }
+ else
+ {
+ if (uri.Scheme == Uri.UriSchemeFile)
+ {
+ doc = new HtmlDocument();
+ doc.OptionAutoCloseOnEnd = false;
+ doc.OptionAutoCloseOnEnd = true;
+ doc.DetectEncodingAndLoad(url, _autoDetectEncoding);
+ }
+ else
+ {
+ throw new HtmlWebException("Unsupported uri scheme: '" + uri.Scheme + "'.");
+ }
+ }
+ if (PreHandleDocument != null)
+ {
+ PreHandleDocument(doc);
+ }
+ return doc;
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="writer">The XmlTextWriter to which you want to save.</param>
+ public void LoadHtmlAsXml(string htmlUrl, XmlTextWriter writer)
+ {
+ HtmlDocument doc = Load(htmlUrl);
+ doc.Save(writer);
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter, after an XSLT transformation.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="xsltUrl">The URL that specifies the XSLT stylesheet to load.</param>
+ /// <param name="xsltArgs">An XsltArgumentList containing the namespace-qualified arguments used as input to the transform.</param>
+ /// <param name="writer">The XmlTextWriter to which you want to save.</param>
+ public void LoadHtmlAsXml(string htmlUrl, string xsltUrl, XsltArgumentList xsltArgs, XmlTextWriter writer)
+ {
+ LoadHtmlAsXml(htmlUrl, xsltUrl, xsltArgs, writer, null);
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter, after an XSLT transformation.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp". May not be null.</param>
+ /// <param name="xsltUrl">The URL that specifies the XSLT stylesheet to load.</param>
+ /// <param name="xsltArgs">An XsltArgumentList containing the namespace-qualified arguments used as input to the transform.</param>
+ /// <param name="writer">The XmlTextWriter to which you want to save.</param>
+ /// <param name="xmlPath">A file path where the temporary XML before transformation will be saved. Mostly used for debugging purposes.</param>
+ public void LoadHtmlAsXml(string htmlUrl, string xsltUrl, XsltArgumentList xsltArgs, XmlTextWriter writer,
+ string xmlPath)
+ {
+ if (htmlUrl == null)
+ {
+ throw new ArgumentNullException("htmlUrl");
+ }
+
+ HtmlDocument doc = Load(htmlUrl);
+
+ if (xmlPath != null)
+ {
+ XmlTextWriter w = new XmlTextWriter(xmlPath, doc.Encoding);
+ doc.Save(w);
+ w.Close();
+ }
+ if (xsltArgs == null)
+ {
+ xsltArgs = new XsltArgumentList();
+ }
+
+ // add some useful variables to the xslt doc
+ xsltArgs.AddParam("url", "", htmlUrl);
+ xsltArgs.AddParam("requestDuration", "", RequestDuration);
+ xsltArgs.AddParam("fromCache", "", FromCache);
+
+ XslCompiledTransform xslt = new XslCompiledTransform();
+ xslt.Load(xsltUrl);
+ xslt.Transform(doc, xsltArgs, writer);
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private static void FilePreparePath(string target)
+ {
+ if (File.Exists(target))
+ {
+ FileAttributes atts = File.GetAttributes(target);
+ File.SetAttributes(target, atts & ~FileAttributes.ReadOnly);
+ }
+ else
+ {
+ string dir = Path.GetDirectoryName(target);
+ if (!Directory.Exists(dir))
+ {
+ Directory.CreateDirectory(dir);
+ }
+ }
+ }
+
+ private static DateTime RemoveMilliseconds(DateTime t)
+ {
+ return new DateTime(t.Year, t.Month, t.Day, t.Hour, t.Minute, t.Second, 0);
+ }
+
+ // ReSharper disable UnusedMethodReturnValue.Local
+ private static long SaveStream(Stream stream, string path, DateTime touchDate, int streamBufferSize)
+ // ReSharper restore UnusedMethodReturnValue.Local
+ {
+ FilePreparePath(path);
+ FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
+ BinaryReader br = null;
+ BinaryWriter bw = null;
+ long len = 0;
+ try
+ {
+ br = new BinaryReader(stream);
+ bw = new BinaryWriter(fs);
+
+ byte[] buffer;
+ do
+ {
+ buffer = br.ReadBytes(streamBufferSize);
+ len += buffer.Length;
+ if (buffer.Length > 0)
+ {
+ bw.Write(buffer);
+ }
+ } while (buffer.Length > 0);
+ }
+ finally
+ {
+ if (br != null)
+ {
+ br.Close();
+ }
+ if (bw != null)
+ {
+ bw.Flush();
+ bw.Close();
+ }
+ if (fs != null)
+ {
+ fs.Close();
+ }
+ }
+ File.SetLastWriteTime(path, touchDate);
+ return len;
+ }
+
+ private HttpStatusCode Get(Uri uri, string method, string path, HtmlDocument doc, IWebProxy proxy,
+ ICredentials creds)
+ {
+ string cachePath = null;
+ HttpWebRequest req;
+ bool oldFile = false;
+
+ req = WebRequest.Create(uri) as HttpWebRequest;
+ req.Method = method;
+
+ if (proxy != null)
+ {
+ if (creds != null)
+ {
+ proxy.Credentials = creds;
+ req.Credentials = creds;
+ }
+ else
+ {
+ proxy.Credentials = CredentialCache.DefaultCredentials;
+ req.Credentials = CredentialCache.DefaultCredentials;
+ }
+ req.Proxy = proxy;
+ }
+
+ _fromCache = false;
+ _requestDuration = 0;
+ int tc = Environment.TickCount;
+ if (UsingCache)
+ {
+ cachePath = GetCachePath(req.RequestUri);
+ if (File.Exists(cachePath))
+ {
+ req.IfModifiedSince = File.GetLastAccessTime(cachePath);
+ oldFile = true;
+ }
+ }
+
+ if (_cacheOnly)
+ {
+ if (!File.Exists(cachePath))
+ {
+ throw new HtmlWebException("File was not found at cache path: '" + cachePath + "'");
+ }
+
+ if (path != null)
+ {
+ IOLibrary.CopyAlways(cachePath, path);
+ // touch the file
+ File.SetLastWriteTime(path, File.GetLastWriteTime(cachePath));
+ }
+ _fromCache = true;
+ return HttpStatusCode.NotModified;
+ }
+
+ if (_useCookies)
+ {
+ req.CookieContainer = new CookieContainer();
+ }
+
+ if (PreRequest != null)
+ {
+ // allow our user to change the request at will
+ if (!PreRequest(req))
+ {
+ return HttpStatusCode.ResetContent;
+ }
+
+ // dump cookie
+ // if (_useCookies)
+ // {
+ // foreach(Cookie cookie in req.CookieContainer.GetCookies(req.RequestUri))
+ // {
+ // HtmlLibrary.Trace("Cookie " + cookie.Name + "=" + cookie.Value + " path=" + cookie.Path + " domain=" + cookie.Domain);
+ // }
+ // }
+ }
+
+ HttpWebResponse resp;
+
+ try
+ {
+ resp = req.GetResponse() as HttpWebResponse;
+ }
+ catch (WebException we)
+ {
+ _requestDuration = Environment.TickCount - tc;
+ resp = (HttpWebResponse)we.Response;
+ if (resp == null)
+ {
+ if (oldFile)
+ {
+ if (path != null)
+ {
+ IOLibrary.CopyAlways(cachePath, path);
+ // touch the file
+ File.SetLastWriteTime(path, File.GetLastWriteTime(cachePath));
+ }
+ return HttpStatusCode.NotModified;
+ }
+ throw;
+ }
+ }
+ catch (Exception)
+ {
+ _requestDuration = Environment.TickCount - tc;
+ throw;
+ }
+
+ // allow our user to get some info from the response
+ if (PostResponse != null)
+ {
+ PostResponse(req, resp);
+ }
+
+ _requestDuration = Environment.TickCount - tc;
+ _responseUri = resp.ResponseUri;
+
+ bool html = IsHtmlContent(resp.ContentType);
+ Encoding respenc;
+
+ if ((resp.ContentEncoding != null) && (resp.ContentEncoding.Length > 0))
+ {
+ respenc = Encoding.GetEncoding(resp.ContentEncoding);
+ }
+ else
+ {
+ respenc = null;
+ }
+
+ if (resp.StatusCode == HttpStatusCode.NotModified)
+ {
+ if (UsingCache)
+ {
+ _fromCache = true;
+ if (path != null)
+ {
+ IOLibrary.CopyAlways(cachePath, path);
+ // touch the file
+ File.SetLastWriteTime(path, File.GetLastWriteTime(cachePath));
+ }
+ return resp.StatusCode;
+ }
+ else
+ {
+ // this should *never* happen...
+ throw new HtmlWebException("Server has send a NotModifed code, without cache enabled.");
+ }
+ }
+ Stream s = resp.GetResponseStream();
+ if (s != null)
+ {
+ if (UsingCache)
+ {
+ // NOTE: LastModified does not contain milliseconds, so we remove them to the file
+ SaveStream(s, cachePath, RemoveMilliseconds(resp.LastModified), _streamBufferSize);
+
+ // save headers
+ SaveCacheHeaders(req.RequestUri, resp);
+
+ if (path != null)
+ {
+ // copy and touch the file
+ IOLibrary.CopyAlways(cachePath, path);
+ File.SetLastWriteTime(path, File.GetLastWriteTime(cachePath));
+ }
+ }
+ else
+ {
+ // try to work in-memory
+ if ((doc != null) && (html))
+ {
+ if (respenc != null)
+ {
+ doc.Load(s, respenc);
+ }
+ else
+ {
+ doc.Load(s, true);
+ }
+ }
+ }
+ resp.Close();
+ }
+ return resp.StatusCode;
+ }
+
+ private string GetCacheHeader(Uri requestUri, string name, string def)
+ {
+ // note: some headers are collection (ex: www-authenticate)
+ // we don't handle that here
+ XmlDocument doc = new XmlDocument();
+ doc.Load(GetCacheHeadersPath(requestUri));
+ XmlNode node =
+ doc.SelectSingleNode("//h[translate(@n, 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" +
+ name.ToUpper() + "']");
+ if (node == null)
+ {
+ return def;
+ }
+ // attribute should exist
+ return node.Attributes[name].Value;
+ }
+
+ private string GetCacheHeadersPath(Uri uri)
+ {
+ //return Path.Combine(GetCachePath(uri), ".h.xml");
+ return GetCachePath(uri) + ".h.xml";
+ }
+
+ private bool IsCacheHtmlContent(string path)
+ {
+ string ct = GetContentTypeForExtension(Path.GetExtension(path), null);
+ return IsHtmlContent(ct);
+ }
+
+ private bool IsHtmlContent(string contentType)
+ {
+ return contentType.ToLower().StartsWith("text/html");
+ }
+
+ private HtmlDocument LoadUrl(Uri uri, string method, WebProxy proxy, NetworkCredential creds)
+ {
+ HtmlDocument doc = new HtmlDocument();
+ doc.OptionAutoCloseOnEnd = false;
+ doc.OptionFixNestedTags = true;
+ _statusCode = Get(uri, method, null, doc, proxy, creds);
+ if (_statusCode == HttpStatusCode.NotModified)
+ {
+ // read cached encoding
+ doc.DetectEncodingAndLoad(GetCachePath(uri));
+ }
+ return doc;
+ }
+
+ private void SaveCacheHeaders(Uri requestUri, HttpWebResponse resp)
+ {
+ // we cache the original headers aside the cached document.
+ string file = GetCacheHeadersPath(requestUri);
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml("<c></c>");
+ XmlNode cache = doc.FirstChild;
+ foreach (string header in resp.Headers)
+ {
+ XmlNode entry = doc.CreateElement("h");
+ XmlAttribute att = doc.CreateAttribute("n");
+ att.Value = header;
+ entry.Attributes.Append(att);
+
+ att = doc.CreateAttribute("v");
+ att.Value = resp.Headers[header];
+ entry.Attributes.Append(att);
+
+ cache.AppendChild(entry);
+ }
+ doc.Save(file);
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/HtmlWebException.cs b/docs/HtmlAgilityPack/HtmlWebException.cs new file mode 100644 index 00000000000..6896257facc --- /dev/null +++ b/docs/HtmlAgilityPack/HtmlWebException.cs @@ -0,0 +1,24 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an exception thrown by the HtmlWeb utility class.
+ /// </summary>
+ public class HtmlWebException : Exception
+ {
+ #region Constructors
+
+ /// <summary>
+ /// Creates an instance of the HtmlWebException.
+ /// </summary>
+ /// <param name="message">The exception's message.</param>
+ public HtmlWebException(string message)
+ : base(message)
+ {
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/IOLibrary.cs b/docs/HtmlAgilityPack/IOLibrary.cs new file mode 100644 index 00000000000..031040ded9a --- /dev/null +++ b/docs/HtmlAgilityPack/IOLibrary.cs @@ -0,0 +1,28 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System.IO;
+
+namespace HtmlAgilityPack
+{
+ internal struct IOLibrary
+ {
+ #region Internal Methods
+
+ internal static void CopyAlways(string source, string target)
+ {
+ if (!File.Exists(source))
+ return;
+ Directory.CreateDirectory(Path.GetDirectoryName(target));
+ MakeWritable(target);
+ File.Copy(source, target, true);
+ }
+
+ internal static void MakeWritable(string path)
+ {
+ if (!File.Exists(path))
+ return;
+ File.SetAttributes(path, File.GetAttributes(path) & ~FileAttributes.ReadOnly);
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/LICENSE b/docs/HtmlAgilityPack/LICENSE new file mode 100644 index 00000000000..79629b21e3a --- /dev/null +++ b/docs/HtmlAgilityPack/LICENSE @@ -0,0 +1,27 @@ +Microsoft Permissive License (Ms-PL)
+
+ This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.
+
+1. Definitions
+
+ The terms reproduce, reproduction, derivative works, and distribution have the same meaning here as under U.S. copyright law.
+ A contribution is the original software, or any additions or changes to the software.
+ A contributor is any person that distributes its contribution under this license.
+ Licensed patents are a contributors patent claims that read directly on its contribution.
+
+2. Grant of Rights
+
+ (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
+ (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
+
+3. Conditions and Limitations
+
+ (A) No Trademark License- This license does not grant you rights to use any contributors name, logo, or trademarks.
+ (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
+ (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
+ (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
+ (E) The software is licensed as-is. You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
+ (F) If you distribute the software or derivative works with programs you develop, you agree to indemnify, defend, and hold harmless all contributors from any claims, including attorneys fees, related to the distribution or use of your programs. For clarity, you have no such obligations to a contributor for any claims based solely on the unmodified contributions of that contributor.
+ (G) If you make any additions or changes to the original software, you may only distribute them under a new namespace. In addition, you will clearly identify your changes or additions as your own.
+
+
diff --git a/docs/HtmlAgilityPack/MixedCodeDocument.cs b/docs/HtmlAgilityPack/MixedCodeDocument.cs new file mode 100644 index 00000000000..f12ac4521bc --- /dev/null +++ b/docs/HtmlAgilityPack/MixedCodeDocument.cs @@ -0,0 +1,453 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.IO;
+using System.Text;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a document with mixed code and text. ASP, ASPX, JSP, are good example of such documents.
+ /// </summary>
+ public class MixedCodeDocument
+ {
+ #region Fields
+
+ private int _c;
+ internal MixedCodeDocumentFragmentList _codefragments;
+ private MixedCodeDocumentFragment _currentfragment;
+ internal MixedCodeDocumentFragmentList _fragments;
+ private int _index;
+ private int _line;
+ private int _lineposition;
+ private ParseState _state;
+ private Encoding _streamencoding;
+ internal string _text;
+ internal MixedCodeDocumentFragmentList _textfragments;
+
+ /// <summary>
+ /// Gets or sets the token representing code end.
+ /// </summary>
+ public string TokenCodeEnd = "%>";
+
+ /// <summary>
+ /// Gets or sets the token representing code start.
+ /// </summary>
+ public string TokenCodeStart = "<%";
+
+ /// <summary>
+ /// Gets or sets the token representing code directive.
+ /// </summary>
+ public string TokenDirective = "@";
+
+ /// <summary>
+ /// Gets or sets the token representing response write directive.
+ /// </summary>
+ public string TokenResponseWrite = "Response.Write ";
+
+
+ private string TokenTextBlock = "TextBlock({0})";
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Creates a mixed code document instance.
+ /// </summary>
+ public MixedCodeDocument()
+ {
+ _codefragments = new MixedCodeDocumentFragmentList(this);
+ _textfragments = new MixedCodeDocumentFragmentList(this);
+ _fragments = new MixedCodeDocumentFragmentList(this);
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the code represented by the mixed code document seen as a template.
+ /// </summary>
+ public string Code
+ {
+ get
+ {
+ string s = "";
+ int i = 0;
+ foreach (MixedCodeDocumentFragment frag in _fragments)
+ {
+ switch (frag._type)
+ {
+ case MixedCodeDocumentFragmentType.Text:
+ s += TokenResponseWrite + string.Format(TokenTextBlock, i) + "\n";
+ i++;
+ break;
+
+ case MixedCodeDocumentFragmentType.Code:
+ s += ((MixedCodeDocumentCodeFragment) frag).Code + "\n";
+ break;
+ }
+ }
+ return s;
+ }
+ }
+
+ /// <summary>
+ /// Gets the list of code fragments in the document.
+ /// </summary>
+ public MixedCodeDocumentFragmentList CodeFragments
+ {
+ get { return _codefragments; }
+ }
+
+ /// <summary>
+ /// Gets the list of all fragments in the document.
+ /// </summary>
+ public MixedCodeDocumentFragmentList Fragments
+ {
+ get { return _fragments; }
+ }
+
+ /// <summary>
+ /// Gets the encoding of the stream used to read the document.
+ /// </summary>
+ public Encoding StreamEncoding
+ {
+ get { return _streamencoding; }
+ }
+
+ /// <summary>
+ /// Gets the list of text fragments in the document.
+ /// </summary>
+ public MixedCodeDocumentFragmentList TextFragments
+ {
+ get { return _textfragments; }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Create a code fragment instances.
+ /// </summary>
+ /// <returns>The newly created code fragment instance.</returns>
+ public MixedCodeDocumentCodeFragment CreateCodeFragment()
+ {
+ return (MixedCodeDocumentCodeFragment) CreateFragment(MixedCodeDocumentFragmentType.Code);
+ }
+
+ /// <summary>
+ /// Create a text fragment instances.
+ /// </summary>
+ /// <returns>The newly created text fragment instance.</returns>
+ public MixedCodeDocumentTextFragment CreateTextFragment()
+ {
+ return (MixedCodeDocumentTextFragment) CreateFragment(MixedCodeDocumentFragmentType.Text);
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ public void Load(Stream stream)
+ {
+ Load(new StreamReader(stream));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(Stream stream, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(stream, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Load(Stream stream, Encoding encoding)
+ {
+ Load(new StreamReader(stream, encoding));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks, buffersize));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ public void Load(string path)
+ {
+ Load(new StreamReader(path));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(string path, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(path, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Load(string path, Encoding encoding)
+ {
+ Load(new StreamReader(path, encoding));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(path, encoding, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ Load(new StreamReader(path, encoding, detectEncodingFromByteOrderMarks, buffersize));
+ }
+
+ /// <summary>
+ /// Loads the mixed code document from the specified TextReader.
+ /// </summary>
+ /// <param name="reader">The TextReader used to feed the HTML data into the document.</param>
+ public void Load(TextReader reader)
+ {
+ _codefragments.Clear();
+ _textfragments.Clear();
+
+ // all pseudo constructors get down to this one
+ StreamReader sr = reader as StreamReader;
+ if (sr != null)
+ {
+ _streamencoding = sr.CurrentEncoding;
+ }
+
+ _text = reader.ReadToEnd();
+ reader.Close();
+ Parse();
+ }
+
+ /// <summary>
+ /// Loads a mixed document from a text
+ /// </summary>
+ /// <param name="html">The text to load.</param>
+ public void LoadHtml(string html)
+ {
+ Load(new StringReader(html));
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified stream.
+ /// </summary>
+ /// <param name="outStream">The stream to which you want to save.</param>
+ public void Save(Stream outStream)
+ {
+ StreamWriter sw = new StreamWriter(outStream, GetOutEncoding());
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified stream.
+ /// </summary>
+ /// <param name="outStream">The stream to which you want to save.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Save(Stream outStream, Encoding encoding)
+ {
+ StreamWriter sw = new StreamWriter(outStream, encoding);
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified file.
+ /// </summary>
+ /// <param name="filename">The location of the file where you want to save the document.</param>
+ public void Save(string filename)
+ {
+ StreamWriter sw = new StreamWriter(filename, false, GetOutEncoding());
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified file.
+ /// </summary>
+ /// <param name="filename">The location of the file where you want to save the document.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Save(string filename, Encoding encoding)
+ {
+ StreamWriter sw = new StreamWriter(filename, false, encoding);
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified StreamWriter.
+ /// </summary>
+ /// <param name="writer">The StreamWriter to which you want to save.</param>
+ public void Save(StreamWriter writer)
+ {
+ Save((TextWriter) writer);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified TextWriter.
+ /// </summary>
+ /// <param name="writer">The TextWriter to which you want to save.</param>
+ public void Save(TextWriter writer)
+ {
+ writer.Flush();
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal MixedCodeDocumentFragment CreateFragment(MixedCodeDocumentFragmentType type)
+ {
+ switch (type)
+ {
+ case MixedCodeDocumentFragmentType.Text:
+ return new MixedCodeDocumentTextFragment(this);
+
+ case MixedCodeDocumentFragmentType.Code:
+ return new MixedCodeDocumentCodeFragment(this);
+
+ default:
+ throw new NotSupportedException();
+ }
+ }
+
+ internal Encoding GetOutEncoding()
+ {
+ if (_streamencoding != null)
+ return _streamencoding;
+ return Encoding.Default;
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private void IncrementPosition()
+ {
+ _index++;
+ if (_c == 10)
+ {
+ _lineposition = 1;
+ _line++;
+ }
+ else
+ _lineposition++;
+ }
+
+ private void Parse()
+ {
+ _state = ParseState.Text;
+ _index = 0;
+ _currentfragment = CreateFragment(MixedCodeDocumentFragmentType.Text);
+
+ while (_index < _text.Length)
+ {
+ _c = _text[_index];
+ IncrementPosition();
+
+ switch (_state)
+ {
+ case ParseState.Text:
+ if (_index + TokenCodeStart.Length < _text.Length)
+ {
+ if (_text.Substring(_index - 1, TokenCodeStart.Length) == TokenCodeStart)
+ {
+ _state = ParseState.Code;
+ _currentfragment.Length = _index - 1 - _currentfragment.Index;
+ _currentfragment = CreateFragment(MixedCodeDocumentFragmentType.Code);
+ SetPosition();
+ continue;
+ }
+ }
+ break;
+
+ case ParseState.Code:
+ if (_index + TokenCodeEnd.Length < _text.Length)
+ {
+ if (_text.Substring(_index - 1, TokenCodeEnd.Length) == TokenCodeEnd)
+ {
+ _state = ParseState.Text;
+ _currentfragment.Length = _index + TokenCodeEnd.Length - _currentfragment.Index;
+ _index += TokenCodeEnd.Length;
+ _lineposition += TokenCodeEnd.Length;
+ _currentfragment = CreateFragment(MixedCodeDocumentFragmentType.Text);
+ SetPosition();
+ continue;
+ }
+ }
+ break;
+ }
+ }
+
+ _currentfragment.Length = _index - _currentfragment.Index;
+ }
+
+ private void SetPosition()
+ {
+ _currentfragment.Line = _line;
+ _currentfragment._lineposition = _lineposition;
+ _currentfragment.Index = _index - 1;
+ _currentfragment.Length = 0;
+ }
+
+ #endregion
+
+ #region Nested type: ParseState
+
+ private enum ParseState
+ {
+ Text,
+ Code
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentCodeFragment.cs b/docs/HtmlAgilityPack/MixedCodeDocumentCodeFragment.cs new file mode 100644 index 00000000000..f74b2f3268e --- /dev/null +++ b/docs/HtmlAgilityPack/MixedCodeDocumentCodeFragment.cs @@ -0,0 +1,51 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a fragment of code in a mixed code document.
+ /// </summary>
+ public class MixedCodeDocumentCodeFragment : MixedCodeDocumentFragment
+ {
+ #region Fields
+
+ private string _code;
+
+ #endregion
+
+ #region Constructors
+
+ internal MixedCodeDocumentCodeFragment(MixedCodeDocument doc)
+ :
+ base(doc, MixedCodeDocumentFragmentType.Code)
+ {
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the fragment code text.
+ /// </summary>
+ public string Code
+ {
+ get
+ {
+ if (_code == null)
+ {
+ _code = FragmentText.Substring(Doc.TokenCodeStart.Length,
+ FragmentText.Length - Doc.TokenCodeEnd.Length -
+ Doc.TokenCodeStart.Length - 1).Trim();
+ if (_code.StartsWith("="))
+ {
+ _code = Doc.TokenResponseWrite + _code.Substring(1, _code.Length - 1);
+ }
+ }
+ return _code;
+ }
+ set { _code = value; }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentFragment.cs b/docs/HtmlAgilityPack/MixedCodeDocumentFragment.cs new file mode 100644 index 00000000000..cfd268e0795 --- /dev/null +++ b/docs/HtmlAgilityPack/MixedCodeDocumentFragment.cs @@ -0,0 +1,95 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a base class for fragments in a mixed code document.
+ /// </summary>
+ public abstract class MixedCodeDocumentFragment
+ {
+ #region Fields
+
+ internal MixedCodeDocument Doc;
+ private string _fragmentText;
+ internal int Index;
+ internal int Length;
+ private int _line;
+ internal int _lineposition;
+ internal MixedCodeDocumentFragmentType _type;
+
+ #endregion
+
+ #region Constructors
+
+ internal MixedCodeDocumentFragment(MixedCodeDocument doc, MixedCodeDocumentFragmentType type)
+ {
+ Doc = doc;
+ _type = type;
+ switch (type)
+ {
+ case MixedCodeDocumentFragmentType.Text:
+ Doc._textfragments.Append(this);
+ break;
+
+ case MixedCodeDocumentFragmentType.Code:
+ Doc._codefragments.Append(this);
+ break;
+ }
+ Doc._fragments.Append(this);
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the fragement text.
+ /// </summary>
+ public string FragmentText
+ {
+ get
+ {
+ if (_fragmentText == null)
+ {
+ _fragmentText = Doc._text.Substring(Index, Length);
+ }
+ return FragmentText;
+ }
+ internal set { _fragmentText = value; }
+ }
+
+ /// <summary>
+ /// Gets the type of fragment.
+ /// </summary>
+ public MixedCodeDocumentFragmentType FragmentType
+ {
+ get { return _type; }
+ }
+
+ /// <summary>
+ /// Gets the line number of the fragment.
+ /// </summary>
+ public int Line
+ {
+ get { return _line; }
+ internal set { _line = value; }
+ }
+
+ /// <summary>
+ /// Gets the line position (column) of the fragment.
+ /// </summary>
+ public int LinePosition
+ {
+ get { return _lineposition; }
+ }
+
+ /// <summary>
+ /// Gets the fragment position in the document's stream.
+ /// </summary>
+ public int StreamPosition
+ {
+ get { return Index; }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentFragmentList.cs b/docs/HtmlAgilityPack/MixedCodeDocumentFragmentList.cs new file mode 100644 index 00000000000..4a4a41a2f08 --- /dev/null +++ b/docs/HtmlAgilityPack/MixedCodeDocumentFragmentList.cs @@ -0,0 +1,236 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a list of mixed code fragments.
+ /// </summary>
+ public class MixedCodeDocumentFragmentList : IEnumerable
+ {
+ #region Fields
+
+ private MixedCodeDocument _doc;
+ private ArrayList _items = new ArrayList();
+
+ #endregion
+
+ #region Constructors
+
+ internal MixedCodeDocumentFragmentList(MixedCodeDocument doc)
+ {
+ _doc = doc;
+ }
+
+ #endregion
+
+ #region Properties
+
+ ///<summary>
+ /// Gets the Document
+ ///</summary>
+ public MixedCodeDocument Doc
+ {
+ get { return _doc; }
+ }
+
+ /// <summary>
+ /// Gets the number of fragments contained in the list.
+ /// </summary>
+ public int Count
+ {
+ get { return _items.Count; }
+ }
+
+ /// <summary>
+ /// Gets a fragment from the list using its index.
+ /// </summary>
+ public MixedCodeDocumentFragment this[int index]
+ {
+ get { return _items[index] as MixedCodeDocumentFragment; }
+ }
+
+ #endregion
+
+ #region IEnumerable Members
+
+ /// <summary>
+ /// Gets an enumerator that can iterate through the fragment list.
+ /// </summary>
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Appends a fragment to the list of fragments.
+ /// </summary>
+ /// <param name="newFragment">The fragment to append. May not be null.</param>
+ public void Append(MixedCodeDocumentFragment newFragment)
+ {
+ if (newFragment == null)
+ {
+ throw new ArgumentNullException("newFragment");
+ }
+ _items.Add(newFragment);
+ }
+
+ /// <summary>
+ /// Gets an enumerator that can iterate through the fragment list.
+ /// </summary>
+ public MixedCodeDocumentFragmentEnumerator GetEnumerator()
+ {
+ return new MixedCodeDocumentFragmentEnumerator(_items);
+ }
+
+ /// <summary>
+ /// Prepends a fragment to the list of fragments.
+ /// </summary>
+ /// <param name="newFragment">The fragment to append. May not be null.</param>
+ public void Prepend(MixedCodeDocumentFragment newFragment)
+ {
+ if (newFragment == null)
+ {
+ throw new ArgumentNullException("newFragment");
+ }
+ _items.Insert(0, newFragment);
+ }
+
+ /// <summary>
+ /// Remove a fragment from the list of fragments. If this fragment was not in the list, an exception will be raised.
+ /// </summary>
+ /// <param name="fragment">The fragment to remove. May not be null.</param>
+ public void Remove(MixedCodeDocumentFragment fragment)
+ {
+ if (fragment == null)
+ {
+ throw new ArgumentNullException("fragment");
+ }
+ int index = GetFragmentIndex(fragment);
+ if (index == -1)
+ {
+ throw new IndexOutOfRangeException();
+ }
+ RemoveAt(index);
+ }
+
+ /// <summary>
+ /// Remove all fragments from the list.
+ /// </summary>
+ public void RemoveAll()
+ {
+ _items.Clear();
+ }
+
+ /// <summary>
+ /// Remove a fragment from the list of fragments, using its index in the list.
+ /// </summary>
+ /// <param name="index">The index of the fragment to remove.</param>
+ public void RemoveAt(int index)
+ {
+ //MixedCodeDocumentFragment frag = (MixedCodeDocumentFragment) _items[index];
+ _items.RemoveAt(index);
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal void Clear()
+ {
+ _items.Clear();
+ }
+
+ internal int GetFragmentIndex(MixedCodeDocumentFragment fragment)
+ {
+ if (fragment == null)
+ {
+ throw new ArgumentNullException("fragment");
+ }
+ for (int i = 0; i < _items.Count; i++)
+ {
+ if ((_items[i]) == fragment)
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ #endregion
+
+ #region Nested type: MixedCodeDocumentFragmentEnumerator
+
+ /// <summary>
+ /// Represents a fragment enumerator.
+ /// </summary>
+ public class MixedCodeDocumentFragmentEnumerator : IEnumerator
+ {
+ #region Fields
+
+ private int _index;
+ private ArrayList _items;
+
+ #endregion
+
+ #region Constructors
+
+ internal MixedCodeDocumentFragmentEnumerator(ArrayList items)
+ {
+ _items = items;
+ _index = -1;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the current element in the collection.
+ /// </summary>
+ public MixedCodeDocumentFragment Current
+ {
+ get { return (MixedCodeDocumentFragment) (_items[_index]); }
+ }
+
+ #endregion
+
+ #region IEnumerator Members
+
+ /// <summary>
+ /// Gets the current element in the collection.
+ /// </summary>
+ object IEnumerator.Current
+ {
+ get { return (Current); }
+ }
+
+ /// <summary>
+ /// Advances the enumerator to the next element of the collection.
+ /// </summary>
+ /// <returns>true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.</returns>
+ public bool MoveNext()
+ {
+ _index++;
+ return (_index < _items.Count);
+ }
+
+ /// <summary>
+ /// Sets the enumerator to its initial position, which is before the first element in the collection.
+ /// </summary>
+ public void Reset()
+ {
+ _index = -1;
+ }
+
+ #endregion
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentFragmentType.cs b/docs/HtmlAgilityPack/MixedCodeDocumentFragmentType.cs new file mode 100644 index 00000000000..28ca5421f88 --- /dev/null +++ b/docs/HtmlAgilityPack/MixedCodeDocumentFragmentType.cs @@ -0,0 +1,19 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents the type of fragment in a mixed code document.
+ /// </summary>
+ public enum MixedCodeDocumentFragmentType
+ {
+ /// <summary>
+ /// The fragment contains code.
+ /// </summary>
+ Code,
+
+ /// <summary>
+ /// The fragment contains text.
+ /// </summary>
+ Text,
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentTextFragment.cs b/docs/HtmlAgilityPack/MixedCodeDocumentTextFragment.cs new file mode 100644 index 00000000000..8aa3cdd91cc --- /dev/null +++ b/docs/HtmlAgilityPack/MixedCodeDocumentTextFragment.cs @@ -0,0 +1,32 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a fragment of text in a mixed code document.
+ /// </summary>
+ public class MixedCodeDocumentTextFragment : MixedCodeDocumentFragment
+ {
+ #region Constructors
+
+ internal MixedCodeDocumentTextFragment(MixedCodeDocument doc)
+ :
+ base(doc, MixedCodeDocumentFragmentType.Text)
+ {
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the fragment text.
+ /// </summary>
+ public string Text
+ {
+ get { return FragmentText; }
+ set { FragmentText = value; }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/NameValuePair.cs b/docs/HtmlAgilityPack/NameValuePair.cs new file mode 100644 index 00000000000..8b7036363ca --- /dev/null +++ b/docs/HtmlAgilityPack/NameValuePair.cs @@ -0,0 +1,35 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ internal class NameValuePair
+ {
+ #region Fields
+
+ internal readonly string Name;
+ internal string Value;
+
+ #endregion
+
+ #region Constructors
+
+ internal NameValuePair()
+ {
+ }
+
+ internal NameValuePair(string name)
+ :
+ this()
+ {
+ Name = name;
+ }
+
+ internal NameValuePair(string name, string value)
+ :
+ this(name)
+ {
+ Value = value;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/NameValuePairList.cs b/docs/HtmlAgilityPack/NameValuePairList.cs new file mode 100644 index 00000000000..f4776e9c758 --- /dev/null +++ b/docs/HtmlAgilityPack/NameValuePairList.cs @@ -0,0 +1,101 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+
+namespace HtmlAgilityPack
+{
+ internal class NameValuePairList
+ {
+ #region Fields
+
+ internal readonly string Text;
+ private ArrayList _allPairs;
+ private Hashtable _pairsWithName;
+
+ #endregion
+
+ #region Constructors
+
+ internal NameValuePairList() :
+ this(null)
+ {
+ }
+
+ internal NameValuePairList(string text)
+ {
+ Text = text;
+ _allPairs = new ArrayList();
+ _pairsWithName = new Hashtable();
+
+ Parse(text);
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal static string GetNameValuePairsValue(string text, string name)
+ {
+ NameValuePairList l = new NameValuePairList(text);
+ return l.GetNameValuePairValue(name);
+ }
+
+ internal ArrayList GetNameValuePairs(string name)
+ {
+ if (name == null)
+ return _allPairs;
+ return _pairsWithName[name] as ArrayList;
+ }
+
+ internal string GetNameValuePairValue(string name)
+ {
+ if (name == null)
+ throw new ArgumentNullException();
+ ArrayList al = GetNameValuePairs(name);
+ if (al == null)
+ return null;
+
+ // return first item
+ NameValuePair nvp = al[0] as NameValuePair;
+ return nvp != null ? nvp.Value : string.Empty;
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private void Parse(string text)
+ {
+ _allPairs.Clear();
+ _pairsWithName.Clear();
+ if (text == null)
+ return;
+
+ string[] p = text.Split(';');
+ foreach (string pv in p)
+ {
+ if (pv.Length == 0)
+ continue;
+ string[] onep = pv.Split(new char[] {'='}, 2);
+ if (onep.Length==0)
+ continue;
+ NameValuePair nvp = new NameValuePair(onep[0].Trim().ToLower());
+
+ nvp.Value = onep.Length < 2 ? "" : onep[1];
+
+ _allPairs.Add(nvp);
+
+ // index by name
+ ArrayList al = _pairsWithName[nvp.Name] as ArrayList;
+ if (al == null)
+ {
+ al = new ArrayList();
+ _pairsWithName[nvp.Name] = al;
+ }
+ al.Add(nvp);
+ }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/HtmlAgilityPack/crc32.cs b/docs/HtmlAgilityPack/crc32.cs new file mode 100644 index 00000000000..4cc627ba7fd --- /dev/null +++ b/docs/HtmlAgilityPack/crc32.cs @@ -0,0 +1,156 @@ +// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// A utility class to compute CRC32.
+ /// </summary>
+ public class Crc32
+ {
+ #region Fields
+
+ private uint _crc32;
+
+ #endregion
+
+ #region Static Members
+
+ private static uint[] crc_32_tab = // CRC polynomial 0xedb88320
+ {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+ };
+
+ #endregion
+
+ #region Properties
+
+ internal uint CheckSum
+ {
+ get { return _crc32; }
+ set { _crc32 = value; }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Compute a checksum for a given array of bytes.
+ /// </summary>
+ /// <param name="bytes">The array of bytes to compute the checksum for.</param>
+ /// <returns>The computed checksum.</returns>
+ public static uint CRC32Bytes(byte[] bytes)
+ {
+ uint oldcrc32;
+ oldcrc32 = 0xFFFFFFFF;
+ int len = bytes.Length;
+
+ for (int i = 0; len > 0; i++)
+ {
+ --len;
+ oldcrc32 = UPDC32(bytes[len], oldcrc32);
+ }
+ return ~oldcrc32;
+ }
+
+ /// <summary>
+ /// Compute a checksum for a given string.
+ /// </summary>
+ /// <param name="text">The string to compute the checksum for.</param>
+ /// <returns>The computed checksum.</returns>
+ public static uint CRC32String(string text)
+ {
+ uint oldcrc32;
+ oldcrc32 = 0xFFFFFFFF;
+ int len = text.Length;
+ ushort uCharVal;
+ byte lowByte, hiByte;
+
+ for (int i = 0; len > 0; i++)
+ {
+ --len;
+ uCharVal = text[len];
+ unchecked
+ {
+ lowByte = (byte) (uCharVal & 0x00ff);
+ hiByte = (byte) (uCharVal >> 8);
+ }
+ oldcrc32 = UPDC32(hiByte, oldcrc32);
+ oldcrc32 = UPDC32(lowByte, oldcrc32);
+ }
+
+ return ~oldcrc32;
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal uint AddToCRC32(int c)
+ {
+ return AddToCRC32((ushort) c);
+ }
+
+ internal uint AddToCRC32(ushort c)
+ {
+ byte lowByte, hiByte;
+ lowByte = (byte) (c & 0x00ff);
+ hiByte = (byte) (c >> 8);
+ _crc32 = UPDC32(hiByte, _crc32);
+ _crc32 = UPDC32(lowByte, _crc32);
+ return ~_crc32;
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private static uint UPDC32(byte octet, uint crc)
+ {
+ return (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8));
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file diff --git a/docs/Makefile.am b/docs/Makefile.am index 44bed21a9ab..639b7537d26 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -13,7 +13,6 @@ ASSEMBLED_DOCS = \ EXTRA_DIST = \ abc-removal.txt \ - AgilityPack.dll \ api-style.css \ assembly-bundle \ check-exports \ @@ -68,12 +67,14 @@ EXTRA_DIST = \ dist-hook: $(mkdir_p) $(distdir)/sources $(mkdir_p) $(distdir)/svgs + $(mkdir_p) $(distdir)/HtmlAgilityPack cp sources/* $(distdir)/sources cp svgs/* $(distdir)/svgs + cp HtmlAgilityPack/* $(distdir)/HtmlAgilityPack clean-local: -rm -Rf $(srcdir)/html - -rm -f $(srcdir)/deploy/* $(srcdir)/convert.exe* + -rm -f $(srcdir)/deploy/* $(srcdir)/convert.exe* $(srcdir)/AgilityPack.dll* -cd $(srcdir) && rm -f $(ASSEMBLED_DOCS) monoapi.zip: monoapi.tree @@ -101,5 +102,7 @@ $(srcdir)/deploy/.stamp: convert.exe Makefile.am extract: $(srcdir)/deploy/.stamp convert.exe: convert.cs AgilityPack.dll - cd $(srcdir) && $(MAKE) PROFILE=net_1_1 -f docs.make topdir=$(mcs_topdir_from_srcdir) convert.exe + cd $(srcdir) && $(MAKE) PROFILE=net_2_0 -f docs.make topdir=$(mcs_topdir_from_srcdir) convert.exe +AgilityPack.dll: + cd $(srcdir) && $(MAKE) PROFILE=net_2_0 -f docs.make topdir=$(mcs_topdir_from_srcdir) AgilityPack.dll diff --git a/docs/README b/docs/README index 956c1550bf8..862cd45ae0a 100644 --- a/docs/README +++ b/docs/README @@ -64,10 +64,8 @@ PROGRAMS * convert.cs Converts an HTML file into a valid XML document, uses the - AgilityPack.dll. The sources to this DLL live in GNOME CVS - module beagle/Filters/AgilityPack. - - A binary is shipped for our convenience. + AgilityPack.dll. The sources to this DLL live in the + HtmlAgilityPack folder, and are a prerequisite for convert.exe. DATAFILES: --------- diff --git a/docs/docs.make b/docs/docs.make index 50a001f5f29..7129bcadfc4 100644 --- a/docs/docs.make +++ b/docs/docs.make @@ -10,6 +10,9 @@ ASSEMBLED_DOCS = \ convert.exe: convert.cs AgilityPack.dll $(CSCOMPILE) -out:$@ $< -r:AgilityPack.dll +AgilityPack.dll: + $(CSCOMPILE) -target:library -out:$@ HtmlAgilityPack/*.cs + monoapi.zip: monoapi.tree @test -f $@ || { rm -f $< && $(MAKE) $<; } monoapi.tree: toc.xml docs.make diff --git a/mono-core.spec.in b/mono-core.spec.in index ff7d37e18a9..8cbece9051f 100644 --- a/mono-core.spec.in +++ b/mono-core.spec.in @@ -498,6 +498,8 @@ Authors: %_prefix/lib/mono/gac/RabbitMQ.Client %_prefix/lib/mono/1.0/RabbitMQ.Client.dll %_prefix/lib/mono/2.0/RabbitMQ.Client.dll +%_prefix/lib/mono/1.0/RabbitMQ.Client.Apigen.exe* +%_prefix/lib/mono/2.0/RabbitMQ.Client.Apigen.exe* %_prefix/lib/mono/gac/System.Messaging %_prefix/lib/mono/1.0/System.Messaging.dll %_prefix/lib/mono/2.0/System.Messaging.dll diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index d2f843ba728..4c340be491b 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,344 @@ +2010-01-25 Zoltan Varga <vargaz@gmail.com> + + * icall.c (ves_icall_System_Array_SetValueImpl): Handle nullable types correctly. + Fixes #573322. + +2010-01-06 Atsushi Enomoto <atsushi@ximian.com> + + * culture-info-table.h : regenerated. + +2010-01-21 Rodrigo Kumpera <rkumpera@novell.com> + + * reflection.c (typebuilder_setup_fields): Pretend field setup already + happened before starting to encode the actual fields. This avoid ciclic + dependencies and eventual crashes. + + Fixes #572660. + + Backport of r150008. + +2010-01-21 Rodrigo Kumpera <rkumpera@novell.com> + + * metadata-verify.c (parse_generic_inst): Fail a type signature if it + has a recursive reference to itself. + + Fixes #571863. + + Backport of r149969. + +2010-01-20 Gonzalo Paniagua Javier <gonzalo@novell.com> + + * icall.c: don't raise AppDomain.TypeResolve when the type is loaded + from the current assembly or mscorlib. Fixes bug #322957. + +2010-01-19 Sebastien Pouliot <sebastien@ximian.com> + + * security-core-clr.c (mono_security_core_clr_can_access_internals): + Handle the case where 'basedir' can be NULL (e.g. SRE assemblies) + [Backport r149823] + +2010-01-19 Rodrigo Kumpera <rkumpera@novell.com> + + * verify.c (store_local): Better error message. + + Backport of r149845. + +2010-01-19 Rodrigo Kumpera <rkumpera@novell.com> + + * icall.c (ves_icall_MonoMethod_GetGenericMethodDefinition): Handle inflated generic methods + on a GTD. + + Backport of r149808. + +2010-01-18 Rodrigo Kumpera <rkumpera@novell.com> + + * metadata-verify.c (parse_type): Fail a type signature if it has a recursive reference + to itself. + + * metadata-verify.c (mono_verifier_verify_typespec_signature): Change signature to take + the token as parameter. + + * verify-internals.h: Ditto. + + * metadata.c (mono_type_create_from_typespec): Pass token to verifier. + + Fixes #571460. + + Backport of r149776. + +2010-01-18 Rodrigo Kumpera <rkumpera@novell.com> + + * class.c (mono_class_from_typeref): Fail loading of self-referencing typeref tokens. + + Fixes #569579. + + Backport of r149760. + +2010-01-15 Rodrigo Kumpera <rkumpera@novell.com> + + * class.c (mono_class_setup_fields): Guard against unfinished types. This + happens only on 2.6 and not trunk because trunk better deals with unfinished types. + +2010-01-14 Rodrigo Kumpera <rkumpera@novell.com> + + * class.c (mono_type_has_exceptions): Check the generic instance. It can fail + independently of the GTD. + + * class.c (mono_class_setup_fields): Fail if field has negative offset. + + * class.c (mono_class_setup_fields): Fail if valuetype has zero size. Add sizeof(MonoObject) + to the upper limit since instance_size includes this amount. + + * class.c (mono_class_layout_fields): Check if the types of the static fields have failed. + + Fixes #569544. + + Backport of r149575. + +2010-01-12 Rodrigo Kumpera <rkumpera@novell.com> + + * class.c (mono_class_get_implemented_interfaces): Now take a MonoError argument. + + * class.c: + * cominterop.c: + * icall.c: + * object.c: + * class-internals.h: Adjust for new signature of mono_class_get_implemented_interfaces. + + Backport of r149414. + +2010-01-12 Rodrigo Kumpera <rkumpera@novell.com> + + * class.c (mono_class_setup_interfaces): Now take a MonoError argument and + it can fail loading the type. + + * class.c: Add mono_class_inflate_generic_class_checked. + + * class.c: + * verify.c: + * class-internals.h: Adjust for new signature of mono_class_setup_interfaces. + + Backport of r149413. + +2010-01-11 Zoltan Varga <vargaz@gmail.com> + + * socket-io.c (AI_ADDRCONFIG): Applied patch from John Lightsey (jd@cpanel.net). + Fixes build on rh 7.3. + +2009-12-16 Zoltan Varga <vargaz@gmail.com> + + * class.c (mono_bounded_array_class_get): Make these classes PUBLIC. Fixes + #565120. + +2009-12-26 Zoltan Varga <vargaz@gmail.com> + + * monitor.c (ves_icall_System_Threading_Monitor_Monitor_wait): Don't close the + wait handle if the wait is interrupted, since it is still in mon->wait_list, and + we can't remove it from it since we don't hold the lock. + (mon_new): Free the orphaned events here when a mon structure is added to the + freelist. Fixes #561239. Thanks to Mike Rieker <wmrieker@nii.net> for tracking + this down. + +2009-12-26 Zoltan Varga <vargaz@gmail.com> + + * generic-sharing.c (instantiate_other_info): Avoid creating jump trampolines since + they cannot be patched. Partly fixes #564408. + +2010-01-07 Gonzalo Paniagua Javier <gonzalo@novell.com> + + * assembly.c: fix MONO_PATH debug output. + +2010-01-05 Rodrigo Kumpera <rkumpera@novell.com> + + * verify.c (mono_verifier_verify_class): Properly check for broken parent. Ignore + types that are meant to not have a parent. + + Backport of r149053. + +2010-01-05 Sebastien Pouliot <sebastien@ximian.com> + + * pedump.c: Backport earlier fixes from Rodrigo Kumpera since + they are useful for testing ML + +2010-01-04 Sebastien Pouliot <sebastien@ximian.com> + + * verify.c (verify_valuetype_layout_with_target): Fix case + that can lead to infinite recursion. Fix bug #567861 + [Backport r149042] + +2010-01-04 Rodrigo Kumpera <rkumpera@novell.com> + + * class.c (count_virtual_methods): Remove the assert and now + fail properly. + + * class.c (setup_interface_offsets): This can fail now. + + * class.c (mono_class_setup_vtable_general): Check for parent vtable + errors. Check setup_interface_offsets errors. + + * class.c (setup_interface_offsets): Simplify the return error logic + and remove class_init_ok. + + Fixes #560327. + + Backport of r149031. + +2010-01-04 Rodrigo Kumpera <rkumpera@novell.com> + + * class.c (mono_class_init): Do class verification at the beginning. Add + some asserts to avoid tripping into invalid memory. + + * object.c (compute_class_bitmap): Replace a g_assert_not_reached with a + g_error and a decent message. + + * verify.c (mono_verifier_verify_class): Verify for invalid super type. + + Fixes #567548. + + Backport of r149028. + +2010-01-03 Zoltan Varga <vargaz@gmail.com> + + * marshal.c (mono_marshal_get_runtime_invoke): Fix a memory leak. + +2010-01-03 Zoltan Varga <vargaz@gmail.com> + + * locales.c (construct_culture_from_specific_name): Applied patch from + Josรฉ Antonio Sรกnchez Lรกzaro <jasl@darcysoft.es>. Fix a crash if a culture was + not found. Fixes #567900. + +2009-12-31 Sebastien Pouliot <sebastien@ximian.com> + + * loader.c (mono_method_get_signature_full): Remove two asserts. + Return NULL instead so that the verifier can handle both cases + gracefully. Fix bug #564897 + [Backport r148951] + +2009-12-30 Rodrigo Kumpera <rkumpera@novell.com> + + * class.c (mono_class_setup_methods): Use checked version of mono_class_inflate_generic_method_full + so we can properly fail types instead of crashing. + + Fixes #567676. + + Backpor of r148948. + +2009-12-30 Rodrigo Kumpera <rkumpera@novell.com> + + * marshal.c (mono_mb_emit_restore_result): Properly handle generic enums. + + Backport of r148941. + +2009-12-26 Rodrigo Kumpera <rkumpera@novell.com> + + * verify.c (init_stack_with_value_at_exception_boundary): Do stack overflow checking here + as max stack might be zero. + + Fixes #562320. + + Backport of r148911. + +2009-12-26 Rodrigo Kumpera <rkumpera@novell.com> + + Rework all uses of mono_class_setup_methods to accept that it can fail now. + + * class.c (mono_class_setup_methods): This function now can fail the class. Do so for generic + instances if the GTD did. + + * class.c (mono_class_setup_properties): Ditto. + + * class.c (mono_class_setup_events): Ditto. + + * class.c (mono_class_setup_vtable): Fail early if the type is already broken. + + * class.c (mono_class_setup_vtable_general): Add a few more missing broken type checks. Sanitize + error setting. + + * class.c (mono_class_init): Fail if GTD did. + + * cominterop.c: + * generic-sharing.c: + * icall.c: + * loader.c: + * object.c: + * verify.c: Properly handle failure of mono_class_setup_methods. + + Backport of r148905. + +2009-12-26 Rodrigo Kumpera <rkumpera@novell.com> + + * class-internals.c: Add mono_class_inflate_generic_method_full_checked and make + mono_class_inflate_generic_method_full internal. + + * class.c (inflate_generic_context): Now takes a MonoError argument. + + * class.c (mono_class_inflate_generic_method_full): Now calls the _checked and abort on + errors. + + Backport of r148904. + +2009-12-26 Zoltan Varga <vargaz@gmail.com> + + * domain.c (mono_domain_free): Backport part of r143047. Free special static + fields earlier to avoid crashes if the types they refer to are freed. Fixes + #565923. + +2009-12-21 Rodrigo Kumpera <rkumpera@novell.com> + + * loader.c (mono_method_get_signature_full): Check if the returned signature is compatible + with the one from the original method. + + * metadata-verify.c (mono_verifier_is_sig_compatible): New function to verify signature + compatibility. + + * verify-internals.h: Add new function to the internal API. + + Fixes #566295. + + Backport of r148828. + +2009-12-18 Dimitar Dobrev <dpldobrev@yahoo.com> + + * culture-info-tables.h: regenerated it to include the Georgian culture. + +2009-12-18 Zoltan Varga <vargaz@gmail.com> + + * reflection.c (mono_reflection_get_type_internal_dynamic): Use assembly->domain + instead of the current domain, since the two might not match if this is called + from the debugger. + + * metadata-internals.h (MonoDynamicAssembly): Add a 'domain' field to specify the + domain which created this assembly. + +2009-12-17 Rodrigo Kumpera <rkumpera@novell.com> + + * icall.c (ves_icall_Type_GetMethodsByName): Don't pin virtual methods if they are newslot. + A private virtual newslot method is used to implement an interface method without exposing + it to users. When querying for public instance methods, such method would hide a public one + on a parent type. + + Fixes #564379. + + Backport of r148694. + +2009-12-17 Zoltan Varga <vargaz@gmail.com> + + * reflection.c (resolve_object): Fix the encoding of unmanaged calling + conventions. + +2009-12-16 Rodrigo Kumpera <rkumpera@novell.com> + + * reflection.c (mono_type_get_object): Guard against NULL generic param owner. + +2009-12-16 Rodrigo Kumpera <rkumpera@novell.com> + + * reflection.c (mono_type_get_object): If the type is VAR or MVAR check + if the owner class has not been finished before returning reflection_info. + + Fixes #565127. + + Backport of r148575. + 2009-12-16 Zoltan Varga <vargaz@gmail.com> * reflection.c (mono_custom_attrs_from_param): Avoid a crash if a dynamic diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c index 1e7f733b28f..9cc4d6db3cb 100644 --- a/mono/metadata/assembly.c +++ b/mono/metadata/assembly.c @@ -186,6 +186,7 @@ check_path_env (void) if (g_getenv ("MONO_DEBUG") == NULL) return; + splitted = assemblies_path; while (*splitted) { if (**splitted && !g_file_test (*splitted, G_FILE_TEST_IS_DIR)) g_warning ("'%s' in MONO_PATH doesn't exist or has wrong permissions.", *splitted); diff --git a/mono/metadata/class-internals.h b/mono/metadata/class-internals.h index b864eceb8ed..b63fef5501e 100644 --- a/mono/metadata/class-internals.h +++ b/mono/metadata/class-internals.h @@ -847,7 +847,7 @@ MonoMethod* mono_class_get_vtable_entry (MonoClass *class, int offset) MONO_INTERNAL; GPtrArray* -mono_class_get_implemented_interfaces (MonoClass *klass) MONO_INTERNAL; +mono_class_get_implemented_interfaces (MonoClass *klass, MonoError *error) MONO_INTERNAL; int mono_class_get_vtable_size (MonoClass *klass) MONO_INTERNAL; @@ -933,7 +933,10 @@ void mono_method_set_generic_container (MonoMethod *method, MonoGenericContainer* container) MONO_INTERNAL; MonoMethod* -mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context); +mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context) MONO_INTERNAL; + +MonoMethod* +mono_class_inflate_generic_method_full_checked (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context, MonoError *error) MONO_INTERNAL; MonoMethodInflated* mono_method_inflated_lookup (MonoMethodInflated* method, gboolean cache) MONO_INTERNAL; @@ -1244,7 +1247,7 @@ void mono_class_alloc_ext (MonoClass *klass) MONO_INTERNAL; void -mono_class_setup_interfaces (MonoClass *klass) MONO_INTERNAL; +mono_class_setup_interfaces (MonoClass *klass, MonoError *error) MONO_INTERNAL; MonoClassField* mono_class_get_field_from_name_full (MonoClass *klass, const char *name, MonoType *type) MONO_INTERNAL; diff --git a/mono/metadata/class.c b/mono/metadata/class.c index 3bf72c012e3..9bc7f4a28ca 100644 --- a/mono/metadata/class.c +++ b/mono/metadata/class.c @@ -122,9 +122,15 @@ mono_class_from_typeref (MonoImage *image, guint32 type_token) return NULL; } case MONO_RESOLTION_SCOPE_TYPEREF: { - MonoClass *enclosing = mono_class_from_typeref (image, MONO_TOKEN_TYPE_REF | idx); + MonoClass *enclosing; GList *tmp; + if (idx == mono_metadata_token_index (type_token)) { + mono_loader_set_error_bad_image (g_strdup_printf ("Image %s with self-referencing typeref token %08x.", image->name, type_token)); + return NULL; + } + + enclosing = mono_class_from_typeref (image, MONO_TOKEN_TYPE_REF | idx); if (!enclosing) return NULL; @@ -762,6 +768,21 @@ mono_class_inflate_generic_type_no_copy (MonoImage *image, MonoType *type, MonoG return inflated; } +static MonoClass* +mono_class_inflate_generic_class_checked (MonoClass *gklass, MonoGenericContext *context, MonoError *error) +{ + MonoClass *res; + MonoType *inflated; + + inflated = mono_class_inflate_generic_type_checked (&gklass->byval_arg, context, error); + if (!mono_error_ok (error)) + return NULL; + + res = mono_class_from_mono_type (inflated); + mono_metadata_free_type (inflated); + + return res; +} /* * mono_class_inflate_generic_class: * @@ -772,38 +793,39 @@ mono_class_inflate_generic_class (MonoClass *gklass, MonoGenericContext *context { MonoError error; MonoClass *res; - MonoType *inflated; - inflated = mono_class_inflate_generic_type_checked (&gklass->byval_arg, context, &error); + res = mono_class_inflate_generic_class_checked (gklass, context, &error); g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/ - res = mono_class_from_mono_type (inflated); - mono_metadata_free_type (inflated); - return res; } + + static MonoGenericContext -inflate_generic_context (MonoGenericContext *context, MonoGenericContext *inflate_with) +inflate_generic_context (MonoGenericContext *context, MonoGenericContext *inflate_with, MonoError *error) { - MonoError error; MonoGenericInst *class_inst = NULL; MonoGenericInst *method_inst = NULL; - MonoGenericContext res; + MonoGenericContext res = { NULL, NULL }; + + mono_error_init (error); if (context->class_inst) { - class_inst = mono_metadata_inflate_generic_inst (context->class_inst, inflate_with, &error); - g_assert (mono_error_ok (&error)); /*FIXME do proper error handling*/ + class_inst = mono_metadata_inflate_generic_inst (context->class_inst, inflate_with, error); + if (!mono_error_ok (error)) + goto fail; } if (context->method_inst) { - method_inst = mono_metadata_inflate_generic_inst (context->method_inst, inflate_with, &error); - g_assert (mono_error_ok (&error)); /*FIXME do proper error handling*/ + method_inst = mono_metadata_inflate_generic_inst (context->method_inst, inflate_with, error); + if (!mono_error_ok (error)) + goto fail; } res.class_inst = class_inst; res.method_inst = method_inst; - +fail: return res; } @@ -832,18 +854,38 @@ mono_class_inflate_generic_method (MonoMethod *method, MonoGenericContext *conte MonoMethod* mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context) { + MonoError error; + MonoMethod *res = mono_class_inflate_generic_method_full_checked (method, klass_hint, context, &error); + if (!mono_error_ok (&error)) + /*FIXME do proper error handling - on this case, kill this function. */ + g_error ("Could not inflate generic method due to %s", mono_error_get_message (&error)); + + return res; +} + +/** + * mono_class_inflate_generic_method_full_checked: + * Same as mono_class_inflate_generic_method_full but return failure using @error. + */ +MonoMethod* +mono_class_inflate_generic_method_full_checked (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context, MonoError *error) +{ MonoMethod *result; MonoMethodInflated *iresult, *cached; MonoMethodSignature *sig; MonoGenericContext tmp_context; gboolean is_mb_open = FALSE; + mono_error_init (error); + /* The `method' has already been instantiated before => we need to peel out the instantiation and create a new context */ while (method->is_inflated) { MonoGenericContext *method_context = mono_method_get_context (method); MonoMethodInflated *imethod = (MonoMethodInflated *) method; - tmp_context = inflate_generic_context (method_context, context); + tmp_context = inflate_generic_context (method_context, context, error); + if (!mono_error_ok (error)) + return NULL; context = &tmp_context; if (mono_metadata_generic_context_equal (method_context, context)) @@ -918,6 +960,13 @@ mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hin inflated_methods_size += sizeof (MonoMethodInflated); sig = mono_method_signature (method); + if (!sig) { + char *name = mono_type_get_full_name (method->klass); + mono_error_set_bad_image (error, method->klass->image, "Could not resolve signature of method %s:%s", name, method->name); + g_free (name); + goto fail; + } + if (sig->pinvoke) { memcpy (&iresult->method.pinvoke, method, sizeof (MonoMethodPInvoke)); } else { @@ -950,10 +999,9 @@ mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hin result->klass = klass_hint; if (!result->klass) { - MonoError error; - MonoType *inflated = inflate_generic_type (NULL, &method->klass->byval_arg, context, &error); - - g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/ + MonoType *inflated = inflate_generic_type (NULL, &method->klass->byval_arg, context, error); + if (!mono_error_ok (error)) + goto fail; result->klass = inflated ? mono_class_from_mono_type (inflated) : method->klass; if (inflated) @@ -963,6 +1011,11 @@ mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hin mono_method_inflated_lookup (iresult, TRUE); mono_loader_unlock (); return result; + +fail: + mono_loader_unlock (); + g_free (iresult); + return NULL; } /** @@ -1117,7 +1170,6 @@ mono_class_find_enum_basetype (MonoClass *class) /* * Checks for MonoClass::exception_type without resolving all MonoType's into MonoClass'es - * It doesn't resolve generic instances, only check the GTD. */ static gboolean mono_type_has_exceptions (MonoType *type) @@ -1130,11 +1182,42 @@ mono_type_has_exceptions (MonoType *type) case MONO_TYPE_ARRAY: return type->data.array->eklass->exception_type; case MONO_TYPE_GENERICINST: - return type->data.generic_class->container_class->exception_type; + return mono_generic_class_get_class (type->data.generic_class)->exception_type; } return FALSE; } +static gboolean +mono_class_is_broken_valuetype (MonoClass *class) +{ + if (!class->valuetype) + return FALSE; + if (class->instance_size > (int)(0x100000 + sizeof (MonoObject))) + return TRUE; + if (class->instance_size > 0) + return FALSE; + + /*We must ignore SRE unfinished types since they can have invalid sizes*/ + if (class->image->dynamic && !class->wastypebuilder) + return FALSE; + + if (class->generic_class && class->generic_class->container_class->image->dynamic && !class->generic_class->container_class->wastypebuilder) + return FALSE; + + if (class->generic_class) { + int i; + MonoGenericInst *ginst = class->generic_class->context.class_inst; + for (i = 0; i < ginst->type_argc; ++i) { + MonoClass *arg = mono_class_from_mono_type (ginst->type_argv [i]); + if (arg->image->dynamic && !arg->wastypebuilder) + return FALSE; + if (arg->generic_class && arg->generic_class->container_class->image->dynamic && !arg->generic_class->container_class->wastypebuilder) + return FALSE; + } + } + return TRUE; +} + /** * mono_class_setup_fields: * @class: The class to initialize @@ -1292,9 +1375,15 @@ mono_class_setup_fields (MonoClass *class) guint32 offset; mono_metadata_field_info (m, idx, &offset, NULL, NULL); field->offset = offset; - if (field->offset == (guint32)-1 && !(field->type->attrs & FIELD_ATTRIBUTE_STATIC)) - g_warning ("%s not initialized correctly (missing field layout info for %s)", - class->name, mono_field_get_name (field)); + + if (field->offset == (guint32)-1 && !(field->type->attrs & FIELD_ATTRIBUTE_STATIC)) { + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Missing field layout info for %s", field->name)); + break; + } + if (field->offset < -1) { /*-1 is used to encode special static fields */ + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Invalid negative field offset %d for %s", field->offset, field->name)); + break; + } } } @@ -1351,8 +1440,8 @@ mono_class_setup_fields (MonoClass *class) return; mono_class_layout_fields (class); - /*valuetypes can't be bigger than 1Mb.*/ - if (class->valuetype && class->instance_size > 0x100000) + /*valuetypes can't be neither bigger than 1Mb or empty. */ + if (mono_class_is_broken_valuetype (class)) mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL); } @@ -1658,6 +1747,11 @@ mono_class_layout_fields (MonoClass *class) if (mono_field_is_deleted (field)) continue; + if (mono_type_has_exceptions (field->type)) { + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL); + break; + } + size = mono_type_size (field->type, &align); field->offset = class->sizes.class_size; field->offset += align - 1; @@ -1696,6 +1790,8 @@ create_array_method (MonoClass *class, const char *name, MonoMethodSignature *si * of long-living MonoMethod structures. * Methods belonging to an interface are assigned a sequential slot starting * from 0. + * + * On failure this function sets class->exception_type */ void mono_class_setup_methods (MonoClass *class) @@ -1714,20 +1810,38 @@ mono_class_setup_methods (MonoClass *class) } if (class->generic_class) { + MonoError error; MonoClass *gklass = class->generic_class->container_class; mono_class_init (gklass); - mono_class_setup_methods (gklass); + if (!gklass->exception_type) + mono_class_setup_methods (gklass); + if (gklass->exception_type) { + /*FIXME make exception_data less opaque so it's possible to dup it here*/ + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Generic type definition failed to load")); + mono_loader_unlock (); + return; + } /* The + 1 makes this always non-NULL to pass the check in mono_class_setup_methods () */ class->method.count = gklass->method.count; methods = g_new0 (MonoMethod *, class->method.count + 1); for (i = 0; i < class->method.count; i++) { - methods [i] = mono_class_inflate_generic_method_full ( - gklass->methods [i], class, mono_class_get_context (class)); + methods [i] = mono_class_inflate_generic_method_full_checked ( + gklass->methods [i], class, mono_class_get_context (class), &error); + if (!mono_error_ok (&error)) { + char *method = mono_method_full_name (gklass->methods [i], TRUE); + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Could not inflate method %s due to %s", method, mono_error_get_message (&error))); + + g_free (method); + mono_error_cleanup (&error); + mono_loader_unlock (); + return; + } } } else if (class->rank) { + MonoError error; MonoMethod *amethod; MonoMethodSignature *sig; int count_generic = 0, first_generic = 0; @@ -1735,7 +1849,8 @@ mono_class_setup_methods (MonoClass *class) class->method.count = 3 + (class->rank > 1? 2: 1); - mono_class_setup_interfaces (class); + mono_class_setup_interfaces (class, &error); + g_assert (mono_error_ok (&error)); /*FIXME can this fail for array types?*/ if (class->interface_count) { count_generic = generic_array_methods (class); @@ -1853,6 +1968,7 @@ mono_class_get_method_by_index (MonoClass *class, int index) return m; } else { mono_class_setup_methods (class); + g_assert (!class->exception_type); /*FIXME do proper error handling*/ g_assert (index >= 0 && index < class->method.count); return class->methods [index]; } @@ -1870,7 +1986,11 @@ mono_class_get_inflated_method (MonoClass *class, MonoMethod *method) MonoClass *gklass = class->generic_class->container_class; int i; + g_assert (method->klass == gklass); + mono_class_setup_methods (gklass); + g_assert (!gklass->exception_type); /*FIXME do proper error handling*/ + for (i = 0; i < gklass->method.count; ++i) { if (gklass->methods [i] == method) { if (class->methods) @@ -1931,6 +2051,7 @@ mono_class_get_vtable_size (MonoClass *klass) return klass->vtable_size; } +/*This method can fail the class.*/ static void mono_class_setup_properties (MonoClass *class) { @@ -1957,6 +2078,11 @@ mono_class_setup_properties (MonoClass *class) mono_class_init (gklass); mono_class_setup_properties (gklass); + if (gklass->exception_type) { + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Generic type definition failed to load")); + mono_loader_unlock (); + return; + } class->ext->property = gklass->ext->property; @@ -1977,18 +2103,25 @@ mono_class_setup_properties (MonoClass *class) prop->parent = class; } } else { - class->ext->property.first = mono_metadata_properties_from_typedef (class->image, mono_metadata_token_index (class->type_token) - 1, &last); - class->ext->property.count = last - class->ext->property.first; + int first = mono_metadata_properties_from_typedef (class->image, mono_metadata_token_index (class->type_token) - 1, &last); + int count = last - first; - if (class->ext->property.count) + if (count) { mono_class_setup_methods (class); + if (class->exception_type) { + mono_loader_unlock (); + return; + } + } - properties = mono_image_alloc0 (class->image, sizeof (MonoProperty) * class->ext->property.count); - for (i = class->ext->property.first; i < last; ++i) { + class->ext->property.first = first; + class->ext->property.count = count; + properties = mono_image_alloc0 (class->image, sizeof (MonoProperty) * count); + for (i = first; i < last; ++i) { mono_metadata_decode_table_row (class->image, MONO_TABLE_PROPERTY, i, cols, MONO_PROPERTY_SIZE); - properties [i - class->ext->property.first].parent = class; - properties [i - class->ext->property.first].attrs = cols [MONO_PROPERTY_FLAGS]; - properties [i - class->ext->property.first].name = mono_metadata_string_heap (class->image, cols [MONO_PROPERTY_NAME]); + properties [i - first].parent = class; + properties [i - first].attrs = cols [MONO_PROPERTY_FLAGS]; + properties [i - first].name = mono_metadata_string_heap (class->image, cols [MONO_PROPERTY_NAME]); startm = mono_metadata_methods_from_property (class->image, i, &endm); for (j = startm; j < endm; ++j) { @@ -2004,10 +2137,10 @@ mono_class_setup_properties (MonoClass *class) switch (cols [MONO_METHOD_SEMA_SEMANTICS]) { case METHOD_SEMANTIC_SETTER: - properties [i - class->ext->property.first].set = method; + properties [i - first].set = method; break; case METHOD_SEMANTIC_GETTER: - properties [i - class->ext->property.first].get = method; + properties [i - first].get = method; break; default: break; @@ -2041,9 +2174,11 @@ inflate_method_listz (MonoMethod **methods, MonoClass *class, MonoGenericContext return retval; } +/*This method can fail the class.*/ static void mono_class_setup_events (MonoClass *class) { + int first, count; guint startm, endm, i, j; guint32 cols [MONO_EVENT_SIZE]; MonoTableInfo *msemt = &class->image->tables [MONO_TABLE_METHODSEMANTICS]; @@ -2067,8 +2202,13 @@ mono_class_setup_events (MonoClass *class) MonoGenericContext *context; mono_class_setup_events (gklass); - class->ext->event = gklass->ext->event; + if (gklass->exception_type) { + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Generic type definition failed to load")); + mono_loader_unlock (); + return; + } + class->ext->event = gklass->ext->event; class->ext->events = g_new0 (MonoEvent, class->ext->event.count); if (class->ext->event.count) @@ -2091,15 +2231,22 @@ mono_class_setup_events (MonoClass *class) return; } - class->ext->event.first = mono_metadata_events_from_typedef (class->image, mono_metadata_token_index (class->type_token) - 1, &last); - class->ext->event.count = last - class->ext->event.first; + first = mono_metadata_events_from_typedef (class->image, mono_metadata_token_index (class->type_token) - 1, &last); + count = last - first; - if (class->ext->event.count) + if (count) { mono_class_setup_methods (class); - + if (class->exception_type) { + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Generic type definition failed to load")); + mono_loader_unlock (); + return; + } + } + class->ext->event.first = first; + class->ext->event.count = count; events = mono_image_alloc0 (class->image, sizeof (MonoEvent) * class->ext->event.count); - for (i = class->ext->event.first; i < last; ++i) { - MonoEvent *event = &events [i - class->ext->event.first]; + for (i = first; i < last; ++i) { + MonoEvent *event = &events [i - first]; mono_metadata_decode_table_row (class->image, MONO_TABLE_EVENT, i, cols, MONO_EVENT_SIZE); event->parent = class; @@ -2238,13 +2385,15 @@ mono_get_unique_iid (MonoClass *class) } static void -collect_implemented_interfaces_aux (MonoClass *klass, GPtrArray **res) +collect_implemented_interfaces_aux (MonoClass *klass, GPtrArray **res, MonoError *error) { int i; MonoClass *ic; - mono_class_setup_interfaces (klass); - + mono_class_setup_interfaces (klass, error); + if (!mono_error_ok (error)) + return; + for (i = 0; i < klass->interface_count; i++) { ic = klass->interfaces [i]; @@ -2253,16 +2402,23 @@ collect_implemented_interfaces_aux (MonoClass *klass, GPtrArray **res) g_ptr_array_add (*res, ic); mono_class_init (ic); - collect_implemented_interfaces_aux (ic, res); + collect_implemented_interfaces_aux (ic, res, error); + if (!mono_error_ok (error)) + return; } } GPtrArray* -mono_class_get_implemented_interfaces (MonoClass *klass) +mono_class_get_implemented_interfaces (MonoClass *klass, MonoError *error) { GPtrArray *res = NULL; - collect_implemented_interfaces_aux (klass, &res); + collect_implemented_interfaces_aux (klass, &res, error); + if (!mono_error_ok (error)) { + if (res) + g_ptr_array_free (res, TRUE); + return NULL; + } return res; } @@ -2291,6 +2447,7 @@ mono_class_interface_offset (MonoClass *klass, MonoClass *itf) { static void print_implemented_interfaces (MonoClass *klass) { + MonoError error; GPtrArray *ifaces = NULL; int i; int ancestor_level = 0; @@ -2316,8 +2473,11 @@ print_implemented_interfaces (MonoClass *klass) { printf ("\n"); while (klass != NULL) { printf ("[LEVEL %d] Implemented interfaces by class %s:\n", ancestor_level, klass->name); - ifaces = mono_class_get_implemented_interfaces (klass); - if (ifaces) { + ifaces = mono_class_get_implemented_interfaces (klass, &error); + if (!mono_error_ok (&error)) { + printf (" Type failed due to %s\n", mono_error_get_message (&error)); + mono_error_cleanup (&error); + } else if (ifaces) { for (i = 0; i < ifaces->len; i++) { MonoClass *ic = g_ptr_array_index (ifaces, i); printf (" [UIID %d] interface %s\n", ic->interface_id, ic->name); @@ -2586,6 +2746,7 @@ find_array_interface (MonoClass *klass, const char *name) /* * Return the number of virtual methods. * Even for interfaces we can't simply return the number of methods as all CLR types are allowed to have static methods. + * Return -1 on failure. * FIXME It would be nice if this information could be cached somewhere. */ static int @@ -2597,6 +2758,8 @@ count_virtual_methods (MonoClass *class) if (class->methods || !MONO_CLASS_HAS_STATIC_METADATA (class)) { mono_class_setup_methods (class); + if (class->exception_type) + return -1; for (i = 0; i < class->method.count; ++i) { flags = class->methods [i]->flags; @@ -2616,17 +2779,19 @@ count_virtual_methods (MonoClass *class) /* * LOCKING: this is supposed to be called with the loader lock held. + * Return -1 on failure and set exception_type */ static int setup_interface_offsets (MonoClass *class, int cur_slot) { + MonoError error; MonoClass *k, *ic; int i, max_iid; - MonoClass **interfaces_full; - int *interface_offsets_full; + MonoClass **interfaces_full = NULL; + int *interface_offsets_full = NULL; GPtrArray *ifaces; int interface_offsets_count; - MonoClass **array_interfaces; + MonoClass **array_interfaces = NULL; int num_array_interfaces; int is_enumerator = FALSE; @@ -2649,7 +2814,14 @@ setup_interface_offsets (MonoClass *class, int cur_slot) if (max_iid < ic->interface_id) max_iid = ic->interface_id; } - ifaces = mono_class_get_implemented_interfaces (k); + ifaces = mono_class_get_implemented_interfaces (k, &error); + if (!mono_error_ok (&error)) { + char *name = mono_type_get_full_name (k); + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Error getting the interfaces of %s due to %s", name, mono_error_get_message (&error))); + g_free (name); + mono_error_cleanup (&error); + goto fail; + } if (ifaces) { for (i = 0; i < ifaces->len; ++i) { ic = g_ptr_array_index (ifaces, i); @@ -2681,7 +2853,9 @@ setup_interface_offsets (MonoClass *class, int cur_slot) } for (k = class->parent; k ; k = k->parent) { - ifaces = mono_class_get_implemented_interfaces (k); + ifaces = mono_class_get_implemented_interfaces (k, &error); + g_assert (mono_error_ok (&error));/*FIXME we perform the same thing above, so not failing there but here is VERY wrong.*/ + if (ifaces) { for (i = 0; i < ifaces->len; ++i) { int io; @@ -2698,15 +2872,29 @@ setup_interface_offsets (MonoClass *class, int cur_slot) } - ifaces = mono_class_get_implemented_interfaces (class); - if (ifaces) { + ifaces = mono_class_get_implemented_interfaces (class, &error); + if (!mono_error_ok (&error)) { + char *name = mono_type_get_full_name (class); + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Error getting the interfaces of %s due to %s", name, mono_error_get_message (&error))); + g_free (name); + mono_error_cleanup (&error); + goto fail; + } else if (ifaces) { for (i = 0; i < ifaces->len; ++i) { + int count; ic = g_ptr_array_index (ifaces, i); if (interfaces_full [ic->interface_id] != NULL) continue; interfaces_full [ic->interface_id] = ic; interface_offsets_full [ic->interface_id] = cur_slot; - cur_slot += count_virtual_methods (ic); + count = count_virtual_methods (ic); + if (count == -1) { + char *name = mono_type_get_full_name (ic); + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Error calculating interface offset of %s", name)); + g_free (name); + goto fail; + } + cur_slot += count; } g_ptr_array_free (ifaces, TRUE); } @@ -2792,6 +2980,11 @@ setup_interface_offsets (MonoClass *class, int cur_slot) //print_implemented_interfaces (class); return cur_slot; +fail: + g_free (interfaces_full); + g_free (interface_offsets_full); + g_free (array_interfaces); + return -1; } /* @@ -2802,6 +2995,8 @@ setup_interface_offsets (MonoClass *class, int cur_slot) * - class->interfaces_packed * - class->interface_offsets_packed * - class->interface_bitmap + * + * This function can fail @class. */ void mono_class_setup_interface_offsets (MonoClass *class) @@ -2848,6 +3043,9 @@ mono_class_setup_vtable (MonoClass *class) return; } + if (class->exception_type) + return; + mono_loader_lock (); if (class->vtable) { @@ -3214,6 +3412,12 @@ print_unimplemented_interface_method_info (MonoClass *class, MonoClass *ic, Mono g_free (method_signature); g_free (type_name); mono_class_setup_methods (class); + if (class->exception_type) { + char *name = mono_type_get_full_name (class); + printf ("CLASS %s failed to resolve methods\n", name); + g_free (name); + return; + } for (index = 0; index < class->method.count; ++index) { MonoMethod *cm = class->methods [index]; method_signature = mono_signature_get_desc (mono_method_signature (cm), TRUE); @@ -3266,6 +3470,7 @@ verify_class_overrides (MonoClass *class, MonoMethod **overrides, int onum) void mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int onum) { + MonoError error; MonoClass *k, *ic; MonoMethod **vtable; int i, max_vtsize = 0, max_iid, cur_slot = 0; @@ -3277,7 +3482,7 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o #if (DEBUG_INTERFACE_VTABLE_CODE|TRACE_INTERFACE_VTABLE_CODE) int first_non_interface_slot; #endif - GSList *virt_methods, *l; + GSList *virt_methods = NULL, *l; if (class->vtable) return; @@ -3285,9 +3490,14 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o if (overrides && !verify_class_overrides (class, overrides, onum)) return; - ifaces = mono_class_get_implemented_interfaces (class); - - if (ifaces) { + ifaces = mono_class_get_implemented_interfaces (class, &error); + if (!mono_error_ok (&error)) { + char *name = mono_type_get_full_name (class); + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Could not resolve %s interfaces due to %s", name, mono_error_get_message (&error))); + g_free (name); + mono_error_cleanup (&error); + return; + } else if (ifaces) { for (i = 0; i < ifaces->len; i++) { MonoClass *ic = g_ptr_array_index (ifaces, i); max_vtsize += ic->method.count; @@ -3299,6 +3509,14 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o if (class->parent) { mono_class_init (class->parent); mono_class_setup_vtable (class->parent); + + if (class->parent->exception_type) { + char *name = mono_type_get_full_name (class->parent); + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Parent %s failed to load", name)); + g_free (name); + return; + } + max_vtsize += class->parent->vtable_size; cur_slot = class->parent->vtable_size; } @@ -3311,6 +3529,9 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o /* printf ("METAINIT %s.%s\n", class->name_space, class->name); */ cur_slot = setup_interface_offsets (class, cur_slot); + if (cur_slot == -1) /*setup_interface_offsets fails the type.*/ + return; + max_iid = class->max_interface_id; DEBUG_INTERFACE_VTABLE (first_non_interface_slot = cur_slot); @@ -3366,9 +3587,9 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o int parent_interface_offset = mono_class_interface_offset (parent, parent_interface); int j; - mono_class_setup_methods (parent_interface); + mono_class_setup_methods (parent_interface); /*FIXME Just kill this whole chunk of dead code*/ TRACE_INTERFACE_VTABLE (printf (" +++ Inheriting interface %s.%s\n", parent_interface->name_space, parent_interface->name)); - for (j = 0; j < parent_interface->method.count; j++) { + for (j = 0; j < parent_interface->method.count && !class->exception_type; j++) { vtable [interface_offset + j] = parent->vtable [parent_interface_offset + j]; TRACE_INTERFACE_VTABLE (printf (" --- Inheriting: [%03d][(%03d)+(%03d)] => [%03d][(%03d)+(%03d)]\n", parent_interface_offset + j, parent_interface_offset, j, @@ -3419,6 +3640,8 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o while ((cm = mono_class_get_virtual_methods (class, &iter))) { virt_methods = g_slist_prepend (virt_methods, cm); } + if (class->exception_type) + goto fail; } // Loop on all implemented interfaces... @@ -3432,6 +3655,8 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o ic_offset = mono_class_interface_offset (class, ic); mono_class_setup_methods (ic); + if (ic->exception_type) + goto fail; // Check if this interface is explicitly implemented (instead of just inherited) if (parent != NULL) { @@ -3478,7 +3703,7 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o } TRACE_INTERFACE_VTABLE (printf ("\n")); if (class->exception_type) /*Might be set by check_interface_method_override*/ - return; + goto fail; } // If the slot is still empty, look in all the inherited virtual methods... @@ -3499,7 +3724,7 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o break; } if (class->exception_type) /*Might be set by check_interface_method_override*/ - return; + goto fail; TRACE_INTERFACE_VTABLE ((cm != NULL) && printf ("\n")); } } @@ -3533,10 +3758,7 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o im_slot, ic->name_space, ic->name, im->name, (vtable [im_slot] == NULL))); if (vtable [im_slot] == NULL) { print_unimplemented_interface_method_info (class, ic, im, im_slot, overrides, onum); - mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL); - if (override_map) - g_hash_table_destroy (override_map); - return; + goto fail; } } } @@ -3580,10 +3802,8 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o mono_security_core_clr_check_override (class, cm, m1); slot = mono_method_get_vtable_slot (m1); - if (slot == -1) { - mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL); - return; - } + if (slot == -1) + goto fail; g_assert (cm->slot < max_vtsize); if (!override_map) @@ -3592,6 +3812,9 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o break; } } + if (k->exception_type) + goto fail; + if (slot >= 0) break; } @@ -3639,9 +3862,11 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o } g_hash_table_destroy (override_map); + override_map = NULL; } g_slist_free (virt_methods); + virt_methods = NULL; /* Ensure that all vtable slots are filled with concrete instance methods */ if (!(class->flags & TYPE_ATTRIBUTE_ABSTRACT)) { @@ -3728,6 +3953,18 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o } VERIFY_INTERFACE_VTABLE (mono_class_verify_vtable (class)); + return; + +fail: + { + char *name = mono_type_get_full_name (class); + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("VTable setup of type %s failed", name)); + g_free (name); + if (override_map) + g_hash_table_destroy (override_map); + if (virt_methods) + g_slist_free (virt_methods); + } } /* @@ -3816,7 +4053,8 @@ generic_array_methods (MonoClass *class) GList *list = NULL, *tmp; if (generic_array_method_num) return generic_array_method_num; - mono_class_setup_methods (class->parent); + mono_class_setup_methods (class->parent); /*This is setting up System.Array*/ + g_assert (!class->parent->exception_type); /*So hitting this assert is a huge problem*/ for (i = 0; i < class->parent->method.count; i++) { MonoMethod *m = class->parent->methods [i]; if (!strncmp (m->name, "InternalArray__", 15)) { @@ -3960,7 +4198,6 @@ mono_class_init (MonoClass *class) int i; MonoCachedClassInfo cached_info; gboolean has_cached_info; - int class_init_ok = TRUE; g_assert (class); @@ -3987,13 +4224,19 @@ mono_class_init (MonoClass *class) class->init_pending = 1; + if (mono_verifier_is_enabled_for_class (class) && !mono_verifier_verify_class (class)) { + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, concat_two_strings_with_zero (class->image, class->name, class->image->assembly_name)); + goto leave; + } + + if (class->byval_arg.type == MONO_TYPE_ARRAY || class->byval_arg.type == MONO_TYPE_SZARRAY) { MonoClass *element_class = class->element_class; if (!element_class->inited) mono_class_init (element_class); if (element_class->exception_type != MONO_EXCEPTION_NONE) { mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL); - goto fail; + goto leave; } } @@ -4017,7 +4260,12 @@ mono_class_init (MonoClass *class) mono_class_init (gklass); // FIXME: Why is this needed ? - mono_class_setup_methods (gklass); + if (!gklass->exception_type) + mono_class_setup_methods (gklass); + if (gklass->exception_type) { + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Generic Type Defintion failed to init")); + goto leave; + } if (MONO_CLASS_IS_INTERFACE (class)) class->interface_id = mono_get_unique_iid (class); @@ -4047,10 +4295,8 @@ mono_class_init (MonoClass *class) else if (!class->size_inited){ mono_class_setup_fields (class); - if (class->exception_type || mono_loader_get_last_error ()){ - class_init_ok = FALSE; + if (class->exception_type || mono_loader_get_last_error ()) goto leave; - } } /* Initialize arrays */ @@ -4100,7 +4346,7 @@ mono_class_init (MonoClass *class) mono_class_setup_vtable (gklass); if (gklass->exception_type) { mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL); - goto fail; + goto leave; } class->vtable_size = gklass->vtable_size; @@ -4132,7 +4378,7 @@ mono_class_init (MonoClass *class) /* FIXME: Optimize this */ mono_class_setup_vtable (class); if (class->exception_type || mono_loader_get_last_error ()) - goto fail; + goto leave; cmethod = class->vtable [finalize_slot]; } @@ -4140,11 +4386,14 @@ mono_class_init (MonoClass *class) /* Check that this is really the finalizer method */ mono_class_setup_vtable (class); if (class->exception_type || mono_loader_get_last_error ()) - goto fail; + goto leave; + + g_assert (class->vtable_size > finalize_slot); class->has_finalize = 0; if (class->parent) { cmethod = class->vtable [finalize_slot]; + g_assert (cmethod); if (cmethod->is_inflated) cmethod = ((MonoMethodInflated*)cmethod)->declaring; if (cmethod != default_finalize) { @@ -4166,6 +4415,8 @@ mono_class_init (MonoClass *class) class->has_cctor = 1; } else { mono_class_setup_methods (class); + if (class->exception_type) + goto leave; for (i = 0; i < class->method.count; ++i) { MonoMethod *method = class->methods [i]; @@ -4191,19 +4442,19 @@ mono_class_init (MonoClass *class) mono_class_init (class->parent); if (class->parent->exception_type) { mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL); - goto fail; + goto leave; } if (mono_loader_get_last_error ()) - goto fail; + goto leave; if (!class->parent->vtable_size) { /* FIXME: Get rid of this somehow */ mono_class_setup_vtable (class->parent); if (class->parent->exception_type) { mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL); - goto fail; + goto leave; } if (mono_loader_get_last_error ()) - goto fail; + goto leave; } setup_interface_offsets (class, class->parent->vtable_size); } else { @@ -4216,16 +4467,8 @@ mono_class_init (MonoClass *class) setup_interface_offsets (class, 0); } - if (mono_verifier_is_enabled_for_class (class) && !mono_verifier_verify_class (class)) { - mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, concat_two_strings_with_zero (class->image, class->name, class->image->assembly_name)); - class_init_ok = FALSE; - } - goto leave; - fail: - class_init_ok = FALSE; - leave: /* Because of the double-checking locking pattern */ mono_memory_barrier (); @@ -4233,9 +4476,9 @@ mono_class_init (MonoClass *class) class->init_pending = 0; if (mono_loader_get_last_error ()) { - if (class->exception_type == MONO_EXCEPTION_NONE) + if (class->exception_type == MONO_EXCEPTION_NONE) { set_failure_from_loader_error (class, mono_loader_get_last_error ()); - + } mono_loader_clear_error (); } @@ -4244,7 +4487,7 @@ mono_class_init (MonoClass *class) if (mono_debugger_class_init_func) mono_debugger_class_init_func (class); - return class_init_ok; + return class->exception_type == MONO_EXCEPTION_NONE; } static gboolean @@ -5317,8 +5560,7 @@ mono_bounded_array_class_get (MonoClass *eclass, guint32 rank, gboolean bounded) class->type_token = 0; /* all arrays are marked serializable and sealed, bug #42779 */ - class->flags = TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_SERIALIZABLE | TYPE_ATTRIBUTE_SEALED | - (eclass->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK); + class->flags = TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_SERIALIZABLE | TYPE_ATTRIBUTE_SEALED | TYPE_ATTRIBUTE_PUBLIC; class->parent = parent; class->instance_size = mono_class_instance_size (class->parent); @@ -6494,6 +6736,7 @@ mono_class_is_assignable_from (MonoClass *klass, MonoClass *oklass) static gboolean mono_class_implement_interface_slow (MonoClass *target, MonoClass *candidate) { + MonoError error; int i; do { @@ -6514,7 +6757,12 @@ mono_class_implement_interface_slow (MonoClass *target, MonoClass *candidate) } } else { /*setup_interfaces don't mono_class_init anything*/ - mono_class_setup_interfaces (candidate); + mono_class_setup_interfaces (candidate, &error); + if (!mono_error_ok (&error)) { + mono_error_cleanup (&error); + return FALSE; + } + for (i = 0; i < candidate->interface_count; ++i) { if (candidate->interfaces [i] == target || mono_class_implement_interface_slow (target, candidate->interfaces [i])) return TRUE; @@ -7108,6 +7356,13 @@ mono_class_get_methods (MonoClass* klass, gpointer *iter) mono_class_init (klass); if (!*iter) { mono_class_setup_methods (klass); + + /* + * We can't fail lookup of methods otherwise the runtime will burst in flames on all sort of places. + * FIXME we should better report this error to the caller + */ + if (!klass->methods) + return NULL; /* start from the first */ if (klass->method.count) { *iter = &klass->methods [0]; @@ -7142,6 +7397,12 @@ mono_class_get_virtual_methods (MonoClass* klass, gpointer *iter) if (klass->methods || !MONO_CLASS_HAS_STATIC_METADATA (klass) || mono_debug_using_mono_debugger ()) { if (!*iter) { mono_class_setup_methods (klass); + /* + * We can't fail lookup of methods otherwise the runtime will burst in flames on all sort of places. + * FIXME we should better report this error to the caller + */ + if (!klass->methods) + return NULL; /* start from the first */ method = &klass->methods [0]; } else { @@ -7282,14 +7543,20 @@ mono_class_get_events (MonoClass* klass, gpointer *iter) MonoClass* mono_class_get_interfaces (MonoClass* klass, gpointer *iter) { + MonoError error; MonoClass** iface; if (!iter) return NULL; if (!*iter) { if (!klass->inited) mono_class_init (klass); - if (!klass->interfaces_inited) - mono_class_setup_interfaces (klass); + if (!klass->interfaces_inited) { + mono_class_setup_interfaces (klass, &error); + if (!mono_error_ok (&error)) { + mono_error_cleanup (&error); + return NULL; + } + } /* start from the first */ if (klass->interface_count) { *iter = &klass->interfaces [0]; @@ -7693,6 +7960,13 @@ mono_class_get_method_from_name_flags (MonoClass *klass, const char *name, int p if (klass->methods || !MONO_CLASS_HAS_STATIC_METADATA (klass)) { mono_class_setup_methods (klass); + /* + We can't fail lookup of methods otherwise the runtime will burst in flames on all sort of places. + See mono/tests/array_load_exception.il + FIXME we should better report this error to the caller + */ + if (!klass->methods) + return NULL; for (i = 0; i < klass->method.count; ++i) { MonoMethod *method = klass->methods [i]; @@ -8428,12 +8702,15 @@ mono_class_alloc_ext (MonoClass *klass) * * Initialize class->interfaces/interfaces_count. * LOCKING: Acquires the loader lock. + * This function can fail the type. */ void -mono_class_setup_interfaces (MonoClass *klass) +mono_class_setup_interfaces (MonoClass *klass, MonoError *error) { int i; + mono_error_init (error); + if (klass->interfaces_inited) return; @@ -8459,8 +8736,15 @@ mono_class_setup_interfaces (MonoClass *klass) klass->interface_count = gklass->interface_count; klass->interfaces = g_new0 (MonoClass *, klass->interface_count); - for (i = 0; i < klass->interface_count; i++) - klass->interfaces [i] = mono_class_inflate_generic_class (gklass->interfaces [i], mono_generic_class_get_context (klass->generic_class)); + for (i = 0; i < klass->interface_count; i++) { + klass->interfaces [i] = mono_class_inflate_generic_class_checked (gklass->interfaces [i], mono_generic_class_get_context (klass->generic_class), error); + if (!mono_error_ok (error)) { + mono_class_set_failure (klass, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Could not setup the interfaces")); + g_free (klass->interfaces); + klass->interfaces = NULL; + return; + } + } } mono_memory_barrier (); diff --git a/mono/metadata/cominterop.c b/mono/metadata/cominterop.c index 0758294ab55..155173596c7 100644 --- a/mono/metadata/cominterop.c +++ b/mono/metadata/cominterop.c @@ -277,11 +277,13 @@ cominterop_get_com_slot_begin (MonoClass* klass) static MonoClass* cominterop_get_method_interface (MonoMethod* method) { + MonoError error; MonoClass *ic = method->klass; /* if method is on a class, we need to look up interface method exists on */ if (!MONO_CLASS_IS_INTERFACE(method->klass)) { - GPtrArray *ifaces = mono_class_get_implemented_interfaces (method->klass); + GPtrArray *ifaces = mono_class_get_implemented_interfaces (method->klass, &error); + g_assert (mono_error_ok (&error)); if (ifaces) { int i; mono_class_setup_vtable (method->klass); @@ -378,6 +380,7 @@ static gboolean cominterop_com_visible (MonoClass* klass) { static MonoClass *ComVisibleAttribute = NULL; + MonoError error; MonoCustomAttrInfo *cinfo; GPtrArray *ifaces; MonoBoolean visible = 0; @@ -398,7 +401,8 @@ cominterop_com_visible (MonoClass* klass) return TRUE; } - ifaces = mono_class_get_implemented_interfaces (klass); + ifaces = mono_class_get_implemented_interfaces (klass, &error); + g_assert (mono_error_ok (&error)); if (ifaces) { int i; for (i = 0; i < ifaces->len; ++i) { @@ -856,6 +860,7 @@ mono_cominterop_get_native_wrapper (MonoMethod *method) if (!method->klass->methods) mono_class_setup_methods (method->klass); + g_assert (!method->klass->exception_type); /*FIXME do proper error handling*/ sig = mono_method_signature (method); mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_COMINTEROP); @@ -2315,6 +2320,7 @@ cominterop_ccw_getfreethreadedmarshaler (MonoCCW* ccw, MonoObject* object, gpoin static int STDCALL cominterop_ccw_queryinterface (MonoCCWInterface* ccwe, guint8* riid, gpointer* ppv) { + MonoError error; GPtrArray *ifaces; MonoClass *itf = NULL; int i; @@ -2359,7 +2365,8 @@ cominterop_ccw_queryinterface (MonoCCWInterface* ccwe, guint8* riid, gpointer* p #endif klass_iter = klass; while (klass_iter && klass_iter != mono_defaults.object_class) { - ifaces = mono_class_get_implemented_interfaces (klass_iter); + ifaces = mono_class_get_implemented_interfaces (klass_iter, &error); + g_assert (mono_error_ok (&error)); if (ifaces) { for (i = 0; i < ifaces->len; ++i) { MonoClass *ic = NULL; diff --git a/mono/metadata/culture-info-tables.h b/mono/metadata/culture-info-tables.h index c50f575fbea..e52b3551484 100644 --- a/mono/metadata/culture-info-tables.h +++ b/mono/metadata/culture-info-tables.h @@ -4,1147 +4,1155 @@ #define MONO_METADATA_CULTURE_INFO_TABLES 1 -#define NUM_CULTURE_ENTRIES 164 +#define NUM_CULTURE_ENTRIES 166 #define NUM_REGION_ENTRIES 230 static const DateTimeFormatEntry datetime_format_entries [] = { - {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37},{357,24},{370,56},{376,46}}, - {387, 409, 422, 438, 370, 447, 457, 465, 468, {471, 484, 505, 520, 531, 550, 561}, {574, 582, 590, 596, 602, 612, 620}, {628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343}, {780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343}, 0, 0, 344, 346, {348,844,422},{357,409},{370},{376,438}}, + {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37},{357,24},{370,56},{376,46}}, + {387, 409, 422, 438, 370, 447, 457, 465, 468, {471, 484, 505, 520, 531, 550, 561}, {574, 582, 590, 596, 602, 612, 620}, {628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343}, {780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343}, 0, 1, 344, 346, {348,844,422},{357,409},{370},{376,438}}, {853, 876, 888, 376, 370, 447, 457, 465, 468, {897, 906, 914, 922, 931, 938, 948}, {957, 961, 965, 969, 973, 977, 981}, {985, 991, 998, 1004, 1010, 1015, 1020, 1027, 1033, 1042, 1050, 1059, 343}, {1068, 1073, 998, 1078, 1010, 1015, 1083, 1088, 1092, 1097, 1102, 1107, 343}, 0, 0, 344, 346, {348,888},{357,876},{370},{376}}, {1112, 357, 348, 376, 370, 1136, 1146, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1356, 1379, 1392, 1399, 1409, 447, 1414, 1422, 1427, {1432, 1440, 1450, 1458, 1466, 1475, 1482}, {1489, 1492, 1495, 1499, 1502, 1506, 1510}, {1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343}, {1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343}, 0, 0, 344, 346, {348,1392},{357,1379},{370,1409},{376,1399}}, - {1643, 1664, 1676, 438, 370, 447, 457, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {1740, 1745, 1749, 1753, 1757, 1761, 1765}, {1770, 1777, 1785, 1791, 1797, 1801, 1806, 1811, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,1898,1676},{357,1664},{370},{376,438}}, - {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379},{370},{376,438}}, - {2162, 409, 37, 2186, 56, 447, 457, 2197, 2202, {2207, 2222, 2237, 2248, 2263, 2276, 2295}, {2310, 2317, 2324, 2331, 2338, 2345, 2352}, {2359, 2380, 2403, 2418, 2435, 2446, 2461, 2476, 2495, 2518, 2537, 2556, 343}, {2577, 2584, 2591, 2598, 2605, 2612, 2621, 2630, 2637, 2644, 2651, 2658, 343}, 0, 0, 344, 346, {348,2665,37},{357,409},{370,56},{376,2676,2186}}, + {1356, 1379, 1392, 1399, 1409, 447, 1414, 1422, 1427, {1432, 1440, 1450, 1458, 1466, 1475, 1482}, {1489, 1492, 1495, 1499, 1502, 1506, 1510}, {1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343}, {1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343}, 0, 1, 344, 346, {348,1392},{357,1379},{370,1409},{376,1399}}, + {1643, 1664, 1676, 438, 370, 447, 457, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {1740, 1745, 1749, 1753, 1757, 1761, 1765}, {1770, 1777, 1785, 1791, 1797, 1801, 1806, 1811, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,1898,1676},{357,1664},{370},{376,438}}, + {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379},{370},{376,438}}, + {2162, 409, 37, 2186, 56, 447, 457, 2197, 2202, {2207, 2222, 2237, 2248, 2263, 2276, 2295}, {2310, 2317, 2324, 2331, 2338, 2345, 2352}, {2359, 2380, 2403, 2418, 2435, 2446, 2461, 2476, 2495, 2518, 2537, 2556, 343}, {2577, 2584, 2591, 2598, 2605, 2612, 2621, 2630, 2637, 2644, 2651, 2658, 343}, 0, 1, 344, 346, {348,2665,37},{357,409},{370,56},{376,2676,2186}}, {2688, 2719, 2739, 2186, 2746, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739},{2719,2719,2912,2926,2946},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438}}, - {2990, 3024, 3046, 2970, 370, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046},{357,3024},{370},{376,2970}}, - {3272, 3297, 3314, 2982, 370, 3323, 3336, 465, 468, {3348, 3358, 3368, 3376, 3388, 3396, 3406}, {3415, 3418, 3421, 3424, 3427, 3430, 3433}, {3436, 3445, 3454, 3464, 3473, 3482, 3491, 3501, 3508, 3516, 3524, 3534, 343}, {3543, 3549, 3555, 3562, 3568, 3574, 3580, 3587, 3591, 3596, 3601, 3608, 343}, 0, 0, 344, 346, {348,3314},{357,3297},{370},{376,2982}}, + {2990, 3024, 3046, 2970, 370, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046},{357,3024},{370},{376,2970}}, + {3272, 3297, 3314, 2982, 370, 3323, 3336, 465, 468, {3348, 3358, 3368, 3376, 3388, 3396, 3406}, {3415, 3418, 3421, 3424, 3427, 3430, 3433}, {3436, 3445, 3454, 3464, 3473, 3482, 3491, 3501, 3508, 3516, 3524, 3534, 343}, {3543, 3549, 3555, 3562, 3568, 3574, 3580, 3587, 3591, 3596, 3601, 3608, 343}, 0, 1, 344, 346, {348,3314},{357,3297},{370},{376,2982}}, {3614, 3640, 888, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264},{357,876,3640},{370},{376,438}}, {3869, 876, 2665, 438, 370, 447, 74, 465, 468, {3890, 3908, 3922, 3940, 3958, 3976, 3992}, {3999, 4002, 4005, 4008, 4011, 4014, 4017}, {4020, 4031, 4044, 4051, 4062, 4069, 4078, 4087, 4100, 4113, 4128, 4141, 343}, {4152, 4159, 4044, 4166, 4062, 4173, 4180, 4187, 4194, 4201, 4208, 4215, 343}, 0, 0, 344, 346, {348,888,2665},{357,876},{370},{376,438}}, - {4222, 4244, 4258, 2982, 1409, 4272, 4283, 4291, 4294, {4297, 4307, 4315, 4320, 4327, 4340, 4348}, {1617, 4356, 4358, 4360, 4364, 4367, 4369}, {4373, 4381, 4390, 4399, 4408, 4415, 4423, 4431, 4441, 4452, 1836, 1845, 343}, {4461, 4466, 4472, 4479, 4485, 4491, 4497, 4503, 4508, 4515, 1102, 4520, 343}, 0, 0, 344, 346, {348,4525,4258},{357,4244},{370,1409},{376,1399,2982}}, + {4222, 4244, 4258, 2982, 1409, 4272, 4283, 4291, 4294, {4297, 4307, 4315, 4320, 4327, 4340, 4348}, {1617, 4356, 4358, 4360, 4364, 4367, 4369}, {4373, 4381, 4390, 4399, 4408, 4415, 4423, 4431, 4441, 4452, 1836, 1845, 343}, {4461, 4466, 4472, 4479, 4485, 4491, 4497, 4503, 4508, 4515, 1102, 4520, 343}, 0, 1, 344, 346, {348,4525,4258},{357,4244},{370,1409},{376,1399,2982}}, {1907, 1379, 3314, 438, 370, 447, 1414, 465, 468, {4537, 4548, 4559, 4573, 4587, 4599, 4611}, {4623, 4627, 4632, 4637, 4642, 4646, 4651}, {4655, 4663, 3761, 4672, 4679, 4684, 4691, 4698, 1818, 4452, 4706, 4716, 343}, {1854, 1858, 1862, 1866, 4679, 4725, 4730, 4735, 1882, 1886, 4741, 4746, 343}, 0, 0, 344, 346, {348,3314},{357,1379},{370},{376,438}}, - {4750, 409, 888, 376, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 0, 344, 346, {348,888},{357,409},{370},{376}}, + {4750, 409, 888, 376, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 1, 344, 346, {348,888},{357,409},{370},{376}}, {4954, 4984, 5006, 2982, 1409, 5017, 5033, 5046, 5053, {5060, 5070, 5080, 5090, 5100, 5110, 5120}, {1238, 5130, 5134, 5138, 5142, 5146, 5150}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, 0, 0, 344, 346, {5006,5006,348,5244,5251,5260,5279,5296},{4984,4984,5315,5339,5366},{1409,1409,370,5395,5403},{2982,438,5412,5423}}, {5435, 5488, 5515, 5524, 5550, 5568, 5585, 5599, 5606, {5613, 5623, 5633, 5643, 5653, 5663, 5673}, {5683, 5687, 5691, 5695, 5699, 5703, 5707}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, 0, 0, 344, 346, {348,5515},{357,5488},{370,5550},{376,5524}}, - {5774, 876, 5796, 1399, 1409, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,1409},{376,1399}}, - {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}}, - {5975, 876, 5996, 438, 370, 447, 74, 465, 468, {6007, 6017, 6031, 6038, 6045, 6054, 1482}, {6062, 6064, 6067, 6070, 6074, 6077, 2013}, {6080, 6089, 6094, 6101, 1797, 6111, 6120, 6127, 6137, 6147, 1587, 6160, 343}, {6170, 6174, 1862, 6178, 1797, 6182, 6186, 6190, 6194, 6198, 6203, 6207, 343}, 0, 0, 344, 346, {348,5515,5996},{357,876},{370},{376,438}}, + {5774, 876, 5796, 1399, 1409, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5796},{357,876},{370,1409},{376,1399}}, + {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 1, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}}, + {5975, 876, 5996, 438, 370, 447, 74, 465, 468, {6007, 6017, 6031, 6038, 6045, 6054, 1482}, {6062, 6064, 6067, 6070, 6074, 6077, 2013}, {6080, 6089, 6094, 6101, 1797, 6111, 6120, 6127, 6137, 6147, 1587, 6160, 343}, {6170, 6174, 1862, 6178, 1797, 6182, 6186, 6190, 6194, 6198, 6203, 6207, 343}, 0, 1, 344, 346, {348,5515,5996},{357,876},{370},{376,438}}, {6211, 3024, 1676, 376, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 0, 344, 346, {348,1676},{357,3024},{370},{376}}, - {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {6418, 6428, 6433, 6440, 6449, 6453, 6460}, {6471, 6473, 6475, 2022, 6478, 1617, 6480}, {6482, 6491, 6501, 6508, 3772, 6516, 6522, 1811, 6528, 6539, 6549, 6559, 343}, {6569, 2122, 2900, 2130, 2061, 6573, 6577, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,1929},{357,876},{370},{376,438}}, - {6581, 6607, 1929, 2982, 1409, 6625, 74, 465, 468, {6641, 6664, 505, 6687, 6698, 6713, 6728}, {6743, 6748, 6753, 6758, 6763, 6768, 6773}, {6778, 6791, 6806, 6815, 6828, 6835, 6844, 6853, 6866, 6883, 6898, 6911, 343}, {6926, 6933, 6940, 6947, 678, 6954, 6961, 6968, 6975, 6982, 6989, 6996, 343}, 0, 0, 344, 346, {348,844,1929},{357,6607},{370,1409},{376,1399,2982}}, - {7003, 7025, 3314, 2982, 370, 4272, 1146, 465, 468, {7039, 7048, 7060, 7067, 7075, 7085, 7091}, {7098, 7102, 7106, 7110, 7114, 7119, 7123}, {7127, 7137, 7146, 7154, 7162, 7170, 7177, 7184, 7192, 1587, 7198, 7206, 343}, {7215, 7219, 7223, 7228, 7232, 6186, 7236, 7240, 7244, 6203, 7248, 7252, 343}, 0, 0, 344, 346, {348,7256,3314},{357,7025},{370},{376,2982}}, - {7267, 1379, 7288, 2982, 1409, 447, 1414, 465, 468, {7299, 7307, 7316, 7323, 7330, 7339, 7346}, {7353, 7356, 7359, 7362, 7365, 7369, 2013}, {4373, 4381, 7372, 4672, 7378, 4725, 4730, 1811, 1818, 4452, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 7378, 4725, 4730, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,3314,7288},{357,1379},{370,1409},{376,1399,2982}}, - {7383, 409, 5996, 7407, 7418, 447, 457, 7425, 7428, {7431, 7438, 7447, 7456, 7468, 7476, 7485}, {7495, 7499, 2900, 7504, 7509, 7513, 7517}, {7521, 7527, 3761, 7534, 1797, 7540, 7548, 7555, 7561, 7569, 7575, 7583, 343}, {2118, 7591, 2900, 7595, 7599, 7603, 7607, 7611, 7517, 7615, 7619, 7624, 343}, 0, 0, 344, 346, {348,5515,5996},{357,409},{370,7418},{376,7628,7407}}, - {7640, 7668, 5996, 5944, 5955, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5996},{357,7668},{370,5955},{376,5944}}, + {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {6418, 6428, 6433, 6440, 6449, 6453, 6460}, {6471, 6473, 6475, 2022, 6478, 1617, 6480}, {6482, 6491, 6501, 6508, 3772, 6516, 6522, 1811, 6528, 6539, 6549, 6559, 343}, {6569, 2122, 2900, 2130, 2061, 6573, 6577, 2142, 2146, 2904, 2154, 2908, 343}, 0, 1, 344, 346, {348,1929},{357,876},{370},{376,438}}, + {6581, 6607, 1929, 2982, 1409, 6625, 74, 465, 468, {6641, 6664, 505, 6687, 6698, 6713, 6728}, {6743, 6748, 6753, 6758, 6763, 6768, 6773}, {6778, 6791, 6806, 6815, 6828, 6835, 6844, 6853, 6866, 6883, 6898, 6911, 343}, {6926, 6933, 6940, 6947, 678, 6954, 6961, 6968, 6975, 6982, 6989, 6996, 343}, 0, 1, 344, 346, {348,844,1929},{357,6607},{370,1409},{376,1399,2982}}, + {7003, 7025, 3314, 2982, 370, 4272, 1146, 465, 468, {7039, 7048, 7060, 7067, 7075, 7085, 7091}, {7098, 7102, 7106, 7110, 7114, 7119, 7123}, {7127, 7137, 7146, 7154, 7162, 7170, 7177, 7184, 7192, 1587, 7198, 7206, 343}, {7215, 7219, 7223, 7228, 7232, 6186, 7236, 7240, 7244, 6203, 7248, 7252, 343}, 0, 1, 344, 346, {348,7256,3314},{357,7025},{370},{376,2982}}, + {7267, 1379, 7288, 2982, 1409, 447, 1414, 465, 468, {7299, 7307, 7316, 7323, 7330, 7339, 7346}, {7353, 7356, 7359, 7362, 7365, 7369, 2013}, {4373, 4381, 7372, 4672, 7378, 4725, 4730, 1811, 1818, 4452, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 7378, 4725, 4730, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,3314,7288},{357,1379},{370,1409},{376,1399,2982}}, + {7383, 409, 5996, 7407, 7418, 447, 457, 7425, 7428, {7431, 7438, 7447, 7456, 7468, 7476, 7485}, {7495, 7499, 2900, 7504, 7509, 7513, 7517}, {7521, 7527, 3761, 7534, 1797, 7540, 7548, 7555, 7561, 7569, 7575, 7583, 343}, {2118, 7591, 2900, 7595, 7599, 7603, 7607, 7611, 7517, 7615, 7619, 7624, 343}, 0, 1, 344, 346, {348,5515,5996},{357,409},{370,7418},{376,7628,7407}}, + {7640, 7668, 5996, 5944, 5955, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5996},{357,7668},{370,5955},{376,5944}}, {7742, 876, 37, 2982, 1409, 447, 74, 7763, 7794, {7825, 7856, 7884, 7912, 7931, 7965, 7990}, {8015, 8023, 8028, 8033, 8038, 8046, 8051}, {8056, 8075, 8106, 8125, 8144, 8166, 8191, 8213, 8235, 8257, 8276, 8304, 343}, {8326, 8335, 8344, 8356, 8368, 8377, 8389, 8398, 8407, 8416, 8425, 8434, 343}, 0, 0, 344, 346, {348,37},{357,876},{370,1409},{376,8443,2982}}, - {8483, 8510, 1929, 438, 370, 447, 457, 465, 468, {8528, 8534, 8544, 8550, 8561, 8571, 8576}, {8586, 8590, 8594, 8598, 8603, 8607, 8611}, {8615, 8620, 8627, 8632, 8638, 8645, 8653, 8660, 8669, 8676, 8681, 8688, 343}, {8696, 8700, 2900, 8705, 2869, 8709, 8713, 8717, 8722, 8726, 8730, 8734, 343}, 0, 0, 344, 346, {348,1929},{357,8510},{370},{376,438}}, + {8483, 8510, 1929, 438, 370, 447, 457, 465, 468, {8528, 8534, 8544, 8550, 8561, 8571, 8576}, {8586, 8590, 8594, 8598, 8603, 8607, 8611}, {8615, 8620, 8627, 8632, 8638, 8645, 8653, 8660, 8669, 8676, 8681, 8688, 343}, {8696, 8700, 2900, 8705, 2869, 8709, 8713, 8717, 8722, 8726, 8730, 8734, 343}, 0, 1, 344, 346, {348,1929},{357,8510},{370},{376,438}}, {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {8738, 8745, 8751, 8758, 8763, 8769, 8775}, {8781, 8785, 8789, 8793, 8797, 8801, 8805}, {8809, 8817, 8826, 2055, 8832, 2065, 2070, 8836, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 8853, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {8861, 876, 1929, 2982, 370, 8881, 74, 465, 468, {8897, 8910, 8929, 8946, 8959, 8972, 8988}, {9001, 6748, 6753, 6758, 6763, 6768, 6773}, {9006, 9017, 9030, 9045, 9058, 9071, 9084, 9095, 9108, 9123, 9136, 9155, 343}, {9168, 9175, 9182, 9189, 9198, 9207, 9216, 9223, 9232, 9239, 9248, 9257, 343}, 0, 0, 344, 346, {348,844,1929},{357,876},{370},{376,2982}}, - {9266, 876, 1392, 5944, 5955, 447, 74, 465, 468, {9289, 9304, 9325, 9340, 9353, 9366, 9381}, {9394, 9399, 9404, 9409, 9414, 9419, 9424}, {9429, 9446, 9455, 9470, 678, 9487, 9502, 9515, 9530, 9547, 9568, 9585, 343}, {9600, 9175, 9607, 9614, 678, 9621, 9628, 9635, 9232, 9642, 9649, 9656, 343}, 0, 0, 344, 346, {348,1392},{357,876},{370,5955},{376,5944}}, - {9663, 9685, 3314, 2982, 1409, 447, 9699, 465, 468, {9708, 9716, 9727, 9733, 9739, 9748, 1482}, {7098, 7102, 1757, 9754, 7114, 7119, 9758}, {1770, 1777, 7372, 1791, 1797, 9762, 9768, 9774, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 9781, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,9785,3314},{357,9685},{370,1409},{376,1399,2982}}, - {8861, 876, 9792, 2982, 1409, 447, 9802, 465, 468, {9810, 9821, 9832, 9843, 9854, 9865, 9871}, {4367, 9880, 9882, 4358, 6062, 9884, 6473}, {9886, 9894, 9903, 9910, 3772, 9917, 9923, 1811, 1818, 9929, 1836, 9938, 343}, {9948, 9953, 9903, 1866, 3772, 9917, 9923, 1878, 9959, 1886, 1890, 9964, 343}, 0, 0, 344, 346, {348,844,9792},{357,876},{370,1409},{376,1399,2982}}, - {9969, 9998, 4525, 2982, 370, 10019, 1414, 465, 468, {10037, 10048, 10058, 10067, 10078, 10090, 10101}, {10111, 4367, 10114, 9882, 10116, 10118, 6480}, {10121, 10131, 1785, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343}, {2118, 2122, 2900, 2130, 2061, 10221, 10226, 2142, 2146, 2150, 2154, 2908, 343}, 0, 0, 344, 346, {348,10231,4525},{357,9998},{370},{376,2982}}, - {10238, 10271, 7256, 376, 370, 10293, 10308, 465, 468, {10320, 10332, 10344, 10356, 10370, 10385, 10398}, {10412, 10415, 10418, 10421, 10424, 6064, 7365}, {10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343}, {10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343}, 0, 0, 344, 346, {348,7256},{357,10271},{370},{376}}, + {8861, 876, 1929, 2982, 370, 8881, 74, 465, 468, {8897, 8910, 8929, 8946, 8959, 8972, 8988}, {9001, 6748, 6753, 6758, 6763, 6768, 6773}, {9006, 9017, 9030, 9045, 9058, 9071, 9084, 9095, 9108, 9123, 9136, 9155, 343}, {9168, 9175, 9182, 9189, 9198, 9207, 9216, 9223, 9232, 9239, 9248, 9257, 343}, 0, 1, 344, 346, {348,844,1929},{357,876},{370},{376,2982}}, + {9266, 876, 1392, 5944, 5955, 447, 74, 465, 468, {9289, 9304, 9325, 9340, 9353, 9366, 9381}, {9394, 9399, 9404, 9409, 9414, 9419, 9424}, {9429, 9446, 9455, 9470, 678, 9487, 9502, 9515, 9530, 9547, 9568, 9585, 343}, {9600, 9175, 9607, 9614, 678, 9621, 9628, 9635, 9232, 9642, 9649, 9656, 343}, 0, 1, 344, 346, {348,1392},{357,876},{370,5955},{376,5944}}, + {9663, 9685, 3314, 2982, 1409, 447, 9699, 465, 468, {9708, 9716, 9727, 9733, 9739, 9748, 1482}, {7098, 7102, 1757, 9754, 7114, 7119, 9758}, {1770, 1777, 7372, 1791, 1797, 9762, 9768, 9774, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 9781, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,9785,3314},{357,9685},{370,1409},{376,1399,2982}}, + {8861, 876, 9792, 2982, 1409, 447, 9802, 465, 468, {9810, 9821, 9832, 9843, 9854, 9865, 9871}, {4367, 9880, 9882, 4358, 6062, 9884, 6473}, {9886, 9894, 9903, 9910, 3772, 9917, 9923, 1811, 1818, 9929, 1836, 9938, 343}, {9948, 9953, 9903, 1866, 3772, 9917, 9923, 1878, 9959, 1886, 1890, 9964, 343}, 0, 1, 344, 346, {348,844,9792},{357,876},{370,1409},{376,1399,2982}}, + {9969, 9998, 4525, 2982, 370, 10019, 1414, 465, 468, {10037, 10048, 10058, 10067, 10078, 10090, 10101}, {10111, 4367, 10114, 9882, 10116, 10118, 6480}, {10121, 10131, 1785, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343}, {2118, 2122, 2900, 2130, 2061, 10221, 10226, 2142, 2146, 2150, 2154, 2908, 343}, 0, 1, 344, 346, {348,10231,4525},{357,9998},{370},{376,2982}}, + {10238, 10271, 7256, 376, 370, 10293, 10308, 465, 468, {10320, 10332, 10344, 10356, 10370, 10385, 10398}, {10412, 10415, 10418, 10421, 10424, 6064, 7365}, {10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343}, {10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343}, 0, 1, 344, 346, {348,7256},{357,10271},{370},{376}}, {10582, 876, 10606, 2970, 370, 447, 74, 10615, 10622, {10629, 10645, 10658, 10674, 10691, 10709, 10718}, {10727, 10731, 10735, 10739, 10743, 10747, 10751}, {10755, 10768, 229, 10779, 10790, 10795, 10804, 10815, 10822, 10837, 10848, 10861, 343}, {10874, 10881, 10888, 10895, 10902, 10909, 10916, 10815, 10923, 10930, 10937, 10944, 343}, 0, 0, 344, 346, {348,10951,10606},{357,876},{370},{376,10961,2970}}, - {10974, 409, 2665, 2186, 370, 447, 457, 10998, 11001, {11004, 11017, 11027, 11036, 11046, 11057, 11068}, {11080, 11083, 11088, 11093, 11098, 11103, 11108}, {11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343}, {11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343}, 0, 0, 344, 346, {348,2665},{357,409},{370},{376,2186}}, - {11350, 2912, 1929, 2982, 370, 447, 2754, 11372, 11380, {11388, 11401, 11422, 11441, 11462, 11481, 11494}, {11505, 11512, 11519, 11526, 11533, 11540, 11547}, {11554, 11571, 11588, 11597, 11608, 11619, 11632, 11645, 11660, 11679, 11698, 11715, 343}, {11734, 11741, 11748, 11755, 11762, 11769, 11776, 11783, 11790, 11797, 11804, 11811, 343}, 0, 0, 344, 346, {348,11818,1929},{357,2912},{370},{376,2982}}, + {10974, 409, 2665, 2186, 370, 447, 457, 10998, 11001, {11004, 11017, 11027, 11036, 11046, 11057, 11068}, {11080, 11083, 11088, 11093, 11098, 11103, 11108}, {11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343}, {11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343}, 0, 1, 344, 346, {348,2665},{357,409},{370},{376,2186}}, + {11350, 2912, 1929, 2982, 370, 447, 2754, 11372, 11380, {11388, 11401, 11422, 11441, 11462, 11481, 11494}, {11505, 11512, 11519, 11526, 11533, 11540, 11547}, {11554, 11571, 11588, 11597, 11608, 11619, 11632, 11645, 11660, 11679, 11698, 11715, 343}, {11734, 11741, 11748, 11755, 11762, 11769, 11776, 11783, 11790, 11797, 11804, 11811, 343}, 0, 1, 344, 346, {348,11818,1929},{357,2912},{370},{376,2982}}, {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {11827, 11835, 11846, 11856, 11867, 11876, 11885}, {11895, 11898, 11901, 11904, 11907, 11910, 11913}, {11916, 11926, 11934, 11942, 11950, 11958, 11965, 11973, 11981, 11988, 11994, 12001, 343}, {12009, 12013, 1862, 12017, 3772, 12021, 12025, 12029, 12033, 12037, 12041, 12045, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {387, 409, 1929, 438, 370, 447, 457, 465, 468, {12049, 484, 505, 6687, 12062, 12079, 12090}, {574, 582, 590, 12103, 12111, 612, 12119}, {12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343}, {12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343}, 0, 0, 344, 346, {348,12229,1929},{357,409},{370},{376,438}}, + {387, 409, 1929, 438, 370, 447, 457, 465, 468, {12049, 484, 505, 6687, 12062, 12079, 12090}, {574, 582, 590, 12103, 12111, 612, 12119}, {12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343}, {12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343}, 0, 1, 344, 346, {348,12229,1929},{357,409},{370},{376,438}}, {1112, 357, 348, 376, 370, 1136, 1146, 12237, 12240, {12243, 12250, 12258, 12266, 12275, 12285, 12292}, {2013, 6475, 2019, 12301, 2025, 12304, 2031}, {12307, 12316, 12326, 2055, 8832, 12332, 12338, 12344, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 2142, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {12353, 1664, 1898, 376, 370, 447, 457, 465, 468, {4537, 12376, 12387, 12397, 12407, 12417, 12431}, {4623, 4627, 12443, 12448, 12452, 12457, 12462}, {1770, 1777, 3761, 4672, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,1898},{357,1664},{370},{376}}, - {1112, 357, 348, 376, 370, 1136, 1146, 12466, 12494, {12516, 12535, 12554, 12576, 12595, 12617, 12642}, {12661, 12671, 12681, 12694, 12704, 12717, 12733}, {12743, 12759, 12775, 12791, 12810, 12817, 12827, 12843, 12859, 12881, 12903, 12922, 343}, {12743, 12759, 12775, 12791, 12810, 12817, 12827, 12843, 12859, 12881, 12903, 12922, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {12944, 12953, 12962, 12970, 12979, 12988, 12995}, {13004, 13008, 13012, 13016, 13020, 13024, 13028}, {8809, 8817, 13032, 13038, 8832, 2065, 13045, 13051, 13058, 13067, 13074, 13082, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 13090, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1112, 357, 348, 376, 370, 1136, 1146, 13094, 13136, {13178, 13197, 13216, 13238, 13257, 13279, 13304}, {13323, 13333, 13343, 13356, 13366, 13379, 13395}, {13405, 13433, 13461, 13477, 13496, 13503, 13513, 13529, 13545, 13573, 13595, 13617, 343}, {13642, 13661, 13461, 13477, 13496, 13503, 13513, 13529, 13680, 13696, 13712, 13722, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1112, 357, 348, 376, 370, 1136, 1146, 13735, 13748, {13761, 13780, 13802, 13827, 13843, 13865, 13884}, {13894, 13901, 13908, 13915, 13922, 13929, 13936}, {13940, 13956, 13981, 14000, 14019, 14026, 14039, 14052, 14071, 14102, 14127, 14149, 343}, {14174, 14182, 14196, 14210, 14019, 14026, 14039, 14221, 14229, 14243, 14254, 14262, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1112, 357, 348, 376, 370, 1136, 1146, 14273, 14301, {14323, 14345, 14367, 14392, 14414, 14439, 14467}, {14489, 14499, 14509, 14522, 14532, 14545, 14561}, {14571, 14587, 14612, 14631, 14653, 14660, 14673, 14686, 14705, 14736, 14761, 14780, 343}, {14571, 14587, 14612, 14631, 14653, 14660, 14673, 14686, 14705, 14736, 14761, 14780, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1112, 357, 348, 376, 370, 1136, 1146, 14805, 14833, {14855, 14874, 14893, 14915, 14934, 14956, 14981}, {15000, 15005, 15013, 15021, 15029, 15037, 15045}, {15056, 15072, 15097, 15116, 15138, 15145, 15158, 15171, 15190, 15218, 15243, 15265, 343}, {15056, 15072, 15097, 15116, 15138, 15145, 15158, 15171, 15190, 15218, 15243, 15265, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1112, 357, 348, 376, 370, 1136, 1146, 15290, 15302, {12516, 12535, 15314, 12576, 12595, 12617, 12642}, {12661, 12671, 15336, 12694, 12704, 12717, 12733}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {15554, 15562, 15567, 15574, 15584, 15590, 15597}, {15605, 15609, 2900, 15613, 15618, 15622, 15626}, {15631, 15639, 15648, 15654, 15660, 15665, 15671, 15677, 15684, 15693, 15701, 15710, 343}, {15719, 2122, 2900, 15723, 2061, 15727, 15732, 13090, 15736, 15740, 2154, 2908, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1112, 357, 348, 376, 370, 1136, 1146, 15290, 15302, {15744, 12535, 15772, 12576, 12595, 12617, 12642}, {12661, 12671, 15336, 12694, 12704, 12717, 12733}, {15349, 15791, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, - {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37},{357,24},{370,56},{376,46}}, - {387, 409, 422, 438, 370, 447, 457, 465, 468, {471, 484, 505, 520, 531, 550, 561}, {574, 582, 590, 596, 602, 612, 620}, {628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343}, {780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343}, 0, 0, 344, 346, {348,844,422},{357,409},{370},{376,438}}, - {5975, 876, 2665, 438, 370, 447, 457, 465, 468, {897, 906, 914, 922, 931, 938, 948}, {957, 961, 965, 969, 973, 977, 981}, {985, 991, 998, 1004, 1010, 1015, 1020, 1027, 1033, 1042, 1050, 1059, 343}, {1068, 1073, 998, 1078, 1010, 1015, 1083, 1088, 1092, 1097, 1102, 1107, 343}, 0, 0, 344, 346, {348,888,2665},{357,876},{370},{376,438}}, - {15822, 4984, 5251, 15867, 15890, 5017, 5033, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,5251},{357,4984},{370,15890},{376,15867}}, - {7267, 1379, 3314, 2982, 1409, 447, 1414, 1422, 1427, {1432, 1440, 1450, 1458, 1466, 1475, 1482}, {1489, 1492, 1495, 1499, 1502, 1506, 1510}, {1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343}, {1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343}, 0, 0, 344, 346, {348,1392,3314},{357,1379},{370,1409},{376,1399,2982}}, - {1643, 1664, 1676, 438, 370, 447, 457, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {1740, 1745, 1749, 1753, 1757, 1761, 1765}, {1770, 1777, 1785, 1791, 1797, 1801, 1806, 1811, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,1898,1676},{357,1664},{370},{376,438}}, - {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379},{370},{376,438}}, - {2162, 409, 37, 2186, 56, 447, 457, 2197, 2202, {2207, 2222, 2237, 2248, 2263, 2276, 2295}, {2310, 2317, 2324, 2331, 2338, 2345, 2352}, {2359, 2380, 2403, 2418, 2435, 2446, 2461, 2476, 2495, 2518, 2537, 2556, 343}, {2577, 2584, 2591, 2598, 2605, 2612, 2621, 2630, 2637, 2644, 2651, 2658, 343}, 0, 0, 344, 346, {348,2665,37},{357,409},{370,56},{376,2676,2186}}, - {2688, 2719, 10606, 2186, 2746, 63, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {10606,10606,2739,2739,11818,3046,348,5996,15897},{2719,2719,2912,2926,2946},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438}}, - {3272, 3297, 3314, 2982, 370, 3323, 3336, 465, 468, {3348, 3358, 3368, 3376, 3388, 3396, 3406}, {3415, 3418, 3421, 3424, 3427, 3430, 3433}, {3436, 3445, 3454, 3464, 3473, 3482, 3491, 3501, 3508, 3516, 3524, 3534, 343}, {3543, 3549, 3555, 3562, 3568, 3574, 3580, 3587, 3591, 3596, 3601, 3608, 343}, 0, 0, 344, 346, {348,3314},{357,3297},{370},{376,2982}}, - {3614, 3640, 2665, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264,2665},{357,876,3640},{370},{376,438}}, + {12353, 12373, 348, 376, 370, 12382, 1146, 12389, 12405, {5217, 5219, 5221, 5223, 5225, 5227, 5229}, {5217, 5219, 5221, 5223, 5225, 5227, 5229}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, 0, 0, 344, 346, {348},{357,12373},{370},{376}}, + {12427, 1664, 1898, 376, 370, 447, 457, 465, 468, {4537, 12450, 12461, 12471, 12481, 12491, 12505}, {4623, 4627, 12517, 12522, 12526, 12531, 12536}, {1770, 1777, 3761, 4672, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,1898},{357,1664},{370},{376}}, + {1112, 357, 348, 376, 370, 1136, 1146, 12540, 12568, {12590, 12609, 12628, 12650, 12669, 12691, 12716}, {12735, 12745, 12755, 12768, 12778, 12791, 12807}, {12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343}, {12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, + {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {13018, 13027, 13036, 13044, 13053, 13062, 13069}, {13078, 13082, 13086, 13090, 13094, 13098, 13102}, {8809, 8817, 13106, 13112, 8832, 2065, 13119, 13125, 13132, 13141, 13148, 13156, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 13164, 2146, 2150, 2154, 8857, 343}, 0, 6, 344, 346, {348},{357},{370},{376}}, + {1112, 357, 348, 376, 370, 1136, 1146, 13168, 13210, {13252, 13271, 13290, 13312, 13331, 13353, 13378}, {13397, 13407, 13417, 13430, 13440, 13453, 13469}, {13479, 13507, 13535, 13551, 13570, 13577, 13587, 13603, 13619, 13647, 13669, 13691, 343}, {13716, 13735, 13535, 13551, 13570, 13577, 13587, 13603, 13754, 13770, 13786, 13796, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, + {1112, 357, 348, 376, 370, 1136, 1146, 13809, 13822, {13835, 13854, 13876, 13901, 13917, 13939, 13958}, {13968, 13975, 13982, 13989, 13996, 14003, 14010}, {14014, 14030, 14055, 14074, 14093, 14100, 14113, 14126, 14145, 14176, 14201, 14223, 343}, {14248, 14256, 14270, 14284, 14093, 14100, 14113, 14295, 14303, 14317, 14328, 14336, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, + {1112, 357, 348, 376, 370, 1136, 1146, 14347, 14375, {14397, 14419, 14441, 14466, 14488, 14513, 14541}, {14563, 14573, 14583, 14596, 14606, 14619, 14635}, {14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343}, {14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, + {1112, 357, 348, 376, 370, 1136, 1146, 14879, 14907, {14929, 14948, 14967, 14989, 15008, 15030, 15055}, {15074, 15079, 15087, 15095, 15103, 15111, 15119}, {15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343}, {15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, + {1112, 357, 348, 376, 370, 1136, 1146, 15364, 15376, {12590, 12609, 15388, 12650, 12669, 12691, 12716}, {12735, 12745, 15410, 12768, 12778, 12791, 12807}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, + {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {15628, 15636, 15641, 15648, 15658, 15664, 15671}, {15679, 15683, 2900, 15687, 15692, 15696, 15700}, {15705, 15713, 15722, 15728, 15734, 15739, 15745, 15751, 15758, 15767, 15775, 15784, 343}, {15793, 2122, 2900, 15797, 2061, 15801, 15806, 13164, 15810, 15814, 2154, 2908, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, + {1112, 357, 348, 376, 370, 1136, 1146, 15364, 15376, {15818, 12609, 15846, 12650, 12669, 12691, 12716}, {12735, 12745, 15410, 12768, 12778, 12791, 12807}, {15423, 15865, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}, + {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37},{357,24},{370,56},{376,46}}, + {387, 409, 422, 438, 370, 447, 457, 465, 468, {471, 484, 505, 520, 531, 550, 561}, {574, 582, 590, 596, 602, 612, 620}, {628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343}, {780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343}, 0, 1, 344, 346, {348,844,422},{357,409},{370},{376,438}}, + {5975, 876, 2665, 438, 370, 447, 457, 465, 468, {897, 906, 914, 922, 931, 938, 948}, {957, 961, 965, 969, 973, 977, 981}, {985, 991, 998, 1004, 1010, 1015, 1020, 1027, 1033, 1042, 1050, 1059, 343}, {1068, 1073, 998, 1078, 1010, 1015, 1083, 1088, 1092, 1097, 1102, 1107, 343}, 0, 1, 344, 346, {348,888,2665},{357,876},{370},{376,438}}, + {15896, 4984, 5251, 15941, 15964, 5017, 5033, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,5251},{357,4984},{370,15964},{376,15941}}, + {7267, 1379, 3314, 2982, 1409, 447, 1414, 1422, 1427, {1432, 1440, 1450, 1458, 1466, 1475, 1482}, {1489, 1492, 1495, 1499, 1502, 1506, 1510}, {1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343}, {1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343}, 0, 1, 344, 346, {348,1392,3314},{357,1379},{370,1409},{376,1399,2982}}, + {1643, 1664, 1676, 438, 370, 447, 457, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {1740, 1745, 1749, 1753, 1757, 1761, 1765}, {1770, 1777, 1785, 1791, 1797, 1801, 1806, 1811, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,1898,1676},{357,1664},{370},{376,438}}, + {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379},{370},{376,438}}, + {2162, 409, 37, 2186, 56, 447, 457, 2197, 2202, {2207, 2222, 2237, 2248, 2263, 2276, 2295}, {2310, 2317, 2324, 2331, 2338, 2345, 2352}, {2359, 2380, 2403, 2418, 2435, 2446, 2461, 2476, 2495, 2518, 2537, 2556, 343}, {2577, 2584, 2591, 2598, 2605, 2612, 2621, 2630, 2637, 2644, 2651, 2658, 343}, 0, 1, 344, 346, {348,2665,37},{357,409},{370,56},{376,2676,2186}}, + {2688, 2719, 10606, 2186, 2746, 63, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {10606,10606,2739,2739,11818,3046,348,5996,15971},{2719,2719,2912,2926,2946},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438}}, + {3272, 3297, 3314, 2982, 370, 3323, 3336, 465, 468, {3348, 3358, 3368, 3376, 3388, 3396, 3406}, {3415, 3418, 3421, 3424, 3427, 3430, 3433}, {3436, 3445, 3454, 3464, 3473, 3482, 3491, 3501, 3508, 3516, 3524, 3534, 343}, {3543, 3549, 3555, 3562, 3568, 3574, 3580, 3587, 3591, 3596, 3601, 3608, 343}, 0, 1, 344, 346, {348,3314},{357,3297},{370},{376,2982}}, + {3614, 3640, 2665, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 1, 344, 346, {888,3859,3264,2665},{357,876,3640},{370},{376,438}}, {3869, 876, 2665, 438, 370, 447, 74, 465, 468, {3890, 3908, 3922, 3940, 3958, 3976, 3992}, {3999, 4002, 4005, 4008, 4011, 4014, 4017}, {4020, 4031, 4044, 4051, 4062, 4069, 4078, 4087, 4100, 4113, 4128, 4141, 343}, {4152, 4159, 4044, 4166, 4062, 4173, 4180, 4187, 4194, 4201, 4208, 4215, 343}, 0, 0, 344, 346, {348,888,2665},{357,876},{370},{376,438}}, - {4222, 4244, 4258, 2982, 1409, 4272, 4283, 4291, 4294, {4297, 4307, 4315, 4320, 4327, 4340, 4348}, {1617, 4356, 4358, 4360, 4364, 4367, 4369}, {4373, 4381, 4390, 4399, 4408, 4415, 4423, 4431, 4441, 4452, 1836, 1845, 343}, {4461, 4466, 4472, 4479, 4485, 4491, 4497, 4503, 4508, 4515, 1102, 4520, 343}, 0, 0, 344, 346, {348,4525,4258},{357,4244},{370,1409},{376,1399,2982}}, + {4222, 4244, 4258, 2982, 1409, 4272, 4283, 4291, 4294, {4297, 4307, 4315, 4320, 4327, 4340, 4348}, {1617, 4356, 4358, 4360, 4364, 4367, 4369}, {4373, 4381, 4390, 4399, 4408, 4415, 4423, 4431, 4441, 4452, 1836, 1845, 343}, {4461, 4466, 4472, 4479, 4485, 4491, 4497, 4503, 4508, 4515, 1102, 4520, 343}, 0, 1, 344, 346, {348,4525,4258},{357,4244},{370,1409},{376,1399,2982}}, {1907, 1379, 3314, 438, 370, 447, 1414, 465, 468, {4537, 4548, 4559, 4573, 4587, 4599, 4611}, {4623, 4627, 4632, 4637, 4642, 4646, 4651}, {4655, 4663, 3761, 4672, 4679, 4684, 4691, 4698, 1818, 4452, 4706, 4716, 343}, {1854, 1858, 1862, 1866, 4679, 4725, 4730, 4735, 1882, 1886, 4741, 4746, 343}, 0, 0, 344, 346, {348,3314},{357,1379},{370},{376,438}}, - {15907, 409, 2665, 15928, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 0, 344, 346, {348,888,2665},{357,409},{370},{376,1399,15928}}, + {15981, 409, 2665, 16002, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 1, 344, 346, {348,888,2665},{357,409},{370},{376,1399,16002}}, {4954, 4984, 5006, 2982, 1409, 5017, 5033, 5046, 5053, {5060, 5070, 5080, 5090, 5100, 5110, 5120}, {1238, 5130, 5134, 5138, 5142, 5146, 5150}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, 0, 0, 344, 346, {5006,5006,348,5244,5251,5260,5279,5296},{4984,4984,5315,5339,5366},{1409,1409,370,5395,5403},{2982,438,5412,5423}}, - {15936, 15986, 5006, 16010, 5395, 5568, 5585, 5599, 5606, {5613, 5623, 5633, 5643, 5653, 5663, 5673}, {5683, 5687, 5691, 5695, 5699, 5703, 5707}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, 0, 0, 344, 346, {5006,5006,348,5244,5251,16036,16049},{15986,15986,16060,16086,16108},{5395,1409,370,16132,16146,16161,5395,5403,16177,16194,16212},{16010,16010,16231,16253,2982,438,16277,16302,5412,5423}}, - {8861, 876, 16329, 2982, 1409, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5796,16329},{357,876},{370,1409},{376,1399,2982}}, - {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}}, - {5975, 876, 5996, 438, 370, 447, 74, 465, 468, {6007, 6017, 6031, 6038, 6045, 6054, 1482}, {6062, 6064, 6067, 6070, 6074, 6077, 2013}, {6080, 6089, 6094, 6101, 1797, 6111, 6120, 6127, 6137, 6147, 1587, 6160, 343}, {6170, 6174, 1862, 6178, 1797, 6182, 6186, 6190, 6194, 6198, 6203, 6207, 343}, 0, 0, 344, 346, {348,5515,5996},{357,876},{370},{376,438}}, - {16338, 3024, 37, 438, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 0, 344, 346, {348,1676,888,37},{357,3024},{370},{376,16369,438}}, - {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {6418, 6428, 6433, 6440, 6449, 6453, 6460}, {6471, 6473, 6475, 2022, 6478, 1617, 6480}, {6482, 6491, 6501, 6508, 3772, 6516, 6522, 1811, 6528, 6539, 6549, 6559, 343}, {6569, 2122, 2900, 2130, 2061, 6573, 6577, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,1929},{357,876},{370},{376,438}}, - {6581, 6607, 1929, 2982, 1409, 6625, 74, 465, 468, {6641, 6664, 505, 6687, 6698, 6713, 6728}, {6743, 6748, 6753, 6758, 6763, 6768, 6773}, {6778, 6791, 6806, 6815, 6828, 6835, 6844, 6853, 6866, 6883, 6898, 6911, 343}, {6926, 6933, 6940, 6947, 678, 6954, 6961, 6968, 6975, 6982, 6989, 6996, 343}, 0, 0, 344, 346, {348,844,1929},{357,6607},{370,1409},{376,1399,2982}}, - {7003, 7025, 3314, 2982, 370, 4272, 1146, 465, 468, {7039, 7048, 7060, 7067, 7075, 7085, 7091}, {7098, 7102, 7106, 7110, 7114, 7119, 7123}, {7127, 7137, 7146, 7154, 7162, 7170, 7177, 7184, 7192, 1587, 7198, 7206, 343}, {7215, 7219, 7223, 7228, 7232, 6186, 7236, 7240, 7244, 6203, 7248, 7252, 343}, 0, 0, 344, 346, {348,7256,3314},{357,7025},{370},{376,2982}}, - {7267, 1379, 7288, 2982, 1409, 447, 1414, 465, 468, {7299, 7307, 7316, 7323, 7330, 7339, 7346}, {7353, 7356, 7359, 7362, 7365, 7369, 2013}, {4373, 4381, 7372, 4672, 7378, 4725, 4730, 1811, 1818, 4452, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 7378, 4725, 4730, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,3314,7288},{357,1379},{370,1409},{376,1399,2982}}, - {7383, 409, 5996, 7407, 7418, 447, 457, 7425, 7428, {7431, 7438, 7447, 7456, 7468, 7476, 7485}, {7495, 7499, 2900, 7504, 7509, 7513, 7517}, {7521, 7527, 3761, 7534, 1797, 7540, 7548, 7555, 7561, 7569, 7575, 7583, 343}, {2118, 7591, 2900, 7595, 7599, 7603, 7607, 7611, 7517, 7615, 7619, 7624, 343}, 0, 0, 344, 346, {348,5515,5996},{357,409},{370,7418},{376,7628,7407}}, - {16386, 7668, 5996, 438, 370, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5996},{357,7668},{370,5955},{376,5944,438}}, + {16010, 16060, 5006, 16084, 5395, 5568, 5585, 5599, 5606, {5613, 5623, 5633, 5643, 5653, 5663, 5673}, {5683, 5687, 5691, 5695, 5699, 5703, 5707}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, 0, 0, 344, 346, {5006,5006,348,5244,5251,16110,16123},{16060,16060,16134,16160,16182},{5395,1409,370,16206,16220,16235,5395,5403,16251,16268,16286},{16084,16084,16305,16327,2982,438,16351,16376,5412,5423}}, + {8861, 876, 16403, 2982, 1409, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5796,16403},{357,876},{370,1409},{376,1399,2982}}, + {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 1, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}}, + {5975, 876, 5996, 438, 370, 447, 74, 465, 468, {6007, 6017, 6031, 6038, 6045, 6054, 1482}, {6062, 6064, 6067, 6070, 6074, 6077, 2013}, {6080, 6089, 6094, 6101, 1797, 6111, 6120, 6127, 6137, 6147, 1587, 6160, 343}, {6170, 6174, 1862, 6178, 1797, 6182, 6186, 6190, 6194, 6198, 6203, 6207, 343}, 0, 1, 344, 346, {348,5515,5996},{357,876},{370},{376,438}}, + {16412, 3024, 37, 438, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 0, 344, 346, {348,1676,888,37},{357,3024},{370},{376,16443,438}}, + {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {6418, 6428, 6433, 6440, 6449, 6453, 6460}, {6471, 6473, 6475, 2022, 6478, 1617, 6480}, {6482, 6491, 6501, 6508, 3772, 6516, 6522, 1811, 6528, 6539, 6549, 6559, 343}, {6569, 2122, 2900, 2130, 2061, 6573, 6577, 2142, 2146, 2904, 2154, 2908, 343}, 0, 1, 344, 346, {348,1929},{357,876},{370},{376,438}}, + {6581, 6607, 1929, 2982, 1409, 6625, 74, 465, 468, {6641, 6664, 505, 6687, 6698, 6713, 6728}, {6743, 6748, 6753, 6758, 6763, 6768, 6773}, {6778, 6791, 6806, 6815, 6828, 6835, 6844, 6853, 6866, 6883, 6898, 6911, 343}, {6926, 6933, 6940, 6947, 678, 6954, 6961, 6968, 6975, 6982, 6989, 6996, 343}, 0, 1, 344, 346, {348,844,1929},{357,6607},{370,1409},{376,1399,2982}}, + {7003, 7025, 3314, 2982, 370, 4272, 1146, 465, 468, {7039, 7048, 7060, 7067, 7075, 7085, 7091}, {7098, 7102, 7106, 7110, 7114, 7119, 7123}, {7127, 7137, 7146, 7154, 7162, 7170, 7177, 7184, 7192, 1587, 7198, 7206, 343}, {7215, 7219, 7223, 7228, 7232, 6186, 7236, 7240, 7244, 6203, 7248, 7252, 343}, 0, 1, 344, 346, {348,7256,3314},{357,7025},{370},{376,2982}}, + {7267, 1379, 7288, 2982, 1409, 447, 1414, 465, 468, {7299, 7307, 7316, 7323, 7330, 7339, 7346}, {7353, 7356, 7359, 7362, 7365, 7369, 2013}, {4373, 4381, 7372, 4672, 7378, 4725, 4730, 1811, 1818, 4452, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 7378, 4725, 4730, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,3314,7288},{357,1379},{370,1409},{376,1399,2982}}, + {7383, 409, 5996, 7407, 7418, 447, 457, 7425, 7428, {7431, 7438, 7447, 7456, 7468, 7476, 7485}, {7495, 7499, 2900, 7504, 7509, 7513, 7517}, {7521, 7527, 3761, 7534, 1797, 7540, 7548, 7555, 7561, 7569, 7575, 7583, 343}, {2118, 7591, 2900, 7595, 7599, 7603, 7607, 7611, 7517, 7615, 7619, 7624, 343}, 0, 1, 344, 346, {348,5515,5996},{357,409},{370,7418},{376,7628,7407}}, + {16460, 7668, 5996, 438, 370, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5996},{357,7668},{370,5955},{376,5944,438}}, {7742, 876, 37, 2982, 1409, 447, 74, 7763, 7794, {7825, 7856, 7884, 7912, 7931, 7965, 7990}, {8015, 8023, 8028, 8033, 8038, 8046, 8051}, {8056, 8075, 8106, 8125, 8144, 8166, 8191, 8213, 8235, 8257, 8276, 8304, 343}, {8326, 8335, 8344, 8356, 8368, 8377, 8389, 8398, 8407, 8416, 8425, 8434, 343}, 0, 0, 344, 346, {348,37},{357,876},{370,1409},{376,8443,2982}}, - {8483, 8510, 1929, 438, 370, 447, 457, 465, 468, {8528, 8534, 8544, 8550, 8561, 8571, 8576}, {8586, 8590, 8594, 8598, 8603, 8607, 8611}, {8615, 8620, 8627, 8632, 8638, 8645, 8653, 8660, 8669, 8676, 8681, 8688, 343}, {8696, 8700, 2900, 8705, 2869, 8709, 8713, 8717, 8722, 8726, 8730, 8734, 343}, 0, 0, 344, 346, {348,1929},{357,8510},{370},{376,438}}, - {16412, 409, 2665, 2982, 1409, 447, 457, 465, 468, {8738, 8745, 8751, 8758, 8763, 8769, 8775}, {8781, 8785, 8789, 8793, 8797, 8801, 8805}, {8809, 8817, 8826, 2055, 8832, 2065, 2070, 8836, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 8853, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,888,2665},{357,409},{370,1409},{376,2982}}, - {8861, 876, 1929, 2982, 370, 8881, 74, 465, 468, {8897, 8910, 8929, 8946, 8959, 8972, 8988}, {9001, 6748, 6753, 6758, 6763, 6768, 6773}, {9006, 9017, 9030, 9045, 9058, 9071, 9084, 9095, 9108, 9123, 9136, 9155, 343}, {9168, 9175, 9182, 9189, 9198, 9207, 9216, 9223, 9232, 9239, 9248, 9257, 343}, 0, 0, 344, 346, {348,844,1929},{357,876},{370},{376,2982}}, - {8861, 876, 1929, 2982, 5955, 447, 74, 465, 468, {9289, 9304, 9325, 9340, 9353, 9366, 9381}, {9394, 9399, 9404, 9409, 9414, 9419, 9424}, {9429, 9446, 9455, 9470, 678, 9487, 9502, 9515, 9530, 9547, 9568, 9585, 343}, {9600, 9175, 9607, 9614, 678, 9621, 9628, 9635, 9232, 9642, 9649, 9656, 343}, 0, 0, 344, 346, {348,1392,1929},{357,876},{370,5955},{376,5944,2982}}, - {9663, 9685, 3314, 2982, 1409, 447, 9699, 465, 468, {9708, 9716, 9727, 9733, 9739, 9748, 1482}, {7098, 7102, 1757, 9754, 7114, 7119, 9758}, {1770, 1777, 7372, 1791, 1797, 9762, 9768, 9774, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 9781, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,9785,3314},{357,9685},{370,1409},{376,1399,2982}}, - {8861, 876, 9792, 2982, 1409, 447, 9802, 465, 468, {9810, 9821, 9832, 9843, 9854, 9865, 9871}, {4367, 9880, 9882, 4358, 6062, 9884, 6473}, {9886, 9894, 9903, 9910, 3772, 9917, 9923, 1811, 1818, 9929, 1836, 9938, 343}, {9948, 9953, 9903, 1866, 3772, 9917, 9923, 1878, 9959, 1886, 1890, 9964, 343}, 0, 0, 344, 346, {348,844,9792},{357,876},{370,1409},{376,1399,2982}}, - {9969, 9998, 4525, 2982, 370, 10019, 1414, 465, 468, {10037, 10048, 10058, 10067, 10078, 10090, 10101}, {10111, 4367, 10114, 9882, 10116, 10118, 6480}, {10121, 10131, 1785, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343}, {2118, 2122, 2900, 2130, 2061, 10221, 10226, 2142, 2146, 2150, 2154, 2908, 343}, 0, 0, 344, 346, {348,10231,4525},{357,9998},{370},{376,2982}}, - {16433, 10271, 7256, 438, 370, 10293, 10308, 465, 468, {10320, 10332, 10344, 10356, 10370, 10385, 10398}, {10412, 10415, 10418, 10421, 10424, 6064, 7365}, {10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343}, {10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343}, 0, 0, 344, 346, {348,7256},{357,10271},{370},{376,438}}, - {10582, 876, 10606, 2970, 370, 447, 74, 10615, 10622, {10629, 10645, 10658, 10674, 10691, 10709, 10718}, {10727, 10731, 10735, 10739, 10743, 10747, 10751}, {10755, 10768, 229, 10779, 10790, 10795, 10804, 10815, 10822, 10837, 10848, 10861, 343}, {10874, 10881, 10888, 10895, 10902, 10909, 10916, 10815, 10923, 10930, 10937, 10944, 343}, 0, 0, 344, 346, {348,10951,10606},{357,876},{370},{376,10961,2970}}, - {10974, 409, 2665, 2186, 370, 447, 457, 10998, 11001, {11004, 11017, 11027, 11036, 11046, 11057, 11068}, {11080, 11083, 11088, 11093, 11098, 11103, 11108}, {11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343}, {11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343}, 0, 0, 344, 346, {348,2665},{357,409},{370},{376,2186}}, - {11350, 2912, 1929, 2982, 370, 447, 2754, 11372, 16464, {11388, 11401, 11422, 11441, 11462, 11481, 11494}, {11505, 11512, 11519, 11526, 11533, 11540, 11547}, {16472, 16487, 11588, 11597, 11608, 16502, 16515, 11645, 11660, 11679, 11698, 11715, 343}, {16528, 16535, 11748, 11755, 11762, 16542, 16549, 11783, 11790, 11797, 11804, 11811, 343}, 0, 0, 344, 346, {348,11818,1929},{357,2912},{370},{376,2982}}, - {16556, 16595, 5006, 438, 370, 16625, 1146, 465, 468, {11827, 11835, 11846, 11856, 11867, 11876, 11885}, {11895, 11898, 11901, 11904, 11907, 11910, 11913}, {11916, 11926, 11934, 11942, 11950, 11958, 11965, 11973, 11981, 11988, 11994, 12001, 343}, {12009, 12013, 1862, 12017, 3772, 12021, 12025, 12029, 12033, 12037, 12041, 12045, 343}, 0, 0, 344, 346, {348,16640,5006},{357,16595},{370},{376,438}}, - {387, 409, 1929, 438, 370, 447, 457, 465, 468, {12049, 484, 505, 6687, 12062, 12079, 12090}, {574, 582, 590, 12103, 12111, 612, 12119}, {12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343}, {12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343}, 0, 0, 344, 346, {348,12229,1929},{357,409},{370},{376,438}}, - {16653, 409, 5006, 2970, 56, 447, 457, 343, 343, {12243, 12250, 12258, 12266, 12275, 12285, 12292}, {2013, 6475, 2019, 12301, 2025, 12304, 2031}, {12307, 12316, 12326, 2055, 8832, 12332, 12338, 12344, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 2142, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,5006},{357,409},{370,56},{376,46,2970}}, - {16678, 1664, 1676, 16699, 370, 447, 457, 465, 468, {4537, 12376, 12387, 12397, 12407, 12417, 12431}, {4623, 4627, 12443, 12448, 12452, 12457, 12462}, {1770, 1777, 3761, 4672, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,1898,1676},{357,1664},{370},{376,16699}}, - {5975, 876, 1676, 438, 56, 447, 74, 12466, 12494, {12516, 12535, 12554, 12576, 12595, 12617, 12642}, {12661, 12671, 12681, 12694, 12704, 12717, 12733}, {12743, 12759, 12775, 12791, 12810, 12817, 12827, 12843, 12859, 12881, 12903, 12922, 343}, {12743, 12759, 12775, 12791, 12810, 12817, 12827, 12843, 12859, 12881, 12903, 12922, 343}, 0, 0, 344, 346, {348,5796,1676},{357,876},{370,56},{376,2676,438}}, - {16708, 357, 10606, 16732, 370, 1136, 1146, 465, 468, {12944, 12953, 12962, 12970, 12979, 12988, 12995}, {13004, 13008, 13012, 13016, 13020, 13024, 13028}, {8809, 8817, 13032, 13038, 8832, 2065, 13045, 13051, 13058, 13067, 13074, 13082, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 13090, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,10606},{357},{370},{376,16732}}, - {16743, 876, 16768, 16776, 16789, 447, 74, 13094, 13136, {13178, 13197, 13216, 13238, 13257, 13279, 13304}, {13323, 13333, 13343, 13356, 13366, 13379, 13395}, {13405, 13433, 13461, 13477, 13496, 13503, 13513, 13529, 13545, 13573, 13595, 13617, 343}, {13642, 13661, 13461, 13477, 13496, 13503, 13513, 13529, 13680, 13696, 13712, 13722, 343}, 0, 0, 344, 346, {348,16768},{357,876},{370,16789},{376,16776}}, - {16797, 876, 5796, 2676, 56, 447, 74, 13735, 13748, {13761, 13780, 13802, 13827, 13843, 13865, 13884}, {13894, 13901, 13908, 13915, 13922, 13929, 13936}, {13940, 13956, 13981, 14000, 14019, 14026, 14039, 14052, 14071, 14102, 14127, 14149, 343}, {14174, 14182, 14196, 14210, 14019, 14026, 14039, 14221, 14229, 14243, 14254, 14262, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}}, - {16797, 876, 1898, 2676, 56, 447, 74, 14273, 14301, {14323, 14345, 14367, 14392, 14414, 14439, 14467}, {14489, 14499, 14509, 14522, 14532, 14545, 14561}, {14571, 14587, 14612, 14631, 14653, 14660, 14673, 14686, 14705, 14736, 14761, 14780, 343}, {14571, 14587, 14612, 14631, 14653, 14660, 14673, 14686, 14705, 14736, 14761, 14780, 343}, 0, 0, 344, 346, {348,1898},{357,876},{370,56},{376,2676}}, - {16743, 876, 5796, 16776, 16789, 447, 74, 14805, 14833, {14855, 14874, 14893, 14915, 14934, 14956, 14981}, {15000, 15005, 15013, 15021, 15029, 15037, 15045}, {15056, 15072, 15097, 15116, 15138, 15145, 15158, 15171, 15190, 15218, 15243, 15265, 343}, {15056, 15072, 15097, 15116, 15138, 15145, 15158, 15171, 15190, 15218, 15243, 15265, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,16789},{376,16776}}, - {16797, 876, 5796, 2676, 56, 447, 74, 15290, 15302, {12516, 12535, 15314, 12576, 12595, 12617, 12642}, {12661, 12671, 15336, 12694, 12704, 12717, 12733}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}}, - {4750, 409, 888, 376, 370, 447, 457, 465, 468, {15554, 15562, 15567, 15574, 15584, 15590, 15597}, {15605, 15609, 2900, 15613, 15618, 15622, 15626}, {15631, 15639, 15648, 15654, 15660, 15665, 15671, 15677, 15684, 15693, 15701, 15710, 343}, {15719, 2122, 2900, 15723, 2061, 15727, 15732, 13090, 15736, 15740, 2154, 2908, 343}, 0, 0, 344, 346, {348,888},{357,409},{370},{376}}, - {16797, 876, 5796, 2676, 56, 447, 74, 15290, 15302, {15744, 12535, 15772, 12576, 12595, 12617, 12642}, {12661, 12671, 15336, 12694, 12704, 12717, 12733}, {15349, 15791, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}}, - {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37},{357,24},{370,56},{376,46}}, - {16821, 4984, 16866, 16873, 16896, 5017, 5033, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,16866},{357,4984},{370,16896},{376,16873}}, - {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379},{370},{376,438}}, - {5975, 876, 2665, 438, 370, 447, 74, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,2665},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438,376}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {8861, 876, 3859, 2982, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264},{357,876,3640},{370},{376,438,2982}}, - {5975, 876, 1929, 438, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 0, 344, 346, {348,888,844,1929},{357,409,876},{370},{376,438}}, - {8861, 876, 3859, 2982, 370, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5796,3264,3859},{357,876},{370,1409},{376,1399,2982}}, - {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}}, - {16902, 3024, 1676, 2982, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 0, 344, 346, {348,1676},{357,3024},{370},{376,2982}}, - {16386, 7668, 3314, 438, 5955, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5996,3314},{357,7668},{370,5955},{376,5944,438}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {16957, 5315, 17004, 15867, 16896, 17024, 17041, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, 0, 0, 344, 346, {348,17004},{357,5315},{370,16896},{376,15867}}, - {17056, 9685, 1929, 438, 370, 447, 9699, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {17079, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {17087, 2122, 17092, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379,9685},{370},{376,438}}, - {17097, 876, 3859, 2186, 56, 447, 74, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,3264,3859},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}}, - {17120, 17157, 2665, 2982, 1409, 17186, 457, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024,17157},{370,1409},{376,2970,2982}}, + {8483, 8510, 1929, 438, 370, 447, 457, 465, 468, {8528, 8534, 8544, 8550, 8561, 8571, 8576}, {8586, 8590, 8594, 8598, 8603, 8607, 8611}, {8615, 8620, 8627, 8632, 8638, 8645, 8653, 8660, 8669, 8676, 8681, 8688, 343}, {8696, 8700, 2900, 8705, 2869, 8709, 8713, 8717, 8722, 8726, 8730, 8734, 343}, 0, 1, 344, 346, {348,1929},{357,8510},{370},{376,438}}, + {16486, 409, 2665, 2982, 1409, 447, 457, 465, 468, {8738, 8745, 8751, 8758, 8763, 8769, 8775}, {8781, 8785, 8789, 8793, 8797, 8801, 8805}, {8809, 8817, 8826, 2055, 8832, 2065, 2070, 8836, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 8853, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,888,2665},{357,409},{370,1409},{376,2982}}, + {8861, 876, 1929, 2982, 370, 8881, 74, 465, 468, {8897, 8910, 8929, 8946, 8959, 8972, 8988}, {9001, 6748, 6753, 6758, 6763, 6768, 6773}, {9006, 9017, 9030, 9045, 9058, 9071, 9084, 9095, 9108, 9123, 9136, 9155, 343}, {9168, 9175, 9182, 9189, 9198, 9207, 9216, 9223, 9232, 9239, 9248, 9257, 343}, 0, 1, 344, 346, {348,844,1929},{357,876},{370},{376,2982}}, + {8861, 876, 1929, 2982, 5955, 447, 74, 465, 468, {9289, 9304, 9325, 9340, 9353, 9366, 9381}, {9394, 9399, 9404, 9409, 9414, 9419, 9424}, {9429, 9446, 9455, 9470, 678, 9487, 9502, 9515, 9530, 9547, 9568, 9585, 343}, {9600, 9175, 9607, 9614, 678, 9621, 9628, 9635, 9232, 9642, 9649, 9656, 343}, 0, 1, 344, 346, {348,1392,1929},{357,876},{370,5955},{376,5944,2982}}, + {9663, 9685, 3314, 2982, 1409, 447, 9699, 465, 468, {9708, 9716, 9727, 9733, 9739, 9748, 1482}, {7098, 7102, 1757, 9754, 7114, 7119, 9758}, {1770, 1777, 7372, 1791, 1797, 9762, 9768, 9774, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 9781, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,9785,3314},{357,9685},{370,1409},{376,1399,2982}}, + {8861, 876, 9792, 2982, 1409, 447, 9802, 465, 468, {9810, 9821, 9832, 9843, 9854, 9865, 9871}, {4367, 9880, 9882, 4358, 6062, 9884, 6473}, {9886, 9894, 9903, 9910, 3772, 9917, 9923, 1811, 1818, 9929, 1836, 9938, 343}, {9948, 9953, 9903, 1866, 3772, 9917, 9923, 1878, 9959, 1886, 1890, 9964, 343}, 0, 1, 344, 346, {348,844,9792},{357,876},{370,1409},{376,1399,2982}}, + {9969, 9998, 4525, 2982, 370, 10019, 1414, 465, 468, {10037, 10048, 10058, 10067, 10078, 10090, 10101}, {10111, 4367, 10114, 9882, 10116, 10118, 6480}, {10121, 10131, 1785, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343}, {2118, 2122, 2900, 2130, 2061, 10221, 10226, 2142, 2146, 2150, 2154, 2908, 343}, 0, 1, 344, 346, {348,10231,4525},{357,9998},{370},{376,2982}}, + {16507, 10271, 7256, 438, 370, 10293, 10308, 465, 468, {10320, 10332, 10344, 10356, 10370, 10385, 10398}, {10412, 10415, 10418, 10421, 10424, 6064, 7365}, {10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343}, {10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343}, 0, 1, 344, 346, {348,7256},{357,10271},{370},{376,438}}, + {10582, 876, 10606, 2970, 370, 447, 74, 10615, 10622, {10629, 10645, 10658, 10674, 10691, 10709, 10718}, {10727, 10731, 10735, 10739, 10743, 10747, 10751}, {10755, 10768, 229, 10779, 10790, 10795, 10804, 10815, 10822, 10837, 10848, 10861, 343}, {10874, 10881, 10888, 10895, 10902, 10909, 10916, 10815, 10923, 10930, 10937, 10944, 343}, 0, 6, 344, 346, {348,10951,10606},{357,876},{370},{376,10961,2970}}, + {10974, 409, 2665, 2186, 370, 447, 457, 10998, 11001, {11004, 11017, 11027, 11036, 11046, 11057, 11068}, {11080, 11083, 11088, 11093, 11098, 11103, 11108}, {11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343}, {11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343}, 0, 1, 344, 346, {348,2665},{357,409},{370},{376,2186}}, + {11350, 2912, 1929, 2982, 370, 447, 2754, 11372, 16538, {11388, 11401, 11422, 11441, 11462, 11481, 11494}, {11505, 11512, 11519, 11526, 11533, 11540, 11547}, {16546, 16561, 11588, 11597, 11608, 16576, 16589, 11645, 11660, 11679, 11698, 11715, 343}, {16602, 16609, 11748, 11755, 11762, 16616, 16623, 11783, 11790, 11797, 11804, 11811, 343}, 0, 1, 344, 346, {348,11818,1929},{357,2912},{370},{376,2982}}, + {16630, 16669, 5006, 438, 370, 16699, 1146, 465, 468, {11827, 11835, 11846, 11856, 11867, 11876, 11885}, {11895, 11898, 11901, 11904, 11907, 11910, 11913}, {11916, 11926, 11934, 11942, 11950, 11958, 11965, 11973, 11981, 11988, 11994, 12001, 343}, {12009, 12013, 1862, 12017, 3772, 12021, 12025, 12029, 12033, 12037, 12041, 12045, 343}, 0, 1, 344, 346, {348,16714,5006},{357,16669},{370},{376,438}}, + {387, 409, 1929, 438, 370, 447, 457, 465, 468, {12049, 484, 505, 6687, 12062, 12079, 12090}, {574, 582, 590, 12103, 12111, 612, 12119}, {12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343}, {12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343}, 0, 1, 344, 346, {348,12229,1929},{357,409},{370},{376,438}}, + {16727, 409, 5006, 2970, 56, 447, 457, 343, 343, {12243, 12250, 12258, 12266, 12275, 12285, 12292}, {2013, 6475, 2019, 12301, 2025, 12304, 2031}, {12307, 12316, 12326, 2055, 8832, 12332, 12338, 12344, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 2142, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,5006},{357,409},{370,56},{376,46,2970}}, + {16752, 16792, 1929, 2982, 1409, 12382, 1146, 12389, 12405, {5217, 5219, 5221, 5223, 5225, 5227, 5229}, {5217, 5219, 5221, 5223, 5225, 5227, 5229}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, 0, 0, 344, 346, {348,1929},{357,12373,16792},{370,1409},{376,2982}}, + {16824, 1664, 1676, 16845, 370, 447, 457, 465, 468, {4537, 12450, 12461, 12471, 12481, 12491, 12505}, {4623, 4627, 12517, 12522, 12526, 12531, 12536}, {1770, 1777, 3761, 4672, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,1898,1676},{357,1664},{370},{376,16845}}, + {5975, 876, 1676, 438, 56, 447, 74, 12540, 12568, {12590, 12609, 12628, 12650, 12669, 12691, 12716}, {12735, 12745, 12755, 12768, 12778, 12791, 12807}, {12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343}, {12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343}, 0, 0, 344, 346, {348,5796,1676},{357,876},{370,56},{376,2676,438}}, + {16854, 357, 10606, 16878, 370, 1136, 1146, 465, 468, {13018, 13027, 13036, 13044, 13053, 13062, 13069}, {13078, 13082, 13086, 13090, 13094, 13098, 13102}, {8809, 8817, 13106, 13112, 8832, 2065, 13119, 13125, 13132, 13141, 13148, 13156, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 13164, 2146, 2150, 2154, 8857, 343}, 0, 6, 344, 346, {348,10606},{357},{370},{376,16878}}, + {16889, 876, 16914, 16922, 16935, 447, 74, 13168, 13210, {13252, 13271, 13290, 13312, 13331, 13353, 13378}, {13397, 13407, 13417, 13430, 13440, 13453, 13469}, {13479, 13507, 13535, 13551, 13570, 13577, 13587, 13603, 13619, 13647, 13669, 13691, 343}, {13716, 13735, 13535, 13551, 13570, 13577, 13587, 13603, 13754, 13770, 13786, 13796, 343}, 0, 0, 344, 346, {348,16914},{357,876},{370,16935},{376,16922}}, + {16943, 876, 5796, 2676, 56, 447, 74, 13809, 13822, {13835, 13854, 13876, 13901, 13917, 13939, 13958}, {13968, 13975, 13982, 13989, 13996, 14003, 14010}, {14014, 14030, 14055, 14074, 14093, 14100, 14113, 14126, 14145, 14176, 14201, 14223, 343}, {14248, 14256, 14270, 14284, 14093, 14100, 14113, 14295, 14303, 14317, 14328, 14336, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}}, + {16943, 876, 1898, 2676, 56, 447, 74, 14347, 14375, {14397, 14419, 14441, 14466, 14488, 14513, 14541}, {14563, 14573, 14583, 14596, 14606, 14619, 14635}, {14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343}, {14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343}, 0, 0, 344, 346, {348,1898},{357,876},{370,56},{376,2676}}, + {16889, 876, 5796, 16922, 16935, 447, 74, 14879, 14907, {14929, 14948, 14967, 14989, 15008, 15030, 15055}, {15074, 15079, 15087, 15095, 15103, 15111, 15119}, {15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343}, {15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,16935},{376,16922}}, + {16943, 876, 5796, 2676, 56, 447, 74, 15364, 15376, {12590, 12609, 15388, 12650, 12669, 12691, 12716}, {12735, 12745, 15410, 12768, 12778, 12791, 12807}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}}, + {4750, 409, 888, 376, 370, 447, 457, 465, 468, {15628, 15636, 15641, 15648, 15658, 15664, 15671}, {15679, 15683, 2900, 15687, 15692, 15696, 15700}, {15705, 15713, 15722, 15728, 15734, 15739, 15745, 15751, 15758, 15767, 15775, 15784, 343}, {15793, 2122, 2900, 15797, 2061, 15801, 15806, 13164, 15810, 15814, 2154, 2908, 343}, 0, 1, 344, 346, {348,888},{357,409},{370},{376}}, + {16943, 876, 5796, 2676, 56, 447, 74, 15364, 15376, {15818, 12609, 15846, 12650, 12669, 12691, 12716}, {12735, 12745, 15410, 12768, 12778, 12791, 12807}, {15423, 15865, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}}, + {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37},{357,24},{370,56},{376,46}}, + {16967, 4984, 17012, 17019, 17042, 5017, 5033, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,17012},{357,4984},{370,17042},{376,17019}}, + {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379},{370},{376,438}}, + {5975, 876, 2665, 438, 370, 447, 74, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 1, 344, 346, {348,2739,2665},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438,376}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {8861, 876, 3859, 2982, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 1, 344, 346, {888,3859,3264},{357,876,3640},{370},{376,438,2982}}, + {5975, 876, 1929, 438, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 1, 344, 346, {348,888,844,1929},{357,409,876},{370},{376,438}}, + {8861, 876, 3859, 2982, 370, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5796,3264,3859},{357,876},{370,1409},{376,1399,2982}}, + {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 1, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}}, + {17048, 3024, 1676, 2982, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 1, 344, 346, {348,1676},{357,3024},{370},{376,2982}}, + {16460, 7668, 3314, 438, 5955, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5996,3314},{357,7668},{370,5955},{376,5944,438}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {17103, 5315, 17150, 15941, 17042, 17170, 17187, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, 0, 0, 344, 346, {348,17150},{357,5315},{370,17042},{376,15941}}, + {17202, 9685, 1929, 438, 370, 447, 9699, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {17225, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {17233, 2122, 17238, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379,9685},{370},{376,438}}, + {17243, 876, 3859, 2186, 56, 447, 74, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,3264,3859},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}}, + {17266, 17303, 2665, 2982, 1409, 17332, 457, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024,17303},{370,1409},{376,2970,2982}}, {5975, 876, 5996, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264,5515,5996},{357,876,3640},{370},{376,438}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {17201, 17224, 888, 17236, 17247, 447, 457, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,888},{357,17224},{370,17247},{376,17236}}, - {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379},{370},{376,438}}, - {17255, 17279, 2665, 2186, 56, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,888,2665},{2719,2719,2912,2926,2946,17279},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,2676}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,2665},{357,3024},{370,16789},{376,2970,16776}}, - {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264,844,1929},{357,876,3640},{370},{376,438}}, - {17292, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}}, - {16957, 5315, 17004, 15867, 16896, 17024, 17041, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, 0, 0, 344, 346, {348,17004},{357,5315},{370,16896},{376,15867}}, - {17097, 876, 3859, 2186, 56, 447, 74, 3074, 3079, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,3264,3859},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {3614, 3640, 2665, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264,2665},{357,876,3640},{370},{376,438}}, - {17292, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {17347, 17370, 888, 17382, 17393, 447, 457, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,888},{357,17370},{370,17393},{376,17382}}, + {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379},{370},{376,438}}, + {17401, 17425, 2665, 2186, 56, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,888,2665},{2719,2719,2912,2926,2946,17425},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,2676}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,2665},{357,3024},{370,16935},{376,2970,16922}}, + {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 1, 344, 346, {888,3859,3264,844,1929},{357,876,3640},{370},{376,438}}, + {17438, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}}, + {17103, 5315, 17150, 15941, 17042, 17170, 17187, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, 0, 0, 344, 346, {348,17150},{357,5315},{370,17042},{376,15941}}, + {17243, 876, 3859, 2186, 56, 447, 74, 3074, 3079, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,3264,3859},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {3614, 3640, 2665, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 1, 344, 346, {888,3859,3264,2665},{357,876,3640},{370},{376,438}}, + {17438, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}}, {5975, 876, 2665, 438, 370, 447, 74, 3074, 3079, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,2665},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438,376}}, - {2990, 3024, 3046, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,11818},{357,3024},{370,16789},{376,2970,16776}}, - {17292, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}}, - {16653, 409, 5006, 2970, 56, 447, 457, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,5006},{2719,2719,2912,2926,2946,409},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {2990, 3024, 2665, 2970, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,2665},{357,3024},{370,1409},{376,2970,1399}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17313, 17337, 17346, 17355, 17366, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, {17313, 17337, 17346, 17355, 17366, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17313, 17337, 17346, 17355, 17481, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, {17313, 17337, 17346, 17355, 17481, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {2990, 3024, 2665, 2970, 370, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370},{376,2970,1399}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17313, 17337, 17346, 17355, 17366, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, {17313, 17337, 17346, 17355, 17366, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {2990, 3024, 3046, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,11818},{357,3024},{370,16935},{376,2970,16922}}, + {17438, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}}, + {16727, 409, 5006, 2970, 56, 447, 457, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,5006},{2719,2719,2912,2926,2946,409},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {2990, 3024, 2665, 2970, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,2665},{357,3024},{370,1409},{376,2970,1399}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, {17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, 0, 4, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17459, 17483, 17492, 17501, 17627, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, {17459, 17483, 17492, 17501, 17627, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {2990, 3024, 2665, 2970, 370, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370},{376,2970,1399}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, {17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, {2162, 409, 10606, 2186, 56, 447, 457, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,37,10606},{2719,2719,2912,2926,2946,409},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}}, - {16902, 3024, 2665, 2982, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,1409},{376,2970,1399,2982}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {17255, 17279, 10606, 2186, 56, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,10606},{2719,2719,2912,2926,2946,17279},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,2676}}, - {16902, 3024, 1676, 2982, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,1898,1676},{357,3024},{370,1409},{376,2970,1399,2982}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {17490, 17525, 2665, 2970, 16789, 3057, 17548, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024,17525},{370,16789},{376,2970,16776}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}}, - {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,11818,2665},{357,3024},{370,16789},{376,2970,16776}}, + {17048, 3024, 2665, 2982, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,1409},{376,2970,1399,2982}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {17401, 17425, 10606, 2186, 56, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,10606},{2719,2719,2912,2926,2946,17425},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,2676}}, + {17048, 3024, 1676, 2982, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,1898,1676},{357,3024},{370,1409},{376,2970,1399,2982}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {17636, 17671, 2665, 2970, 16935, 3057, 17694, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024,17671},{370,16935},{376,2970,16922}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}}, + {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,11818,2665},{357,3024},{370,16935},{376,2970,16922}}, {1112, 357, 348, 376, 370, 1136, 1146, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348},{357},{370},{376}} }; static const NumberFormatEntry number_format_entries [] = { - {17561, 17564, 17561, 17564, 17561, 17564, 0, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 2, 2, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17623, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17633, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17643, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17647, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 1, 1, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17656, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17660, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17663, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17667, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17669, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17673, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17677, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17681, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17685, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17689, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 10412, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17692, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17696, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17700, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17703, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17706, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17714, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17718, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17721, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {2, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17724, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 0, 3, 2, 2, 1, 0, 2, 2, {5, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17728, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17731, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 0, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 9884, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 12, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17735, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17742, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17746, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17753, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17760, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17735, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17735, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17735, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17768, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17778, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17782, 17598, 17782, 17598, 17782, 17784, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17789, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17782, 17598, 17782, 17598, 17782, 17784, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17792, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17802, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17593, 17591, 17593, 17591, 17593, 17654, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17806, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17816, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17819, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17782, 17598, 17782, 17598, 17782, 17821, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17826, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 4367, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17836, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17840, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17639, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17850, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17853, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 9884, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17863, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17867, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17877, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 12, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17880, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17654, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17890, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17900, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17903, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17654, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17913, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17923, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17926, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17930, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17940, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17654, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17944, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17954, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17958, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17968, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 12, 2, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17561, 17564, 17561, 17564, 17561, 17564, 17971, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17591, 17598, 17591, 17598, 17591, 17598, 17981, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17984, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17988, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17991, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, - {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}} + {17707, 17710, 17707, 17710, 17707, 17710, 0, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 2, 2, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17746, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 17769, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17779, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17789, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17793, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 1, 1, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17802, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17806, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17809, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17813, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17815, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17819, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17823, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17827, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17831, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17835, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 10412, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17838, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17842, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17846, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17849, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17852, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17860, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17864, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17867, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {2, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 17870, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 0, 3, 2, 2, 1, 0, 2, 2, {5, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17874, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17877, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 0, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 9884, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17746, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 12, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17881, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17888, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17892, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17899, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17906, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17881, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17881, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17881, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 17914, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17924, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17928, 17744, 17928, 17744, 17928, 17930, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17935, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17928, 17744, 17928, 17744, 17928, 17930, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 17938, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17948, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17739, 17737, 17739, 17737, 17739, 17800, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 17952, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17962, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17965, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17928, 17744, 17928, 17744, 17928, 17967, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 17972, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 4367, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17982, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 17986, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17785, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17996, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 17999, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 9884, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 18009, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 18013, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 18023, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 12, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 18026, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17800, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 18036, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 18046, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 18049, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17800, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 18059, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 18069, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 18072, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 18076, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 18086, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 17800, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 18090, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 18100, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 18104, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 18114, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 12, 2, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17707, 17710, 17707, 17710, 17707, 17710, 18117, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17737, 17744, 17737, 17744, 17737, 17744, 18127, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 18130, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 18134, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 18137, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}, + {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}} }; static const CultureInfoEntry culture_entries [] = { - {0x0001, 0x007F, 0x0401, -1,17994, 17997, 17997, 17997, 18004, 18019, 18023, 17994, 0, {16777216, 0, 0, 0, 0}, 0, 0, { 1256, 20420, 10004, 720, ';' }}, - {0x0002, 0x007F, 0x0402, -1,18027, 18030, 18030, 18030, 18040, 18059, 18063, 18027, 0, {0, 0, 0, 0, 0}, 1, 1, { 1251, 20420, 10007, 866, ';' }}, - {0x0003, 0x007F, 0x0403, -1,18067, 18070, 18070, 18070, 18078, 18086, 18090, 18067, 0, {0, 0, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, ';' }}, - {0x0004, 0x007F, 0x0000, -1,18094, 18101, 18101, 18101, 18109, 18116, 18120, 18124, 0, {0, 0, 0, 0, 0}, 163, 163, { 936, 500, 10008, 936, ',' }}, - {0x0005, 0x007F, 0x0405, -1,18127, 18130, 18130, 18130, 18136, 18146, 18150, 18127, 0, {0, 0, 0, 0, 0}, 4, 4, { 1250, 500, 10029, 852, ';' }}, - {0x0006, 0x007F, 0x0406, -1,18154, 18157, 18157, 18157, 18164, 18170, 18174, 18154, 0, {0, 0, 0, 0, 0}, 5, 5, { 1252, 20277, 10000, 850, ';' }}, - {0x0007, 0x007F, 0x0407, -1,18178, 18181, 18181, 18181, 18188, 18196, 18200, 18178, 0, {0, 0, 0, 0, 0}, 6, 6, { 1252, 20273, 10000, 850, ';' }}, - {0x0008, 0x007F, 0x0408, -1,18204, 18207, 18207, 18207, 18213, 18230, 18234, 18204, 0, {0, 0, 0, 0, 0}, 7, 7, { 1253, 20273, 10006, 737, ';' }}, - {0x0009, 0x007F, 0x0409, -1,18238, 18241, 18241, 18241, 18241, 18249, 18253, 18238, 0, {0, 0, 0, 0, 0}, 8, 8, { 1252, 37, 10000, 437, ',' }}, - {0x000A, 0x007F, 0x0C0A, -1,18257, 18260, 18260, 18260, 18268, 18277, 18281, 18257, 0, {0, 0, 0, 0, 0}, 9, 9, { 1252, 20284, 10000, 850, ';' }}, - {0x000B, 0x007F, 0x040B, -1,18285, 18288, 18288, 18288, 18296, 18302, 18306, 18285, 0, {0, 0, 0, 0, 0}, 10, 10, { 1252, 20278, 10000, 850, ';' }}, - {0x000C, 0x007F, 0x040C, -1,5968, 18310, 18310, 18310, 18317, 18327, 18331, 5968, 0, {0, 0, 0, 0, 0}, 11, 11, { 1252, 20297, 10000, 850, ';' }}, - {0x000D, 0x007F, 0x040D, -1,18335, 18338, 18338, 18338, 18345, 18356, 18360, 18335, 0, {0, 0, 0, 0, 0}, 12, 12, { 1255, 500, 10005, 862, ',' }}, - {0x000E, 0x007F, 0x040E, -1,18364, 18367, 18367, 18367, 18377, 18384, 18388, 18364, 0, {0, 0, 0, 0, 0}, 13, 13, { 1250, 500, 10029, 852, ';' }}, - {0x000F, 0x007F, 0x040F, -1,18392, 18395, 18395, 18395, 18405, 18415, 18419, 18392, 0, {0, 0, 0, 0, 0}, 14, 14, { 1252, 20871, 10079, 850, ';' }}, - {0x0010, 0x007F, 0x0410, -1,18423, 18426, 18426, 18426, 18434, 18443, 18447, 18423, 0, {0, 0, 0, 0, 0}, 15, 15, { 1252, 20280, 10000, 850, ';' }}, - {0x0011, 0x007F, 0x0411, -1,18451, 18454, 18454, 18454, 18463, 18473, 18477, 18451, 0, {0, 0, 0, 0, 0}, 16, 16, { 932, 20290, 10001, 932, ',' }}, - {0x0012, 0x007F, 0x0412, -1,18481, 18484, 18484, 18484, 18491, 18501, 18505, 18481, 0, {0, 0, 0, 0, 0}, 17, 17, { 949, 20833, 10003, 949, ',' }}, - {0x0013, 0x007F, 0x0413, -1,18509, 18512, 18512, 18512, 18518, 18529, 18533, 18509, 0, {0, 0, 0, 0, 0}, 18, 18, { 1252, 500, 10000, 850, ';' }}, - {0x0014, 0x007F, 0x0414, -1,18537, 18540, 18540, 18540, 18550, 18556, 18560, 18537, 0, {0, 0, 0, 0, 0}, 19, 19, { 1252, 20277, 10000, 850, ';' }}, - {0x0015, 0x007F, 0x0415, -1,18564, 18567, 18567, 18567, 18574, 18581, 18585, 18564, 0, {0, 0, 0, 0, 0}, 20, 20, { 1250, 20880, 10029, 852, ';' }}, - {0x0016, 0x007F, 0x0416, -1,18589, 18592, 18592, 18592, 18603, 18614, 18618, 18589, 0, {0, 0, 0, 0, 0}, 21, 21, { 1252, 500, 10000, 850, ';' }}, - {0x0018, 0x007F, 0x0418, -1,18622, 18625, 18625, 18625, 18634, 18643, 18647, 18622, 0, {0, 0, 0, 0, 0}, 22, 22, { 1250, 20880, 10029, 852, ';' }}, - {0x0019, 0x007F, 0x0419, -1,18651, 18654, 18654, 18654, 18662, 18677, 18681, 18651, 0, {0, 0, 0, 0, 0}, 23, 23, { 1251, 20880, 10007, 866, ';' }}, - {0x001A, 0x007F, 0x041A, -1,18685, 18688, 18688, 18688, 18697, 18706, 18710, 18685, 0, {0, 0, 0, 0, 0}, 24, 24, { 1250, 500, 10082, 852, ';' }}, - {0x001B, 0x007F, 0x041B, -1,18714, 18717, 18717, 18717, 18724, 18735, 18739, 18714, 0, {0, 0, 0, 0, 0}, 25, 25, { 1250, 20880, 10029, 852, ';' }}, - {0x001C, 0x007F, 0x041C, -1,18743, 18746, 18746, 18746, 18755, 18762, 18766, 18743, 0, {0, 0, 0, 0, 0}, 26, 26, { 1250, 20880, 10029, 852, ';' }}, - {0x001D, 0x007F, 0x041D, -1,18770, 18773, 18773, 18773, 18781, 18789, 18793, 18770, 0, {0, 0, 0, 0, 0}, 27, 27, { 1252, 20278, 10000, 850, ';' }}, - {0x001E, 0x007F, 0x041E, -1,18797, 18800, 18800, 18800, 18805, 18815, 18819, 18797, 0, {0, 0, 0, 0, 0}, 28, 28, { 874, 20838, 10021, 874, ',' }}, - {0x001F, 0x007F, 0x041F, -1,18823, 18826, 18826, 18826, 18834, 18843, 18847, 18823, 0, {0, 0, 0, 0, 0}, 29, 29, { 1254, 20905, 10081, 857, ';' }}, - {0x0021, 0x007F, 0x0421, -1,18851, 18854, 18854, 18854, 18865, 18882, 18886, 18851, 0, {0, 0, 0, 0, 0}, 30, 30, { 1252, 500, 10000, 850, ';' }}, - {0x0022, 0x007F, 0x0422, -1,18890, 18893, 18893, 18893, 18903, 18924, 18928, 18890, 0, {0, 0, 0, 0, 0}, 31, 31, { 1251, 500, 10017, 866, ';' }}, - {0x0023, 0x007F, 0x0423, -1,18932, 18935, 18935, 18935, 18946, 18965, 18969, 18932, 0, {0, 0, 0, 0, 0}, 32, 32, { 1251, 500, 10007, 866, ';' }}, - {0x0024, 0x007F, 0x0424, -1,18973, 18976, 18976, 18976, 18986, 19000, 19004, 18973, 0, {0, 0, 0, 0, 0}, 33, 33, { 1250, 20880, 10029, 852, ';' }}, - {0x0025, 0x007F, 0x0425, -1,19008, 19011, 19011, 19011, 19020, 19026, 19030, 19008, 0, {0, 0, 0, 0, 0}, 34, 34, { 1257, 500, 10029, 775, ';' }}, - {0x0026, 0x007F, 0x0426, -1,19034, 19037, 19037, 19037, 19045, 19055, 19059, 19034, 0, {0, 0, 0, 0, 0}, 35, 35, { 1257, 500, 10029, 775, ';' }}, - {0x0027, 0x007F, 0x0427, -1,19063, 19066, 19066, 19066, 19077, 19087, 19091, 19063, 0, {0, 0, 0, 0, 0}, 36, 36, { 1257, 500, 10029, 775, ';' }}, - {0x0029, 0x007F, 0x0429, -1,19095, 19098, 19098, 19098, 19106, 19117, 19121, 19095, 0, {0, 0, 0, 0, 0}, 37, 37, { 1256, 20420, 10004, 720, ';' }}, - {0x002A, 0x007F, 0x042A, -1,19125, 19128, 19128, 19128, 19139, 19154, 3156, 19125, 0, {0, 0, 0, 0, 0}, 38, 38, { 1258, 500, 10000, 1258, ',' }}, - {0x002B, 0x007F, 0x042B, -1,19158, 19161, 19161, 19161, 19170, 19185, 19189, 19158, 0, {0, 0, 0, 0, 0}, 39, 39, { 0, 500, 2, 1, ',' }}, - {0x002D, 0x007F, 0x042D, -1,19193, 19196, 19196, 19196, 19203, 19211, 19215, 19193, 0, {0, 0, 0, 0, 0}, 40, 40, { 1252, 500, 10000, 850, ';' }}, - {0x002F, 0x007F, 0x042F, -1,19219, 19222, 19222, 19222, 19233, 19254, 19258, 19219, 0, {0, 0, 0, 0, 0}, 41, 41, { 1251, 500, 10007, 866, ';' }}, - {0x0036, 0x007F, 0x0436, -1,19262, 19265, 19265, 19265, 19275, 19286, 19290, 19262, 0, {0, 0, 0, 0, 0}, 42, 42, { 1252, 500, 10000, 850, ',' }}, - {0x0038, 0x007F, 0x0438, -1,19294, 19297, 19297, 19297, 19305, 19315, 19319, 19294, 0, {0, 0, 0, 0, 0}, 43, 43, { 1252, 20277, 10079, 850, ';' }}, - {0x0039, 0x007F, 0x0439, -1,19323, 19326, 19326, 19326, 19332, 19348, 19352, 19323, 0, {0, 0, 0, 0, 0}, 44, 44, { 0, 500, 2, 1, ',' }}, - {0x0041, 0x007F, 0x0441, -1,19356, 19359, 19359, 19359, 19367, 19377, 19381, 19356, 0, {0, 0, 0, 0, 0}, 45, 45, { 1252, 500, 10000, 437, ',' }}, - {0x0047, 0x007F, 0x0447, -1,19385, 19388, 19388, 19388, 19397, 19419, 19423, 19385, 0, {0, 0, 0, 0, 0}, 46, 46, { 0, 500, 2, 1, ',' }}, - {0x0049, 0x007F, 0x0449, -1,19427, 19430, 19430, 19430, 19436, 19452, 19456, 19427, 0, {0, 0, 0, 0, 0}, 47, 47, { 0, 500, 2, 1, ',' }}, - {0x004A, 0x007F, 0x044A, -1,19460, 19463, 19463, 19463, 19470, 19489, 19493, 19460, 0, {0, 0, 0, 0, 0}, 48, 48, { 0, 500, 2, 1, ',' }}, - {0x004B, 0x007F, 0x044B, -1,19497, 19500, 19500, 19500, 19508, 19524, 19528, 19497, 0, {0, 0, 0, 0, 0}, 49, 49, { 0, 500, 2, 1, ',' }}, - {0x004E, 0x007F, 0x044E, -1,19532, 19535, 19535, 19535, 19543, 19559, 1862, 19532, 0, {0, 0, 0, 0, 0}, 50, 50, { 0, 500, 2, 1, ',' }}, - {0x0056, 0x007F, 0x0456, -1,19563, 19566, 19566, 19566, 19575, 19582, 19586, 19563, 0, {0, 0, 0, 0, 0}, 51, 51, { 1252, 500, 10000, 850, ',' }}, - {0x0057, 0x007F, 0x0457, -1,19590, 19594, 19594, 19594, 19602, 19621, 19590, 19323, 0, {0, 0, 0, 0, 0}, 52, 52, { 0, 500, 2, 1, ',' }}, - {0x0401, 0x0001, 0x0401, 174,19625, 19631, 19631, 19631, 19653, 18019, 18023, 17994, 10998, {16777216, 0, 0, 0, 0}, 53, 53, { 1256, 20420, 10004, 720, ';' }}, - {0x0402, 0x0002, 0x0402, 19,19702, 19708, 19708, 19708, 19729, 18059, 18063, 18027, 19767, {0, 0, 0, 0, 0}, 54, 54, { 1251, 20420, 10007, 866, ';' }}, - {0x0403, 0x0003, 0x0403, 61,19770, 19776, 19776, 19776, 19792, 18086, 18090, 18067, 19810, {0, 0, 0, 0, 0}, 55, 55, { 1252, 500, 10000, 850, ';' }}, - {0x0404, 0x7C04, 0x0404, 207,19813, 19819, 19819, 19819, 19836, 19852, 18120, 18124, 19856, {0, 0, 0, 0, 0}, 56, 56, { 950, 500, 10002, 950, ',' }}, - {0x0405, 0x0005, 0x0405, 49,19859, 19865, 19865, 19865, 19888, 18146, 18150, 18127, 19918, {0, 0, 0, 0, 0}, 57, 57, { 1250, 500, 10029, 852, ';' }}, - {0x0406, 0x0006, 0x0406, 52,19921, 19927, 19927, 19927, 19944, 18170, 18174, 18154, 19960, {0, 0, 0, 0, 0}, 58, 58, { 1252, 20277, 10000, 850, ';' }}, - {0x0407, 0x0007, 0x0407, 50,19963, 19969, 19969, 19969, 19986, 18196, 18200, 18178, 4291, {0, 0, 0, 0, 0}, 59, 59, { 1252, 20273, 10000, 850, ';' }}, - {0x0408, 0x0008, 0x0408, 81,20008, 20014, 20014, 20014, 20029, 18230, 18234, 18204, 20061, {0, 0, 0, 0, 0}, 60, 60, { 1253, 20273, 10006, 737, ';' }}, - {0x0409, 0x0009, 0x0409, 212,20064, 20070, 20070, 20070, 20070, 18249, 18253, 18238, 20094, {0, 0, 0, 0, 0}, 61, 61, { 1252, 37, 10000, 437, ',' }}, - {0x040B, 0x000B, 0x040B, 63,20097, 20103, 20103, 20103, 20121, 18302, 18306, 18285, 20135, {0, 0, 0, 0, 0}, 62, 62, { 1252, 20278, 10000, 850, ';' }}, - {0x040C, 0x000C, 0x040C, 68,20138, 20144, 20144, 20144, 20160, 18327, 18331, 5968, 20179, {0, 0, 0, 0, 0}, 63, 63, { 1252, 20297, 10000, 850, ';' }}, - {0x040D, 0x000D, 0x040D, 92,20182, 20188, 20188, 20188, 20204, 18356, 18360, 18335, 20228, {0, 0, 0, 0, 0}, 64, 64, { 1255, 500, 10005, 862, ',' }}, - {0x040E, 0x000E, 0x040E, 89,20231, 20237, 20237, 20237, 20257, 18384, 18388, 18364, 20280, {0, 0, 0, 0, 0}, 65, 65, { 1250, 500, 10029, 852, ';' }}, - {0x040F, 0x000F, 0x040F, 97,20283, 20289, 20289, 20289, 20309, 18415, 18419, 18392, 20329, {0, 0, 0, 0, 0}, 66, 66, { 1252, 20871, 10079, 850, ';' }}, - {0x0410, 0x0010, 0x0410, 98,20332, 20338, 20338, 20338, 20354, 18443, 18447, 18423, 20372, {0, 0, 0, 0, 0}, 67, 67, { 1252, 20280, 10000, 850, ';' }}, - {0x0411, 0x0011, 0x0411, 101,20375, 20381, 20381, 20381, 20398, 18473, 18477, 18451, 20417, {0, 0, 0, 0, 0}, 68, 68, { 932, 20290, 10001, 932, ',' }}, - {0x0412, 0x0012, 0x0412, 109,20420, 20426, 20426, 20426, 20447, 18501, 18505, 18481, 20472, {0, 0, 0, 0, 0}, 69, 69, { 949, 20833, 10003, 949, ',' }}, - {0x0413, 0x0013, 0x0413, 149,20475, 20481, 20481, 20481, 20501, 18529, 18533, 18509, 20524, {0, 0, 0, 0, 0}, 70, 70, { 1252, 500, 10000, 850, ';' }}, - {0x0414, 0x0014, 0x0414, 150,20527, 20533, 20559, 20559, 20586, 18556, 20608, 20612, 20615, {0, 0, 0, 0, 0}, 71, 71, { 1252, 20277, 10000, 850, ';' }}, - {0x0415, 0x0015, 0x0415, 162,20618, 20624, 20624, 20624, 20640, 18581, 18585, 18564, 20656, {0, 0, 0, 0, 0}, 72, 72, { 1250, 20880, 10029, 852, ';' }}, - {0x0416, 0x0016, 0x0416, 26,20659, 20665, 20665, 20665, 20685, 18614, 18618, 18589, 20705, {0, 0, 0, 0, 0}, 73, 73, { 1252, 500, 10000, 850, ';' }}, - {0x0418, 0x0018, 0x0418, 171,20708, 20714, 20714, 20714, 20733, 18643, 18647, 18622, 20753, {0, 0, 0, 0, 0}, 74, 74, { 1250, 20880, 10029, 852, ';' }}, - {0x0419, 0x0019, 0x0419, 172,20756, 20762, 20762, 20762, 20779, 18677, 18681, 18651, 20809, {0, 0, 0, 0, 0}, 75, 75, { 1251, 20880, 10007, 866, ';' }}, - {0x041A, 0x001A, 0x041A, 88,20812, 20818, 20818, 20818, 20837, 18706, 18710, 18685, 20857, {0, 0, 0, 0, 0}, 76, 76, { 1250, 500, 10082, 852, ';' }}, - {0x041B, 0x001B, 0x041B, 183,20860, 20866, 20866, 20866, 20884, 18735, 18739, 18714, 20918, {0, 0, 0, 0, 0}, 77, 77, { 1250, 20880, 10029, 852, ';' }}, - {0x041C, 0x001C, 0x041C, 4,20921, 20927, 20927, 20927, 20946, 18762, 18766, 18743, 20966, {0, 0, 0, 0, 0}, 78, 78, { 1250, 20880, 10029, 852, ';' }}, - {0x041D, 0x001D, 0x041D, 178,20969, 20975, 20975, 20975, 20992, 18789, 18793, 18770, 21010, {0, 0, 0, 0, 0}, 79, 79, { 1252, 20278, 10000, 850, ';' }}, - {0x041E, 0x001E, 0x041E, 197,21013, 21019, 21019, 21019, 21035, 18815, 18819, 18797, 21075, {0, 0, 0, 0, 0}, 80, 80, { 874, 20838, 10021, 874, ',' }}, - {0x041F, 0x001F, 0x041F, 204,21078, 21084, 21084, 21084, 21101, 18843, 18847, 18823, 21121, {0, 0, 0, 0, 0}, 81, 81, { 1254, 20905, 10081, 857, ';' }}, - {0x0421, 0x0021, 0x0421, 90,21124, 21130, 21130, 21130, 21153, 18882, 18886, 18851, 21182, {0, 0, 0, 0, 0}, 82, 82, { 1252, 500, 10000, 850, ';' }}, - {0x0422, 0x0022, 0x0422, 209,21185, 21191, 21191, 21191, 21211, 18924, 18928, 18890, 21249, {0, 0, 0, 0, 0}, 83, 83, { 1251, 500, 10017, 866, ';' }}, - {0x0423, 0x0023, 0x0423, 30,21252, 21258, 21258, 21258, 21279, 18965, 18969, 18932, 21317, {0, 0, 0, 0, 0}, 84, 84, { 1251, 500, 10007, 866, ';' }}, - {0x0424, 0x0024, 0x0424, 181,21320, 21326, 21326, 21326, 21347, 19000, 19004, 18973, 21373, {0, 0, 0, 0, 0}, 85, 85, { 1250, 20880, 10029, 852, ';' }}, - {0x0425, 0x0025, 0x0425, 57,21376, 21382, 21382, 21382, 21401, 19026, 19030, 19008, 21415, {0, 0, 0, 0, 0}, 86, 86, { 1257, 500, 10029, 775, ';' }}, - {0x0426, 0x0026, 0x0426, 121,21418, 21424, 21424, 21424, 21441, 19055, 19059, 19034, 21461, {0, 0, 0, 0, 0}, 87, 87, { 1257, 500, 10029, 775, ';' }}, - {0x0427, 0x0027, 0x0427, 119,21464, 21470, 21470, 21470, 21493, 19087, 19091, 19063, 21513, {0, 0, 0, 0, 0}, 88, 88, { 1257, 500, 10029, 775, ';' }}, - {0x0429, 0x0029, 0x0429, 96,21516, 21522, 21522, 21522, 21537, 19117, 19121, 19095, 21561, {0, 0, 0, 0, 0}, 89, 89, { 1256, 20420, 10004, 720, ';' }}, - {0x042A, 0x002A, 0x042A, 220,21564, 21570, 21570, 21570, 21591, 19154, 3156, 19125, 21619, {0, 0, 0, 0, 0}, 90, 90, { 1258, 500, 10000, 1258, ',' }}, - {0x042B, 0x002B, 0x042B, 5,21622, 21628, 21628, 21628, 21647, 19185, 19189, 19158, 465, {0, 0, 0, 0, 0}, 91, 91, { 0, 500, 2, 1, ',' }}, - {0x042D, 0x002D, 0x042D, 61,21712, 21718, 21718, 21718, 21733, 19211, 19215, 19193, 19810, {0, 0, 0, 0, 0}, 92, 92, { 1252, 500, 10000, 850, ';' }}, - {0x042F, 0x002F, 0x042F, 128,21752, 21758, 21758, 21758, 21781, 19254, 19258, 19219, 21825, {0, 0, 0, 0, 0}, 93, 93, { 1251, 500, 10007, 866, ';' }}, - {0x0436, 0x0036, 0x0436, 227,21828, 21834, 21834, 21834, 21859, 19286, 19290, 19262, 21884, {0, 0, 0, 0, 0}, 94, 94, { 1252, 500, 10000, 850, ',' }}, - {0x0438, 0x0038, 0x0438, 67,21887, 21893, 21893, 21893, 21917, 19315, 19319, 19294, 21938, {0, 0, 0, 0, 0}, 95, 95, { 1252, 20277, 10079, 850, ';' }}, - {0x0439, 0x0039, 0x0439, 93,21941, 21947, 21947, 21947, 21961, 19348, 19352, 19323, 21992, {0, 0, 0, 0, 0}, 96, 96, { 0, 500, 2, 1, ',' }}, - {0x0441, 0x0041, 0x0441, 102,21995, 22001, 22001, 22001, 22017, 19377, 19381, 19356, 22035, {0, 0, 0, 0, 0}, 97, 97, { 1252, 500, 10000, 437, ',' }}, - {0x0447, 0x0047, 0x0447, 93,22038, 22044, 22044, 22044, 22061, 19419, 19423, 19385, 21992, {0, 0, 0, 0, 0}, 98, 98, { 0, 500, 2, 1, ',' }}, - {0x0449, 0x0049, 0x0449, 93,22098, 22104, 22104, 22104, 22118, 19452, 19456, 19427, 21992, {0, 0, 0, 0, 0}, 99, 99, { 0, 500, 2, 1, ',' }}, - {0x044A, 0x004A, 0x044A, 93,22158, 22164, 22164, 22164, 22179, 19489, 19493, 19460, 21992, {0, 0, 0, 0, 0}, 100, 100, { 0, 500, 2, 1, ',' }}, - {0x044B, 0x004B, 0x044B, 93,22226, 22232, 22232, 22232, 22248, 19524, 19528, 19497, 21992, {0, 0, 0, 0, 0}, 101, 101, { 0, 500, 2, 1, ',' }}, - {0x044E, 0x004E, 0x044E, 93,22279, 22285, 22285, 22285, 22301, 19559, 1862, 19532, 21992, {0, 0, 0, 0, 0}, 102, 102, { 0, 500, 2, 1, ',' }}, - {0x0456, 0x0056, 0x0456, 61,22332, 22338, 22338, 22338, 22355, 19582, 19586, 19563, 19810, {0, 0, 0, 0, 0}, 103, 103, { 1252, 500, 10000, 850, ',' }}, - {0x0457, 0x0057, 0x0457, 93,22372, 22379, 22379, 22379, 22395, 19621, 19590, 19590, 21992, {0, 0, 0, 0, 0}, 104, 104, { 0, 500, 2, 1, ',' }}, - {0x0801, 0x0001, 0x0801, 95,22429, 22435, 22435, 22435, 22449, 22479, 18023, 17994, 22483, {2, 1, 0, 0, 0}, 105, 105, { 1256, 20420, 10004, 720, ';' }}, - {0x0804, 0x0004, 0x0804, 42,22486, 22492, 22492, 22492, 22508, 18116, 18120, 18124, 11080, {0, 0, 0, 0, 0}, 106, 106, { 936, 500, 10008, 936, ',' }}, - {0x0807, 0x0007, 0x0807, 37,22524, 22530, 22530, 22530, 22551, 22569, 18200, 18178, 11001, {0, 0, 0, 0, 0}, 107, 107, { 1252, 20273, 10000, 850, ';' }}, - {0x0809, 0x0009, 0x0809, 70,22573, 22579, 22579, 22579, 22579, 22604, 18253, 18238, 22608, {0, 0, 0, 0, 0}, 108, 108, { 1252, 20285, 10000, 850, ',' }}, - {0x080A, 0x000A, 0x080A, 141,22611, 22617, 22617, 22617, 22634, 22653, 18281, 18257, 22657, {0, 0, 0, 0, 0}, 109, 109, { 1252, 20284, 10000, 850, ',' }}, - {0x080C, 0x000C, 0x080C, 17,22660, 22666, 22666, 22666, 22683, 22704, 18331, 5968, 22708, {0, 0, 0, 0, 0}, 110, 110, { 1252, 20297, 10000, 850, ';' }}, - {0x0810, 0x0010, 0x0810, 37,22711, 22717, 22717, 22717, 22739, 22759, 18447, 18423, 11001, {0, 0, 0, 0, 0}, 111, 111, { 1252, 500, 10000, 850, ';' }}, - {0x0813, 0x0013, 0x0813, 17,22763, 22769, 22769, 22769, 22785, 22806, 18533, 18509, 22708, {0, 0, 0, 0, 0}, 112, 112, { 1252, 500, 10000, 850, ';' }}, - {0x0814, 0x0014, 0x0814, 150,22810, 22816, 22816, 22816, 22843, 22865, 22869, 22873, 20615, {0, 0, 0, 0, 0}, 113, 113, { 1252, 20277, 10000, 850, ';' }}, - {0x0816, 0x0016, 0x0816, 166,22876, 22882, 22882, 22882, 22904, 22926, 18618, 18589, 22930, {0, 0, 0, 0, 0}, 114, 114, { 1252, 500, 10000, 850, ';' }}, - {0x081D, 0x001D, 0x081D, 63,22933, 22939, 22939, 22939, 22957, 22975, 18793, 18770, 20135, {0, 0, 0, 0, 0}, 115, 115, { 1252, 20278, 10000, 850, ';' }}, - {0x0C01, 0x0001, 0x0C01, 58,22979, 22985, 22985, 22985, 23000, 23024, 18023, 17994, 23028, {16777216, 0, 0, 0, 0}, 116, 116, { 1256, 20420, 10004, 720, ';' }}, - {0x0C04, 0x7C04, 0x0C04, 85,23031, 23037, 23037, 23037, 23071, 23108, 18120, 18124, 23112, {0, 0, 0, 0, 0}, 117, 117, { 950, 500, 10002, 950, ',' }}, - {0x0C07, 0x0007, 0x0C07, 10,23115, 23121, 23121, 23121, 23138, 23160, 18200, 18178, 23164, {0, 0, 0, 0, 0}, 118, 118, { 1252, 20273, 10000, 850, ';' }}, - {0x0C09, 0x0009, 0x0C09, 11,23167, 23173, 23173, 23173, 23173, 23193, 18253, 18238, 23197, {0, 0, 0, 0, 0}, 119, 119, { 1252, 500, 10000, 850, ',' }}, - {0x0C0A, 0x000A, 0x0C0A, 61,23200, 23206, 23206, 23206, 23222, 23241, 18281, 18257, 19810, {0, 0, 0, 0, 0}, 120, 120, { 1252, 20284, 10000, 850, ';' }}, - {0x0C0C, 0x000C, 0x0C0C, 32,23245, 23251, 23251, 23251, 23267, 23286, 18331, 5968, 23290, {0, 0, 0, 0, 0}, 121, 121, { 1252, 20297, 10000, 850, ';' }}, - {0x1001, 0x0001, 0x1001, 122,23293, 23299, 23299, 23299, 23314, 23342, 18023, 17994, 23346, {16777216, 0, 0, 0, 0}, 122, 122, { 1256, 20420, 10004, 720, ';' }}, - {0x1004, 0x0004, 0x1004, 179,23349, 23355, 23355, 23355, 23375, 23394, 18120, 18124, 23398, {0, 0, 0, 0, 0}, 123, 123, { 936, 500, 10008, 936, ',' }}, - {0x1007, 0x0007, 0x1007, 120,23401, 23407, 23407, 23407, 23427, 23447, 18200, 18178, 23451, {0, 0, 0, 0, 0}, 124, 124, { 1252, 20273, 10000, 850, ';' }}, - {0x1009, 0x0009, 0x1009, 32,23454, 23460, 23460, 23460, 23460, 23477, 18253, 18238, 23290, {0, 0, 0, 0, 0}, 125, 125, { 1252, 37, 10000, 850, ',' }}, - {0x100A, 0x000A, 0x100A, 82,23481, 23487, 23487, 23487, 23507, 23528, 18281, 18257, 23532, {0, 0, 0, 0, 0}, 126, 126, { 1252, 20284, 10000, 850, ',' }}, - {0x100C, 0x000C, 0x100C, 37,23535, 23541, 23541, 23541, 23562, 23581, 18331, 5968, 11001, {0, 0, 0, 0, 0}, 127, 127, { 1252, 20297, 10000, 850, ';' }}, - {0x1401, 0x0001, 0x1401, 55,23585, 23591, 23591, 23591, 23608, 23640, 18023, 17994, 23644, {16777216, 0, 0, 0, 0}, 128, 128, { 1256, 20420, 10004, 720, ';' }}, - {0x1404, 0x0004, 0x1404, 132,23647, 23653, 23653, 23653, 23682, 23719, 18120, 18124, 23723, {0, 0, 0, 0, 0}, 129, 129, { 950, 500, 10002, 950, ',' }}, - {0x1409, 0x0009, 0x1409, 154,23726, 23732, 23732, 23732, 23732, 23754, 18253, 18238, 23758, {0, 0, 0, 0, 0}, 130, 130, { 1252, 500, 10000, 850, ',' }}, - {0x140A, 0x000A, 0x140A, 44,23761, 23767, 23767, 23767, 23788, 23810, 18281, 18257, 23814, {0, 0, 0, 0, 0}, 131, 131, { 1252, 20284, 10000, 850, ',' }}, - {0x140C, 0x000C, 0x140C, 120,23817, 23823, 23823, 23823, 23843, 23866, 18331, 5968, 23451, {0, 0, 0, 0, 0}, 132, 132, { 1252, 20297, 10000, 850, ';' }}, - {0x1801, 0x0001, 0x1801, 123,23870, 23876, 23876, 23876, 23893, 23923, 18023, 17994, 23927, {16777216, 0, 0, 0, 0}, 133, 133, { 1256, 20420, 10004, 720, ';' }}, - {0x1809, 0x0009, 0x1809, 91,23930, 23936, 23936, 23936, 23936, 23954, 18253, 18238, 23958, {0, 0, 0, 0, 0}, 134, 134, { 1252, 500, 10000, 850, ',' }}, - {0x180A, 0x000A, 0x180A, 156,23961, 23967, 23967, 23967, 23984, 24003, 18281, 18257, 24007, {0, 0, 0, 0, 0}, 135, 135, { 1252, 20284, 10000, 850, ',' }}, - {0x1C01, 0x0001, 0x1C01, 202,24010, 24016, 24016, 24016, 24033, 24059, 18023, 17994, 24063, {16777216, 0, 0, 0, 0}, 136, 136, { 1256, 20420, 10004, 720, ';' }}, - {0x1C09, 0x0009, 0x1C09, 227,24066, 24072, 24072, 24072, 24072, 24095, 18253, 18238, 21884, {0, 0, 0, 0, 0}, 137, 137, { 1252, 500, 10000, 437, ',' }}, - {0x1C0A, 0x000A, 0x1C0A, 54,24099, 24105, 24105, 24105, 24134, 24167, 18281, 18257, 24171, {0, 0, 0, 0, 0}, 138, 138, { 1252, 20284, 10000, 850, ',' }}, - {0x2001, 0x0001, 0x2001, 155,24174, 24180, 24180, 24180, 24194, 24220, 18023, 17994, 24224, {16777216, 0, 0, 0, 0}, 139, 139, { 1256, 20420, 10004, 720, ';' }}, - {0x200A, 0x000A, 0x200A, 217,24227, 24233, 24233, 24233, 24253, 24274, 18281, 18257, 24278, {0, 0, 0, 0, 0}, 140, 140, { 1252, 20284, 10000, 850, ',' }}, - {0x2401, 0x0001, 0x2401, 224,24281, 24287, 24287, 24287, 24302, 24330, 18023, 17994, 24334, {16777216, 0, 0, 0, 0}, 141, 141, { 1256, 20420, 10004, 720, ';' }}, - {0x240A, 0x000A, 0x240A, 43,24337, 24343, 24343, 24343, 24362, 24382, 18281, 18257, 24386, {0, 0, 0, 0, 0}, 142, 142, { 1252, 20284, 10000, 850, ',' }}, - {0x2801, 0x0001, 0x2801, 191,24389, 24395, 24395, 24395, 24410, 24438, 18023, 17994, 24442, {16777216, 0, 0, 0, 0}, 143, 143, { 1256, 20420, 10004, 720, ';' }}, - {0x280A, 0x000A, 0x280A, 157,24445, 24451, 24451, 24451, 24466, 24483, 18281, 18257, 24487, {0, 0, 0, 0, 0}, 144, 144, { 1252, 20284, 10000, 850, ',' }}, - {0x2C01, 0x0001, 0x2C01, 100,24490, 24496, 24496, 24496, 24512, 24542, 18023, 17994, 24546, {16777216, 0, 0, 0, 0}, 145, 145, { 1256, 20420, 10004, 720, ';' }}, - {0x2C0A, 0x000A, 0x2C0A, 8,24549, 24555, 24555, 24555, 24575, 24596, 18281, 18257, 24600, {0, 0, 0, 0, 0}, 146, 146, { 1252, 20284, 10000, 850, ',' }}, - {0x3001, 0x0001, 0x3001, 114,24603, 24609, 24609, 24609, 24626, 24654, 18023, 17994, 24658, {16777216, 0, 0, 0, 0}, 147, 147, { 1256, 20420, 10004, 720, ';' }}, - {0x3009, 0x0009, 0x3009, 229,24661, 24667, 24667, 24667, 24667, 24686, 18253, 18238, 24690, {0, 0, 0, 0, 0}, 148, 148, { 1252, 500, 10000, 437, ',' }}, - {0x300A, 0x000A, 0x300A, 56,24693, 24699, 24699, 24699, 24717, 24736, 18281, 18257, 24740, {0, 0, 0, 0, 0}, 149, 149, { 1252, 20284, 10000, 850, ',' }}, - {0x3401, 0x0001, 0x3401, 110,24743, 24749, 24749, 24749, 24765, 24795, 18023, 17994, 24799, {16777216, 0, 0, 0, 0}, 150, 150, { 1256, 20420, 10004, 720, ';' }}, - {0x3409, 0x0009, 0x3409, 160,24802, 24808, 24808, 24808, 24808, 24830, 18253, 18238, 24834, {0, 0, 0, 0, 0}, 151, 151, { 1252, 500, 10000, 437, ',' }}, - {0x340A, 0x000A, 0x340A, 40,24837, 24843, 24843, 24843, 24859, 24876, 18281, 18257, 24880, {0, 0, 0, 0, 0}, 152, 152, { 1252, 20284, 10000, 850, ',' }}, - {0x3801, 0x0001, 0x3801, 0,24883, 24889, 24889, 24889, 24919, 24983, 18023, 17994, 24987, {16777216, 0, 0, 0, 0}, 153, 153, { 1256, 20420, 10004, 720, ';' }}, - {0x380A, 0x000A, 0x380A, 213,24990, 24996, 24996, 24996, 25014, 25033, 18281, 18257, 25037, {0, 0, 0, 0, 0}, 154, 154, { 1252, 20284, 10000, 850, ',' }}, - {0x3C01, 0x0001, 0x3C01, 20,25040, 25046, 25046, 25046, 25063, 25095, 18023, 17994, 25099, {16777216, 0, 0, 0, 0}, 155, 155, { 1256, 20420, 10004, 720, ';' }}, - {0x3C0A, 0x000A, 0x3C0A, 168,25102, 25108, 25108, 25108, 25127, 25147, 18281, 18257, 25151, {0, 0, 0, 0, 0}, 156, 156, { 1252, 20284, 10000, 850, ',' }}, - {0x4001, 0x0001, 0x4001, 169,25154, 25160, 25160, 25160, 25175, 25199, 18023, 17994, 25203, {16777216, 0, 0, 0, 0}, 157, 157, { 1256, 20420, 10004, 720, ';' }}, - {0x400A, 0x000A, 0x400A, 25,25206, 25212, 25212, 25212, 25230, 25249, 18281, 18257, 25253, {0, 0, 0, 0, 0}, 158, 158, { 1252, 20284, 10000, 850, ',' }}, - {0x440A, 0x000A, 0x440A, 190,25256, 25262, 25262, 25262, 25284, 25307, 18281, 18257, 25311, {0, 0, 0, 0, 0}, 159, 159, { 1252, 20284, 10000, 850, ',' }}, - {0x480A, 0x000A, 0x480A, 87,25314, 25320, 25320, 25320, 25339, 25359, 18281, 18257, 25363, {0, 0, 0, 0, 0}, 160, 160, { 1252, 20284, 10000, 850, ',' }}, - {0x4C0A, 0x000A, 0x4C0A, 148,25366, 25372, 25372, 25372, 25392, 25413, 18281, 18257, 25417, {0, 0, 0, 0, 0}, 161, 161, { 1252, 20284, 10000, 850, ',' }}, - {0x500A, 0x000A, 0x500A, 165,25420, 25426, 25426, 25426, 25448, 25471, 18281, 18257, 25475, {0, 0, 0, 0, 0}, 162, 162, { 1252, 20284, 10000, 850, ',' }}, - {0x7C04, 0x007F, 0x0000, -1,25478, 19819, 18101, 18101, 18109, 19852, 18120, 18124, 0, {0, 0, 0, 0, 0}, 163, 163, { 950, 500, 10002, 950, ',' }} + {0x0001, 0x007F, 0x0401, -1,18140, 18143, 18143, 18143, 18150, 18165, 18169, 18140, 0, {16777216, 0, 0, 0, 0}, 0, 0, { 1256, 20420, 10004, 720, ';' }}, + {0x0002, 0x007F, 0x0402, -1,18173, 18176, 18176, 18176, 18186, 18205, 18209, 18173, 0, {0, 0, 0, 0, 0}, 1, 1, { 1251, 20420, 10007, 866, ';' }}, + {0x0003, 0x007F, 0x0403, -1,18213, 18216, 18216, 18216, 18224, 18232, 18236, 18213, 0, {0, 0, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, ';' }}, + {0x0004, 0x007F, 0x0000, -1,18240, 18247, 18247, 18247, 18255, 18262, 18266, 18270, 0, {0, 0, 0, 0, 0}, 165, 165, { 936, 500, 10008, 936, ',' }}, + {0x0005, 0x007F, 0x0405, -1,18273, 18276, 18276, 18276, 18282, 18292, 18296, 18273, 0, {0, 0, 0, 0, 0}, 4, 4, { 1250, 500, 10029, 852, ';' }}, + {0x0006, 0x007F, 0x0406, -1,18300, 18303, 18303, 18303, 18310, 18316, 18320, 18300, 0, {0, 0, 0, 0, 0}, 5, 5, { 1252, 20277, 10000, 850, ';' }}, + {0x0007, 0x007F, 0x0407, -1,18324, 18327, 18327, 18327, 18334, 18342, 18346, 18324, 0, {0, 0, 0, 0, 0}, 6, 6, { 1252, 20273, 10000, 850, ';' }}, + {0x0008, 0x007F, 0x0408, -1,18350, 18353, 18353, 18353, 18359, 18376, 18380, 18350, 0, {0, 0, 0, 0, 0}, 7, 7, { 1253, 20273, 10006, 737, ';' }}, + {0x0009, 0x007F, 0x0409, -1,18384, 18387, 18387, 18387, 18387, 18395, 18399, 18384, 0, {0, 0, 0, 0, 0}, 8, 8, { 1252, 37, 10000, 437, ',' }}, + {0x000A, 0x007F, 0x0C0A, -1,18403, 18406, 18406, 18406, 18414, 18423, 18427, 18403, 0, {0, 0, 0, 0, 0}, 9, 9, { 1252, 20284, 10000, 850, ';' }}, + {0x000B, 0x007F, 0x040B, -1,18431, 18434, 18434, 18434, 18442, 18448, 18452, 18431, 0, {0, 0, 0, 0, 0}, 10, 10, { 1252, 20278, 10000, 850, ';' }}, + {0x000C, 0x007F, 0x040C, -1,5968, 18456, 18456, 18456, 18463, 18473, 18477, 5968, 0, {0, 0, 0, 0, 0}, 11, 11, { 1252, 20297, 10000, 850, ';' }}, + {0x000D, 0x007F, 0x040D, -1,18481, 18484, 18484, 18484, 18491, 18502, 18506, 18481, 0, {0, 0, 0, 0, 0}, 12, 12, { 1255, 500, 10005, 862, ',' }}, + {0x000E, 0x007F, 0x040E, -1,18510, 18513, 18513, 18513, 18523, 18530, 18534, 18510, 0, {0, 0, 0, 0, 0}, 13, 13, { 1250, 500, 10029, 852, ';' }}, + {0x000F, 0x007F, 0x040F, -1,18538, 18541, 18541, 18541, 18551, 18561, 18565, 18538, 0, {0, 0, 0, 0, 0}, 14, 14, { 1252, 20871, 10079, 850, ';' }}, + {0x0010, 0x007F, 0x0410, -1,18569, 18572, 18572, 18572, 18580, 18589, 18593, 18569, 0, {0, 0, 0, 0, 0}, 15, 15, { 1252, 20280, 10000, 850, ';' }}, + {0x0011, 0x007F, 0x0411, -1,18597, 18600, 18600, 18600, 18609, 18619, 18623, 18597, 0, {0, 0, 0, 0, 0}, 16, 16, { 932, 20290, 10001, 932, ',' }}, + {0x0012, 0x007F, 0x0412, -1,18627, 18630, 18630, 18630, 18637, 18647, 18651, 18627, 0, {0, 0, 0, 0, 0}, 17, 17, { 949, 20833, 10003, 949, ',' }}, + {0x0013, 0x007F, 0x0413, -1,18655, 18658, 18658, 18658, 18664, 18675, 18679, 18655, 0, {0, 0, 0, 0, 0}, 18, 18, { 1252, 500, 10000, 850, ';' }}, + {0x0014, 0x007F, 0x0414, -1,18683, 18686, 18686, 18686, 18696, 18702, 18706, 18683, 0, {0, 0, 0, 0, 0}, 19, 19, { 1252, 20277, 10000, 850, ';' }}, + {0x0015, 0x007F, 0x0415, -1,18710, 18713, 18713, 18713, 18720, 18727, 18731, 18710, 0, {0, 0, 0, 0, 0}, 20, 20, { 1250, 20880, 10029, 852, ';' }}, + {0x0016, 0x007F, 0x0416, -1,18735, 18738, 18738, 18738, 18749, 18760, 18764, 18735, 0, {0, 0, 0, 0, 0}, 21, 21, { 1252, 500, 10000, 850, ';' }}, + {0x0018, 0x007F, 0x0418, -1,18768, 18771, 18771, 18771, 18780, 18789, 18793, 18768, 0, {0, 0, 0, 0, 0}, 22, 22, { 1250, 20880, 10029, 852, ';' }}, + {0x0019, 0x007F, 0x0419, -1,18797, 18800, 18800, 18800, 18808, 18823, 18827, 18797, 0, {0, 0, 0, 0, 0}, 23, 23, { 1251, 20880, 10007, 866, ';' }}, + {0x001A, 0x007F, 0x041A, -1,18831, 18834, 18834, 18834, 18843, 18852, 18856, 18831, 0, {0, 0, 0, 0, 0}, 24, 24, { 1250, 500, 10082, 852, ';' }}, + {0x001B, 0x007F, 0x041B, -1,18860, 18863, 18863, 18863, 18870, 18881, 18885, 18860, 0, {0, 0, 0, 0, 0}, 25, 25, { 1250, 20880, 10029, 852, ';' }}, + {0x001C, 0x007F, 0x041C, -1,18889, 18892, 18892, 18892, 18901, 18908, 18912, 18889, 0, {0, 0, 0, 0, 0}, 26, 26, { 1250, 20880, 10029, 852, ';' }}, + {0x001D, 0x007F, 0x041D, -1,18916, 18919, 18919, 18919, 18927, 18935, 18939, 18916, 0, {0, 0, 0, 0, 0}, 27, 27, { 1252, 20278, 10000, 850, ';' }}, + {0x001E, 0x007F, 0x041E, -1,18943, 18946, 18946, 18946, 18951, 18961, 18965, 18943, 0, {0, 0, 0, 0, 0}, 28, 28, { 874, 20838, 10021, 874, ',' }}, + {0x001F, 0x007F, 0x041F, -1,18969, 18972, 18972, 18972, 18980, 18989, 18993, 18969, 0, {0, 0, 0, 0, 0}, 29, 29, { 1254, 20905, 10081, 857, ';' }}, + {0x0021, 0x007F, 0x0421, -1,18997, 19000, 19000, 19000, 19011, 19028, 19032, 18997, 0, {0, 0, 0, 0, 0}, 30, 30, { 1252, 500, 10000, 850, ';' }}, + {0x0022, 0x007F, 0x0422, -1,19036, 19039, 19039, 19039, 19049, 19070, 19074, 19036, 0, {0, 0, 0, 0, 0}, 31, 31, { 1251, 500, 10017, 866, ';' }}, + {0x0023, 0x007F, 0x0423, -1,19078, 19081, 19081, 19081, 19092, 19111, 19115, 19078, 0, {0, 0, 0, 0, 0}, 32, 32, { 1251, 500, 10007, 866, ';' }}, + {0x0024, 0x007F, 0x0424, -1,19119, 19122, 19122, 19122, 19132, 19146, 19150, 19119, 0, {0, 0, 0, 0, 0}, 33, 33, { 1250, 20880, 10029, 852, ';' }}, + {0x0025, 0x007F, 0x0425, -1,19154, 19157, 19157, 19157, 19166, 19172, 19176, 19154, 0, {0, 0, 0, 0, 0}, 34, 34, { 1257, 500, 10029, 775, ';' }}, + {0x0026, 0x007F, 0x0426, -1,19180, 19183, 19183, 19183, 19191, 19201, 19205, 19180, 0, {0, 0, 0, 0, 0}, 35, 35, { 1257, 500, 10029, 775, ';' }}, + {0x0027, 0x007F, 0x0427, -1,19209, 19212, 19212, 19212, 19223, 19233, 19237, 19209, 0, {0, 0, 0, 0, 0}, 36, 36, { 1257, 500, 10029, 775, ';' }}, + {0x0029, 0x007F, 0x0429, -1,19241, 19244, 19244, 19244, 19252, 19263, 19267, 19241, 0, {0, 0, 0, 0, 0}, 37, 37, { 1256, 20420, 10004, 720, ';' }}, + {0x002A, 0x007F, 0x042A, -1,19271, 19274, 19274, 19274, 19285, 19300, 3156, 19271, 0, {0, 0, 0, 0, 0}, 38, 38, { 1258, 500, 10000, 1258, ',' }}, + {0x002B, 0x007F, 0x042B, -1,19304, 19307, 19307, 19307, 19316, 19331, 19335, 19304, 0, {0, 0, 0, 0, 0}, 39, 39, { 0, 500, 2, 1, ',' }}, + {0x002D, 0x007F, 0x042D, -1,19339, 19342, 19342, 19342, 19349, 19357, 19361, 19339, 0, {0, 0, 0, 0, 0}, 40, 40, { 1252, 500, 10000, 850, ';' }}, + {0x002F, 0x007F, 0x042F, -1,19365, 19368, 19368, 19368, 19379, 19400, 19404, 19365, 0, {0, 0, 0, 0, 0}, 41, 41, { 1251, 500, 10007, 866, ';' }}, + {0x0036, 0x007F, 0x0436, -1,19408, 19411, 19411, 19411, 19421, 19432, 19436, 19408, 0, {0, 0, 0, 0, 0}, 42, 42, { 1252, 500, 10000, 850, ',' }}, + {0x0037, 0x007F, 0x0437, -1,19440, 19443, 19443, 19443, 19452, 19474, 19478, 19440, 0, {0, 0, 0, 0, 0}, 43, 43, { 0, 500, 2, 1, ';' }}, + {0x0038, 0x007F, 0x0438, -1,19482, 19485, 19485, 19485, 19493, 19503, 19507, 19482, 0, {0, 0, 0, 0, 0}, 44, 44, { 1252, 20277, 10079, 850, ';' }}, + {0x0039, 0x007F, 0x0439, -1,19511, 19514, 19514, 19514, 19520, 19536, 19540, 19511, 0, {0, 0, 0, 0, 0}, 45, 45, { 0, 500, 2, 1, ',' }}, + {0x0041, 0x007F, 0x0441, -1,19544, 19547, 19547, 19547, 19555, 19565, 19569, 19544, 0, {0, 0, 0, 0, 0}, 46, 46, { 1252, 500, 10000, 437, ',' }}, + {0x0047, 0x007F, 0x0447, -1,19573, 19576, 19576, 19576, 19585, 19607, 19611, 19573, 0, {0, 0, 0, 0, 0}, 47, 47, { 0, 500, 2, 1, ',' }}, + {0x0049, 0x007F, 0x0449, -1,19615, 19618, 19618, 19618, 19624, 19640, 19644, 19615, 0, {0, 0, 0, 0, 0}, 48, 48, { 0, 500, 2, 1, ',' }}, + {0x004A, 0x007F, 0x044A, -1,19648, 19651, 19651, 19651, 19658, 19677, 19681, 19648, 0, {0, 0, 0, 0, 0}, 49, 49, { 0, 500, 2, 1, ',' }}, + {0x004B, 0x007F, 0x044B, -1,19685, 19688, 19688, 19688, 19696, 19712, 19716, 19685, 0, {0, 0, 0, 0, 0}, 50, 50, { 0, 500, 2, 1, ',' }}, + {0x004E, 0x007F, 0x044E, -1,19720, 19723, 19723, 19723, 19731, 19747, 1862, 19720, 0, {0, 0, 0, 0, 0}, 51, 51, { 0, 500, 2, 1, ',' }}, + {0x0056, 0x007F, 0x0456, -1,19751, 19754, 19754, 19754, 19763, 19770, 19774, 19751, 0, {0, 0, 0, 0, 0}, 52, 52, { 1252, 500, 10000, 850, ',' }}, + {0x0057, 0x007F, 0x0457, -1,19778, 19782, 19782, 19782, 19790, 19809, 19778, 19511, 0, {0, 0, 0, 0, 0}, 53, 53, { 0, 500, 2, 1, ',' }}, + {0x0401, 0x0001, 0x0401, 174,19813, 19819, 19819, 19819, 19841, 18165, 18169, 18140, 10998, {16777216, 0, 0, 0, 0}, 54, 54, { 1256, 20420, 10004, 720, ';' }}, + {0x0402, 0x0002, 0x0402, 19,19890, 19896, 19896, 19896, 19917, 18205, 18209, 18173, 19955, {0, 0, 0, 0, 0}, 55, 55, { 1251, 20420, 10007, 866, ';' }}, + {0x0403, 0x0003, 0x0403, 61,19958, 19964, 19964, 19964, 19980, 18232, 18236, 18213, 19998, {0, 0, 0, 0, 0}, 56, 56, { 1252, 500, 10000, 850, ';' }}, + {0x0404, 0x7C04, 0x0404, 207,20001, 20007, 20007, 20007, 20024, 20040, 18266, 18270, 20044, {0, 0, 0, 0, 0}, 57, 57, { 950, 500, 10002, 950, ',' }}, + {0x0405, 0x0005, 0x0405, 49,20047, 20053, 20053, 20053, 20076, 18292, 18296, 18273, 20106, {0, 0, 0, 0, 0}, 58, 58, { 1250, 500, 10029, 852, ';' }}, + {0x0406, 0x0006, 0x0406, 52,20109, 20115, 20115, 20115, 20132, 18316, 18320, 18300, 20148, {0, 0, 0, 0, 0}, 59, 59, { 1252, 20277, 10000, 850, ';' }}, + {0x0407, 0x0007, 0x0407, 50,20151, 20157, 20157, 20157, 20174, 18342, 18346, 18324, 4291, {0, 0, 0, 0, 0}, 60, 60, { 1252, 20273, 10000, 850, ';' }}, + {0x0408, 0x0008, 0x0408, 81,20196, 20202, 20202, 20202, 20217, 18376, 18380, 18350, 20249, {0, 0, 0, 0, 0}, 61, 61, { 1253, 20273, 10006, 737, ';' }}, + {0x0409, 0x0009, 0x0409, 212,20252, 20258, 20258, 20258, 20258, 18395, 18399, 18384, 20282, {0, 0, 0, 0, 0}, 62, 62, { 1252, 37, 10000, 437, ',' }}, + {0x040B, 0x000B, 0x040B, 63,20285, 20291, 20291, 20291, 20309, 18448, 18452, 18431, 20323, {0, 0, 0, 0, 0}, 63, 63, { 1252, 20278, 10000, 850, ';' }}, + {0x040C, 0x000C, 0x040C, 68,20326, 20332, 20332, 20332, 20348, 18473, 18477, 5968, 20367, {0, 0, 0, 0, 0}, 64, 64, { 1252, 20297, 10000, 850, ';' }}, + {0x040D, 0x000D, 0x040D, 92,20370, 20376, 20376, 20376, 20392, 18502, 18506, 18481, 20416, {0, 0, 0, 0, 0}, 65, 65, { 1255, 500, 10005, 862, ',' }}, + {0x040E, 0x000E, 0x040E, 89,20419, 20425, 20425, 20425, 20445, 18530, 18534, 18510, 20468, {0, 0, 0, 0, 0}, 66, 66, { 1250, 500, 10029, 852, ';' }}, + {0x040F, 0x000F, 0x040F, 97,20471, 20477, 20477, 20477, 20497, 18561, 18565, 18538, 20517, {0, 0, 0, 0, 0}, 67, 67, { 1252, 20871, 10079, 850, ';' }}, + {0x0410, 0x0010, 0x0410, 98,20520, 20526, 20526, 20526, 20542, 18589, 18593, 18569, 20560, {0, 0, 0, 0, 0}, 68, 68, { 1252, 20280, 10000, 850, ';' }}, + {0x0411, 0x0011, 0x0411, 101,20563, 20569, 20569, 20569, 20586, 18619, 18623, 18597, 20605, {0, 0, 0, 0, 0}, 69, 69, { 932, 20290, 10001, 932, ',' }}, + {0x0412, 0x0012, 0x0412, 109,20608, 20614, 20614, 20614, 20635, 18647, 18651, 18627, 20660, {0, 0, 0, 0, 0}, 70, 70, { 949, 20833, 10003, 949, ',' }}, + {0x0413, 0x0013, 0x0413, 149,20663, 20669, 20669, 20669, 20689, 18675, 18679, 18655, 20712, {0, 0, 0, 0, 0}, 71, 71, { 1252, 500, 10000, 850, ';' }}, + {0x0414, 0x0014, 0x0414, 150,20715, 20721, 20747, 20747, 20774, 18702, 20796, 20800, 20803, {0, 0, 0, 0, 0}, 72, 72, { 1252, 20277, 10000, 850, ';' }}, + {0x0415, 0x0015, 0x0415, 162,20806, 20812, 20812, 20812, 20828, 18727, 18731, 18710, 20844, {0, 0, 0, 0, 0}, 73, 73, { 1250, 20880, 10029, 852, ';' }}, + {0x0416, 0x0016, 0x0416, 26,20847, 20853, 20853, 20853, 20873, 18760, 18764, 18735, 20893, {0, 0, 0, 0, 0}, 74, 74, { 1252, 500, 10000, 850, ';' }}, + {0x0418, 0x0018, 0x0418, 171,20896, 20902, 20902, 20902, 20921, 18789, 18793, 18768, 20941, {0, 0, 0, 0, 0}, 75, 75, { 1250, 20880, 10029, 852, ';' }}, + {0x0419, 0x0019, 0x0419, 172,20944, 20950, 20950, 20950, 20967, 18823, 18827, 18797, 20997, {0, 0, 0, 0, 0}, 76, 76, { 1251, 20880, 10007, 866, ';' }}, + {0x041A, 0x001A, 0x041A, 88,21000, 21006, 21006, 21006, 21025, 18852, 18856, 18831, 21045, {0, 0, 0, 0, 0}, 77, 77, { 1250, 500, 10082, 852, ';' }}, + {0x041B, 0x001B, 0x041B, 183,21048, 21054, 21054, 21054, 21072, 18881, 18885, 18860, 21106, {0, 0, 0, 0, 0}, 78, 78, { 1250, 20880, 10029, 852, ';' }}, + {0x041C, 0x001C, 0x041C, 4,21109, 21115, 21115, 21115, 21134, 18908, 18912, 18889, 21154, {0, 0, 0, 0, 0}, 79, 79, { 1250, 20880, 10029, 852, ';' }}, + {0x041D, 0x001D, 0x041D, 178,21157, 21163, 21163, 21163, 21180, 18935, 18939, 18916, 21198, {0, 0, 0, 0, 0}, 80, 80, { 1252, 20278, 10000, 850, ';' }}, + {0x041E, 0x001E, 0x041E, 197,21201, 21207, 21207, 21207, 21223, 18961, 18965, 18943, 21263, {0, 0, 0, 0, 0}, 81, 81, { 874, 20838, 10021, 874, ',' }}, + {0x041F, 0x001F, 0x041F, 204,21266, 21272, 21272, 21272, 21289, 18989, 18993, 18969, 21309, {0, 0, 0, 0, 0}, 82, 82, { 1254, 20905, 10081, 857, ';' }}, + {0x0421, 0x0021, 0x0421, 90,21312, 21318, 21318, 21318, 21341, 19028, 19032, 18997, 21370, {0, 0, 0, 0, 0}, 83, 83, { 1252, 500, 10000, 850, ';' }}, + {0x0422, 0x0022, 0x0422, 209,21373, 21379, 21379, 21379, 21399, 19070, 19074, 19036, 21437, {0, 0, 0, 0, 0}, 84, 84, { 1251, 500, 10017, 866, ';' }}, + {0x0423, 0x0023, 0x0423, 30,21440, 21446, 21446, 21446, 21467, 19111, 19115, 19078, 21505, {0, 0, 0, 0, 0}, 85, 85, { 1251, 500, 10007, 866, ';' }}, + {0x0424, 0x0024, 0x0424, 181,21508, 21514, 21514, 21514, 21535, 19146, 19150, 19119, 21561, {0, 0, 0, 0, 0}, 86, 86, { 1250, 20880, 10029, 852, ';' }}, + {0x0425, 0x0025, 0x0425, 57,21564, 21570, 21570, 21570, 21589, 19172, 19176, 19154, 21603, {0, 0, 0, 0, 0}, 87, 87, { 1257, 500, 10029, 775, ';' }}, + {0x0426, 0x0026, 0x0426, 121,21606, 21612, 21612, 21612, 21629, 19201, 19205, 19180, 21649, {0, 0, 0, 0, 0}, 88, 88, { 1257, 500, 10029, 775, ';' }}, + {0x0427, 0x0027, 0x0427, 119,21652, 21658, 21658, 21658, 21681, 19233, 19237, 19209, 21701, {0, 0, 0, 0, 0}, 89, 89, { 1257, 500, 10029, 775, ';' }}, + {0x0429, 0x0029, 0x0429, 96,21704, 21710, 21710, 21710, 21725, 19263, 19267, 19241, 21749, {0, 0, 0, 0, 0}, 90, 90, { 1256, 20420, 10004, 720, ';' }}, + {0x042A, 0x002A, 0x042A, 220,21752, 21758, 21758, 21758, 21779, 19300, 3156, 19271, 21807, {0, 0, 0, 0, 0}, 91, 91, { 1258, 500, 10000, 1258, ',' }}, + {0x042B, 0x002B, 0x042B, 5,21810, 21816, 21816, 21816, 21835, 19331, 19335, 19304, 465, {0, 0, 0, 0, 0}, 92, 92, { 0, 500, 2, 1, ',' }}, + {0x042D, 0x002D, 0x042D, 61,21900, 21906, 21906, 21906, 21921, 19357, 19361, 19339, 19998, {0, 0, 0, 0, 0}, 93, 93, { 1252, 500, 10000, 850, ';' }}, + {0x042F, 0x002F, 0x042F, 128,21940, 21946, 21946, 21946, 21969, 19400, 19404, 19365, 22013, {0, 0, 0, 0, 0}, 94, 94, { 1251, 500, 10007, 866, ';' }}, + {0x0436, 0x0036, 0x0436, 227,22016, 22022, 22022, 22022, 22047, 19432, 19436, 19408, 22072, {0, 0, 0, 0, 0}, 95, 95, { 1252, 500, 10000, 850, ',' }}, + {0x0437, 0x0037, 0x0437, 72,22075, 22081, 22081, 22081, 22100, 19474, 19478, 19440, 22155, {0, 0, 0, 0, 0}, 96, 96, { 0, 500, 2, 1, ';' }}, + {0x0438, 0x0038, 0x0438, 67,22158, 22164, 22164, 22164, 22188, 19503, 19507, 19482, 22209, {0, 0, 0, 0, 0}, 97, 97, { 1252, 20277, 10079, 850, ';' }}, + {0x0439, 0x0039, 0x0439, 93,22212, 22218, 22218, 22218, 22232, 19536, 19540, 19511, 22263, {0, 0, 0, 0, 0}, 98, 98, { 0, 500, 2, 1, ',' }}, + {0x0441, 0x0041, 0x0441, 102,22266, 22272, 22272, 22272, 22288, 19565, 19569, 19544, 22306, {0, 0, 0, 0, 0}, 99, 99, { 1252, 500, 10000, 437, ',' }}, + {0x0447, 0x0047, 0x0447, 93,22309, 22315, 22315, 22315, 22332, 19607, 19611, 19573, 22263, {0, 0, 0, 0, 0}, 100, 100, { 0, 500, 2, 1, ',' }}, + {0x0449, 0x0049, 0x0449, 93,22369, 22375, 22375, 22375, 22389, 19640, 19644, 19615, 22263, {0, 0, 0, 0, 0}, 101, 101, { 0, 500, 2, 1, ',' }}, + {0x044A, 0x004A, 0x044A, 93,22429, 22435, 22435, 22435, 22450, 19677, 19681, 19648, 22263, {0, 0, 0, 0, 0}, 102, 102, { 0, 500, 2, 1, ',' }}, + {0x044B, 0x004B, 0x044B, 93,22497, 22503, 22503, 22503, 22519, 19712, 19716, 19685, 22263, {0, 0, 0, 0, 0}, 103, 103, { 0, 500, 2, 1, ',' }}, + {0x044E, 0x004E, 0x044E, 93,22550, 22556, 22556, 22556, 22572, 19747, 1862, 19720, 22263, {0, 0, 0, 0, 0}, 104, 104, { 0, 500, 2, 1, ',' }}, + {0x0456, 0x0056, 0x0456, 61,22603, 22609, 22609, 22609, 22626, 19770, 19774, 19751, 19998, {0, 0, 0, 0, 0}, 105, 105, { 1252, 500, 10000, 850, ',' }}, + {0x0457, 0x0057, 0x0457, 93,22643, 22650, 22650, 22650, 22666, 19809, 19778, 19778, 22263, {0, 0, 0, 0, 0}, 106, 106, { 0, 500, 2, 1, ',' }}, + {0x0801, 0x0001, 0x0801, 95,22700, 22706, 22706, 22706, 22720, 22750, 18169, 18140, 22754, {2, 1, 0, 0, 0}, 107, 107, { 1256, 20420, 10004, 720, ';' }}, + {0x0804, 0x0004, 0x0804, 42,22757, 22763, 22763, 22763, 22779, 18262, 18266, 18270, 11080, {0, 0, 0, 0, 0}, 108, 108, { 936, 500, 10008, 936, ',' }}, + {0x0807, 0x0007, 0x0807, 37,22795, 22801, 22801, 22801, 22822, 22840, 18346, 18324, 11001, {0, 0, 0, 0, 0}, 109, 109, { 1252, 20273, 10000, 850, ';' }}, + {0x0809, 0x0009, 0x0809, 70,22844, 22850, 22850, 22850, 22850, 22875, 18399, 18384, 22879, {0, 0, 0, 0, 0}, 110, 110, { 1252, 20285, 10000, 850, ',' }}, + {0x080A, 0x000A, 0x080A, 141,22882, 22888, 22888, 22888, 22905, 22924, 18427, 18403, 22928, {0, 0, 0, 0, 0}, 111, 111, { 1252, 20284, 10000, 850, ',' }}, + {0x080C, 0x000C, 0x080C, 17,22931, 22937, 22937, 22937, 22954, 22975, 18477, 5968, 22979, {0, 0, 0, 0, 0}, 112, 112, { 1252, 20297, 10000, 850, ';' }}, + {0x0810, 0x0010, 0x0810, 37,22982, 22988, 22988, 22988, 23010, 23030, 18593, 18569, 11001, {0, 0, 0, 0, 0}, 113, 113, { 1252, 500, 10000, 850, ';' }}, + {0x0813, 0x0013, 0x0813, 17,23034, 23040, 23040, 23040, 23056, 23077, 18679, 18655, 22979, {0, 0, 0, 0, 0}, 114, 114, { 1252, 500, 10000, 850, ';' }}, + {0x0814, 0x0014, 0x0814, 150,23081, 23087, 23087, 23087, 23114, 23136, 23140, 23144, 20803, {0, 0, 0, 0, 0}, 115, 115, { 1252, 20277, 10000, 850, ';' }}, + {0x0816, 0x0016, 0x0816, 166,23147, 23153, 23153, 23153, 23175, 23197, 18764, 18735, 23201, {0, 0, 0, 0, 0}, 116, 116, { 1252, 500, 10000, 850, ';' }}, + {0x081D, 0x001D, 0x081D, 63,23204, 23210, 23210, 23210, 23228, 23246, 18939, 18916, 20323, {0, 0, 0, 0, 0}, 117, 117, { 1252, 20278, 10000, 850, ';' }}, + {0x0C01, 0x0001, 0x0C01, 58,23250, 23256, 23256, 23256, 23271, 23295, 18169, 18140, 23299, {16777216, 0, 0, 0, 0}, 118, 118, { 1256, 20420, 10004, 720, ';' }}, + {0x0C04, 0x7C04, 0x0C04, 85,23302, 23308, 23308, 23308, 23342, 23379, 18266, 18270, 23383, {0, 0, 0, 0, 0}, 119, 119, { 950, 500, 10002, 950, ',' }}, + {0x0C07, 0x0007, 0x0C07, 10,23386, 23392, 23392, 23392, 23409, 23431, 18346, 18324, 23435, {0, 0, 0, 0, 0}, 120, 120, { 1252, 20273, 10000, 850, ';' }}, + {0x0C09, 0x0009, 0x0C09, 11,23438, 23444, 23444, 23444, 23444, 23464, 18399, 18384, 23468, {0, 0, 0, 0, 0}, 121, 121, { 1252, 500, 10000, 850, ',' }}, + {0x0C0A, 0x000A, 0x0C0A, 61,23471, 23477, 23477, 23477, 23493, 23512, 18427, 18403, 19998, {0, 0, 0, 0, 0}, 122, 122, { 1252, 20284, 10000, 850, ';' }}, + {0x0C0C, 0x000C, 0x0C0C, 32,23516, 23522, 23522, 23522, 23538, 23557, 18477, 5968, 23561, {0, 0, 0, 0, 0}, 123, 123, { 1252, 20297, 10000, 850, ';' }}, + {0x1001, 0x0001, 0x1001, 122,23564, 23570, 23570, 23570, 23585, 23613, 18169, 18140, 23617, {16777216, 0, 0, 0, 0}, 124, 124, { 1256, 20420, 10004, 720, ';' }}, + {0x1004, 0x0004, 0x1004, 179,23620, 23626, 23626, 23626, 23646, 23665, 18266, 18270, 23669, {0, 0, 0, 0, 0}, 125, 125, { 936, 500, 10008, 936, ',' }}, + {0x1007, 0x0007, 0x1007, 120,23672, 23678, 23678, 23678, 23698, 23718, 18346, 18324, 23722, {0, 0, 0, 0, 0}, 126, 126, { 1252, 20273, 10000, 850, ';' }}, + {0x1009, 0x0009, 0x1009, 32,23725, 23731, 23731, 23731, 23731, 23748, 18399, 18384, 23561, {0, 0, 0, 0, 0}, 127, 127, { 1252, 37, 10000, 850, ',' }}, + {0x100A, 0x000A, 0x100A, 82,23752, 23758, 23758, 23758, 23778, 23799, 18427, 18403, 23803, {0, 0, 0, 0, 0}, 128, 128, { 1252, 20284, 10000, 850, ',' }}, + {0x100C, 0x000C, 0x100C, 37,23806, 23812, 23812, 23812, 23833, 23852, 18477, 5968, 11001, {0, 0, 0, 0, 0}, 129, 129, { 1252, 20297, 10000, 850, ';' }}, + {0x1401, 0x0001, 0x1401, 55,23856, 23862, 23862, 23862, 23879, 23911, 18169, 18140, 23915, {16777216, 0, 0, 0, 0}, 130, 130, { 1256, 20420, 10004, 720, ';' }}, + {0x1404, 0x0004, 0x1404, 132,23918, 23924, 23924, 23924, 23953, 23990, 18266, 18270, 23994, {0, 0, 0, 0, 0}, 131, 131, { 950, 500, 10002, 950, ',' }}, + {0x1409, 0x0009, 0x1409, 154,23997, 24003, 24003, 24003, 24003, 24025, 18399, 18384, 24029, {0, 0, 0, 0, 0}, 132, 132, { 1252, 500, 10000, 850, ',' }}, + {0x140A, 0x000A, 0x140A, 44,24032, 24038, 24038, 24038, 24059, 24081, 18427, 18403, 24085, {0, 0, 0, 0, 0}, 133, 133, { 1252, 20284, 10000, 850, ',' }}, + {0x140C, 0x000C, 0x140C, 120,24088, 24094, 24094, 24094, 24114, 24137, 18477, 5968, 23722, {0, 0, 0, 0, 0}, 134, 134, { 1252, 20297, 10000, 850, ';' }}, + {0x1801, 0x0001, 0x1801, 123,24141, 24147, 24147, 24147, 24164, 24194, 18169, 18140, 24198, {16777216, 0, 0, 0, 0}, 135, 135, { 1256, 20420, 10004, 720, ';' }}, + {0x1809, 0x0009, 0x1809, 91,24201, 24207, 24207, 24207, 24207, 24225, 18399, 18384, 24229, {0, 0, 0, 0, 0}, 136, 136, { 1252, 500, 10000, 850, ',' }}, + {0x180A, 0x000A, 0x180A, 156,24232, 24238, 24238, 24238, 24255, 24274, 18427, 18403, 24278, {0, 0, 0, 0, 0}, 137, 137, { 1252, 20284, 10000, 850, ',' }}, + {0x1C01, 0x0001, 0x1C01, 202,24281, 24287, 24287, 24287, 24304, 24330, 18169, 18140, 24334, {16777216, 0, 0, 0, 0}, 138, 138, { 1256, 20420, 10004, 720, ';' }}, + {0x1C09, 0x0009, 0x1C09, 227,24337, 24343, 24343, 24343, 24343, 24366, 18399, 18384, 22072, {0, 0, 0, 0, 0}, 139, 139, { 1252, 500, 10000, 437, ',' }}, + {0x1C0A, 0x000A, 0x1C0A, 54,24370, 24376, 24376, 24376, 24405, 24438, 18427, 18403, 24442, {0, 0, 0, 0, 0}, 140, 140, { 1252, 20284, 10000, 850, ',' }}, + {0x2001, 0x0001, 0x2001, 155,24445, 24451, 24451, 24451, 24465, 24491, 18169, 18140, 24495, {16777216, 0, 0, 0, 0}, 141, 141, { 1256, 20420, 10004, 720, ';' }}, + {0x200A, 0x000A, 0x200A, 217,24498, 24504, 24504, 24504, 24524, 24545, 18427, 18403, 24549, {0, 0, 0, 0, 0}, 142, 142, { 1252, 20284, 10000, 850, ',' }}, + {0x2401, 0x0001, 0x2401, 224,24552, 24558, 24558, 24558, 24573, 24601, 18169, 18140, 24605, {16777216, 0, 0, 0, 0}, 143, 143, { 1256, 20420, 10004, 720, ';' }}, + {0x240A, 0x000A, 0x240A, 43,24608, 24614, 24614, 24614, 24633, 24653, 18427, 18403, 24657, {0, 0, 0, 0, 0}, 144, 144, { 1252, 20284, 10000, 850, ',' }}, + {0x2801, 0x0001, 0x2801, 191,24660, 24666, 24666, 24666, 24681, 24709, 18169, 18140, 24713, {16777216, 0, 0, 0, 0}, 145, 145, { 1256, 20420, 10004, 720, ';' }}, + {0x280A, 0x000A, 0x280A, 157,24716, 24722, 24722, 24722, 24737, 24754, 18427, 18403, 24758, {0, 0, 0, 0, 0}, 146, 146, { 1252, 20284, 10000, 850, ',' }}, + {0x2C01, 0x0001, 0x2C01, 100,24761, 24767, 24767, 24767, 24783, 24813, 18169, 18140, 24817, {16777216, 0, 0, 0, 0}, 147, 147, { 1256, 20420, 10004, 720, ';' }}, + {0x2C0A, 0x000A, 0x2C0A, 8,24820, 24826, 24826, 24826, 24846, 24867, 18427, 18403, 24871, {0, 0, 0, 0, 0}, 148, 148, { 1252, 20284, 10000, 850, ',' }}, + {0x3001, 0x0001, 0x3001, 114,24874, 24880, 24880, 24880, 24897, 24925, 18169, 18140, 24929, {16777216, 0, 0, 0, 0}, 149, 149, { 1256, 20420, 10004, 720, ';' }}, + {0x3009, 0x0009, 0x3009, 229,24932, 24938, 24938, 24938, 24938, 24957, 18399, 18384, 24961, {0, 0, 0, 0, 0}, 150, 150, { 1252, 500, 10000, 437, ',' }}, + {0x300A, 0x000A, 0x300A, 56,24964, 24970, 24970, 24970, 24988, 25007, 18427, 18403, 25011, {0, 0, 0, 0, 0}, 151, 151, { 1252, 20284, 10000, 850, ',' }}, + {0x3401, 0x0001, 0x3401, 110,25014, 25020, 25020, 25020, 25036, 25066, 18169, 18140, 25070, {16777216, 0, 0, 0, 0}, 152, 152, { 1256, 20420, 10004, 720, ';' }}, + {0x3409, 0x0009, 0x3409, 160,25073, 25079, 25079, 25079, 25079, 25101, 18399, 18384, 25105, {0, 0, 0, 0, 0}, 153, 153, { 1252, 500, 10000, 437, ',' }}, + {0x340A, 0x000A, 0x340A, 40,25108, 25114, 25114, 25114, 25130, 25147, 18427, 18403, 25151, {0, 0, 0, 0, 0}, 154, 154, { 1252, 20284, 10000, 850, ',' }}, + {0x3801, 0x0001, 0x3801, 0,25154, 25160, 25160, 25160, 25190, 25254, 18169, 18140, 25258, {16777216, 0, 0, 0, 0}, 155, 155, { 1256, 20420, 10004, 720, ';' }}, + {0x380A, 0x000A, 0x380A, 213,25261, 25267, 25267, 25267, 25285, 25304, 18427, 18403, 25308, {0, 0, 0, 0, 0}, 156, 156, { 1252, 20284, 10000, 850, ',' }}, + {0x3C01, 0x0001, 0x3C01, 20,25311, 25317, 25317, 25317, 25334, 25366, 18169, 18140, 25370, {16777216, 0, 0, 0, 0}, 157, 157, { 1256, 20420, 10004, 720, ';' }}, + {0x3C0A, 0x000A, 0x3C0A, 168,25373, 25379, 25379, 25379, 25398, 25418, 18427, 18403, 25422, {0, 0, 0, 0, 0}, 158, 158, { 1252, 20284, 10000, 850, ',' }}, + {0x4001, 0x0001, 0x4001, 169,25425, 25431, 25431, 25431, 25446, 25470, 18169, 18140, 25474, {16777216, 0, 0, 0, 0}, 159, 159, { 1256, 20420, 10004, 720, ';' }}, + {0x400A, 0x000A, 0x400A, 25,25477, 25483, 25483, 25483, 25501, 25520, 18427, 18403, 25524, {0, 0, 0, 0, 0}, 160, 160, { 1252, 20284, 10000, 850, ',' }}, + {0x440A, 0x000A, 0x440A, 190,25527, 25533, 25533, 25533, 25555, 25578, 18427, 18403, 25582, {0, 0, 0, 0, 0}, 161, 161, { 1252, 20284, 10000, 850, ',' }}, + {0x480A, 0x000A, 0x480A, 87,25585, 25591, 25591, 25591, 25610, 25630, 18427, 18403, 25634, {0, 0, 0, 0, 0}, 162, 162, { 1252, 20284, 10000, 850, ',' }}, + {0x4C0A, 0x000A, 0x4C0A, 148,25637, 25643, 25643, 25643, 25663, 25684, 18427, 18403, 25688, {0, 0, 0, 0, 0}, 163, 163, { 1252, 20284, 10000, 850, ',' }}, + {0x500A, 0x000A, 0x500A, 165,25691, 25697, 25697, 25697, 25719, 25742, 18427, 18403, 25746, {0, 0, 0, 0, 0}, 164, 164, { 1252, 20284, 10000, 850, ',' }}, + {0x7C04, 0x007F, 0x0000, -1,25749, 20007, 18247, 18247, 18255, 20040, 18266, 18270, 0, {0, 0, 0, 0, 0}, 165, 165, { 950, 500, 10002, 950, ',' }} }; static const CultureInfoNameEntry culture_name_entries [] = { - {19262, 42}, - {25485, 94}, - {17994, 0}, - {25491, 153}, - {25497, 155}, - {25503, 128}, - {25509, 116}, - {25515, 105}, - {25521, 145}, - {25527, 150}, - {25533, 147}, - {25539, 122}, - {25545, 133}, - {25551, 139}, - {25557, 157}, - {25563, 53}, - {25569, 143}, - {25575, 136}, - {25581, 141}, - {18932, 32}, - {25587, 84}, - {18027, 1}, - {25593, 54}, - {18067, 2}, - {25599, 55}, - {18127, 4}, - {25605, 57}, - {18154, 5}, - {25611, 58}, - {18178, 6}, - {25617, 118}, - {25623, 107}, - {25629, 59}, - {25635, 124}, - {18204, 7}, - {25641, 60}, - {18238, 8}, - {25647, 119}, - {25653, 125}, - {25659, 108}, - {25665, 134}, - {25671, 130}, - {25677, 151}, - {25683, 61}, - {25689, 137}, - {25695, 148}, - {18257, 9}, - {25701, 146}, - {25707, 158}, - {25713, 152}, - {25719, 142}, - {25725, 131}, - {25731, 138}, - {25737, 149}, - {25743, 120}, - {25749, 126}, - {25755, 160}, - {25761, 109}, - {25767, 161}, - {25773, 135}, - {25779, 144}, - {25785, 162}, - {25791, 156}, - {25797, 159}, - {25803, 154}, - {25809, 140}, - {19008, 34}, - {25815, 86}, - {19193, 40}, - {25821, 92}, - {19095, 37}, - {25827, 89}, - {18285, 10}, - {25833, 62}, - {19294, 43}, - {25839, 95}, + {19408, 42}, + {25756, 95}, + {18140, 0}, + {25762, 155}, + {25768, 157}, + {25774, 130}, + {25780, 118}, + {25786, 107}, + {25792, 147}, + {25798, 152}, + {25804, 149}, + {25810, 124}, + {25816, 135}, + {25822, 141}, + {25828, 159}, + {25834, 54}, + {25840, 145}, + {25846, 138}, + {25852, 143}, + {19078, 32}, + {25858, 85}, + {18173, 1}, + {25864, 55}, + {18213, 2}, + {25870, 56}, + {18273, 4}, + {25876, 58}, + {18300, 5}, + {25882, 59}, + {18324, 6}, + {25888, 120}, + {25894, 109}, + {25900, 60}, + {25906, 126}, + {18350, 7}, + {25912, 61}, + {18384, 8}, + {25918, 121}, + {25924, 127}, + {25930, 110}, + {25936, 136}, + {25942, 132}, + {25948, 153}, + {25954, 62}, + {25960, 139}, + {25966, 150}, + {18403, 9}, + {25972, 148}, + {25978, 160}, + {25984, 154}, + {25990, 144}, + {25996, 133}, + {26002, 140}, + {26008, 151}, + {26014, 122}, + {26020, 128}, + {26026, 162}, + {26032, 111}, + {26038, 163}, + {26044, 137}, + {26050, 146}, + {26056, 164}, + {26062, 158}, + {26068, 161}, + {26074, 156}, + {26080, 142}, + {19154, 34}, + {26086, 87}, + {19339, 40}, + {26092, 93}, + {19241, 37}, + {26098, 90}, + {18431, 10}, + {26104, 63}, + {19482, 44}, + {26110, 97}, {5968, 11}, - {25845, 110}, - {25851, 121}, - {25857, 127}, - {25863, 63}, - {25869, 132}, - {19563, 51}, - {25875, 103}, - {19385, 46}, - {25881, 98}, - {18335, 12}, - {25887, 64}, - {19323, 44}, - {25893, 96}, - {18685, 24}, - {25899, 76}, - {18364, 13}, - {25905, 65}, - {19158, 39}, - {25911, 91}, - {18851, 30}, - {25917, 82}, - {18392, 14}, - {25923, 66}, - {18423, 15}, - {25929, 111}, - {25935, 67}, - {18451, 16}, - {25941, 68}, - {19497, 49}, - {25947, 101}, - {18481, 17}, - {25953, 69}, - {19590, 52}, - {25959, 104}, - {19063, 36}, - {25966, 88}, - {19034, 35}, - {25972, 87}, - {19219, 41}, - {25978, 93}, - {19532, 50}, - {25984, 102}, - {25990, 71}, - {18509, 18}, - {25996, 112}, - {26002, 70}, - {26008, 113}, - {18537, 19}, - {18564, 20}, - {26014, 72}, - {18589, 21}, - {26020, 73}, - {26026, 114}, - {18622, 22}, - {26032, 74}, - {18651, 23}, - {26038, 75}, - {18714, 25}, - {26044, 77}, - {18973, 33}, - {26050, 85}, - {18743, 26}, - {26056, 78}, - {18770, 27}, - {26062, 115}, - {26068, 79}, - {19356, 45}, - {26074, 97}, - {19427, 47}, - {26080, 99}, - {19460, 48}, - {26086, 100}, - {18797, 28}, - {26092, 80}, - {18823, 29}, - {26098, 81}, - {18890, 31}, - {26104, 83}, - {19125, 38}, - {26110, 90}, - {26116, 3}, - {26123, 163}, - {26130, 106}, - {26136, 117}, - {26142, 129}, - {26148, 123}, - {26154, 56} + {26116, 112}, + {26122, 123}, + {26128, 129}, + {26134, 64}, + {26140, 134}, + {19751, 52}, + {26146, 105}, + {19573, 47}, + {26152, 100}, + {18481, 12}, + {26158, 65}, + {19511, 45}, + {26164, 98}, + {18831, 24}, + {26170, 77}, + {18510, 13}, + {26176, 66}, + {19304, 39}, + {26182, 92}, + {18997, 30}, + {26188, 83}, + {18538, 14}, + {26194, 67}, + {18569, 15}, + {26200, 113}, + {26206, 68}, + {18597, 16}, + {26212, 69}, + {19440, 43}, + {26218, 96}, + {19685, 50}, + {26224, 103}, + {18627, 17}, + {26230, 70}, + {19778, 53}, + {26236, 106}, + {19209, 36}, + {26243, 89}, + {19180, 35}, + {26249, 88}, + {19365, 41}, + {26255, 94}, + {19720, 51}, + {26261, 104}, + {26267, 72}, + {18655, 18}, + {26273, 114}, + {26279, 71}, + {26285, 115}, + {18683, 19}, + {18710, 20}, + {26291, 73}, + {18735, 21}, + {26297, 74}, + {26303, 116}, + {18768, 22}, + {26309, 75}, + {18797, 23}, + {26315, 76}, + {18860, 25}, + {26321, 78}, + {19119, 33}, + {26327, 86}, + {18889, 26}, + {26333, 79}, + {18916, 27}, + {26339, 117}, + {26345, 80}, + {19544, 46}, + {26351, 99}, + {19615, 48}, + {26357, 101}, + {19648, 49}, + {26363, 102}, + {18943, 28}, + {26369, 81}, + {18969, 29}, + {26375, 82}, + {19036, 31}, + {26381, 84}, + {19271, 38}, + {26387, 91}, + {26393, 3}, + {26400, 165}, + {26407, 108}, + {26413, 119}, + {26419, 131}, + {26425, 125}, + {26431, 57} }; static const RegionInfoEntry region_entries [] = { - { 0, 0,24987,343,343,26160,343,26181,26185}, - { 0, 1,26213,343,343,26216,343,26228,26232}, - { 0, 2,26240,343,343,26243,343,26263,26267}, - { 0, 3,26289,343,343,26292,343,26263,26267}, - { 0, 4,20966,343,343,26301,343,26309,26313}, - { 0, 5,465,343,343,26326,343,26334,26338}, - { 0, 6,26352,343,343,26355,343,26376,26380}, - { 0, 7,26409,343,343,26412,343,26419,26423}, - { 0, 8,24600,343,343,26438,343,24438,26448}, - { 0, 9,26463,343,343,26466,343,26481,26485}, - { 0, 10,23164,343,343,26495,343,26503,26507}, - { 0, 11,23197,343,343,26512,343,26522,26526}, - { 0, 12,26544,343,343,26547,343,26553,26557}, - { 0, 13,26572,343,343,26575,343,26586,26590}, - { 0, 14,26610,343,343,26613,343,26636,26640}, - { 0, 15,26676,343,343,26679,343,26688,26692}, - { 0, 16,26708,343,343,26711,343,26722,26726}, - { 0, 17,22708,343,343,26742,343,26503,26507}, - { 0, 18,26750,343,343,26753,343,26766,26770}, - { 0, 19,19767,343,343,26786,343,26795,26799}, - { 0, 20,25099,343,343,26817,343,26825,26829}, - { 0, 21,26844,343,343,26847,343,26855,26859}, - { 0, 22,26873,343,343,26876,343,26766,26770}, - { 0, 23,26882,343,343,26885,343,26893,26897}, - { 0, 24,26913,343,343,26916,343,26923,26927}, - { 0, 25,25253,343,343,26941,343,26949,26953}, - { 0, 26,20705,343,343,26963,343,26970,26974}, - { 0, 27,26989,343,343,26992,343,27000,27004}, - { 0, 28,27020,343,343,27023,343,27037,27041}, - { 0, 29,27057,343,343,27060,343,27069,27073}, - { 0, 30,21317,343,343,27088,343,27096,27100}, - { 0, 31,27118,343,343,27121,343,27128,27132}, - { 0, 32,23290,343,343,27146,343,27153,27157}, - { 0, 33,27173,343,343,27176,343,26522,26526}, - { 0, 34,27190,343,343,27193,343,27226,27230}, - { 0, 35,27256,343,343,27259,343,27284,27288}, - { 0, 36,27303,343,343,27306,343,27284,27288}, - { 0, 37,11001,343,343,27312,343,27324,27328}, - { 0, 38,27340,343,343,27343,343,26766,26770}, - { 0, 39,27358,343,343,27361,343,27374,27378}, - { 0, 40,24880,343,343,27397,343,27403,27407}, - { 0, 41,27420,343,343,27423,343,27284,27288}, - { 0, 42,11080,343,343,27432,343,27438,27442}, - { 0, 43,24386,343,343,27464,343,27473,27477}, - { 0, 44,23814,343,343,27492,343,17836,27503}, - { 0, 45,27521,343,343,27524,343,27529,27533}, - { 0, 46,27544,343,343,27547,343,27558,27562}, - { 0, 47,27580,343,343,27583,343,26522,26526}, - { 0, 48,27600,343,343,27603,343,27610,27614}, - { 0, 49,19918,343,343,27627,343,27642,27646}, - { 0, 50,4291,343,343,27668,343,26503,26507}, - { 0, 51,27676,343,343,27679,343,27688,27692}, - { 0, 52,19960,343,343,27707,343,27715,27719}, - { 0, 53,27732,343,343,27735,343,26263,26267}, - { 0, 54,24171,343,343,27744,343,27763,27767}, - { 0, 55,23644,343,343,27782,343,27790,27794}, - { 0, 56,24740,343,343,27809,343,27817,27821}, - { 0, 57,21415,343,343,27835,343,27843,27847}, - { 0, 58,23028,343,343,27862,343,27868,27872}, - { 0, 59,27887,343,343,27890,343,27905,27909}, - { 0, 60,27925,343,343,27928,343,27936,27940}, - { 0, 61,19810,343,343,27955,343,26503,26507}, - { 0, 62,27961,343,343,27964,343,27973,27977}, - { 0, 63,20135,343,343,27992,343,26503,26507}, - { 0, 64,28000,343,343,28003,343,28008,28012}, - { 0, 65,28024,343,343,28027,343,28044,28048}, - { 0, 66,28071,343,343,28074,343,26481,26485}, - { 0, 67,21938,343,343,28085,343,27715,27719}, - { 0, 68,20179,343,343,28099,343,26503,26507}, - { 0, 69,28106,343,343,28109,343,27284,27288}, - { 0, 70,22608,343,343,28115,343,28130,28134}, - { 0, 71,28157,343,343,28160,343,26263,26267}, - { 0, 72,28168,343,343,28171,343,28179,28183}, - { 0, 73,28197,343,343,28200,343,26503,26507}, - { 0, 74,28214,343,343,28217,343,28223,28227}, - { 0, 75,28238,343,343,28241,343,28251,28255}, - { 0, 76,28271,343,343,28274,343,27715,27719}, - { 0, 77,28284,343,343,28287,343,28294,28298}, - { 0, 78,28312,343,343,28315,343,28322,28326}, - { 0, 79,28339,343,343,28342,343,26503,26507}, - { 0, 80,28353,343,343,28356,343,27284,27288}, - { 0, 81,20061,343,343,28374,343,26503,26507}, - { 0, 82,23532,343,343,28381,343,28391,28395}, - { 0, 83,28413,343,343,28416,343,26481,26485}, - { 0, 84,28421,343,343,28424,343,28431,28435}, - { 0, 85,23112,343,343,28449,343,28473,28477}, - { 0, 86,28494,343,343,28497,343,26522,26526}, - { 0, 87,25363,343,343,28531,343,28540,28544}, - { 0, 88,20857,343,343,28560,343,28568,28572}, - { 0, 89,20280,343,343,28586,343,28594,28598}, - { 0, 90,21182,343,343,28615,343,28625,28629}, - { 0, 91,23958,343,343,28647,343,26503,26507}, - { 0, 92,20228,343,343,28655,343,28662,28666}, - { 0, 93,21992,343,343,28685,343,28691,28695}, - { 0, 94,28708,343,343,28711,343,26481,26485}, - { 0, 95,22483,343,343,28742,343,28747,28751}, - { 0, 96,21561,343,343,28763,343,28768,28772}, - { 0, 97,20329,343,343,28785,343,28793,28797}, - { 0, 98,20372,343,343,28813,343,26503,26507}, - { 0, 99,28819,343,343,28822,343,28830,28834}, - { 0, 100,24546,343,343,28850,343,28857,28861}, - { 0, 101,20417,343,343,28877,343,28883,28887}, - { 0, 102,22035,343,343,28900,343,28906,28910}, - { 0, 103,28926,343,343,28929,343,28940,28944}, - { 0, 104,28958,343,343,28961,343,28970,28974}, - { 0, 105,28989,343,343,28992,343,26522,26526}, - { 0, 106,29001,343,343,29004,343,29012,29016}, - { 0, 107,29029,343,343,29032,343,26263,26267}, - { 0, 108,29054,343,343,29057,343,29069,29073}, - { 0, 109,20472,343,343,29090,343,29102,29106}, - { 0, 110,24799,343,343,29123,343,29130,29134}, - { 0, 111,29148,343,343,29151,343,29166,29170}, - { 0, 112,29192,343,343,29195,343,29206,29210}, - { 0, 113,29227,343,343,29230,343,29235,29239}, - { 0, 114,24658,343,343,29251,343,29259,29263}, - { 0, 115,29278,343,343,29281,343,26263,26267}, - { 0, 116,29293,343,343,29296,343,27324,27328}, - { 0, 117,29310,343,343,29313,343,29323,29327}, - { 0, 118,29343,343,343,29346,343,29354,29358}, - { 0, 119,21513,343,343,29374,343,29384,29388}, - { 0, 120,23451,343,343,29404,343,26503,26507}, - { 0, 121,21461,343,343,29415,343,29422,29426}, - { 0, 122,23346,343,343,29439,343,29445,29449}, - { 0, 123,23927,343,343,29462,343,27905,27909}, - { 0, 124,29470,343,343,29473,343,26503,26507}, - { 0, 125,7428,343,343,29480,343,29488,29492}, - { 0, 126,29505,343,343,29508,343,29519,29523}, - { 0, 127,29540,343,343,29543,343,26481,26485}, - { 0, 128,21825,343,343,29560,343,29570,29574}, - { 0, 129,29591,343,343,29594,343,26766,26770}, - { 0, 130,29599,343,343,29602,343,29610,29614}, - { 0, 131,29627,343,343,29630,343,29639,29643}, - { 0, 132,23723,343,343,29660,343,29679,29683}, - { 0, 133,29696,343,343,29699,343,26481,26485}, - { 0, 134,29724,343,343,29727,343,26503,26507}, - { 0, 135,29738,343,343,29741,343,29752,29756}, - { 0, 136,29775,343,343,29778,343,26263,26267}, - { 0, 137,29789,343,343,29792,343,29798,29802}, - { 0, 138,29815,343,343,29818,343,29828,29832}, - { 0, 139,29848,343,343,29851,343,29860,29864}, - { 0, 140,29888,343,343,29891,343,29898,29902}, - { 0, 141,22657,343,343,29916,343,29923,29927}, - { 0, 142,29940,343,343,29943,343,29952,29956}, - { 0, 143,29974,343,343,29977,343,29988,29992}, - { 0, 144,30011,343,343,30014,343,30028,30032}, - { 0, 145,30042,343,343,30045,343,26766,26770}, - { 0, 146,30051,343,343,30054,343,26522,26526}, - { 0, 147,30069,343,343,30072,343,30080,30084}, - { 0, 148,25417,343,343,30099,343,30109,30113}, - { 0, 149,20524,343,343,30136,343,26503,26507}, - { 0, 150,20615,343,343,30148,343,27037,27041}, - { 0, 151,30155,343,343,30158,343,30164,30168}, - { 0, 152,30183,343,343,30186,343,26522,26526}, - { 0, 153,30192,343,343,30195,343,27374,27378}, - { 0, 154,23758,343,343,30200,343,27374,27378}, - { 0, 155,24224,343,343,30212,343,30217,30221}, - { 0, 156,24007,343,343,30231,343,30238,30242}, - { 0, 157,24487,343,343,30260,343,30265,30269}, - { 0, 158,30288,343,343,30291,343,30028,30032}, - { 0, 159,30308,343,343,30311,343,30328,30332}, - { 0, 160,24834,343,343,30354,343,17940,30366}, - { 0, 161,30382,343,343,30385,343,30394,30398}, - { 0, 162,20656,343,343,30413,343,30420,30424}, - { 0, 163,468,343,343,30437,343,26503,26507}, - { 0, 164,30463,343,343,30466,343,27374,27378}, - { 0, 165,25475,343,343,30475,343,26481,26485}, - { 0, 166,22930,343,343,30487,343,26503,26507}, - { 0, 167,30496,343,343,30499,343,26481,26485}, - { 0, 168,25151,343,343,30505,343,30514,30518}, - { 0, 169,25203,343,343,30535,343,30541,30545}, - { 0, 170,30557,343,343,30560,343,26503,26507}, - { 0, 171,20753,343,343,30569,343,30577,30581}, - { 0, 172,20809,343,343,30594,343,30601,30605}, - { 0, 173,30631,343,343,30634,343,30641,30645}, - { 0, 174,10998,343,343,30659,343,30672,30676}, - { 0, 175,30688,343,343,30691,343,30707,30711}, - { 0, 176,30734,343,343,30737,343,30748,30752}, - { 0, 177,30769,343,343,30772,343,30778,30782}, - { 0, 178,21010,343,343,30797,343,30804,30808}, - { 0, 179,23398,343,343,30822,343,30832,30836}, - { 0, 180,30853,343,343,30856,343,30869,30873}, - { 0, 181,21373,343,343,30892,343,17714,30901}, - { 0, 182,30916,343,343,30919,343,27037,27041}, - { 0, 183,20918,343,343,30942,343,30951,30955}, - { 0, 184,30969,343,343,30972,343,30985,30989}, - { 0, 185,31008,343,343,31011,343,26503,26507}, - { 0, 186,31022,343,343,31025,343,26766,26770}, - { 0, 187,31033,343,343,31036,343,31044,31048}, - { 0, 188,31064,343,343,31067,343,31076,31080}, - { 0, 189,31097,343,343,31100,343,31122,31126}, - { 0, 190,25311,343,343,31154,343,17984,31166}, - { 0, 191,24442,343,343,31184,343,31190,31194}, - { 0, 192,31207,343,343,31210,343,31220,31224}, - { 0, 193,31244,343,343,31247,343,26481,26485}, - { 0, 194,31272,343,343,31275,343,27284,27288}, - { 0, 195,31280,343,343,31283,343,26503,26507}, - { 0, 196,31311,343,343,31314,343,26766,26770}, - { 0, 197,21075,343,343,31319,343,31328,31332}, - { 0, 198,31342,343,343,31345,343,31356,31360}, - { 0, 199,31378,343,343,31381,343,27374,27378}, - { 0, 200,17700,343,343,31389,343,26481,26485}, - { 0, 201,31401,343,343,31404,343,31417,31421}, - { 0, 202,24063,343,343,31440,343,31448,31452}, - { 0, 203,31467,343,343,31470,343,31476,31480}, - { 0, 204,21121,343,343,31495,343,31502,31506}, - { 0, 205,31519,343,343,31522,343,31542,31546}, - { 0, 206,31573,343,343,31576,343,26522,26526}, - { 0, 207,19856,343,343,31583,343,31590,31594}, - { 0, 208,31612,343,343,31615,343,31624,31628}, - { 0, 209,21249,343,343,31647,343,31655,31659}, - { 0, 210,31677,343,343,31680,343,31687,31691}, - { 0, 211,31708,343,343,31711,343,26481,26485}, - { 0, 212,20094,343,343,31748,343,26481,26485}, - { 0, 213,25037,343,343,31762,343,31770,31774}, - { 0, 214,31796,343,343,31799,343,31810,31814}, - { 0, 215,31829,343,343,31832,343,26503,26507}, - { 0, 216,31840,343,343,31843,343,26263,26267}, - { 0, 217,24278,343,343,31876,343,31886,31890}, - { 0, 218,31909,343,343,31912,343,26481,26485}, - { 0, 219,1619,343,343,31935,343,26481,26485}, - { 0, 220,21619,343,343,31955,343,31963,31967}, - { 0, 221,31983,343,343,31986,343,31994,31998}, - { 0, 222,32011,343,343,32014,343,30028,30032}, - { 0, 223,32032,343,343,32035,343,32041,32045}, - { 0, 224,24334,343,343,32064,343,32070,32074}, - { 0, 225,32086,343,343,32089,343,26503,26507}, - { 0, 226,32097,343,343,32100,343,32111,32115}, - { 0, 227,21884,343,343,32139,343,32152,32156}, - { 0, 228,32175,343,343,32178,343,32185,32189}, - { 0, 229,24690,343,343,32204,343,32213,32217} + { 0, 0,25258,343,343,26437,343,26458,26462}, + { 0, 1,26490,343,343,26493,343,26505,26509}, + { 0, 2,26517,343,343,26520,343,26540,26544}, + { 0, 3,26566,343,343,26569,343,26540,26544}, + { 0, 4,21154,343,343,26578,343,26586,26590}, + { 0, 5,465,343,343,26603,343,26611,26615}, + { 0, 6,26629,343,343,26632,343,26653,26657}, + { 0, 7,26686,343,343,26689,343,26696,26700}, + { 0, 8,24871,343,343,26715,343,24709,26725}, + { 0, 9,26740,343,343,26743,343,26758,26762}, + { 0, 10,23435,343,343,26772,343,26780,26784}, + { 0, 11,23468,343,343,26789,343,26799,26803}, + { 0, 12,26821,343,343,26824,343,26830,26834}, + { 0, 13,26849,343,343,26852,343,26863,26867}, + { 0, 14,26887,343,343,26890,343,26913,26917}, + { 0, 15,26953,343,343,26956,343,26965,26969}, + { 0, 16,26985,343,343,26988,343,26999,27003}, + { 0, 17,22979,343,343,27019,343,26780,26784}, + { 0, 18,27027,343,343,27030,343,27043,27047}, + { 0, 19,19955,343,343,27063,343,27072,27076}, + { 0, 20,25370,343,343,27094,343,27102,27106}, + { 0, 21,27121,343,343,27124,343,27132,27136}, + { 0, 22,27150,343,343,27153,343,27043,27047}, + { 0, 23,27159,343,343,27162,343,27170,27174}, + { 0, 24,27190,343,343,27193,343,27200,27204}, + { 0, 25,25524,343,343,27218,343,27226,27230}, + { 0, 26,20893,343,343,27240,343,27247,27251}, + { 0, 27,27266,343,343,27269,343,27277,27281}, + { 0, 28,27297,343,343,27300,343,27314,27318}, + { 0, 29,27334,343,343,27337,343,27346,27350}, + { 0, 30,21505,343,343,27365,343,27373,27377}, + { 0, 31,27395,343,343,27398,343,27405,27409}, + { 0, 32,23561,343,343,27423,343,27430,27434}, + { 0, 33,27450,343,343,27453,343,26799,26803}, + { 0, 34,27467,343,343,27470,343,27503,27507}, + { 0, 35,27533,343,343,27536,343,27561,27565}, + { 0, 36,27580,343,343,27583,343,27561,27565}, + { 0, 37,11001,343,343,27589,343,27601,27605}, + { 0, 38,27617,343,343,27620,343,27043,27047}, + { 0, 39,27635,343,343,27638,343,27651,27655}, + { 0, 40,25151,343,343,27674,343,27680,27684}, + { 0, 41,27697,343,343,27700,343,27561,27565}, + { 0, 42,11080,343,343,27709,343,27715,27719}, + { 0, 43,24657,343,343,27741,343,27750,27754}, + { 0, 44,24085,343,343,27769,343,17982,27780}, + { 0, 45,27798,343,343,27801,343,27806,27810}, + { 0, 46,27821,343,343,27824,343,27835,27839}, + { 0, 47,27857,343,343,27860,343,26799,26803}, + { 0, 48,27877,343,343,27880,343,27887,27891}, + { 0, 49,20106,343,343,27904,343,27919,27923}, + { 0, 50,4291,343,343,27945,343,26780,26784}, + { 0, 51,27953,343,343,27956,343,27965,27969}, + { 0, 52,20148,343,343,27984,343,27992,27996}, + { 0, 53,28009,343,343,28012,343,26540,26544}, + { 0, 54,24442,343,343,28021,343,28040,28044}, + { 0, 55,23915,343,343,28059,343,28067,28071}, + { 0, 56,25011,343,343,28086,343,28094,28098}, + { 0, 57,21603,343,343,28112,343,28120,28124}, + { 0, 58,23299,343,343,28139,343,28145,28149}, + { 0, 59,28164,343,343,28167,343,28182,28186}, + { 0, 60,28202,343,343,28205,343,28213,28217}, + { 0, 61,19998,343,343,28232,343,26780,26784}, + { 0, 62,28238,343,343,28241,343,28250,28254}, + { 0, 63,20323,343,343,28269,343,26780,26784}, + { 0, 64,28277,343,343,28280,343,28285,28289}, + { 0, 65,28301,343,343,28304,343,28321,28325}, + { 0, 66,28348,343,343,28351,343,26758,26762}, + { 0, 67,22209,343,343,28362,343,27992,27996}, + { 0, 68,20367,343,343,28376,343,26780,26784}, + { 0, 69,28383,343,343,28386,343,27561,27565}, + { 0, 70,22879,343,343,28392,343,28407,28411}, + { 0, 71,28434,343,343,28437,343,26540,26544}, + { 0, 72,22155,343,343,28445,343,28453,28457}, + { 0, 73,28471,343,343,28474,343,26780,26784}, + { 0, 74,28488,343,343,28491,343,28497,28501}, + { 0, 75,28512,343,343,28515,343,28525,28529}, + { 0, 76,28545,343,343,28548,343,27992,27996}, + { 0, 77,28558,343,343,28561,343,28568,28572}, + { 0, 78,28586,343,343,28589,343,28596,28600}, + { 0, 79,28613,343,343,28616,343,26780,26784}, + { 0, 80,28627,343,343,28630,343,27561,27565}, + { 0, 81,20249,343,343,28648,343,26780,26784}, + { 0, 82,23803,343,343,28655,343,28665,28669}, + { 0, 83,28687,343,343,28690,343,26758,26762}, + { 0, 84,28695,343,343,28698,343,28705,28709}, + { 0, 85,23383,343,343,28723,343,28747,28751}, + { 0, 86,28768,343,343,28771,343,26799,26803}, + { 0, 87,25634,343,343,28805,343,28814,28818}, + { 0, 88,21045,343,343,28834,343,28842,28846}, + { 0, 89,20468,343,343,28860,343,28868,28872}, + { 0, 90,21370,343,343,28889,343,28899,28903}, + { 0, 91,24229,343,343,28921,343,26780,26784}, + { 0, 92,20416,343,343,28929,343,28936,28940}, + { 0, 93,22263,343,343,28959,343,28965,28969}, + { 0, 94,28982,343,343,28985,343,26758,26762}, + { 0, 95,22754,343,343,29016,343,29021,29025}, + { 0, 96,21749,343,343,29037,343,29042,29046}, + { 0, 97,20517,343,343,29059,343,29067,29071}, + { 0, 98,20560,343,343,29087,343,26780,26784}, + { 0, 99,29093,343,343,29096,343,29104,29108}, + { 0, 100,24817,343,343,29124,343,29131,29135}, + { 0, 101,20605,343,343,29151,343,29157,29161}, + { 0, 102,22306,343,343,29174,343,29180,29184}, + { 0, 103,29200,343,343,29203,343,29214,29218}, + { 0, 104,29232,343,343,29235,343,29244,29248}, + { 0, 105,29263,343,343,29266,343,26799,26803}, + { 0, 106,29275,343,343,29278,343,29286,29290}, + { 0, 107,29303,343,343,29306,343,26540,26544}, + { 0, 108,29328,343,343,29331,343,29343,29347}, + { 0, 109,20660,343,343,29364,343,29376,29380}, + { 0, 110,25070,343,343,29397,343,29404,29408}, + { 0, 111,29422,343,343,29425,343,29440,29444}, + { 0, 112,29466,343,343,29469,343,29480,29484}, + { 0, 113,29501,343,343,29504,343,29509,29513}, + { 0, 114,24929,343,343,29525,343,29533,29537}, + { 0, 115,29552,343,343,29555,343,26540,26544}, + { 0, 116,29567,343,343,29570,343,27601,27605}, + { 0, 117,29584,343,343,29587,343,29597,29601}, + { 0, 118,29617,343,343,29620,343,29628,29632}, + { 0, 119,21701,343,343,29648,343,29658,29662}, + { 0, 120,23722,343,343,29678,343,26780,26784}, + { 0, 121,21649,343,343,29689,343,29696,29700}, + { 0, 122,23617,343,343,29713,343,29719,29723}, + { 0, 123,24198,343,343,29736,343,28182,28186}, + { 0, 124,29744,343,343,29747,343,26780,26784}, + { 0, 125,7428,343,343,29754,343,29762,29766}, + { 0, 126,29779,343,343,29782,343,29793,29797}, + { 0, 127,29814,343,343,29817,343,26758,26762}, + { 0, 128,22013,343,343,29834,343,29844,29848}, + { 0, 129,29865,343,343,29868,343,27043,27047}, + { 0, 130,29873,343,343,29876,343,29884,29888}, + { 0, 131,29901,343,343,29904,343,29913,29917}, + { 0, 132,23994,343,343,29934,343,29953,29957}, + { 0, 133,29970,343,343,29973,343,26758,26762}, + { 0, 134,29998,343,343,30001,343,26780,26784}, + { 0, 135,30012,343,343,30015,343,30026,30030}, + { 0, 136,30049,343,343,30052,343,26540,26544}, + { 0, 137,30063,343,343,30066,343,30072,30076}, + { 0, 138,30089,343,343,30092,343,30102,30106}, + { 0, 139,30122,343,343,30125,343,30134,30138}, + { 0, 140,30162,343,343,30165,343,30172,30176}, + { 0, 141,22928,343,343,30190,343,30197,30201}, + { 0, 142,30214,343,343,30217,343,30226,30230}, + { 0, 143,30248,343,343,30251,343,30262,30266}, + { 0, 144,30285,343,343,30288,343,30302,30306}, + { 0, 145,30316,343,343,30319,343,27043,27047}, + { 0, 146,30325,343,343,30328,343,26799,26803}, + { 0, 147,30343,343,343,30346,343,30354,30358}, + { 0, 148,25688,343,343,30373,343,30383,30387}, + { 0, 149,20712,343,343,30410,343,26780,26784}, + { 0, 150,20803,343,343,30422,343,27314,27318}, + { 0, 151,30429,343,343,30432,343,30438,30442}, + { 0, 152,30457,343,343,30460,343,26799,26803}, + { 0, 153,30466,343,343,30469,343,27651,27655}, + { 0, 154,24029,343,343,30474,343,27651,27655}, + { 0, 155,24495,343,343,30486,343,30491,30495}, + { 0, 156,24278,343,343,30505,343,30512,30516}, + { 0, 157,24758,343,343,30534,343,30539,30543}, + { 0, 158,30562,343,343,30565,343,30302,30306}, + { 0, 159,30582,343,343,30585,343,30602,30606}, + { 0, 160,25105,343,343,30628,343,18086,30640}, + { 0, 161,30656,343,343,30659,343,30668,30672}, + { 0, 162,20844,343,343,30687,343,30694,30698}, + { 0, 163,468,343,343,30711,343,26780,26784}, + { 0, 164,30737,343,343,30740,343,27651,27655}, + { 0, 165,25746,343,343,30749,343,26758,26762}, + { 0, 166,23201,343,343,30761,343,26780,26784}, + { 0, 167,30770,343,343,30773,343,26758,26762}, + { 0, 168,25422,343,343,30779,343,30788,30792}, + { 0, 169,25474,343,343,30809,343,30815,30819}, + { 0, 170,30831,343,343,30834,343,26780,26784}, + { 0, 171,20941,343,343,30843,343,30851,30855}, + { 0, 172,20997,343,343,30868,343,30875,30879}, + { 0, 173,30905,343,343,30908,343,30915,30919}, + { 0, 174,10998,343,343,30933,343,30946,30950}, + { 0, 175,30962,343,343,30965,343,30981,30985}, + { 0, 176,31008,343,343,31011,343,31022,31026}, + { 0, 177,31043,343,343,31046,343,31052,31056}, + { 0, 178,21198,343,343,31071,343,31078,31082}, + { 0, 179,23669,343,343,31096,343,31106,31110}, + { 0, 180,31127,343,343,31130,343,31143,31147}, + { 0, 181,21561,343,343,31166,343,17860,31175}, + { 0, 182,31190,343,343,31193,343,27314,27318}, + { 0, 183,21106,343,343,31216,343,31225,31229}, + { 0, 184,31243,343,343,31246,343,31259,31263}, + { 0, 185,31282,343,343,31285,343,26780,26784}, + { 0, 186,31296,343,343,31299,343,27043,27047}, + { 0, 187,31307,343,343,31310,343,31318,31322}, + { 0, 188,31338,343,343,31341,343,31350,31354}, + { 0, 189,31371,343,343,31374,343,31396,31400}, + { 0, 190,25582,343,343,31428,343,18130,31440}, + { 0, 191,24713,343,343,31458,343,31464,31468}, + { 0, 192,31481,343,343,31484,343,31494,31498}, + { 0, 193,31518,343,343,31521,343,26758,26762}, + { 0, 194,31546,343,343,31549,343,27561,27565}, + { 0, 195,31554,343,343,31557,343,26780,26784}, + { 0, 196,31585,343,343,31588,343,27043,27047}, + { 0, 197,21263,343,343,31593,343,31602,31606}, + { 0, 198,31616,343,343,31619,343,31630,31634}, + { 0, 199,31652,343,343,31655,343,27651,27655}, + { 0, 200,17846,343,343,31663,343,26758,26762}, + { 0, 201,31675,343,343,31678,343,31691,31695}, + { 0, 202,24334,343,343,31714,343,31722,31726}, + { 0, 203,31741,343,343,31744,343,31750,31754}, + { 0, 204,21309,343,343,31769,343,31776,31780}, + { 0, 205,31793,343,343,31796,343,31816,31820}, + { 0, 206,31847,343,343,31850,343,26799,26803}, + { 0, 207,20044,343,343,31857,343,31864,31868}, + { 0, 208,31886,343,343,31889,343,31898,31902}, + { 0, 209,21437,343,343,31921,343,31929,31933}, + { 0, 210,31951,343,343,31954,343,31961,31965}, + { 0, 211,31982,343,343,31985,343,26758,26762}, + { 0, 212,20282,343,343,32022,343,26758,26762}, + { 0, 213,25308,343,343,32036,343,32044,32048}, + { 0, 214,32070,343,343,32073,343,32084,32088}, + { 0, 215,32103,343,343,32106,343,26780,26784}, + { 0, 216,32114,343,343,32117,343,26540,26544}, + { 0, 217,24549,343,343,32150,343,32160,32164}, + { 0, 218,32183,343,343,32186,343,26758,26762}, + { 0, 219,1619,343,343,32209,343,26758,26762}, + { 0, 220,21807,343,343,32229,343,32237,32241}, + { 0, 221,32257,343,343,32260,343,32268,32272}, + { 0, 222,32285,343,343,32288,343,30302,30306}, + { 0, 223,32306,343,343,32309,343,32315,32319}, + { 0, 224,24605,343,343,32338,343,32344,32348}, + { 0, 225,32360,343,343,32363,343,26780,26784}, + { 0, 226,32371,343,343,32374,343,32385,32389}, + { 0, 227,22072,343,343,32413,343,32426,32430}, + { 0, 228,32449,343,343,32452,343,32459,32463}, + { 0, 229,24961,343,343,32478,343,32487,32491} }; static const RegionInfoNameEntry region_name_entries [] = { - {24987, 0}, - {26213, 1}, - {26240, 2}, - {26289, 3}, - {20966, 4}, + {25258, 0}, + {26490, 1}, + {26517, 2}, + {26566, 3}, + {21154, 4}, {465, 5}, - {26352, 6}, - {26409, 7}, - {24600, 8}, - {26463, 9}, - {23164, 10}, - {23197, 11}, - {26544, 12}, - {26572, 13}, - {26610, 14}, - {26676, 15}, - {26708, 16}, - {22708, 17}, - {26750, 18}, - {19767, 19}, - {25099, 20}, - {26844, 21}, - {26873, 22}, - {26882, 23}, - {26913, 24}, - {25253, 25}, - {20705, 26}, - {26989, 27}, - {27020, 28}, - {27057, 29}, - {21317, 30}, - {27118, 31}, - {23290, 32}, - {27173, 33}, - {27190, 34}, - {27256, 35}, - {27303, 36}, + {26629, 6}, + {26686, 7}, + {24871, 8}, + {26740, 9}, + {23435, 10}, + {23468, 11}, + {26821, 12}, + {26849, 13}, + {26887, 14}, + {26953, 15}, + {26985, 16}, + {22979, 17}, + {27027, 18}, + {19955, 19}, + {25370, 20}, + {27121, 21}, + {27150, 22}, + {27159, 23}, + {27190, 24}, + {25524, 25}, + {20893, 26}, + {27266, 27}, + {27297, 28}, + {27334, 29}, + {21505, 30}, + {27395, 31}, + {23561, 32}, + {27450, 33}, + {27467, 34}, + {27533, 35}, + {27580, 36}, {11001, 37}, - {27340, 38}, - {27358, 39}, - {24880, 40}, - {27420, 41}, + {27617, 38}, + {27635, 39}, + {25151, 40}, + {27697, 41}, {11080, 42}, - {24386, 43}, - {23814, 44}, - {27521, 45}, - {27544, 46}, - {27580, 47}, - {27600, 48}, - {19918, 49}, + {24657, 43}, + {24085, 44}, + {27798, 45}, + {27821, 46}, + {27857, 47}, + {27877, 48}, + {20106, 49}, {4291, 50}, - {27676, 51}, - {19960, 52}, - {27732, 53}, - {24171, 54}, - {23644, 55}, - {24740, 56}, - {21415, 57}, - {23028, 58}, - {27887, 59}, - {27925, 60}, - {19810, 61}, - {27961, 62}, - {20135, 63}, - {28000, 64}, - {28024, 65}, - {28071, 66}, - {21938, 67}, - {20179, 68}, - {28106, 69}, - {22608, 70}, - {28157, 71}, - {28168, 72}, - {28197, 73}, - {28214, 74}, - {28238, 75}, - {28271, 76}, - {28284, 77}, - {28312, 78}, - {28339, 79}, - {28353, 80}, - {20061, 81}, - {23532, 82}, - {28413, 83}, - {28421, 84}, - {23112, 85}, - {28494, 86}, - {25363, 87}, - {20857, 88}, - {20280, 89}, - {21182, 90}, - {23958, 91}, - {20228, 92}, - {21992, 93}, - {28708, 94}, - {22483, 95}, - {21561, 96}, - {20329, 97}, - {20372, 98}, - {28819, 99}, - {24546, 100}, - {20417, 101}, - {22035, 102}, - {28926, 103}, - {28958, 104}, - {28989, 105}, - {29001, 106}, - {29029, 107}, - {29054, 108}, - {20472, 109}, - {24799, 110}, - {29148, 111}, - {29192, 112}, - {29227, 113}, - {24658, 114}, - {29278, 115}, - {29293, 116}, - {29310, 117}, - {29343, 118}, - {21513, 119}, - {23451, 120}, - {21461, 121}, - {23346, 122}, - {23927, 123}, - {29470, 124}, + {27953, 51}, + {20148, 52}, + {28009, 53}, + {24442, 54}, + {23915, 55}, + {25011, 56}, + {21603, 57}, + {23299, 58}, + {28164, 59}, + {28202, 60}, + {19998, 61}, + {28238, 62}, + {20323, 63}, + {28277, 64}, + {28301, 65}, + {28348, 66}, + {22209, 67}, + {20367, 68}, + {28383, 69}, + {22879, 70}, + {28434, 71}, + {22155, 72}, + {28471, 73}, + {28488, 74}, + {28512, 75}, + {28545, 76}, + {28558, 77}, + {28586, 78}, + {28613, 79}, + {28627, 80}, + {20249, 81}, + {23803, 82}, + {28687, 83}, + {28695, 84}, + {23383, 85}, + {28768, 86}, + {25634, 87}, + {21045, 88}, + {20468, 89}, + {21370, 90}, + {24229, 91}, + {20416, 92}, + {22263, 93}, + {28982, 94}, + {22754, 95}, + {21749, 96}, + {20517, 97}, + {20560, 98}, + {29093, 99}, + {24817, 100}, + {20605, 101}, + {22306, 102}, + {29200, 103}, + {29232, 104}, + {29263, 105}, + {29275, 106}, + {29303, 107}, + {29328, 108}, + {20660, 109}, + {25070, 110}, + {29422, 111}, + {29466, 112}, + {29501, 113}, + {24929, 114}, + {29552, 115}, + {29567, 116}, + {29584, 117}, + {29617, 118}, + {21701, 119}, + {23722, 120}, + {21649, 121}, + {23617, 122}, + {24198, 123}, + {29744, 124}, {7428, 125}, - {29505, 126}, - {29540, 127}, - {21825, 128}, - {29591, 129}, - {29599, 130}, - {29627, 131}, - {23723, 132}, - {29696, 133}, - {29724, 134}, - {29738, 135}, - {29775, 136}, - {29789, 137}, - {29815, 138}, - {29848, 139}, - {29888, 140}, - {22657, 141}, - {29940, 142}, - {29974, 143}, - {30011, 144}, - {30042, 145}, - {30051, 146}, - {30069, 147}, - {25417, 148}, - {20524, 149}, - {20615, 150}, - {30155, 151}, - {30183, 152}, - {30192, 153}, - {23758, 154}, - {24224, 155}, - {24007, 156}, - {24487, 157}, - {30288, 158}, - {30308, 159}, - {24834, 160}, - {30382, 161}, - {20656, 162}, + {29779, 126}, + {29814, 127}, + {22013, 128}, + {29865, 129}, + {29873, 130}, + {29901, 131}, + {23994, 132}, + {29970, 133}, + {29998, 134}, + {30012, 135}, + {30049, 136}, + {30063, 137}, + {30089, 138}, + {30122, 139}, + {30162, 140}, + {22928, 141}, + {30214, 142}, + {30248, 143}, + {30285, 144}, + {30316, 145}, + {30325, 146}, + {30343, 147}, + {25688, 148}, + {20712, 149}, + {20803, 150}, + {30429, 151}, + {30457, 152}, + {30466, 153}, + {24029, 154}, + {24495, 155}, + {24278, 156}, + {24758, 157}, + {30562, 158}, + {30582, 159}, + {25105, 160}, + {30656, 161}, + {20844, 162}, {468, 163}, - {30463, 164}, - {25475, 165}, - {22930, 166}, - {30496, 167}, - {25151, 168}, - {25203, 169}, - {30557, 170}, - {20753, 171}, - {20809, 172}, - {30631, 173}, + {30737, 164}, + {25746, 165}, + {23201, 166}, + {30770, 167}, + {25422, 168}, + {25474, 169}, + {30831, 170}, + {20941, 171}, + {20997, 172}, + {30905, 173}, {10998, 174}, - {30688, 175}, - {30734, 176}, - {30769, 177}, - {21010, 178}, - {23398, 179}, - {30853, 180}, - {21373, 181}, - {30916, 182}, - {20918, 183}, - {30969, 184}, - {31008, 185}, - {31022, 186}, - {31033, 187}, - {31064, 188}, - {31097, 189}, - {25311, 190}, - {24442, 191}, - {31207, 192}, - {31244, 193}, - {31272, 194}, - {31280, 195}, - {31311, 196}, - {21075, 197}, - {31342, 198}, - {31378, 199}, - {17700, 200}, - {31401, 201}, - {24063, 202}, - {31467, 203}, - {21121, 204}, - {31519, 205}, - {31573, 206}, - {19856, 207}, - {31612, 208}, - {21249, 209}, - {31677, 210}, - {31708, 211}, - {20094, 212}, - {25037, 213}, - {31796, 214}, - {31829, 215}, - {31840, 216}, - {24278, 217}, - {31909, 218}, + {30962, 175}, + {31008, 176}, + {31043, 177}, + {21198, 178}, + {23669, 179}, + {31127, 180}, + {21561, 181}, + {31190, 182}, + {21106, 183}, + {31243, 184}, + {31282, 185}, + {31296, 186}, + {31307, 187}, + {31338, 188}, + {31371, 189}, + {25582, 190}, + {24713, 191}, + {31481, 192}, + {31518, 193}, + {31546, 194}, + {31554, 195}, + {31585, 196}, + {21263, 197}, + {31616, 198}, + {31652, 199}, + {17846, 200}, + {31675, 201}, + {24334, 202}, + {31741, 203}, + {21309, 204}, + {31793, 205}, + {31847, 206}, + {20044, 207}, + {31886, 208}, + {21437, 209}, + {31951, 210}, + {31982, 211}, + {20282, 212}, + {25308, 213}, + {32070, 214}, + {32103, 215}, + {32114, 216}, + {24549, 217}, + {32183, 218}, {1619, 219}, - {21619, 220}, - {31983, 221}, - {32011, 222}, - {32032, 223}, - {24334, 224}, - {32086, 225}, - {32097, 226}, - {21884, 227}, - {32175, 228}, - {24690, 229} + {21807, 220}, + {32257, 221}, + {32285, 222}, + {32306, 223}, + {24605, 224}, + {32360, 225}, + {32371, 226}, + {22072, 227}, + {32449, 228}, + {24961, 229} }; @@ -2584,6 +2592,11 @@ static const char locale_strings [] = { "Junie\0" "Julie\0" "Augustus\0" + "y MMMM d HH:mm:ss z\0" + "y MMMM d\0" + "y MMMM\0" + "\xe1\x83\x93\xe1\x83\x98\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1\0" + "\xe1\x83\xa1\xe1\x83\x90\xe1\x83\xa6\xe1\x83\x90\xe1\x83\x9b\xe1\x83\x9d\xe1\x83\xa1\0" "d. MMM yyyy HH:mm:ss z\0" "m\xc3\xa1nadagur\0" "t\xc3\xbdsdagur\0" @@ -2866,6 +2879,8 @@ static const char locale_strings [] = { "yyyy'eko' MMMM\0" "yy'-'MM'-'dd\0" "dd MMMM yyyy hh:mm:ss tt\0" + "yyyy '\xe1\x83\xac\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' dd MM, dddd H:mm:ss\0" + "yyyy '\xe1\x83\xac\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' dd MM, dddd\0" "d. MMM yyyy HH.mm.ss\0" "HH.mm.ss\0" "yyyy MMMM d h.mm.ss tt\0" @@ -3215,6 +3230,11 @@ static const char locale_strings [] = { "Afrikaanse\0" "AFK\0" "afr\0" + "ka\0" + "Georgian\0" + "\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98\0" + "KAT\0" + "kat\0" "fo\0" "Faroese\0" "f\xc3\xb8royskt\0" @@ -3430,6 +3450,10 @@ static const char locale_strings [] = { "Afrikaans (South Africa)\0" "Afrikaanse (Suid-Afrika)\0" "ZA\0" + "ka-GE\0" + "Georgian (Georgia)\0" + "\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98 (\xe1\x83\xa1\xe1\x83\x90\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\x95\xe1\x83\x94\xe1\x83\x9a\xe1\x83\x9d)\0" + "GE\0" "fo-FO\0" "Faroese (Faroe Islands)\0" "f\xc3\xb8royskt (F\xc3\xb8royar)\0" @@ -3813,6 +3837,7 @@ static const char locale_strings [] = { "it-ch\0" "it-it\0" "ja-jp\0" + "ka-ge\0" "kn-in\0" "ko-kr\0" "kok-in\0" @@ -4069,7 +4094,6 @@ static const char locale_strings [] = { "British Pound Sterling\0" "GD\0" "Grenada\0" - "GE\0" "Georgia\0" "GEL\0" "Georgian Lari\0" diff --git a/mono/metadata/domain.c b/mono/metadata/domain.c index b221c6d31f3..239d42e7c7c 100644 --- a/mono/metadata/domain.c +++ b/mono/metadata/domain.c @@ -1883,6 +1883,13 @@ mono_domain_free (MonoDomain *domain, gboolean force) appdomains_list [domain->domain_id] = NULL; mono_appdomains_unlock (); + /* must do this early as it accesses fields and types */ + if (domain->special_static_fields) { + mono_alloc_special_static_data_free (domain->special_static_fields); + g_hash_table_destroy (domain->special_static_fields); + domain->special_static_fields = NULL; + } + /* * We must destroy all these hash tables here because they * contain references to managed objects belonging to the @@ -1929,12 +1936,6 @@ mono_domain_free (MonoDomain *domain, gboolean force) domain->null_reference_ex = NULL; domain->stack_overflow_ex = NULL; domain->entry_assembly = NULL; - /* must do this early as it accesses fields and types */ - if (domain->special_static_fields) { - mono_alloc_special_static_data_free (domain->special_static_fields); - g_hash_table_destroy (domain->special_static_fields); - domain->special_static_fields = NULL; - } g_free (domain->friendly_name); domain->friendly_name = NULL; diff --git a/mono/metadata/generic-sharing.c b/mono/metadata/generic-sharing.c index e4e49539ee4..250bad56e63 100644 --- a/mono/metadata/generic-sharing.c +++ b/mono/metadata/generic-sharing.c @@ -460,6 +460,8 @@ mono_class_get_method_generic (MonoClass *klass, MonoMethod *method) if (!m) { mono_class_setup_methods (klass); + if (klass->exception_type) + return NULL; for (i = 0; i < klass->method.count; ++i) { m = klass->methods [i]; if (m == declaring) @@ -794,12 +796,12 @@ instantiate_other_info (MonoDomain *domain, MonoRuntimeGenericContextOtherInfoTe case MONO_RGCTX_INFO_METHOD: return data; case MONO_RGCTX_INFO_GENERIC_METHOD_CODE: - return mono_create_ftnptr (mono_domain_get (), - mono_runtime_create_jump_trampoline (mono_domain_get (), data, TRUE)); + /* + * We can't create a jump trampoline here, as it cannot be patched. + */ + return mono_create_ftnptr (mono_domain_get (), mono_compile_method (data)); case MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK: - return mono_create_ftnptr (mono_domain_get (), - mono_runtime_create_jump_trampoline (mono_domain_get (), - mono_marshal_get_remoting_invoke_with_check (data), TRUE)); + return mono_create_ftnptr (mono_domain_get (), mono_compile_method (mono_marshal_get_remoting_invoke_with_check (data))); case MONO_RGCTX_INFO_CLASS_FIELD: return data; case MONO_RGCTX_INFO_METHOD_RGCTX: { diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index 57ee94daefd..c35c871c817 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -260,6 +260,11 @@ ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32 ea = (gpointer*)((char*)this->vector + (pos * esize)); va = (gpointer*)((char*)value + sizeof (MonoObject)); + if (mono_class_is_nullable (ec)) { + mono_nullable_init ((guint8*)ea, value, ec); + return; + } + if (!value) { memset (ea, 0, esize); return; @@ -1318,19 +1323,27 @@ type_from_name (const char *str, MonoBoolean ignoreCase) * Dec 10, 2005 - Martin. */ - if (dest) + if (dest) { assembly = dest->klass->image->assembly; - else { + type_resolve = TRUE; + } else { g_warning (G_STRLOC); } } - if (assembly) + if (assembly) { + /* When loading from the current assembly, AppDomain.TypeResolve will not be called yet */ type = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve); - + } + if (!info.assembly.name && !type) /* try mscorlib */ type = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve); + if (assembly && !type && type_resolve) { + type_resolve = FALSE; /* This will invoke TypeResolve if not done in the first 'if' */ + type = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve); + } + mono_reflection_free_type_info (&info); g_free (temp_str); @@ -2060,6 +2073,7 @@ ves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info) static MonoArray* ves_icall_Type_GetInterfaces (MonoReflectionType* type) { + MonoError error; MonoDomain *domain = mono_object_domain (type); MonoArray *intf; GPtrArray *ifaces = NULL; @@ -2081,8 +2095,12 @@ ves_icall_Type_GetInterfaces (MonoReflectionType* type) slots = mono_bitset_new (class->max_interface_id + 1, 0); for (parent = class; parent; parent = parent->parent) { - GPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent); - if (tmp_ifaces) { + GPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent, &error); + if (!mono_error_ok (&error)) { + mono_bitset_free (slots); + mono_error_raise_exception (&error); + return NULL; + } else if (tmp_ifaces) { for (i = 0; i < tmp_ifaces->len; ++i) { MonoClass *ic = g_ptr_array_index (tmp_ifaces, i); @@ -2687,7 +2705,9 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method) if (imethod->context.class_inst) { MonoClass *klass = ((MonoMethod *) imethod)->klass; - result = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass)); + /*Generic methods gets the context of the GTD.*/ + if (mono_class_get_context (klass)) + result = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass)); } return mono_method_get_object (mono_object_domain (method), result, NULL); @@ -3475,7 +3495,8 @@ handle_parent: g_assert (method->slot < nslots); if (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f))) continue; - method_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f); + if (!(method->flags & METHOD_ATTRIBUTE_NEW_SLOT)) + method_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f); } if (method->name [0] == '.' && (strcmp (method->name, ".ctor") == 0 || strcmp (method->name, ".cctor") == 0)) @@ -4728,6 +4749,8 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass) } mono_class_setup_methods (method->klass); + if (method->klass->exception_type) + return NULL; for (i = 0; i < method->klass->method.count; ++i) { if (method->klass->methods [i] == method) { offset = i; @@ -4735,6 +4758,8 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass) } } mono_class_setup_methods (klass); + if (klass->exception_type) + return NULL; g_assert (offset >= 0 && offset < klass->method.count); return klass->methods [offset]; } @@ -4747,8 +4772,11 @@ ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMeth klass = mono_class_from_mono_type (type); if (mono_class_get_generic_type_definition (method->klass) != mono_class_get_generic_type_definition (klass)) return NULL; - if (method->klass != klass) + if (method->klass != klass) { method = mono_method_get_equivalent_method (method, klass); + if (!method) + return NULL; + } } else klass = method->klass; return mono_method_get_object (mono_domain_get (), method, klass); diff --git a/mono/metadata/loader.c b/mono/metadata/loader.c index 6ed5732b950..f36a2a00eea 100644 --- a/mono/metadata/loader.c +++ b/mono/metadata/loader.c @@ -604,6 +604,13 @@ find_method_in_class (MonoClass *klass, const char *name, const char *qname, con } mono_class_setup_methods (klass); + /* + We can't fail lookup of methods otherwise the runtime will fail with MissingMethodException instead of TypeLoadException. + See mono/tests/generic-type-load-exception.2.il + FIXME we should better report this error to the caller + */ + if (!klass->methods) + return NULL; for (i = 0; i < klass->method.count; ++i) { MonoMethod *m = klass->methods [i]; MonoMethodSignature *msig; @@ -772,9 +779,9 @@ mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 to return mono_method_signature (method); if (table == MONO_TABLE_METHODSPEC) { - g_assert (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) && - mono_method_signature (method)); - g_assert (method->is_inflated); + /* the verifier (do_invoke_method) will turn the NULL into a verifier error */ + if ((method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) || !method->is_inflated) + return NULL; return mono_method_signature (method); } @@ -807,6 +814,14 @@ mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 to sig = cache_memberref_sig (image, sig_idx, sig); } + if (!mono_verifier_is_sig_compatible (image, method, sig)) { + guint32 class = cols [MONO_MEMBERREF_CLASS] & MONO_MEMBERREF_PARENT_MASK; + const char *fname = mono_metadata_string_heap (image, cols [MONO_MEMBERREF_NAME]); + + mono_loader_set_error_bad_image (g_strdup_printf ("Incompatible method signature class token 0x%08x field name %s token 0x%08x on image %s", class, fname, token, image->name)); + return NULL; + } + if (context) { MonoMethodSignature *cached; @@ -836,7 +851,7 @@ mono_method_search_in_array_class (MonoClass *klass, const char *name, MonoMetho int i; mono_class_setup_methods (klass); - + g_assert (!klass->exception_type); /*FIXME this should not fail, right?*/ for (i = 0; i < klass->method.count; ++i) { MonoMethod *method = klass->methods [i]; if (strcmp (method->name, name) == 0 && sig->param_count == method->signature->param_count) @@ -2294,6 +2309,8 @@ mono_method_get_index (MonoMethod *method) { return mono_metadata_token_index (method->token); mono_class_setup_methods (klass); + if (klass->exception_type) + return 0; for (i = 0; i < klass->method.count; ++i) { if (method == klass->methods [i]) { if (klass->image->uncompressed_metadata) diff --git a/mono/metadata/locales.c b/mono/metadata/locales.c index 2ac87eb9980..d76e17de24c 100644 --- a/mono/metadata/locales.c +++ b/mono/metadata/locales.c @@ -303,7 +303,10 @@ construct_culture_from_specific_name (MonoCultureInfo *ci, gchar *name) if (entry->lcid != entry->specific_lcid) entry = culture_info_entry_from_lcid (entry->specific_lcid); - return construct_culture (ci, entry); + if (entry) + return construct_culture (ci, entry); + else + return FALSE; } static const CultureInfoEntry* diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index b9725d6e6ee..ad00697e97d 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -2460,6 +2460,12 @@ mono_marshal_method_from_wrapper (MonoMethod *wrapper) return res; } +gpointer +mono_marshal_wrapper_info_from_wrapper (MonoMethod *wrapper) +{ + return mono_method_get_wrapper_data (wrapper, 1); +} + MonoMethod * mono_marshal_get_delegate_begin_invoke (MonoMethod *method) { @@ -2607,7 +2613,7 @@ mono_mb_emit_restore_result (MonoMethodBuilder *mb, MonoType *return_type) mono_mb_emit_byte (mb, mono_type_to_ldind (return_type)); break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (return_type)) + if (!mono_type_generic_inst_is_valuetype (t)) break; /* fall through */ case MONO_TYPE_VALUETYPE: { @@ -4308,6 +4314,7 @@ mono_marshal_get_runtime_invoke (MonoMethod *method, gboolean virtual) continue; } + /*FIXME 'this doesn't handle generic enums. Shouldn't we?*/ type = sig->params [i]->type; handle_enum: switch (type) { @@ -4484,6 +4491,8 @@ handle_enum: mono_mb_emit_ldloc (mb, 0); mono_mb_emit_byte (mb, CEE_RET); + g_free (tmp_nullable_locals); + if (need_direct_wrapper) { mb->skip_visibility = 1; res = mono_mb_create_and_cache (cache, method, mb, csig, sig->param_count + 16); @@ -9506,6 +9515,8 @@ mono_marshal_get_array_address (int rank, int elem_size) } } if (!cached) { + ElementAddrWrapperInfo *info; + if (elem_addr_cache_next >= elem_addr_cache_size) { int new_size = elem_addr_cache_size + 4; ArrayElemAddr *new_array = g_new0 (ArrayElemAddr, new_size); @@ -9517,6 +9528,12 @@ mono_marshal_get_array_address (int rank, int elem_size) elem_addr_cache [elem_addr_cache_next].rank = rank; elem_addr_cache [elem_addr_cache_next].elem_size = elem_size; elem_addr_cache [elem_addr_cache_next].method = ret; + + info = mono_image_alloc0 (mono_defaults.corlib, sizeof (ElementAddrWrapperInfo)); + info->rank = rank; + info->elem_size = elem_size; + + mono_marshal_method_set_wrapper_data (ret, info); } mono_marshal_unlock (); return ret; diff --git a/mono/metadata/marshal.h b/mono/metadata/marshal.h index e637291f56e..fba45763cc1 100644 --- a/mono/metadata/marshal.h +++ b/mono/metadata/marshal.h @@ -76,6 +76,10 @@ typedef enum { MARSHAL_ACTION_MANAGED_CONV_RESULT } MarshalAction; +typedef struct { + guint32 rank, elem_size; +} ElementAddrWrapperInfo; + G_BEGIN_DECLS /*type of the function pointer of methods returned by mono_marshal_get_runtime_invoke*/ @@ -165,6 +169,9 @@ mono_type_to_stind (MonoType *type) MONO_INTERNAL; MonoMethod * mono_marshal_method_from_wrapper (MonoMethod *wrapper) MONO_INTERNAL; +gpointer +mono_marshal_wrapper_info_from_wrapper (MonoMethod *wrapper) MONO_INTERNAL; + MonoMethod * mono_marshal_get_remoting_invoke (MonoMethod *method) MONO_INTERNAL; diff --git a/mono/metadata/metadata-internals.h b/mono/metadata/metadata-internals.h index ddefb4246aa..f41c1458030 100644 --- a/mono/metadata/metadata-internals.h +++ b/mono/metadata/metadata-internals.h @@ -294,6 +294,7 @@ struct _MonoDynamicAssembly { guint32 strong_name_size; guint8 run; guint8 save; + MonoDomain *domain; }; struct _MonoDynamicImage { diff --git a/mono/metadata/metadata-verify.c b/mono/metadata/metadata-verify.c index 42954faa8d6..28dca574648 100644 --- a/mono/metadata/metadata-verify.c +++ b/mono/metadata/metadata-verify.c @@ -217,7 +217,7 @@ typedef struct { typedef struct { const char *data; - guint32 size; + guint32 size, token; GSList *errors; int valid; MonoImage *image; @@ -1267,6 +1267,12 @@ parse_generic_inst (VerifyContext *ctx, const char **_ptr, const char *end) if (!is_valid_coded_index (ctx, TYPEDEF_OR_REF_DESC, token)) FAIL (ctx, g_strdup_printf ("GenericInst: invalid TypeDefOrRef token %x", token)); + if (ctx->token) { + if (mono_metadata_token_index (ctx->token) == get_coded_index_token (TYPEDEF_OR_REF_DESC, token) && + mono_metadata_token_table (ctx->token) == get_coded_index_table (TYPEDEF_OR_REF_DESC, token)) + FAIL (ctx, g_strdup_printf ("Type: Recurside generic instance specification (%x). A type signature can't reference itself", ctx->token)); + } + if (!safe_read_cint (count, ptr, end)) FAIL (ctx, g_strdup ("GenericInst: Not enough room for argument count")); @@ -1319,6 +1325,11 @@ parse_type (VerifyContext *ctx, const char **_ptr, const char *end) if (!is_valid_coded_index (ctx, TYPEDEF_OR_REF_DESC, token)) FAIL (ctx, g_strdup_printf ("Type: invalid TypeDefOrRef token %x", token)); + if (ctx->token) { + if (mono_metadata_token_index (ctx->token) == get_coded_index_token (TYPEDEF_OR_REF_DESC, token) && + mono_metadata_token_table (ctx->token) == get_coded_index_table (TYPEDEF_OR_REF_DESC, token)) + FAIL (ctx, g_strdup_printf ("Type: Recurside type specification (%x). A type signature can't reference itself", ctx->token)); + } break; case MONO_TYPE_VAR: @@ -2901,10 +2912,11 @@ verify_typespec_table_full (VerifyContext *ctx) for (i = 0; i < table->rows; ++i) { mono_metadata_decode_row (table, i, data, MONO_TYPESPEC_SIZE); - + ctx->token = (i + 1) | MONO_TOKEN_TYPE_SPEC; if (!is_valid_typespec_blob (ctx, data [MONO_TYPESPEC_SIGNATURE])) ADD_ERROR (ctx, g_strdup_printf ("Invalid TypeSpec row %d Signature field %08x", i, data [MONO_TYPESPEC_SIGNATURE])); } + ctx->token = 0; } #define INVALID_IMPLMAP_FLAGS_BITS ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 6) | (1 << 8) | (1 << 9) | (1 << 10)) @@ -3642,7 +3654,7 @@ mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSL } gboolean -mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list) +mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, guint32 token, GSList **error_list) { VerifyContext ctx; @@ -3651,6 +3663,7 @@ mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSLis init_verify_context (&ctx, image, error_list); ctx.stage = STAGE_TABLES; + ctx.token = token; is_valid_typespec_blob (&ctx, offset); return cleanup_context (&ctx, error_list); @@ -3708,6 +3721,33 @@ mono_verifier_verify_string_signature (MonoImage *image, guint32 offset, GSList return cleanup_context (&ctx, error_list); } +gboolean +mono_verifier_is_sig_compatible (MonoImage *image, MonoMethod *method, MonoMethodSignature *signature) +{ + MonoMethodSignature *original_sig; + if (!mono_verifier_is_enabled_for_image (image)) + return TRUE; + + original_sig = mono_method_signature (method); + if (original_sig->call_convention == MONO_CALL_VARARG) { + if (original_sig->hasthis != signature->hasthis) + return FALSE; + if (original_sig->call_convention != signature->call_convention) + return FALSE; + if (original_sig->explicit_this != signature->explicit_this) + return FALSE; + if (original_sig->call_convention != signature->call_convention) + return FALSE; + if (original_sig->pinvoke != signature->pinvoke) + return FALSE; + if (original_sig->sentinelpos != signature->sentinelpos) + return FALSE; + } else if (!mono_metadata_signature_equal (signature, original_sig)) { + return FALSE; + } + + return TRUE; +} #else gboolean @@ -3765,7 +3805,7 @@ mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSL } gboolean -mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list) +mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, guint32 token, GSList **error_list) { return TRUE; } @@ -3782,5 +3822,11 @@ mono_verifier_verify_string_signature (MonoImage *image, guint32 offset, GSList return TRUE; } +gboolean +mono_verifier_is_sig_compatible (MonoImage *image, MonoMethod *method, MonoMethodSignature *signature) +{ + return TRUE; +} + #endif /* DISABLE_VERIFIER */ diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index 65fcc3528e9..72ba8f8af85 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -4699,7 +4699,7 @@ mono_type_create_from_typespec (MonoImage *image, guint32 type_spec) mono_metadata_decode_row (t, idx-1, cols, MONO_TYPESPEC_SIZE); ptr = mono_metadata_blob_heap (image, cols [MONO_TYPESPEC_SIGNATURE]); - if (!mono_verifier_verify_typespec_signature (image, cols [MONO_TYPESPEC_SIGNATURE], NULL)) { + if (!mono_verifier_verify_typespec_signature (image, cols [MONO_TYPESPEC_SIGNATURE], type_spec, NULL)) { mono_loader_unlock (); return NULL; } diff --git a/mono/metadata/monitor.c b/mono/metadata/monitor.c index 29182194ceb..dc9dfb03b65 100644 --- a/mono/metadata/monitor.c +++ b/mono/metadata/monitor.c @@ -237,6 +237,14 @@ mon_new (gsize id) for (i = 0; i < marray->num_monitors; ++i) { if (marray->monitors [i].data == NULL) { new = &marray->monitors [i]; + if (new->wait_list) { + /* Orphaned events left by aborted threads */ + while (new->wait_list) { + LOCK_DEBUG (g_message (G_GNUC_PRETTY_FUNCTION ": (%d): Closing orphaned event %d", GetCurrentThreadId (), new->wait_list->data)); + CloseHandle (new->wait_list->data); + new->wait_list = g_slist_remove (new->wait_list, new->wait_list->data); + } + } new->data = monitor_freelist; monitor_freelist = new; } @@ -1339,7 +1347,14 @@ ves_icall_System_Threading_Monitor_Monitor_wait (MonoObject *obj, guint32 ms) mono_thread_clr_state (thread, ThreadState_WaitSleepJoin); if (mono_thread_interruption_requested ()) { - CloseHandle (event); + /* + * Can't remove the event from wait_list, since the monitor is not locked by + * us. So leave it there, mon_new () will delete it when the mon structure + * is placed on the free list. + * FIXME: The caller expects to hold the lock after the wait returns, but it + * doesn't happen in this case: + * http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97268 + */ return FALSE; } diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 6bde288dce6..b39ec079f1f 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -712,7 +712,7 @@ compute_class_bitmap (MonoClass *class, gsize *bitmap, int size, int offset, int case MONO_TYPE_CHAR: break; default: - g_assert_not_reached (); + g_error ("compute_class_bitmap: Invalid type %x for field %s:%s\n", type->type, mono_type_get_full_name (field->parent), field->name); break; } } @@ -2028,6 +2028,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean static MonoVTable * mono_class_proxy_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, MonoRemotingTarget target_type) { + MonoError error; MonoVTable *vt, *pvt; int i, j, vtsize, max_interface_id, extra_interface_vtsize = 0; MonoClass *k; @@ -2054,7 +2055,8 @@ mono_class_proxy_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, Mono method_count = mono_class_num_methods (iclass); - ifaces = mono_class_get_implemented_interfaces (iclass); + ifaces = mono_class_get_implemented_interfaces (iclass, &error); + g_assert (mono_error_ok (&error)); /*FIXME do proper error handling*/ if (ifaces) { for (i = 0; i < ifaces->len; ++i) { MonoClass *ic = g_ptr_array_index (ifaces, i); @@ -3140,7 +3142,8 @@ mono_get_delegate_invoke (MonoClass *klass) /* This is called at runtime, so avoid the slower search in metadata */ mono_class_setup_methods (klass); - + if (klass->exception_type) + return NULL; im = mono_class_get_method_from_name (klass, "Invoke", -1); g_assert (im); diff --git a/mono/metadata/pedump.c b/mono/metadata/pedump.c index dda3efe0db6..0f63928c870 100644 --- a/mono/metadata/pedump.c +++ b/mono/metadata/pedump.c @@ -37,6 +37,7 @@ gboolean dump_data = TRUE; gboolean verify_pe = FALSE; gboolean verify_metadata = FALSE; gboolean verify_code = FALSE; +gboolean verify_partial_md = FALSE; /* unused static void @@ -454,10 +455,9 @@ verify_image_file (const char *fname) mono_image_load_names (image); - if (!mono_verifier_verify_full_table_data (image, &errors)) + if (!verify_partial_md && !mono_verifier_verify_full_table_data (image, &errors)) goto invalid_image; - /*fake an assembly for class loading to work*/ assembly = g_new0 (MonoAssembly, 1); assembly->in_gac = FALSE; @@ -480,7 +480,7 @@ verify_image_file (const char *fname) } } if (count) - return 1; + return 5; return 0; invalid_image: @@ -601,16 +601,18 @@ pedump_assembly_search_hook (MonoAssemblyName *aname, gpointer user_data) #define VALID_ONLY_FLAG 0x08000000 #define VERIFY_CODE_ONLY MONO_VERIFY_ALL + 1 #define VERIFY_METADATA_ONLY VERIFY_CODE_ONLY + 1 +#define VERIFY_PARTIAL_METADATA VERIFY_CODE_ONLY + 2 int main (int argc, char *argv []) { + int image_result = 0; MonoImage *image; char *file = NULL; char *flags = NULL; MiniVerifierMode verifier_mode = MONO_VERIFIER_MODE_VERIFIABLE; - const char *flag_desc [] = {"error", "warn", "cls", "all", "code", "fail-on-verifiable", "non-strict", "valid-only", "metadata", NULL}; - guint flag_vals [] = {MONO_VERIFY_ERROR, MONO_VERIFY_WARNING, MONO_VERIFY_CLS, MONO_VERIFY_ALL, VERIFY_CODE_ONLY, MONO_VERIFY_FAIL_FAST, MONO_VERIFY_NON_STRICT, VALID_ONLY_FLAG, VERIFY_METADATA_ONLY, 0}; + const char *flag_desc [] = {"error", "warn", "cls", "all", "code", "fail-on-verifiable", "non-strict", "valid-only", "metadata", "partial-md", NULL}; + guint flag_vals [] = {MONO_VERIFY_ERROR, MONO_VERIFY_WARNING, MONO_VERIFY_CLS, MONO_VERIFY_ALL, VERIFY_CODE_ONLY, MONO_VERIFY_FAIL_FAST, MONO_VERIFY_NON_STRICT, VALID_ONLY_FLAG, VERIFY_METADATA_ONLY, VERIFY_PARTIAL_METADATA, 0}; int i, verify_flags = MONO_VERIFY_REPORT_ALL_ERRORS, run_new_metadata_verifier = 0; for (i = 1; i < argc; i++){ @@ -656,6 +658,8 @@ main (int argc, char *argv []) } else if(flag_vals [i] == VERIFY_METADATA_ONLY) { verify_metadata = 0; run_new_metadata_verifier = 1; + } else if(flag_vals [i] == VERIFY_PARTIAL_METADATA) { + verify_partial_md = 1; } if (flag_vals [i] == VALID_ONLY_FLAG) verifier_mode = MONO_VERIFIER_MODE_VALID; @@ -686,12 +690,11 @@ main (int argc, char *argv []) } if (run_new_metadata_verifier) { - int res; mono_verifier_set_mode (MONO_VERIFIER_MODE_VERIFIABLE); - res = verify_image_file (file); - if (res || !verify_code) - return res; + image_result = verify_image_file (file); + if (image_result == 1 || !verify_code) + return image_result; } image = mono_image_open (file, NULL); @@ -706,6 +709,7 @@ main (int argc, char *argv []) MonoAssembly *assembly; MonoImage *image; MonoImageOpenStatus status; + int code_result; mono_verifier_set_mode (verifier_mode); @@ -723,7 +727,8 @@ main (int argc, char *argv []) return 4; } - return dump_verify_info (assembly->image, verify_flags); + code_result = dump_verify_info (assembly->image, verify_flags); + return code_result ? code_result : image_result; } else mono_image_close (image); diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index d83771c7983..6465ffbad9a 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -5053,6 +5053,7 @@ mono_image_basic_init (MonoReflectionAssemblyBuilder *assemblyb) assembly->run = assemblyb->access != 2; assembly->save = assemblyb->access != 1; + assembly->domain = domain; image = create_dynamic_mono_image (assembly, mono_string_to_utf8 (assemblyb->name), g_strdup ("RefEmit_YouForgotToDefineAModule")); image->initial_image = TRUE; @@ -6303,9 +6304,28 @@ mono_type_get_object (MonoDomain *domain, MonoType *type) } if (klass->reflection_info && !klass->wastypebuilder) { + gboolean is_type_done = TRUE; + /* Generic parameters have reflection_info set but they are not finished together with their enclosing type. + * We must ensure that once a type is finished we don't return a GenericTypeParameterBuilder. + * We can't simply close the types as this will interfere with other parts of the generics machinery. + */ + if (klass->byval_arg.type == MONO_TYPE_MVAR || klass->byval_arg.type == MONO_TYPE_VAR) { + MonoGenericParam *gparam = klass->byval_arg.data.generic_param; + + if (gparam->owner && gparam->owner->is_method) { + MonoMethod *method = gparam->owner->owner.method; + if (method && mono_class_get_generic_type_definition (method->klass)->wastypebuilder) + is_type_done = FALSE; + } else if (gparam->owner && !gparam->owner->is_method) { + MonoClass *klass = gparam->owner->owner.klass; + if (klass && mono_class_get_generic_type_definition (klass)->wastypebuilder) + is_type_done = FALSE; + } + } + /* g_assert_not_reached (); */ /* should this be considered an error condition? */ - if (!type->byref) { + if (is_type_done && !type->byref) { mono_domain_unlock (domain); mono_loader_unlock (); return klass->reflection_info; @@ -7333,11 +7353,12 @@ mono_reflection_get_type (MonoImage* image, MonoTypeNameParse *info, gboolean ig static MonoType* mono_reflection_get_type_internal_dynamic (MonoImage *rootimage, MonoAssembly *assembly, MonoTypeNameParse *info, gboolean ignorecase) { - MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)mono_assembly_get_object (mono_domain_get (), assembly); + MonoReflectionAssemblyBuilder *abuilder; MonoType *type; int i; g_assert (assembly->dynamic); + abuilder = (MonoReflectionAssemblyBuilder*)mono_assembly_get_object (((MonoDynamicAssembly*)assembly)->domain, assembly); /* Enumerate all modules */ @@ -10421,6 +10442,14 @@ typebuilder_setup_fields (MonoClass *klass, MonoError *error) klass->fields = image_g_new0 (image, MonoClassField, klass->field.count); mono_class_alloc_ext (klass); klass->ext->field_def_values = image_g_new0 (image, MonoFieldDefaultValue, klass->field.count); + /* + This is, guess what, a hack. + The issue is that the runtime doesn't know how to setup the fields of a typebuider and crash. + On the static path no field class is resolved, only types are built. This is the right thing to do + but we suck. + Setting size_inited is harmless because we're doing the same job as mono_class_setup_fields anyway. + */ + klass->size_inited = 1; for (i = 0; i < klass->field.count; ++i) { fb = mono_array_get (tb->fields, gpointer, i); @@ -11187,13 +11216,14 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon sig->explicit_this = helper->call_conv & 64 ? 1 : 0; sig->hasthis = helper->call_conv & 32 ? 1 : 0; - if (helper->call_conv == 0) /* unmanaged */ + if (helper->unmanaged_call_conv) { /* unmanaged */ sig->call_convention = helper->unmanaged_call_conv - 1; - else - if (helper->call_conv & 0x02) - sig->call_convention = MONO_CALL_VARARG; - else + sig->pinvoke = TRUE; + } else if (helper->call_conv & 0x02) { + sig->call_convention = MONO_CALL_VARARG; + } else { sig->call_convention = MONO_CALL_DEFAULT; + } sig->param_count = nargs; /* TODO: Copy type ? */ diff --git a/mono/metadata/security-core-clr.c b/mono/metadata/security-core-clr.c index f30d5f18433..50e0d84eafa 100644 --- a/mono/metadata/security-core-clr.c +++ b/mono/metadata/security-core-clr.c @@ -418,6 +418,8 @@ mono_security_core_clr_can_access_internals (MonoImage *accessing, MonoImage* ac * Promoting it to platform code would create another issue since (both Mono/Moonlight or MS version of) * System.Xml.Linq.dll (an SDK, not platform, assembly) needs access to System.Xml.dll internals (either ). * The solution is to trust, even transparent code, in the plugin directory to access platform code internals */ + if (!accessed->assembly->basedir || !accessing->assembly->basedir) + return FALSE; return (strcmp (accessed->assembly->basedir, accessing->assembly->basedir) == 0); } diff --git a/mono/metadata/socket-io.c b/mono/metadata/socket-io.c index 550beb92402..b9bb5a7ca28 100644 --- a/mono/metadata/socket-io.c +++ b/mono/metadata/socket-io.c @@ -87,6 +87,14 @@ #define LOGDEBUG(...) /* define LOGDEBUG(...) g_message(__VA_ARGS__) */ +/* + * Some older versions of libc provide IPV6 support without defining the AI_ADDRCONFIG + * flag for getaddrinfo. + */ +#ifndef AI_ADDRCONFIG +#define AI_ADDRCONFIG 0 +#endif + static gint32 convert_family(MonoAddressFamily mono_family) { gint32 family=-1; diff --git a/mono/metadata/verify-internals.h b/mono/metadata/verify-internals.h index 1fa726bff1a..6019b3184fb 100644 --- a/mono/metadata/verify-internals.h +++ b/mono/metadata/verify-internals.h @@ -37,9 +37,10 @@ gboolean mono_verifier_verify_method_header (MonoImage *image, guint32 offset, G gboolean mono_verifier_verify_method_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; gboolean mono_verifier_verify_memberref_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; gboolean mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; -gboolean mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; +gboolean mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, guint32 token, GSList **error_list) MONO_INTERNAL; gboolean mono_verifier_verify_methodspec_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; gboolean mono_verifier_verify_string_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; +gboolean mono_verifier_is_sig_compatible (MonoImage *image, MonoMethod *method, MonoMethodSignature *signature) MONO_INTERNAL; G_END_DECLS diff --git a/mono/metadata/verify.c b/mono/metadata/verify.c index 495537a7ab3..52bd1508dba 100644 --- a/mono/metadata/verify.c +++ b/mono/metadata/verify.c @@ -409,6 +409,8 @@ mono_class_has_default_constructor (MonoClass *klass) int i; mono_class_setup_methods (klass); + if (klass->exception_type) + return FALSE; for (i = 0; i < klass->method.count; ++i) { method = klass->methods [i]; @@ -424,11 +426,17 @@ mono_class_has_default_constructor (MonoClass *klass) static gboolean mono_class_interface_implements_interface (MonoClass *candidate, MonoClass *iface) { + MonoError error; int i; do { if (candidate == iface) return TRUE; - mono_class_setup_interfaces (candidate); + mono_class_setup_interfaces (candidate, &error); + if (!mono_error_ok (&error)) { + mono_error_cleanup (&error); + return FALSE; + } + for (i = 0; i < candidate->interface_count; ++i) { if (candidate->interfaces [i] == iface || mono_class_interface_implements_interface (candidate->interfaces [i], iface)) return TRUE; @@ -2497,6 +2505,11 @@ init_stack_with_value_at_exception_boundary (VerifyContext *ctx, ILCodeDesc *cod return; } + if (!ctx->max_stack) { + ADD_VERIFY_ERROR (ctx, g_strdup_printf ("Stack overflow at 0x%04x", ctx->ip_offset)); + return; + } + stack_init (ctx, code); set_stack_value (ctx, code->stack, type, FALSE); ctx->exception_types = g_slist_prepend (ctx->exception_types, type); @@ -3111,10 +3124,15 @@ store_local (VerifyContext *ctx, guint32 arg) if (check_underflow (ctx, 1)) { value = stack_pop(ctx); if (!verify_stack_type_compatibility (ctx, ctx->locals [arg], value)) { - CODE_NOT_VERIFIABLE (ctx, g_strdup_printf ("Incompatible type [%s], type [%s] was expected in local store at 0x%04x", - stack_slot_get_name (value), - mono_type_get_stack_name (ctx->locals [arg]), - ctx->ip_offset)); + char *expected = mono_type_full_name (ctx->locals [arg]); + char *found = stack_slot_full_name (value); + CODE_NOT_VERIFIABLE (ctx, g_strdup_printf ("Incompatible type '%s' on stack cannot be stored to local %d with type '%s' at 0x%04x", + found, + arg, + expected, + ctx->ip_offset)); + g_free (expected); + g_free (found); } } } @@ -4698,6 +4716,7 @@ do_ckfinite (VerifyContext *ctx) static void merge_stacks (VerifyContext *ctx, ILCodeDesc *from, ILCodeDesc *to, gboolean start, gboolean external) { + MonoError error; int i, j, k; stack_init (ctx, to); @@ -4764,7 +4783,12 @@ merge_stacks (VerifyContext *ctx, ILCodeDesc *from, ILCodeDesc *to, gboolean sta } } - mono_class_setup_interfaces (old_class); + mono_class_setup_interfaces (old_class, &error); + if (!mono_error_ok (&error)) { + CODE_NOT_VERIFIABLE (ctx, g_strdup_printf ("Cannot merge stacks due to a TypeLoadException %s at 0x%04x", mono_error_get_message (&error), ctx->ip_offset)); + mono_error_cleanup (&error); + goto end_verify; + } for (j = 0; j < old_class->interface_count; ++j) { for (k = 0; k < new_class->interface_count; ++k) { if (mono_metadata_type_equal (&old_class->interfaces [j]->byval_arg, &new_class->interfaces [k]->byval_arg)) { @@ -6198,7 +6222,7 @@ verify_valuetype_layout_with_target (MonoClass *class, MonoClass *target_class) field_class = mono_class_get_generic_type_definition (mono_class_from_mono_type (field->type)); - if (field_class == target_class || !verify_valuetype_layout_with_target (field_class, target_class)) + if (field_class == target_class || class == field_class || !verify_valuetype_layout_with_target (field_class, target_class)) return FALSE; } @@ -6225,6 +6249,14 @@ verify_valuetype_layout (MonoClass *class) gboolean mono_verifier_verify_class (MonoClass *class) { + /*Neither <Module>, object or ifaces have parent.*/ + if (!class->parent && + class != mono_defaults.object_class && + !MONO_CLASS_IS_INTERFACE (class) && + (!class->image->dynamic && class->type_token != 0x2000001)) /*<Module> is the first type in the assembly*/ + return FALSE; + if (class->parent && MONO_CLASS_IS_INTERFACE (class->parent)) + return FALSE; if (class->generic_container && (class->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) return FALSE; if (!verify_class_for_overlapping_reference_fields (class)) diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index 308132a7f4c..c17cc9a48bb 100644 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,3 +1,194 @@ +2010-01-21 Zoltan Varga <vargaz@gmail.com> + + * exceptions-amd64.c (mono_arch_notify_pending_exc): Avoid a crash if the + thread has not fully started yet. + +2010-01-21 Zoltan Varga <vargaz@gmail.com> + + * aot-compiler.c (can_marshal_struct): Allow marshalling enums. + +2010-01-20 Zoltan Varga <vargaz@gmail.com> + + * mini-posix.c (SIG_HANDLER_SIGNATURE): Avoid + "Thread (nil) may have been prematurely finalized" messages if this is called + on a thread not registered with the runtime. + + * mini-exceptions.c (mono_handle_native_sigsegv): Ditto. + +2010-01-19 Zoltan Varga <vargaz@gmail.com> + + * jit-icalls.c (mono_array_new_3): New jit icall. + + * aot-compiler.c aot-runtime.c: Add support for ElementAddr wrappers. + + * arrays.cs: Add a test for 3 dimensional arrays. + +2010-01-18 Zoltan Varga <vargaz@gmail.com> + + * mini.h (MonoCompile): Add 'disable_out_of_line_bblocks' flag. + + * branch-opts.c (mono_optimize_branches): Honor the new flag. + + * mini.c (mini_method_compile): Set the new flag when running under the + debugger. + +2010-01-18 Zoltan Varga <vargaz@gmail.com> + + * mini.c (mono_jit_compile_method_inner): Avoid reading cfg->prof_options + after cfg has been freed. + +2010-01-17 Zoltan Varga <vargaz@gmail.com> + + * branch-opts.c (mono_branch_optimize_exception_target): Stop the optimization + if a clause is skipped because it uses the exception object, since it could + have caught the exception. + + * exceptions.cs: Add a test. + +2010-01-16 Zoltan Varga <vargaz@gmail.com> + + * debugger-agent.c (decode_value): Fix the decoding of I/U/PTR. + +2010-01-16 Zoltan Varga <vargaz@gmail.com> + + * mini-amd64.c (emit_call_body): Always use near calls when AOTing even if + NOMAP32BIT or optimize_for_xen is set. + + +Wed Jan 13 15:54:53 CET 2010 Paolo Molaro <lupus@ximian.com> + + * jit.h, method-to-ir.c: added ability to set the policy for + inserting breakpoints from the break IL instruction or the + Debugger.Break () API call. + +2010-01-11 Zoltan Varga <vargaz@gmail.com> + + * debugger-agent.c (mono_debugger_agent_parse_options): Allow onthrow without + an argument which matches any exception. + +2010-01-10 Zoltan Varga <vargaz@gmail.com> + + * method-to-ir.c (mono_emit_method_call_full): Avoid the virt->nonvirt + optimization if the called method is gshared and marshalbyref, since gshared + methods can' have wrappers. Fixes #569390. + + * generics.cs: Add a test. + +2010-01-10 Zoltan Varga <vargaz@gmail.com> + + * mini-exceptions.c (mono_print_thread_dump_from_ctx): New helper function + callable from gdb. + +2010-01-10 Zoltan Varga <vargaz@gmail.com> + + * mini.c (mono_print_method_from_ip): Fix the lookup of trampolines. + +2010-01-09 Zoltan Varga <vargaz@gmail.com> + + * debugger-agent.c (transport_connect): comment out freeaddrinfo calls under win32, + since it is not supported in win2000. + +2010-01-07 Zoltan Varga <vargaz@gmail.com> + + * mini-llvm-cpp.cpp (mono_llvm_create_ee): Add an ugly hack to fix #564695. + If LLVM decides to set the code model to Large, reset it to Default. + +2010-01-07 Zoltan Varga <vargaz@gmail.com> + + * aot-compiler.c (mono_xdebug_flush): Export it so it is present in + stripped binaries as well. + +2010-01-05 Rodrigo Kumpera <rkumpera@novell.com> + + * mini.c (mono_compile_is_broken): Skip methods from serialization's + internal assembly. + + Backport of r149053. + +2010-01-04 Zoltan Varga <vargaz@gmail.com> + + * mini-trampolines.c (mono_convert_imt_slot_to_vtable_slot): Call + mono_method_get_vtable_slot () instead of accessing imt_method->slot directly, + to fix an AOT case. + +2009-01-04 Rodrigo Kumpera <rkumpera@novell.com> + + * mini.c (mini_method_compile): Verify the method before calling + mono_compile_create_vars as this might crash since it uses method + information. + + Fixes #560196. + + Backport of r149045. + +2009-12-30 Rodrigo Kumpera <rkumpera@novell.com> + + * mini.c: + * method-to.ir.c: + * mini-*.c: Properly handle generic enums. + + Fixes #566294 + + Backport of r148941. + +2009-12-28 Zoltan Varga <vargaz@gmail.com> + + * method-to-ir.c (mono_method_to_ir): Handle the failure of mono_class_vtable () + in a few more places. + +2009-12-27 Zoltan Varga <vargaz@gmail.com> + + * aot-compiler.c (add_wrappers): Don't use dyn runtime invoke for methods with + nullable parameters. Fixes #567351. + +2009-12-26 Rodrigo Kumpera <rkumpera@novell.com> + + * mini-trampolines.c (common_call_trampoline): Add assert for NULL resolved generic method. + + Backport of r148905. + +2009-12-24 Sebastien Pouliot <sebastien@ximian.com> + + * method-to-ir.c (mono_method_to_ir): Avoid SIGSEGV when + mono_method_get_signature returns NULL. Fix #567084 + [Backport r148889] + +2009-12-23 Zoltan Varga <vargaz@gmail.com> + + * mini-trampolines.c (mono_create_llvm_imt_trampoline): Fix the LLVM build on + platforms without mono_arch_get_llvm_imt_trampoline (). + +2009-12-22 Zoltan Varga <vargaz@gmail.com> + + * aot-runtime.c (decode_klass_ref): Avoid a crash if a decode_klass_ref () call + fails. Fixes #566689. + +2009-12-21 Zoltan Varga <vargaz@gmail.com> + + * Makefile.am (AM_CFLAGS): Include LLVM_CFLAGS. + + * mini-llvm.c: Avoid defining the __STDC_... macros if already defined. + +2009-12-18 Zoltan Varga <vargaz@gmail.com> + + * mini-x86.c (mono_arch_get_argument_info): Allocate memory for CallInfo using + alloca as g_malloc is not signal safe. + +2009-12-17 Marek Habersack <mhabersack@novell.com> + + * mini.c (mono_get_runtime_build_info): include Mono version in + the returned value. + + * driver.c (mono_main): VERSION is now included in the string + returned from mono_get_runtime_build_info() + +2009-12-17 Zoltan Varga <vargaz@gmail.com> + + * method-to-ir.c (mono_method_to_ir): Add support for CALLI with unmanaged + signatures. Fixes #565143. + + * jit-icalls.c (mono_get_native_calli_wrapper): New JIT icall. + 2009-12-16 Rodrigo Kumpera <rkumpera@novell.com> * mini-x86.h: Forgot to add a 0x to MONO_ARCH_MAX_FRAME_SIZE define diff --git a/mono/mini/Makefile.am b/mono/mini/Makefile.am index 714d155e0df..075c99d7d60 100644 --- a/mono/mini/Makefile.am +++ b/mono/mini/Makefile.am @@ -37,6 +37,7 @@ AM_CFLAGS = \ -I$(top_srcdir) \ $(LIBGC_CFLAGS) \ $(GLIB_CFLAGS) \ + $(LLVM_CFLAGS) \ $(PLATFORM_CFLAGS) $(ARCH_CFLAGS) AM_CXXFLAGS = $(LLVM_CXXFLAGS) $(GLIB_CFLAGS) diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index 45f33a6f76b..4b245370d8f 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -1442,6 +1442,18 @@ encode_method_ref (MonoAotCompile *acfg, MonoMethod *method, guint8 *buf, guint8 encode_method_ref (acfg, m, p, &p); break; } + case MONO_WRAPPER_MANAGED_TO_MANAGED: + if (!strcmp (method->name, "ElementAddr")) { + ElementAddrWrapperInfo *info = mono_marshal_wrapper_info_from_wrapper (method); + + g_assert (info); + encode_value (MONO_AOT_WRAPPER_ELEMENT_ADDR, p, &p); + encode_value (info->rank, p, &p); + encode_value (info->elem_size, p, &p); + } else { + g_assert_not_reached (); + } + break; default: g_assert_not_reached (); } @@ -1755,7 +1767,7 @@ can_marshal_struct (MonoClass *klass) case MONO_TYPE_STRING: break; case MONO_TYPE_VALUETYPE: - if (!can_marshal_struct (mono_class_from_mono_type (field->type))) + if (!mono_class_from_mono_type (field->type)->enumtype && can_marshal_struct (mono_class_from_mono_type (field->type))) can_marshal = FALSE; break; default: @@ -1820,8 +1832,14 @@ add_wrappers (MonoAotCompile *acfg) #ifdef MONO_ARCH_DYN_CALL_SUPPORTED if (!method->klass->contextbound) { MonoDynCallInfo *info = mono_arch_dyn_call_prepare (sig); + gboolean has_nullable = FALSE; + + for (j = 0; j < sig->param_count; j++) { + if (sig->params [j]->type == MONO_TYPE_GENERICINST && mono_class_is_nullable (mono_class_from_mono_type (sig->params [j]))) + has_nullable = TRUE; + } - if (info) { + if (info && !has_nullable) { /* Supported by the dynamic runtime-invoke wrapper */ skip = TRUE; g_free (info); @@ -3553,6 +3571,11 @@ can_encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info) case MONO_WRAPPER_REMOTING_INVOKE: case MONO_WRAPPER_UNKNOWN: break; + case MONO_WRAPPER_MANAGED_TO_MANAGED: + if (!strcmp (method->name, "ElementAddr")) + return TRUE; + else + return FALSE; default: //printf ("Skip (wrapper call): %d -> %s\n", patch_info->type, mono_method_full_name (patch_info->data.method, TRUE)); return FALSE; @@ -3756,6 +3779,8 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method) } add_generic_class (acfg, m->klass); } + if (m->wrapper_type == MONO_WRAPPER_MANAGED_TO_MANAGED && !strcmp (m->name, "ElementAddr")) + add_extra_method_with_depth (acfg, m, depth + 1); break; } case MONO_PATCH_INFO_VTABLE: { @@ -5817,7 +5842,7 @@ xdebug_end_emit (MonoImageWriter *w, MonoDwarfWriter *dw, MonoMethod *method) * This could be called from inside gdb to flush the debugging information not yet * registered with gdb. */ -static void +void mono_xdebug_flush (void) { if (xdebug_w) diff --git a/mono/mini/aot-runtime.c b/mono/mini/aot-runtime.c index 8c09add30f3..9a7a5a6ff32 100644 --- a/mono/mini/aot-runtime.c +++ b/mono/mini/aot-runtime.c @@ -314,6 +314,8 @@ decode_klass_ref (MonoAotModule *module, guint8 *buf, guint8 **endbuf) MonoType *type; gclass = decode_klass_ref (module, p, &p); + if (!gclass) + return NULL; g_assert (gclass->generic_container); memset (&ctx, 0, sizeof (ctx)); @@ -563,6 +565,19 @@ decode_method_ref (MonoAotModule *module, guint32 *token, MonoMethod **method, g *method = mono_marshal_get_runtime_invoke (m, FALSE); break; } + case MONO_WRAPPER_MANAGED_TO_MANAGED: { + int subtype = decode_value (p, &p); + + if (subtype == MONO_AOT_WRAPPER_ELEMENT_ADDR) { + int rank = decode_value (p, &p); + int elem_size = decode_value (p, &p); + + *method = mono_marshal_get_array_address (rank, elem_size); + } else { + g_assert_not_reached (); + } + break; + } default: g_assert_not_reached (); } diff --git a/mono/mini/arrays.cs b/mono/mini/arrays.cs index 0bd8bb300fa..464dfa565cc 100644 --- a/mono/mini/arrays.cs +++ b/mono/mini/arrays.cs @@ -437,6 +437,13 @@ class Tests { return 0; } + public static int test_100_3_dimensional_arrays () { + int[,,] test = new int[10, 10, 10]; + + test [1, 1, 1] = 100; + return test [1, 1, 1]; + } + public static int test_0_bug_71454 () { int[,] a = new int[4,4]; int[,] b = new int[4,4]; diff --git a/mono/mini/branch-opts.c b/mono/mini/branch-opts.c index bfd3b15483c..b5245c59b02 100644 --- a/mono/mini/branch-opts.c +++ b/mono/mini/branch-opts.c @@ -95,6 +95,9 @@ mono_branch_optimize_exception_target (MonoCompile *cfg, MonoBasicBlock *bb, con } return NULL; + } else { + /* Branching to an outer clause could skip inner clauses */ + return NULL; } } else { /* Branching to an outer clause could skip inner clauses */ @@ -1420,7 +1423,7 @@ mono_optimize_branches (MonoCompile *cfg) } if (bb->last_ins && MONO_IS_COND_BRANCH_NOFP (bb->last_ins)) { - if (bb->last_ins->inst_false_bb && bb->last_ins->inst_false_bb->out_of_line && (bb->region == bb->last_ins->inst_false_bb->region)) { + if (bb->last_ins->inst_false_bb && bb->last_ins->inst_false_bb->out_of_line && (bb->region == bb->last_ins->inst_false_bb->region) && !cfg->disable_out_of_line_bblocks) { /* Reverse the branch */ bb->last_ins->opcode = mono_reverse_branch_op (bb->last_ins->opcode); bbn = bb->last_ins->inst_false_bb; diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 534c5e06f97..26be3d2a505 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -666,6 +666,8 @@ mono_debugger_agent_parse_options (char *options) } else if (strncmp (arg, "onthrow=", 8) == 0) { /* We support multiple onthrow= options */ agent_config.onthrow = g_slist_append (agent_config.onthrow, g_strdup (arg + 8)); + } else if (strncmp (arg, "onthrow", 7) == 0) { + agent_config.onthrow = g_slist_append (agent_config.onthrow, g_strdup ("")); } else if (strncmp (arg, "help", 4) == 0) { print_usage (); exit (0); @@ -673,8 +675,8 @@ mono_debugger_agent_parse_options (char *options) agent_config.timeout = atoi (arg + 8); } else if (strncmp (arg, "launch=", 7) == 0) { agent_config.launch = g_strdup (arg + 7); - } else if (strncmp (arg, "embedding=", 9) == 0) { - agent_config.embedding = atoi (arg + 9) == 1; + } else if (strncmp (arg, "embedding=", 10) == 0) { + agent_config.embedding = atoi (arg + 10) == 1; } else { print_usage (); exit (1); @@ -959,7 +961,15 @@ transport_connect (const char *host, int port) break; } +#ifndef PLATFORM_WIN32 + /* + * this function is not present on win2000 which we still support, and the + * workaround described here: + * http://msdn.microsoft.com/en-us/library/ms737931(VS.85).aspx + * only works with MSVC. + */ freeaddrinfo (result); +#endif } DEBUG (1, fprintf (log_file, "Listening on %s:%d (timeout=%d ms)...\n", host, port, agent_config.timeout)); @@ -1003,7 +1013,10 @@ transport_connect (const char *host, int port) conn_fd = sfd; +#ifndef PLATFORM_WIN32 + /* See the comment above */ freeaddrinfo (result); +#endif if (rp == 0) { fprintf (stderr, "debugger-agent: Unable to connect to %s:%d\n", host, port); @@ -3637,7 +3650,7 @@ mono_debugger_agent_handle_exception (MonoException *exc, MonoContext *ctx) char *ex_type = l->data; char *f = mono_type_full_name (&exc->object.vtable->klass->byval_arg); - if (!strcmp (ex_type, f)) + if (!strcmp (ex_type, "") || !strcmp (ex_type, f)) found = TRUE; g_free (f); @@ -3846,8 +3859,11 @@ decode_value (MonoType *t, MonoDomain *domain, guint8 *addr, guint8 *buf, guint8 int err; int type = decode_byte (buf, &buf, limit); - if (type != t->type && !MONO_TYPE_IS_REFERENCE (t)) { - DEBUG(1, fprintf (log_file, "Expected value of type %d, got %d.\n", t->type, type)); + if (type != t->type && !MONO_TYPE_IS_REFERENCE (t) && + !(t->type == MONO_TYPE_I && type == MONO_TYPE_VALUETYPE) && + !(t->type == MONO_TYPE_U && type == MONO_TYPE_VALUETYPE) && + !(t->type == MONO_TYPE_PTR && type == MONO_TYPE_I8)) { + DEBUG(1, fprintf (log_file, "[%p] Expected value of type 0x%0x, got 0x%0x.\n", (gpointer)GetCurrentThreadId (), t->type, type)); return ERR_INVALID_ARGUMENT; } @@ -3888,6 +3904,16 @@ decode_value (MonoType *t, MonoDomain *domain, guint8 *addr, guint8 *buf, guint8 case MONO_TYPE_R8: *(guint64*)addr = decode_long (buf, &buf, limit); break; + case MONO_TYPE_PTR: + /* We send these as I8, so we get them back as such */ + g_assert (type == MONO_TYPE_I8); + *(gssize*)addr = decode_long (buf, &buf, limit); + break; + case MONO_TYPE_I: + case MONO_TYPE_U: + /* We send these as vtypes, so we get them back as such */ + g_assert (type == MONO_TYPE_VALUETYPE); + /* Fall through */ case MONO_TYPE_VALUETYPE: { gboolean is_enum = decode_byte (buf, &buf, limit); MonoClass *klass; diff --git a/mono/mini/driver.c b/mono/mini/driver.c index d80d65f8dd8..e9068d9278e 100644 --- a/mono/mini/driver.c +++ b/mono/mini/driver.c @@ -1333,7 +1333,7 @@ mono_main (int argc, char* argv[]) mini_verbose++; } else if (strcmp (argv [i], "--version") == 0 || strcmp (argv [i], "-V") == 0) { char *build = mono_get_runtime_build_info (); - g_print ("Mono JIT compiler version %s (%s)\nCopyright (C) 2002-2008 Novell, Inc and Contributors. www.mono-project.com\n", VERSION, build); + g_print ("Mono JIT compiler version %s\nCopyright (C) 2002-2008 Novell, Inc and Contributors. www.mono-project.com\n", build); g_free (build); g_print (info); if (mini_verbose) { diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c index 30d3244bdc4..983e7d27353 100644 --- a/mono/mini/exceptions-amd64.c +++ b/mono/mini/exceptions-amd64.c @@ -1039,6 +1039,10 @@ mono_arch_notify_pending_exc (void) { MonoLMF *lmf = mono_get_lmf (); + if (!lmf) + /* Not yet started */ + return; + if (lmf->rsp == 0) /* Initial LMF */ return; diff --git a/mono/mini/exceptions.cs b/mono/mini/exceptions.cs index 22cffb1711a..cf7dc613c04 100644 --- a/mono/mini/exceptions.cs +++ b/mono/mini/exceptions.cs @@ -2551,5 +2551,22 @@ class Tests { } return 0; } + + public static int test_0_except_opt_two_clauses () { + int size; + size = -1; + uint ui = (uint)size; + try { + checked { + uint v = ui * (uint)4; + } + } catch (OverflowException e) { + return 0; + } catch (Exception) { + return 1; + } + + return 2; + } } diff --git a/mono/mini/generics.cs b/mono/mini/generics.cs index 762eac2ec58..98109586a54 100644 --- a/mono/mini/generics.cs +++ b/mono/mini/generics.cs @@ -528,6 +528,28 @@ class Tests { return cctor_count; } + public static int test_0_marshalbyref_call_from_gshared_virt_elim () { + /* Calling a virtual method from gshared code which is changed to a nonvirt call */ + Class1<object> o = new Class1<object> (); + o.Do (new Class2<object> ()); + return 0; + } + + public class Class1<T> { + public virtual void Do (Class2<T> t) { + t.Foo (); + } + } + + public interface IFace1<T> { + void Foo (); + } + + public class Class2<T> : MarshalByRefObject, IFace1<T> { + public void Foo () { + } + } + public static void VirtualInterfaceCallFromGenericMethod <T> (IFoo f) { f.Bar <T> (); } diff --git a/mono/mini/jit-icalls.c b/mono/mini/jit-icalls.c index 6accfcbe0fd..54c8010d0b6 100644 --- a/mono/mini/jit-icalls.c +++ b/mono/mini/jit-icalls.c @@ -731,6 +731,36 @@ mono_array_new_2 (MonoMethod *cm, guint32 length1, guint32 length2) return mono_array_new_full (domain, cm->klass, lengths, lower_bounds); } +MonoArray * +mono_array_new_3 (MonoMethod *cm, guint32 length1, guint32 length2, guint32 length3) +{ + MonoDomain *domain = mono_domain_get (); + guint32 lengths [3]; + guint32 *lower_bounds; + int pcount; + int rank; + + MONO_ARCH_SAVE_REGS; + + pcount = mono_method_signature (cm)->param_count; + rank = cm->klass->rank; + + lengths [0] = length1; + lengths [1] = length2; + lengths [2] = length3; + + g_assert (rank == pcount); + + if (cm->klass->byval_arg.type == MONO_TYPE_ARRAY) { + lower_bounds = alloca (sizeof (guint32) * rank); + memset (lower_bounds, 0, sizeof (guint32) * rank); + } else { + lower_bounds = NULL; + } + + return mono_array_new_full (domain, cm->klass, lengths, lower_bounds); +} + gpointer mono_class_static_field_address (MonoDomain *domain, MonoClassField *field) { @@ -990,3 +1020,18 @@ mono_object_castclass (MonoObject *obj, MonoClass *klass) return NULL; } + +gpointer +mono_get_native_calli_wrapper (MonoImage *image, MonoMethodSignature *sig, gpointer func) +{ + MonoMarshalSpec **mspecs; + MonoMethodPInvoke piinfo; + MonoMethod *m; + + mspecs = g_new0 (MonoMarshalSpec*, sig->param_count + 1); + memset (&piinfo, 0, sizeof (piinfo)); + + m = mono_marshal_get_native_func_wrapper (image, sig, &piinfo, mspecs, func); + + return mono_compile_method (m); +} diff --git a/mono/mini/jit-icalls.h b/mono/mini/jit-icalls.h index 05585345b52..194a5d91c89 100644 --- a/mono/mini/jit-icalls.h +++ b/mono/mini/jit-icalls.h @@ -55,6 +55,8 @@ MonoArray *mono_array_new_1 (MonoMethod *cm, guint32 length) MONO_INTERNAL; MonoArray *mono_array_new_2 (MonoMethod *cm, guint32 length1, guint32 length2) MONO_INTERNAL; +MonoArray *mono_array_new_3 (MonoMethod *cm, guint32 length1, guint32 length2, guint32 length3) MONO_INTERNAL; + gpointer mono_class_static_field_address (MonoDomain *domain, MonoClassField *field) MONO_INTERNAL; gpointer mono_ldtoken_wrapper (MonoImage *image, int token, MonoGenericContext *context) MONO_INTERNAL; @@ -159,5 +161,7 @@ MonoException *mono_create_corlib_exception_2 (guint32 token, MonoString *arg1, MonoObject* mono_object_castclass (MonoObject *obj, MonoClass *klass) MONO_INTERNAL; +gpointer mono_get_native_calli_wrapper (MonoImage *image, MonoMethodSignature *sig, gpointer func) MONO_INTERNAL; + #endif /* __MONO_JIT_ICALLS_H__ */ diff --git a/mono/mini/jit.h b/mono/mini/jit.h index f78dd119de8..f5440ad895c 100644 --- a/mono/mini/jit.h +++ b/mono/mini/jit.h @@ -33,6 +33,25 @@ mono_set_signal_chaining (gboolean chain_signals); void mono_jit_set_aot_only (gboolean aot_only); +/* Allow embedders to decide wherther to actually obey breakpoint instructions + * in specific methods (works for both break IL instructions and Debugger.Break () + * method calls). + */ +typedef enum { + /* the default is to always obey the breakpoint */ + MONO_BREAK_POLICY_ALWAYS, + /* a nop is inserted instead of a breakpoint */ + MONO_BREAK_POLICY_NEVER, + /* the breakpoint is executed only if the program has ben started under + * the debugger (that is if a debugger was attached at the time the method + * was compiled). + */ + MONO_BREAK_POLICY_ON_DBG +} MonoBreakPolicy; + +typedef MonoBreakPolicy (*MonoBreakPolicyFunc) (MonoMethod *method); +void mono_set_break_policy (MonoBreakPolicyFunc policy_callback); + void mono_jit_parse_options (int argc, char * argv[]); diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c index d1d94047e46..675f13aff5f 100644 --- a/mono/mini/method-to-ir.c +++ b/mono/mini/method-to-ir.c @@ -57,6 +57,7 @@ #include "ir-emit.h" #include "jit-icalls.h" +#include "jit.h" #include "debugger-agent.h" #define BRANCH_COST 100 @@ -1097,7 +1098,8 @@ type_from_stack_type (MonoInst *ins) { static G_GNUC_UNUSED int type_to_stack_type (MonoType *t) { - switch (mono_type_get_underlying_type (t)->type) { + t = mono_type_get_underlying_type (t); + switch (t->type) { case MONO_TYPE_I1: case MONO_TYPE_U1: case MONO_TYPE_BOOLEAN: @@ -2304,12 +2306,17 @@ mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSign if ((!cfg->compile_aot || enable_for_aot) && (!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) || (MONO_METHOD_IS_FINAL (method) && - method->wrapper_type != MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK))) { + method->wrapper_type != MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK)) && + !(method->klass->marshalbyref && context_used)) { /* * the method is not virtual, we just need to ensure this is not null * and then we can call the method directly. */ if (method->klass->marshalbyref || method->klass == mono_defaults.object_class) { + /* + * The check above ensures method is not gshared, this is needed since + * gshared methods can't have wrappers. + */ method = call->method = mono_marshal_get_remoting_invoke_with_check (method); } @@ -3766,6 +3773,53 @@ mini_emit_ldelema_ins (MonoCompile *cfg, MonoMethod *cmethod, MonoInst **sp, uns return addr; } +static MonoBreakPolicy +always_insert_breakpoint (MonoMethod *method) +{ + return MONO_BREAK_POLICY_ALWAYS; +} + +static MonoBreakPolicyFunc break_policy_func = always_insert_breakpoint; + +/** + * mono_set_break_policy: + * policy_callback: the new callback function + * + * Allow embedders to decide wherther to actually obey breakpoint instructions + * (both break IL instructions and Debugger.Break () method calls), for example + * to not allow an app to be aborted by a perfectly valid IL opcode when executing + * untrusted or semi-trusted code. + * + * @policy_callback will be called every time a break point instruction needs to + * be inserted with the method argument being the method that calls Debugger.Break() + * or has the IL break instruction. The callback should return #MONO_BREAK_POLICY_NEVER + * if it wants the breakpoint to not be effective in the given method. + * #MONO_BREAK_POLICY_ALWAYS is the default. + */ +void +mono_set_break_policy (MonoBreakPolicyFunc policy_callback) +{ + if (policy_callback) + break_policy_func = policy_callback; + else + break_policy_func = always_insert_breakpoint; +} + +static gboolean +should_insert_brekpoint (MonoMethod *method) { + switch (break_policy_func (method)) { + case MONO_BREAK_POLICY_ALWAYS: + return TRUE; + case MONO_BREAK_POLICY_NEVER: + return FALSE; + case MONO_BREAK_POLICY_ON_DBG: + return mono_debug_using_mono_debugger (); + default: + g_warning ("Incorrect value returned from break policy callback"); + return FALSE; + } +} + static MonoInst* mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) { @@ -4124,7 +4178,10 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign } else if (cmethod->klass->image == mono_defaults.corlib) { if (cmethod->name [0] == 'B' && strcmp (cmethod->name, "Break") == 0 && strcmp (cmethod->klass->name, "Debugger") == 0) { - MONO_INST_NEW (cfg, ins, OP_BREAK); + if (should_insert_brekpoint (cfg->method)) + MONO_INST_NEW (cfg, ins, OP_BREAK); + else + MONO_INST_NEW (cfg, ins, OP_NOP); MONO_ADD_INS (cfg->cbb, ins); return ins; } @@ -5836,7 +5893,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b MONO_ADD_INS (bblock, ins); break; case CEE_BREAK: - MONO_INST_NEW (cfg, ins, OP_BREAK); + if (should_insert_brekpoint (cfg->method)) + MONO_INST_NEW (cfg, ins, OP_BREAK); + else + MONO_INST_NEW (cfg, ins, OP_NOP); ip++; MONO_ADD_INS (bblock, ins); break; @@ -6189,6 +6249,21 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b fsig = mono_metadata_parse_signature (image, token); n = fsig->param_count + fsig->hasthis; + + if (method->dynamic && fsig->pinvoke) { + MonoInst *args [3]; + + /* + * This is a call through a function pointer using a pinvoke + * signature. Have to create a wrapper and call that instead. + * FIXME: This is very slow, need to create a wrapper at JIT time + * instead based on the signature. + */ + EMIT_NEW_IMAGECONST (cfg, args [0], method->klass->image); + EMIT_NEW_PCONST (cfg, args [1], fsig); + args [2] = addr; + addr = mono_emit_jit_icall (cfg, mono_get_native_calli_wrapper, args); + } } else { MonoMethod *cil_method; @@ -6398,6 +6473,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (context_used) { vtable_arg = emit_get_rgctx_method (cfg, context_used, cmethod, MONO_RGCTX_INFO_METHOD_RGCTX); } else { + mono_class_vtable (cfg->domain, cmethod->klass); + CHECK_TYPELOAD (cmethod->klass); + EMIT_NEW_METHOD_RGCTX_CONST (cfg, vtable_arg, cmethod); } @@ -7474,6 +7552,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (!cmethod) goto load_error; fsig = mono_method_get_signature (cmethod, image, token); + if (!fsig) + goto load_error; mono_save_token_info (cfg, image, token, cmethod); @@ -7498,6 +7578,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b vtable_arg = emit_get_rgctx_method (cfg, context_used, cmethod, MONO_RGCTX_INFO_METHOD_RGCTX); } else { + mono_class_vtable (cfg->domain, cmethod->klass); + CHECK_TYPELOAD (cmethod->klass); + EMIT_NEW_METHOD_RGCTX_CONST (cfg, vtable_arg, cmethod); } } else { @@ -7582,6 +7665,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b alloc = mono_emit_jit_icall (cfg, mono_array_new_1, sp); else if (fsig->param_count == 2) alloc = mono_emit_jit_icall (cfg, mono_array_new_2, sp); + else if (fsig->param_count == 3) + alloc = mono_emit_jit_icall (cfg, mono_array_new_3, sp); else alloc = handle_array_new (cfg, fsig->param_count, sp, ip); } else if (cmethod->string_ctor) { diff --git a/mono/mini/mini-alpha.c b/mono/mini/mini-alpha.c index c696fb68393..6ef1b6f101f 100644 --- a/mono/mini/mini-alpha.c +++ b/mono/mini/mini-alpha.c @@ -4422,7 +4422,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gbool cinfo->ret.reg = alpha_f0; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) + if (!mono_type_generic_inst_is_valuetype (ret_type)) { cinfo->ret.storage = ArgInIReg; cinfo->ret.reg = alpha_r0; @@ -4525,7 +4525,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gbool add_general (pgr, &stack_size, ainfo); break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->params [i])) + if (!mono_type_generic_inst_is_valuetype (ptype)) { add_general (pgr, &stack_size, ainfo); break; diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c index 9bacb1b7555..faa64a45420 100644 --- a/mono/mini/mini-amd64.c +++ b/mono/mini/mini-amd64.c @@ -676,7 +676,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign cinfo->ret.reg = AMD64_XMM0; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) { + if (!mono_type_generic_inst_is_valuetype (ret_type)) { cinfo->ret.storage = ArgInIReg; cinfo->ret.reg = AMD64_RAX; break; @@ -2558,11 +2558,6 @@ emit_call_body (MonoCompile *cfg, guint8 *code, guint32 patch_type, gconstpointe /* These methods are allocated using malloc */ near_call = FALSE; - if (cfg->compile_aot) { - near_call = TRUE; - no_patch = TRUE; - } - #ifdef MONO_ARCH_NOMAP32BIT near_call = FALSE; #endif @@ -2571,6 +2566,11 @@ emit_call_body (MonoCompile *cfg, guint8 *code, guint32 patch_type, gconstpointe if (optimize_for_xen) near_call = FALSE; + if (cfg->compile_aot) { + near_call = TRUE; + no_patch = TRUE; + } + if (near_call) { /* * Align the call displacement to an address divisible by 4 so it does @@ -6543,9 +6543,9 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea guchar *code = p; int save_mode = SAVE_NONE; MonoMethod *method = cfg->method; - int rtype = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret)->type; + MonoType *ret_type = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret); - switch (rtype) { + switch (ret_type->type) { case MONO_TYPE_VOID: /* special case string .ctor icall */ if (strcmp (".ctor", method->name) && method->klass == mono_defaults.string_class) @@ -6562,7 +6562,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea save_mode = SAVE_XMM; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (mono_method_signature (method)->ret)) { + if (!mono_type_generic_inst_is_valuetype (ret_type)) { save_mode = SAVE_EAX; break; } diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c index c1701635378..4d27e2fd0e1 100644 --- a/mono/mini/mini-arm.c +++ b/mono/mini/mini-arm.c @@ -870,7 +870,7 @@ get_call_info (MonoMethodSignature *sig, gboolean is_pinvoke) n++; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->params [i])) { + if (!mono_type_generic_inst_is_valuetype (simpletype)) { cinfo->args [n].size = sizeof (gpointer); add_general (&gr, &stack_size, cinfo->args + n, TRUE); n++; @@ -974,7 +974,7 @@ get_call_info (MonoMethodSignature *sig, gboolean is_pinvoke) cinfo->ret.regtype = RegTypeFP;*/ break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) { + if (!mono_type_generic_inst_is_valuetype (simpletype)) { cinfo->ret.regtype = RegTypeGeneral; cinfo->ret.reg = ARMREG_R0; break; diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c index d5f280f1c74..7bd99c0cc39 100644 --- a/mono/mini/mini-exceptions.c +++ b/mono/mini/mini-exceptions.c @@ -1741,7 +1741,7 @@ mono_handle_native_sigsegv (int signal, void *ctx) handling_sigsegv = TRUE; /* !jit_tls means the thread was not registered with the runtime */ - if (jit_tls) { + if (jit_tls && mono_thread_current ()) { fprintf (stderr, "Stacktrace:\n\n"); mono_jit_walk_stack (print_stack_frame, TRUE, stderr); @@ -1847,14 +1847,8 @@ mono_handle_native_sigsegv (int signal, void *ctx) abort (); } -/* - * mono_print_thread_dump: - * - * Print information about the current thread to stdout. - * SIGCTX can be NULL, allowing this to be called from gdb. - */ -void -mono_print_thread_dump (void *sigctx) +static void +mono_print_thread_dump_internal (void *sigctx, MonoContext *start_ctx) { MonoThread *thread = mono_thread_current (); #if defined(__i386__) || defined(__x86_64__) @@ -1882,7 +1876,9 @@ mono_print_thread_dump (void *sigctx) #endif #ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX - if (!sigctx) + if (start_ctx) { + memcpy (&ctx, start_ctx, sizeof (MonoContext)); + } else if (!sigctx) MONO_INIT_CONTEXT_FROM_FUNC (&ctx, mono_print_thread_dump); else mono_arch_sigctx_to_monoctx (sigctx, &ctx); @@ -1896,3 +1892,21 @@ mono_print_thread_dump (void *sigctx) g_string_free (text, TRUE); fflush (stdout); } + +/* + * mono_print_thread_dump: + * + * Print information about the current thread to stdout. + * SIGCTX can be NULL, allowing this to be called from gdb. + */ +void +mono_print_thread_dump (void *sigctx) +{ + mono_print_thread_dump_internal (sigctx, NULL); +} + +void +mono_print_thread_dump_from_ctx (MonoContext *ctx) +{ + mono_print_thread_dump_internal (NULL, ctx); +} diff --git a/mono/mini/mini-ia64.c b/mono/mini/mini-ia64.c index e2a92592d7b..03692984d59 100644 --- a/mono/mini/mini-ia64.c +++ b/mono/mini/mini-ia64.c @@ -401,7 +401,7 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo cinfo->ret.reg = 8; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) { + if (!mono_type_generic_inst_is_valuetype (ret_type)) { cinfo->ret.storage = ArgInIReg; cinfo->ret.reg = IA64_R8; break; @@ -494,7 +494,7 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo add_general (&gr, &stack_size, ainfo); break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->params [i])) { + if (!mono_type_generic_inst_is_valuetype (ptype)) { add_general (&gr, &stack_size, ainfo); break; } diff --git a/mono/mini/mini-llvm-cpp.cpp b/mono/mini/mini-llvm-cpp.cpp index f379b20c666..227b84b2346 100644 --- a/mono/mini/mini-llvm-cpp.cpp +++ b/mono/mini/mini-llvm-cpp.cpp @@ -25,6 +25,7 @@ #include <llvm/PassManager.h> #include <llvm/ExecutionEngine/ExecutionEngine.h> #include <llvm/ExecutionEngine/JITMemoryManager.h> +#include <llvm/ExecutionEngine/JITEventListener.h> #include <llvm/Target/TargetOptions.h> #include <llvm/Target/TargetData.h> #include <llvm/Analysis/Verifier.h> @@ -34,6 +35,7 @@ #include "llvm/Support/PrettyStackTrace.h" #include <llvm/CodeGen/Passes.h> #include <llvm/CodeGen/MachineFunctionPass.h> +#include <llvm/CodeGen/MachineFunction.h> //#include <llvm/LinkAllPasses.h> #include "llvm-c/Core.h" @@ -223,6 +225,32 @@ mono_llvm_build_volatile_load (LLVMBuilderRef builder, LLVMValueRef PointerVal, static cl::list<const PassInfo*, bool, PassNameParser> PassList(cl::desc("Optimizations available:")); +class MonoJITEventListener : public JITEventListener { + virtual void NotifyFunctionEmitted(const Function &F, + void *Code, size_t Size, + const EmittedFunctionDetails &Details) { + /* + * X86TargetMachine::setCodeModelForJIT() sets the code model to Large on amd64, + * which means the JIT will generate calls of the form + * mov reg, <imm> + * call *reg + * Our trampoline code can't patch this. Passing CodeModel::Small to createJIT + * doesn't seem to work, we need Default. A discussion is here: + * http://lists.cs.uiuc.edu/pipermail/llvmdev/2009-December/027999.html + * There seems to no way to get the TargeMachine used by an EE either, so we + * install a profiler hook and reset the code model here. + * This should be inside an ifdef, but we can't include our config.h either, + * since its definitions conflict with LLVM's config.h. + * + */ + //#if defined(TARGET_X86) || defined(TARGET_AMD64) + if (Details.MF->getTarget ().getCodeModel () == CodeModel::Large) { + Details.MF->getTarget ().setCodeModel (CodeModel::Default); + } + //#endif + } +}; + LLVMExecutionEngineRef mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, FunctionEmittedCb *emitted_cb, ExceptionTableCb *exception_cb) { @@ -247,6 +275,7 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func g_assert_not_reached (); } EE->InstallExceptionTableRegister (exception_cb); + EE->RegisterJITEventListener (new MonoJITEventListener ()); fpm = new FunctionPassManager (unwrap (MP)); diff --git a/mono/mini/mini-llvm.c b/mono/mini/mini-llvm.c index 43ca05f5251..304e1e31186 100644 --- a/mono/mini/mini-llvm.c +++ b/mono/mini/mini-llvm.c @@ -8,8 +8,12 @@ #include <mono/metadata/debug-helpers.h> #include <mono/metadata/mempool-internals.h> +#ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS +#endif +#ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS +#endif #include "llvm-c/Core.h" #include "llvm-c/ExecutionEngine.h" diff --git a/mono/mini/mini-mips.c b/mono/mini/mini-mips.c index 5a9a010f3de..6dd289c6bb2 100644 --- a/mono/mini/mini-mips.c +++ b/mono/mini/mini-mips.c @@ -897,7 +897,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) { guint i; int n = sig->hasthis + sig->param_count; - guint32 simpletype; + MonoType* simpletype; CallInfo *cinfo = g_malloc0 (sizeof (CallInfo) + sizeof (ArgInfo) * n); cinfo->fr = MIPS_FIRST_FPARG_REG; @@ -933,8 +933,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) n++; continue; } - simpletype = mono_type_get_underlying_type (sig->params [i])->type; - switch (simpletype) { + simpletype = mono_type_get_underlying_type (sig->params [i]); + switch (simpletype->type) { case MONO_TYPE_BOOLEAN: case MONO_TYPE_I1: case MONO_TYPE_U1: @@ -972,7 +972,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) n++; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->params [i])) { + if (!mono_type_generic_inst_is_valuetype (simpletype)) { cinfo->args [n].size = sizeof (gpointer); add_int32_arg (cinfo, &cinfo->args[n]); n++; @@ -1096,8 +1096,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) } { - simpletype = mono_type_get_underlying_type (sig->ret)->type; - switch (simpletype) { + simpletype = mono_type_get_underlying_type (sig->ret); + switch (simpletype->type) { case MONO_TYPE_BOOLEAN: case MONO_TYPE_I1: case MONO_TYPE_U1: @@ -1127,7 +1127,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) cinfo->ret.regtype = RegTypeFP; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) { + if (!mono_type_generic_inst_is_valuetype (simpletype)) { cinfo->ret.reg = mips_v0; break; } diff --git a/mono/mini/mini-posix.c b/mono/mini/mini-posix.c index 249c4b4ae71..b0a027fc591 100644 --- a/mono/mini/mini-posix.c +++ b/mono/mini/mini-posix.c @@ -144,10 +144,11 @@ SIG_HANDLER_SIGNATURE (mono_chain_signal) static void SIG_HANDLER_SIGNATURE (sigabrt_signal_handler) { - MonoJitInfo *ji; + MonoJitInfo *ji = NULL; GET_CONTEXT; - ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context(ctx)); + if (mono_thread_current ()) + ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context(ctx)); if (!ji) { if (mono_chain_signal (SIG_HANDLER_PARAMS)) return; diff --git a/mono/mini/mini-ppc.c b/mono/mini/mini-ppc.c index ca673ef563b..69ddbc9c87c 100644 --- a/mono/mini/mini-ppc.c +++ b/mono/mini/mini-ppc.c @@ -985,7 +985,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) { guint i, fr, gr; int n = sig->hasthis + sig->param_count; - guint32 simpletype; + MonoType *simpletype; guint32 stack_size = 0; CallInfo *cinfo = g_malloc0 (sizeof (CallInfo) + sizeof (ArgInfo) * n); @@ -1020,8 +1020,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) n++; continue; } - simpletype = mini_type_get_underlying_type (NULL, sig->params [i])->type; - switch (simpletype) { + simpletype = mini_type_get_underlying_type (NULL, sig->params [i]); + switch (simpletype->type) { case MONO_TYPE_BOOLEAN: case MONO_TYPE_I1: case MONO_TYPE_U1: @@ -1056,7 +1056,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) n++; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->params [i])) { + if (!mono_type_generic_inst_is_valuetype (simpletype)) { cinfo->args [n].size = sizeof (gpointer); add_general (&gr, &stack_size, cinfo->args + n, TRUE); n++; @@ -1230,8 +1230,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) } { - simpletype = mini_type_get_underlying_type (NULL, sig->ret)->type; - switch (simpletype) { + simpletype = mini_type_get_underlying_type (NULL, sig->ret); + switch (simpletype->type) { case MONO_TYPE_BOOLEAN: case MONO_TYPE_I1: case MONO_TYPE_U1: @@ -1261,7 +1261,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) cinfo->ret.regtype = RegTypeFP; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) { + if (!mono_type_generic_inst_is_valuetype (simpletype)) { cinfo->ret.reg = ppc_r3; break; } diff --git a/mono/mini/mini-s390.c b/mono/mini/mini-s390.c index d36cded9fed..90655bb0921 100644 --- a/mono/mini/mini-s390.c +++ b/mono/mini/mini-s390.c @@ -1436,7 +1436,7 @@ enum_retvalue: sz->code_size += 4; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) { + if (!mono_type_generic_inst_is_valuetype (ret_type)) { cinfo->ret.reg = s390_r2; sz->code_size += 4; break; @@ -1560,7 +1560,7 @@ enum_retvalue: nParm++; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->params [i])) { + if (!mono_type_generic_inst_is_valuetype (ptype)) { cinfo->args[nParm].size = sizeof(gpointer); add_general (&gr, sz, cinfo->args+nParm, TRUE); nParm++; diff --git a/mono/mini/mini-sparc.c b/mono/mini/mini-sparc.c index f98bf48e9e6..0dba7db712f 100644 --- a/mono/mini/mini-sparc.c +++ b/mono/mini/mini-sparc.c @@ -571,7 +571,7 @@ get_call_info (MonoCompile *cfg, MonoMethodSignature *sig, gboolean is_pinvoke) add_general (&gr, &stack_size, ainfo, FALSE); break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->params [i])) { + if (!mono_type_generic_inst_is_valuetype (ptype)) { add_general (&gr, &stack_size, ainfo, FALSE); break; } @@ -670,7 +670,7 @@ get_call_info (MonoCompile *cfg, MonoMethodSignature *sig, gboolean is_pinvoke) cinfo->ret.reg = sparc_f0; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) { + if (!mono_type_generic_inst_is_valuetype (ret_type)) { cinfo->ret.storage = ArgInIReg; cinfo->ret.reg = sparc_i0; if (gr < 1) diff --git a/mono/mini/mini-trampolines.c b/mono/mini/mini-trampolines.c index 0752b2404fc..df6a7a5907b 100644 --- a/mono/mini/mini-trampolines.c +++ b/mono/mini/mini-trampolines.c @@ -202,7 +202,7 @@ mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *cod context.method_inst = ((MonoMethodInflated*)imt_method)->context.method_inst; impl = mono_class_inflate_generic_method (impl, &context); } else { - impl = mono_class_get_vtable_entry (vt->klass, interface_offset + imt_method->slot); + impl = mono_class_get_vtable_entry (vt->klass, interface_offset + mono_method_get_vtable_slot (imt_method)); } if (mono_method_needs_static_rgctx_invoke (impl, FALSE)) @@ -446,6 +446,7 @@ mono_magic_trampoline (mgreg_t *regs, guint8 *code, gpointer arg, guint8* tramp) } g_assert (klass); + g_assert (actual_method); g_assert (actual_method->klass == klass); if (actual_method->is_inflated) @@ -1374,7 +1375,12 @@ mono_create_llvm_vcall_trampoline (MonoMethod *method) gpointer mono_create_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *m, int vt_offset) { +#ifdef MONO_ARCH_HAVE_LLVM_IMT_TRAMPOLINE return mono_arch_get_llvm_imt_trampoline (domain, m, vt_offset); +#else + g_assert_not_reached (); + return NULL; +#endif } #endif diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index 541819f40c1..9e7aa4c42c8 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -297,18 +297,12 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn * For x86 win32, see ???. */ static CallInfo* -get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke) +get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoMethodSignature *sig, gboolean is_pinvoke) { guint32 i, gr, fr; MonoType *ret_type; int n = sig->hasthis + sig->param_count; guint32 stack_size = 0; - CallInfo *cinfo; - - if (mp) - cinfo = mono_mempool_alloc0 (mp, sizeof (CallInfo) + (sizeof (ArgInfo) * n)); - else - cinfo = g_malloc0 (sizeof (CallInfo) + (sizeof (ArgInfo) * n)); gr = 0; fr = 0; @@ -349,7 +343,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign cinfo->ret.storage = ArgOnDoubleFpStack; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->ret)) { + if (!mono_type_generic_inst_is_valuetype (ret_type)) { cinfo->ret.storage = ArgInIReg; cinfo->ret.reg = X86_EAX; break; @@ -438,7 +432,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign add_general (&gr, &stack_size, ainfo); break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (sig->params [i])) { + if (!mono_type_generic_inst_is_valuetype (ptype)) { add_general (&gr, &stack_size, ainfo); break; } @@ -486,6 +480,20 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign return cinfo; } +static CallInfo* +get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke) +{ + int n = sig->hasthis + sig->param_count; + CallInfo *cinfo; + + if (mp) + cinfo = mono_mempool_alloc0 (mp, sizeof (CallInfo) + (sizeof (ArgInfo) * n)); + else + cinfo = g_malloc0 (sizeof (CallInfo) + (sizeof (ArgInfo) * n)); + + return get_call_info_internal (gsctx, cinfo, sig, is_pinvoke); +} + /* * mono_arch_get_argument_info: * @csig: a method signature @@ -496,6 +504,9 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign * padding. arg_info should be large enought to hold param_count + 1 entries. * * Returns the size of the argument area on the stack. + * This should be signal safe, since it is called from + * mono_arch_find_jit_info_ext (). + * FIXME: The metadata calls might not be signal safe. */ int mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJitArgumentInfo *arg_info) @@ -506,7 +517,10 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJit int offset = 8; CallInfo *cinfo; - cinfo = get_call_info (NULL, NULL, csig, FALSE); + /* Avoid g_malloc as it is not signal safe */ + cinfo = (CallInfo*)g_newa (guint8*, sizeof (CallInfo) + (sizeof (ArgInfo) * (csig->param_count + 1))); + + cinfo = get_call_info_internal (NULL, cinfo, csig, FALSE); if (MONO_TYPE_ISSTRUCT (csig->ret) && (cinfo->ret.storage == ArgOnStack)) { args_size += sizeof (gpointer); @@ -545,8 +559,6 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJit args_size += pad = (align - (args_size & (align - 1))) & (align - 1); arg_info [k].pad = pad; - g_free (cinfo); - return args_size; } @@ -1481,8 +1493,9 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea guchar *code = p; int arg_size = 0, stack_usage = 0, save_mode = SAVE_NONE; MonoMethod *method = cfg->method; - - switch (mini_type_get_underlying_type (cfg->generic_sharing_context, mono_method_signature (method)->ret)->type) { + MonoType *ret_type = mini_type_get_underlying_type (cfg->generic_sharing_context, mono_method_signature (method)->ret); + + switch (ret_type->type) { case MONO_TYPE_VOID: /* special case string .ctor icall */ if (strcmp (".ctor", method->name) && method->klass == mono_defaults.string_class) { @@ -1502,7 +1515,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea stack_usage = enable_arguments ? 16 : 8; break; case MONO_TYPE_GENERICINST: - if (!mono_type_generic_inst_is_valuetype (mono_method_signature (method)->ret)) { + if (!mono_type_generic_inst_is_valuetype (ret_type)) { save_mode = SAVE_EAX; stack_usage = enable_arguments ? 8 : 4; break; diff --git a/mono/mini/mini.c b/mono/mini/mini.c index bc481d92ea7..d1a8ad9e246 100644 --- a/mono/mini/mini.c +++ b/mono/mini/mini.c @@ -248,9 +248,10 @@ mono_print_method_from_ip (void *ip) char *method; MonoDebugSourceLocation *source; MonoDomain *domain = mono_domain_get (); + MonoDomain *target_domain = mono_domain_get (); FindTrampUserData user_data; - ji = mini_jit_info_table_find (domain, ip, &domain); + ji = mini_jit_info_table_find (domain, ip, &target_domain); if (!ji) { user_data.ip = ip; user_data.method = NULL; @@ -267,9 +268,9 @@ mono_print_method_from_ip (void *ip) return; } method = mono_method_full_name (ji->method, TRUE); - source = mono_debug_lookup_source_location (ji->method, (guint32)((guint8*)ip - (guint8*)ji->code_start), domain); + source = mono_debug_lookup_source_location (ji->method, (guint32)((guint8*)ip - (guint8*)ji->code_start), target_domain); - g_print ("IP %p at offset 0x%x of method %s (%p %p)[domain %p - %s]\n", ip, (int)((char*)ip - (char*)ji->code_start), method, ji->code_start, (char*)ji->code_start + ji->code_size, domain, domain->friendly_name); + g_print ("IP %p at offset 0x%x of method %s (%p %p)[domain %p - %s]\n", ip, (int)((char*)ip - (char*)ji->code_start), method, ji->code_start, (char*)ji->code_start + ji->code_size, target_domain, target_domain->friendly_name); if (source) g_print ("%s:%d\n", source->source_file, source->row); @@ -629,7 +630,9 @@ mono_type_to_load_membase (MonoCompile *cfg, MonoType *type) if (type->byref) return OP_LOAD_MEMBASE; - switch (mono_type_get_underlying_type (type)->type) { + type = mono_type_get_underlying_type (type); + + switch (type->type) { case MONO_TYPE_I1: return OP_LOADI1_MEMBASE; case MONO_TYPE_U1: @@ -1276,6 +1279,23 @@ mini_method_verify (MonoCompile *cfg, MonoMethod *method) return FALSE; } +/*Returns true is something went wrong*/ +static gboolean +mono_compile_is_broken (MonoCompile *cfg) +{ + MonoMethod *method = cfg->method; + MonoMethod *method_definition = method; + gboolean dont_verify = mini_assembly_can_skip_verification (cfg->domain, method); + dont_verify |= method->klass->image->assembly->corlib_internal; + + while (method_definition->is_inflated) { + MonoMethodInflated *imethod = (MonoMethodInflated *) method_definition; + method_definition = imethod->declaring; + } + + return !dont_verify && mini_method_verify (cfg, method_definition); +} + static void create_helper_signature (void) { @@ -3275,6 +3295,9 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool cfg->opt &= ~MONO_OPT_COPYPROP; cfg->opt &= ~MONO_OPT_CONSPROP; cfg->opt &= ~MONO_OPT_GSHARED; + + /* This is needed for the soft debugger, which doesn't like code after the epilog */ + cfg->disable_out_of_line_bblocks = TRUE; } if (mono_using_xdebug) { @@ -3390,6 +3413,10 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool */ //cfg->enable_extended_bblocks = TRUE; + /*We must verify the method before doing any IR generation as mono_compile_create_vars can assert.*/ + if (mono_compile_is_broken (cfg)) + return cfg; + /* * create MonoInst* which represents arguments and local variables */ @@ -4215,12 +4242,12 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in } if (ex) { - mono_destroy_compile (cfg); - *jit_ex = ex; - if (cfg->prof_options & MONO_PROFILE_JIT_COMPILATION) mono_profiler_method_end_jit (method, NULL, MONO_PROFILE_FAILED); + mono_destroy_compile (cfg); + *jit_ex = ex; + return NULL; } @@ -5381,6 +5408,8 @@ mini_init (const char *filename, const char *runtime_version) register_icall (mono_create_corlib_exception_2, "mono_create_corlib_exception_2", "object int object object", TRUE); register_icall (mono_array_new_1, "mono_array_new_1", "object ptr int", FALSE); register_icall (mono_array_new_2, "mono_array_new_2", "object ptr int int", FALSE); + register_icall (mono_array_new_3, "mono_array_new_3", "object ptr int int int", FALSE); + register_icall (mono_get_native_calli_wrapper, "mono_get_native_calli_wrapper", "ptr ptr ptr ptr", FALSE); #endif mono_generic_sharing_init (); @@ -5592,9 +5621,9 @@ char* mono_get_runtime_build_info (void) { if (mono_build_date) - return g_strdup_printf ("%s %s", FULL_VERSION, mono_build_date); + return g_strdup_printf ("%s (%s %s)", VERSION, FULL_VERSION, mono_build_date); else - return g_strdup_printf ("%s", FULL_VERSION); + return g_strdup_printf ("%s (%s)", VERSION, FULL_VERSION); } static void diff --git a/mono/mini/mini.h b/mono/mini/mini.h index f0ecb951da8..b8aa756f8c4 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -1019,6 +1019,7 @@ typedef struct { guint disable_omit_fp : 1; guint disable_vreg_to_lvreg : 1; guint disable_deadce_vars : 1; + guint disable_out_of_line_bblocks : 1; guint extend_live_ranges : 1; guint has_got_slots : 1; guint uses_rgctx_reg : 1; @@ -1501,7 +1502,7 @@ void mono_xdebug_init (char *xdebug_opts) MONO_INTERNAL; void mono_save_xdebug_info (MonoCompile *cfg) MONO_INTERNAL; void mono_save_trampoline_xdebug_info (const char *tramp_name, guint8 *code, guint32 code_size, GSList *unwind_info) MONO_INTERNAL; /* This is an exported function */ -void mono_xdebug_emit (void) MONO_INTERNAL; +void mono_xdebug_flush (void) MONO_INTERNAL; /* LLVM backend */ void mono_llvm_init (void) MONO_INTERNAL; @@ -1748,6 +1749,7 @@ gboolean mono_handle_exception (MonoContext *ctx, gpointer obj, gpointer original_ip, gboolean test_only) MONO_INTERNAL; void mono_handle_native_sigsegv (int signal, void *sigctx) MONO_INTERNAL; void mono_print_thread_dump (void *sigctx); +void mono_print_thread_dump_from_ctx (MonoContext *ctx); void mono_jit_walk_stack (MonoStackWalk func, gboolean do_il_offset, gpointer user_data) MONO_INTERNAL; void mono_jit_walk_stack_from_ctx (MonoStackWalk func, MonoContext *ctx, gboolean do_il_offset, gpointer user_data) MONO_INTERNAL; void mono_jit_walk_stack_from_ctx_in_thread (MonoJitStackWalk func, MonoDomain *domain, MonoContext *start_ctx, gboolean do_il_offset, MonoThread *thread, MonoLMF *lmf, gpointer user_data) MONO_INTERNAL; @@ -1974,10 +1976,11 @@ void SIG_HANDLER_SIGNATURE (mono_sigsegv_signal_handler) MONO_INTERNAL; void SIG_HANDLER_SIGNATURE (mono_sigint_signal_handler) MONO_INTERNAL; gboolean SIG_HANDLER_SIGNATURE (mono_chain_signal) MONO_INTERNAL; -/* for MONO_WRAPPER_UNKNOWN subtypes */ +/* for MONO_WRAPPER_UNKNOWN/MANAGED_TO_MANAGED subtypes */ enum { MONO_AOT_WRAPPER_MONO_ENTER, MONO_AOT_WRAPPER_MONO_EXIT, + MONO_AOT_WRAPPER_ELEMENT_ADDR, MONO_AOT_WRAPPER_LAST }; diff --git a/mono/profiler/ChangeLog b/mono/profiler/ChangeLog index 1a31fbce2b6..25544b0f8a5 100644 --- a/mono/profiler/ChangeLog +++ b/mono/profiler/ChangeLog @@ -1,3 +1,8 @@ +2010-01-11 Zoltan Varga <vargaz@gmail.com> + + * mono-profiler-logging.c (_ProfilerFileWriteBuffer): Use MONO_ZERO_LEN_ARRAY. + Fixes #569806. + 2009-09-14 Massimiliano Mantione <massi@ximian.com> * mono-profiler-logging.c: Removed the use of signals to control the profiler and extended the socket based interface to control also diff --git a/mono/profiler/mono-profiler-logging.c b/mono/profiler/mono-profiler-logging.c index 05ac38c8ad6..93a4f3abbb0 100644 --- a/mono/profiler/mono-profiler-logging.c +++ b/mono/profiler/mono-profiler-logging.c @@ -840,7 +840,7 @@ static __thread ProfilerPerThreadData * tls_profiler_per_thread_data; #define PROFILER_FILE_WRITE_BUFFER_SIZE (profiler->write_buffer_size) typedef struct _ProfilerFileWriteBuffer { struct _ProfilerFileWriteBuffer *next; - guint8 buffer []; + guint8 buffer [MONO_ZERO_LEN_ARRAY]; } ProfilerFileWriteBuffer; #define CHECK_PROFILER_ENABLED() do {\ diff --git a/mono/tests/ChangeLog b/mono/tests/ChangeLog index ca041d7eb1f..e1e40040f48 100644 --- a/mono/tests/ChangeLog +++ b/mono/tests/ChangeLog @@ -1,3 +1,7 @@ +2009-12-17 Zoltan Varga <vargaz@gmail.com> + + * libtest.c pinvoke2.cs: Add a test for calling pinvoke methods using calli. + 2009-11-20 Zoltan Varga <vargaz@gmail.com> * libtest.c (mono_test_marshal_bool_in): Use 'short' as the type of the diff --git a/mono/tests/libtest.c b/mono/tests/libtest.c index 4af3cb8d439..c54445aa4e1 100644 --- a/mono/tests/libtest.c +++ b/mono/tests/libtest.c @@ -3214,6 +3214,12 @@ lookup_mono_symbol (const char *symbol_name) return NULL; } +gpointer +mono_test_marshal_lookup_symbol (const char *symbol_name) +{ + return lookup_mono_symbol (symbol_name); +} + /** * test_method_thunk: * diff --git a/mono/tests/pinvoke2.cs b/mono/tests/pinvoke2.cs index 1ca7c06d3a9..704032d38e9 100644 --- a/mono/tests/pinvoke2.cs +++ b/mono/tests/pinvoke2.cs @@ -2,6 +2,7 @@ using System; using System.Text; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; +using System.Reflection.Emit; public class Tests { @@ -1549,5 +1550,46 @@ public class Tests { double d2 = mono_test_marshal_date_time (new DateTime (2009, 12, 6)); return (d2 == 40153.0) ? 0 : 1; } + + /* + * Calling pinvoke functions dynamically using calli + */ + + [DllImport("libtest")] + private static extern IntPtr mono_test_marshal_lookup_symbol (string fileName); + + delegate void CalliDel (IntPtr a, int[] f); + + public static int test_0_calli_dynamic () { + IntPtr func = mono_test_marshal_lookup_symbol ("mono_test_marshal_inout_array"); + + DynamicMethod dm = new DynamicMethod ("calli", typeof (void), new Type [] { typeof (IntPtr), typeof (int[]) }); + + var il = dm.GetILGenerator (); + var signature = SignatureHelper.GetMethodSigHelper (CallingConvention.Cdecl, typeof (void)); + + il.Emit (OpCodes.Ldarg, 1); + signature.AddArgument (typeof (byte[])); + + il.Emit (OpCodes.Ldarg_0); + + il.Emit (OpCodes.Calli, signature); + il.Emit (OpCodes.Ret); + + var f = (CalliDel)dm.CreateDelegate (typeof (CalliDel)); + + int[] arr = new int [1000]; + for (int i = 0; i < 50; ++i) + arr [i] = (int)i; + f (func, arr); + if (arr.Length != 1000) + return 1; + for (int i = 0; i < 50; ++i) + if (arr [i] != 50 - i) + return 2; + + return 0; + } + } diff --git a/mono/utils/ChangeLog b/mono/utils/ChangeLog index fa641b89af9..139dc4bd30e 100644 --- a/mono/utils/ChangeLog +++ b/mono/utils/ChangeLog @@ -1,3 +1,13 @@ +2010-01-18 Sebastien Pouliot <sebastien@ximian.com> + + * mono-error.c: Call va_end/va_start before reusing 'args'. + [Backport r149765] + +2010-01-03 Zoltan Varga <vargaz@gmail.com> + + * mono-path.c (mono_path_resolve_symlinks): Use g_strfreev () to free the + result of g_strplit. + 2009-11-26 Zoltan Varga <vargaz@gmail.com> * mono-ehash.c (mono_g_hash_table_find): Add this for eglib too. diff --git a/mono/utils/mono-error.c b/mono/utils/mono-error.c index 7f4cdc7e5d0..9ba165b517e 100644 --- a/mono/utils/mono-error.c +++ b/mono/utils/mono-error.c @@ -20,6 +20,8 @@ va_list args; \ va_start (args, msg_format); \ if (g_vsnprintf (error->message, sizeof (error->message), msg_format, args) >= sizeof (error->message)) {\ + va_end (args); \ + va_start (args, msg_format); \ if (!(error->full_message = g_strdup_vprintf (msg_format, args))) \ error->flags |= MONO_ERROR_INCOMPLETE; \ } \ diff --git a/mono/utils/mono-path.c b/mono/utils/mono-path.c index 591c5dc39c4..2b6f9f96734 100644 --- a/mono/utils/mono-path.c +++ b/mono/utils/mono-path.c @@ -150,7 +150,7 @@ mono_path_resolve_symlinks (const char *path) } } - g_free (split); + g_strfreev (split); return p; #endif } diff --git a/support/ChangeLog b/support/ChangeLog index 0e8d2246c3d..8bd5c406e78 100644 --- a/support/ChangeLog +++ b/support/ChangeLog @@ -1,3 +1,11 @@ +2009-12-16 Gonzalo Paniagua Javier <gonzalo@novell.com> + + * zlib-helper.c: when finishing uncompressing a buffer, we might need + more than one call to deflate with Z_FINISH since the uncompressed + data can take more space than the allocated buffer. + + Fixes the IPY+Chiron test case. + 2009-10-24 Gonzalo Paniagua Javier <gonzalo@novell.com> * zlib-helper.c: stop trying to decompress when we get Z_STREAM_END. diff --git a/support/zlib-helper.c b/support/zlib-helper.c index 5e11cb341eb..1d61c3d35fb 100644 --- a/support/zlib-helper.c +++ b/support/zlib-helper.c @@ -104,9 +104,11 @@ CloseZStream (ZStream *zstream) status = 0; if (zstream->compress) { if (zstream->stream->total_out) { - status = deflate (zstream->stream, Z_FINISH); - flush_status = Flush (zstream); - if (status == Z_OK || status == Z_STREAM_END) + do { + status = deflate (zstream->stream, Z_FINISH); + flush_status = Flush (zstream); + } while (status == Z_OK); /* We want Z_STREAM_END or error here here */ + if (status == Z_STREAM_END) status = flush_status; } deflateEnd (zstream->stream); diff --git a/tools/locale-builder/ChangeLog b/tools/locale-builder/ChangeLog index bbe196359bb..1acdafabfab 100644 --- a/tools/locale-builder/ChangeLog +++ b/tools/locale-builder/ChangeLog @@ -1,3 +1,23 @@ +2010-01-06 Atsushi Enomoto <atsushi@ximian.com> + + * Driver.cs : support FirstDayOfWeek. Fixed bug #567944. + Patch by Jose Antonio Sanchez Lazaro. + +2009-12-18 Dimitar Dobrev <dpldobrev@yahoo.com> + + * langs/ka.xml: added a file with the settings of the neutral + Georgian culture + * locales/ka-GE.xml: added a file with the settings of the + specific Georgian culture + * supp/ka-GE.xml: added a file with the date and time formats + of the Georgian culture + * lcids.xml: added entries for the neutral and specific + Georgian culture + * Makefile.am: included supp/ka-GE.xml in the build and dist the new + we're not downloading from primates.ximian.com. + + [Fixes bug 564910]. + 2009-11-05 Rolf Bjarne Kvinge <RKvinge@novell.com> * Driver.cs: Generate locale data for neutral cultures too. Moonlight diff --git a/tools/locale-builder/Driver.cs b/tools/locale-builder/Driver.cs index a867f82a268..7bd2520421f 100644 --- a/tools/locale-builder/Driver.cs +++ b/tools/locale-builder/Driver.cs @@ -665,6 +665,34 @@ namespace Mono.Tools.LocaleBuilder { if (pm != String.Empty) df.PMDesignator = pm; */ + ni2 = (XPathNodeIterator) ni.Current.Evaluate +("week/firstDay"); + if (ni2.MoveNext ()) { + XPathNavigator weekday_nav = ni2.Current; + switch (weekday_nav.GetAttribute ("day", String.Empty)) { + case "sun": + df.FirstDayOfWeek = 0; + break; + case "mon": + df.FirstDayOfWeek = 1; + break; + case "tue": + df.FirstDayOfWeek = 2; + break; + case "wed": + df.FirstDayOfWeek = 3; + break; + case "thu": + df.FirstDayOfWeek = 4; + break; + case "fri": + df.FirstDayOfWeek = 5; + break; + case "sat": + df.FirstDayOfWeek = 6; + break; + } + } } string date_sep = (string) nav.Evaluate ("string(ldml/dates/symbols/dateSeparator)"); diff --git a/tools/locale-builder/Makefile.am b/tools/locale-builder/Makefile.am index 95726fd414c..ba50bf668c3 100644 --- a/tools/locale-builder/Makefile.am +++ b/tools/locale-builder/Makefile.am @@ -106,6 +106,7 @@ supp_data_files = \ supp/it_CH.xml \ supp/it_IT.xml \ supp/ja.xml \ + supp/ka_GE.xml \ supp/ko_KR.xml \ supp/lt_LT.xml \ supp/lv.xml \ @@ -130,7 +131,15 @@ supp_data_files = \ supp/uk.xml \ supp/vi.xml -EXTRA_DIST = $(locale_builder_sources) $(supp_data_files) lcids.xml supplementalData.xml textinfo.xml +extra_langs = \ + langs/ka.xml + +extra_locales = \ + locales/ka_GE.xml + +EXTRA_DIST = $(locale_builder_sources) $(supp_data_files) lcids.xml supplementalData.xml textinfo.xml \ + $(extra_langs) $(extra_locales) + locale-builder.exe: $(locale_builder_sources) $(MCS) $(MCSFLAGS) /out:$@ $^ diff --git a/tools/locale-builder/langs/ka.xml b/tools/locale-builder/langs/ka.xml new file mode 100644 index 00000000000..4656ceea5f3 --- /dev/null +++ b/tools/locale-builder/langs/ka.xml @@ -0,0 +1,2159 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE ldml SYSTEM "../../common/dtd/ldml.dtd"> +<ldml> + <identity> + <version number="$Revision: 1.66 $"/> + <generation date="$Date: 2009/05/05 23:06:37 $"/> + <language type="ka"/> + </identity> + <localeDisplayNames> + <localeDisplayPattern> + <localePattern draft="contributed">{0} ({1})</localePattern> + <localeSeparator draft="contributed">, </localeSeparator> + </localeDisplayPattern> + <languages> + <language type="ab">แแคแฎแแแฃแ แ</language> + <language type="ady">แแแแฆแแฃแ แ</language> + <language type="ae" draft="contributed">แแแแกแขแ</language> + <language type="af">แแคแ แแแฃแแ</language> + <language type="ain" draft="contributed">แแแแฃ</language> + <language type="ale" draft="contributed">แแแแฃแขแฃแ แ</language> + <language type="ang">แซแแแแ แแแแแแกแฃแ แ</language> + <language type="ar">แแ แแแฃแแ</language> + <language type="arc">แแ แแแแฃแแ</language> + <language type="art" draft="contributed">แฎแแแแแแฃแ แ แกแฎแแ</language> + <language type="as" draft="contributed">แแกแแแฃแ แ</language> + <language type="ast">แแแกแขแ แแฃแแ</language> + <language type="az">แแแแ แแแแฏแแแฃแแ</language> + <language type="be" draft="contributed">แแแแแ แฃแกแฃแแ</language> + <language type="bg">แแฃแแแแ แฃแแ</language> + <language type="bh" draft="contributed">แแแฐแแ แ</language> + <language type="bo">แขแแแแขแฃแ แ</language> + <language type="br" draft="contributed">แแ แแขแแแฃแแ</language> + <language type="bs">แแแกแแแฃแ แ</language> + <language type="bua" draft="contributed">แแฃแ แแแขแฃแแ</language> + <language type="ca" draft="contributed">แแแขแแแแแฃแ แ</language> + <language type="cau" draft="contributed">แแแแแแกแแฃแ แ แกแฎแแ</language> + <language type="ce">แฉแแฉแแฃแ แ</language> + <language type="cel" draft="contributed">แแแแขแฃแ แ แกแฎแแ</language> + <language type="cs">แฉแแฎแฃแ แ</language> + <language type="cu">แกแแแแแแกแแ แกแแแแฃแ แ</language> + <language type="cy" draft="contributed">แฃแแแกแฃแ แ</language> + <language type="da">แแแแแฃแ แ</language> + <language type="de">แแแ แแแแฃแแ</language> + <language type="de_AT">แแแกแขแ แแฃแแ แแแ แแแแฃแแ</language> + <language type="de_CH" draft="contributed">แจแแแแชแแ แแฃแแ แแแฆแแแ แแแ แแแแฃแแ</language> + <language type="egy" draft="contributed">แแแแแแขแฃแ แ</language> + <language type="el">แแแ แซแแฃแแ</language> + <language type="en">แแแแแแกแฃแ แ</language> + <language type="en_AU">แแแกแขแ แแแแฃแ แ แแแแแแกแฃแ แ</language> + <language type="en_CA">แแแแแแฃแ แ แแแแแแกแฃแ แ</language> + <language type="en_GB">แแ แแขแแแฃแแ แแแแแแกแฃแ แ</language> + <language type="en_US">แแแแ แแแฃแแ แแแแแแกแฃแ แ</language> + <language type="eo">แแกแแแ แแแขแ</language> + <language type="es">แแกแแแแฃแ แ</language> + <language type="es_419" draft="contributed">แแแแแแฃแ แแแแ แแแฃแแ แแกแแแแฃแ แ</language> + <language type="es_ES" draft="contributed">แแแแ แแฃแแ แแกแแแแฃแ แ</language> + <language type="et">แแกแขแแแฃแ แ</language> + <language type="eu">แแแกแแฃแ แ</language> + <language type="fa">แกแแแ แกแฃแแ</language> + <language type="fi">แคแแแฃแ แ</language> + <language type="fil">แคแแแแแแแฃแ แ</language> + <language type="fr">แคแ แแแแฃแแ</language> + <language type="fr_CA">แแแแแแฃแ แ แคแ แแแแฃแแ</language> + <language type="fr_CH">แจแแแแชแแ แแฃแแ แคแ แแแแฃแแ</language> + <language type="fro">แซแแแแ แคแ แแแแฃแแ</language> + <language type="ga">แแ แแแแแแฃแ แ</language> + <language type="gd">แจแแขแแแแแแฃแ -แแแแฃแ แ</language> + <language type="gl">แแแแฃแ แ</language> + <language type="gn" draft="contributed">แแฃแแ แแแ</language> + <language type="goh">แซแแแแ แแแ แแแแฃแแ</language> + <language type="grc">แซแแแแ แแแ แซแแฃแแ</language> + <language type="gsw">แจแแแแชแแ แแฃแแ แแแ แแแแฃแแ</language> + <language type="gu" draft="contributed">แแฃแฏแแ แแแ</language> + <language type="he">แแแ แแฃแแ</language> + <language type="hi" draft="contributed">แฐแแแแ</language> + <language type="hr">แฎแแ แแแขแแฃแแ</language> + <language type="hu">แฃแแแ แฃแแ</language> + <language type="hy">แกแแแฎแฃแ แ</language> + <language type="ia" draft="contributed">แแแขแแ แแแแแฃแแแฃแ แ</language> + <language type="id">แแแแแแแแแฃแ แ</language> + <language type="ie" draft="contributed">แแแขแแ แแแแแ</language> + <language type="ine" draft="contributed">แแแแ-แแแ แแแฃแแ แกแฎแแ</language> + <language type="is">แแกแแแแแแฃแ แ</language> + <language type="it">แแขแแแแฃแ แ</language> + <language type="ja">แแแแแแฃแ แ</language> + <language type="jv" draft="contributed">แแแแแแฃแ แ</language> + <language type="ka">แฅแแ แแฃแแ</language> + <language type="kg" draft="contributed">แแแแแ</language> + <language type="kk" draft="contributed">แงแแแแฎแฃแ แ</language> + <language type="km">แแแแแแฏแแฃแ แ</language> + <language type="ko">แแแ แแฃแแ</language> + <language type="ku" draft="contributed">แฅแฃแ แแฃแแ</language> + <language type="ky">แงแแ แแแแฃแแ</language> + <language type="la">แแแแแแฃแ แ</language> + <language type="lb">แแฃแฅแกแแแแฃแ แแฃแแ</language> + <language type="ln" draft="contributed">แแแแแแแ</language> + <language type="lo">แแแแกแฃแ แ</language> + <language type="lt">แแแขแแฃแ แ</language> + <language type="lv">แแแขแแแฃแ แ</language> + <language type="mk">แแแแแแแแแฃแ แ</language> + <language type="mn" draft="contributed">แแแแฆแแแฃแ แ</language> + <language type="mo" draft="contributed">แแแแแแแฃแ แ</language> + <language type="ms">แแแแแแแแฃแ แ</language> + <language type="myn" draft="contributed">แแแแแก แแแแแ</language> + <language type="nap" draft="contributed">แแแแแแแแขแแแฃแ แ</language> + <language type="ne">แแแแแแฃแ แ</language> + <language type="nl">แฐแแแแแแแฃแ แ</language> + <language type="nl_BE" draft="contributed">แคแแแแแแแแฃแ แ</language> + <language type="nn">แแแ แแแแแฃแแ แแแแแ แกแแ</language> + <language type="no">แแแ แแแแแฃแแ</language> + <language type="nv">แแแแแฎแ</language> + <language type="oc" draft="contributed">แแชแแขแแแฃแ แ</language> + <language type="or" draft="contributed">แแ แแฃแแ</language> + <language type="os">แแกแฃแ แ</language> + <language type="peo">แซแแแแ แกแแแ แกแฃแแ</language> + <language type="pl">แแแแแแฃแ แ</language> + <language type="pra" draft="contributed">แแ แแแ แแขแแก แแแแแ</language> + <language type="ps" draft="contributed">แแฃแจแขแฃ</language> + <language type="pt">แแแ แขแฃแแแแแฃแ แ</language> + <language type="pt_BR" draft="contributed">แแ แแแแแแฃแ แ แแแ แขแฃแแแแแฃแ แ</language> + <language type="pt_PT">แแแแ แแฃแ-แแแ แขแฃแแแแแฃแ แ</language> + <language type="ro">แ แฃแแแแฃแแ</language> + <language type="ru">แ แฃแกแฃแแ</language> + <language type="sa" draft="contributed">แกแแแกแแ แแขแ</language> + <language type="sc">แกแแ แแแแแฃแแ</language> + <language type="scn">แกแแชแแแแฃแ แ</language> + <language type="sd" draft="contributed">แกแแแแฃแ แ</language> + <language type="sga">แซแแแแ แแ แแแแแแฃแ แ</language> + <language type="sh" draft="contributed">แกแแ แแฃแ-แฎแแ แแแขแฃแแ</language> + <language type="si" draft="contributed">แกแแแฐแแแฃแ แ</language> + <language type="sk">แกแแแแแแฃแ แ</language> + <language type="sl">แกแแแแแแฃแ แ</language> + <language type="sla" draft="contributed">แกแแแแฃแ แ แกแฎแแ</language> + <language type="so">แกแแแแแแฃแ แ</language> + <language type="sq">แแแแแแฃแ แ</language> + <language type="sr" draft="contributed">แกแแ แแฃแแ</language> + <language type="st" draft="contributed">แกแแแฎแ แแ แกแแแแก แแแ</language> + <language type="sux">แจแฃแแแ แฃแแ</language> + <language type="sv">แจแแแแฃแ แ</language> + <language type="sw" draft="contributed">แกแฃแแฐแแแ</language> + <language type="tg">แขแแฏแแแฃแ แ</language> + <language type="th">แขแแแแแแแฃแ แ</language> + <language type="tk">แแฃแ แฅแแแแฃแแ</language> + <language type="tlh" draft="contributed">แแแแแแแแ</language> + <language type="tn" draft="contributed">แขแกแแแแ</language> + <language type="tr">แแฃแ แฅแฃแแ</language> + <language type="tw" draft="contributed">แแฃแ</language> + <language type="udm" draft="contributed">แฃแแแฃแ แขแแฃแแ</language> + <language type="ug" draft="contributed">แฃแแแฃแ แฃแแ</language> + <language type="uk">แฃแแ แแแแฃแแ</language> + <language type="und">แฃแชแแแแ แแ แแ แแกแฌแแ แ แแแ</language> + <language type="ur" draft="contributed">แฃแ แแฃ</language> + <language type="uz">แฃแแแแแฃแ แ</language> + <language type="vi">แแแแขแแแแฃแ แ</language> + <language type="xh" draft="contributed">แฅแกแแแ</language> + <language type="yi" draft="contributed">แแแแจแ</language> + <language type="zh">แฉแแแฃแ แ</language> + <language type="zh_Hans" draft="contributed">แแแแแ แขแแแแแฃแแ แฉแแแฃแ แ</language> + <language type="zh_Hant" draft="contributed">แขแ แแแแชแแฃแแ แฉแแแฃแ แ</language> + <language type="zu" draft="contributed">แแฃแแฃ</language> + </languages> + <scripts> + <script type="Arab">แแ แแแฃแแ</script> + <script type="Armn">แกแแแฎแฃแ แ</script> + <script type="Bali" draft="contributed">แแแแ</script> + <script type="Batk" draft="contributed">แแแขแแแ</script> + <script type="Beng">แแแแแแแฃแ แ</script> + <script type="Brai">แแ แแแแ</script> + <script type="Copt" draft="contributed">แแแแขแฃแ แ</script> + <script type="Cprt" draft="contributed">แแแแแ แแกแฃแแ</script> + <script type="Cyrl">แแแ แแแแชแ</script> + <script type="Cyrs">แซแแแแ แกแแแแแแกแแ แแแ แแแแชแ</script> + <script type="Deva" draft="contributed">แแแแแแแแแ แ</script> + <script type="Egyd" draft="contributed">แแแแแแขแฃแ แ แแแแแขแแแฃแ แ</script> + <script type="Egyh" draft="contributed">แแแแแแขแฃแ แ แฐแแแ แแขแแแฃแแ</script> + <script type="Egyp" draft="contributed">แแแแแแขแฃแ แ แแแ แแแแแคแฃแ แ</script> + <script type="Ethi">แแแแแแฃแ แ</script> + <script type="Geok">แฎแฃแชแฃแ แ</script> + <script type="Geor">แฅแแ แแฃแแ</script> + <script type="Glag" draft="contributed">แแแแแแแแชแ</script> + <script type="Goth">แแแแฃแ แ</script> + <script type="Grek">แแแ แซแแฃแแ</script> + <script type="Gujr" draft="contributed">แแฃแฏแแ แแแฃแแ</script> + <script type="Guru" draft="contributed">แแฃแ แแฃแฎแฃแแ</script> + <script type="Hani" draft="contributed">แฐแแแ</script> + <script type="Hans" draft="contributed">แแแแแ แขแแแแแฃแแ แฐแแแ</script> + <script type="Hant">แขแ แแแแชแแฃแแ แฐแแแ</script> + <script type="Hebr">แแแ แแฃแแ</script> + <script type="Hira">แฐแแ แแแแแ</script> + <script type="Hrkt">แแแขแแแแแ แแ แฐแแ แแแแแ</script> + <script type="Hung">แซแแแแ แฃแแแ แฃแแ</script> + <script type="Jpan">แแแแแแฃแ แ</script> + <script type="Kana">แแแขแแแแแ</script> + <script type="Khmr" draft="contributed">แฅแฐแแแ แฃแแ</script> + <script type="Laoo" draft="contributed">แแแแกแฃแ แ</script> + <script type="Latn">แแแแแแฃแ แ</script> + <script type="Lina" draft="contributed">แฌแ แคแแแ A</script> + <script type="Linb" draft="contributed">แฌแ แคแแแ B</script> + <script type="Maya">แแแแแก แแแ แแแแแคแแแ</script> + <script type="Mong">แแแแฆแแแฃแ แ</script> + <script type="Phnx" draft="contributed">แคแแแแแแฃแ แ</script> + <script type="Runr" draft="contributed">แ แฃแแฃแแ</script> + <script type="Syrc">แกแแ แแฃแแ</script> + <script type="Syre" draft="contributed">แแกแขแ แแแฏแแแแกแแฃแแ แกแแ แแฃแแ</script> + <script type="Syrj" draft="contributed">แแแกแแแแแแ แกแแ แแฃแแ</script> + <script type="Syrn" draft="contributed">แแฆแแแกแแแแแแ แกแแ แแฃแแ</script> + <script type="Taml">แขแแแแแฃแ แ</script> + <script type="Thai">แขแแแแแแแฃแ แ</script> + <script type="Tibt">แขแแแแขแฃแ แ</script> + <script type="Xpeo">แซแแแแ แกแแแ แกแฃแแ</script> + <script type="Xsux" draft="contributed">แจแฃแแแ แฃแ-แแฅแแแฃแ แ แแฃแ แกแแแฃแแ</script> + <script type="Zxxx">แแแฃแฌแแ แแแ</script> + <script type="Zzzz">แฃแชแแแแ แแ แแ แแกแฌแแ แ แแแแฌแแ แแแแ</script> + </scripts> + <territories> + <territory type="001">แแกแแคแแแ</territory> + <territory type="002">แแคแ แแแ</territory> + <territory type="003">แฉแ แแแแแแ แแแแ แแแ</territory> + <territory type="005">แกแแแฎแ แแแ แแแแ แแแ</territory> + <territory type="009" draft="contributed">แแแแแแแแ</territory> + <territory type="011">แแแกแแแแแแ แแคแ แแแ</territory> + <territory type="013">แชแแแขแ แแแฃแ แ แแแแ แแแ</territory> + <territory type="014">แแฆแแแกแแแแแแ แแคแ แแแ</territory> + <territory type="015">แฉแ แแแแแแแ แแคแ แแแ</territory> + <territory type="017">แจแฃแ แแคแ แแแ</territory> + <territory type="018">แกแแแฎแ แแแ แแคแ แแแ</territory> + <territory type="019">แแแแ แแแแแ</territory> + <territory type="021">แฉแ แแแแแแแ แแแแ แแแ</territory> + <territory type="029" draft="contributed">แแแ แแแ</territory> + <territory type="030">แแฆแแแกแแแแแแ แแแแ</territory> + <territory type="034">แกแแแฎแ แแแ แแแแ</territory> + <territory type="035">แกแแแฎแ แแ-แแฆแแแกแแแแแแ แแแแ</territory> + <territory type="039">แกแแแฎแ แแแ แแแ แแแ</territory> + <territory type="053">แแแกแขแ แแแแ แแ แแฎแแแ แแแแแแแแ</territory> + <territory type="054" draft="contributed">แแแแแแแแแ</territory> + <territory type="057" draft="contributed">แแแ แแแแแแ</territory> + <territory type="061">แแแแแแแแแ</territory> + <territory type="062">แกแแแฎแ แแ-แชแแแขแ แแแฃแ แ แแแแ</territory> + <territory type="142">แแแแ</territory> + <territory type="143">แชแแแขแ แแแฃแ แ แแแแ</territory> + <territory type="145">แแแกแแแแแแ แแแแ</territory> + <territory type="150">แแแ แแแ</territory> + <territory type="151">แแฆแแแกแแแแแแ แแแ แแแ</territory> + <territory type="154">แฉแ แแแแแแแ แแแ แแแ</territory> + <territory type="155">แแแกแแแแแแ แแแ แแแ</territory> + <territory type="172">แแแแแฃแแแแแแแ แกแแฎแแแแฌแแคแแแ แแแแแแแแแแ แแแ</territory> + <territory type="419" draft="contributed">แแแแแแฃแ แ แแแแ แแแ แแ แแแ แแแ</territory> + <territory type="AD">แแแแแ แ</territory> + <territory type="AE">แแ แแแแแแก แแแแ แแแแแแแฃแแ แแแแ แแขแแแ</territory> + <territory type="AF">แแแฆแแแแแ</territory> + <territory type="AG">แแแขแแแฃแ แแ แแแ แแฃแแ</territory> + <territory type="AI">แแแแแแแ</territory> + <territory type="AL">แแแแแแแแ</territory> + <territory type="AM">แกแแแฎแแแ</territory> + <territory type="AN" draft="contributed">แแแแแ แแแแแแแแก แแแขแแแแแ</territory> + <territory type="AO">แแแแแแ</territory> + <territory type="AQ">แแแขแแ แฅแขแแแ</territory> + <territory type="AR">แแ แแแแขแแแ</territory> + <territory type="AS">แแแแ แแแฃแแ แกแแแแ</territory> + <territory type="AT">แแแกแขแ แแ</territory> + <territory type="AU">แแแกแขแ แแแแ</territory> + <territory type="AW">แแ แฃแแ</territory> + <territory type="AX">แแแแแแแก แแฃแแซแฃแแแแ</territory> + <territory type="AZ">แแแแ แแแแฏแแแ</territory> + <territory type="BA">แแแกแแแ แแ แฐแแ แชแแแแแแแ</territory> + <territory type="BB">แแแ แแแแแกแ</territory> + <territory type="BD">แแแแแแแแแจแ</territory> + <territory type="BE">แแแแแแ</territory> + <territory type="BF">แแฃแ แแแแ-แคแแกแ</territory> + <territory type="BG">แแฃแแแแ แแแ</territory> + <territory type="BH">แแแฐแ แแแแ</territory> + <territory type="BI">แแฃแ แฃแแแ</territory> + <territory type="BJ">แแแแแแ</territory> + <territory type="BM">แแแ แแฃแแ</territory> + <territory type="BN">แแ แฃแแแ</territory> + <territory type="BO">แแแแแแแ</territory> + <territory type="BR">แแ แแแแแแ</territory> + <territory type="BS">แแแฐแแแแก แแฃแแซแฃแแแแ</territory> + <territory type="BT">แแฃแขแแแ</territory> + <territory type="BV" draft="contributed">แแฃแแแก แแฃแแซแฃแแ</territory> + <territory type="BW">แแแขแกแแแแ</territory> + <territory type="BY">แแแแแ แฃแกแแ</territory> + <territory type="BZ">แแแแแแ</territory> + <territory type="CA">แแแแแแ</territory> + <territory type="CD" draft="contributed">แแแแแ - แแแแจแแกแ</territory> + <territory type="CF">แชแแแขแ แแแฃแ แ แแคแ แแแแก แ แแกแแฃแแแแแ</territory> + <territory type="CG">แแแแแ</territory> + <territory type="CH">แจแแแแชแแ แแ</territory> + <territory type="CI">แกแแแแแก แซแแแแก แกแแแแแแ แ</territory> + <territory type="CK">แแฃแแแก แแฃแแซแฃแแแแ</territory> + <territory type="CL">แฉแแแ</territory> + <territory type="CM">แแแแแ แฃแแ</territory> + <territory type="CN">แฉแแแแแ</territory> + <territory type="CO">แแแแฃแแแแ</territory> + <territory type="CR">แแแกแขแ-แ แแแ</territory> + <territory type="CS">แกแแ แแแ แแ แแแแขแแแแแ แ</territory> + <territory type="CU">แแฃแแ</territory> + <territory type="CV">แแแแ-แแแ แแ</territory> + <territory type="CX">แจแแแแก แแฃแแซแฃแแ</territory> + <territory type="CY">แแแแแ แแกแ</territory> + <territory type="CZ">แฉแแฎแแแแก แ แแกแแฃแแแแแ</territory> + <territory type="DE">แแแ แแแแแ</territory> + <territory type="DJ">แฏแแแฃแขแ</territory> + <territory type="DK">แแแแแ</territory> + <territory type="DM">แแแแแแแแ</territory> + <territory type="DO">แแแแแแแแแแแก แ แแกแแฃแแแแแ</territory> + <territory type="DZ">แแแแแ แ</territory> + <territory type="EC">แแแแแแแ แ</territory> + <territory type="EE">แแกแขแแแแแ</territory> + <territory type="EG">แแแแแแขแ</territory> + <territory type="EH">แแแกแแแแแแ แกแแฐแแ แ</territory> + <territory type="ER">แแ แแขแ แแ</territory> + <territory type="ES">แแกแแแแแแ</territory> + <territory type="ET">แแแแแแแ</territory> + <territory type="FI">แคแแแแแ</territory> + <territory type="FJ">แคแแฏแ</territory> + <territory type="FK">แคแแแแแแแแแก แแฃแแซแฃแแแแ</territory> + <territory type="FM">แแแแ แแแแแแ</territory> + <territory type="FO">แคแแ แแก แแฃแแซแฃแแแแ</territory> + <territory type="FR">แกแแคแ แแแแแแ</territory> + <territory type="GA">แแแแแแ</territory> + <territory type="GB">แแแแ แแ แแขแแแแแ</territory> + <territory type="GD">แแ แแแแแ</territory> + <territory type="GE">แกแแฅแแ แแแแแ</territory> + <territory type="GH">แแแแ</territory> + <territory type="GI">แแแแ แแแขแแ แ</territory> + <territory type="GL">แแ แแแแแแแแ</territory> + <territory type="GM">แแแแแแ</territory> + <territory type="GN">แแแแแแ</territory> + <territory type="GP" draft="contributed">แแแแแแแฃแแ</territory> + <territory type="GQ">แแแแแขแแ แฃแแ แแแแแแ</territory> + <territory type="GR">แกแแแแ แซแแแแ</territory> + <territory type="GS" draft="contributed">แกแแแฎแ แแแ แฏแแ แฏแแ แแ แกแแแฎแ แแ แกแแแแแแฉแแก แแฃแแซแฃแแแแ</territory> + <territory type="GT">แแแแขแแแแแ</territory> + <territory type="GU" draft="contributed">แแฃแแแ</territory> + <territory type="GW">แแแแแแ-แแแกแแฃ</territory> + <territory type="GY">แแแแแแ</territory> + <territory type="HK" draft="contributed">แฐแแแ แแแแแ</territory> + <territory type="HK" alt="short">แฐแแแ แแแแแ</territory> + <territory type="HM" draft="contributed">แฐแแ แแแก แแฃแแซแฃแแ แแ แแแแแแแแแแแก แแฃแแซแฃแแแแ</territory> + <territory type="HN">แฐแแแแฃแ แแกแ</territory> + <territory type="HR">แฐแแ แแแขแแ</territory> + <territory type="HT">แฐแแแขแ</territory> + <territory type="HU">แฃแแแ แแแ</territory> + <territory type="ID">แแแแแแแแแ</territory> + <territory type="IE">แแ แแแแแแ</territory> + <territory type="IL">แแกแ แแแแ</territory> + <territory type="IM" draft="contributed">แแแแแก แแฃแแซแฃแแ</territory> + <territory type="IN">แแแแแแแ</territory> + <territory type="IO">แแ แแขแแแฃแแ แขแแ แแขแแ แแ แแแแแแแแก แแแแแแแจแ</territory> + <territory type="IQ">แแ แแงแ</territory> + <territory type="IR">แแ แแแ</territory> + <territory type="IS">แแกแแแแแแ</territory> + <territory type="IT">แแขแแแแ</territory> + <territory type="JE" draft="contributed">แฏแแ แกแ</territory> + <territory type="JM">แแแแแแแ</territory> + <territory type="JO">แแแ แแแแแ</territory> + <territory type="JP">แแแแแแแ</territory> + <territory type="KE">แแแแแ</territory> + <territory type="KG">แงแแ แแแแแแ</territory> + <territory type="KH">แแแแแแฏแ</territory> + <territory type="KI">แแแ แแแแขแ</territory> + <territory type="KM">แแแแแ แแก แแฃแแซแฃแแแแ</territory> + <territory type="KN">แกแแแข-แแแขแกแ แแ แแแแแกแ</territory> + <territory type="KP">แฉแ แแแแแแแ แแแ แแ</territory> + <territory type="KR">แกแแแฎแ แแแ แแแ แแ</territory> + <territory type="KW">แแฃแแแแขแ</territory> + <territory type="KY">แแแแแแแแก แแฃแแซแฃแแแแ</territory> + <territory type="KZ">แงแแแแฎแแแ</territory> + <territory type="LA">แแแแกแ</territory> + <territory type="LB">แแแแแแ</territory> + <territory type="LC">แกแแแข-แแฃแกแแ</territory> + <territory type="LI">แแแฎแขแแแจแขแแแแ</territory> + <territory type="LK">แจแ แ-แแแแแ</territory> + <territory type="LR">แแแแแ แแ</territory> + <territory type="LS" draft="contributed">แแแกแแแ</territory> + <territory type="LT">แแแขแแ</territory> + <territory type="LU">แแฃแฅแกแแแแฃแ แแ</territory> + <territory type="LV">แแแขแแแ</territory> + <territory type="LY">แแแแแ</territory> + <territory type="MA">แแแ แแแ</territory> + <territory type="MC">แแแแแแ</territory> + <territory type="MD">แแแแแแแ</territory> + <territory type="ME">แแแแขแแแแแ แ</territory> + <territory type="MG">แแแแแแแกแแแ แ</territory> + <territory type="MH">แแแ แจแแแแก แแฃแแซแฃแแแแ</territory> + <territory type="MK">แแแแแแแแแ</territory> + <territory type="ML">แแแแ</territory> + <territory type="MM">แแแแแแแ แ</territory> + <territory type="MN">แแแแฆแแแแแ</territory> + <territory type="MO" draft="contributed">แแแแแ</territory> + <territory type="MO" alt="short">แแแแแ</territory> + <territory type="MQ" draft="contributed">แแแ แขแแแแแ</territory> + <territory type="MR">แแแแ แแขแแแแ</territory> + <territory type="MS">แแแแกแแ แแขแ</territory> + <territory type="MT">แแแแขแ</territory> + <territory type="MU">แแแแ แแแแ</territory> + <territory type="MV">แแแแแแแแก แแฃแแซแฃแแแแ</territory> + <territory type="MW">แแแแแแ</territory> + <territory type="MX">แแแฅแกแแแ</territory> + <territory type="MY">แแแแแแแแ</territory> + <territory type="MZ">แแแแแแแแแ</territory> + <territory type="NA">แแแแแแแ</territory> + <territory type="NC" draft="contributed">แแฎแแแ แแแแแแแแแ</territory> + <territory type="NE">แแแแแ แ</territory> + <territory type="NF">แแแ แคแแแแแก แแฃแแซแฃแแ</territory> + <territory type="NG">แแแแแ แแ</territory> + <territory type="NI">แแแแแ แแแฃแ</territory> + <territory type="NL">แแแแแ แแแแแแแ</territory> + <territory type="NO">แแแ แแแแแ</territory> + <territory type="NP">แแแแแแ</territory> + <territory type="NR">แแแฃแ แฃ</territory> + <territory type="NZ">แแฎแแแ แแแแแแแแ</territory> + <territory type="OM">แแแแแ</territory> + <territory type="PA">แแแแแแ</territory> + <territory type="PE">แแแ แฃ</territory> + <territory type="PF" draft="contributed">แคแ แแแแฃแแ แแแแแแแแแ</territory> + <territory type="PG">แแแแฃแ-แแฎแแแ แแแแแแ</territory> + <territory type="PH">แคแแแแแแแแแ</territory> + <territory type="PK">แแแแแกแขแแแ</territory> + <territory type="PL">แแแแแแแแ</territory> + <territory type="PM" draft="contributed">แกแแแข-แแแแ แ แแ แแแฅแแแแแ</territory> + <territory type="PR">แแฃแแ แขแ แ แแแ</territory> + <territory type="PS">แแแแแกแขแแแแก แขแแ แแขแแ แแ</territory> + <territory type="PT">แแแ แขแฃแแแแแ</territory> + <territory type="PW">แแแแแฃ</territory> + <territory type="PY">แแแ แแแแแ</territory> + <territory type="QA">แแแขแแ แ</territory> + <territory type="QO" draft="contributed">แแแจแแ แแแฃแแ แแแแแแแ</territory> + <territory type="QU">แแแ แแแแแจแแ แ</territory> + <territory type="RE" draft="contributed">แ แแแฃแแแแแ</territory> + <territory type="RO">แ แฃแแแแแแ</territory> + <territory type="RS">แกแแ แแแ</territory> + <territory type="RU">แ แฃแกแแแ</territory> + <territory type="RW">แ แฃแแแแ</territory> + <territory type="SA">แกแแฃแแแก แแ แแแแแ</territory> + <territory type="SB">แกแแแแแแแแก แแฃแแซแฃแแแแ</territory> + <territory type="SC">แกแแแจแแแแก แแฃแแซแฃแแแแ</territory> + <territory type="SD">แกแฃแแแแ</territory> + <territory type="SE">แจแแแชแแ</territory> + <territory type="SG">แกแแแแแแฃแ แ</territory> + <territory type="SH" draft="contributed">แฌแแแแแ แแแแแแก แแฃแแซแฃแแ</territory> + <territory type="SI">แกแแแแแแแ</territory> + <territory type="SK">แกแแแแแแแแ</territory> + <territory type="SL">แกแแแ แ-แแแแแ</territory> + <territory type="SM">แกแแ-แแแ แแแ</territory> + <territory type="SN">แกแแแแแแแ</territory> + <territory type="SO">แกแแแแแ</territory> + <territory type="SR">แกแฃแ แแแแแ</territory> + <territory type="ST">แกแแ-แขแแแ แแ แแ แแแกแแแ</territory> + <territory type="SV">แกแแแแแแแ แ</territory> + <territory type="SY">แกแแ แแ</territory> + <territory type="SZ">แกแแแแแแแแแ</territory> + <territory type="TD">แฉแแแ</territory> + <territory type="TF" draft="contributed">แคแ แแแแฃแแ แกแแแฎแ แแแแก แขแแ แแขแแ แแแแ</territory> + <territory type="TG">แขแแแ</territory> + <territory type="TH">แขแแแแแแแ</territory> + <territory type="TJ">แขแแฏแแแแแ</territory> + <territory type="TL">แแฆแแแกแแแแแแ แขแแแแ แ</territory> + <territory type="TM">แแฃแ แฅแแแแแแ</territory> + <territory type="TN">แขแฃแแแกแ</territory> + <territory type="TO">แขแแแแ</territory> + <territory type="TR">แแฃแ แฅแแแ</territory> + <territory type="TT">แขแ แแแแแแแ แแ แขแแแแแ</territory> + <territory type="TV">แขแฃแแแแฃ</territory> + <territory type="TW">แขแแแแแแ</territory> + <territory type="TZ">แขแแแแแแแ</territory> + <territory type="UA">แฃแแ แแแแ</territory> + <territory type="UG">แฃแแแแแ</territory> + <territory type="UM">แจแแแ แแแแฃแแ แจแขแแขแแแแก แแชแแ แ แแแจแแ แแแฃแแ แแฃแแซแฃแแแแ</territory> + <territory type="US">แแแแ แแแแก แจแแแ แแแแฃแแ แจแขแแขแแแ</territory> + <territory type="UY">แฃแ แฃแแแแ</territory> + <territory type="UZ">แฃแแแแแแแ</territory> + <territory type="VA">แแแขแแแแแ</territory> + <territory type="VC">แกแแแข-แแแแกแแแขแ แแ แแ แแแแแแแแแ</territory> + <territory type="VE">แแแแแกแฃแแแ</territory> + <territory type="VN">แแแแขแแแแ</territory> + <territory type="VU">แแแแฃแแขแฃ</territory> + <territory type="WF" draft="contributed">แแแแแกแ แแ แคแฃแขแฃแแ</territory> + <territory type="WS">แกแแแแ</territory> + <territory type="YE">แแแแแแ</territory> + <territory type="ZA">แกแแแฎแ แแ แแคแ แแแ</territory> + <territory type="ZM">แแแแแแ</territory> + <territory type="ZW">แแแแแแแแ</territory> + <territory type="ZZ">แฃแชแแแแ แแ แแ แแกแฌแแ แ แ แแแแแแ</territory> + </territories> + <keys> + <key type="calendar">แแแแแแแแ แ</key> + <key type="collation">แแแแแแแ แแแ</key> + <key type="currency">แแแแฃแขแ</key> + </keys> + <types> + <type type="big5han" key="collation">แขแ แแแแชแแฃแแ แฉแแแฃแ แ</type> + <type type="buddhist" key="calendar">แแฃแแแกแขแฃแ แ แแแแแแแแ แ</type> + <type type="chinese" key="calendar">แฉแแแฃแ แ แแแแแแแแ แ</type> + <type type="direct" key="collation">แแแ แแแแแ แ แแแแแแแ แแแ</type> + <type type="gb2312han" key="collation">แแแแแ แขแแแแแฃแแ แฉแแแฃแ แ</type> + <type type="gregorian" key="calendar">แแ แแแแ แแแแฃแแ แแแแแแแแ แ</type> + <type type="hebrew" key="calendar">แแแ แแฃแแ แแแแแแแแ แ</type> + <type type="indian" key="calendar" draft="contributed">แแแแฃแ แ แแ แแแแฃแแ แแแแแแแแ แ</type> + <type type="islamic" key="calendar">แแกแแแแฃแ แ แแแแแแแแ แ</type> + <type type="islamic-civil" key="calendar">แแกแแแแฃแ แ แกแแแแฅแแแแฅแ แแแแแแแแ แ</type> + <type type="japanese" key="calendar">แแแแแแฃแ แ แแแแแแแแ แ</type> + <type type="roc" key="calendar" draft="contributed">แฉแแแแแแก แ แแกแแฃแแแแแแก แแแแแแแแ แ</type> + <type type="traditional" key="collation">แขแ แแแแชแแฃแแ</type> + </types> + <measurementSystemNames> + <measurementSystemName type="US" draft="contributed">US</measurementSystemName> + <measurementSystemName type="metric" draft="contributed">Metric</measurementSystemName> + </measurementSystemNames> + </localeDisplayNames> + <characters> + <exemplarCharacters>[แ โด แ โด แ โด แ โด แ โด แ โด
แ โด แฑ โดก แ โด แ โด แ โด แ โด แ โด แ โด แฒ โดข แ โด แ โด แ โด แ โด แก โด แข โด แณ โดฃ แฃ โด แค โด แฅ โด แฆ โด แง โด แจ โด แฉ โด แช โด แซ โด แฌ โด แญ โด แฎ โด แด โดค แฏ โด แฐ โด แต โดฅ แถ-แบ]</exemplarCharacters> + </characters> + <delimiters> + <quotationStart draft="contributed">โ</quotationStart> + <quotationEnd draft="contributed">โ</quotationEnd> + <alternateQuotationStart draft="contributed">โ</alternateQuotationStart> + <alternateQuotationEnd draft="contributed">โ</alternateQuotationEnd> + </delimiters> + <dates> + <calendars> + <calendar type="gregorian"> + <months> + <monthContext type="format"> + <monthWidth type="abbreviated"> + <month type="1" draft="provisional">แแแ</month> + <month type="2" draft="provisional">แแแ</month> + <month type="3" draft="provisional">แแแ </month> + <month type="4" draft="provisional">แแแ </month> + <month type="5" draft="provisional">แแแ</month> + <month type="6" draft="provisional">แแแ</month> + <month type="7" draft="provisional">แแแ</month> + <month type="8" draft="provisional">แแแ</month> + <month type="9" draft="provisional">แกแแฅ</month> + <month type="10" draft="provisional">แแฅแข</month> + <month type="11" draft="provisional">แแแ</month> + <month type="12" draft="provisional">แแแ</month> + </monthWidth> + <monthWidth type="wide"> + <month type="1" draft="provisional">แแแแแแ แ</month> + <month type="2" draft="provisional">แแแแแ แแแแ</month> + <month type="3" draft="provisional">แแแ แขแ</month> + <month type="4" draft="provisional">แแแ แแแ</month> + <month type="5" draft="provisional">แแแแกแ</month> + <month type="6" draft="provisional">แแแแแกแ</month> + <month type="7" draft="provisional">แแแแแกแ</month> + <month type="8" draft="provisional">แแแแแกแขแ</month> + <month type="9" draft="provisional">แกแแฅแขแแแแแ แ</month> + <month type="10" draft="provisional">แแฅแขแแแแแ แ</month> + <month type="11" draft="provisional">แแแแแแแ แ</month> + <month type="12" draft="provisional">แแแแแแแแ แ</month> + </monthWidth> + </monthContext> + <monthContext type="stand-alone"> + <monthWidth type="narrow"> + <month type="1" draft="provisional">แ</month> + <month type="2" draft="provisional">แ</month> + <month type="3" draft="provisional">แ</month> + <month type="4" draft="provisional">แ</month> + <month type="5" draft="provisional">แ</month> + <month type="6" draft="provisional">แ</month> + <month type="7" draft="provisional">แ</month> + <month type="8" draft="provisional">แ</month> + <month type="9" draft="provisional">แก</month> + <month type="10" draft="provisional">แ</month> + <month type="11" draft="provisional">แ</month> + <month type="12" draft="provisional">แ</month> + </monthWidth> + </monthContext> + </months> + <days> + <dayContext type="format"> + <dayWidth type="abbreviated"> + <day type="sun" draft="provisional">แแแ</day> + <day type="mon" draft="provisional">แแ แจ</day> + <day type="tue" draft="provisional">แกแแ</day> + <day type="wed" draft="provisional">แแแฎ</day> + <day type="thu" draft="provisional">แฎแฃแ</day> + <day type="fri" draft="provisional">แแแ </day> + <day type="sat" draft="provisional">แจแแ</day> + </dayWidth> + <dayWidth type="wide"> + <day type="sun" draft="provisional">แแแแ แ</day> + <day type="mon" draft="provisional">แแ แจแแแแแ</day> + <day type="tue" draft="provisional">แกแแแจแแแแแ</day> + <day type="wed" draft="provisional">แแแฎแจแแแแแ</day> + <day type="thu" draft="provisional">แฎแฃแแจแแแแแ</day> + <day type="fri" draft="provisional">แแแ แแกแแแแ</day> + <day type="sat" draft="provisional">แจแแแแแ</day> + </dayWidth> + </dayContext> + <dayContext type="stand-alone"> + <dayWidth type="narrow"> + <day type="sun" draft="provisional">แ</day> + <day type="mon" draft="provisional">แ</day> + <day type="tue" draft="provisional">แก</day> + <day type="wed" draft="provisional">แ</day> + <day type="thu" draft="provisional">แฎ</day> + <day type="fri" draft="provisional">แ</day> + <day type="sat" draft="provisional">แจ</day> + </dayWidth> + </dayContext> + </days> + <quarters> + <quarterContext type="format"> + <quarterWidth type="abbreviated"> + <quarter type="1">I แแ.</quarter> + <quarter type="2">II แแ.</quarter> + <quarter type="3">III แแ.</quarter> + <quarter type="4">IV แแ.</quarter> + </quarterWidth> + <quarterWidth type="wide"> + <quarter type="1">1-แแ แแแแ แขแแแ</quarter> + <quarter type="2">แแ-2 แแแแ แขแแแ</quarter> + <quarter type="3">แแ-3 แแแแ แขแแแ</quarter> + <quarter type="4">แแ-4 แแแแ แขแแแ</quarter> + </quarterWidth> + </quarterContext> + <quarterContext type="stand-alone"> + <quarterWidth type="wide"> + <quarter type="1" draft="provisional">I แแแแ แขแแแ</quarter> + <quarter type="2" draft="provisional">II แแแแ แขแแแ</quarter> + <quarter type="3" draft="provisional">III แแแแ แขแแแ</quarter> + <quarter type="4" draft="provisional">IV แแแแ แขแแแ</quarter> + </quarterWidth> + </quarterContext> + </quarters> + <am draft="provisional">แแแแแก</am> + <pm draft="provisional">แกแแฆแแแแก</pm> + <eras> + <eraNames> + <era type="0" draft="provisional">แฉแแแแก แฌแแแแแฆแ แแชแฎแแแแแ</era> + <era type="1" draft="provisional">แฉแแแแ แฌแแแแแฆแ แแชแฎแแแ</era> + </eraNames> + <eraAbbr> + <era type="0" draft="provisional">แฉแแแแก แฌแแแแแฆแ แแชแฎแแแแแ</era> + <era type="1" draft="provisional">แฉแแแแ แฌแแแแแฆแ แแชแฎแแแ</era> + </eraAbbr> + <eraNarrow> + <era type="0" draft="provisional">แฉแแแแก แฌแแแแแฆแ แแชแฎแแแแแ</era> + <era type="1" draft="provisional">แฉแแแแ แฌแแแแแฆแ แแชแฎแแแ</era> + </eraNarrow> + </eras> + <dateFormats> + <dateFormatLength type="full"> + <dateFormat> + <pattern draft="unconfirmed">EEEE, y MMMM dd</pattern> + </dateFormat> + </dateFormatLength> + <dateFormatLength type="long"> + <dateFormat> + <pattern draft="unconfirmed">y MMMM d</pattern> + </dateFormat> + </dateFormatLength> + <dateFormatLength type="medium"> + <dateFormat> + <pattern draft="unconfirmed">y MMM d</pattern> + </dateFormat> + </dateFormatLength> + <dateFormatLength type="short"> + <dateFormat> + <pattern draft="unconfirmed">yy/MM/dd</pattern> + </dateFormat> + </dateFormatLength> + </dateFormats> + <timeFormats> + <timeFormatLength type="full"> + <timeFormat> + <pattern draft="provisional">HH:mm:ss zzzz</pattern> + </timeFormat> + </timeFormatLength> + <timeFormatLength type="long"> + <timeFormat> + <pattern draft="provisional">HH:mm:ss z</pattern> + </timeFormat> + </timeFormatLength> + <timeFormatLength type="medium"> + <timeFormat> + <pattern draft="provisional">HH:mm:ss</pattern> + </timeFormat> + </timeFormatLength> + <timeFormatLength type="short"> + <timeFormat> + <pattern draft="provisional">HH:mm</pattern> + </timeFormat> + </timeFormatLength> + </timeFormats> + <dateTimeFormats> + <availableFormats> + <dateFormatItem id="HHmm" draft="unconfirmed">HH:mm</dateFormatItem> + <dateFormatItem id="HHmmss" draft="unconfirmed">HH:mm:ss</dateFormatItem> + <dateFormatItem id="MMMdd" draft="unconfirmed">dd MMM</dateFormatItem> + <dateFormatItem id="MMdd" draft="contributed">dd/MM</dateFormatItem> + <dateFormatItem id="hhmm" draft="unconfirmed">hh:mm a</dateFormatItem> + <dateFormatItem id="hhmmss" draft="unconfirmed">hh:mm:ss a</dateFormatItem> + <dateFormatItem id="yyMM" draft="unconfirmed">MM/yy</dateFormatItem> + <dateFormatItem id="yyMMMEEEd" draft="unconfirmed">EEE, d MMM, yy</dateFormatItem> + <dateFormatItem id="yyMMMd" draft="unconfirmed">d MMM, yy</dateFormatItem> + <dateFormatItem id="yyMMdd" draft="unconfirmed">dd/MM/yy</dateFormatItem> + <dateFormatItem id="yyQ" draft="unconfirmed">Q yy</dateFormatItem> + <dateFormatItem id="yyQQQQ" draft="unconfirmed">QQQQ yy</dateFormatItem> + </availableFormats> + </dateTimeFormats> + <fields> + <field type="era"> + <displayName draft="provisional">แฎแแแ</displayName> + </field> + <field type="year"> + <displayName draft="provisional">แฌแแแ</displayName> + </field> + <field type="month"> + <displayName draft="provisional">แแแ</displayName> + </field> + <field type="week"> + <displayName draft="provisional">แแแแ แ</displayName> + </field> + <field type="day"> + <displayName draft="provisional">แแฆแ</displayName> + <relative type="-3" draft="provisional">แกแแแ แแฆแแก แฌแแ</relative> + <relative type="-2" draft="provisional">แแฃแจแแแฌแแ</relative> + <relative type="-1" draft="provisional">แแฃแจแแ</relative> + <relative type="0" draft="provisional">แแฆแแก</relative> + <relative type="1" draft="provisional">แฎแแแ</relative> + <relative type="2" draft="provisional">แแแ</relative> + <relative type="3" draft="provisional">แกแแแ แแฆแแก แจแแแแแ</relative> + </field> + <field type="weekday"> + <displayName draft="provisional">แแแแ แแก แแฆแ</displayName> + </field> + <field type="dayperiod"> + <displayName draft="provisional">แแฆแแก แแแ แแแแ</displayName> + </field> + <field type="hour"> + <displayName draft="provisional">แกแแแแ</displayName> + </field> + <field type="minute"> + <displayName draft="provisional">แฌแฃแแ</displayName> + </field> + <field type="second"> + <displayName draft="provisional">แฌแแแ</displayName> + </field> + <field type="zone"> + <displayName draft="provisional">แแแแ</displayName> + </field> + </fields> + </calendar> + </calendars> + <timeZoneNames> + <hourFormat draft="contributed">+HH:mm;-HH:mm</hourFormat> + <gmtFormat draft="unconfirmed">GMT{0}</gmtFormat> + <regionFormat draft="contributed">{0}</regionFormat> + <fallbackFormat draft="contributed">{1} ({0})</fallbackFormat> + <zone type="Etc/Unknown"> + <exemplarCity draft="contributed">แฃแชแแแแ</exemplarCity> + </zone> + <zone type="America/Antigua"> + <exemplarCity draft="provisional">แแแ แแฃแแ</exemplarCity> + </zone> + <zone type="America/Anguilla"> + <exemplarCity draft="provisional">แแแแแแ</exemplarCity> + </zone> + <zone type="America/Curacao"> + <exemplarCity draft="provisional">แแแแแ แแแแแแก</exemplarCity> + </zone> + <zone type="Africa/Luanda"> + <exemplarCity draft="provisional">แแแแแแ</exemplarCity> + </zone> + <zone type="Antarctica/Rothera"> + <exemplarCity draft="contributed">แ แแแแ แ</exemplarCity> + </zone> + <zone type="Antarctica/Palmer"> + <exemplarCity draft="contributed">แแแแแแ แ</exemplarCity> + </zone> + <zone type="Antarctica/South_Pole"> + <exemplarCity draft="contributed">แกแแแฎแ แแแ แแแแฃแกแ</exemplarCity> + </zone> + <zone type="Antarctica/Syowa"> + <exemplarCity draft="contributed">แกแแแฃแ</exemplarCity> + </zone> + <zone type="Antarctica/Mawson"> + <exemplarCity draft="contributed">แแแฃแกแแแ</exemplarCity> + </zone> + <zone type="Antarctica/Davis"> + <exemplarCity draft="contributed">แแแแแกแ</exemplarCity> + </zone> + <zone type="Antarctica/Vostok"> + <exemplarCity draft="contributed">แแแกแขแแแ</exemplarCity> + </zone> + <zone type="Antarctica/Casey"> + <exemplarCity draft="contributed">แแแแกแ</exemplarCity> + </zone> + <zone type="Antarctica/DumontDUrville"> + <exemplarCity draft="contributed">แแแฃแแแ แ'แฃแ แแแแ</exemplarCity> + </zone> + <zone type="Antarctica/McMurdo"> + <exemplarCity draft="contributed">แแแแแฃแ แแ</exemplarCity> + </zone> + <zone type="America/Argentina/Rio_Gallegos"> + <exemplarCity draft="contributed">แ แแ แแแแแแแกแ</exemplarCity> + </zone> + <zone type="America/Mendoza"> + <exemplarCity draft="contributed">แแแแแแแ</exemplarCity> + </zone> + <zone type="America/Argentina/San_Juan"> + <exemplarCity draft="contributed">แกแแ แฎแฃแแแ</exemplarCity> + </zone> + <zone type="America/Argentina/Ushuaia"> + <exemplarCity draft="contributed">แฃแจแฃแแแ</exemplarCity> + </zone> + <zone type="America/Argentina/La_Rioja"> + <exemplarCity draft="contributed">แแ แ แแแฎแ</exemplarCity> + </zone> + <zone type="America/Argentina/San_Luis"> + <exemplarCity draft="contributed">แกแแ แแฃแแกแ</exemplarCity> + </zone> + <zone type="America/Catamarca"> + <exemplarCity draft="contributed">แแแขแแแแ แแ</exemplarCity> + </zone> + <zone type="America/Jujuy"> + <exemplarCity draft="contributed">แฏแฃแฏแฃแ</exemplarCity> + </zone> + <zone type="America/Argentina/Tucuman"> + <exemplarCity draft="contributed">แขแฃแแฃแแแแ</exemplarCity> + </zone> + <zone type="America/Cordoba"> + <exemplarCity draft="contributed">แแแ แแแแ</exemplarCity> + </zone> + <zone type="America/Buenos_Aires"> + <exemplarCity draft="contributed">แแฃแแแแก แแแ แแกแ</exemplarCity> + </zone> + <zone type="Australia/Perth"> + <exemplarCity draft="contributed">แแแ แแ</exemplarCity> + </zone> + <zone type="Australia/Eucla"> + <exemplarCity draft="contributed">แแฃแแแ</exemplarCity> + </zone> + <zone type="Australia/Darwin"> + <exemplarCity draft="contributed">แแแ แแแแ</exemplarCity> + </zone> + <zone type="Australia/Adelaide"> + <exemplarCity draft="contributed">แแแแแแแแ</exemplarCity> + </zone> + <zone type="Australia/Broken_Hill"> + <exemplarCity draft="contributed">แแ แแฃแแแ แฐแแแ</exemplarCity> + </zone> + <zone type="Australia/Currie"> + <exemplarCity draft="contributed">แฅแฃแ แ</exemplarCity> + </zone> + <zone type="Australia/Melbourne"> + <exemplarCity draft="contributed">แแแแแฃแ แแ</exemplarCity> + </zone> + <zone type="Australia/Hobart"> + <exemplarCity draft="contributed">แฐแแแแ แขแ</exemplarCity> + </zone> + <zone type="Australia/Lindeman"> + <exemplarCity draft="contributed">แแแแแแแแ</exemplarCity> + </zone> + <zone type="Australia/Sydney"> + <exemplarCity draft="contributed">แกแแแแแ</exemplarCity> + </zone> + <zone type="Australia/Brisbane"> + <exemplarCity draft="contributed">แแ แแกแแแแแ</exemplarCity> + </zone> + <zone type="Australia/Lord_Howe"> + <exemplarCity draft="contributed">แแแ แ แฐแแฃแ</exemplarCity> + </zone> + <zone type="America/Aruba"> + <exemplarCity draft="provisional">แแ แฃแแ</exemplarCity> + </zone> + <zone type="America/Barbados"> + <exemplarCity draft="provisional">แแแ แแแแแกแ</exemplarCity> + </zone> + <zone type="Africa/Ouagadougou"> + <exemplarCity draft="provisional">แแฃแ แแแแ แคแแกแ</exemplarCity> + </zone> + <zone type="Africa/Bujumbura"> + <exemplarCity draft="provisional">แแฃแ แฃแแแ</exemplarCity> + </zone> + <zone type="Africa/Porto-Novo"> + <exemplarCity draft="provisional">แแแแแแ</exemplarCity> + </zone> + <zone type="America/La_Paz"> + <exemplarCity draft="provisional">แแแแแแแ</exemplarCity> + </zone> + <zone type="America/Eirunepe"> + <exemplarCity draft="contributed">แแแ แฃแแแแ</exemplarCity> + </zone> + <zone type="America/Rio_Branco"> + <exemplarCity draft="contributed">แ แแ แแ แแแแ</exemplarCity> + </zone> + <zone type="America/Porto_Velho"> + <exemplarCity draft="contributed">แแแ แขแ แแแแฐแ</exemplarCity> + </zone> + <zone type="America/Boa_Vista"> + <exemplarCity draft="contributed">แแแ แแแกแขแ</exemplarCity> + </zone> + <zone type="America/Manaus"> + <exemplarCity draft="contributed">แแแแแฃแกแ</exemplarCity> + </zone> + <zone type="America/Cuiaba"> + <exemplarCity draft="contributed">แแฃแแแแ</exemplarCity> + </zone> + <zone type="America/Campo_Grande"> + <exemplarCity draft="contributed">แแแแแ แแ แแแแ</exemplarCity> + </zone> + <zone type="America/Belem"> + <exemplarCity draft="contributed">แแแแแแ</exemplarCity> + </zone> + <zone type="America/Araguaina"> + <exemplarCity draft="contributed">แแ แแแฃแแแแ</exemplarCity> + </zone> + <zone type="America/Sao_Paulo"> + <exemplarCity draft="contributed">แกแแ แแแฃแแ</exemplarCity> + </zone> + <zone type="America/Bahia"> + <exemplarCity draft="contributed">แแแแ</exemplarCity> + </zone> + <zone type="America/Fortaleza"> + <exemplarCity draft="contributed">แคแแ แขแแแแแ</exemplarCity> + </zone> + <zone type="America/Maceio"> + <exemplarCity draft="contributed">แแแกแแแ</exemplarCity> + </zone> + <zone type="America/Recife"> + <exemplarCity draft="contributed">แ แแชแแคแ</exemplarCity> + </zone> + <zone type="America/Noronha"> + <exemplarCity draft="contributed">แแแ แแแแ</exemplarCity> + </zone> + <zone type="America/Nassau"> + <exemplarCity draft="provisional">แแแฐแแแแก แแฃแแซแฃแแแแ</exemplarCity> + </zone> + <zone type="Africa/Gaborone"> + <exemplarCity draft="provisional">แแแขแกแแแแ</exemplarCity> + </zone> + <zone type="America/Belize"> + <exemplarCity draft="provisional">แแแแแแ</exemplarCity> + </zone> + <zone type="America/Dawson"> + <exemplarCity draft="contributed">แแแฃแกแแแ</exemplarCity> + </zone> + <zone type="America/Whitehorse"> + <exemplarCity draft="contributed">แฃแแแแฐแแ แกแ</exemplarCity> + </zone> + <zone type="America/Inuvik"> + <exemplarCity draft="contributed">แแแฃแแแแ</exemplarCity> + </zone> + <zone type="America/Vancouver"> + <exemplarCity draft="contributed">แแแแแฃแแแ แ</exemplarCity> + </zone> + <zone type="America/Dawson_Creek"> + <exemplarCity draft="contributed">แแแฃแกแแ แฅแ แแแ</exemplarCity> + </zone> + <zone type="America/Yellowknife"> + <exemplarCity draft="contributed">แแแแแฃแแแแคแ</exemplarCity> + </zone> + <zone type="America/Edmonton"> + <exemplarCity draft="contributed">แแแแแแขแแแ</exemplarCity> + </zone> + <zone type="America/Swift_Current"> + <exemplarCity draft="contributed">แกแแแคแข แแแ แแแขแ</exemplarCity> + </zone> + <zone type="America/Cambridge_Bay"> + <exemplarCity draft="contributed">แแแแแ แแฏ แแแ</exemplarCity> + </zone> + <zone type="America/Regina"> + <exemplarCity draft="contributed">แ แแฏแแแ</exemplarCity> + </zone> + <zone type="America/Winnipeg"> + <exemplarCity draft="contributed">แฃแแแแแแแ</exemplarCity> + </zone> + <zone type="America/Resolute"> + <exemplarCity draft="contributed">แ แแแแแฃแขแ</exemplarCity> + </zone> + <zone type="America/Rainy_River"> + <exemplarCity draft="contributed">แ แแแแ แ แแแแ แ</exemplarCity> + </zone> + <zone type="America/Rankin_Inlet"> + <exemplarCity draft="contributed">แ แแแแแ แแแแแขแ</exemplarCity> + </zone> + <zone type="America/Coral_Harbour"> + <exemplarCity draft="contributed">แฅแแ แแ แฐแแ แแแ แ</exemplarCity> + </zone> + <zone type="America/Thunder_Bay"> + <exemplarCity draft="contributed">แแแแแแ แแแ</exemplarCity> + </zone> + <zone type="America/Nipigon"> + <exemplarCity draft="contributed">แแแแแแแแ</exemplarCity> + </zone> + <zone type="America/Toronto"> + <exemplarCity draft="contributed">แขแแ แแแขแ</exemplarCity> + </zone> + <zone type="America/Montreal"> + <exemplarCity draft="contributed">แแแแ แแแแ</exemplarCity> + </zone> + <zone type="America/Iqaluit"> + <exemplarCity draft="contributed">แแฅแแแฃแแขแ</exemplarCity> + </zone> + <zone type="America/Pangnirtung"> + <exemplarCity draft="contributed">แแแแแแแ แขแฃแแแ</exemplarCity> + </zone> + <zone type="America/Moncton"> + <exemplarCity draft="contributed">แแแแฅแขแแแ</exemplarCity> + </zone> + <zone type="America/Halifax"> + <exemplarCity draft="contributed">แฐแแแแคแแฅแกแ</exemplarCity> + </zone> + <zone type="America/Goose_Bay"> + <exemplarCity draft="contributed">แแฃแ แแแ</exemplarCity> + </zone> + <zone type="America/Glace_Bay"> + <exemplarCity draft="contributed">แแแแแก แแแ</exemplarCity> + </zone> + <zone type="America/Blanc-Sablon"> + <exemplarCity draft="contributed">แแแแ-แกแแแแแแ</exemplarCity> + </zone> + <zone type="America/St_Johns"> + <exemplarCity draft="contributed">แกแแแข แฏแแแกแ</exemplarCity> + </zone> + <zone type="Africa/Kinshasa"> + <exemplarCity draft="contributed">แแแแจแแกแ</exemplarCity> + </zone> + <zone type="Africa/Lubumbashi"> + <exemplarCity draft="contributed">แแฃแแฃแแแแจแ</exemplarCity> + </zone> + <zone type="Africa/Bangui"> + <exemplarCity draft="provisional">แชแแแขแ แแแฃแ แ แแคแ แแแแก แ แแกแแฃแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Brazzaville"> + <exemplarCity draft="provisional">แแแแแ - แแ แแแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Abidjan"> + <exemplarCity draft="provisional">แกแแแแแก แซแแแแก แกแแแแแแ แ</exemplarCity> + </zone> + <zone type="Pacific/Easter"> + <exemplarCity draft="contributed">แแกแแแ แ</exemplarCity> + </zone> + <zone type="Africa/Douala"> + <exemplarCity draft="provisional">แแแแแ แฃแแ</exemplarCity> + </zone> + <zone type="Asia/Kashgar"> + <exemplarCity draft="contributed">แแแจแแแ แ</exemplarCity> + </zone> + <zone type="Asia/Urumqi"> + <exemplarCity draft="contributed">แฃแ แฃแแฅแ</exemplarCity> + </zone> + <zone type="Asia/Chongqing"> + <exemplarCity draft="contributed">แฉแแแแฅแแแแ</exemplarCity> + </zone> + <zone type="Asia/Harbin"> + <exemplarCity draft="contributed">แฐแแ แแแแ</exemplarCity> + </zone> + <zone type="America/Bogota"> + <exemplarCity draft="provisional">แแแแฃแแแแ</exemplarCity> + </zone> + <zone type="America/Costa_Rica"> + <exemplarCity draft="provisional">แแแกแขแ แ แแแ</exemplarCity> + </zone> + <zone type="America/Havana"> + <exemplarCity draft="provisional">แแฃแแ</exemplarCity> + </zone> + <zone type="Africa/Djibouti"> + <exemplarCity draft="provisional">แฏแแแฃแขแ</exemplarCity> + </zone> + <zone type="America/Dominica"> + <exemplarCity draft="provisional">แแแแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Algiers"> + <exemplarCity draft="provisional">แแแแแ แ</exemplarCity> + </zone> + <zone type="Pacific/Galapagos"> + <exemplarCity draft="contributed">แแแแแแแแแกแ</exemplarCity> + </zone> + <zone type="Africa/Cairo"> + <exemplarCity draft="provisional">แแแแแแขแ</exemplarCity> + </zone> + <zone type="Africa/El_Aaiun"> + <exemplarCity draft="provisional">แแแกแแแแแแ แกแแฐแแ แ</exemplarCity> + </zone> + <zone type="Africa/Asmera"> + <exemplarCity draft="provisional">แแ แแแ แแ</exemplarCity> + </zone> + <zone type="Atlantic/Canary"> + <exemplarCity draft="contributed">แแแแแ แ</exemplarCity> + </zone> + <zone type="Africa/Ceuta"> + <exemplarCity draft="contributed">แกแแฃแขแ</exemplarCity> + </zone> + <zone type="Africa/Addis_Ababa"> + <exemplarCity draft="provisional">แแแแแแแ</exemplarCity> + </zone> + <zone type="Pacific/Truk"> + <exemplarCity draft="contributed">แขแ แฃแแ</exemplarCity> + </zone> + <zone type="Pacific/Ponape"> + <exemplarCity draft="contributed">แแแแแแ</exemplarCity> + </zone> + <zone type="Pacific/Kosrae"> + <exemplarCity draft="contributed">แแแกแ แแ</exemplarCity> + </zone> + <zone type="Africa/Libreville"> + <exemplarCity draft="provisional">แแแแแแ</exemplarCity> + </zone> + <zone type="America/Grenada"> + <exemplarCity draft="provisional">แแ แแแแแ</exemplarCity> + </zone> + <zone type="America/Cayenne"> + <exemplarCity draft="provisional">แแฃแแแแ</exemplarCity> + </zone> + <zone type="Africa/Accra"> + <exemplarCity draft="provisional">แแแแ</exemplarCity> + </zone> + <zone type="America/Thule"> + <exemplarCity draft="contributed">แแฃแแ</exemplarCity> + </zone> + <zone type="America/Scoresbysund"> + <exemplarCity draft="contributed">แกแแแ แกแแแกแฃแแแ</exemplarCity> + </zone> + <zone type="America/Danmarkshavn"> + <exemplarCity draft="contributed">แแแแแแ แแจแแแแ</exemplarCity> + </zone> + <zone type="Africa/Banjul"> + <exemplarCity draft="provisional">แแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Conakry"> + <exemplarCity draft="provisional">แแแแแ</exemplarCity> + </zone> + <zone type="America/Guadeloupe"> + <exemplarCity draft="provisional">แแฃแแแแแฃแแ</exemplarCity> + </zone> + <zone type="Africa/Malabo"> + <exemplarCity draft="provisional">แแแแแขแแ แฃแแ แแแแแแ</exemplarCity> + </zone> + <zone type="America/Guatemala"> + <exemplarCity draft="provisional">แแฃแแขแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Bissau"> + <exemplarCity draft="provisional">แแแแแ-แแแกแแฃ</exemplarCity> + </zone> + <zone type="America/Guyana"> + <exemplarCity draft="provisional">แแฃแแแแ</exemplarCity> + </zone> + <zone type="Asia/Jakarta"> + <exemplarCity draft="contributed">แฏแแแแ แขแ</exemplarCity> + </zone> + <zone type="Asia/Pontianak"> + <exemplarCity draft="contributed">แแแแขแแแแแแ</exemplarCity> + </zone> + <zone type="Asia/Makassar"> + <exemplarCity draft="contributed">แแแแแกแแ แ</exemplarCity> + </zone> + <zone type="Asia/Jayapura"> + <exemplarCity draft="contributed">แฏแแแแแฃแ แ</exemplarCity> + </zone> + <zone type="America/Jamaica"> + <exemplarCity draft="provisional">แแแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Nairobi"> + <exemplarCity draft="provisional">แแแแแ</exemplarCity> + </zone> + <zone type="Pacific/Enderbury"> + <exemplarCity draft="contributed">แแแแแ แแฃแ แ</exemplarCity> + </zone> + <zone type="Pacific/Kiritimati"> + <exemplarCity draft="contributed">แแแ แแขแแแแขแ</exemplarCity> + </zone> + <zone type="Pacific/Tarawa"> + <exemplarCity draft="contributed">แขแแ แแฃแ</exemplarCity> + </zone> + <zone type="America/Cayman"> + <exemplarCity draft="provisional">แแแแแแแแก</exemplarCity> + </zone> + <zone type="Asia/Aqtau"> + <exemplarCity draft="contributed">แแฅแขแแฃ</exemplarCity> + </zone> + <zone type="Asia/Oral"> + <exemplarCity draft="contributed">แแ แแแ</exemplarCity> + </zone> + <zone type="Asia/Aqtobe"> + <exemplarCity draft="contributed">แแฅแขแแแ</exemplarCity> + </zone> + <zone type="Asia/Qyzylorda"> + <exemplarCity draft="contributed">แงแแแแแแ แแ</exemplarCity> + </zone> + <zone type="Asia/Almaty"> + <exemplarCity draft="contributed">แแแแแขแ</exemplarCity> + </zone> + <zone type="Africa/Monrovia"> + <exemplarCity draft="provisional">แแแแแ แแ</exemplarCity> + </zone> + <zone type="Africa/Maseru"> + <exemplarCity draft="provisional">แแแกแแแ</exemplarCity> + </zone> + <zone type="Africa/Tripoli"> + <exemplarCity draft="provisional">แแแแแ</exemplarCity> + </zone> + <zone type="Africa/Casablanca"> + <exemplarCity draft="provisional">แแแ แแแ</exemplarCity> + </zone> + <zone type="Pacific/Kwajalein"> + <exemplarCity draft="contributed">แแแแฏแแแแแแ</exemplarCity> + </zone> + <zone type="Pacific/Majuro"> + <exemplarCity draft="contributed">แแแฎแฃแ แ</exemplarCity> + </zone> + <zone type="Africa/Bamako"> + <exemplarCity draft="provisional">แแแแ</exemplarCity> + </zone> + <zone type="Asia/Hovd"> + <exemplarCity draft="contributed">แฐแแแแ</exemplarCity> + </zone> + <zone type="Asia/Ulaanbaatar"> + <exemplarCity draft="contributed">แฃแแแแแแขแแ แ</exemplarCity> + </zone> + <zone type="Asia/Choibalsan"> + <exemplarCity draft="contributed">แฉแแแแแแกแแแ</exemplarCity> + </zone> + <zone type="America/Martinique"> + <exemplarCity draft="provisional">แแแ แขแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Nouakchott"> + <exemplarCity draft="provisional">แแแแ แแขแแแแ</exemplarCity> + </zone> + <zone type="America/Montserrat"> + <exemplarCity draft="provisional">แแแแกแแ แแขแ</exemplarCity> + </zone> + <zone type="Africa/Blantyre"> + <exemplarCity draft="provisional">แแแแแแ</exemplarCity> + </zone> + <zone type="America/Tijuana"> + <exemplarCity draft="contributed">แขแแฎแฃแแแ</exemplarCity> + </zone> + <zone type="America/Hermosillo"> + <exemplarCity draft="contributed">แฐแแ แแแกแแ</exemplarCity> + </zone> + <zone type="America/Mazatlan"> + <exemplarCity draft="contributed">แแแแแขแแแแ</exemplarCity> + </zone> + <zone type="America/Chihuahua"> + <exemplarCity draft="contributed">แฉแแฐแฃแแฐแฃแ</exemplarCity> + </zone> + <zone type="America/Monterrey"> + <exemplarCity draft="contributed">แแแแขแแ แแ</exemplarCity> + </zone> + <zone type="America/Mexico_City"> + <exemplarCity draft="contributed">แแแฅแกแแแ แกแแแ</exemplarCity> + </zone> + <zone type="America/Merida"> + <exemplarCity draft="contributed">แแแ แแแ</exemplarCity> + </zone> + <zone type="America/Cancun"> + <exemplarCity draft="contributed">แแแแแฃแแ</exemplarCity> + </zone> + <zone type="Asia/Kuching"> + <exemplarCity draft="contributed">แแฃแฉแแแแ</exemplarCity> + </zone> + <zone type="Africa/Maputo"> + <exemplarCity draft="provisional">แแแแแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Windhoek"> + <exemplarCity draft="provisional">แแแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Niamey"> + <exemplarCity draft="provisional">แแแแแ แ</exemplarCity> + </zone> + <zone type="Africa/Lagos"> + <exemplarCity draft="provisional">แแแแแ แแ</exemplarCity> + </zone> + <zone type="America/Managua"> + <exemplarCity draft="provisional">แแแแแ แแแฃแ</exemplarCity> + </zone> + <zone type="Pacific/Chatham"> + <exemplarCity draft="contributed">แฉแแแแแ</exemplarCity> + </zone> + <zone type="America/Lima"> + <exemplarCity draft="provisional">แแแ แฃ</exemplarCity> + </zone> + <zone type="Pacific/Marquesas"> + <exemplarCity draft="contributed">แแแ แแแแแกแ</exemplarCity> + </zone> + <zone type="Pacific/Gambier"> + <exemplarCity draft="contributed">แแแแแแแ แ</exemplarCity> + </zone> + <zone type="America/Miquelon"> + <exemplarCity draft="provisional">แกแแแข แแแแ แ แแ แแแแแแแแ</exemplarCity> + </zone> + <zone type="Atlantic/Azores"> + <exemplarCity draft="contributed">แแแแ แแก</exemplarCity> + </zone> + <zone type="Atlantic/Madeira"> + <exemplarCity draft="contributed">แแแแแแ แ</exemplarCity> + </zone> + <zone type="America/Asuncion"> + <exemplarCity draft="provisional">แแแ แแแแแ</exemplarCity> + </zone> + <zone type="Europe/Kaliningrad"> + <exemplarCity draft="contributed">แแแแแแแแแ แแแ</exemplarCity> + </zone> + <zone type="Europe/Moscow"> + <exemplarCity draft="contributed">แแแกแแแแ</exemplarCity> + </zone> + <zone type="Europe/Volgograd"> + <exemplarCity draft="contributed">แแแแแแแ แแแ</exemplarCity> + </zone> + <zone type="Europe/Samara"> + <exemplarCity draft="contributed">แกแแแแ แ</exemplarCity> + </zone> + <zone type="Asia/Yekaterinburg"> + <exemplarCity draft="contributed">แแแแขแแ แแแแฃแ แแ</exemplarCity> + </zone> + <zone type="Asia/Omsk"> + <exemplarCity draft="contributed">แแแกแแ</exemplarCity> + </zone> + <zone type="Asia/Novosibirsk"> + <exemplarCity draft="contributed">แแแแแกแแแแ แกแแ</exemplarCity> + </zone> + <zone type="Asia/Krasnoyarsk"> + <exemplarCity draft="contributed">แแ แแกแแแแแ แกแแ</exemplarCity> + </zone> + <zone type="Asia/Irkutsk"> + <exemplarCity draft="contributed">แแ แแฃแขแกแแ</exemplarCity> + </zone> + <zone type="Asia/Yakutsk"> + <exemplarCity draft="contributed">แแแแฃแขแกแแ</exemplarCity> + </zone> + <zone type="Asia/Vladivostok"> + <exemplarCity draft="contributed">แแแแแแแแกแขแแแ</exemplarCity> + </zone> + <zone type="Asia/Sakhalin"> + <exemplarCity draft="contributed">แกแแฎแแแแแ</exemplarCity> + </zone> + <zone type="Asia/Magadan"> + <exemplarCity draft="contributed">แแแแแแแแ</exemplarCity> + </zone> + <zone type="Asia/Kamchatka"> + <exemplarCity draft="contributed">แแแแฉแแขแแ</exemplarCity> + </zone> + <zone type="Asia/Anadyr"> + <exemplarCity draft="contributed">แแแแแแ แ</exemplarCity> + </zone> + <zone type="Africa/Kigali"> + <exemplarCity draft="provisional">แ แฃแแแแ</exemplarCity> + </zone> + <zone type="Africa/Khartoum"> + <exemplarCity draft="provisional">แกแฃแแแแ</exemplarCity> + </zone> + <zone type="Africa/Freetown"> + <exemplarCity draft="provisional">แกแแแ แ แแแแแ</exemplarCity> + </zone> + <zone type="Africa/Dakar"> + <exemplarCity draft="provisional">แกแแแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Mogadishu"> + <exemplarCity draft="provisional">แกแแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Sao_Tome"> + <exemplarCity draft="provisional">แกแแ แขแแแ แแ แแ แแแกแแแ</exemplarCity> + </zone> + <zone type="America/El_Salvador"> + <exemplarCity draft="provisional">แแ แกแแแแแแแ แ</exemplarCity> + </zone> + <zone type="Africa/Mbabane"> + <exemplarCity draft="provisional">แกแแแแแแแแแ</exemplarCity> + </zone> + <zone type="America/Grand_Turk"> + <exemplarCity draft="provisional">แขแแ แแแก แแ แแแแแแก</exemplarCity> + </zone> + <zone type="Africa/Ndjamena"> + <exemplarCity draft="provisional">แฉแแแ</exemplarCity> + </zone> + <zone type="Africa/Lome"> + <exemplarCity draft="provisional">แขแแแ</exemplarCity> + </zone> + <zone type="Africa/Tunis"> + <exemplarCity draft="provisional">แขแฃแแแกแ</exemplarCity> + </zone> + <zone type="Africa/Dar_es_Salaam"> + <exemplarCity draft="provisional">แขแแแแแแแ</exemplarCity> + </zone> + <zone type="Europe/Uzhgorod"> + <exemplarCity draft="contributed">แฃแแแแ แแแ</exemplarCity> + </zone> + <zone type="Europe/Kiev"> + <exemplarCity draft="contributed">แแแแแ</exemplarCity> + </zone> + <zone type="Europe/Simferopol"> + <exemplarCity draft="contributed">แกแแแคแแ แแแแแ</exemplarCity> + </zone> + <zone type="Europe/Zaporozhye"> + <exemplarCity draft="contributed">แแแแแ แแแแ</exemplarCity> + </zone> + <zone type="Africa/Kampala"> + <exemplarCity draft="provisional">แฃแแแแแ</exemplarCity> + </zone> + <zone type="Pacific/Midway"> + <exemplarCity draft="contributed">แแแแฃแแ</exemplarCity> + </zone> + <zone type="Pacific/Johnston"> + <exemplarCity draft="contributed">แฏแแแกแขแแแ</exemplarCity> + </zone> + <zone type="Pacific/Wake"> + <exemplarCity draft="contributed">แฃแแแแ</exemplarCity> + </zone> + <zone type="America/Adak"> + <exemplarCity draft="contributed">แแแแแ</exemplarCity> + </zone> + <zone type="America/Nome"> + <exemplarCity draft="contributed">แแแแ</exemplarCity> + </zone> + <zone type="Pacific/Honolulu"> + <exemplarCity draft="contributed">แฐแแแแแฃแแฃ</exemplarCity> + </zone> + <zone type="America/Anchorage"> + <exemplarCity draft="contributed">แแแฅแแ แแฏแ</exemplarCity> + </zone> + <zone type="America/Yakutat"> + <exemplarCity draft="contributed">แแแแฃแขแแขแ</exemplarCity> + </zone> + <zone type="America/Juneau"> + <exemplarCity draft="contributed">แฏแฃแแ</exemplarCity> + </zone> + <zone type="America/Los_Angeles"> + <exemplarCity draft="contributed">แแแก แแแฏแแแแกแ</exemplarCity> + </zone> + <zone type="America/Boise"> + <exemplarCity draft="contributed">แแฃแแกแ</exemplarCity> + </zone> + <zone type="America/Phoenix"> + <exemplarCity draft="contributed">แคแแแแฅแกแ</exemplarCity> + </zone> + <zone type="America/Shiprock"> + <exemplarCity draft="contributed">แจแแแ แแแ</exemplarCity> + </zone> + <zone type="America/Denver"> + <exemplarCity draft="contributed">แแแแแแ แ</exemplarCity> + </zone> + <zone type="America/North_Dakota/New_Salem"> + <exemplarCity draft="contributed">แแแฃ แกแแแแแ, แฉแ แแแแแแแ แแแแแขแ</exemplarCity> + </zone> + <zone type="America/North_Dakota/Center"> + <exemplarCity draft="contributed">แชแแแขแ แ, แฉแ แแแแแแแ แแแแแขแ</exemplarCity> + </zone> + <zone type="America/Chicago"> + <exemplarCity draft="contributed">แฉแแแแแ</exemplarCity> + </zone> + <zone type="America/Menominee"> + <exemplarCity draft="contributed">แแแแแแแแ</exemplarCity> + </zone> + <zone type="America/Indiana/Vincennes"> + <exemplarCity draft="contributed">แแแแกแแแ, แแแแแแแ</exemplarCity> + </zone> + <zone type="America/Indiana/Petersburg"> + <exemplarCity draft="contributed">แแแขแแ แกแแฃแ แแ</exemplarCity> + </zone> + <zone type="America/Indiana/Tell_City"> + <exemplarCity draft="contributed">แแแ แกแแแ, แแแแแแแ</exemplarCity> + </zone> + <zone type="America/Indiana/Knox"> + <exemplarCity draft="contributed">แแแฅแกแ, แแแแแแแ</exemplarCity> + </zone> + <zone type="America/Indiana/Winamac"> + <exemplarCity draft="contributed">แฃแแแแแแแ, แแแแแแแ</exemplarCity> + </zone> + <zone type="America/Indiana/Marengo"> + <exemplarCity draft="contributed">แแแ แแแแ</exemplarCity> + </zone> + <zone type="America/Indianapolis"> + <exemplarCity draft="contributed">แแแแแแแแแแแแกแ</exemplarCity> + </zone> + <zone type="America/Louisville"> + <exemplarCity draft="contributed">แแฃแแกแแแแ</exemplarCity> + </zone> + <zone type="America/Indiana/Vevay"> + <exemplarCity draft="contributed">แแแแแ, แแแแแแแ</exemplarCity> + </zone> + <zone type="America/Kentucky/Monticello"> + <exemplarCity draft="contributed">แแแแขแแฉแแแ</exemplarCity> + </zone> + <zone type="America/Detroit"> + <exemplarCity draft="contributed">แแแขแ แแแขแ</exemplarCity> + </zone> + <zone type="America/New_York"> + <exemplarCity draft="contributed">แแแฃ แแแ แแ</exemplarCity> + </zone> + <zone type="America/Montevideo"> + <exemplarCity draft="provisional">แฃแ แฃแแแแ</exemplarCity> + </zone> + <zone type="Asia/Samarkand"> + <exemplarCity draft="contributed">แกแแแแ แงแแแแ</exemplarCity> + </zone> + <zone type="America/Caracas"> + <exemplarCity draft="provisional">แแแแแกแฃแแแ</exemplarCity> + </zone> + <zone type="Africa/Johannesburg"> + <exemplarCity draft="provisional">แกแแแฎแ แแแ แแคแ แแแ</exemplarCity> + </zone> + <zone type="Africa/Lusaka"> + <exemplarCity draft="provisional">แแแแแแ</exemplarCity> + </zone> + <zone type="Africa/Harare"> + <exemplarCity draft="provisional">แแแแแแแแ</exemplarCity> + </zone> + </timeZoneNames> + </dates> + <numbers> + <symbols> + <decimal draft="contributed">,</decimal> + <group draft="contributed">.</group> + <list draft="contributed">;</list> + <percentSign draft="contributed">%</percentSign> + <nativeZeroDigit draft="contributed">0</nativeZeroDigit> + <plusSign draft="contributed">+</plusSign> + <minusSign draft="contributed">-</minusSign> + <exponential draft="contributed">E</exponential> + <perMille draft="contributed">โฐ</perMille> + <infinity draft="contributed">โ</infinity> + <nan draft="contributed">NaN</nan> + </symbols> + <decimalFormats> + <decimalFormatLength> + <decimalFormat> + <pattern draft="provisional">#,##0.###</pattern> + </decimalFormat> + </decimalFormatLength> + </decimalFormats> + <percentFormats> + <percentFormatLength> + <percentFormat> + <pattern draft="provisional">#,##0%</pattern> + </percentFormat> + </percentFormatLength> + </percentFormats> + <currencyFormats> + <currencyFormatLength> + <currencyFormat> + <pattern draft="provisional">ยคย #,##0.00</pattern> + </currencyFormat> + </currencyFormatLength> + <unitPattern count="other" draft="contributed">{0} {1}</unitPattern> + </currencyFormats> + <currencies> + <currency type="ADP"> + <displayName draft="contributed">แแแแแ แฃแแ แแแกแแขแ</displayName> + </currency> + <currency type="AED"> + <displayName draft="contributed">แแแแ แแแแแแแฃแแ แแ แแแฃแแ แกแแแแแ แแแแแก แแแ แฐแแแ</displayName> + </currency> + <currency type="AFA"> + <displayName draft="contributed">แแแฆแแแ (1927-2002)</displayName> + </currency> + <currency type="AFN"> + <displayName draft="contributed">แแแฆแแแ</displayName> + </currency> + <currency type="ALL"> + <displayName draft="contributed">แแแแแแฃแ แ แแแแ</displayName> + </currency> + <currency type="AMD"> + <displayName draft="contributed">แกแแแฎแฃแ แ แแ แแแ</displayName> + </currency> + <currency type="ANG"> + <displayName draft="contributed">แแแแ แแแแแแแแแก แแแขแแแแแก แแฃแแแแแ</displayName> + </currency> + <currency type="AOA"> + <displayName draft="contributed">แแแแแแฃแ แ แแแแแแ</displayName> + </currency> + <currency type="AOK"> + <displayName draft="contributed">แแแแแแฃแ แ แแแแแแ (1977-1990)</displayName> + </currency> + <currency type="AON"> + <displayName draft="contributed">แแแแแแฃแ แ แแฎแแแ แแแแแแ (1990-2000)</displayName> + </currency> + <currency type="AOR"> + <displayName draft="contributed">แแแแแแฃแ แ แแแขแแแแแฃแแ แแแแแแ (1995-1999)</displayName> + </currency> + <currency type="ARA"> + <displayName draft="contributed">แแ แแแแขแแแฃแแ แแฃแกแขแ แแแ</displayName> + </currency> + <currency type="ARP"> + <displayName draft="contributed">แแ แแแแขแแแฃแแ แแแกแ (1983-1985)</displayName> + </currency> + <currency type="ARS"> + <displayName draft="contributed">แแ แแแแขแแแฃแแ แแแกแ</displayName> + </currency> + <currency type="ATS"> + <displayName draft="contributed">แแแกแขแ แแฃแแ แจแแแแแแ</displayName> + </currency> + <currency type="AUD"> + <displayName draft="contributed">แแแกแขแ แแแแฃแ แ แแแแแ แ</displayName> + </currency> + <currency type="AWG"> + <displayName draft="contributed">แแ แฃแแแแฃแแ แแฃแแแแแ</displayName> + </currency> + <currency type="AZM"> + <displayName draft="contributed">แแแแ แแแแฏแแแฃแแ แแแแแแ (1993-2006)</displayName> + </currency> + <currency type="AZN"> + <displayName draft="contributed">แแแแ แแแแฏแแแฃแแ แแแแแแ</displayName> + </currency> + <currency type="BAD"> + <displayName draft="contributed">แแแกแแแ-แฐแแ แชแแแแแแแแก แแแแแ แ</displayName> + </currency> + <currency type="BAM"> + <displayName draft="contributed">แแแกแแแ-แฐแแ แชแแแแแแแแก แแแแแแ แขแแ แแแแแ แแแ แแ</displayName> + </currency> + <currency type="BBD"> + <displayName draft="contributed">แแแ แแแแแกแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="BDT"> + <displayName draft="contributed">แแแแแแแแแจแฃแ แ แขแแแ</displayName> + </currency> + <currency type="BEC"> + <displayName draft="contributed">แแแแแแฃแ แ แคแ แแแแ (แแแแแ แขแแ แแแแแ)</displayName> + </currency> + <currency type="BEF"> + <displayName draft="contributed">แแแแแแฃแ แ แคแ แแแแ</displayName> + </currency> + <currency type="BEL"> + <displayName draft="contributed">แแแแแแฃแ แ แคแ แแแแ (แคแแแแแกแฃแ แ)</displayName> + </currency> + <currency type="BGL"> + <displayName draft="contributed">แแฃแแแแ แฃแแ แแงแแ แ แแแแ</displayName> + </currency> + <currency type="BGN"> + <displayName draft="contributed">แแฃแแแแ แฃแแ แแฎแแแ แแแแ</displayName> + </currency> + <currency type="BHD"> + <displayName draft="contributed">แแแฐแ แแแแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="BIF"> + <displayName draft="contributed">แแฃแ แฃแแแแฃแแ แคแ แแแแ</displayName> + </currency> + <currency type="BMD"> + <displayName draft="contributed">แแแ แแฃแแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="BND"> + <displayName draft="contributed">แแ แฃแแแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="BOB"> + <displayName draft="contributed">แแแแแแแแแ</displayName> + </currency> + <currency type="BOP"> + <displayName draft="contributed">แแแแแแแฃแ แ แแแกแ</displayName> + </currency> + <currency type="BRB"> + <displayName draft="contributed">แแ แแแแแแฃแ แ แแ แฃแแแแ แ แแแแ (1967-1986)</displayName> + </currency> + <currency type="BRC"> + <displayName draft="contributed">แแ แแแแแแฃแ แ แแ แฃแแแแ</displayName> + </currency> + <currency type="BRE"> + <displayName draft="contributed">แแ แแแแแแฃแ แ แแ แฃแแแแ แ (1990-1993)</displayName> + </currency> + <currency type="BRL"> + <displayName draft="contributed">แแ แแแแแแฃแ แ แ แแแแ</displayName> + </currency> + <currency type="BRN"> + <displayName draft="contributed">แแ แแแแแแฃแ แ แแ แฃแแแแ แแแแ</displayName> + </currency> + <currency type="BRR"> + <displayName draft="contributed">แแ แแแแแแฃแ แ แแ แฃแแแแ แ</displayName> + </currency> + <currency type="BSD"> + <displayName draft="contributed">แแแฐแแแฃแ แ แแแแแ แ</displayName> + </currency> + <currency type="BWP"> + <displayName draft="contributed">แแแขแกแแแแแฃแ แ แแฃแแ</displayName> + </currency> + <currency type="BYB"> + <displayName draft="contributed">แแฎแแแ แแแแแ แฃแกแแฃแแ แ แฃแแแ (1994-1999)</displayName> + </currency> + <currency type="BYR"> + <displayName draft="contributed">แแแแแ แฃแกแแฃแแ แ แฃแแแ</displayName> + </currency> + <currency type="CAD"> + <displayName draft="contributed">แแแแแแฃแ แ แแแแแ แ</displayName> + </currency> + <currency type="CHF"> + <displayName draft="contributed">แจแแแแชแแ แแฃแแ แคแ แแแแ</displayName> + </currency> + <currency type="CNY"> + <displayName draft="contributed">แฉแแแฃแ แ แฃแแแ</displayName> + </currency> + <currency type="CRC"> + <displayName draft="contributed">แแแกแขแ แ แแแฃแแ แแแแแแ</displayName> + </currency> + <currency type="CSD"> + <displayName draft="contributed">แซแแแแ แกแแ แแแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="CSK"> + <displayName draft="contributed">แฉแแฎแแกแแแแแแแแก แแงแแ แ แแ แแแ</displayName> + </currency> + <currency type="CUP"> + <displayName draft="contributed">แแฃแแฃแ แ แแแกแ</displayName> + </currency> + <currency type="CVE"> + <displayName draft="contributed">แแแแ แแแ แแแก แแกแแฃแแ</displayName> + </currency> + <currency type="CYP"> + <displayName draft="contributed">แแแแแ แแกแแก แแแ แแแแฅแ</displayName> + </currency> + <currency type="CZK"> + <displayName draft="contributed">แฉแแฎแฃแ แ แแ แแแ</displayName> + </currency> + <currency type="DDM"> + <displayName draft="contributed">แแฆแแแกแแแแแ แแแ แแแแฃแแ แแแ แแ</displayName> + </currency> + <currency type="DEM"> + <displayName draft="contributed">แแแ แแแแฃแแ แแแ แแ</displayName> + </currency> + <currency type="DJF"> + <displayName draft="contributed">แฏแแแฃแขแแก แคแ แแแแ</displayName> + </currency> + <currency type="DKK"> + <displayName draft="contributed">แแแแแฃแ แ แแ แแแ</displayName> + </currency> + <currency type="DOP"> + <displayName draft="contributed">แแแแแแแแฃแ แ แแแกแ</displayName> + </currency> + <currency type="DZD"> + <displayName draft="contributed">แแแแแ แแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="EEK"> + <displayName draft="contributed">แแกแขแแแฃแ แ แแ แฃแแ</displayName> + </currency> + <currency type="EGP"> + <displayName draft="contributed">แแแแแแขแฃแ แ แแแ แแแแฅแ</displayName> + </currency> + <currency type="ESP"> + <displayName draft="contributed">แแกแแแแฃแ แ แแแกแแขแ</displayName> + </currency> + <currency type="EUR"> + <displayName draft="contributed">แแแ แ</displayName> + </currency> + <currency type="FIM"> + <displayName draft="contributed">แคแแแฃแ แ แแแ แแ</displayName> + </currency> + <currency type="FJD"> + <displayName draft="contributed">แคแแฏแ แแแแแ แ</displayName> + </currency> + <currency type="FRF"> + <displayName draft="contributed">แคแ แแแแฃแแ แคแ แแแแ</displayName> + </currency> + <currency type="GBP"> + <displayName draft="contributed">แแแแแแกแฃแ แ แแแ แแแแฅแ แกแขแแ แแแแแ</displayName> + </currency> + <currency type="GEK"> + <displayName draft="contributed">แฅแแ แแฃแแ แแฃแแแแ แแแ แแ</displayName> + </currency> + <currency type="GEL"> + <displayName draft="contributed">แฅแแ แแฃแแ แแแ แ</displayName> + </currency> + <currency type="GRD"> + <displayName draft="contributed">แแแ แซแแฃแแ แแ แแฐแแ</displayName> + </currency> + <currency type="GWE"> + <displayName draft="contributed">แแแ แขแฃแแแแแฃแ แ แแแแแ แแกแแฃแแ</displayName> + </currency> + <currency type="HKD"> + <displayName draft="contributed">แฐแแแ แแแแแแก แแแแแ แ</displayName> + </currency> + <currency type="HNL"> + <displayName draft="contributed">แฐแแแแฃแ แแกแแก แแแแแแ แ</displayName> + </currency> + <currency type="HRD"> + <displayName draft="contributed">แฎแแ แแแขแแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="HRK"> + <displayName draft="contributed">แฎแแ แแแขแแฃแแ แแฃแแ</displayName> + </currency> + <currency type="HUF"> + <displayName draft="contributed">แฃแแแ แฃแแ แคแแ แแแขแ</displayName> + </currency> + <currency type="IDR"> + <displayName draft="contributed">แแแแแแแแแฃแ แ แ แฃแแแ</displayName> + </currency> + <currency type="IEP"> + <displayName draft="contributed">แแ แแแแแแฃแ แ แแแ แแแแฅแ</displayName> + </currency> + <currency type="INR"> + <displayName draft="contributed">แแแแฃแ แ แ แฃแแแ</displayName> + </currency> + <currency type="ISK"> + <displayName draft="contributed">แแกแแแแแแฃแ แ แแ แแแ</displayName> + </currency> + <currency type="ITL"> + <displayName draft="contributed">แแขแแแแฃแ แ แแแ แ</displayName> + </currency> + <currency type="JMD"> + <displayName draft="contributed">แแแแแแแฃแ แ แแแแแ แ</displayName> + </currency> + <currency type="JOD"> + <displayName draft="contributed">แแแ แแแแแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="JPY"> + <displayName draft="contributed">แแแแแแฃแ แ แแแแ</displayName> + </currency> + <currency type="KES"> + <displayName draft="contributed">แแแแแฃแ แ แจแแแแแแ</displayName> + </currency> + <currency type="KGS"> + <displayName draft="contributed">แงแแ แฆแแแฃแแ แกแแแ</displayName> + </currency> + <currency type="KPW"> + <displayName draft="contributed">แฉแ แแแแแแ แแแ แแฃแแ แแแแ</displayName> + </currency> + <currency type="KRW"> + <displayName draft="contributed">แกแแแฎแ แแ แแแ แแฃแแ แแแแ</displayName> + </currency> + <currency type="KWD"> + <displayName draft="contributed">แแฃแแแแขแฃแ แ แแแแแ แ</displayName> + </currency> + <currency type="KYD"> + <displayName draft="contributed">แแแแแแแแก แแฃแแซแฃแแแแแก แแแแแ แ</displayName> + </currency> + <currency type="KZT"> + <displayName draft="contributed">แงแแแแฎแฃแ แ แขแแแแ</displayName> + </currency> + <currency type="LKR"> + <displayName draft="contributed">แจแ แ แแแแแแก แ แฃแแแ</displayName> + </currency> + <currency type="LRD"> + <displayName draft="contributed">แแแแแ แแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="LTL"> + <displayName draft="contributed">แแแขแแฃแ แ แแแขแ</displayName> + </currency> + <currency type="LTT"> + <displayName draft="contributed">แแแขแแฃแ แ แขแแแแแ</displayName> + </currency> + <currency type="LUC"> + <displayName draft="contributed">แแฃแฅแกแแแแฃแ แแแก แแแแแแ แขแแ แแแแแ แคแ แแแแ</displayName> + </currency> + <currency type="LUF"> + <displayName draft="contributed">แแฃแฅแกแแแแฃแ แแแก แคแ แแแแ</displayName> + </currency> + <currency type="LUL"> + <displayName draft="contributed">แแฃแฅแกแแแแฃแ แแแก แคแแแแแกแฃแ แ แคแ แแแแ</displayName> + </currency> + <currency type="LVL"> + <displayName draft="contributed">แแแขแแแฃแ แ แแแขแ</displayName> + </currency> + <currency type="LVR"> + <displayName draft="contributed">แแแขแแแฃแ แ แ แฃแแแ</displayName> + </currency> + <currency type="LYD"> + <displayName draft="contributed">แแแแแฃแ แ แแแแแ แ</displayName> + </currency> + <currency type="MAD"> + <displayName draft="contributed">แแแ แแแแก แแแ แฐแแแ</displayName> + </currency> + <currency type="MAF"> + <displayName draft="contributed">แแแ แแแแก แคแ แแแแ</displayName> + </currency> + <currency type="MDL"> + <displayName draft="contributed">แแแแแแแฃแ แ แแแฃ</displayName> + </currency> + <currency type="MGA"> + <displayName draft="contributed">แแแแแแแกแแแ แแก แแ แแแ แ</displayName> + </currency> + <currency type="MGF"> + <displayName draft="contributed">แแแแแแแกแแแ แแก แคแ แแแแ</displayName> + </currency> + <currency type="MKD"> + <displayName draft="contributed">แแแแแแแแแฃแ แ แแแแแ แ</displayName> + </currency> + <currency type="MLF"> + <displayName draft="contributed">แแแแแก แคแ แแแแ</displayName> + </currency> + <currency type="MMK"> + <displayName draft="contributed">แแแแแแแ แแก แแแแขแ</displayName> + </currency> + <currency type="MNT"> + <displayName draft="contributed">แแแแฆแแแฃแ แ แขแฃแแ แแแ</displayName> + </currency> + <currency type="MTL"> + <displayName draft="contributed">แแแแขแแก แแแ แ</displayName> + </currency> + <currency type="MTP"> + <displayName draft="contributed">แแแแขแแก แแแ แแแแฅแ</displayName> + </currency> + <currency type="MUR"> + <displayName draft="contributed">แแแแ แแขแแแฃแแ แ แฃแแแ</displayName> + </currency> + <currency type="MVR"> + <displayName draft="contributed">แแแแแแแฃแ แ แ แฃแคแแ</displayName> + </currency> + <currency type="MWK"> + <displayName draft="contributed">แแแแแแแก แแแแแฉแ</displayName> + </currency> + <currency type="MXN"> + <displayName draft="contributed">แแแฅแกแแแฃแ แ แแแกแ</displayName> + </currency> + <currency type="MXP"> + <displayName draft="contributed">แแแฅแกแแแฃแ แ แแแ แชแฎแแแก แแแกแ (1861-1992)</displayName> + </currency> + <currency type="MYR"> + <displayName draft="contributed">แแแแแแแแฃแ แ แ แแแแแขแ</displayName> + </currency> + <currency type="MZE"> + <displayName draft="contributed">แแแแแแแแแฃแ แ แแกแแฃแแ</displayName> + </currency> + <currency type="MZM"> + <displayName draft="contributed">แซแแแแ แแแแแแแแแฃแ แ แแแขแแแแแ</displayName> + </currency> + <currency type="MZN"> + <displayName draft="contributed">แแแแแแแแแฃแ แ แแแขแแแแแ</displayName> + </currency> + <currency type="NAD"> + <displayName draft="contributed">แแแแแแแฃแ แ แแแแแ แ</displayName> + </currency> + <currency type="NGN"> + <displayName draft="contributed">แแแแแ แแฃแแ แแแแ แ</displayName> + </currency> + <currency type="NIC"> + <displayName draft="contributed">แแแแแ แแแฃแแก แแแ แแแแ</displayName> + </currency> + <currency type="NIO"> + <displayName draft="contributed">แแแแแ แแแฃแแก แแฅแ แแก แแแ แแแแ</displayName> + </currency> + <currency type="NLG"> + <displayName draft="contributed">แฐแแแแแแแฃแ แ แแฃแแแแแ</displayName> + </currency> + <currency type="NOK"> + <displayName draft="contributed">แแแ แแแแแฃแแ แแ แแแ</displayName> + </currency> + <currency type="NPR"> + <displayName draft="contributed">แแแแแแฃแ แ แ แฃแแแ</displayName> + </currency> + <currency type="NZD"> + <displayName draft="contributed">แแฎแแแ แแแแแแแแแก แแแแแ แ</displayName> + </currency> + <currency type="OMR"> + <displayName draft="contributed">แแแแแแก แ แแแแ</displayName> + </currency> + <currency type="PEI"> + <displayName draft="contributed">แแแ แฃแก แแแขแ</displayName> + </currency> + <currency type="PEN"> + <displayName draft="contributed">แแแ แฃแก แแฎแแแ แกแแแ</displayName> + </currency> + <currency type="PES"> + <displayName draft="contributed">แแแ แฃแก แกแแแ</displayName> + </currency> + <currency type="PHP"> + <displayName draft="contributed">แคแแแแแแแฃแ แ แแแกแ</displayName> + </currency> + <currency type="PKR"> + <displayName draft="contributed">แแแแแกแขแแแฃแ แ แ แฃแแแ</displayName> + </currency> + <currency type="PLN"> + <displayName draft="contributed">แแแแแแฃแ แ แแแแขแ</displayName> + </currency> + <currency type="PLZ"> + <displayName draft="contributed">แแแแแแฃแ แ แแแแขแ (1950-1995)</displayName> + </currency> + <currency type="PTE"> + <displayName draft="contributed">แแแ แขแฃแแแแแฃแ แ แแกแแฃแแ</displayName> + </currency> + <currency type="QAR"> + <displayName draft="contributed">แแแขแแ แแก แ แแแแ</displayName> + </currency> + <currency type="RHD"> + <displayName draft="contributed">แ แแแแแแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="ROL"> + <displayName draft="contributed">แซแแแแ แ แฃแแแแฃแแ แแแฃ</displayName> + </currency> + <currency type="RON"> + <displayName draft="contributed">แ แฃแแแแฃแแ แแแฃ</displayName> + </currency> + <currency type="RUB"> + <displayName draft="contributed">แ แฃแกแฃแแ แ แฃแแแ</displayName> + </currency> + <currency type="RUR"> + <displayName draft="contributed">แ แฃแกแฃแแ แ แฃแแแ (1991-1998)</displayName> + </currency> + <currency type="RWF"> + <displayName draft="contributed">แ แฃแแแแฃแแ แคแ แแแแ</displayName> + </currency> + <currency type="SCR"> + <displayName draft="contributed">แกแแแจแแแแก แ แฃแแแ</displayName> + </currency> + <currency type="SDD"> + <displayName draft="contributed">แกแฃแแแแแก แแแแแ แ</displayName> + </currency> + <currency type="SDP"> + <displayName draft="contributed">แกแฃแแแแแก แแแ แแแแฅแ</displayName> + </currency> + <currency type="SEK"> + <displayName draft="contributed">แจแแแแฃแ แ แแ แแแ</displayName> + </currency> + <currency type="SGD"> + <displayName draft="contributed">แกแแแแแแฃแ แแก แแแแแ แ</displayName> + </currency> + <currency type="SLL"> + <displayName draft="contributed">แกแแแ แ แแแแแแก แแแแแ</displayName> + </currency> + <currency type="SRD"> + <displayName draft="contributed">แกแฃแ แแแแแแก แแแแแ แ</displayName> + </currency> + <currency type="SRG"> + <displayName draft="contributed">แกแฃแ แแแแแแก แแฃแแแแแ</displayName> + </currency> + <currency type="SUR"> + <displayName draft="contributed">แกแแแญแแแ แ แฃแแแ</displayName> + </currency> + <currency type="SYP"> + <displayName draft="contributed">แกแแ แแฃแแ แแแ แแแแฅแ</displayName> + </currency> + <currency type="TJR"> + <displayName draft="contributed">แขแแฏแแแฃแ แ แ แฃแแแ</displayName> + </currency> + <currency type="TJS"> + <displayName draft="contributed">แขแแฏแแแฃแ แ แกแแแแแ</displayName> + </currency> + <currency type="TMM"> + <displayName draft="contributed">แแฃแ แฅแแแแฃแแ แแแแแแ</displayName> + </currency> + <currency type="TND"> + <displayName draft="contributed">แขแฃแแแกแแฃแ แ แแแแแ แ</displayName> + </currency> + <currency type="TRL"> + <displayName draft="contributed">แแฃแ แฅแฃแแ แแแ แ</displayName> + </currency> + <currency type="TRY"> + <displayName draft="contributed">แแฎแแแ แแฃแ แฅแฃแแ แแแ แ</displayName> + </currency> + <currency type="TTD"> + <displayName draft="contributed">แขแ แแแแแแ แแ แขแแแแแแก แแแแแ แ</displayName> + </currency> + <currency type="TWD"> + <displayName draft="contributed">แขแแแแแแฃแ แ แแฎแแแ แแแแแ แ</displayName> + </currency> + <currency type="TZS"> + <displayName draft="contributed">แขแแแแแแแฃแ แ แจแแแแแแ</displayName> + </currency> + <currency type="UAH"> + <displayName draft="contributed">แฃแแ แแแแฃแแ แแ แแแแ</displayName> + </currency> + <currency type="UAK"> + <displayName draft="contributed">แฃแแ แแแแฃแแ แแแ แแแแแแแชแ</displayName> + </currency> + <currency type="UGS"> + <displayName draft="contributed">แฃแแแแแฃแ แ แจแแแแแแ (1966-1987)</displayName> + </currency> + <currency type="UGX"> + <displayName draft="contributed">แฃแแแแแฃแ แ แจแแแแแแ</displayName> + </currency> + <currency type="USD"> + <displayName draft="contributed">แแจแจ แแแแแ แ</displayName> + </currency> + <currency type="USN"> + <displayName draft="contributed">แแจแจ แแแแแ แ (แจแแแแแแ แแฆแ)</displayName> + </currency> + <currency type="USS"> + <displayName draft="contributed">แแจแจ แแแแแ แ (แแแแแ แแฆแ)</displayName> + </currency> + <currency type="UYP"> + <displayName draft="contributed">แฃแ แฃแแแแแก แแแกแ (1975-1993)</displayName> + </currency> + <currency type="UYU"> + <displayName draft="contributed">แฃแ แฃแแแแแก แแแกแ แฃแ แฃแแแแแ</displayName> + </currency> + <currency type="UZS"> + <displayName draft="contributed">แฃแแแแแฃแ แ แกแฃแแ</displayName> + </currency> + <currency type="VEB"> + <displayName draft="contributed">แแแแแกแฃแแแแก แแแแแแแ แ</displayName> + </currency> + <currency type="VND"> + <displayName draft="contributed">แแแแขแแแแฃแ แ แแแแแ</displayName> + </currency> + <currency type="VUV"> + <displayName draft="contributed">แแแแแขแฃแก แแแขแฃ</displayName> + </currency> + <currency type="WST"> + <displayName draft="contributed">แแแกแแแแแ แกแแแแแก แขแแแ</displayName> + </currency> + <currency type="XAG"> + <displayName draft="contributed">แแแ แชแฎแแ</displayName> + </currency> + <currency type="XBA"> + <displayName draft="contributed">แแแ แแแฃแแ แแแแแแแแแขแฃแ แ แแ แแแฃแแ</displayName> + </currency> + <currency type="XBB"> + <displayName draft="contributed">แแแ แแแฃแแ แคแฃแแแแ แแ แแแฃแแ</displayName> + </currency> + <currency type="XCD"> + <displayName draft="contributed">แแฆแแแกแแแแแ แแแ แแแแฃแแ แแแแแ แ</displayName> + </currency> + <currency type="XEU"> + <displayName draft="contributed">แแแ แแแฃแแ แกแแแแแฃแขแ แแ แแแฃแแ</displayName> + </currency> + <currency type="XFO"> + <displayName draft="contributed">แคแ แแแแฃแแ แแฅแ แแก แคแ แแแแ</displayName> + </currency> + <currency type="XXX"> + <displayName draft="contributed">แฃแชแแแแ แแ แแ แแกแฌแแ แ แแแแฃแขแ</displayName> + </currency> + <currency type="YDD"> + <displayName draft="contributed">แแแแแแแก แแแแแ แ</displayName> + </currency> + <currency type="YER"> + <displayName draft="contributed">แแแแแแแก แ แแแแ</displayName> + </currency> + <currency type="YUD"> + <displayName draft="contributed">แแฃแแแกแแแแแฃแ แ แแงแแ แ แแแแแ แ</displayName> + </currency> + <currency type="YUM"> + <displayName draft="contributed">แแฃแแแกแแแแแฃแ แ แแฎแแแ แแแแแ แ</displayName> + </currency> + <currency type="YUN"> + <displayName draft="contributed">แแฃแแแกแแแแแฃแ แ แแแแแแ แขแแ แแแแแ แแแแแ แ</displayName> + </currency> + <currency type="ZMK"> + <displayName draft="contributed">แแแแแแฃแ แ แแแแแฉแ</displayName> + </currency> + <currency type="ZRN"> + <displayName draft="contributed">แแแแ แแก แแฎแแแ แแแแ แ</displayName> + </currency> + <currency type="ZRZ"> + <displayName draft="contributed">แแแแ แแก แแแแ แ</displayName> + </currency> + <currency type="ZWD"> + <displayName draft="contributed">แแแแแแแแแก แแแแแ แ</displayName> + </currency> + </currencies> + </numbers> + <units> + <unit type="day"> + <unitPattern count="other" draft="contributed">{0} แแฆแ</unitPattern> + </unit> + <unit type="hour"> + <unitPattern count="other" draft="contributed">{0} แกแแแแ</unitPattern> + </unit> + <unit type="minute"> + <unitPattern count="other" draft="contributed">{0} แฌแฃแแ</unitPattern> + </unit> + <unit type="month"> + <unitPattern count="other" draft="contributed">{0} แแแ</unitPattern> + </unit> + <unit type="second"> + <unitPattern count="other" draft="contributed">{0} แฌแแแ</unitPattern> + </unit> + <unit type="week"> + <unitPattern count="other" draft="contributed">{0} แแแแ แ</unitPattern> + </unit> + <unit type="year"> + <unitPattern count="other" draft="contributed">{0} แฌแแแ</unitPattern> + </unit> + </units> + <posix> + <messages> + <yesstr draft="contributed">แแแแฎ</yesstr> + <nostr draft="contributed">แแ แ</nostr> + </messages> + </posix> +</ldml> diff --git a/tools/locale-builder/lcids.xml b/tools/locale-builder/lcids.xml index c57f7e6c6ad..eddbe6ffb48 100755 --- a/tools/locale-builder/lcids.xml +++ b/tools/locale-builder/lcids.xml @@ -18,6 +18,7 @@ <lcid name="ja" id="0x0011" parent="0x007F" specific="0x0411" iso2="ja" iso3="jpn" win="JPN" icu_name="Japanese" />
<lcid name="en-PH" id="0x3409" parent="0x0009" specific="0x3409" iso2="en" iso3="eng" win="ENP" icu_name="English (Philippines)" />
<lcid name="nl" id="0x0013" parent="0x007F" specific="0x0413" iso2="nl" iso3="nld" win="NLD" icu_name="Dutch" />
+ <lcid name="ka" id="0x0037" parent="0x007F" specific="0x0437" iso2="ka" iso3="kat" win="KAT" icu_name="Georgian" />
<lcid name="ko" id="0x0012" parent="0x007F" specific="0x0412" iso2="ko" iso3="kor" win="KOR" icu_name="Korean" />
<lcid name="ar-SA" id="0x0401" parent="0x0001" specific="0x0401" iso2="ar" iso3="ara" win="ARA" icu_name="Arabic (Saudi Arabia)" />
<lcid name="bg-BG" id="0x0402" parent="0x0002" specific="0x0402" iso2="bg" iso3="bul" win="BGR" icu_name="Bulgarian (Bulgaria)" />
@@ -36,6 +37,7 @@ <lcid name="be" id="0x0023" parent="0x007F" specific="0x0423" iso2="be" iso3="bel" win="BEL" icu_name="Belarusian" />
<lcid name="id" id="0x0021" parent="0x007F" specific="0x0421" iso2="id" iso3="ind" win="IND" icu_name="Indonesian" />
<lcid name="et" id="0x0025" parent="0x007F" specific="0x0425" iso2="et" iso3="est" win="ETI" icu_name="Estonian" />
+ <lcid name="ka-GE" id="0x0437" parent="0x0037" specific="0x0437" iso2="ka" iso3="kat" win="KAT" icu_name="Georgian (Georgia)" />
<lcid name="ko-KR" id="0x0412" parent="0x0012" specific="0x0412" iso2="ko" iso3="kor" win="KOR" icu_name="Korean (South Korea)" />
<lcid name="nl-NL" id="0x0413" parent="0x0013" specific="0x0413" iso2="nl" iso3="nld" win="NLD" icu_name="Dutch (Netherlands)" />
<lcid name="no" id="0x0014" parent="0x007F" specific="0x0414" iso2="no" iso3="nor" win="NOR" icu_name="Norwegian" />
diff --git a/tools/locale-builder/locales/ka_GE.xml b/tools/locale-builder/locales/ka_GE.xml new file mode 100644 index 00000000000..e2009e99209 --- /dev/null +++ b/tools/locale-builder/locales/ka_GE.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE ldml SYSTEM "../../common/dtd/ldml.dtd"> +<ldml> + <identity> + <version number="$Revision: 1.37 $"/> + <generation date="$Date: 2009/05/05 23:06:37 $"/> + <language type="ka"/> + <territory type="GE"/> + </identity> +</ldml> diff --git a/tools/locale-builder/supp/ka_GE.xml b/tools/locale-builder/supp/ka_GE.xml new file mode 100644 index 00000000000..01c15f76e51 --- /dev/null +++ b/tools/locale-builder/supp/ka_GE.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<ldml> + <dates> + <calendars> + <calendar type="gregorian"> + <dateFormats> + <dateFormatLength type="short"> + <dateFormat> + <pattern>dd.MM.yyyy</pattern> + </dateFormat> + </dateFormatLength> + <dateFormatLength type="long"> + <dateFormat> + <pattern>yyyy 'แฌแแแก' dd MM, dddd</pattern> + </dateFormat> + </dateFormatLength> + </dateFormats> + <timeFormats> + <timeFormatLength type="short"> + <timeFormat> + <pattern>H:mm</pattern> + </timeFormat> + </timeFormatLength > + <timeFormatLength type="long"> + <timeFormat> + <pattern>H:mm:ss</pattern> + </timeFormat> + </timeFormatLength > + </timeFormats> + </calendar> + </calendars> + </dates> +</ldml> |