#  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
nio.00=Socket is closed
nio.01=Socket is not connected
nio.02=Socket output is shutdown
nio.03=Socket input is shutdown
nio.04=Size mismatch
nio.05=Negative index specified
nio.06=InputStreamReader is closed.
nio.07=Writer is closed.
nio.08=Cannot use the direct byte buffer after it has been explicitly freed.
nio.09=Unknown file channel type: {0}
nio.0A=Lock position and size must be non-negative.
nio.0B=New position must be non-negative.
nio.0C=Offset out of bounds \: {0}
nio.0D=Length out of bounds \: {0}
nio.0E=Zero or negative buffer size
nio.0F=Attempted to set a negative SoLinger
nio.10=Invalid negative timeout
