/*	[Signature("(LTST<TValue;>.Node;Ljava/lang/String;TValue;I)LTST<TValue;>.Node;")]*/

        private TST.Node put(TST.Node node, string text, object obj, int num)
        {
            int num2 = (int)java.lang.String.instancehelper_charAt(text, num);

            if (node == null)
            {
                node = new TST.Node(this, null);
                TST.Node.access_102(node, (char)num2);
            }
            if (num2 < (int)TST.Node.access_100(node))
            {
                TST.Node.access_202(node, this.put(TST.Node.access_200(node), text, obj, num));
            }
            else if (num2 > (int)TST.Node.access_100(node))
            {
                TST.Node.access_302(node, this.put(TST.Node.access_300(node), text, obj, num));
            }
            else if (num < java.lang.String.instancehelper_length(text) - 1)
            {
                TST.Node.access_402(node, this.put(TST.Node.access_400(node), text, obj, num + 1));
            }
            else
            {
                TST.Node.access_002(node, obj);
            }
            return(node);
        }
        public virtual string longestPrefixOf(string str)
        {
            if (str == null || java.lang.String.instancehelper_length(str) == 0)
            {
                return(null);
            }
            int endIndex = 0;

            TST.Node node = this.root;
            int      num  = 0;

            while (node != null && num < java.lang.String.instancehelper_length(str))
            {
                int num2 = (int)java.lang.String.instancehelper_charAt(str, num);
                if (num2 < (int)TST.Node.access_100(node))
                {
                    node = TST.Node.access_200(node);
                }
                else if (num2 > (int)TST.Node.access_100(node))
                {
                    node = TST.Node.access_300(node);
                }
                else
                {
                    num++;
                    if (TST.Node.access_000(node) != null)
                    {
                        endIndex = num;
                    }
                    node = TST.Node.access_400(node);
                }
            }
            return(java.lang.String.instancehelper_substring(str, 0, endIndex));
        }
        /*	[Signature("(LTST<TValue;>.Node;Ljava/lang/String;ILjava/lang/String;LQueue<Ljava/lang/String;>;)V")]*/

        private void collect(TST.Node node, string text, int num, string text2, Queue queue)
        {
            if (node == null)
            {
                return;
            }
            int num2 = (int)java.lang.String.instancehelper_charAt(text2, num);

            if (num2 == 46 || num2 < (int)TST.Node.access_100(node))
            {
                this.collect(TST.Node.access_200(node), text, num, text2, queue);
            }
            if (num2 == 46 || num2 == (int)TST.Node.access_100(node))
            {
                if (num == java.lang.String.instancehelper_length(text2) - 1 && TST.Node.access_000(node) != null)
                {
                    queue.enqueue(new StringBuilder().append(text).append(TST.Node.access_100(node)).toString());
                }
                if (num < java.lang.String.instancehelper_length(text2) - 1)
                {
                    this.collect(TST.Node.access_400(node), new StringBuilder().append(text).append(TST.Node.access_100(node)).toString(), num + 1, text2, queue);
                }
            }
            if (num2 == 46 || num2 > (int)TST.Node.access_100(node))
            {
                this.collect(TST.Node.access_300(node), text, num, text2, queue);
            }
        }
        /*	[Signature("(LTST<TValue;>.Node;Ljava/lang/String;I)LTST<TValue;>.Node;")]*/

        private TST.Node get(TST.Node node, string text, int num)
        {
            if (text == null)
            {
                throw new NullPointerException();
            }
            if (java.lang.String.instancehelper_length(text) == 0)
            {
                string arg_20_0 = "key must have length >= 1";

                throw new ArgumentException(arg_20_0);
            }
            if (node == null)
            {
                return(null);
            }
            int num2 = (int)java.lang.String.instancehelper_charAt(text, num);

            if (num2 < (int)TST.Node.access_100(node))
            {
                return(this.get(TST.Node.access_200(node), text, num));
            }
            if (num2 > (int)TST.Node.access_100(node))
            {
                return(this.get(TST.Node.access_300(node), text, num));
            }
            if (num < java.lang.String.instancehelper_length(text) - 1)
            {
                return(this.get(TST.Node.access_400(node), text, num + 1));
            }
            return(node);
        }
        /*	[Signature("(Ljava/lang/String;TValue;)V")]*/

        public virtual void put(string str, object obj)
        {
            if (!this.contains(str))
            {
                this.N++;
            }
            this.root = this.put(this.root, str, obj, 0);
        }
        /*	[Signature("(LTST<TValue;>.Node;Ljava/lang/String;LQueue<Ljava/lang/String;>;)V")]*/

        private void collect(TST.Node node, string text, Queue queue)
        {
            if (node == null)
            {
                return;
            }
            this.collect(TST.Node.access_200(node), text, queue);
            if (TST.Node.access_000(node) != null)
            {
                queue.enqueue(new StringBuilder().append(text).append(TST.Node.access_100(node)).toString());
            }
            this.collect(TST.Node.access_400(node), new StringBuilder().append(text).append(TST.Node.access_100(node)).toString(), queue);
            this.collect(TST.Node.access_300(node), text, queue);
        }
        /*	[Signature("(Ljava/lang/String;)TValue;")]*/

        public virtual object get(string str)
        {
            if (str == null)
            {
                throw new NullPointerException();
            }
            if (java.lang.String.instancehelper_length(str) == 0)
            {
                string arg_20_0 = "key must have length >= 1";

                throw new ArgumentException(arg_20_0);
            }
            TST.Node node = this.get(this.root, str, 0);
            if (node == null)
            {
                return(null);
            }
            return(TST.Node.access_000(node));
        }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static TST.Node access_302(TST.Node node, TST.Node result)
 {
     node.right = result;
     return(result);
 }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static TST.Node access_202(TST.Node node, TST.Node result)
 {
     node.left = result;
     return(result);
 }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static char access_102(TST.Node node, char result)
 {
     node.c = result;
     return(result);
 }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static TST.Node access_400(TST.Node node)
 {
     return(node.mid);
 }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static TST.Node access_300(TST.Node node)
 {
     return(node.right);
 }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static TST.Node access_200(TST.Node node)
 {
     return(node.left);
 }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static object access_000(TST.Node node)
 {
     return(node.val);
 }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static TST.Node access_402(TST.Node node, TST.Node result)
 {
     node.mid = result;
     return(result);
 }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static object access_002(TST.Node node, object result)
 {
     node.val = result;
     return(result);
 }
 //[LineNumberTable(33), Modifiers(Modifiers.Static | Modifiers.Synthetic)]
 internal static char access_100(TST.Node node)
 {
     return(node.c);
 }