#  Licensed to the Apache Software Foundation (ASF) under one or more
#  contributor license agreements.  See the NOTICE file distributed with
#  this work for additional information regarding copyright ownership.
#  The ASF licenses this file to You under the Apache License, Version 2.0
#  (the "License"); you may not use this file except in compliance with
#  the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

# messages for EN locale
luni.00=Connection has not been established yet
luni.01=Could not make SSL Tunneling. Got response: {0} ({1})
luni.02=Hostname <{0}> was not verified
luni.03=The enum constant {0}.{1} is missing
luni.04=this Map
luni.05=Attempt to insert {0} element into collection with element type {1}
luni.06=The string argument is null
luni.07=The stream is corrupted
luni.08=Invalid Unicode sequence: expected format \\uxxxx
luni.09=Invalid Unicode sequence: illegal character
luni.0A=Index: {0}, Size: {1}
luni.0B=Array index out of range: {0}
luni.0C=Socket is closed
luni.0D=SOCKS connection failed\: {0}
luni.0E=Unable to connect to SOCKS server\: {0}
luni.0F=Invalid SOCKS client.
luni.10=Malformed reply from SOCKS server
luni.11=buffer is null
luni.12=Offset out of bounds \: {0}
luni.13=Arguments out of bounds
luni.14=Failure to connect to SOCKS server.
luni.15=Unable to connect to identd to verify user.
luni.16=Failure - user ids do not match.
luni.17=Success
luni.18=Length out of bounds \: {0}
luni.19=the methods named {0} must have the same return type
luni.1A=Host is unresolved\: {0}
luni.1B=url and proxy can not be null
luni.1C=Unable to change directories
luni.1D=Unable to connect to server\: {0}
luni.1E=Could not establish data connection
luni.1F=Unable to retrieve file\: {0}
luni.20=Unable to log into server\: {0}
luni.21=Unable to configure data port
luni.22=Unable to store file
luni.23=Unable to set transfer type
luni.24=Stream is closed
luni.25=Content-Length underflow
luni.26=Content-Length exceeded
luni.27=Cannot access request header fields after connection is set
luni.28=This protocol does not support input
luni.29=Does not support output
luni.2A=can't open OutputStream after reading from an inputStream
luni.2B=This method does not support writing\: {0}
luni.2C=Cannot set method after connection is made
luni.2D=Received HTTP_PROXY_AUTH (407) code while not using proxy
luni.2E=Received authentication challenge is null
luni.2F=Too many redirects
luni.30=Invalid proxy port\: {0}
luni.31=Proxy port out of range
luni.32=Cannot find \!/
luni.33=Inputstream of the JarURLConnection has been closed
luni.34=Jar entry not specified
luni.35=Start index ({0}) is greater than end index ({1})
luni.36=Array index out of range\: {0}
luni.37=Negative index specified
luni.38=Source size {0} does not fit into destination
luni.39=Format specifier '{0}'
luni.3A=Can't find resource for bundle {0}, key {1}
luni.3B=DST offset\: {0}
luni.3C=era\: {0}
luni.3D=month\: {0}
luni.3E=time\: {0}
luni.3F=day of month\: {0}
luni.40=day of week in month\: {0}
luni.41=Timer was cancelled
luni.42=Illegal delay to start the TimerTask
luni.43=TimerTask is scheduled already
luni.44=TimerTask is cancelled
luni.45=Conversion is '{0}'
luni.46=The flags are {0}
luni.47=Invalid UUID string
luni.48=day of week\: {0}
luni.49=SocketAddress {0} not supported
luni.4A=Count out of range
luni.4B={0} incompatible with {1}
luni.4C=Enums may not be cloned
luni.4D=Argument must not be null
luni.4E={0} is not an enum type
luni.4F={0} is not a constant in the enum type {1}
luni.50={0} is not an interface
luni.51={0} is not visible from class loader
luni.52={0} appears more than once
luni.53=non-public interfaces must be in the same package
luni.54=not a proxy instance
luni.55=String index out of range\: {0}
