summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuilhem Lavaux <guilhem@kaffe.org>2006-06-06 20:30:07 +0000
committerGuilhem Lavaux <guilhem@kaffe.org>2006-06-06 20:30:07 +0000
commit56c5b96a2d3754736d13eebb73270fb8f925301d (patch)
tree8f13d21d9dadf9810d11284977ed98a0a5c41868
parent68d82e8b935385c52f40123538e6e5b0dad7dbc9 (diff)
downloadclasspath-56c5b96a2d3754736d13eebb73270fb8f925301d.tar.gz
2006-06-06 Guilhem Lavaux <guilhem@kaffe.org>
* Merged HEAD as of 2006-05-08.
-rw-r--r--.classpath2
-rw-r--r--.externalToolBuilders/CreateLocaleData.launch14
-rw-r--r--.settings/org.eclipse.core.resources.prefs3
-rw-r--r--ChangeLog6302
-rw-r--r--ChangeLog.native4
-rw-r--r--INSTALL2
-rw-r--r--NEWS53
-rw-r--r--configure.ac64
-rw-r--r--doc/Makefile.am4
-rw-r--r--doc/hacking.texinfo6
-rw-r--r--doc/vmintegration.texinfo248
-rw-r--r--doc/www.gnu.org/include/layout.wml1
-rw-r--r--doc/www.gnu.org/stories.wml6
-rw-r--r--examples/Makefile.am9
-rw-r--r--examples/gnu/classpath/examples/swing/Demo.java66
-rw-r--r--examples/gnu/classpath/examples/swing/DocumentFilterDemo.java289
-rw-r--r--examples/gnu/classpath/examples/swing/MetalThemeEditor.java585
-rw-r--r--examples/gnu/classpath/examples/swing/NavigationFilterDemo.java206
-rw-r--r--examples/gnu/classpath/examples/swing/TableDemo.java28
-rw-r--r--examples/gnu/classpath/examples/swing/TextAreaDemo.java6
-rw-r--r--examples/gnu/classpath/examples/swing/TextFieldDemo.java566
-rw-r--r--examples/gnu/classpath/examples/swing/TreeDemo.java79
-rw-r--r--gnu/CORBA/CDR/EncapsulationStream.java1
-rw-r--r--gnu/CORBA/GIOP/MessageHeader.java33
-rw-r--r--gnu/CORBA/IorDelegate.java15
-rw-r--r--gnu/CORBA/NamingService/NameParser.java5
-rw-r--r--gnu/CORBA/OrbRestricted.java55
-rw-r--r--gnu/CORBA/SocketRepository.java3
-rw-r--r--gnu/CORBA/gnuRequest.java25
-rw-r--r--gnu/classpath/NotImplementedException.java61
-rw-r--r--gnu/classpath/SystemProperties.java7
-rw-r--r--gnu/classpath/debug/Simple1LineFormatter.java17
-rw-r--r--gnu/classpath/jdwp/util/Value.java4
-rw-r--r--gnu/java/awt/font/FontDelegate.java313
-rw-r--r--gnu/java/awt/font/FontFactory.java90
-rw-r--r--gnu/java/awt/font/GNUGlyphVector.java596
-rw-r--r--gnu/java/awt/font/opentype/CharGlyphMap.java1027
-rw-r--r--gnu/java/awt/font/opentype/GlyphNamer.java1133
-rw-r--r--gnu/java/awt/font/opentype/MacResourceFork.java235
-rw-r--r--gnu/java/awt/font/opentype/NameDecoder.java686
-rw-r--r--gnu/java/awt/font/opentype/OpenTypeFont.java825
-rw-r--r--gnu/java/awt/font/opentype/OpenTypeFontFactory.java140
-rw-r--r--gnu/java/awt/font/opentype/Scaler.java192
-rw-r--r--gnu/java/awt/font/opentype/truetype/Fixed.java161
-rw-r--r--gnu/java/awt/font/opentype/truetype/GlyphLoader.java437
-rw-r--r--gnu/java/awt/font/opentype/truetype/GlyphLocator.java187
-rw-r--r--gnu/java/awt/font/opentype/truetype/GlyphMeasurer.java228
-rw-r--r--gnu/java/awt/font/opentype/truetype/TrueTypeScaler.java372
-rw-r--r--gnu/java/awt/font/opentype/truetype/VirtualMachine.java1809
-rw-r--r--gnu/java/awt/font/opentype/truetype/Zone.java243
-rw-r--r--gnu/java/awt/font/opentype/truetype/ZonePathIterator.java391
-rw-r--r--gnu/java/awt/java2d/AbstractGraphics2D.java1927
-rw-r--r--gnu/java/awt/java2d/AlphaCompositeContext.java316
-rw-r--r--gnu/java/awt/java2d/CubicSegment.java128
-rw-r--r--gnu/java/awt/java2d/LineSegment.java103
-rw-r--r--gnu/java/awt/java2d/PolyEdge.java123
-rw-r--r--gnu/java/awt/java2d/PolyEdgeComparator.java70
-rw-r--r--gnu/java/awt/java2d/QuadSegment.java213
-rw-r--r--gnu/java/awt/java2d/RasterGraphics.java101
-rw-r--r--gnu/java/awt/java2d/Segment.java131
-rw-r--r--gnu/java/awt/peer/GLightweightPeer.java27
-rw-r--r--gnu/java/awt/peer/gtk/GdkFontPeer.java4
-rw-r--r--gnu/java/awt/peer/gtk/GdkGraphics.java45
-rw-r--r--gnu/java/awt/peer/gtk/GdkGraphics2D.java5
-rw-r--r--gnu/java/awt/peer/gtk/GdkPixbufDecoder.java44
-rw-r--r--gnu/java/awt/peer/gtk/GtkCanvasPeer.java4
-rw-r--r--gnu/java/awt/peer/gtk/GtkClipboard.java11
-rw-r--r--gnu/java/awt/peer/gtk/GtkComponentPeer.java50
-rw-r--r--gnu/java/awt/peer/gtk/GtkCursor.java72
-rw-r--r--gnu/java/awt/peer/gtk/GtkFontPeer.java225
-rw-r--r--gnu/java/awt/peer/gtk/GtkFramePeer.java37
-rw-r--r--gnu/java/awt/peer/gtk/GtkImage.java134
-rw-r--r--gnu/java/awt/peer/gtk/GtkPanelPeer.java11
-rw-r--r--gnu/java/awt/peer/gtk/GtkToolkit.java5
-rw-r--r--gnu/java/awt/peer/gtk/GtkWindowPeer.java120
-rw-r--r--gnu/java/awt/peer/swing/SwingComponentPeer.java3
-rw-r--r--gnu/java/awt/peer/swing/SwingContainerPeer.java33
-rw-r--r--gnu/java/lang/InstrumentationImpl.java243
-rw-r--r--gnu/java/lang/reflect/ClassSignatureParser.java92
-rw-r--r--gnu/java/lang/reflect/FieldSignatureParser.java103
-rw-r--r--gnu/java/lang/reflect/GenericSignatureParser.java622
-rw-r--r--gnu/java/lang/reflect/MethodSignatureParser.java167
-rw-r--r--gnu/java/lang/reflect/TypeImpl.java63
-rw-r--r--gnu/java/locale/.cvsignore1
-rw-r--r--gnu/java/locale/LocaleHelper.java53
-rw-r--r--gnu/java/net/DefaultContentHandlerFactory.java94
-rw-r--r--gnu/java/net/IndexListParser.java159
-rw-r--r--gnu/java/net/local/LocalServerSocket.java172
-rw-r--r--gnu/java/net/local/LocalSocket.java312
-rw-r--r--gnu/java/net/local/LocalSocketAddress.java100
-rw-r--r--gnu/java/net/local/LocalSocketImpl.java322
-rw-r--r--gnu/java/net/protocol/ftp/FTPConnection.java3
-rw-r--r--gnu/java/net/protocol/http/HTTPURLConnection.java4
-rw-r--r--gnu/java/nio/ChannelReader.java206
-rw-r--r--gnu/java/nio/ChannelWriter.java190
-rw-r--r--gnu/java/rmi/activation/ActivationSystemTransient.java49
-rw-r--r--gnu/java/rmi/activation/BidiTable.java68
-rw-r--r--gnu/java/rmi/activation/DefaultActivationGroup.java6
-rw-r--r--gnu/java/rmi/activation/DefaultActivationSystem.java75
-rw-r--r--gnu/java/rmi/dgc/LeaseRenewingTask.java14
-rw-r--r--gnu/java/rmi/server/ActivatableRef.java175
-rw-r--r--gnu/java/rmi/server/ActivatableServerRef.java83
-rw-r--r--gnu/java/rmi/server/CombinedClassLoader.java2
-rw-r--r--gnu/java/rmi/server/UnicastConnectionManager.java16
-rw-r--r--gnu/java/rmi/server/UnicastRef.java31
-rw-r--r--gnu/java/rmi/server/UnicastServer.java13
-rw-r--r--gnu/java/rmi/server/UnicastServerRef.java20
-rw-r--r--gnu/java/security/Engine.java12
-rw-r--r--gnu/java/security/Properties.java6
-rw-r--r--gnu/java/security/Registry.java3
-rw-r--r--gnu/java/security/hash/Haval.java2
-rw-r--r--gnu/java/security/hash/MD2.java2
-rw-r--r--gnu/java/security/hash/MD4.java2
-rw-r--r--gnu/java/security/hash/MD5.java2
-rw-r--r--gnu/java/security/hash/RipeMD128.java2
-rw-r--r--gnu/java/security/hash/RipeMD160.java2
-rw-r--r--gnu/java/security/hash/Sha160.java2
-rw-r--r--gnu/java/security/hash/Sha256.java2
-rw-r--r--gnu/java/security/hash/Sha384.java2
-rw-r--r--gnu/java/security/hash/Sha512.java2
-rw-r--r--gnu/java/security/hash/Tiger.java2
-rw-r--r--gnu/java/security/hash/Whirlpool.java583
-rw-r--r--gnu/java/security/jce/hash/HavalSpi.java2
-rw-r--r--gnu/java/security/jce/hash/MD2Spi.java2
-rw-r--r--gnu/java/security/jce/hash/MD4Spi.java2
-rw-r--r--gnu/java/security/jce/hash/MD5Spi.java2
-rw-r--r--gnu/java/security/jce/hash/MessageDigestAdapter.java2
-rw-r--r--gnu/java/security/jce/hash/RipeMD128Spi.java2
-rw-r--r--gnu/java/security/jce/hash/RipeMD160Spi.java2
-rw-r--r--gnu/java/security/jce/hash/Sha160Spi.java2
-rw-r--r--gnu/java/security/jce/hash/Sha256Spi.java2
-rw-r--r--gnu/java/security/jce/hash/Sha384Spi.java2
-rw-r--r--gnu/java/security/jce/hash/Sha512Spi.java2
-rw-r--r--gnu/java/security/jce/hash/TigerSpi.java2
-rw-r--r--gnu/java/security/jce/hash/WhirlpoolSpi.java2
-rw-r--r--gnu/java/security/jce/prng/SecureRandomAdapter.java8
-rw-r--r--gnu/java/security/jce/sig/DSSKeyPairGeneratorSpi.java2
-rw-r--r--gnu/java/security/jce/sig/DSSRawSignatureSpi.java2
-rw-r--r--gnu/java/security/jce/sig/KeyPairGeneratorAdapter.java2
-rw-r--r--gnu/java/security/jce/sig/RSAKeyFactory.java4
-rw-r--r--gnu/java/security/jce/sig/RSAPSSRawSignatureSpi.java2
-rw-r--r--gnu/java/security/jce/sig/SignatureAdapter.java2
-rw-r--r--gnu/java/security/key/IKeyPairCodec.java2
-rw-r--r--gnu/java/security/key/IKeyPairGenerator.java2
-rw-r--r--gnu/java/security/key/KeyPairGeneratorFactory.java13
-rw-r--r--gnu/java/security/key/dss/DSSKey.java21
-rw-r--r--gnu/java/security/key/dss/DSSKeyPairPKCS8Codec.java16
-rw-r--r--gnu/java/security/key/dss/DSSKeyPairRawCodec.java2
-rw-r--r--gnu/java/security/key/dss/DSSPrivateKey.java22
-rw-r--r--gnu/java/security/key/dss/DSSPublicKey.java20
-rw-r--r--gnu/java/security/key/dss/FIPS186.java2
-rw-r--r--gnu/java/security/key/rsa/GnuRSAKey.java23
-rw-r--r--gnu/java/security/key/rsa/GnuRSAPrivateKey.java27
-rw-r--r--gnu/java/security/key/rsa/GnuRSAPublicKey.java19
-rw-r--r--gnu/java/security/key/rsa/RSAKeyPairGenerator.java14
-rw-r--r--gnu/java/security/key/rsa/RSAKeyPairPKCS8Codec.java13
-rw-r--r--gnu/java/security/key/rsa/RSAKeyPairX509Codec.java3
-rw-r--r--gnu/java/security/pkcs/PKCS7Data.java69
-rw-r--r--gnu/java/security/pkcs/PKCS7SignedData.java231
-rw-r--r--gnu/java/security/pkcs/SignerInfo.java207
-rw-r--r--gnu/java/security/prng/MDGenerator.java14
-rw-r--r--gnu/java/security/provider/DSAParameterGenerator.java128
-rw-r--r--gnu/java/security/provider/Gnu.java1
-rw-r--r--gnu/java/security/sig/ISignature.java2
-rw-r--r--gnu/java/security/sig/ISignatureCodec.java2
-rw-r--r--gnu/java/security/sig/dss/DSSSignature.java2
-rw-r--r--gnu/java/security/sig/dss/DSSSignatureRawCodec.java2
-rw-r--r--gnu/java/security/sig/rsa/EMSA_PKCS1_V1_5.java2
-rw-r--r--gnu/java/security/sig/rsa/EMSA_PSS.java2
-rw-r--r--gnu/java/security/sig/rsa/RSAPKCS1V1_5Signature.java2
-rw-r--r--gnu/java/security/sig/rsa/RSAPSSSignature.java2
-rw-r--r--gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java2
-rw-r--r--gnu/java/security/util/Util.java2
-rw-r--r--gnu/java/security/x509/X500DistinguishedName.java14
-rw-r--r--gnu/java/text/StringFormatBuffer.java6
-rw-r--r--gnu/java/util/jar/JarUtils.java447
-rw-r--r--gnu/java/util/prefs/NodeWriter.java2
-rw-r--r--gnu/javax/crypto/assembly/Assembly.java1
-rw-r--r--gnu/javax/crypto/assembly/Cascade.java2
-rw-r--r--gnu/javax/crypto/assembly/CascadeStage.java2
-rw-r--r--gnu/javax/crypto/assembly/CascadeTransformer.java2
-rw-r--r--gnu/javax/crypto/assembly/Direction.java2
-rw-r--r--gnu/javax/crypto/assembly/LoopbackTransformer.java2
-rw-r--r--gnu/javax/crypto/assembly/ModeStage.java2
-rw-r--r--gnu/javax/crypto/assembly/Operation.java2
-rw-r--r--gnu/javax/crypto/assembly/PaddingTransformer.java2
-rw-r--r--gnu/javax/crypto/assembly/Stage.java1
-rw-r--r--gnu/javax/crypto/assembly/Transformer.java1
-rw-r--r--gnu/javax/crypto/cipher/Anubis.java2
-rw-r--r--gnu/javax/crypto/cipher/Blowfish.java2
-rw-r--r--gnu/javax/crypto/cipher/Cast5.java2
-rw-r--r--gnu/javax/crypto/cipher/Khazad.java2
-rw-r--r--gnu/javax/crypto/cipher/Rijndael.java2
-rw-r--r--gnu/javax/crypto/cipher/Serpent.java2
-rw-r--r--gnu/javax/crypto/cipher/Square.java6
-rw-r--r--gnu/javax/crypto/cipher/Twofish.java2
-rw-r--r--gnu/javax/crypto/jce/cipher/AESSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/ARCFourSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/AnubisSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/BlowfishSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/CipherAdapter.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/DESSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/KhazadSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/NullCipherSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/PBES2.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/RijndaelSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/SerpentSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/SquareSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/TripleDESSpi.java4
-rw-r--r--gnu/javax/crypto/jce/cipher/TwofishSpi.java4
-rw-r--r--gnu/javax/crypto/jce/keyring/GnuKeyring.java572
-rw-r--r--gnu/javax/crypto/jce/mac/HMacMD2Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacMD4Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacMD5Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacRipeMD128Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacRipeMD160Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacSHA160Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacSHA256Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacSHA384Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacSHA512Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacTigerSpi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/HMacWhirlpoolSpi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/MacAdapter.java4
-rw-r--r--gnu/javax/crypto/jce/mac/TMMH16Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/UHash32Spi.java4
-rw-r--r--gnu/javax/crypto/jce/mac/UMac32Spi.java4
-rw-r--r--gnu/javax/crypto/jce/sig/DHKeyPairGeneratorSpi.java4
-rw-r--r--gnu/javax/crypto/key/dh/DiffieHellmanSender.java1
-rw-r--r--gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java21
-rw-r--r--gnu/javax/crypto/key/srp6/SRP6TLSServer.java2
-rw-r--r--gnu/javax/crypto/keyring/GnuPrivateKeyring.java367
-rw-r--r--gnu/javax/crypto/keyring/GnuPublicKeyring.java106
-rw-r--r--gnu/javax/crypto/keyring/PasswordAuthenticatedEntry.java102
-rw-r--r--gnu/javax/crypto/keyring/PasswordEncryptedEntry.java51
-rw-r--r--gnu/javax/crypto/keyring/PrimitiveEntry.java5
-rw-r--r--gnu/javax/crypto/keyring/PrivateKeyEntry.java2
-rw-r--r--gnu/javax/crypto/mac/UMac32.java2
-rw-r--r--gnu/javax/crypto/mode/IAuthenticatedMode.java4
-rw-r--r--gnu/javax/crypto/pad/PadFactory.java5
-rw-r--r--gnu/javax/crypto/pad/WrongPaddingException.java4
-rw-r--r--gnu/javax/crypto/prng/CSPRNG.java2
-rw-r--r--gnu/javax/crypto/prng/Fortuna.java9
-rw-r--r--gnu/javax/crypto/prng/ICMGenerator.java4
-rw-r--r--gnu/javax/crypto/prng/IPBE.java34
-rw-r--r--gnu/javax/crypto/prng/PBKDF2.java27
-rw-r--r--gnu/javax/crypto/sasl/ConfidentialityException.java4
-rw-r--r--gnu/javax/crypto/sasl/IllegalMechanismStateException.java4
-rw-r--r--gnu/javax/crypto/sasl/srp/IALG.java4
-rw-r--r--gnu/javax/crypto/sasl/srp/SRPServer.java4
-rw-r--r--gnu/javax/imageio/bmp/BMPDecoder.java1
-rw-r--r--gnu/javax/imageio/bmp/BMPEncoder.java119
-rw-r--r--gnu/javax/imageio/bmp/BMPFileHeader.java39
-rw-r--r--gnu/javax/imageio/bmp/BMPImageReader.java2
-rw-r--r--gnu/javax/imageio/bmp/BMPImageReaderSpi.java13
-rw-r--r--gnu/javax/imageio/bmp/BMPImageWriter.java196
-rw-r--r--gnu/javax/imageio/bmp/BMPImageWriterSpi.java148
-rw-r--r--gnu/javax/imageio/bmp/BMPInfoHeader.java380
-rw-r--r--gnu/javax/imageio/bmp/DecodeBF32.java2
-rw-r--r--gnu/javax/imageio/bmp/DecodeRGB24.java2
-rw-r--r--gnu/javax/imageio/bmp/EncodeRGB1.java128
-rw-r--r--gnu/javax/imageio/bmp/EncodeRGB16.java129
-rw-r--r--gnu/javax/imageio/bmp/EncodeRGB24.java129
-rw-r--r--gnu/javax/imageio/bmp/EncodeRGB32.java130
-rw-r--r--gnu/javax/imageio/bmp/EncodeRGB4.java128
-rw-r--r--gnu/javax/imageio/bmp/EncodeRGB8.java127
-rw-r--r--gnu/javax/imageio/bmp/EncodeRLE4.java269
-rw-r--r--gnu/javax/imageio/bmp/EncodeRLE8.java234
-rw-r--r--gnu/javax/imageio/jpeg/DCT.java348
-rw-r--r--gnu/javax/imageio/jpeg/HuffmanTable.java207
-rw-r--r--gnu/javax/imageio/jpeg/JPEGComponent.java351
-rw-r--r--gnu/javax/imageio/jpeg/JPEGDecoder.java630
-rw-r--r--gnu/javax/imageio/jpeg/JPEGException.java55
-rw-r--r--gnu/javax/imageio/jpeg/JPEGFrame.java108
-rw-r--r--gnu/javax/imageio/jpeg/JPEGImageInputStream.java195
-rw-r--r--gnu/javax/imageio/jpeg/JPEGImageReader.java141
-rw-r--r--gnu/javax/imageio/jpeg/JPEGImageReaderSpi.java137
-rw-r--r--gnu/javax/imageio/jpeg/JPEGMarker.java205
-rw-r--r--gnu/javax/imageio/jpeg/JPEGMarkerFoundException.java50
-rw-r--r--gnu/javax/imageio/jpeg/JPEGScan.java151
-rw-r--r--gnu/javax/imageio/jpeg/YCbCr_ColorSpace.java122
-rw-r--r--gnu/javax/imageio/jpeg/ZigZag.java521
-rw-r--r--gnu/javax/security/auth/callback/ConsoleCallbackHandler.java34
-rw-r--r--gnu/javax/swing/plaf/metal/CustomizableTheme.java218
-rw-r--r--gnu/javax/swing/text/html/parser/support/Parser.java121
-rw-r--r--gnu/javax/swing/tree/GnuPath.java65
-rw-r--r--gnu/regexp/CharIndexed.java20
-rw-r--r--gnu/regexp/CharIndexedCharArray.java33
-rw-r--r--gnu/regexp/CharIndexedCharSequence.java82
-rw-r--r--gnu/regexp/CharIndexedInputStream.java22
-rw-r--r--gnu/regexp/CharIndexedString.java35
-rw-r--r--gnu/regexp/CharIndexedStringBuffer.java32
-rw-r--r--gnu/regexp/RE.java168
-rw-r--r--gnu/regexp/REMatch.java42
-rw-r--r--gnu/regexp/REToken.java29
-rw-r--r--gnu/regexp/RETokenBackRef.java6
-rw-r--r--gnu/regexp/RETokenChar.java13
-rw-r--r--gnu/regexp/RETokenEndOfPreviousMatch.java72
-rw-r--r--gnu/regexp/RETokenEndSub.java2
-rw-r--r--gnu/regexp/RETokenLookAhead.java3
-rw-r--r--gnu/regexp/RETokenLookBehind.java16
-rw-r--r--gnu/regexp/RETokenNamedProperty.java4
-rw-r--r--gnu/regexp/RETokenRange.java4
-rw-r--r--gnu/xml/dom/DomDocument.java38
-rw-r--r--gnu/xml/dom/DomNode.java22
-rw-r--r--gnu/xml/dom/DomNodeIterator.java3
-rw-r--r--gnu/xml/dom/html2/DomHTMLAppletElement.java21
-rw-r--r--gnu/xml/dom/html2/DomHTMLDocument.java2
-rw-r--r--gnu/xml/dom/html2/DomHTMLEmbedElement.java129
-rw-r--r--gnu/xml/dom/html2/DomHTMLObjectElement.java79
-rw-r--r--gnu/xml/dom/html2/DomHTMLParser.java12
-rw-r--r--gnu/xml/stream/XMLParser.java4
-rw-r--r--gnu/xml/validation/relaxng/RELAXNGSchemaFactory.java12
-rw-r--r--gnu/xml/validation/xmlschema/XMLSchemaSchemaFactory.java13
-rw-r--r--include/Makefile.am21
-rw-r--r--include/gnu_java_awt_peer_gtk_GtkCanvasPeer.h1
-rw-r--r--include/gnu_java_awt_peer_gtk_GtkComponentPeer.h4
-rw-r--r--include/gnu_java_net_VMPlainDatagramSocketImpl.h103
-rw-r--r--include/gnu_java_net_VMPlainSocketImpl.h128
-rw-r--r--include/gnu_java_net_local_LocalSocketImpl.h31
-rw-r--r--include/java_lang_VMProcess.h2
-rw-r--r--include/java_lang_VMSystem.h1
-rw-r--r--include/java_lang_reflect_Array.h19
-rw-r--r--include/java_lang_reflect_VMArray.h19
-rw-r--r--java/awt/AlphaComposite.java19
-rw-r--r--java/awt/BasicStroke.java370
-rw-r--r--java/awt/Choice.java11
-rw-r--r--java/awt/ColorPaintContext.java10
-rw-r--r--java/awt/Component.java171
-rw-r--r--java/awt/Container.java15
-rw-r--r--java/awt/DefaultKeyboardFocusManager.java50
-rw-r--r--java/awt/Dialog.java893
-rw-r--r--java/awt/Frame.java13
-rw-r--r--java/awt/GraphicsConfiguration.java4
-rw-r--r--java/awt/GridBagLayout.java3
-rw-r--r--java/awt/Image.java15
-rw-r--r--java/awt/LightweightDispatcher.java66
-rw-r--r--java/awt/ScrollPaneAdjustable.java11
-rw-r--r--java/awt/TexturePaint.java4
-rw-r--r--java/awt/Toolkit.java159
-rw-r--r--java/awt/Window.java69
-rw-r--r--java/awt/datatransfer/SystemFlavorMap.java4
-rw-r--r--java/awt/dnd/DragGestureRecognizer.java4
-rw-r--r--java/awt/dnd/DragSourceContext.java12
-rw-r--r--java/awt/event/MouseEvent.java6
-rw-r--r--java/awt/font/GlyphMetrics.java4
-rw-r--r--java/awt/font/GlyphVector.java8
-rw-r--r--java/awt/font/GraphicAttribute.java4
-rw-r--r--java/awt/font/ImageGraphicAttribute.java12
-rw-r--r--java/awt/font/LineBreakMeasurer.java8
-rw-r--r--java/awt/font/NumericShaper.java352
-rw-r--r--java/awt/font/ShapeGraphicAttribute.java6
-rw-r--r--java/awt/font/TextMeasurer.java7
-rw-r--r--java/awt/geom/Point2D.java10
-rw-r--r--java/awt/image/AreaAveragingScaleFilter.java291
-rw-r--r--java/awt/image/ColorModel.java4
-rw-r--r--java/awt/image/ComponentSampleModel.java886
-rw-r--r--java/awt/image/DirectColorModel.java2
-rw-r--r--java/awt/image/ReplicateScaleFilter.java1
-rw-r--r--java/awt/image/SampleModel.java412
-rw-r--r--java/awt/image/renderable/RenderableImageProducer.java93
-rw-r--r--java/beans/beancontext/BeanContext.java2
-rw-r--r--java/beans/beancontext/BeanContextMembershipEvent.java4
-rw-r--r--java/beans/beancontext/BeanContextServiceAvailableEvent.java4
-rw-r--r--java/beans/beancontext/BeanContextServiceRevokedEvent.java4
-rw-r--r--java/beans/beancontext/BeanContextServicesSupport.java160
-rw-r--r--java/beans/beancontext/BeanContextSupport.java218
-rw-r--r--java/io/CharArrayWriter.java78
-rw-r--r--java/io/DataOutputStream.java105
-rw-r--r--java/io/FilePermission.java22
-rw-r--r--java/io/InputStream.java4
-rw-r--r--java/io/ObjectOutputStream.java60
-rw-r--r--java/io/ObjectStreamConstants.java20
-rw-r--r--java/lang/Boolean.java49
-rw-r--r--java/lang/Class.java512
-rw-r--r--java/lang/ClassLoader.java8
-rw-r--r--java/lang/Enum.java248
-rw-r--r--java/lang/EnumConstantNotPresentException.java2
-rw-r--r--java/lang/Iterable.java59
-rw-r--r--java/lang/Package.java106
-rw-r--r--java/lang/StackTraceElement.java4
-rw-r--r--java/lang/StringBuilder.java22
-rw-r--r--java/lang/Thread.java193
-rw-r--r--java/lang/ThreadGroup.java5
-rw-r--r--java/lang/ThreadLocal.java11
-rw-r--r--java/lang/TypeNotPresentException.java3
-rw-r--r--java/lang/annotation/Annotation.java136
-rw-r--r--java/lang/annotation/AnnotationFormatError.java1
-rw-r--r--java/lang/instrument/ClassDefinition.java88
-rw-r--r--java/lang/instrument/ClassFileTransformer.java86
-rw-r--r--java/lang/instrument/IllegalClassFormatException.java70
-rw-r--r--java/lang/instrument/Instrumentation.java139
-rw-r--r--java/lang/instrument/UnmodifiableClassException.java69
-rw-r--r--java/lang/reflect/AccessibleObject.java29
-rw-r--r--java/lang/reflect/AnnotatedElement.java117
-rw-r--r--java/lang/reflect/Array.java23
-rw-r--r--java/lang/reflect/GenericDeclaration.java (renamed from org/omg/PortableInterceptor/ObjectReferenceFactoryOperations.java)42
-rw-r--r--java/lang/reflect/GenericSignatureFormatError.java1
-rw-r--r--java/lang/reflect/MalformedParameterizedTypeException.java60
-rw-r--r--java/lang/reflect/Member.java9
-rw-r--r--java/lang/reflect/Modifier.java34
-rw-r--r--java/lang/reflect/ParameterizedType.java2
-rw-r--r--java/lang/reflect/TypeVariable.java99
-rw-r--r--java/net/MimeTypeMapper.java360
-rw-r--r--java/net/URLClassLoader.java89
-rw-r--r--java/net/URLConnection.java109
-rw-r--r--java/nio/ByteBufferImpl.java7
-rw-r--r--java/nio/CharBufferImpl.java13
-rw-r--r--java/nio/DoubleBufferImpl.java13
-rw-r--r--java/nio/FloatBufferImpl.java13
-rw-r--r--java/nio/IntBufferImpl.java13
-rw-r--r--java/nio/LongBufferImpl.java13
-rw-r--r--java/nio/ShortBufferImpl.java13
-rw-r--r--java/nio/channels/Channels.java4
-rw-r--r--java/rmi/activation/Activatable.java65
-rw-r--r--java/rmi/activation/ActivationGroup.java48
-rw-r--r--java/rmi/activation/ActivationGroupID.java27
-rw-r--r--java/rmi/activation/ActivationGroup_Stub.java2
-rw-r--r--java/rmi/activation/ActivationID.java14
-rw-r--r--java/rmi/activation/ActivationSystem.java5
-rw-r--r--java/rmi/server/ObjID.java24
-rw-r--r--java/rmi/server/RemoteObject.java124
-rw-r--r--java/rmi/server/RemoteObjectInvocationHandler.java10
-rw-r--r--java/rmi/server/UID.java11
-rw-r--r--java/security/KeyStore.java4
-rw-r--r--java/security/SecureRandom.java108
-rw-r--r--java/security/Security.java5
-rw-r--r--java/security/cert/CertPathValidatorSpi.java4
-rw-r--r--java/security/cert/CertStoreSpi.java3
-rw-r--r--java/security/cert/Certificate.java2
-rw-r--r--java/security/cert/PKIXCertPathChecker.java2
-rw-r--r--java/security/cert/PKIXParameters.java2
-rw-r--r--java/security/cert/X509CertSelector.java2
-rw-r--r--java/sql/Array.java32
-rw-r--r--java/sql/Blob.java96
-rw-r--r--java/sql/CallableStatement.java500
-rw-r--r--java/sql/Clob.java147
-rw-r--r--java/sql/Connection.java136
-rw-r--r--java/sql/DatabaseMetaData.java166
-rw-r--r--java/sql/Date.java6
-rw-r--r--java/sql/Driver.java6
-rw-r--r--java/sql/DriverManager.java17
-rw-r--r--java/sql/PreparedStatement.java124
-rw-r--r--java/sql/ResultSet.java422
-rw-r--r--java/sql/ResultSetMetaData.java86
-rw-r--r--java/sql/SQLData.java4
-rw-r--r--java/sql/SQLOutput.java72
-rw-r--r--java/sql/SQLWarning.java6
-rw-r--r--java/sql/Statement.java37
-rw-r--r--java/sql/Time.java7
-rw-r--r--java/sql/Timestamp.java34
-rw-r--r--java/text/Bidi.java933
-rw-r--r--java/text/Collator.java13
-rw-r--r--java/text/DecimalFormat.java6
-rw-r--r--java/text/RuleBasedCollator.java3
-rw-r--r--java/text/SimpleDateFormat.java5
-rw-r--r--java/util/AbstractList.java25
-rw-r--r--java/util/Arrays.java575
-rw-r--r--java/util/BitSet.java2
-rw-r--r--java/util/Calendar.java3
-rw-r--r--java/util/Collection.java4
-rw-r--r--java/util/Collections.java176
-rw-r--r--java/util/GregorianCalendar.java2
-rw-r--r--java/util/HashMap.java3
-rw-r--r--java/util/Hashtable.java3
-rw-r--r--java/util/IdentityHashMap.java3
-rw-r--r--java/util/InvalidPropertiesFormatException.java17
-rw-r--r--java/util/LinkedHashMap.java3
-rw-r--r--java/util/LinkedList.java8
-rw-r--r--java/util/Locale.java72
-rw-r--r--java/util/SimpleTimeZone.java100
-rw-r--r--java/util/TreeMap.java3
-rw-r--r--java/util/WeakHashMap.java3
-rw-r--r--java/util/jar/Attributes.java12
-rw-r--r--java/util/jar/JarFile.java28
-rw-r--r--java/util/jar/Manifest.java311
-rw-r--r--java/util/logging/Level.java5
-rw-r--r--java/util/logging/LogManager.java293
-rw-r--r--java/util/logging/Logger.java15
-rw-r--r--java/util/regex/Matcher.java14
-rw-r--r--java/util/regex/Pattern.java6
-rw-r--r--java/util/zip/DeflaterEngine.java5
-rw-r--r--java/util/zip/ZipFile.java29
-rw-r--r--javax/accessibility/AccessibleAction.java22
-rw-r--r--javax/accessibility/AccessibleAttributeSequence.java71
-rw-r--r--javax/accessibility/AccessibleContext.java29
-rw-r--r--javax/accessibility/AccessibleExtendedText.java108
-rw-r--r--javax/accessibility/AccessibleRelation.java106
-rw-r--r--javax/accessibility/AccessibleRole.java50
-rw-r--r--javax/accessibility/AccessibleState.java31
-rw-r--r--javax/accessibility/AccessibleStreamable.java62
-rw-r--r--javax/accessibility/AccessibleText.java2
-rw-r--r--javax/accessibility/AccessibleTextSequence.java68
-rw-r--r--javax/crypto/KeyGenerator.java4
-rw-r--r--javax/imageio/ImageIO.java2
-rw-r--r--javax/imageio/ImageWriteParam.java2
-rw-r--r--javax/imageio/plugins/jpeg/JPEGHuffmanTable.java240
-rw-r--r--javax/imageio/plugins/jpeg/JPEGImageReadParam.java161
-rw-r--r--javax/imageio/plugins/jpeg/JPEGImageWriteParam.java293
-rw-r--r--javax/imageio/plugins/jpeg/JPEGQTable.java196
-rw-r--r--javax/imageio/stream/FileCacheImageOutputStream.java6
-rw-r--r--javax/imageio/stream/ImageInputStreamImpl.java2
-rw-r--r--javax/imageio/stream/ImageOutputStreamImpl.java73
-rw-r--r--javax/imageio/stream/MemoryCacheImageInputStream.java4
-rw-r--r--javax/imageio/stream/MemoryCacheImageOutputStream.java8
-rw-r--r--javax/naming/Binding.java66
-rw-r--r--javax/naming/CompositeName.java25
-rw-r--r--javax/naming/NameClassPair.java97
-rw-r--r--javax/naming/directory/BasicAttribute.java31
-rw-r--r--javax/naming/directory/BasicAttributes.java23
-rw-r--r--javax/naming/ldap/StartTlsRequest.java108
-rw-r--r--javax/naming/ldap/StartTlsResponse.java119
-rw-r--r--javax/net/ssl/HttpsURLConnection.java8
-rw-r--r--javax/security/auth/kerberos/DelegationPermission.java136
-rw-r--r--javax/security/auth/kerberos/KerberosKey.java180
-rw-r--r--javax/security/auth/kerberos/KerberosPrincipal.java207
-rw-r--r--javax/security/auth/kerberos/KerberosTicket.java339
-rw-r--r--javax/security/auth/kerberos/KeyImpl.java93
-rw-r--r--javax/security/auth/kerberos/ServicePermission.java172
-rw-r--r--javax/security/auth/x500/X500Principal.java2
-rw-r--r--javax/swing/AbstractAction.java29
-rw-r--r--javax/swing/AbstractButton.java501
-rw-r--r--javax/swing/ActionMap.java31
-rw-r--r--javax/swing/ButtonGroup.java8
-rw-r--r--javax/swing/CompatibilityFocusTraversalPolicy.java164
-rw-r--r--javax/swing/DefaultComboBoxModel.java18
-rw-r--r--javax/swing/DefaultDesktopManager.java2
-rw-r--r--javax/swing/DefaultListSelectionModel.java81
-rw-r--r--javax/swing/ImageIcon.java100
-rw-r--r--javax/swing/InputMap.java7
-rw-r--r--javax/swing/JButton.java129
-rw-r--r--javax/swing/JColorChooser.java65
-rw-r--r--javax/swing/JComboBox.java245
-rw-r--r--javax/swing/JComponent.java608
-rw-r--r--javax/swing/JDesktopPane.java73
-rw-r--r--javax/swing/JFileChooser.java9
-rw-r--r--javax/swing/JInternalFrame.java234
-rw-r--r--javax/swing/JLabel.java47
-rw-r--r--javax/swing/JLayeredPane.java1
-rw-r--r--javax/swing/JList.java271
-rw-r--r--javax/swing/JMenu.java17
-rw-r--r--javax/swing/JMenuItem.java60
-rw-r--r--javax/swing/JOptionPane.java24
-rw-r--r--javax/swing/JPanel.java83
-rw-r--r--javax/swing/JProgressBar.java111
-rw-r--r--javax/swing/JRadioButtonMenuItem.java35
-rw-r--r--javax/swing/JRootPane.java30
-rw-r--r--javax/swing/JScrollBar.java100
-rw-r--r--javax/swing/JScrollPane.java1
-rw-r--r--javax/swing/JSeparator.java83
-rw-r--r--javax/swing/JSlider.java639
-rw-r--r--javax/swing/JSpinner.java4
-rw-r--r--javax/swing/JSplitPane.java205
-rw-r--r--javax/swing/JTabbedPane.java78
-rw-r--r--javax/swing/JTable.java307
-rw-r--r--javax/swing/JTextField.java50
-rw-r--r--javax/swing/JToolBar.java52
-rw-r--r--javax/swing/JToolTip.java90
-rw-r--r--javax/swing/JTree.java232
-rw-r--r--javax/swing/KeyboardManager.java2
-rw-r--r--javax/swing/LookAndFeel.java46
-rw-r--r--javax/swing/MenuSelectionManager.java146
-rw-r--r--javax/swing/ProgressMonitor.java6
-rw-r--r--javax/swing/RepaintManager.java95
-rw-r--r--javax/swing/ScrollPaneLayout.java48
-rw-r--r--javax/swing/Scrollable.java43
-rw-r--r--javax/swing/SizeSequence.java193
-rw-r--r--javax/swing/SpinnerDateModel.java100
-rw-r--r--javax/swing/SpinnerNumberModel.java30
-rw-r--r--javax/swing/SwingUtilities.java11
-rw-r--r--javax/swing/UIManager.java9
-rw-r--r--javax/swing/ViewportLayout.java93
-rw-r--r--javax/swing/border/AbstractBorder.java55
-rw-r--r--javax/swing/border/BevelBorder.java18
-rw-r--r--javax/swing/border/CompoundBorder.java4
-rw-r--r--javax/swing/border/EtchedBorder.java10
-rw-r--r--javax/swing/border/LineBorder.java16
-rw-r--r--javax/swing/border/MatteBorder.java4
-rw-r--r--javax/swing/border/TitledBorder.java10
-rw-r--r--javax/swing/event/ChangeEvent.java33
-rw-r--r--javax/swing/event/ChangeListener.java32
-rw-r--r--javax/swing/event/InternalFrameEvent.java67
-rw-r--r--javax/swing/event/TableColumnModelListener.java88
-rw-r--r--javax/swing/filechooser/UnixFileSystemView.java6
-rw-r--r--javax/swing/plaf/basic/BasicButtonListener.java11
-rw-r--r--javax/swing/plaf/basic/BasicButtonUI.java6
-rw-r--r--javax/swing/plaf/basic/BasicComboBoxEditor.java44
-rw-r--r--javax/swing/plaf/basic/BasicComboBoxUI.java108
-rw-r--r--javax/swing/plaf/basic/BasicComboPopup.java12
-rw-r--r--javax/swing/plaf/basic/BasicFileChooserUI.java19
-rw-r--r--javax/swing/plaf/basic/BasicInternalFrameTitlePane.java23
-rw-r--r--javax/swing/plaf/basic/BasicInternalFrameUI.java71
-rw-r--r--javax/swing/plaf/basic/BasicLabelUI.java4
-rw-r--r--javax/swing/plaf/basic/BasicListUI.java3
-rw-r--r--javax/swing/plaf/basic/BasicLookAndFeel.java222
-rw-r--r--javax/swing/plaf/basic/BasicMenuBarUI.java4
-rw-r--r--javax/swing/plaf/basic/BasicMenuItemUI.java487
-rw-r--r--javax/swing/plaf/basic/BasicMenuUI.java4
-rw-r--r--javax/swing/plaf/basic/BasicOptionPaneUI.java4
-rw-r--r--javax/swing/plaf/basic/BasicPopupMenuUI.java4
-rw-r--r--javax/swing/plaf/basic/BasicRadioButtonUI.java12
-rw-r--r--javax/swing/plaf/basic/BasicRootPaneUI.java122
-rw-r--r--javax/swing/plaf/basic/BasicScrollBarUI.java4
-rw-r--r--javax/swing/plaf/basic/BasicScrollPaneUI.java183
-rw-r--r--javax/swing/plaf/basic/BasicSliderUI.java793
-rw-r--r--javax/swing/plaf/basic/BasicSpinnerUI.java9
-rw-r--r--javax/swing/plaf/basic/BasicSplitPaneUI.java4
-rw-r--r--javax/swing/plaf/basic/BasicTabbedPaneUI.java852
-rw-r--r--javax/swing/plaf/basic/BasicTableHeaderUI.java14
-rw-r--r--javax/swing/plaf/basic/BasicTableUI.java65
-rw-r--r--javax/swing/plaf/basic/BasicTextAreaUI.java7
-rw-r--r--javax/swing/plaf/basic/BasicTextFieldUI.java15
-rw-r--r--javax/swing/plaf/basic/BasicTextUI.java123
-rw-r--r--javax/swing/plaf/basic/BasicToolBarUI.java4
-rw-r--r--javax/swing/plaf/basic/BasicTreeUI.java1696
-rw-r--r--javax/swing/plaf/metal/MetalBorders.java92
-rw-r--r--javax/swing/plaf/metal/MetalButtonUI.java13
-rw-r--r--javax/swing/plaf/metal/MetalComboBoxButton.java15
-rw-r--r--javax/swing/plaf/metal/MetalComboBoxEditor.java73
-rw-r--r--javax/swing/plaf/metal/MetalComboBoxUI.java23
-rw-r--r--javax/swing/plaf/metal/MetalDesktopIconUI.java16
-rw-r--r--javax/swing/plaf/metal/MetalInternalFrameTitlePane.java12
-rw-r--r--javax/swing/plaf/metal/MetalLookAndFeel.java2
-rw-r--r--javax/swing/plaf/metal/MetalRootPaneUI.java157
-rw-r--r--javax/swing/plaf/metal/MetalSliderUI.java6
-rw-r--r--javax/swing/plaf/metal/MetalTabbedPaneUI.java861
-rw-r--r--javax/swing/plaf/metal/MetalToggleButtonUI.java9
-rw-r--r--javax/swing/plaf/metal/MetalToolBarUI.java36
-rw-r--r--javax/swing/plaf/metal/MetalTreeUI.java4
-rw-r--r--javax/swing/plaf/metal/OceanTheme.java5
-rw-r--r--javax/swing/plaf/synth/ColorType.java7
-rw-r--r--javax/swing/plaf/synth/SynthGraphicsUtils.java6
-rw-r--r--javax/swing/plaf/synth/SynthLookAndFeel.java11
-rw-r--r--javax/swing/plaf/synth/SynthPainter.java35
-rw-r--r--javax/swing/plaf/synth/SynthStyle.java83
-rw-r--r--javax/swing/table/DefaultTableCellRenderer.java19
-rw-r--r--javax/swing/table/DefaultTableColumnModel.java346
-rw-r--r--javax/swing/table/DefaultTableModel.java54
-rw-r--r--javax/swing/table/JTableHeader.java50
-rw-r--r--javax/swing/table/TableColumnModel.java95
-rw-r--r--javax/swing/text/AbstractDocument.java112
-rw-r--r--javax/swing/text/AsyncBoxView.java6
-rw-r--r--javax/swing/text/BoxView.java9
-rw-r--r--javax/swing/text/CompositeView.java131
-rw-r--r--javax/swing/text/DefaultCaret.java161
-rw-r--r--javax/swing/text/DefaultHighlighter.java142
-rw-r--r--javax/swing/text/FieldView.java180
-rw-r--r--javax/swing/text/FlowView.java2
-rw-r--r--javax/swing/text/GapContent.java18
-rw-r--r--javax/swing/text/InternationalFormatter.java2
-rw-r--r--javax/swing/text/JTextComponent.java1
-rw-r--r--javax/swing/text/PlainView.java15
-rw-r--r--javax/swing/text/Position.java2
-rw-r--r--javax/swing/text/Segment.java5
-rw-r--r--javax/swing/text/StyleContext.java12
-rw-r--r--javax/swing/text/Utilities.java97
-rw-r--r--javax/swing/text/View.java29
-rw-r--r--javax/swing/text/WrappedPlainView.java213
-rw-r--r--javax/swing/text/html/FormView.java45
-rw-r--r--javax/swing/text/html/HTML.java4
-rw-r--r--javax/swing/text/html/HTMLDocument.java46
-rw-r--r--javax/swing/text/html/HTMLEditorKit.java3
-rw-r--r--javax/swing/text/html/ListView.java131
-rw-r--r--javax/swing/text/html/NullView.java4
-rw-r--r--javax/swing/text/html/parser/Entity.java2
-rw-r--r--javax/swing/tree/AbstractLayoutCache.java751
-rw-r--r--javax/swing/tree/DefaultMutableTreeNode.java2
-rw-r--r--javax/swing/tree/DefaultTreeCellEditor.java20
-rw-r--r--javax/swing/tree/DefaultTreeCellRenderer.java29
-rw-r--r--javax/swing/tree/DefaultTreeModel.java89
-rw-r--r--javax/swing/tree/DefaultTreeSelectionModel.java1659
-rw-r--r--javax/swing/tree/FixedHeightLayoutCache.java564
-rw-r--r--javax/swing/tree/TreePath.java19
-rw-r--r--javax/swing/tree/VariableHeightLayoutCache.java582
-rw-r--r--javax/xml/XMLConstants.java9
-rw-r--r--javax/xml/datatype/DatatypeConstants.java9
-rw-r--r--javax/xml/datatype/DatatypeFactory.java45
-rw-r--r--javax/xml/datatype/Duration.java10
-rw-r--r--javax/xml/validation/SchemaFactory.java17
-rw-r--r--javax/xml/validation/SchemaFactoryLoader.java52
-rw-r--r--javax/xml/xpath/XPathConstants.java8
-rw-r--r--lib/.cvsignore1
-rw-r--r--lib/Makefile.am28
-rwxr-xr-xlib/gen-classlist.sh.in67
-rwxr-xr-xlib/split-for-gcj.sh28
-rw-r--r--m4/acinclude.m44
-rw-r--r--native/fdlibm/Makefile.am2
-rw-r--r--native/fdlibm/fdlibm.h2
-rw-r--r--native/fdlibm/ieeefp.h2
-rw-r--r--native/jni/classpath/Makefile.am2
-rw-r--r--native/jni/classpath/jcl.c4
-rw-r--r--native/jni/classpath/jcl.h13
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c6
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c36
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c25
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c14
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c84
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c40
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c21
-rw-r--r--native/jni/java-lang/Makefile.am2
-rw-r--r--native/jni/java-lang/java_lang_VMProcess.c28
-rw-r--r--native/jni/java-lang/java_lang_VMSystem.c32
-rw-r--r--native/jni/java-lang/java_lang_reflect_VMArray.c (renamed from native/jni/java-lang/java_lang_reflect_Array.c)4
-rw-r--r--native/jni/java-net/Makefile.am11
-rw-r--r--native/jni/java-net/gnu_java_net_local_LocalSocketImpl.c538
-rw-r--r--native/jni/java-net/javanet.h16
-rw-r--r--native/jni/java-net/local.c193
-rw-r--r--native/jni/java-net/local.h28
-rw-r--r--native/jni/native-lib/cpproc.h1
-rw-r--r--org/omg/CORBA/ACTIVITY_COMPLETED.java6
-rw-r--r--org/omg/CORBA/ACTIVITY_REQUIRED.java6
-rw-r--r--org/omg/CORBA/BAD_CONTEXT.java6
-rw-r--r--org/omg/CORBA/BAD_INV_ORDER.java6
-rwxr-xr-xorg/omg/CORBA/BAD_OPERATION.java6
-rw-r--r--org/omg/CORBA/BAD_PARAM.java6
-rw-r--r--org/omg/CORBA/BAD_QOS.java6
-rw-r--r--org/omg/CORBA/BAD_TYPECODE.java6
-rw-r--r--org/omg/CORBA/CODESET_INCOMPATIBLE.java12
-rw-r--r--org/omg/CORBA/COMM_FAILURE.java6
-rw-r--r--org/omg/CORBA/CompletionStatus.java4
-rw-r--r--org/omg/CORBA/CurrentHolder.java8
-rw-r--r--org/omg/CORBA/DATA_CONVERSION.java6
-rw-r--r--org/omg/CORBA/FREE_MEM.java8
-rw-r--r--org/omg/CORBA/IMP_LIMIT.java8
-rw-r--r--org/omg/CORBA/INITIALIZE.java8
-rw-r--r--org/omg/CORBA/INTERNAL.java8
-rw-r--r--org/omg/CORBA/INTF_REPOS.java6
-rw-r--r--org/omg/CORBA/INVALID_ACTIVITY.java6
-rw-r--r--org/omg/CORBA/INVALID_TRANSACTION.java6
-rw-r--r--org/omg/CORBA/INV_FLAG.java6
-rw-r--r--org/omg/CORBA/INV_IDENT.java6
-rw-r--r--org/omg/CORBA/INV_OBJREF.java6
-rw-r--r--org/omg/CORBA/INV_POLICY.java6
-rw-r--r--org/omg/CORBA/MARSHAL.java6
-rw-r--r--org/omg/CORBA/NO_IMPLEMENT.java6
-rw-r--r--org/omg/CORBA/NO_MEMORY.java6
-rw-r--r--org/omg/CORBA/NO_PERMISSION.java6
-rw-r--r--org/omg/CORBA/NO_RESOURCES.java6
-rw-r--r--org/omg/CORBA/NO_RESPONSE.java6
-rw-r--r--org/omg/CORBA/OBJECT_NOT_EXIST.java8
-rw-r--r--org/omg/CORBA/OBJ_ADAPTER.java6
-rw-r--r--org/omg/CORBA/ORB.java17
-rw-r--r--org/omg/CORBA/PERSIST_STORE.java4
-rw-r--r--org/omg/CORBA/ParameterMode.java8
-rw-r--r--org/omg/CORBA/ParameterModeHolder.java8
-rw-r--r--org/omg/CORBA/PolicyError.java6
-rw-r--r--org/omg/CORBA/PolicyErrorHolder.java8
-rw-r--r--org/omg/CORBA/PolicyHolder.java8
-rw-r--r--org/omg/CORBA/PolicyListHolder.java10
-rw-r--r--org/omg/CORBA/REBIND.java6
-rw-r--r--org/omg/CORBA/SystemException.java4
-rw-r--r--org/omg/CORBA/TIMEOUT.java6
-rw-r--r--org/omg/CORBA/TRANSACTION_MODE.java6
-rw-r--r--org/omg/CORBA/TRANSACTION_REQUIRED.java6
-rw-r--r--org/omg/CORBA/TRANSACTION_ROLLEDBACK.java6
-rw-r--r--org/omg/CORBA/TRANSACTION_UNAVAILABLE.java6
-rw-r--r--org/omg/CORBA/TRANSIENT.java6
-rw-r--r--org/omg/CORBA/TypeCodeHolder.java8
-rw-r--r--org/omg/CORBA/UNKNOWN.java6
-rw-r--r--org/omg/CORBA/UnionMember.java5
-rw-r--r--org/omg/CORBA/UnknownUserException.java6
-rw-r--r--org/omg/CORBA/UnknownUserExceptionHolder.java6
-rw-r--r--org/omg/CORBA/UserException.java8
-rw-r--r--org/omg/CORBA/ValueMember.java4
-rw-r--r--org/omg/CORBA/WrongTransactionHolder.java6
-rw-r--r--org/omg/CosNaming/NamingContextOperations.java4
-rw-r--r--org/omg/CosNaming/_BindingIteratorStub.java4
-rw-r--r--org/omg/CosNaming/_NamingContextExtStub.java4
-rw-r--r--org/omg/CosNaming/_NamingContextStub.java9
-rw-r--r--org/omg/DynamicAny/_DynAnyFactoryStub.java17
-rw-r--r--org/omg/DynamicAny/_DynAnyStub.java15
-rw-r--r--org/omg/DynamicAny/_DynArrayStub.java558
-rw-r--r--org/omg/DynamicAny/_DynEnumStub.java560
-rw-r--r--org/omg/DynamicAny/_DynFixedStub.java559
-rw-r--r--org/omg/DynamicAny/_DynSequenceStub.java557
-rw-r--r--org/omg/DynamicAny/_DynStructStub.java558
-rw-r--r--org/omg/DynamicAny/_DynUnionStub.java558
-rw-r--r--org/omg/DynamicAny/_DynValueStub.java556
-rw-r--r--org/omg/IOP/CodecFactoryPackage/UnknownEncoding.java4
-rw-r--r--org/omg/IOP/CodecPackage/FormatMismatch.java4
-rw-r--r--org/omg/IOP/CodecPackage/InvalidTypeForEncoding.java4
-rw-r--r--org/omg/IOP/CodecPackage/TypeMismatch.java4
-rw-r--r--org/omg/IOP/Encoding.java4
-rw-r--r--org/omg/IOP/IOR.java11
-rw-r--r--org/omg/IOP/IORHolder.java6
-rw-r--r--org/omg/IOP/MultipleComponentProfileHolder.java8
-rw-r--r--org/omg/IOP/ServiceContextHolder.java6
-rw-r--r--org/omg/IOP/ServiceContextListHolder.java6
-rw-r--r--org/omg/IOP/TaggedComponent.java4
-rw-r--r--org/omg/IOP/TaggedComponentHolder.java6
-rw-r--r--org/omg/IOP/TaggedProfile.java4
-rw-r--r--org/omg/IOP/TaggedProfileHolder.java6
-rw-r--r--org/omg/Messaging/SyncScopeHelper.java16
-rw-r--r--org/omg/PortableInterceptor/ForwardRequest.java4
-rw-r--r--org/omg/PortableInterceptor/IORInterceptor_3_0Holder.java6
-rw-r--r--org/omg/PortableInterceptor/InvalidSlot.java4
-rw-r--r--org/omg/PortableInterceptor/ObjectReferenceFactory.java26
-rw-r--r--org/omg/PortableInterceptor/ObjectReferenceFactoryHolder.java6
-rw-r--r--org/omg/PortableInterceptor/ObjectReferenceTemplateHolder.java6
-rw-r--r--org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.java6
-rw-r--r--org/omg/PortableServer/ServantActivatorPOA.java36
-rw-r--r--org/omg/PortableServer/ServantLocatorPOA.java34
-rw-r--r--resource/gnu/classpath/tools/appletviewer/MessagesBundle.properties71
-rw-r--r--resource/gnu/classpath/tools/appletviewer/MessagesBundle_de.properties75
-rw-r--r--resource/gnu/classpath/tools/jarsigner/MessageBundle.properties33
-rw-r--r--resource/gnu/classpath/tools/keytool/MessageBundle.properties95
-rw-r--r--resource/gnu/java/locale/LocaleInformation_aa.properties33
-rw-r--r--resource/gnu/java/locale/LocaleInformation_aa_ET.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_af.properties20
-rw-r--r--resource/gnu/java/locale/LocaleInformation_am.properties62
-rw-r--r--resource/gnu/java/locale/LocaleInformation_am_ET.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ar.properties105
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ar_JO.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ar_QA.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ar_SA.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ar_SY.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ar_TN.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ar_YE.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_as_IN.properties5
-rw-r--r--resource/gnu/java/locale/LocaleInformation_az.properties18
-rw-r--r--resource/gnu/java/locale/LocaleInformation_az_Cyrl.properties6
-rw-r--r--resource/gnu/java/locale/LocaleInformation_be.properties31
-rw-r--r--resource/gnu/java/locale/LocaleInformation_be_BY.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_bg.properties572
-rw-r--r--resource/gnu/java/locale/LocaleInformation_bn.properties21
-rw-r--r--resource/gnu/java/locale/LocaleInformation_bn_IN.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_bs.properties17
-rw-r--r--resource/gnu/java/locale/LocaleInformation_byn.properties300
-rw-r--r--resource/gnu/java/locale/LocaleInformation_byn_ER.properties16
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ca.properties60
-rw-r--r--resource/gnu/java/locale/LocaleInformation_cs.properties968
-rw-r--r--resource/gnu/java/locale/LocaleInformation_cy.properties272
-rw-r--r--resource/gnu/java/locale/LocaleInformation_da.properties959
-rw-r--r--resource/gnu/java/locale/LocaleInformation_de.properties1078
-rw-r--r--resource/gnu/java/locale/LocaleInformation_de_CH.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_dv.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_dz.properties20
-rw-r--r--resource/gnu/java/locale/LocaleInformation_el.properties1302
-rw-r--r--resource/gnu/java/locale/LocaleInformation_el_CY.properties (renamed from resource/gnu/java/locale/LocaleInformation_ar_IQ.properties)4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_en.properties1149
-rw-r--r--resource/gnu/java/locale/LocaleInformation_en_GB.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_en_IN.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_en_PK.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_en_SG.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_en_US_POSIX.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_eo.properties34
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es.properties1071
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_AR.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_BO.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_CL.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_CO.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_CR.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_DO.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_EC.properties5
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_ES.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_GT.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_HN.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_MX.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_NI.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_PA.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_PE.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_PR.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_PY.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_SV.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_US.properties3
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_UY.properties3
-rw-r--r--resource/gnu/java/locale/LocaleInformation_es_VE.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_et.properties36
-rw-r--r--resource/gnu/java/locale/LocaleInformation_eu.properties17
-rw-r--r--resource/gnu/java/locale/LocaleInformation_fa.properties589
-rw-r--r--resource/gnu/java/locale/LocaleInformation_fa_AF.properties43
-rw-r--r--resource/gnu/java/locale/LocaleInformation_fa_IR.properties3
-rw-r--r--resource/gnu/java/locale/LocaleInformation_fi.properties1291
-rw-r--r--resource/gnu/java/locale/LocaleInformation_fo.properties15
-rw-r--r--resource/gnu/java/locale/LocaleInformation_fr.properties1027
-rw-r--r--resource/gnu/java/locale/LocaleInformation_fr_CA.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ga.properties958
-rw-r--r--resource/gnu/java/locale/LocaleInformation_gez.properties298
-rw-r--r--resource/gnu/java/locale/LocaleInformation_gez_ER.properties19
-rw-r--r--resource/gnu/java/locale/LocaleInformation_gez_ET.properties18
-rw-r--r--resource/gnu/java/locale/LocaleInformation_gl.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_gu.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_gu_IN.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_haw.properties32
-rw-r--r--resource/gnu/java/locale/LocaleInformation_haw_US.properties16
-rw-r--r--resource/gnu/java/locale/LocaleInformation_he.properties240
-rw-r--r--resource/gnu/java/locale/LocaleInformation_hi.properties28
-rw-r--r--resource/gnu/java/locale/LocaleInformation_hi_IN.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_hr.properties417
-rw-r--r--resource/gnu/java/locale/LocaleInformation_hu.properties992
-rw-r--r--resource/gnu/java/locale/LocaleInformation_hy.properties26
-rw-r--r--resource/gnu/java/locale/LocaleInformation_id.properties31
-rw-r--r--resource/gnu/java/locale/LocaleInformation_is.properties491
-rw-r--r--resource/gnu/java/locale/LocaleInformation_it.properties1040
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ja.properties1032
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ja_JP.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ka.properties27
-rw-r--r--resource/gnu/java/locale/LocaleInformation_kk.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_kl.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_km.properties41
-rw-r--r--resource/gnu/java/locale/LocaleInformation_kn.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_kn_IN.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ko.properties886
-rw-r--r--resource/gnu/java/locale/LocaleInformation_kok.properties156
-rw-r--r--resource/gnu/java/locale/LocaleInformation_kok_IN.properties (renamed from resource/gnu/java/locale/LocaleInformation_ar_IN.properties)8
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ky.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_lo.properties49
-rw-r--r--resource/gnu/java/locale/LocaleInformation_lo_LA.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_lt.properties123
-rw-r--r--resource/gnu/java/locale/LocaleInformation_lt_LT.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_lv.properties15
-rw-r--r--resource/gnu/java/locale/LocaleInformation_mk.properties418
-rw-r--r--resource/gnu/java/locale/LocaleInformation_mn.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_mr.properties15
-rw-r--r--resource/gnu/java/locale/LocaleInformation_mr_IN.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ms.properties9
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ms_BN.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_mt.properties146
-rw-r--r--resource/gnu/java/locale/LocaleInformation_nb.properties1058
-rw-r--r--resource/gnu/java/locale/LocaleInformation_nl.properties1102
-rw-r--r--resource/gnu/java/locale/LocaleInformation_nn.properties57
-rw-r--r--resource/gnu/java/locale/LocaleInformation_om.properties33
-rw-r--r--resource/gnu/java/locale/LocaleInformation_om_ET.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_or_IN.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_pa.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_pa_IN.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_pl.properties952
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ps.properties12
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ps_AF.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_pt.properties964
-rw-r--r--resource/gnu/java/locale/LocaleInformation_pt_PT.properties9
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ro.properties44
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ru.properties1124
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ru_RU.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ru_UA.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sa.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sa_IN.properties3
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sid.properties55
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sid_ET.properties (renamed from resource/gnu/java/locale/LocaleInformation_ar_KW.properties)4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sk.properties955
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sl.properties56
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sl_SI.properties (renamed from resource/gnu/java/locale/LocaleInformation_ar_LY.properties)4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_so.properties42
-rw-r--r--resource/gnu/java/locale/LocaleInformation_so_DJ.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_so_ET.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_so_SO.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sq.properties44
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sr.properties94
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sr_BA_Cyrl.properties23
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sr_BA_Latn.properties21
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sr_Cyrl.properties10
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sr_Latn.properties104
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sv.properties1048
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sw.properties30
-rw-r--r--resource/gnu/java/locale/LocaleInformation_sw_TZ.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_syr.properties11
-rw-r--r--resource/gnu/java/locale/LocaleInformation_syr_SY.properties17
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ta.properties40
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ta_IN.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_te.properties33
-rw-r--r--resource/gnu/java/locale/LocaleInformation_te_IN.properties4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_th.properties130
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ti.properties13
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ti_ER.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ti_ET.properties2
-rw-r--r--resource/gnu/java/locale/LocaleInformation_tig.properties300
-rw-r--r--resource/gnu/java/locale/LocaleInformation_tig_ER.properties16
-rw-r--r--resource/gnu/java/locale/LocaleInformation_tr.properties1238
-rw-r--r--resource/gnu/java/locale/LocaleInformation_tt.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_uk.properties927
-rw-r--r--resource/gnu/java/locale/LocaleInformation_ur.properties1
-rw-r--r--resource/gnu/java/locale/LocaleInformation_uz.properties36
-rw-r--r--resource/gnu/java/locale/LocaleInformation_uz_AF_Arab.properties (renamed from resource/gnu/java/locale/LocaleInformation_mn_MN.properties)5
-rw-r--r--resource/gnu/java/locale/LocaleInformation_uz_Arab.properties (renamed from resource/gnu/java/locale/LocaleInformation_uz_AF.properties)4
-rw-r--r--resource/gnu/java/locale/LocaleInformation_uz_Latn.properties45
-rw-r--r--resource/gnu/java/locale/LocaleInformation_vi.properties34
-rw-r--r--resource/gnu/java/locale/LocaleInformation_wal.properties169
-rw-r--r--resource/gnu/java/locale/LocaleInformation_wal_ET.properties17
-rw-r--r--resource/gnu/java/locale/LocaleInformation_zh.properties955
-rw-r--r--resource/gnu/java/locale/LocaleInformation_zh_Hant.properties634
-rw-r--r--resource/java/security/classpath.security3
-rw-r--r--resource/javax/imageio/plugins/jpeg/MessagesBundle.properties9
-rwxr-xr-xscripts/generate-locale-list.sh16
-rw-r--r--tools/.cvsignore2
-rwxr-xr-xtools/Makefile.am27
-rw-r--r--tools/README18
-rw-r--r--tools/appletviewer.c235
-rw-r--r--tools/appletviewer.in63
-rw-r--r--tools/gnu/classpath/tools/HelpPrinter.java41
-rw-r--r--tools/gnu/classpath/tools/appletviewer/AppletClassLoader.java81
-rw-r--r--tools/gnu/classpath/tools/appletviewer/AppletSecurityManager.java95
-rw-r--r--tools/gnu/classpath/tools/appletviewer/AppletTag.java485
-rw-r--r--tools/gnu/classpath/tools/appletviewer/AppletWarning.java66
-rw-r--r--tools/gnu/classpath/tools/appletviewer/CommonAppletContext.java133
-rw-r--r--tools/gnu/classpath/tools/appletviewer/CommonAppletStub.java138
-rw-r--r--tools/gnu/classpath/tools/appletviewer/ConsoleDialog.java175
-rw-r--r--tools/gnu/classpath/tools/appletviewer/ErrorApplet.java53
-rw-r--r--tools/gnu/classpath/tools/appletviewer/Main.java303
-rw-r--r--tools/gnu/classpath/tools/appletviewer/PluginAppletContext.java72
-rw-r--r--tools/gnu/classpath/tools/appletviewer/PluginAppletViewer.java172
-rw-r--r--tools/gnu/classpath/tools/appletviewer/PluginAppletWindow.java454
-rw-r--r--tools/gnu/classpath/tools/appletviewer/StandaloneAppletContext.java75
-rw-r--r--tools/gnu/classpath/tools/appletviewer/StandaloneAppletViewer.java144
-rw-r--r--tools/gnu/classpath/tools/appletviewer/StandaloneAppletWindow.java559
-rw-r--r--tools/gnu/classpath/tools/appletviewer/TagParser.java302
-rw-r--r--tools/gnu/classpath/tools/common/CallbackUtil.java145
-rw-r--r--tools/gnu/classpath/tools/common/ProviderUtil.java163
-rw-r--r--tools/gnu/classpath/tools/common/SecurityProviderInfo.java99
-rw-r--r--tools/gnu/classpath/tools/getopt/ClasspathToolParser.java71
-rw-r--r--tools/gnu/classpath/tools/getopt/FileArgumentCallback.java61
-rw-r--r--tools/gnu/classpath/tools/getopt/Option.java201
-rw-r--r--tools/gnu/classpath/tools/getopt/OptionException.java52
-rw-r--r--tools/gnu/classpath/tools/getopt/OptionGroup.java171
-rw-r--r--tools/gnu/classpath/tools/getopt/Parser.java314
-rw-r--r--tools/gnu/classpath/tools/giop/GRMIC.java22
-rw-r--r--tools/gnu/classpath/tools/giop/GRMIC.txt3
-rw-r--r--tools/gnu/classpath/tools/giop/IorParser.java18
-rw-r--r--tools/gnu/classpath/tools/giop/grmic/CompilationError.java18
-rw-r--r--tools/gnu/classpath/tools/giop/grmic/Generator.java18
-rw-r--r--tools/gnu/classpath/tools/giop/grmic/GiopIo.java18
-rw-r--r--tools/gnu/classpath/tools/giop/grmic/GiopRmicCompiler.java33
-rw-r--r--tools/gnu/classpath/tools/giop/grmic/HashFinder.java22
-rw-r--r--tools/gnu/classpath/tools/giop/grmic/MethodGenerator.java18
-rw-r--r--tools/gnu/classpath/tools/jar/Action.java50
-rw-r--r--tools/gnu/classpath/tools/jar/Creator.java192
-rw-r--r--tools/gnu/classpath/tools/jar/Entry.java60
-rw-r--r--tools/gnu/classpath/tools/jar/Extractor.java100
-rw-r--r--tools/gnu/classpath/tools/jar/Lister.java84
-rw-r--r--tools/gnu/classpath/tools/jar/Main.java225
-rw-r--r--tools/gnu/classpath/tools/jar/Updater.java81
-rw-r--r--tools/gnu/classpath/tools/jarsigner/HashUtils.java122
-rw-r--r--tools/gnu/classpath/tools/jarsigner/JarSigner.java167
-rw-r--r--tools/gnu/classpath/tools/jarsigner/JarVerifier.java339
-rw-r--r--tools/gnu/classpath/tools/jarsigner/Main.java567
-rw-r--r--tools/gnu/classpath/tools/jarsigner/Messages.java115
-rw-r--r--tools/gnu/classpath/tools/jarsigner/SFHelper.java373
-rw-r--r--tools/gnu/classpath/tools/jarsigner/jarsigner.txt116
-rw-r--r--tools/gnu/classpath/tools/jarsigner/package.html60
-rw-r--r--tools/gnu/classpath/tools/keytool/CertReqCmd.java405
-rw-r--r--tools/gnu/classpath/tools/keytool/Command.java1147
-rw-r--r--tools/gnu/classpath/tools/keytool/DeleteCmd.java235
-rw-r--r--tools/gnu/classpath/tools/keytool/ExportCmd.java266
-rw-r--r--tools/gnu/classpath/tools/keytool/GenKeyCmd.java511
-rw-r--r--tools/gnu/classpath/tools/keytool/IdentityDBCmd.java185
-rw-r--r--tools/gnu/classpath/tools/keytool/ImportCmd.java751
-rw-r--r--tools/gnu/classpath/tools/keytool/KeyCloneCmd.java344
-rw-r--r--tools/gnu/classpath/tools/keytool/KeyPasswdCmd.java339
-rw-r--r--tools/gnu/classpath/tools/keytool/ListCmd.java380
-rw-r--r--tools/gnu/classpath/tools/keytool/Main.java219
-rw-r--r--tools/gnu/classpath/tools/keytool/Messages.java115
-rw-r--r--tools/gnu/classpath/tools/keytool/PrintCertCmd.java123
-rw-r--r--tools/gnu/classpath/tools/keytool/SelfCertCmd.java371
-rw-r--r--tools/gnu/classpath/tools/keytool/StorePasswdCmd.java275
-rw-r--r--tools/gnu/classpath/tools/keytool/keytool.txt616
-rw-r--r--tools/gnu/classpath/tools/keytool/package.html65
-rw-r--r--tools/gnu/classpath/tools/rmi/Persistent.java87
-rw-r--r--tools/gnu/classpath/tools/rmi/PersistentBidiHashTable.java268
-rw-r--r--tools/gnu/classpath/tools/rmi/PersistentHashTable.java246
-rw-r--r--tools/gnu/classpath/tools/rmi/REGISTRY.java165
-rw-r--r--tools/gnu/classpath/tools/rmi/REGISTRY.txt28
-rw-r--r--tools/gnu/classpath/tools/rmi/RMIC.java23
-rw-r--r--tools/gnu/classpath/tools/rmi/RMIC.txt2
-rw-r--r--tools/gnu/classpath/tools/rmi/RMID.java189
-rw-r--r--tools/gnu/classpath/tools/rmi/RMID.txt30
-rw-r--r--tools/gnu/classpath/tools/rmi/registry/RegistryImpl.java139
-rw-r--r--tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Skel.java278
-rw-r--r--tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Stub.java263
-rw-r--r--tools/gnu/classpath/tools/rmi/registry/package.html46
-rw-r--r--tools/gnu/classpath/tools/rmi/rmic/RmiMethodGenerator.java14
-rw-r--r--tools/gnu/classpath/tools/rmi/rmic/RmicCompiler.java13
-rw-r--r--tools/gnu/classpath/tools/rmi/rmic/WrapUnWrapper.java19
-rw-r--r--tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12Method.jav2
-rw-r--r--tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12MethodVoid.jav2
-rw-r--r--tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl.java244
-rw-r--r--tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl_Stub.java556
-rw-r--r--tools/jarsigner.in63
-rw-r--r--tools/keytool.in63
-rw-r--r--vm/reference/gnu/classpath/Unsafe.java328
-rw-r--r--vm/reference/gnu/java/lang/VMInstrumentationImpl.java108
-rw-r--r--vm/reference/java/lang/VMClass.java181
-rw-r--r--vm/reference/java/lang/VMClassLoader.java92
-rw-r--r--vm/reference/java/lang/VMProcess.java46
-rw-r--r--vm/reference/java/lang/VMSystem.java71
-rw-r--r--vm/reference/java/lang/VMThread.java6
-rw-r--r--vm/reference/java/lang/reflect/Constructor.java157
-rw-r--r--vm/reference/java/lang/reflect/Field.java77
-rw-r--r--vm/reference/java/lang/reflect/Method.java170
-rw-r--r--vm/reference/java/lang/reflect/VMArray.java65
-rw-r--r--vm/reference/java/security/VMSecureRandom.java134
1088 files changed, 93257 insertions, 32207 deletions
diff --git a/.classpath b/.classpath
index c4015bf57..611ba22c6 100644
--- a/.classpath
+++ b/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry excluding=".externalToolBuilders/|.settings/|ChangeLog*|Makefile*|autom4te.cache/|compat/|config*|doc/|examples/|external/|gnu/javax/swing/plaf/|include/|install/|lib/|m4/|native/|resource/|scripts/|test/|testsuite/|vm/reference/|tools/|external/relaxngDatatype/" kind="src" path=""/>
+ <classpathentry excluding=".externalToolBuilders/|.settings/|ChangeLog*|Makefile*|autom4te.cache/|compat/|config*|doc/|examples/|external/|external/relaxngDatatype/|include/|install/|lib/|m4/|native/|resource/|scripts/|test/|testsuite/|tools/|vm/reference/" kind="src" path=""/>
<classpathentry excluding=".cvsignore|Makefile|Makefile.am|Makefile.in|README.txt" kind="src" path="external/relaxngDatatype"/>
<classpathentry excluding=".cvsignore|Makefile|Makefile.am|Makefile.in|README" kind="src" path="tools"/>
<classpathentry excluding=".cvsignore|Makefile|Makefile.am|Makefile.in" kind="src" path="resource"/>
diff --git a/.externalToolBuilders/CreateLocaleData.launch b/.externalToolBuilders/CreateLocaleData.launch
index ff11b3c79..0610d24a5 100644
--- a/.externalToolBuilders/CreateLocaleData.launch
+++ b/.externalToolBuilders/CreateLocaleData.launch
@@ -1,2 +1,12 @@
-<?xml version='1.0'?>
-<launchConfiguration type='org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType'><stringAttribute key='org.eclipse.debug.core.ATTR_REFRESH_SCOPE' value='${working_set:&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;launchConfigurationWorkingSet factoryID=&quot;org.eclipse.ui.internal.WorkingSetFactory&quot; name=&quot;working set&quot; editPageId=&quot;org.eclipse.ui.resourceWorkingSetPage&quot;&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/classpath/java/util&quot; type=&quot;2&quot;/&gt;&#10;&lt;/launchConfigurationWorkingSet&gt;}'/><stringAttribute key='org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS' value='full,incremental,'/><stringAttribute key='org.eclipse.ui.externaltools.ATTR_LOCATION' value='${system_path:make}'/><booleanAttribute key='org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED' value='true'/><stringAttribute key='org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY' value='${build_project}'/><stringAttribute key='org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS' value='-C ${build_project}/lib ../java/util/LocaleData.java'/><booleanAttribute key='org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND' value='false'/><booleanAttribute key='org.eclipse.debug.core.appendEnvironmentVariables' value='true'/></launchConfiguration> \ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
+<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_BUILD_SCOPE" value="${working_set:&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;launchConfigurationWorkingSet factoryID=&quot;org.eclipse.ui.internal.WorkingSetFactory&quot; name=&quot;workingSet&quot;&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/classpath/resource/gnu/java/locale&quot; type=&quot;2&quot;/&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/classpath/scripts/generate-locale-list.sh&quot; type=&quot;1&quot;/&gt;&#10;&lt;/launchConfigurationWorkingSet&gt;}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-C ${build_project}/lib ../gnu/java/locale/LocaleData.java"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,"/>
+<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;launchConfigurationWorkingSet editPageId=&quot;org.eclipse.ui.resourceWorkingSetPage&quot; factoryID=&quot;org.eclipse.ui.internal.WorkingSetFactory&quot; name=&quot;working set&quot;&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/classpath/gnu/java/locale&quot; type=&quot;2&quot;/&gt;&#10;&lt;/launchConfigurationWorkingSet&gt;}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${build_project}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${system_path:make}"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+</launchConfiguration>
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index e1373e63c..000000000
--- a/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Sep 20 12:53:19 MDT 2004
-eclipse.preferences.version=1
-encoding/ChangeLog=ISO-8859-1
diff --git a/ChangeLog b/ChangeLog
index 6134318bf..b63b3cbb3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6281 @@
+2006-05-08 Lillian Angel <langel@redhat.com>
+
+ * gnu/java/net/IndexListParser.java: New class.
+ * java/net/URLClassLoader.java
+ (JarURLLoader): Fixed code to use new class.
+
+2006-05-08 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JComboBox.java
+ (AccessibleJComboBox.getAccessibleChildrenCount): Implemented.
+ (AccessibleJComboBox.getAccessibleChild): Implemented.
+ (AccessibleJComboBox.getAccessibleSelection()): Implemented.
+ (AccessibleJComboBox.getAccessibleSelection(int)): Implemented.
+ (AccessibleJComboBox.isAccessibleChildSelected): Implemented.
+ (AccessibleJComboBox.getAccessibleAction): Implemented.
+ (AccessibleJComboBox.getAccessibleActionDescription): Implemented.
+ (AccessibleJComboBox.getAccessibleActionCount): Implemented.
+ (AccessibleJComboBox.doAccessibleAction): Implemented.
+ (AccessibleJComboBox.getAccessibleSelectionCount): Implemented.
+ (AccessibleJComboBox.addAccessibleSelection): Implemented.
+ (AccessibleJComboBox.removeAccessibleSelection): Implemented.
+ (AccessibleJComboBox.clearAccessibleSelection): Implemented.
+ (AccessibleJComboBox.selectAllAccessibleSelection): Implemented.
+
+2006-05-08 Thomas Fitzsimmons <fitzsim@redhat.com>
+
+ * configure.ac: Add support for building appletviewer.
+ * resource/gnu/classpath/tools/appletviewer/MessagesBundle.properties:
+ New file.
+ * resource/gnu/classpath/tools/appletviewer/MessagesBundle_de.properties:
+ New file.
+ * tools/appletviewer.c: New file.
+ * tools/appletviewer.in: New file.
+ * tools/gnu/classpath/tools/appletviewer/AppletClassLoader.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/AppletSecurityManager.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/AppletTag.java: New file.
+ * tools/gnu/classpath/tools/appletviewer/AppletWarning.java: New
+ file.
+ * tools/gnu/classpath/tools/appletviewer/CommonAppletContext.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/CommonAppletStub.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/ConsoleDialog.java: New
+ file.
+ * tools/gnu/classpath/tools/appletviewer/ErrorApplet.java: New
+ file.
+ * tools/gnu/classpath/tools/appletviewer/Main.java: New file.
+ * tools/gnu/classpath/tools/appletviewer/PluginAppletContext.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/PluginAppletViewer.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/PluginAppletWindow.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/StandaloneAppletContext.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/StandaloneAppletViewer.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/StandaloneAppletWindow.java:
+ New file.
+ * tools/gnu/classpath/tools/appletviewer/TagParser.java: New
+ file.
+
+2006-05-08 Tom Tromey <tromey@redhat.com>
+
+ * tools/gnu/classpath/tools/getopt/ClasspathToolParser.java: New file.
+ * tools/gnu/classpath/tools/jar/Action.java: New file.
+ * tools/gnu/classpath/tools/jar/Creator.java: New file.
+ * tools/gnu/classpath/tools/jar/Entry.java: New file.
+ * tools/gnu/classpath/tools/jar/Extractor.java: New file.
+ * tools/gnu/classpath/tools/jar/Lister.java: New file.
+ * tools/gnu/classpath/tools/jar/Main.java: New file.
+ * tools/gnu/classpath/tools/jar/Updater.java: New file.
+ * tools/gnu/classpath/tools/getopt/Option.java: New file.
+ * tools/gnu/classpath/tools/getopt/OptionException.java: New file.
+ * tools/gnu/classpath/tools/getopt/OptionGroup.java: New file.
+ * tools/gnu/classpath/tools/getopt/Parser.java: New file.
+ * tools/gnu/classpath/tools/getopt/FileArgumentCallback.java: New
+ file.
+
+2006-05-08 Lillian Angel <langel@redhat.com>
+
+ * java/net/URLClassLoader.java
+ (JarURLLoader): Added check to make sure the INDEX.LIST file
+ exists.
+
+2006-05-08 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/java2d/AbstractGraphics2D.java
+ (fill): Removed commented out code.
+ (fillShape): Also determine the outline of the clip and feed
+ it into the rendering method. Use new helper method for
+ converting the shapes into lists of segments.
+ (getUserBounds): Removed obsolete method.
+ (rawFillShape): Respect the clip when rendering shapes.
+ (fillShapeAntialias): Adjusted signature for new clipped rendering.
+ However, the implementation can't clip still.
+ (getSegments): New helper method for converting a shape into
+ a list of segments.
+ (clipShape): Removed obsolete method.
+ * gnu/java/awt/java2d/PolyEdge.java
+ (isClip): New field.
+ (PolyEdge): Added isField argument to constructor.
+
+2006-05-08 Roman Kennke <kennke@aicas.com>
+
+ PR 27481
+ * javax/swing/JRootPane.java
+ (createContentPane): Set background of the content pane to null,
+ so that the content pane inherits its background from the
+ root pane.
+
+2006-05-08 Roman Kennke <kennke@aicas.com>
+
+ PR 27480
+ * javax/swing/ButtonGroup.java
+ (add): Check if new button is selected and if so, deselect other
+ buttons in the group.
+
+2006-05-08 Lillian Angel <langel@redhat.com>
+
+ PR 27444
+ * java/net/URLClassLoader.java
+ (JarURLLoader): Added code to go through
+ META-INF/INDEX.LIST file to load all jars listed.
+
+2006-05-08 Roman Kennke <kennke@aicas.com>
+
+ PR 27461
+ * javax/swing/ImageIcon.java
+ (ImageIcon(URL)): Set description to URL.toString().
+
+2006-05-08 Roman Kennke <kennke@aicas.com>
+
+ PR 27482
+ * javax/swing/JTable.java
+ (IconCellRenderer.getTableCellRendererComponent): Set icon to
+ null when cell value is null.
+
+2006-05-08 Roman Kennke <kennke@aicas.com>
+
+ PR 27484
+ * javax/swing/DefaultDesktopManager.java
+ (closeFrame): Don't perform default close action on the frame
+ to prevent endless loop.
+
+2006-05-08 Roman Kennke <kennke@aicas.com>
+
+ PR 27485
+ * javax/swing/table/DefaultTableModel.java
+ (addExtraRows): New helper method.
+ (checkSize): New helper method.
+ (setRowCount): Use addExtraRows helper method.
+ (addColumn): Use addExtraRows helper method.
+ (getColumnName): Check and adjust size if necessary using
+ checkSize().
+
+2006-05-08 Roman Kennke <kennke@aicas.com>
+
+ PR 27486
+ * javax/swing/JTable.java
+ (setValueAt): Allow setting values even when table is editable.
+
+2006-05-08 Tom Tromey <tromey@redhat.com>
+
+ * java/text/SimpleDateFormat.java (compileFormat): Added missing
+ space to error message.
+
+2006-05-08 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/AbstractButton.java: Fixed comment typos.
+
+2006-05-07 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ PR classpath/27435:
+ * java/util/zip/DeflaterEngine.java:
+ (deflateFast(boolean,boolean)): Empty buffer when full.
+
+2006-05-07 Sven de Marothy <sven@physto.se>
+
+ Fixed PR27343
+ * java/util/Calendar.java (setTimeZone): Force recalculation.
+
+2006-05-07 Sven de Marothy <sven@physto.se>
+
+ Fixed PR27463
+ * javax/swing/plaf/metal/MetalInternalFrameTitlePane.java
+ (propertyChange): Handle FRAME_ICON_PROPERTY property.
+
+2006-05-07 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ PR classpath/27311:
+ * gnu/java/text/StringFormatBuffer.java:
+ (toString()): Implemented so we can see the contents.
+ * java/text/DecimalFormat.java:
+ (formatInternal(double,StringFormatBuffer,FieldPosition)):
+ Don't calculate the exponent when the number is 0 or less.
+ Also, use log10 instead of log now it's available.
+
+2006-05-07 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * gnu/javax/crypto/keyring/PrimitiveEntry.java (PrimitiveEntry):
+ Use instance's field creationDate not the constructor's argument.
+ * gnu/javax/crypto/keyring/PasswordEncryptedEntry.java:
+ Removed unused imports.
+ Sorted imports.
+ (log): New field.
+ (decrypt): Added trace/debug/timing statements.
+ (encrypt): Likewise.
+ Use PRNG instead of instantiating every time a new SecureRandom.
+ * gnu/javax/crypto/keyring/PasswordAuthenticatedEntry.java:
+ Removed unused imports.
+ Sorted imports.
+ (log): New field.
+ (verify): Added trace/debug/timing statements.
+ (authenticate): Likewise.
+ Use PRNG instead of instantiating every time a new SecureRandom.
+
+2006-05-07 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * gnu/classpath/debug/Simple1LineFormatter.java (DAT_FORMAT): Removed.
+ (THREAD_FORMAT): Likewise.
+ (dateFormat): Added field.
+ (threadFormat): Added field.
+ (format): Initialize instance fields if null.
+ Use StringBuilder instead of StringBuffer.
+
+2006-05-07 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/java2d/RasterGraphics.java: New file.
+
+2006-05-07 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/java2d/AbstractGraphics2D.java
+ (fillShape): Determine user space bounds of shape and feed them
+ into the actual rendering pipeline.
+ (rawSetPixel): Made non-abstract for now. Maybe remove later.
+ (rawSetForeground): Likewise.
+ (getDestinationColorModel): Removed.
+ (getDeviceBounds): Made non-abstract. Provide useful default impl.
+ (rawFillShape): Handle paint context.
+ (fillScanline): Implement painting and compositing.
+ (fillShapeAntialias): Handle paint context.
+ (fillScanlineAA): Implemented preliminary antialiasing based on
+ composite context. Not working yet.
+ (fillScanlineAlpha): Removed.
+ (init): Fetch destination raster.
+ (getDestinationRaster): New abstract method.
+ (updateRaster): New backend method.
+
+2006-05-07 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/java2d/AlphaCompositeContext.java
+ (compose): Fixed loops, conditions and logic to make compositing
+ work correctly.
+
+2006-05-07 Roman Kennke <kennke@aicas.com>
+
+ * java/awt/ColorPaintContext.java
+ (ColorPaintContext): Fixed filling of the raster.
+
+2006-05-07 Sven de Marothy <sven@physto.se>
+
+ Fixed PR27455
+ * gnu/java/awt/peer/GLightweightPeer.java (mouseEntered): Remove.
+ * java/awt/Component.java (processMouseEvent):
+ Do lightweight cursor handling.
+ * javax/swing/plaf/basic/BasicTableHeaderUI.java
+ (endResizing,mouseMoved): Save and reset original cursor, not the
+ default one.
+
+2006-05-07 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ PR 27298
+ * javax/swing/plaf/basic/BasicTreeUI.java (NodeDimensionsHandler.
+ getNodeDimensions): Mind the size of the node icon. (getRowX):
+ use totalChildIndent. (TreeExpansionHandler): Set maximal height
+ to zero on events. (nullIcon): New field. (getCurrentControlIcon):
+ Return nullIcon if there is no other icon. (getNodeIcon): New method.
+ (installDefaults): assign totalChildIndent. (installUI): Call
+ updateExpandedDescendants. (paintHorizontalPartOfLeg): Rewritten.
+ (paintRow): Rewritten. (updateRenderer): Do not set the renderer for
+ the tree.
+
+2006-05-06 Sven de Marothy <sven@physto.se>
+
+ Fixed PR27454
+ * gnu/java/awt/peer/gtk/GtkImage: (drawPixels,drawPixelsScaled):
+ Check for zero image sizes.
+
+2006-05-06 Olivier Jolly <olivier.jolly@pcedev.com>
+
+ Fixed PR27362
+ * java/util/Calendar.java (clear(int)): Forced internal state
+ completion before performing a field clearing.
+
+2006-05-06 Olivier Jolly <olivier.jolly@pcedev.com>
+
+ * java/util/Collections.java(UnmodifiableMap.UnmodifiableEntrySet.
+ UnmodifiableMapEntry): New Map.Entry implementation which is immutable.
+ (UnmodifiableMap.UnmodifiableEntrySet.iterator,
+ UnmodifiableMap.UnmodifiableEntrySet.toArray,
+ UnmodifiableMap.UnmodifiableEntrySet.toArray(Object[])): Used
+ UnmodifiableMapEntry as part of their return value.
+
+2006-05-06 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/keytool.sh.in: Removed (renamed to keytool.in).
+ * tools/jarsigner.in: Removed (renamed to jarsigner.in).
+ * tools/Makefile.am: Include jarsigner and keytool classes in tools.zip.
+ Generate jarsigner and keytool scripts.
+ * tools/keytool.in: New file (renamed from keytool.sh.in).
+ * tools/jarsigner.in: New file (renamed from jarsigner.sh.in).
+ * tools/.cvsignore: Replaced *.sh with *
+ * configure.ac: Replaced tools/*.sh with tools/*.
+
+2006-05-05 Roman Kennke <kennke@aicas.com>
+
+ * java/awt/image/ColorModel.java
+ (getNormalizedComponents): Implemented.
+
+2006-05-05 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicRadioButtonUI.java
+ (paint): Query the button model for it's state, not the
+ button itself.
+
+2006-05-05 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JTable.java
+ (tableChanged): Sync selection model with table model changes.
+
+2006-05-05 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicTreeUI.java (paint): Return early
+ if there are no visible nodes to paint.
+
+2006-05-05 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JOptionPane.java: API doc updates.
+
+2006-05-05 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JToolBar.java
+ (paramString): Reimplemented.
+
+2006-05-05 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JScrollBar.java
+ (paramString): Reimplemented.
+
+2006-05-04 Tom Tromey <tromey@redhat.com>
+
+ PR classpath/27375:
+ * java/util/zip/ZipFile.java (entries): Now a LinkedHashMap.
+ (readEntries): Updated.
+ (getEntries): Likewise.
+ (getEntry): Likewise.
+ (getInputStream): Likewise.
+
+2006-05-04 Thomas Fitzsimmons <fitzsim@redhat.com>
+
+ * gnu/javax/imageio/jpeg/DCT.java,
+ gnu/javax/imageio/jpeg/HuffmanTable.java,
+ gnu/javax/imageio/jpeg/JPEGComponent.java,
+ gnu/javax/imageio/jpeg/JPEGDecoder.java,
+ gnu/javax/imageio/jpeg/JPEGException.java,
+ gnu/javax/imageio/jpeg/JPEGFrame.java,
+ gnu/javax/imageio/jpeg/JPEGImageInputStream.java,
+ gnu/javax/imageio/jpeg/JPEGImageReader.java,
+ gnu/javax/imageio/jpeg/JPEGImageReaderSpi.java,
+ gnu/javax/imageio/jpeg/JPEGMarker.java,
+ gnu/javax/imageio/jpeg/JPEGMarkerFoundException.java,
+ gnu/javax/imageio/jpeg/JPEGScan.java,
+ gnu/javax/imageio/jpeg/YCbCr_ColorSpace.java,
+ gnu/javax/imageio/jpeg/ZigZag.java: New files.
+
+2006-05-04 Lillian Angel <langel@redhat.com>
+
+ * javax/swing/JLabel.java
+ (JLabel): Pass in an empty string for the text parameter.
+ (JLabel): Likewise.
+ (JLabel): Likewise.
+
+2006-05-04 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicButtonListener.java
+ (mouseEntered): Fixed conditions for changing states.
+
+2006-05-04 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JOptionPane.java
+ (AccessibleJOptionPane.getAccessibleRole): Implemented method.
+
+2006-05-04 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JLabel.java
+ (AccessibleJLabel.getSelectedText): Return null instead of "".
+ (AccessibleJLabel.getSelectionStart): Added comment why
+ return -1 is correct here.
+ (AccessibleJLabel.getSelectionEnd): Added comment why
+ return -1 is correct here.
+ (AccessibleJLabel.getCharacterAttribute): Added comment about what
+ to do here.
+ (AccessibleJLabel.getCharCount): Added comment about what
+ to do here.
+ (AccessibleJLabel.getCharacterBounds): Tagged as not implemented.
+ (AccessibleJLabel.getIndexAtPoint): Tagged as not implemented.
+ (paramString): Return super.paramString() here, this provides
+ a more meaningful output.
+
+2006-05-04 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JComponent.java
+ (paint): Added null check to avoid NPE when clip == null.
+
+2006-05-04 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/AbstractButton.java
+ (addImpl): New method. Installs an OverlayLayout if no
+ other layout has been installed before.
+ (setLayout): New method. Detect if a client app installs a custom
+ layout.
+
+2006-05-04 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/table/DefaultTableCellRenderer.java
+ (noFocusBorder): Fixed width of empty border to 1.
+ (getTableCellRendererComponent): Don't change the colors for
+ focuses cells. Fixed border for focused cells.
+
+2006-05-04 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JTable.java
+ (moveToCellBeingEdited): Adjust bounding box of editing component
+ to exactly cover the grid.
+ * javax/swing/plaf/basic/BasicTableUI.java
+ (paint): Paint grid to the bottom and right of the cells instead
+ of left and top. Adjust bounding box of cells accordingly.
+ * javax/swing/plaf/metal/MetalLookAndFeel.java
+ (initComponentDefaults): Fixed color of JTable selection border.
+ * javax/swing/plaf/metal/OceanTheme.java
+ (addCustomEntriesToTable): Fixed color of JTable selection border.
+
+2006-05-04 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/keytool/ExportCmd.java (setup):
+ Use _alias instead of alias.
+
+2006-05-03 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * configure.ac:
+ Set version to 0.92-pre.
+ * NEWS:
+ Add space for 0.92 entries.
+
+2006-05-03 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * include/Makefile.am:
+ Added rules for gnu.java.net.local.LocalSocketImpl.h
+ * include/java_lang_VMSystem.h:
+ Regenerated correctly.
+
+2006-05-03 Sven de Marothy <sven@physto.se>
+
+ PR 24023, 24701
+ * java/awt/Image.java:
+ (getScaledInstance): Default to AreaAveraging for "smooth",
+ don't thrown an error on illegal flag values.
+ * java/awt/image/AreaAveragingScaleFilter.java: Implement.
+
+2006-05-03 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/FieldView.java:
+ (adjustAllocation): Added if-block to return null when shape argument
+ is null.
+ * javax/swing/text/PlainView.java:
+ (updateDamage): Added if-block to return early if a is null.
+
+2006-05-03 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/plaf/basic/BasicTextUI.java:
+ (changeUpdate): Added note.
+ (removeUpdate): Dito.
+ (insertUpdate): Dito.
+ (damageRange): Added if-block to return early.
+ (modelToView): Added check of getVisibleEditorRect's return value.
+ (getVisibleEditorRect): Return null instead of empty rectangle.
+ * javax/swing/text/DefaultCaret.java:
+ (clearHighlight): Removed if-clause to create a highlight entry if it
+ did not exist before.
+ * javax/swing/text/WrappedPlainView.java:
+ (WrappedLine.modelToView): Throw exception if allocation area is empty,
+ removed 2nd part of if-expression.
+ (WrappedLine.updateDamage): Added more documentation, added check
+ whether allocation area rectangle is null.
+
+2006-05-03 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JSplitPane.java (setDividerLocation(int)):
+ Reset to preferred sizes if the argument is negative.
+
+2006-05-03 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JList.java: Added/updated API docs.
+
+2006-05-03 Lillian Angel <langel@redhat.com>
+
+ * javax/swing/JComponent.java
+ (getRoot): New private function. Gets the root appropriate
+ for painting. If an applet exists as a parent, then it is returned.
+ (paintDoubleBuffered): Changed to use new function.
+ * javax/swing/RepaintManager.java
+ (getRoot): New private function. Gets the root appropriate
+ for painting. If an applet exists as a parent, then it is returned.
+ (getOffscreenBuffer): Changed to use new function.
+ * javax/swing/SwingUtilties.java
+ (getRoot): Reverted last patch to return Window, even if
+ an Applet exists.
+
+2006-05-03 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * gnu/javax/crypto/jce/keyring/GnuKeyring.java: Re-implemented using
+ a pair of one public keyring and one private keyring.
+ * gnu/javax/crypto/keyring/GnuPublicKeyring.java (log): New field.
+ (containsCertificate): Added logging.
+ (getCertificate): Likewise.
+ (putCertificate): Likewsie.
+ (load): Likewise.
+ (store): Likewise.
+ * gnu/javax/crypto/keyring/GnuPrivateKeyring.java (log): New field.
+ (containsPrivateKey): Added logging.
+ (getPrivateKey): Likewise.
+ (putPrivateKey): Likewise.
+ (containsPublicKey): Likewise.
+ (getPublicKey): Likewise.
+ (putPublicKey): Likewise.
+ (containsCertPath): Likewise.
+ (getCertPath): Likewise.
+ (putCertPath): Likewise.
+ (load): Likewise.
+ (store): Likewise.
+
+2006-05-03 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/java2d/AlphaCompositeContext.java: New class.
+ * java/awt/AlphaComposite.java
+ (createContext): Implemented.
+
+2006-05-03 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/java/awt/peer/gtk/GdkGraphics2D.java (drawRaster):
+ Set the current color again after drawing the raster.
+
+2006-05-03 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/text/WrappedPlainView.java (WrappedLine.modelToView):
+ Do not check pos < currLineEnd if currLineStart == currLineEnd.
+
+2006-05-03 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/keytool/Command.java (getCallbackHandler):
+ Assign returned value to field handler.
+ * tools/gnu/classpath/tools/jarsigner/Main.java (getCallbackHandler):
+ Likewise.
+
+2006-05-02 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/ScrollPaneLayout.java (layoutContainer):
+ Return without action if there is no view in the viewport.
+ * javax/swing/text/WrappedPlainView.java
+ (WrappedLine.getPreferredSpan): If metrics == null, update
+ metrics.
+ * javax/swing/tree/DefaultTreeModel.java (constructors):
+ Do not call setRoot, assign the root node directly.
+
+2006-05-02 Lillian Angel <langel@redhat.com>
+
+ * javax/swing/SwingUtilities.java
+ (getRoot): Should return the Applet if it exists.
+ Only return the Window if an Applet has not been
+ encountered.
+
+2006-05-02 Lillian Angel <langel@redhat.com>
+
+ * gnu/javax/swing/text/html/parser/support/Parser.java
+ (readAttributes): Reverted Audrius' last patch. There is
+ a slight difference in code between the NUMTOKEN and SLASH case.
+
+2006-05-02 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/JTextComponent.java:
+ (setText): Throw InternalError from catch-block.
+ * javax/swing/text/GapContent.java:
+ (removed): Removed if-expression, changed '>' to '>='.
+
+2006-05-02 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/java2d/AbstractGraphics2D.java
+ (AA_SAMPLING): New constant.
+ (alpha): New field. Used in the antialiasing renderer.
+ (edgeTable): New field. Used in the antialiasing renderer.
+ (AbstractGraphics2D): Initialize rendering hints wrt
+ anti-aliasing.
+ (draw): Clip after stroking. Commented out clipping for now,
+ it seems to be buggy.
+ (fill): Commented out clipping for now, it seems to be buggy.
+ (setComposite): Don't create composite context.
+ (setPaint): Only change paint when parameter is not null.
+ (translate): Call setClip() so subclasses can update their clip
+ too.
+ (clip): Call setClip() so subclasses can update their clip
+ too.
+ (drawGlyphVector): Added clipping, but left it commented out
+ because it's buggy.
+ (getClipBounds): Returns null when clip is null.
+ (drawLine): Call rawDrawLine with translation applied.
+ (filLRect): Call rawFillRect with translation applied.
+ (fillShape): Added support for anti-aliasing.
+ (rawSetForeground(int,int,int)): New method.
+ (rawFillShape): A couple of painting fixes.
+ (fillScanline): Implemented to call rawDrawLine.
+ (fillShapeAntialias): New method. Implements an anti-aliasing
+ shape filler.
+ (fillScanlineAA): New method. Used for the anti-aliasing
+ shape filler.
+ (fillScanlineAlpha): New method. Used for the anti-aliasing
+ shape filler.
+ (init): Initialize clip with the device bounds.
+ (updateOptimization): Fixed the optimization condition.
+
+2006-05-02 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/GapContent.java:
+ (GapContent): Restrict size argument by 2.
+ (insertString): Changed expression from >= to >.
+ (remove): Changed right side of expression to 'length - 1', changed
+ exception message.
+ (getChars): Throw exception if where below 0.
+ (replace): Replaced call to setPositionsInRange() with
+ resetMarksAtZero(), removed note.
+
+2006-05-02 Roman Kennke <kennke@aicas.com>
+
+ PR 27326
+ * javax/swing/MenuSelectionManager.java
+ (setSelectedPath): Rewritten.
+
+2006-05-02 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/javax/swing/text/html/parser/support/Parser.java
+ (readAttributes): Merge case NUMTOKEN: and case SLASH:
+ sections.
+
+2006-05-02 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/.cvsignore: Added keytool.sh.
+ * configure.ac: Added tools/keytool.sh to AC_CONFIG_FILES.
+
+2006-05-02 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * doc/tools.texinfo: New file.
+ * doc/Makefile.am: Generate tools documentation.
+
+2006-05-02 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/keytool.sh.in: New file.
+ * tools/gnu/classpath/tools/keytool/CertReqCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/Command.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/DeleteCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/ExportCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/GenKeyCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/IdentityDBCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/ImportCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/KeyCloneCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/KeyPasswdCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/ListCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/Main.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/Messages.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/PrintCertCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/SelfCertCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/StorePasswdCmd.java: Likewise.
+ * tools/gnu/classpath/tools/keytool/keytool.txt: Likewise.
+ * tools/gnu/classpath/tools/keytool/package.html: Likewise.
+ * resource/gnu/classpath/tools/keytool/MessageBundle.properties: Likewise.
+
+2006-05-02 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/jarsigner/jarsigner.txt: Re-arranged to
+ resemble more closely man-page style text.
+ * tools/gnu/classpath/tools/jarsigner/SFHelper.java:
+ Mark (Eclipse) strings that need not be externalised.
+ (writeSF): Likewise.
+ (writeDSA): Likewise.
+ Use package-private Messages class to provide i18n-ready strings.
+ (startSigning):
+ Use package-private Messages class to provide i18n-ready strings.
+ (updateEntry): Likewise.
+ Mark (Eclipse) strings that need not be externalised.
+ (finishSigning): Likewise.
+ * tools/gnu/classpath/tools/jarsigner/Main.java:
+ Mark (Eclipse) strings that need not be externalised.
+ (main): Do not use constant strings as class name.
+ Use package-private Messages class to provide i18n-ready strings.
+ Reduced logging level so INFO becomes FINER, and WARNING becomes FINE.
+ (processArgs): Do not use constant strings as class name.
+ Mark (Eclipse) strings that need not be externalised.
+ Reduced logging level so INFO becomes FINER, and WARNING becomes FINE.
+ (start): Do not use constant strings as class name.
+ (teardown): Likewise.
+ Use ProviderUtil.
+ (setupCommonParams): Do not use constant strings as class name.
+ Use package-private Messages class to provide i18n-ready strings.
+ Reduced logging level so INFO becomes FINER, and WARNING becomes FINE.
+ (installNewProvider): Do not use constant strings as class name.
+ Use ProviderUtil.
+ (setupSigningParams): Do not use constant strings as class name.
+ Use package-private Messages class to provide i18n-ready strings.
+ Mark (Eclipse) strings that need not be externalised.
+ (getCallbackHandler): Use CallbackUtil.
+ * tools/gnu/classpath/tools/jarsigner/JarSigner.java (start):
+ Use package-private Messages class to provide i18n-ready strings.
+ Reduced logging level so INFO becomes FINER, and WARNING becomes FINE.
+ * tools/gnu/classpath/tools/jarsigner/JarVerifier.java (start): Likewise.
+ (verifySF): Likewise.
+ (verifySFEntries): Do not use constant strings as class name.
+ Use Boolean.valueOf instead of new Boolean().
+ (verifySFEntry): Mark (Eclipse) strings that need not be externalised.
+ * resource/gnu/classpath/tools/jarsigner/MessageBundle.properties:
+ New file.
+ * tools/gnu/classpath/tools/jarsigner/package.html: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/Messages.java: Likewise.
+
+2006-05-02 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/common/CallbackUtil.java: New file.
+ * tools/gnu/classpath/tools/common/ProviderUtil.java: Likewise.
+ * tools/gnu/classpath/tools/common/SecurityProviderInfo.java: Likewise.
+
+2006-05-01 Tom Tromey <tromey@redhat.com>
+
+ * java/nio/ByteBufferImpl.java (compact): Don't reset position
+ in empty case.
+ * gnu/java/nio/ChannelReader.java (read): Synchronize.
+ (close): Synchronize.
+ * java/nio/ShortBufferImpl.java (compact): Rewrote.
+ * java/nio/LongBufferImpl.java (compact): Rewrote.
+ * java/nio/IntBufferImpl.java (compact): Rewrote.
+ * java/nio/FloatBufferImpl.java (compact): Rewrote.
+ * java/nio/DoubleBufferImpl.java (compact): Rewrote.
+ * java/nio/CharBufferImpl.java (compact): Rewrote.
+ * gnu/java/nio/ChannelWriter.java: New file.
+ * java/nio/channels/Channels.java (newWriter): Implemented.
+
+2006-05-01 Lillian Angel <langel@redhat.com>
+
+ * java/util/SimpleTimeZone.java
+ (SimpleTimeZone): Do not throw exception if startMonth == endMonth.
+ (SimpleTimeZone): Likewise.
+ (checkRule): Rewritten to properly check all values (more efficently).
+ This code is now more stable, at least less buggy than before. Fixed
+ API documentation.
+ (setStartRule): Moved checkRule call to end.
+ (setStartRule): Likewise.
+ (setEndRule): Likewise.
+ (setEndRule): Likewise.
+
+2006-05-01 Tom Tromey <tromey@redhat.com>
+
+ * lib/.cvsignore: Added classes.2.
+
+2006-05-01 Tom Tromey <tromey@redhat.com>
+
+ * java/util/jar/JarFile.java (provider): Now package-private.
+ * java/lang/Enum.java (compareTo): Javadoc fix.
+ * java/lang/Boolean.java (compareTo): Javadoc fix.
+
+2006-05-01 Lillian Angel <langel@redhat.com>
+
+ * gnu/javax/swing/text/html/parser/support/Parser.java
+ (readAttributes): Formatted function. Added handling for
+ SLASH token. The value of an attribute may start with a slash
+ (i.e. a path). I added handling similar to to the NUMTOKEN code.
+ We should not be skipping over these type of attributes.
+
+2006-04-30 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * include/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.h,
+ * include/gnu_java_awt_peer_gtk_GdkFontPeer.h,
+ * include/gnu_java_awt_peer_gtk_GdkGraphics.h,
+ * include/gnu_java_awt_peer_gtk_GdkGraphics2D.h,
+ * include/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h,
+ * include/gnu_java_awt_peer_gtk_GdkPixbufDecoder.h,
+ * include/gnu_java_awt_peer_gtk_GdkRobotPeer.h,
+ * include/gnu_java_awt_peer_gtk_GdkTextLayout.h,
+ * include/gnu_java_awt_peer_gtk_GtkButtonPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkCanvasPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkCheckboxPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkChoicePeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkClipboard.h,
+ * include/gnu_java_awt_peer_gtk_GtkComponentPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkFileDialogPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkFramePeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkGenericPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkImage.h,
+ * include/gnu_java_awt_peer_gtk_GtkLabelPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkListPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkMenuBarPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkMenuItemPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkMenuPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkPanelPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkScrollPanePeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkSelection.h,
+ * include/gnu_java_awt_peer_gtk_GtkTextAreaPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkToolkit.h,
+ * include/gnu_java_awt_peer_gtk_GtkWindowPeer.h,
+ * include/gnu_java_awt_peer_qt_MainQtThread.h,
+ * include/gnu_java_awt_peer_qt_QMatrix.h,
+ * include/gnu_java_awt_peer_qt_QPainterPath.h,
+ * include/gnu_java_awt_peer_qt_QPen.h,
+ * include/gnu_java_awt_peer_qt_QtAudioClip.h,
+ * include/gnu_java_awt_peer_qt_QtButtonPeer.h,
+ * include/gnu_java_awt_peer_qt_QtCanvasPeer.h,
+ * include/gnu_java_awt_peer_qt_QtCheckboxPeer.h,
+ * include/gnu_java_awt_peer_qt_QtChoicePeer.h,
+ * include/gnu_java_awt_peer_qt_QtComponentPeer.h,
+ * include/gnu_java_awt_peer_qt_QtContainerPeer.h,
+ * include/gnu_java_awt_peer_qt_QtDialogPeer.h,
+ * include/gnu_java_awt_peer_qt_QtEmbeddedWindowPeer.h,
+ * include/gnu_java_awt_peer_qt_QtFileDialogPeer.h,
+ * include/gnu_java_awt_peer_qt_QtFontMetrics.h,
+ * include/gnu_java_awt_peer_qt_QtFontPeer.h,
+ * include/gnu_java_awt_peer_qt_QtFramePeer.h,
+ * include/gnu_java_awt_peer_qt_QtGraphics.h,
+ * include/gnu_java_awt_peer_qt_QtGraphicsEnvironment.h,
+ * include/gnu_java_awt_peer_qt_QtImage.h,
+ * include/gnu_java_awt_peer_qt_QtLabelPeer.h,
+ * include/gnu_java_awt_peer_qt_QtListPeer.h,
+ * include/gnu_java_awt_peer_qt_QtMenuBarPeer.h,
+ * include/gnu_java_awt_peer_qt_QtMenuComponentPeer.h,
+ * include/gnu_java_awt_peer_qt_QtMenuItemPeer.h,
+ * include/gnu_java_awt_peer_qt_QtMenuPeer.h,
+ * include/gnu_java_awt_peer_qt_QtPanelPeer.h,
+ * include/gnu_java_awt_peer_qt_QtPopupMenuPeer.h,
+ * include/gnu_java_awt_peer_qt_QtScreenDevice.h,
+ * include/gnu_java_awt_peer_qt_QtScrollPanePeer.h,
+ * include/gnu_java_awt_peer_qt_QtScrollbarPeer.h,
+ * include/gnu_java_awt_peer_qt_QtTextAreaPeer.h,
+ * include/gnu_java_awt_peer_qt_QtTextFieldPeer.h,
+ * include/gnu_java_awt_peer_qt_QtToolkit.h,
+ * include/gnu_java_awt_peer_qt_QtVolatileImage.h,
+ * include/gnu_java_awt_peer_qt_QtWindowPeer.h,
+ * include/gnu_javax_sound_midi_alsa_AlsaMidiDeviceProvider.h,
+ * include/gnu_javax_sound_midi_alsa_AlsaMidiSequencerDevice.h,
+ * include/gnu_javax_sound_midi_alsa_AlsaPortDevice.h,
+ * include/gnu_javax_sound_midi_dssi_DSSIMidiDeviceProvider.h,
+ * include/gnu_javax_sound_midi_dssi_DSSISynthesizer.h,
+ * include/gnu_xml_libxmlj_dom_GnomeAttr.h,
+ * include/gnu_xml_libxmlj_dom_GnomeDocument.h,
+ * include/gnu_xml_libxmlj_dom_GnomeDocumentBuilder.h,
+ * include/gnu_xml_libxmlj_dom_GnomeDocumentType.h,
+ * include/gnu_xml_libxmlj_dom_GnomeElement.h,
+ * include/gnu_xml_libxmlj_dom_GnomeEntity.h,
+ * include/gnu_xml_libxmlj_dom_GnomeNamedNodeMap.h,
+ * include/gnu_xml_libxmlj_dom_GnomeNode.h,
+ * include/gnu_xml_libxmlj_dom_GnomeNodeList.h,
+ * include/gnu_xml_libxmlj_dom_GnomeNotation.h,
+ * include/gnu_xml_libxmlj_dom_GnomeProcessingInstruction.h,
+ * include/gnu_xml_libxmlj_dom_GnomeTypeInfo.h,
+ * include/gnu_xml_libxmlj_dom_GnomeXPathExpression.h,
+ * include/gnu_xml_libxmlj_dom_GnomeXPathNSResolver.h,
+ * include/gnu_xml_libxmlj_dom_GnomeXPathNodeList.h,
+ * include/gnu_xml_libxmlj_dom_GnomeXPathResult.h,
+ * include/gnu_xml_libxmlj_sax_GnomeLocator.h,
+ * include/gnu_xml_libxmlj_sax_GnomeXMLReader.h,
+ * include/gnu_xml_libxmlj_transform_GnomeTransformer.h,
+ * include/gnu_xml_libxmlj_transform_GnomeTransformerFactory.h,
+ * include/java_lang_VMProcess.h:
+ Regenerated.
+ * native/jni/java-lang/java_lang_VMProcess.c:
+ Redirect when pipe_count is 2 not 3.
+
+2006-04-30 Sascha Brawer <sascha@brawer.ch>
+
+ * gnu/java/awt/font/FontDelegate.java,
+ * gnu/java/awt/font/FontFactory.java,
+ * gnu/java/awt/font/GNUGlyphVector.java,
+ * gnu/java/awt/font/opentype/CharGlyphMap.java,
+ * gnu/java/awt/font/opentype/GlyphNamer.java,
+ * gnu/java/awt/font/opentype/MacResourceFork.java,
+ * gnu/java/awt/font/opentype/NameDecoder.java,
+ * gnu/java/awt/font/opentype/OpenTypeFont.java,
+ * gnu/java/awt/font/opentype/OpenTypeFontFactory.java,
+ * gnu/java/awt/font/opentype/Scaler.java,
+ * gnu/java/awt/font/opentype/truetype/Fixed.java,
+ * gnu/java/awt/font/opentype/truetype/GlyphLoader.java,
+ * gnu/java/awt/font/opentype/truetype/GlyphLocator.java,
+ * gnu/java/awt/font/opentype/truetype/GlyphMeasurer.java,
+ * gnu/java/awt/font/opentype/truetype/TrueTypeScaler.java,
+ * gnu/java/awt/font/opentype/truetype/VirtualMachine.java,
+ * gnu/java/awt/font/opentype/truetype/Zone.java,
+ * gnu/java/awt/font/opentype/truetype/ZonePathIterator.java,
+ * gnu/java/awt/font/opentype/truetype/doc-files/ZonePathIterator-1.dia,
+ * gnu/java/awt/font/opentype/truetype/doc-files/ZonePathIterator-1.png:
+ New files. Imported font framework from:
+ http://www.brawer.ch/software/fonts/
+
+2006-04-30 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (lastTabInRun): Fix calculation of the last tab in a run. This
+ has caused painting problems sometimes, making the
+ last tab painted incorrectly.
+
+2006-04-30 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ PR 27297
+ * javax/swing/JComponent.java (paintChildrenWithOverlap):
+ Use for and not while to prevent the endless loop.
+
+2006-04-29 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JList.java
+ (paramString): Changed from public to protected.
+
+2006-04-29 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/HelpPrinter.java (printHelp): New method.
+ (printHelpAndExit): Re-factored to use the above method.
+
+2006-04-29 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/jarsigner.sh.in: Changed license to GPL + Exception.
+ Use -Xbootclasspath/p instead of -cp when invoking the main class.
+ * tools/gnu/classpath/tools/jarsigner/Main.java:
+ Changed license to GPL + Exception.
+ (handler): New field.
+ (getCallbackHandler): New method.
+ (setupSigningParams): Use above method.
+ * tools/gnu/classpath/tools/jarsigner/HashUtils.java:
+ Changed license to GPL + Exception.
+ * tools/gnu/classpath/tools/jarsigner/SFHelper.java: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/JarVerifier.java: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/JarSigner.java: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/jarsigner.txt: Updated copyright.
+
+2006-04-29 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * gnu/javax/security/auth/callback/ConsoleCallbackHandler.java
+ (handleConfirmation): Use print instead of println.
+ (handleConfirmation): When case is YES_NO_OPTION, print default option
+ if one was set.
+ (handleLanguage): Use print instead of println.
+
+2006-04-29 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * gnu/java/security/x509/X500DistinguishedName.java: Updated copyright.
+ (putComponent): Handle O and OU components.
+ (getDer): Use correct (it2) iterator.
+ (readAttributeValue): Read next character and break if end-of-stream.
+
+2006-04-29 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * gnu/java/security/provider/Gnu.java (run):
+ Add "RSA" as an alias to MD5withRSA.
+ * gnu/java/security/key/rsa/RSAKeyPairX509Codec.java (encodePublicKey):
+ Always encode a NULL as the value of an algorithm parameters field.
+ * gnu/java/security/key/rsa/RSAKeyPairPKCS8Codec.java (log): New field.
+ (encodePrivateKey): Added trace/log statements.
+ (decodePrivateKey): Likewise.
+ * gnu/java/security/key/rsa/RSAKeyPairGenerator.java (log): New field.
+ (setup): Added trace/log statements.
+ (generate): Likewise.
+ * gnu/java/security/key/rsa/GnuRSAPublicKey.java (str): New field.
+ (toString): New method.
+ * gnu/java/security/key/rsa/GnuRSAPrivateKey.java (DEBUG): New constant.
+ (str): New field.
+ (toString): New method.
+ * gnu/java/security/key/rsa/GnuRSAKey.java (str): New field.
+ (getEncoded): Use defaultFormat.
+ (toString): New method.
+ * gnu/java/security/key/dss/DSSKey.java (toString):
+ Include defaultFormat in string.
+ * gnu/java/security/jce/sig/RSAKeyFactory.java (engineGeneratePublic):
+ Break if successfully decoded public key.
+ (engineGeneratePrivate): Break if successfully decoded private key.
+
+2006-04-29 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * java/security/Security.java <clinit>: Add our Callback provider.
+ * resource/java/security/classpath.security: Likewise
+
+2006-04-28 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ PR 27296
+ * javax/swing/ScrollPaneLayout.java (layoutContainer):
+ Decide about scroll bars from the preferred view size, not
+ the current size.
+ * javax/swing/ViewportLayout.java (layoutContainer):
+ Do not change returned preferred size. Do not treat JScrollPane
+ specially.
+
+2006-04-28 Sven de Marothy <sven@physto.se>
+
+ * java/awt/image/ReplicateScaleFilter.java: Fix comment.
+ * javax/swing/ProgressMonitor.java (actionPerformed):
+ Avoid divide-by-zero.
+
+2006-04-28 Sven de Marothy <sven@physto.se>
+
+ * javax/swing/JSpinner.java: Fix default text justification.
+ * javax/swing/plaf/basic/BasicSpinnerUI.java: Fix spinner layout size.
+
+2006-04-28 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JList.java
+ (getMinSelectionIndex): Return correct value, added API docs,
+ (getMaxSelectionIndex): Added API docs.
+
+2006-04-28 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JList.java
+ (JList(Object[])): Pass new model directly to init(),
+ (JList(Vector)): Likewise,
+ (JList(ListModel)): Renamed argument and updated API docs,
+ (init): Throw IllegalArgumentException for null argument,
+ (setListData(Object[])): Delegate model creation,
+ (setListData(Vector)): Likewise,
+ (createListModel(Object[])): New private method,
+ (createListModel(Vector)): New private method,
+ (paramString): Implemented.
+
+2006-04-28 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/Class.java (SYNTHETIC, ENUM, ANNOTATION): New fields.
+ (isEnum): Rewrote.
+ (isSynthetic): Likewise.
+ (isAnnotation): Likewise.
+ * vm/reference/java/lang/VMClass.java (isSynthetic): Removed.
+ (isAnnotation): Likewise.
+ (isEnum): Likewise.
+
+2006-04-28 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/View.java:
+ (getNextVisualPositionFrom): Call modelToView and viewToModel on parent
+ view.
+
+2006-04-28 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/View.java:
+ (getNextVisualPositionFrom): Rewritten.
+ * javax/swing/text/CompositeView.java:
+ (getNextEastWestVisualPositionFrom): Partly implemented.
+ (getNextNorthSouthVisualPositionFrom): Partly implemented.
+
+2006-04-28 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JList.java
+ (setFixedCellHeight): Use correct property name for event.
+
+2006-04-28 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/Utilities.java:
+ (getNextWord): Use codePointAt instead of charAt, added note, changed
+ if-expression, added throwing of exception.
+ (getPreviousWord): Use codePointAt instead of charAt.
+
+2006-04-28 Jeroen Frijters <jeroen@frijters.net>
+
+ * java/lang/StringBuilder.java
+ (ensureCapacity, getChars, append(StringBuffer),
+ append(char[],int,int), delete, replace, insert(int,char[],int,int),
+ insert(int,String), insert(int,char), trimToSize): Replaced
+ System.arraycopy calls with VMSystem.arraycopy.
+
+2006-04-27 Tom Tromey <tromey@redhat.com>
+
+ * java/awt/image/renderable/RenderableImageProducer.java
+ (requestTopDownLeftRightResend): Implemented.
+ (run): Likewise.
+ (startProduction): Add new consumer.
+
+2006-04-27 Sven de Marothy <sven@physto.se>
+
+ * javax/swing/JLabel.java (setIcon): Repaint on setting the icon.
+
+2006-04-27 Roman Kennke <kennke@aicas.com>
+
+ * java/awt/LightweightDispatcher.java
+ Dispatch events only to targets that have a mouselistener
+ attached. Changed to also handle null targets.
+
+2006-04-27 Roman Kennke <kennke@aicas.com>
+
+ * NEWS: Added entries about accessibility support and L&F
+ window decorations.
+
+2006-04-27 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/Utilities.java:
+ (getTabbedTextOffset): Introduced width variable, rewritten the check
+ which ends the loop.
+ (getBreakLocation): Call getTabbedTextOffset with rounding argument set
+ to false.
+
+2006-04-27 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * examples/gnu/classpath/examples/swing/TreeDemo.java
+ (createContent): Added root visibility and selection listener demos.
+ * javax/swing/JTree.java (setRootVisible): If false, unselect
+ the root node, if it is selected.
+ * javax/swing/plaf/basic/BasicTreeUI.java
+ (TreeTraverseAction.actionPerformed): Do not select the root if it
+ is not visible.
+ * javax/swing/tree/DefaultTreeSelectionModel.java (removeSelectionPath,
+ removeSelectionPaths): Reset lead to null if the current lead path is
+ removed from selection.
+ * javax/swing/tree/TreePath.java (getParentPath): Cache the parent path.
+ * javax/swing/tree/FixedHeightLayoutCache.java (NodeRecord.getPath):
+ Return the same path regardless is root visible or not. (update):
+ Reduce the identation if the root is not visible.
+ * javax/swing/tree/VariableHeightLayoutCache.java (NodeRecord.getPath):
+ Return the same path regardless is root visible or not. (update):
+ Reduce the identation if the root is not visible.
+
+2006-04-26 Audrius Meskauskas <AudriusA@Bioinformatics.org
+
+ * javax/swing/plaf/basic/BasicTreeUI.java
+ (TreeAction.actionPerformed):Newly obtain the current lead
+ path that must stay visible.
+ (TreeTraverseAction.actionPerformed):Rewritten.
+ * javax/swing/tree/FixedHeightLayoutCache.java (countRows):
+ Do not treat root specially. (setModel): Assume the root node
+ initially expanded.
+ * javax/swing/tree/VariableHeightLayoutCache.java:(countRows):
+ Do not treat root specially. (setModel): Assume the root node
+ initially expanded.
+
+2006-04-26 Chris Burdess <dog@gnu.org>
+
+ Fixes PR 27290
+ * javax/xml/datatype/DatatypeFactory.java: Use complete
+ implementation resolution mechanism.
+
+2006-04-26 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/tree/DefaultTreeModel.java (nodeStructureChanged):
+ Implemented.
+ * javax/swing/tree/DefaultTreeSelectionModel.java (toString):
+ Removed NoImplementException form the implemented method.
+
+2006-04-26 Tom Tromey <tromey@redhat.com>
+
+ * javax/net/ssl/HttpsURLConnection.java (HttpsURLConnection): Doesn't
+ throw IOException.
+
+2006-04-26 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/DefaultListSelectionModel.java
+ (clone): Initialise empty listener list,
+ (setSelectionMode): Throw IllegalArgumentException for bad input.
+
+2006-04-26 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/DefaultListSelectionModel.java
+ (clearSelection): Clear the Bitset.
+
+2006-04-26 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTree.java (setLeadSelectionPath):
+ Repaint the new and old lead pathes.
+ * javax/swing/plaf/basic/BasicTreeUI.java
+ (FocusHandler): Repaint the lead row when focus changes.
+ (PropertyChangeHandler): Use existing constants, not the
+ string literals for the property names.
+ (TreeIncrementAction): Shrink the selection when moving
+ from the selection edge to the selection anchor.
+ (TreeSelectionHandler.valueChanged): Repaint the
+ new and old lead pathes.
+ (paintRow): Treat row as focused only if it is the lead row.
+ * javax/swing/tree/DefaultTreeCellRenderer.java
+ (getTreeCellRendererComponent): Set the vertical alignment to CENTER.
+ (paint): Rewritten.
+ * javax/swing/tree/DefaultTreeSelectionModel.java
+ (addSelectionPath): Event construction fix (old and new lead were
+ always the same).
+ (addSelectionPaths): Likewise.
+ * javax/swing/JComponent.java (setOpaque): Explained.
+ * javax/swing/tree/FixedHeightLayoutCache.java (getBounds):
+ Accept null.
+ * javax/swing/tree/VariableHeightLayoutCache.java (getBounds):
+ Accept null.
+
+2006-04-26 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * examples/gnu/classpath/examples/swing/TreeDemo.java
+ (createContent): Call DefaultTreeModel.reload(), not the
+ tree.repaint(). Expand the parent of the added node.
+ * javax/swing/JTree.java (constructor): Do not call
+ UpdateUI (and documented why). (treeDidChange):
+ Added comment, excluding the misinterpretation of this method.
+ * javax/swing/plaf/basic/BasicTreeUI.java (componentListener,
+ focusListener, keyListener, mouseListener, propertyListener,
+ selectionModelPropertyChangeListener, treeModelListener,
+ treeSelectionListener): Made package private.
+ (PropertyChangeHandler): If the model changes, install the
+ listener on it. (installUI): Assign treeModel.
+ * javax/swing/tree/DefaultMutableTreeNode.java (add): Added
+ comment, excluding misinterpretation.
+ * javax/swing/tree/DefaultTreeModel.java (reload): Implemented.
+ (reload(TreeNode)): Implemented.
+
+2006-04-25 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicTreeUI.java (MouseHandler.mousePressed):
+ If clicked on the other row, cancel the current editing session.
+
+2006-04-25 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicTreeUI.java
+ (NodeDimensionsHandler.getRowX): Add half of the icon width.
+ (paintExpandControl): Always paint in one gap distance from the left
+ border of the path bounds.
+ (paintHorizontalPartOfLeg): Rewritted, taking the icon width
+ into consideration.
+ (paintVerticalPartOfLeg): Paint two gaps from the parent's bounds
+ left edge.
+
+2006-04-25 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicTreeUI.java (paint): Rewritten.
+
+2006-04-25 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/javax/swing/text/html/parser/support/Parser.java (readAttributes):
+ Allow slashes (/) in the unquoted parameter value.
+
+2006-04-25 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/java2d/AbstractGraphics2D.java
+ (drawString(String,int,int)): Implemented.
+ (drawString(String,float,float)): Implemented.
+ (drawString(AttributedCharacterIterator,int,int)): Implemented.
+ (drawString(AttributedCharacterIterator,float,float)): Implemented.
+ (getFontRenderContext): Implemented.
+ (drawGlyphVector): Implemented.
+ (getFont): Implemented.
+ (setFont): Don't change font setting when null.
+ (getFontMetrics): Implemented.
+ (fillShape): Re-written to fill call rawFillShape() with a list
+ of the edges instead of double arrays.
+ (rawFillShape): Implemented using a polygon scanline conversion.
+ (fillScanline): New helper method.
+ (init): Initialize foreground black. Set font.
+ * gnu/java/awt/java2d/PolyEdge.java: New file.
+ * gnu/java/awt/java2d/PolyEdgeComparator.java: New file.
+
+2006-04-25 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/table/DefaultTableColumnModel.java: More API doc updates.
+
+2006-04-25 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JTable.java: Fixed API doc tags,
+ * javax/swing/text/AsyncBoxView.java: Likewise,
+ * javax/swing/text/FlowView.java: Likewise.
+
+2006-04-25 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/table/DefaultTableColumnModel.java
+ (moveColumn): Call fireColumnMoved() not fireColumnAdded.
+
+2006-04-24 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/table/DefaultTableColumnModel.java
+ (DefaultTableColumnModel): Set selection model field and add 'this' as
+ listener directly,
+ (addColumn): Add 'this' as a PropertyChangeListener,
+ (removeColumn): Remove column before firing event, and remove 'this' as
+ a PropertyChangeListener,
+ (setSelectionModel): Remove 'this' as a listener from old model,
+ (propertyChange): Check for 'width' property rather than
+ TableColumn.COLUMN_WIDTH_PROPERTY.
+
+2006-04-24 Chris Burdess <dog@gnu.org>
+
+ Fixes PR 27262
+ * gnu/xml/dom/DomDocument.java: getElementById returns user-defined ID
+ attributes when no doctype exists.
+
+2006-04-24 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/event/ChangeEvent.java: Updated API docs,
+ * javax/swing/event/ChangeListener.java: Likewise,
+ * javax/swing/event/TableColumnModelEventListener.java: Likewise,
+ * javax/swing/table/DefaultTableColumnModel.java: Likewise,
+ * javax/swing/table/TableColumnModel.java: Likewise.
+
+2006-04-24 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/Utilities.java:
+ (getBreakLocation): Introduced shift variable, added notes.
+ * javax/swing/text/WrappedPlainView.java:
+ (calculateBreakPosition): Decrease allocation area bounds by insets,
+ added early return when allocation area is empty, provide start offset
+ as argument.
+ (WrappedPlainView.WrappedLine): Change default value for numLines to 1.
+ (WrappedPlainView.WrappedLine.paint): Added count variable, update
+ numLines after loop.
+ (WrappedPlainView.WrappedLine.determineNumLines): Added early return.
+ (WrappedPlainView.WrappedLine.getPreferredSpan): Removed if-statement.
+ (WrappedPlainView.WrappedLine.viewToModel): Changed note, removed
+ decreasing variable end by one, changed break condition in while-loop,
+ added check for return value.
+ (WrappedPlainView.WrappedLine.updateDamage): Set numLines to one if
+ allocation area is empty.
+
+2006-04-24 Sven de Marothy <sven@physto.se>
+
+ * gnu/java/awt/java2d/Segment.java: New file.
+ * gnu/java/awt/java2d/CubicSegment.java: New file.
+ * gnu/java/awt/java2d/QuadSegment.java: New file.
+ * gnu/java/awt/java2d/LineSegment.java: New file.
+ * java/awt/BasicStroke.java
+ (start): New field.
+ (end): New field.
+ (createStrokedShape): Implemented.
+ (solidStroke): New method.
+ (dashedStroke): New method.
+ (capEnds): New method.
+ (convertPath): New method.
+ (addSegments): New method.
+ (capEnd): New method.
+ (lineIntersection): New method.
+ (joinSegments): New method.
+
+2006-04-24 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/java2d/AbstractGraphics2D.java: Made implements
+ Cloneable.
+ (font): New field.
+ (clip): Changed clip to be in user space not in target space.
+ (isOptimized): Added flag to allow optimized drawing for
+ primitive operations (e.g. for Swing).
+ (AbstractGraphics2D()): Set foreground in init() to avoid trouble
+ with the paint context etc.
+ (draw): Clip the shape before drawing it.
+ (fill): Clip the shape before drawing it.
+ (setComposite): Update isOptimized flag.
+ (setPaint): Likewise.
+ (setStroke): Likewise.
+ (translate): Update the clip.
+ (rotate): Likewise.
+ (scale): Likewise.
+ (shear): Likewise.
+ (transform): Likewise.
+ (setTransform): Likewise.
+ (clip): Added optimization for rectangle clips.
+ (create): Implemented.
+ (clone): New method.
+ (setFont): Basic implementation.
+ (setClip): Update opimization flag.
+ (drawLine): Added possible optimization.
+ (fillRect): Added possible optimization.
+ (fillShape): Implemented shape-filling by filling the flattended
+ shape using polygon fill.
+ (drawPixel): Added basic painting.
+ (rawSetPixel): Changed signature to only take coordinates.
+ (rawSetForeground): New abstract method.
+ (getUserBounds): Implemented default for this method.
+ (rawDrawLine): New method.
+ (rawFillRect): New method.
+ (rawFillPolygon): New method.
+ (init): New method.
+ (updateOptimization): New method.
+ (computeIntersection): New method.
+ (updateClip): New method.
+ (clipShape): New method.
+
+2006-04-23 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * examples/gnu/classpath/examples/swing/TreeDemo.java:
+ (createContent): Added check box to swith between single and
+ multiple selection.
+ * javax/swing/JTree.java (leadSelectionPath): Removed.
+ (addSelectionInterval): Explained. (getLeadSelectionPath):
+ Request the path from model. (getPathsBetweenRows): Explained.
+ (setLeadSelectionPath): Set the path in model.
+ * javax/swing/plaf/basic/BasicTreeUI.java
+ (TreeIncrementAction.actionPerformed, isMultiSelectionEvent,
+ isToggleSelectionEvent, selectPath, selectPathForEvent): Rewritten.
+ (MouseHandler.mousePressed): Call selectPathForEvent.
+
+2006-04-23 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/java2d/AbstractGraphics2D.java: New file.
+
+2006-04-23 Jeroen Frijters <jeroen@frijters.net>
+
+ * NEWS: Added entry about new Package constructor.
+ * java/lang/Package.java: Added compatibility constructor to ease
+ VM interface migration.
+
+2006-04-23 Jeroen Frijters <jeroen@frijters.net>
+
+ * NEWS: Added information about annotation support.
+ * java/lang/Class.java: Implement AnnotatedElement.
+ (equals): Reformatted to match generics branch.
+ (getEnumConstants): Implemented.
+ (getAnnotation, getAnnotations, getDeclaredAnnotations,
+ isAnnotationPresent): Merged from generics branch.
+ * vm/reference/java/lang/VMClass.java (getDeclaredAnnotations):
+ New method.
+
+2006-04-23 Jeroen Frijters <jeroen@frijters.net>
+
+ * java/lang/ClassLoader.java (definePackage): Added argument to
+ Package constructor.
+ * java/lang/Package.java (Package): Added ClassLoader argument.
+ (loader): New field.
+ (getAnnotation, getAnnotations, getDeclaredAnnotations,
+ isAnnotationPresent): Merged from generics branch.
+ * vm/reference/java/lang/VMClassLoader.java (static): Added argument
+ to Package constructor.
+
+2005-12-14 Nicolas Geoffray <nicolas.geoffray@menlina.com>
+
+ * java/lang/ClassLoader
+ (defineClass(String,byte[],int,int,ProtectionDomain)):
+ Calls VMClassLoader.defineClassWithTransformers instead
+ of VMClassLoader.defineClass.
+
+2006-04-22 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * NEWS:
+ Mention changes to VMProcess and VMSystem.
+ * doc/vmintegration.texinfo:
+ Change documentation on VMProcess and VMSystem.
+ * java/lang/reflect/Modifier.java:
+ (toString(int,StringBuilder)): Merged from generics
+ branch.
+ * vm/reference/java/lang/reflect/Constructor.java
+ (toString()): Use StringBuilder.
+ (toGenericString()): Likewise.
+ * vm/reference/java/lang/reflect/Field.java:
+ (toString()): Use StringBuilder.
+ (toGenericString()): Likewise.
+ * vm/reference/java/lang/reflect/Method.java
+ (toString()): Use StringBuilder.
+ (toGenericString()): Likewise.
+ * include/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.h,
+ * include/gnu_java_awt_peer_gtk_GdkFontPeer.h,
+ * include/gnu_java_awt_peer_gtk_GdkGraphics.h,
+ * include/gnu_java_awt_peer_gtk_GdkGraphics2D.h,
+ * include/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h,
+ * include/gnu_java_awt_peer_gtk_GdkPixbufDecoder.h,
+ * include/gnu_java_awt_peer_gtk_GdkRobotPeer.h,
+ * include/gnu_java_awt_peer_gtk_GdkTextLayout.h,
+ * include/gnu_java_awt_peer_gtk_GtkButtonPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkCanvasPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkCheckboxPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkChoicePeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkClipboard.h,
+ * include/gnu_java_awt_peer_gtk_GtkComponentPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkFileDialogPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkFramePeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkGenericPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkImage.h,
+ * include/gnu_java_awt_peer_gtk_GtkLabelPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkListPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkMenuBarPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkMenuComponentPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkMenuItemPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkMenuPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkPanelPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkScrollPanePeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkSelection.h,
+ * include/gnu_java_awt_peer_gtk_GtkTextAreaPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h,
+ * include/gnu_java_awt_peer_gtk_GtkToolkit.h,
+ * include/gnu_java_awt_peer_gtk_GtkWindowPeer.h,
+ * include/gnu_java_awt_peer_qt_MainQtThread.h,
+ * include/gnu_java_awt_peer_qt_QMatrix.h,
+ * include/gnu_java_awt_peer_qt_QPainterPath.h,
+ * include/gnu_java_awt_peer_qt_QPen.h,
+ * include/gnu_java_awt_peer_qt_QtAudioClip.h,
+ * include/gnu_java_awt_peer_qt_QtButtonPeer.h,
+ * include/gnu_java_awt_peer_qt_QtCanvasPeer.h,
+ * include/gnu_java_awt_peer_qt_QtCheckboxPeer.h,
+ * include/gnu_java_awt_peer_qt_QtChoicePeer.h,
+ * include/gnu_java_awt_peer_qt_QtComponentPeer.h,
+ * include/gnu_java_awt_peer_qt_QtContainerPeer.h,
+ * include/gnu_java_awt_peer_qt_QtDialogPeer.h,
+ * include/gnu_java_awt_peer_qt_QtEmbeddedWindowPeer.h,
+ * include/gnu_java_awt_peer_qt_QtFileDialogPeer.h,
+ * include/gnu_java_awt_peer_qt_QtFontMetrics.h,
+ * include/gnu_java_awt_peer_qt_QtFontPeer.h,
+ * include/gnu_java_awt_peer_qt_QtFramePeer.h,
+ * include/gnu_java_awt_peer_qt_QtGraphics.h,
+ * include/gnu_java_awt_peer_qt_QtGraphicsEnvironment.h,
+ * include/gnu_java_awt_peer_qt_QtImage.h,
+ * include/gnu_java_awt_peer_qt_QtLabelPeer.h,
+ * include/gnu_java_awt_peer_qt_QtListPeer.h,
+ * include/gnu_java_awt_peer_qt_QtMenuBarPeer.h,
+ * include/gnu_java_awt_peer_qt_QtMenuComponentPeer.h,
+ * include/gnu_java_awt_peer_qt_QtMenuItemPeer.h,
+ * include/gnu_java_awt_peer_qt_QtMenuPeer.h,
+ * include/gnu_java_awt_peer_qt_QtPanelPeer.h,
+ * include/gnu_java_awt_peer_qt_QtPopupMenuPeer.h,
+ * include/gnu_java_awt_peer_qt_QtScreenDevice.h,
+ * include/gnu_java_awt_peer_qt_QtScrollPanePeer.h,
+ * include/gnu_java_awt_peer_qt_QtScrollbarPeer.h,
+ * include/gnu_java_awt_peer_qt_QtTextAreaPeer.h,
+ * include/gnu_java_awt_peer_qt_QtTextFieldPeer.h,
+ * include/gnu_java_awt_peer_qt_QtToolkit.h,
+ * include/gnu_java_awt_peer_qt_QtVolatileImage.h,
+ * include/gnu_java_awt_peer_qt_QtWindowPeer.h,
+ * include/gnu_javax_sound_midi_alsa_AlsaMidiDeviceProvider.h,
+ * include/gnu_javax_sound_midi_alsa_AlsaMidiSequencerDevice.h,
+ * include/gnu_javax_sound_midi_alsa_AlsaPortDevice.h,
+ * include/gnu_javax_sound_midi_dssi_DSSIMidiDeviceProvider.h,
+ * include/gnu_javax_sound_midi_dssi_DSSISynthesizer.h,
+ * include/gnu_xml_libxmlj_dom_GnomeAttr.h,
+ * include/gnu_xml_libxmlj_dom_GnomeDocument.h,
+ * include/gnu_xml_libxmlj_dom_GnomeDocumentBuilder.h,
+ * include/gnu_xml_libxmlj_dom_GnomeDocumentType.h,
+ * include/gnu_xml_libxmlj_dom_GnomeElement.h,
+ * include/gnu_xml_libxmlj_dom_GnomeEntity.h,
+ * include/gnu_xml_libxmlj_dom_GnomeNamedNodeMap.h,
+ * include/gnu_xml_libxmlj_dom_GnomeNode.h,
+ * include/gnu_xml_libxmlj_dom_GnomeNodeList.h,
+ * include/gnu_xml_libxmlj_dom_GnomeNotation.h,
+ * include/gnu_xml_libxmlj_dom_GnomeProcessingInstruction.h,
+ * include/gnu_xml_libxmlj_dom_GnomeTypeInfo.h,
+ * include/gnu_xml_libxmlj_dom_GnomeXPathExpression.h,
+ * include/gnu_xml_libxmlj_dom_GnomeXPathNSResolver.h,
+ * include/gnu_xml_libxmlj_dom_GnomeXPathNodeList.h,
+ * include/gnu_xml_libxmlj_dom_GnomeXPathResult.h,
+ * include/gnu_xml_libxmlj_sax_GnomeLocator.h,
+ * include/gnu_xml_libxmlj_sax_GnomeXMLReader.h,
+ * include/gnu_xml_libxmlj_transform_GnomeTransformer.h,
+ * include/gnu_xml_libxmlj_transform_GnomeTransformerFactory.h,
+ * include/java_lang_VMProcess.h,
+ * include/java_lang_VMSystem.h:
+ Regenerated with GCJ 4.1.
+
+2005-12-05 Casey Marshall <csm@gnu.org>
+
+ * native/jni/classpath/jcl.h (environ): define, or declare
+ 'extern.'
+ * native/jni/java-lang/java_lang_VMProcess.c: include <jcl.h>.
+ Remove 'extern' define.
+ * native/jni/java-lang/java_lang_VMSystem.c
+ (Java_java_lang_VMSystem_environ): don't declare 'environ.'
+
+2005-09-25 Jeroen Frijters <jeroen@frijters.net>
+
+ * java/lang/System.java,
+ vm/reference/java/lang/VMSystem.java: Removed generic type
+ from VMSystem.environ() signature.
+
+2005-05-04 Tom Tromey <tromey@redhat.com>
+
+ * native/jni/java-lang/java_lang_VMProcess.c
+ (Java_java_lang_VMProcess_nativeSpawn): Added 'redirect'
+ argument. Use defines instead of contents.
+ * vm/reference/java/lang/VMProcess.java (redirect): New field.
+ (spawn): Updated.
+ (setProcessInfo): Updated.
+ (VMProcess): Added 'redirect' argument.
+ (nativeSpawn): Likewise.
+ (exec): New overload.
+
+2005-01-20 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * include/java_lang_VMSystem.h:
+ (Java_java_lang_VMSystem_environ): added
+ * vm/reference/java/lang/VMSystem.java:
+ (environ()): new native method
+
+2006-04-22 Casey Marshall <csm@gnu.org>
+
+ Fixes PR classpath/27228.
+ * gnu/javax/crypto/jce/sig/DHKeyPairGeneratorSpi.java
+ (initialize): also accept `DHParameterSpec.'
+ * gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java (setup):
+ handle a passed-in `DHParameterSpec' properly.
+ (generate): don't check if the random exponent is less than `q -
+ 1' if no `q' was specified.
+
+2006-04-22 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTree.java (TreeSelectionRedirector.valueChanged):
+ Only repaint the patches, speficied in the passed event.
+ (expandPath): Do nothing if the path is already expanded.
+ (scrollPathToVisible): Only scroll to visible, do nothing else.
+ * javax/swing/plaf/basic/BasicTreeUI.java
+ (TreeExpansionHandler.treeColapsed): Revalidate and repaint.
+ (TreeExpansionHandler.treeExpanded): Revalidate and repaint.
+ (TreeTraverseAction.actionPerformed): Collapse the node on the
+ action "selectParent". (selectPath): Rewritten.
+ * javax/swing/tree/DefaultTreeSelectionModel.java (clearSelection):
+ Fire change event. (notifyPathChange): Implemented. (setSelectionPath):
+ Do not reuse selection array.
+ * javax/swing/tree/FixedHeightLayoutCache.java (getRowForPath):
+ Accept null.
+ * javax/swing/tree/VariableHeightLayoutCache.java (getRowForPath):
+ Accept null.
+
+2006-04-22 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/tree/DefaultTreeSelectionModel.java
+ (addSelectionPath): If the path cannot be added, set it.
+ (addSelectionPaths): Call insureRowContinuity.
+ (arePathsContiguous): Implemented.
+ (canPathBeAdded): New private method.
+ (canPathsBeAdded): Implemented.
+ (canPathsBeRemoved): Implemented.
+ (getPath): New private method.
+ (insureRowContinuity): Implemented.
+ (removeSelectionPath): Call insureRowContinuity.
+ (removeSelectionPaths): Call insureRowContinuity.
+ (resetRowSelection): Removed stub marking, not used in implementation
+ (nothing to do there).
+ (selectOne): New private method.
+ (setSelectionMode) Call insureRowContinuity.
+ (setSelectionPaths) Remove the current selection by clearing it.
+
+2006-04-22 Carsten Neumann <cn-develop@gmx.net>
+
+ * javax/sql/Array.java: Fixed eclipse API doc warnings, named method
+ parameters consistendly, documented some methods.
+ * java/sql/Blob.java: Likewise.
+ * java/sql/CallableStatement.java: Likewise.
+ * java/sql/Clob.java: Likewise.
+ * java/sql/Connection.java: Likewise.
+ * java/sql/DatabaseMetaData.java: Likewise.
+ * java/sql/Date.java: Likewise.
+ * java/sql/Driver.java: Likewise.
+ * java/sql/PreparedStatement.java: Likewise.
+ * java/sql/ResultSet.java: Likewise.
+ * java/sql/ResultSetMetaData.java: Likewise.
+ * java/sql/SQLData.java: Likewise.
+ * java/sql/SQLOutput.java: Likewise.
+ * java/sql/SQLWarning.java: Likewise.
+ * java/sql/Statement.java: Likewise.
+ * java/sql/Time.java: Likewise.
+ * java/sql/Timestamp.java: Likewise.
+
+2006-04-21 Tom Tromey <tromey@redhat.com>
+
+ PR classpath/27163:
+ * gnu/java/net/protocol/ftp/FTPConnection.java
+ (changeWorkingDirectory): Do nothing if path is empty.
+
+2006-04-21 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/27231:
+ * gnu/java/net/protocol/http/HTTPURLConnection.java (connect): Handle
+ case where no '/' appears in 'location'.
+
+2006-04-21 Tom Tromey <tromey@redhat.com>
+
+ * java/security/Security.java (<clinit>): Add all default providers.
+ * resource/java/security/classpath.security: Added comment.
+
+2006-04-21 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/SpinnerDateModel.java: Updated API docs all over,
+ * javax/swing/SpinnerNumberModel.java: Likewise.
+
+2006-04-21 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/SpinnerDateModel.java
+ (SpinnerDateModel(Date, Comparable, Comparable, int)): Fix argument
+ checking to call compareTo() on start and end.
+
+2006-04-21 Jeroen Frijters <jeroen@frijters.net>
+
+ * java/lang/reflect/AccessibleObject.java:
+ Implemented AnnotatedElement.
+ (getAnnotation, getAnnotations, getDeclaredAnnotations,
+ isAnnotationPresent): New methods.
+
+2006-04-21 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/border/AbstractBorder.java: API doc updates,
+ * javax/swing/border/BevelBorder.java: Likewise,
+ * javax/swing/border/CompoundBorder.java: Likewise,
+ * javax/swing/border/EtchedBorder.java: Likewise,
+ * javax/swing/border/LineBorder.java: Likewise,
+ * javax/swing/border/MatteBorder.java: Likewise,
+ * javax/swing/border/TitledBorder.java: Likewise.
+
+2006-04-21 David Gilbert <david.gilbert@object-refinery.com>
+
+ * gnu/javax/crypto/cipher/Anubis.java:
+ (selfTest): Use Boolean.valueOf() to avoid creating a new Boolean
+ instance,
+ * gnu/javax/crypto/cipher/Blowfish.java:
+ (selfTest): Likewise,
+ * gnu/javax/crypto/cipher/Cast5.java:
+ (selfTest): Likewise,
+ * gnu/javax/crypto/cipher/Khazad.java:
+ (selfTest): Likewise,
+ * gnu/javax/crypto/cipher/Rijndael.java:
+ (selfTest): Likewise,
+ * gnu/javax/crypto/cipher/Serpent.java:
+ (selfTest): Likewise,
+ * gnu/javax/crypto/cipher/Square.java:
+ (selfTest): Likewise,
+ * gnu/javax/crypto/cipher/Twofish.java:
+ (selfTest): Likewise,
+ * gnu/javax/crypto/mac/UMac32.java:
+ (selfTest): Likewise,
+ * gnu/javax/crypto/prng/CSPRNG.java:
+ (getSystemInstance): Likewise.
+
+2006-04-21 David Gilbert <david.gilbert@object-refinery.com>
+
+ * gnu/java/security/hash/Haval.java:
+ (selfTest): Use Boolean.valueOf() to avoid creating new Boolean
+ instance,
+ * gnu/java/security/hash/MD2.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/MD4.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/MD5.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/RipeMD128.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/RipeMD160.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/Sha160.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/Sha256.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/Sha384.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/Sha512.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/Tiger.java:
+ (selfTest): Likewise,
+ * gnu/java/security/hash/Whirlpool.java:
+ (selfTest): Likewise.
+
+2006-04-21 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicTreeUI.java
+ (PropertyChangeHandler.propertyChange): Set the row mapper
+ for the selection model.
+ * javax/swing/tree/AbstractLayoutCache.java
+ (NodeDimensions.getNodeDimensions): Explained.
+ (getPreferredHeight, getPreferredWidth, isFixedRowHeight):
+ Implemented. (setRowHeight): Invalidate sizes.
+ * javax/swing/tree/DefaultTreeSelectionModel.java
+ (addSelectionPath, addSelectionPaths): Update lead row.
+ (removeSelectionPath, removeSelectionPaths): Do nothing if
+ selection is empty.
+ (clone): Only clone list selection model if it is not null.
+ (getRow): New method. (isRowSelected, getLeadSelectionRow,
+ setSelectionPath, setSelectionPaths, toString): Implemented.
+ * javax/swing/tree/FixedHeightLayoutCache.java (NodeRecord.getBounds):
+ Pass the empty rectangle. (isFixedRowHeight): New method.
+ * javax/swing/tree/VariableHeightLayoutCache.java
+ (NodeRecord.getBounds): Pass the empty rectangle.
+
+2006-04-21 David Gilbert <david.gilbert@object-refinery.com>
+
+ * gnu/java/security/Properties.java
+ (init): Use Boolean.valueOf() to avoid creating new Boolean instances.
+
+2006-04-21 David Gilbert <david.gilbert@object-refinery.com>
+
+ * gnu/classpath/jdwp/util/Value.java
+ (getUntaggedObj(ByteBuffer, Class)): Use Boolean.valueOf() to avoid
+ creating new Boolean instances.
+
+2006-04-20 Mark Wielaard <mark@klomp.org>
+
+ * java/awt/Toolkit.java (getDefaultToolkit): Get classloader in
+ PrivilegedAction. Access awt.toolkit through SystemProperties.
+
+2006-04-20 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/ActionMap.java: Removed unused imports,
+ * javax/swing/DefaultListSelectionModel.java
+ (clearSelection): Removed unused label,
+ * javax/swing/JScrollPane.java: Removed unused imports,
+ * javax/swing/UIManager.java: Likewise,
+ * javax/swing/table/DefaultTableCellRenderer.java: Likewise.
+
+2006-04-20 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/plaf/basic/BasicSpinnerUI.java: Removed unused imports,
+ * javax/swing/plaf/basic/BasicTextAreaUI.java: Likewise,
+ * javax/swing/plaf/basic/BasicTextFieldUI.java: Likewise,
+ * javax/swing/plaf/basic/BasicTextUI.java: Likewise,
+ * javax/swing/plaf/basic/BasicTreeUI.java: Likewise.
+
+2006-04-20 David Gilbert <david.gilbert@object-refinery.com>
+
+ * java/sql/Array.java: Fixed Eclipse API doc warnings,
+ * java/sql/Blob.java: Likewise,
+ * java/sql/CallableStatement.java: Likewise,
+ * java/sql/Clob.java: Likewise,
+ * java/sql/Connection.java: Likewise,
+ * java/sql/DatabaseMetaData.java: Likewise,
+ * java/sql/Date.java: Likewise,
+ * java/sql/Driver.java: Likewise,
+ * java/sql/PreparedStatement.java: Likewise,
+ * java/sql/ResultSet.java: Likewise,
+ * java/sql/ResultSetMetaData.java: Likewise,
+ * java/sql/SQLData.java: Likewise,
+ * java/sql/SQLOutput.java: Likewise,
+ * java/sql/SQLWarning.java: Likewise,
+ * java/sql/Statement.java: Likewise,
+ * java/sql/Time.java: Likewise,
+ * java/sql/Timestamp.java: Likewise.
+
+2006-04-20 David Gilbert <david.gilbert@object-refinery.com>
+
+ * java/sql/DriverManager.java
+ (setLoginTimeout): Use incoming argument,
+ (setLogStream): Likewise,
+ (println): Fix API doc comment.
+
+2006-04-20 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JMenuItem.java
+ (paramString): Updated API docs,
+ (getAccessibleContext): Added API docs,
+ (AccessibleJMenuItem.stateChanged): Marked as stub,
+ (AccessibleJMenuItem.getAccessibleRole): Added API docs,
+ * javax/swing/JSlider.java
+ (paramString): Fix for API docs,
+ * javax/swing/JToolTip.java
+ (getAccessibleContext): Fix for API docs.
+
+2006-04-20 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JRadioButtonMenuItem.java
+ (paramString): Reimplemented,
+ (getAccessibleContext): API docs added,
+ (AccessibleJRadioButtonMenuItem.AccessibleJRadioButtonMenuItem()):
+ Likewise,
+ (AccessibleJRadioButtonMenuItem.getAccessibleRole): Likewise.
+
+2006-04-20 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicTreeUI.java
+ (finish): Invalidate path bounds.
+ (getMaxHeight): Set the row height to the layout cache.
+ (startEditing): Do not request to recalculated
+ row height and preferred size.
+ * javax/swing/tree/DefaultTreeCellEditor.java
+ (ICON_TEXT_GAP, ICON_TREE_GAP): Removed, replacing
+ with 0.
+ * javax/swing/tree/FixedHeightLayoutCache.java:
+ Rewritten.
+
+2006-04-20 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JDesktopPane.java
+ (paramString): Reimplemented,
+ plus API doc updates in AccessibleJDesktopPane.
+
+2006-04-20 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/ImageIcon.java:
+ (AccessibleImageIcon.getAccessibleStateSet): Return null always,
+ (AccessibleImageIcon.getLocale): Declared exception and always return
+ null,
+ (getAccessibleContext): Updated API docs,
+ plus updated API docs all over AccessibleImageIcon.
+
+2006-04-20 Roman Kennke <kennke@aicas.com>
+
+ PR 27196
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (paintText): Fetch the ascent only once. Add the ascent to
+ the text rect also when tabs are disabled.
+
+2006-04-20 Christian Thalinger <twisti@complang.tuwien.ac.at>
+
+ * java/util/Locale.java (defaultLocale): Set to en_US per
+ default and use user.country but prioritize user.region if
+ defined.
+ (getLocale(String language, String country)): Renamed region to
+ country.
+ (getLocale(String language, String region, String variant)):
+ Likewise.
+ (getAvailableLocales): Likewise.
+
+2006-04-20 Roman Kennke <kennke@aicas.com>
+
+ PR 27222
+ * javax/swing/JList.java
+ (JList()): Call init() with DefaultListModel instance.
+ (JList(Object[])): Call init() with null.
+ (JList(Vector)): Call init() with null.
+ (JList(ListModel)): Call init() with model.
+ (init): Changed to take the model as argument. Don't call
+ setter methods and initialize stuff directly instead.
+ (getCellBounds): Check if UI is null.
+
+2006-04-20 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/WrappedPlainView.java: Initialize
+ WrappedLine.numLines with -1.
+ (WrappedPlainView.WrappedLine.getPreferredSpan): Check whether
+ numLines is -1 and reculcalate the value appropriately.
+ (WrappedPlainView.WrappedLine.updateDamage): Set numLines to -1 if
+ allocation area is empty.
+
+2006-04-20 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JTabbedPane.java
+ (AccessibleJTabbedPane.stateChanged): Marked as stub,
+ (AccessibleJTabbedPane.getAccessibleRole): Likewise,
+ (AccessibleJTabbedPane.getAccessibleChildrenCount): Likewise,
+ (AccessibleJTabbedPane.getAccessibleSelection): Likewise,
+ (AccessibleJTabbedPane.getAccessibleAt): Likewise,
+ (AccessibleJTabbedPane.getAccessibleSelectionCount): Likewise,
+ (AccessibleJTabbedPane.getAccessibleSelection(int)): Likewise,
+ (AccessibleJTabbedPane.isAccessibleChildSelected): Likewise,
+ (AccessibleJTabbedPane.addAccessibleSelection): Likewise,
+ (AccessibleJTabbedPane.removeAccessibleSelection): Likewise,
+ (AccessibleJTabbedPane.clearAccessibleSelection): Likewise,
+ (AccessibleJTabbedPane.selectAllAccessibleSelection): Likewise,
+ (Page.getAccessibleStateSet): Likewise,
+ (Page.getAccessibleIndexInParent): Likewise.
+
+2006-04-19 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JProgressBar.java
+ (paramString): Reimplemented.
+
+2006-04-19 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JButton.java: Updated API docs all over.
+
+2006-04-19 Roman Kennke <kennke@aicas.com>
+
+ * java/awt/Toolkit.java
+ (getDefaultToolkit): Use system classloader to load the
+ toolkit.
+
+2006-04-19 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/DefaultCaret.java:
+ (DefaultCaret.Bypass.setDot): Call DefaultCaret.setDotImpl
+ instead of DefaultCaret.setDot.
+
+2006-04-19 Roman Kennke <kennke@aicas.com>
+
+ * native/jni/java-net/local.c
+ (local_read): Handle EINTR correctly.
+ (local_write): Likewise.
+
+2006-04-19 Riccardo Mottola <multix@gmail.com>
+
+ PR classpath/27062, PR classpath/25650:
+ * native/fdlibm/ieeefp.h: Check for _POWER and _IBMR2.
+
+2006-04-19 Tom Tromey <tromey@redhat.com>
+
+ * java/text/SimpleDateFormat.java (formatWithAttribute): Take absolute
+ value of 'pureMinutes'. PR classpath/27189.
+
+2006-04-19 Olivier Jolly <olivier.jolly@pcedev.com>
+
+ * vm/reference/java/lang/VMClassLoader.java (getBootPackages): Loads
+ boot packages list from the META-INF/INDEX.LIST file if it exists.
+
+2006-04-19 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ Suggested by Stephen White <stephen-gnu-crypto@randomstuff.org.uk>
+ * gnu/javax/crypto/prng/IPBE.java: Updated documentation.
+ (ITERATION_COUNT): Removed modifiers.
+ (PASSWORD): Likewise.
+ (SALT): Likewise.
+ (PASSWORD_ENCODING): New property.
+ (DEFAULT_PASSWORD_ENCODING): New constant.
+ * gnu/javax/crypto/prng/PBKDF2.java (setup): Check for MAC's raw key
+ material (bytes) before a password (chars).
+
+2006-04-19 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JMenu.java
+ (getAccessibleChildrenCount): Marked as stub,
+ (getAccessibleChild): Likewise,
+ (getAccessibleSelection): Likewise,
+ (getAccessibleSelection(int)): Likewise,
+ (isAccessibleChildSelected): Likewise,
+ (getAccessibleSelectionCount): Likewise,
+ (addAccessibleSelection): Likewise,
+ (removeAccessibleSelection): Likewise,
+ (clearAccessibleSelection): Likewise,
+ (selectAllAccessibleSelection): Likewise.
+
+2006-04-19 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JSplitPane.java
+ (getAccessibleContext): Added API docs,
+ (paramString): Reimplemented,
+ (setOrientation): Updated API docs,
+ (setResizeWeight): Added argument checking and event notification.
+
+2006-04-18 Casey Marshall <csm@gnu.org>
+
+ Fixes PR classpath/25673
+ * java/security/KeyStore.java (getDefaultType): return "gkr" if no
+ property is set. Update JavaDoc to reflect this.
+
+2006-04-18 Lillian Angel <langel@redhat.com>
+
+ * gnu/xml/dom/DomDocument.java
+ (setCheckingCharacters): New function used to set
+ checkingCharacters flag.
+ * gnu/xml/dom/html2/DomHTMLParser.java
+ (parseDocument): Added call to set checkingCharacters flag
+ to false.
+
+2006-04-18 Lillian Angel <langel@redhat.com>
+
+ * gnu/xml/dom/DomDocument.java
+ (checkNCName): Reverted last patch. Added check for colon at
+ last position back in.
+
+2006-04-18 Robert Schuster <robertschuster@fsfe.org>
+
+ * examples/gnu/classpath/examples/swing/NavigationFilterDemo.java:
+ New file.
+ * examples/gnu/classpath/examples/swing/Demo.java:
+ (mkMenuBar): Added NavigationFilter demo.
+
+2006-04-18 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JSeparator.java: Updated API docs all over, plus
+ (setOrientation): Fire PropertyChangeEvent,
+ (paramString): Reimplemented.
+
+2006-04-18 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/plaf/basic/BasicTextUI.java: Implemented.
+
+2006-04-18 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JPanel.java: Updated API docs all over, plus
+ (JPanel(LayoutManager, boolean)): Pass on null layout, set
+ double-buffer flag.
+
+2006-04-18 Robert Schuster <robertschuster@fsfe.org>
+
+ * examples/gnu/classpath/examples/swing/DocumentFilterDemo.java:
+ New file.
+ * examples/gnu/classpath/examples/swing/Demo.java:
+ (mkMenuBar): Added DocumenFilter demo.
+
+2006-04-18 Tom Tromey <tromey@redhat.com>
+
+ * doc/www.gnu.org/include/layout.wml: Add FMJ.
+
+2006-04-18 Mark Wielaard <mark@klomp.org>
+
+ Reported by John Sullivan (johns@fsf.org)
+ * doc/www.gnu.org/stories.wml: Update JikesRVM location.
+
+2006-04-18 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JInternalFrame.java
+ (JDesktopIcon.getAccessibleContext): Added API docs,
+ (getDefaultCloseOperation): Likewise,
+ (paramString): Added 'title' attribute,
+ (setDefaultCloseOperation): Added API docs.
+
+2006-04-18 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JSlider.java
+ (paramString): Reimplemented.
+
+2006-04-18 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JComboBox.java
+ (paramString): Reimplemented,
+ (getAccessibleContext): Added API docs,
+ (AccessibleJComboBox.getAccessibleRole): Likewise.
+
+2006-04-18 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/RepaintManager.java
+ (dirtyComponentsWork): New field.
+ (ComponentComparator): Use dirtyComponentsWork instead of
+ dirtyComponents.
+ (RepaintManager): Initialize new field.
+ (paintDirtyRegions): Swap dirtyComponents with dirtyComponentsWork
+ and work on the copy.
+
+2006-04-18 Roman Kennke <kennke@aicas.com>
+
+ * gnu/java/awt/peer/swing/SwingComponentPeer.java
+ (setBounds): Call reshape().
+ * gnu/java/awt/peer/swing/SwingContainerPeer.java
+ (SwingContainerPeer): Changed argument to be a Component
+ instead a Container.
+ (getInsets): Call insets().
+ (handleMouseEvent): Added null check to avoid NPE.
+ (handleMouseMotionEvent): Added null check to avoid NPE.
+
+2006-04-18 Roman Kennke <kennke@aicas.com>
+
+ PR 27185
+ * javax/swing/JComponent.java
+ (paintChildrenWithOverlap): When one child is not opaque, propagate
+ the dirty rectangles to the next child.
+ (paintChildrenOptimized): Removed unnecessary 'optimization'.
+ This actually didn't work right and probably gained nothing.
+
+2006-04-18 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTable.java (getCallRect): Do not cache rectangles.
+ (moveToCellBeingEdited): Do not clone the rectangle here.
+
+2006-04-18 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/plaf/basic/BasicSliderUI.java
+ (getActionMap): Fixed lookup key,
+ (createActionMap): Modified actions to fetch slider/ui from the event
+ source.
+
+2006-04-17 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JToolBar.java
+ (AccessibleJToolBar.AccessibleJToolBar()): Updated API docs,
+ (AccessibleJToolBar.getAccessibleStateSet): Implemented,
+ (AccessibleJToolBar.getAccessibleRole): Updated API docs,
+ (getAccessibleContext): Likewise.
+
+2006-04-17 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/lang/Enum.java: Documented.
+
+2006-04-17 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * NEWS:
+ Mention merge of instrumentation classes.
+ * doc/vmintegration.texinfo:
+ Move instrumentation to correct section.
+
+2006-04-17 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * gnu/java/lang/InstrumentationImpl.java:
+ Moved from java.lang.
+ * java/lang/InstrumentationImpl.java:
+ Removed.
+ * vm/reference/gnu/java/lang/VMInstrumentationImpl.java:
+ Moved from java.lang.
+ * vm/reference/java/lang/VMClassLoader.java:
+ Corrected reference to InstrumentationImpl.
+ * vm/reference/java/lang/VMInstrumentationImpl.java:
+ Removed.
+
+2005-12-14 Nicolas Geoffray <nicolas.geoffray@menlina.com>
+
+ * vm/reference/java/lang/VMClassLoader
+ (defineClassWithTransformers): New method.
+ (instrumenter): New Field.
+
+2005-12-04 Nicolas Geoffray <nicolas.geoffray@menlina.com>
+
+ * vm/reference/java/lang/VMInstrumentationImpl.java
+ (redefineClasses): Added an extra parameter of type
+ java.lang.instrument.Instrument.
+ * java/lang/InstrumentationImpl.java
+ (redefineClasses): Added the Instrumentation object
+ to the arguments of VMInstrumentationImpl.redefineClasses
+ call.
+
+2005-12-03 Nicolas Geoffray <nicolas.geoffray@menlina.com>
+
+ * java/lang/InstrumentationImpl.java:
+ New file.
+ * vm/reference/java/lang/VMInstrumentationImpl.java:
+ New file.
+
+2006-04-17 Jeroen Frijters <jeroen@frijters.net>
+
+ * java/util/Collection.java: Implemented java.lang.Iterable.
+
+2006-04-17 Jeroen Frijters <jeroen@frijters.net>
+
+ * java/lang/Boolean.java: Implemented Comparable.
+ * java/lang/ClassLoader.java
+ (getResources): Not final anymore in 1.5.
+ * java/lang/Enum.java, java/lang/Iterable.java:
+ Copied from generics branch.
+ * java/lang/Thread.java (destroy): Marked deprecated.
+ * java/lang/ThreadLocal.java (remove): New method.
+
+2006-04-17 Dalibor Topic <robilad@kaffe.org>
+
+ * configure.ac:
+ Added CLASSPATH_CONVENIENCE substitution for convenience library LDFLAGS.
+
+ * native/fdlibm/Makefile.am,
+ native/jni/classpath/Makefile.am:
+ Don't use -module and -version-info for convenience libraries LDFLAGS.
+ Fixes libtool warnings.
+
+2006-04-17 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/plaf/basic/BasicComboBoxUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicComboPopup.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicInternalFrameUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicLabelUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicListUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicMenuBarUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicMenuUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicOptionPaneUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicPopupMenuUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicScrollBarUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicScrollPaneUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicSplitPaneUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicTableHeaderUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicTableUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicTextUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise,
+ * javax/swing/plaf/basic/BasicToolBarUI.java:
+ (installKeyboardActions): Marked as stub,
+ (uninstallKeyboardActions): Likewise.
+
+2006-04-17 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/plaf/basic/BasicSliderUI.java
+ (installKeyboardActions): Implemented,
+ (uninstallKeyboardActions): Implemented,
+ (scrollByBlock): Accept any value for direction,
+ (scrollByUnit): Likewise,
+ (getInputMap): New method,
+ (getActionMap): New method,
+ (createActionMap): New method.
+
+2006-04-17 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/lang/annotation/Annotation.java:
+ Documented.
+
+2005-06-09 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/lang/reflect/AnnotatedElement.java: Documented.
+
+2005-01-07 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/lang/reflect/AnnotatedElement.java:
+ Added import of java.lang.annotation.Annotation
+
+2004-08-26 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/reflect/AnnotatedElement.java: New file.
+
+2004-08-07 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/annotation/Annotation.java: New file.
+
+2005-12-13 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/instrument/ClassDefinition.java: Reformatted.
+ * java/lang/instrument/UnmodifiableClassException.java: Reformatted.
+ * java/lang/instrument/IllegalClassFormatException.java: Reformatted.
+
+2005-12-13 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/instrument/ClassDefinition.java (ClassDefinition): Now
+ public.
+
+2005-12-05 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/instrument/Instrumentation.java (redefineClasses): Javadoc
+ fix.
+ * java/lang/instrument/ClassFileTransformer.java (transform): Javadoc
+ fix.
+
+2005-12-03 Nicolas Geoffray <nicolas.geoffray@menlina.com>
+
+ * java/lang/instrument: New directory.
+ * java/lang/instrument/ClassDefinition.java:
+ New file.
+ * java/lang/instrument/ClassFileTransformer.java:
+ New file.
+ * java/lang/instrument/IllegalClassFormatException.java:
+ New file.
+ * java/lang/instrument/Instrumentation.java:
+ New file.
+ * java/lang/instrument/UnmodifiableClassException.java:
+ New file.
+
+2006-04-16 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * doc/vmintegration.texinfo:
+ Fix sectioning.
+
+2006-04-16 Tom Tromey <tromey@redhat.com>
+
+ * native/jni/java-net/Makefile.am (AM_CFLAGS): Removed --save-temps.
+
+2006-04-16 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * NEWS:
+ Mention generics additions to the VM interface.
+ * doc/vmintegration.texinfo:
+ Added information on VMClass 1.5 additions and
+ VMSecureRandom.
+
+2006-04-16 Casey Marshall <csm@gnu.org>
+
+ * NEWS: add an entry mentioning local socket support.
+
+2006-04-16 Casey Marshall <csm@gnu.org>
+
+ * configure.ac (--enable-local-sockets): new enable argument.
+ (ENABLE_LOCAL_SOCKETS): new define.
+ * native/jni/java-net/Makefile.am (local_sources): new variable.
+ (lib_javanet_la_SOURCES): append `local_sources.'
+ * native/jni/java-net/gnu_java_net_local_LocalSocketImpl.c,
+ * native/jni/java-net/local.c,
+ * native/jni/java-net/local.h,
+ * include/gnu_java_net_local_LocalSocketImpl.h,
+ * gnu/java/net/local/LocalServerSocket.java,
+ * gnu/java/net/local/LocalSocket.java,
+ * gnu/java/net/local/LocalSocketAddress.java,
+ * gnu/java/net/local/LocalSocketImpl.java: new files.
+
+2006-04-15 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * javax/accessibility/AccessibleAction.java:
+ (DECREMENT): Added field.
+ (INCREMENT): Likewise.
+ (TOGGLE_EXPAND): Likewise.
+ * javax/accessibility/AccessibleRole.java:
+ (EDITBAR): Added field.
+ (FOOTER): Likewise.
+ (HEADER): Likewise.
+ (PARAGRAPH): Likewise.
+ (PROGRESS_MONITOR): Likewise.
+ (RULER): Likewise.
+ * javax/accessibility/AccessibleState.java:
+ (INDETERMINATE): Added field.
+ (MANAGES_DESCENDANTS): Likewise.
+ (TRUNCATED): Likewise.
+ * vm/reference/java/lang/reflect/Constructor.java:
+ Fixed copyright header to match generics branch.
+ * vm/reference/java/lang/reflect/Field.java:
+ Fixed copyright header to match generics branch.
+ (toGenericString()): Ported from generics branch.
+ (getGenericType()): Likewise.
+ (getSignature()): Likewise.
+
+2006-04-14 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/DefaultCaret.java:
+ (getBypass): New method.
+ (moveDot): Rewritten.
+ (moveDotImpl): New method.
+ (setDot): Rewritten.
+ (setDotImpl): New method.
+ (DefaultCaret.Bypass): New class.
+
+2006-04-14 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/AbstractDocument.java:
+ (getBypass): New method.
+ (insertString): Rewritten.
+ (remove): Rewritten.
+ (replace): Rewritten.
+ (insertStringImpl): New method.
+ (removeImpl): New method.
+ (replaceImpl): New method.
+ (AbstractDocument.Bypass): New class.
+
+2006-04-14 Casey Marshall <csm@gnu.org>
+
+ Fixes PR classpath/24642
+ * NEWS: add note about SecureRandom changes, and addition of
+ VMSecureRandom.
+ * java/security/SecureRandom.java (isSeeded): new field.
+ (setSeed, setSeed): set `isSeeded' to `true.'
+ (nextBytes): seed this instance if `isSeeded' is false.
+ (getSeed): call `generateSeed.'
+ (SECURERANDOM_SOURCE, JAVA_SECURITY_EGD, logger): new constants.
+ (generateSeed, generateSeed): new methods.
+ * vm/reference/java/security/VMSecureRandom.java: new file.
+
+2006-04-14 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/FieldView.java:
+ (paint): Apply clipping rectangle of the allocation area
+ before painting the text.
+ * javax/swing/text/DefaultHighlighter.java:
+ (DefaultHighlighter.DefaultHighlightPainter): Use SwingUtilities to
+ compute union and intersection, calculate intersection with allocation
+ area before painting, adjust x and width when painting multiple lines
+ by the range of the allocation area.
+
+2006-04-14 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/DefaultHighlighter.java:
+ (paintLayeredHighlights): Marked as stub.
+
+2006-04-14 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/plaf/basic/BasicTextFieldUI.java:
+ (propertyChanged): Added note, change color only if current background
+ is a ColorUIResource instance.
+
+2006-04-14 Tom Tromey <tromey@redhat.com>
+
+ * java/beans/beancontext/BeanContextSupport.java (hasNext): No longer
+ a stub.
+ (next): Likewise.
+
+2006-04-14 Tom Tromey <tromey@redhat.com>
+
+ * javax/swing/JComboBox.java (AccessibleJComboBox): Now public.
+
+2006-04-14 Mark Wielaard <mark@klomp.org>
+
+ * java/lang/Thread.java (getUncaughtExceptionHandler): Return
+ thread group when exceptionHandler isn't set.
+ * vm/reference/java/lang/VMThread.java (run): Use result of
+ thread.getUncaughtExceptionHandler directly.
+
+2006-04-14 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JSplitPane.java
+ (AccessibleJSplitPane.getAccessibleStateSet): Implemented,
+ (AccessibleJSplitPane.getAccessibleRole): Implemented,
+ (AccessibleJSplitPane.getAccessibleValue): Implemented,
+ (AccessibleJSplitPane.getCurrentAccessibleValue): Implemented,
+ (AccessibleJSplitPane.setCurrentAccessibleValue): Implemented,
+ (AccessibleJSplitPane.getMinimumAccessibleValue): Implemented,
+ (AccessibleJSplitPane.getMaximumAccessibleValue): Implemented.
+
+2006-04-13 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * gnu/javax/crypto/assembly/Assembly.java,
+ * gnu/javax/crypto/assembly/Cascade.java,
+ * gnu/javax/crypto/assembly/CascadeStage.java,
+ * gnu/javax/crypto/assembly/CascadeTransformer.java,
+ * gnu/javax/crypto/assembly/Direction.java,
+ * gnu/javax/crypto/assembly/LoopbackTransformer.java,
+ * gnu/javax/crypto/assembly/ModeStage.java,
+ * gnu/javax/crypto/assembly/Operation.java,
+ * gnu/javax/crypto/assembly/PaddingTransformer.java,
+ * gnu/javax/crypto/assembly/Stage.java,
+ * gnu/javax/crypto/assembly/Transformer.java,
+ * gnu/javax/crypto/cipher/Square.java,
+ * gnu/javax/crypto/jce/cipher/AESSpi.java,
+ * gnu/javax/crypto/jce/cipher/ARCFourSpi.java,
+ * gnu/javax/crypto/jce/cipher/AnubisSpi.java,
+ * gnu/javax/crypto/jce/cipher/BlowfishSpi.java,
+ * gnu/javax/crypto/jce/cipher/CipherAdapter.java,
+ * gnu/javax/crypto/jce/cipher/DESSpi.java,
+ * gnu/javax/crypto/jce/cipher/KhazadSpi.java,
+ * gnu/javax/crypto/jce/cipher/NullCipherSpi.java,
+ * gnu/javax/crypto/jce/cipher/PBES2.java,
+ * gnu/javax/crypto/jce/cipher/RijndaelSpi.java,
+ * gnu/javax/crypto/jce/cipher/SerpentSpi.java,
+ * gnu/javax/crypto/jce/cipher/SquareSpi.java,
+ * gnu/javax/crypto/jce/cipher/TripleDESSpi.java,
+ * gnu/javax/crypto/jce/cipher/TwofishSpi.java,
+ * gnu/javax/crypto/jce/mac/HMacMD2Spi.java,
+ * gnu/javax/crypto/jce/mac/HMacMD4Spi.java,
+ * gnu/javax/crypto/jce/mac/HMacMD5Spi.java,
+ * gnu/javax/crypto/jce/mac/HMacRipeMD128Spi.java,
+ * gnu/javax/crypto/jce/mac/HMacRipeMD160Spi.java,
+ * gnu/javax/crypto/jce/mac/HMacSHA160Spi.java,
+ * gnu/javax/crypto/jce/mac/HMacSHA256Spi.java,
+ * gnu/javax/crypto/jce/mac/HMacSHA384Spi.java,
+ * gnu/javax/crypto/jce/mac/HMacSHA512Spi.java,
+ * gnu/javax/crypto/jce/mac/HMacTigerSpi.java,
+ * gnu/javax/crypto/jce/mac/HMacWhirlpoolSpi.java,
+ * gnu/javax/crypto/jce/mac/MacAdapter.java,
+ * gnu/javax/crypto/jce/mac/TMMH16Spi.java,
+ * gnu/javax/crypto/jce/mac/UHash32Spi.java,
+ * gnu/javax/crypto/jce/mac/UMac32Spi.java,
+ * gnu/javax/crypto/key/dh/DiffieHellmanSender.java,
+ * gnu/javax/crypto/key/srp6/SRP6TLSServer.java,
+ * gnu/javax/crypto/keyring/PrivateKeyEntry.java,
+ * gnu/javax/crypto/mode/IAuthenticatedMode.java,
+ * gnu/javax/crypto/pad/WrongPaddingException.java,
+ * gnu/javax/crypto/prng/ICMGenerator.java,
+ * gnu/javax/crypto/prng/IPBE.java,
+ * gnu/javax/crypto/prng/PBKDF2.java,
+ * gnu/javax/crypto/sasl/ConfidentialityException.java,
+ * gnu/javax/crypto/sasl/IllegalMechanismStateException.java,
+ * gnu/javax/crypto/sasl/srp/IALG.java,
+ * gnu/javax/crypto/sasl/srp/SRPServer.java:
+ Remove CVS revision tags.
+
+2006-04-13 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicTreeUI.java (getPreferredSize):
+ Removed debugging code.
+
+2006-04-13 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTree.java (getPreferredSize): Return the
+ cloned instance.
+ * javax/swing/ViewportLayout.java (layoutContainer):
+ Do not manage the view size and location if the view is
+ in the scroll pane. Also manage size and location for
+ Scrollable, if it is not in the scroll pane.
+ * javax/swing/plaf/basic/BasicTreeUI.java,
+ * javax/swing/tree/FixedHeightLayoutCache.java,
+ * javax/swing/tree/VariableHeightLayoutCache.java: Rewritten.
+ * gnu/javax/swing/tree/GnuPath.java: New file.
+
+2006-04-13 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JToolBar.java
+ (AccessibleJToolBar.getAccessibleStateSet): Marked as stub.
+
+2006-04-13 Robert Schuster <robertschuster@fsfe.org>
+
+ * examples/gnu/classpath/examples/swing/TextAreaDemo.java:
+ (createCustomColoredPanel): Set background color as demo intends,
+ changed custom selection color to red.
+ * examples/gnu/classpath/examples/swing/TextFieldDemo.java:
+ Replaced various single variables with a Compound instance, added
+ custom highlighter demo.
+ (TextFieldDemo.DemoHighlightPainter): New class (taken from
+ TextAreaDemo).
+ (TextFieldDemo.Compound): New class.
+ (createTextFieldCompound): New method.
+ (createLeftAlignedPanel): Rewritten.
+ (createRightAlignedPanel): Rewritten.
+ (createCenteredPanel): Rewritten.
+ (createCustomColoredPanel): Removed.
+ (createCustomColoredPanel1): New method.
+ (createCustomColoredPanel2): New method.
+ (createCustomBordersPanel): New method.
+ (createMiscPanel): Rewritten.
+ (actionPerformed): Rewritten.
+ (createContent): Add panels of new compounds to main panel, put
+ main panel in a JScrollPane.
+ * examples/gnu/classpath/examples/swing/Demo.java:
+ (Demo): Put desktop in a scrollpane.
+ (mkMenuBar): Check availability of MetalLookAndFeel.getCurrentTheme()
+ method via reflection.
+
+2006-04-13 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/plaf/metal/MetalDesktopIconUI.java
+ (createUI): Return new instance rather than shared instance.
+
+2006-04-13 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/FieldView.java:
+ (checkContainer): Call updateVisibility() at the end.
+
+2006-04-13 Robert Schuster <robertschuster@fsfe.org>
+
+ * java/awt/event/MouseEvent.java:
+ (paramString): Add value of 'consumed' variable in string.
+
+2006-04-13 Robert Schuster <robertschuster@fsfe.org>
+
+ PR 26967
+ * javax/swing/JTextField.java: Removed scrollOffset variable.
+ (JTextField): Moved up initialization of horizontalVisibility field.
+ (getScrollOffset): Implemented.
+ (setScrollOffset): Implemented.
+ (getHorizonztalVisibility): Removed note.
+ (scrollRectToVisible): New method.
+ * javax/swing/text/FieldView.java: Added cachedSpan variable.
+ (checkContainer): New method.
+ (updateVisibility): New method.
+ (calculateHorizontalSpan): New method.
+ (adjustAllocation): Removed unneeded local variables, added code
+ to handle scrolling.
+ (getPreferredSpan): Use new method calculateHorizontalSpan,
+ avoid calculation by returning cached value cachedSpan.
+ (paint): Added check whether the hosted component is a JTextField.
+ (insertUpdate): Invalidate cached span value, update visibility
+ if neccessary.
+ (removeUpdate): Dito.
+ (changeUpdate): Dito.
+
+2006-04-13 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JInternalFrame.java
+ (setTitle): Set old value to 'this.title', not 'title'.
+
+2006-04-13 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JInternalFrame.java
+ (AccessibleJInternalFrame.getAccessibleName): Implemented,
+ (AccessibleJInternalFrame.getAccessibleRole): Implemented,
+ (AccessibleJInternalFrame.getAccessibleValue): Implemented,
+ (AccessibleJInternalFrame.getCurrentAccessibleValue): Implemented,
+ (AccessibleJInternalFrame.getMaximumAccessibleValue): Implemented,
+ (AccessibleJInternalFrame.getMinimumAccessibleValue): Implemented,
+ (AccessibleJInternalFrame.setCurrentAccessibleValue): Implemented,
+ (JDesktopIcon.AccessibleJDesktopIcon.getAccessibleRole): Implemented,
+ (JDesktopIcon.AccessibleJDesktopIcon.getAccessibleValue): Implemented,
+ (JDesktopIcon.AccessibleJDesktopIcon.getCurrentAccessibleValue):
+ Implemented,
+ (JDesktopIcon.AccessibleJDesktopIcon.getMaximumAccessibleValue):
+ Implemented,
+ (JDesktopIcon.AccessibleJDesktopIcon.getMinimumAccessibleValue):
+ Implemented,
+ (JDesktopIcon.AccessibleJDesktopIcon.setCurrentAccessibleValue):
+ Implemented,
+ (JInternalFrame()): Use "" for default title,
+ (getAccessibleContext): Updated API docs,
+ (getDesktopIcon): Likewise,
+ (getLayer): Check for layer in client properties, and return
+ DEFAULT_LAYER if no setting is found,
+ (getTitle): Updated API docs,
+ (setDesktopIcon): Fire property change event.
+
+2006-04-13 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/ScrollPaneLayout.java (layoutContainer):
+ Mind that the presence of one scroll bar may cause the
+ need for another.
+
+2006-04-12 Ito Kazumitsu <kaz@maczuka.gcd.org>
+
+ * gnu/regexp/REToken.java(unicodeAware): New field,
+ (toLowerCase, toUpperCase): New methods.
+ * gnu/regexp/RETokenBackRef.java, gnu/regexp/RETokenChar.java,
+ gnu/regexp/RETokenNamedProperty.java, gnu/regexp/RETokenRange.java:
+ Use toLowerCase and toUpperCase defined in REToken instead of
+ those defined in java.lang.Character.
+ * gnu/regexp/gnu/regexp/RE.java(REG_ICASE_USASCII): New flag.
+ (initialize): Sets unicodeAware of the generated REToken to false if
+ REG_ICASE_USASCII is set.
+ * gnu/regexp/RETokenChar.java(constructor): Don't convert the character
+ to lower case and keep the original value.
+ (matchOneString): Use the new method charEquals to compare characters.
+ (charEquals): New method to compare characters.
+ * java/util/regex/Pattern.java: Sets the flag REG_ICASE_USASCII to true.
+
+2006-04-12 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/event/InternalFrameEvent.java:
+ (paramString): Implemented,
+ updated API docs all over.
+
+2006-04-12 Casey Marshall <csm@gnu.org>
+
+ * gnu/javax/crypto/prng/Fortuna.java (setup): call `fillBlock.'
+ (Generator.setup): call `fillBlock.'
+
+2006-04-12 Casey Marshall <csm@gnu.org>
+
+ Fixes PR classpath/24481.
+ * gnu/java/security/jce/prng/SecureRandomAdapter.java (<init>):
+ initialize the adaptee.
+ (setSeed): call `addRandomBytes;' don't re-initialize the adaptee.
+ * gnu/java/security/prng/MDGenerator.java (addRandomByte,
+ addRandomBytes): new methods.
+
+2006-04-12 Tom Tromey <tromey@redhat.com>
+
+ * java/io/DataOutputStream.java (writeUTF): Correctly handle zero
+ length strings.
+
+2006-04-12 Lillian Angel <langel@redhat.com>
+
+ * gnu/xml/dom/DomDocument.java
+ (checkNCName): Removed unneeded part of check.
+ * gnu/xml/dom/DomNode.java
+ (dispatchEvent): Added code to grow ancestors array
+ if needed. Changed checks to use depth of node instead.
+ Fixes an infinite loop and segmentation fault.
+ * gnu/xml/dom/html2/DomHTMLParser.java
+ (handleEndTag): No need to use/make a copy of the node.
+ Causes an infinite loop.
+
+2006-04-12 Tom Tromey <tromey@redhat.com>
+
+ PR classpath/27131:
+ * java/util/BitSet.java (get): Early return if to==from.
+
+2006-04-12 Mark Wielaard <mark@klomp.org>
+
+ * java/security/SecureRandom.java (algorithm): New private field.
+ (SecureRandom): Initialize algorithm.
+ (SecureRandom(SecureRandomSpi,Provider,String)): New private
+ constructor.
+ (getInstance): Call 3 argument constructor.
+ (getAlgorithm): New method.
+
+2006-04-12 Mark Wielaard <mark@klomp.org>
+
+ Port UncaughtExceptionHandler support from generics branch.
+ * NEWS: Document Thread.UncaughtExceptionHandler VMThread change.
+
+2006-04-12 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/lang/Thread.java:
+ (setUncaughtExceptionHandler(UncaughtExceptionHandler):
+ Added docs and security check.
+ (getUncaughtExceptionHandler()): Documented.
+ (setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler):
+ Added docs and security check.
+ (getDefaultUncaughtExceptionHandler()): Documented.
+ (getId()): Documented.
+
+2006-04-12 Tom Tromey <tromey@redhat.com>
+
+ * vm/reference/java/lang/VMThread.java (run): Use thread's
+ uncaught handler.
+ * java/lang/Thread.java (defaultHandler): New field.
+ (setDefaultUncaughtExceptionHandler,
+ getDefaultUncaughtExceptionHandler, setUncaughtExceptionHandler,
+ getUncaughtExceptionHandler): New methods.
+ * java/lang/ThreadGroup.java (ThreadGroup): Implements
+ UncaughtExceptionHandler.
+ (uncaughtException): Use getDefaultUncaughtExceptionHandler.
+
+2006-04-11 Bryce McKinlay <mckinlay@redhat.com>
+
+ * java/io/DataOutputStream.java (writeUTF): Re-use fixed length byte
+ buffer. Loop only once to determine Utf8 length when possible. Make
+ the inner loop bounded by buf.length.
+ (getUTFlength): New private method.
+ (buf): New private field.
+
+2006-04-11 Lillian Angel <langel@redhat.com>
+
+ * gnu/xml/dom/DomNodeIterator.java
+ (nextNode): Moved line of code to avoid an infinite loop.
+ * gnu/xml/dom/html2/DomHTMLAppletElement.java
+ (getCls): New function.
+ (setCls): Likewise.
+ (getSrc): Likewise.
+ (setSrc): Likewise.
+ * gnu/xml/dom/html2/DomHTMLDocument.java:
+ Added DomHTMLEmbedElement to map.
+ (getApplets): Added node name, 'embed'.
+ * gnu/xml/dom/html2/DomHTMLEmbedElement.java:
+ New class.
+ * gnu/xml/dom/html2/DomHTMLObjectElement.java
+ (getJavaCode): New function.
+ (setJavaCode): Likewise.
+ (getObject): Likewise.
+ (setObject): Likewise.
+ (getJavaObject): Likewise.
+ (setJavaObject): Likewise.
+ (getJavaArchive): Likewise.
+ (setJavaArchive): Likewise.
+ (getJavaCodeBase): Likewise.
+ (setJavaCodeBase): Likewise.
+ (getJavaType): Likewise.
+ (setJavaType): Likewise.
+ (setMayscript): Likewise.
+ (getMayscript): Likewise.
+ (setScriptable): Likewise.
+ (getScriptable): Likewise.
+ * gnu/xml/dom/html2/DomHTMLParser.java
+ (parseDocument): Should not check for well formedness
+ when parsing an html document.
+ * java/awt/Window.java
+ (dispatchEvent): Added check to avoid NPE.
+
+2006-04-10 Tom Tromey <tromey@redhat.com>
+
+ * javax/accessibility/AccessibleStreamable.java (getStream): Fixed
+ name.
+ * javax/accessibility/AccessibleRelation.java (EMBEDS): Fixed value.
+ (SUBWINDOW_OF, SUBWINDOW_OF_PROPERTY): Likewise.
+
+2006-04-10 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/plaf/basic/BasicTextUI.java:
+ (getNextVisualPositionFrom): Marked as stub.
+
+2006-04-10 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicLookAndFeel.java
+ (initSystemColorDefaults): Changed to use loadSystemColorDefaults
+ and create the defaults as strings constants.
+ (loadSystemColors): Implemented stubbed method.
+
+2006-04-10 Tom Tromey <tromey@redhat.com>
+
+ * .settings/org.eclipse.core.resources.prefs: Set encoding for
+ ChangeLog.
+
+2006-04-10 Tom Tromey <tromey@redhat.com>
+
+ * java/io/CharArrayWriter.java (append): Javadoc fix.
+ (append): Likewise.
+
+2006-04-10 Tom Tromey <tromey@redhat.com>
+
+ * javax/accessibility/AccessibleTextSequence.java: New file.
+ * javax/accessibility/AccessibleRelation.java (CHILD_NODE_OF): New
+ field.
+ (CHILD_NODE_OF_PROPERTY, EMBEDDED_BY, EMBEDDED_BY_PROPERTY, EMBEDS,
+ EMBEDS_PROPERTY, FLOWS_FROM, FLOWS_FROM_PROPERTY, FLOWS_TO,
+ FLOWS_TO_PROPERTY, PARENT_WINDOW_OF, PARENT_WINDOW_OF_PROPERTY,
+ SUBWINDOW_OF, SUBWINDOW_OF_PROPERTY): Likewise.
+ * javax/accessibility/AccessibleExtendedText.java: New file.
+ * javax/accessibility/AccessibleContext.java
+ (ACCESSIBLE_COMPONENT_BOUNDS_CHANGED): New field.
+ (ACCESSIBLE_INVALIDATE_CHILDREN): Likewise.
+ (ACCESSIBLE_TEXT_ATTRIBUTES_CHANGED): Likewise.
+ * javax/accessibility/AccessibleAttributeSequence.java: New file.
+ * javax/accessibility/AccessibleStreamable.java: New file.
+ * javax/accessibility/AccessibleText.java (getIndexAtPoint): Javadoc
+ fix.
+
+2006-04-10 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/tree/AbstractLayoutCache.java
+ (getNodeDimensions, getRowsForPath): Implemented.
+ * javax/swing/tree/FixedHeightLayoutCache.java: Rewritten.
+ * javax/swing/tree/VariableHeightLayoutCache.java: Rewritten.
+
+2006-04-10 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/tree/AbstractLayoutCache.java: Reformatted.
+
+2006-04-10 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JInternalFrame.java
+ (AccessibleJInternalFrame): Marked all stubbed methods as such
+ by adding throws NotImplementedException.
+
+2006-04-10 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JFileChooser.java
+ (getAccessibleContext): Don't create a new instance on each
+ call, instead store the accessible context in the
+ accessibleContext field.
+
+2006-04-10 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JComboBox.java
+ (AccessibleJComboBox): Marked all stubbed methods as such
+ by adding throws NotImplementedException.
+
+2006-04-10 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/ActionMap.java
+ (readObject): Removed.
+ (writeObject): Removed.
+
+2006-04-10 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/tree/DefaultTreeSelectionModel.java
+ (addSelectionPaths, setSelectionPaths): Call
+ insureUniqueness. (clone, setRowMapper): Implemented.
+ * TreePath (path): Marked final.
+
+2006-04-10 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/tree/DefaultTreeSelectionModel.java:
+ Documented and autoformatted. (insureUniqueness):
+ Removed stub marking.
+
+2006-04-09 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/SizeSequence.java
+ (sizes): Don't initialise here,
+ (SizeSequence(int, int)): Initialise sizes field,
+ (SizeSequence(int[])): Clone argument instead of calling setSizes(),
+ (setSize): Do nothing when index is out of bounds,
+ (getIndex): Implemented,
+ (setSizes): Reimplemented,
+ (getSizes): Likewise,
+ (insertEntries): Likewise,
+ (removeEntries): Likewise,
+ plus added API docs all over.
+
+2006-04-09 Audrius Meskauskas <AudriusA@Bioinformatics.org
+
+ * gnu/CORBA/gnuRequest.java (submit): Do not read any response after
+ one way message and retry after any IOException.
+
+2006-04-09 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/CORBA/CDR/EncapsulationStream.java (constructor):
+ Set the byte order.
+
+2006-04-09 Wolfgang Baer <WBaer@gmx.de>
+
+ * org/omg/PortableServer/ServantLocatorPOA.java:
+ (preinvoke, postinvoke): Remove default implementation.
+ * org/omg/PortableServer/ServantActivatorPOA.java:
+ (incarnate, etherealize): Remove default implementation.
+ * org/omg/PortableInterceptor/ObjectReferenceFactory.java:
+ Extends from ValueBase and not from ObjectReferenceFactoryOperations.
+ (make_object): Moved method from ObjectReferenceFactoryOperations.
+ * org/omg/PortableInterceptor/ObjectReferenceFactoryOperations.java:
+ Removed unspecified interface.
+ * org/omg/DynamicAny/_DynAnyStub.java:
+ (_DynAnyStub(Delegate)): Removed constructor.
+ * org/omg/DynamicAny/_DynArrayStub.java,
+ * org/omg/DynamicAny/_DynAnyFactoryStub.java,
+ * org/omg/DynamicAny/_DynEnumStub.java,
+ * org/omg/DynamicAny/_DynFixedStub.java,
+ * org/omg/DynamicAny/_DynSequenceStub.java,
+ * org/omg/DynamicAny/_DynStructStub.java,
+ * org/omg/DynamicAny/_DynUnionStub.java,
+ * org/omg/DynamicAny/_DynValueStub.java:
+ Extend from ObjectImpl and not from _DynAnyStub.
+ (type, next, destroy, copy, rewind, assign, component_count,
+ current_component, equal, from_any, get_any, get_boolean, get_char,
+ get_double, get_dyn_any, get_float, get_long, get_longlong, get_octet,
+ get_reference, get_short, get_string, get_typecode, get_ulong,
+ get_ulonglong, get_ushort, get_val, get_wchar, get_wstring, insert_any,
+ insert_boolean, insert_char, insert_double, insert_dyn_any, insert_float,
+ insert_long, insert_longlong, insert_octet, insert_reference,
+ insert_short, insert_string, insert_typecode, insert_ulong,
+ insert_ulonglong, insert_ushort, insert_val, insert_wchar,
+ insert_wstring, seek, to_any): New methods copied from _DynAnyStub.
+ * org/omg/CosNaming/_BindingIteratorStub.java:
+ (_BindingIteratorStub(Delegate)): Made package private.
+ * org/omg/CosNaming/_NamingContextExtStub.java:
+ (_NamingContextExtStub(Delegate)): Made package private.
+ * org/omg/CosNaming/_NamingContextStub.java:
+ (_NamingContextStub(Delegate)): Made package private.
+ (throw4, throw5): Likewise.
+ * gnu/CORBA/NamingService/NameParser.java (resolve):
+ Adapt to package private constructor. Use _set_delegate instead.
+ * org/omg/CosNaming/NamingContextOperations.java: Do not extend IDLEntity.
+ * org/omg/CORBA/ORB.java:
+ (create_recursive_sequence_tc): Made abstract.
+ (get_default_context): Likewise.
+ * gnu/CORBA/OrbRestricted.java:
+ (create_recursive_sequence_tc): New moved method.
+ (get_default_context): Likewise.
+ * org/omg/CORBA/ParameterMode.java:
+ (PARAM_IN, PARAM_OUT, PARAM_INOUT): Made final.
+
+2006-04-09 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/CORBA/GIOP/MessageHeader.java (write):
+ More informative exception.
+ * gnu/CORBA/IorDelegate.java (release): Do not close the socket.
+ * gnu/CORBA/SocketRepository.java (get_socket):
+ Removed debugging code.
+
+2006-04-09 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/CORBA/gnuRequest.java (submit): Try to read the response for the
+ one way message, but ignore if EOF was received.
+ * gnu/CORBA/GIOP/MessageHeader.java (read): Set the minor code to
+ Minor.EOF if the end of file is received instead of the header.
+
+2006-04-09 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalRootPaneUI.java
+ (MetalTitlePane.IconifyAction): New inner class.
+ (MetalTitlePane.MaximizeAction): New inner class.
+ (MetalTitlePane.createActions): Create iconifyAction and
+ maximizeAction.
+ (MetalRootLayout.titlePane): New field.
+ (MetalRootLayout.MetalRootLayout): Take titlePane parameter in
+ constructor.
+ (MetalRootLayout.preferredLayoutSize): Changed to not make
+ assumptions about the actual component order.
+ (MetalRootLayout.layoutContainer): Changed to not make
+ assumptions about the actual component order.
+ (installWindowDecorations): Pass the titlePane as parameter to
+ the MetalRootLayout constructor.
+ (uninstallWindowDecorations): Changed to not make
+ assumptions about the actual component order.
+
+2006-04-08 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalRootPaneUI.java
+ (MetalTitlePane.MouseHandler): New inner class to handle dragging
+ of frames.
+ (MetalTitlePane.installListeners): Don't register a focus listener
+ on the window. This is a potential memory leak and must be
+ implemented on a different way. Install mouse listener here.
+ (installWindowDecorations): Fixed assertion condition. Always
+ insert the window decoration at index#1 in the layered
+ pane.
+
+2006-04-08 Roman Kennke <kennke@aicas.com>
+
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
+ (Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBoundsUnlocked):
+ Only resize window if actual width or height value changes.
+ Avoids nasty flicker when only setLocation() is beeing called
+ on a window.
+
+2006-04-08 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/CORBA/GIOP/MessageHeader.java (read): Throw more informative
+ exception if the magic sequence does not match.
+
+2006-04-08 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/CORBA/gnuRequest.java (p_invoke, submit): Do not try to read
+ response for the one way messages.
+
+2006-04-08 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/MenuSelectionManager.java
+ (processKeyEvent): Implemented stub method.
+ * javax/swing/JMenu.java
+ (processKeyEvent): Implemented stub method.
+ * javax/swing/JMenu.java
+ (processKeyEvent): Implemented stub method.
+ (processMenuKeyEvent): Implemented stub method.
+
+2006-04-08 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/AbstractAction.java
+ (readObject): Removed unneeded method.
+ (writeObject): Removed unneeded method.
+
+2006-04-08 Wolfgang Baer <WBaer@gmx.de>
+
+ * javax/swing/plaf/synth/SynthPainter.java:
+ (paintSplitPaneDividerBorder): Removed.
+
+2006-04-08 Wolfgang Baer <WBaer@gmx.de>
+
+ * javax/swing/plaf/basic/BasicInternalFrameTitlePane.java:
+ (CLOSE_CMD, ICONIFY_CMD, MAXIMIZE_CMD, MOVE_CMD, RESTORE_CMD, SIZE_CMD):
+ No longer constants.
+ (static_initializer): Added to initialize above fields.
+ * javax/accessibility/AccessibleRelation.java (LABEL_FOR, LABELED_BY,
+ MEMBER_OF, CONTROLLER_FOR, CONTROLLED_BY): No longer constants.
+ (static_initializer): Added to initialize above fields.
+
+2006-04-08 Wolfgang Baer <WBaer@gmx.de>
+
+ * java/awt/Dialog.java: Improved documentation all over.
+ (Dialog(Frame)): If gc is null use the owners GraphicsConfiguration.
+ (Dialog(Dialog)): Likewise.
+
+2006-04-08 Mark Wielaard <mark@klomp.org>
+
+ * java/util/jar/JarFile.java (provider): New static field.
+ (verify, verifyHashes, EntryInputStream.<init>): Pass provider
+ to `getInstance.'
+
+2006-04-08 Mark Wielaard <mark@klomp.org>
+
+ PR 27081
+ * java/lang/StackTraceElement.java (toString): Don't add space
+ between type and source indicator.
+
+2006-04-07 Casey Marshall <csm@gnu.org>
+
+ Fixes PR classpath/24464
+ * java/util/jar/JarFile.java (verify, verifyHashes,
+ EntryInputStream.<init>): pass the Gnu provider directly to
+ `getInstance.'
+
+2006-04-08 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ PR classpath/27071
+ * gnu/java/security/hash/Whirlpool.java: Updated documentation.
+ (DIGEST0): Use version 3 test vector.
+ (Sd): Removed.
+ (S_box): New field: Version 3 S-box values.
+ (<clinit>): Use Version 3 circulant matrix to construct lookup tables.
+ (transform): Formating.
+ (padBuffer): Likewise.
+ (getResult): Likewise.
+ (selfTest): Likewise.
+
+2006-04-07 Tom Tromey <tromey@redhat.com>
+
+ * java/util/InvalidPropertiesFormatException.java
+ (serialVersionUID): New field.
+ (readObject, writeObject): New methods.
+ * java/util/Arrays.java (toString): Javadoc fixes.
+ * java/net/URLConnection.java: Cleaned up imports.
+ * java/lang/reflect/ParameterizedType.java: Javadoc fix.
+ * java/lang/reflect/MalformedParameterizedTypeException.java
+ (serialVersionUID): New field.
+ * java/lang/reflect/GenericSignatureFormatError.java
+ (serialVersionUID): New field.
+ * java/lang/Class.java (Class): Javado fixes.
+ (getComponentType): Likewise.
+ (getGenericInterfaces): Likewise.
+ (getTypeParameters): Likewise.
+ * java/io/CharArrayWriter.java (append): Javadoc fixes.
+ * java/lang/annotation/AnnotationFormatError.java (serialVersionUID):
+ New field.
+ * java/lang/TypeNotPresentException.java (serialVersionUID): New
+ field.
+ * java/lang/EnumConstantNotPresentException.java (serialVersionUID):
+ New field.
+
+2006-04-07 Wolfgang Baer <WBaer@gmx.de>
+
+ * java/awt/Dialog.java
+ (AccessibleAWTDialog): Added api docs
+ (AccessibleAWTDialog.getAccessibleStateSet):
+ Renamed from getAccessibleState.
+ * java/awt/Frame.java
+ (AccessibleAWTFrame): Added api docs
+ (AccessibleAWTFrame.getAccessibleStateSet):
+ Renamed from getAccessibleState.
+
+2006-04-07 Wolfgang Baer <WBaer@gmx.de>
+
+ * java/awt/Dialog.java: Reformatted.
+
+2006-04-07 Lillian Angel <langel@redhat.com>
+
+ * java/awt/Component.java
+ (eventTypeEnabled): Added code for HierarchyEvent.HIERARCHY_CHANGED,
+ HierarchyEvent.ANCESTOR_MOVED and HierarchyEvent.ANCESTOR_RESIZED.
+
+2006-04-07 Tom Tromey <tromey@redhat.com>
+
+ * java/beans/beancontext/BeanContextMembershipEvent.java
+ (serialVersionUID): New field.
+ * java/beans/beancontext/BeanContextServicesSupport.java
+ (addBeanContextServicesListener): Synchronize.
+ (addService): Implemented.
+ (createBCSChild): Implemented.
+ (BCSSChild): Added arguments.
+ (fireServiceAdded): Implemented.
+ (fireServiceRevoked): Implemented.
+ (getCurrentServiceSelectors): Implemented.
+ (hasService): Implemented.
+ (removeBeanContextServicesListener): Implemented.
+ (serviceAvailable): Implemented.
+ (serviceRevoked): Implemented.
+ * java/beans/beancontext/BeanContextSupport.java (BCSChild): Added
+ arguments.
+ (createBCSChild): Implemented.
+ (BeanContextSupport):
+ (addBeanContextMembershipListener): Synchronize.
+ (fireChildrenAdded): Implemented.
+ (fireChildrenRemoved): Implemented.
+ (BeanContextSupport): Use default locale.
+ (isEmpty): Implemented.
+ (isDesignTime): Implemented.
+ (size): Implemented.
+ (toArray): Synchronized.
+ (toArray): Likewise.
+ (iterator): Likewise.
+ (BCSIterator): Implemented.
+ (bcsChildren): Implemented.
+ (validatePendingAdd): Implemented.
+ (validatePendingRemove): Likewise.
+ (childJustAddedHook): Implemented.
+ (childJustRemovedHook): Likewise.
+ (classEquals): Likewise.
+ (toArray): Mark as stub.
+ (setDesignTime): Implemented.
+ (copyChildren): Implemented.
+ (containsKey): Implemented.
+ (contains): Likewise.
+ (containsAll): Likewise.
+ (getResource): Implemented.
+ (getResourceAsStream): Likewise.
+ (removeBeanContextMembershipListener): Likewise.
+ * java/beans/beancontext/BeanContextServiceRevokedEvent.java
+ (serialVersionUID): New field.
+ * java/beans/beancontext/BeanContextServiceAvailableEvent.java
+ (serialVersionUID): New field.
+ * java/beans/beancontext/BeanContext.java (instantiateChild): Javadoc
+ fix.
+
+2006-04-06 Roman Kennke <kennke@aicas.com>
+
+ PR 26937
+ * javax/swing/MenuSelectionManager.java
+ (setSelectedPath): Search one more item in the loop.
+
+2006-04-06 Tom Tromey <tromey@redhat.com>
+
+ * java/awt/image/renderable/RenderableImageProducer.java
+ (image, context, consumers): New fields.
+ (RenderableImageProducer): Implemented.
+ (setRenderContext): Likewise.
+ (addConsumer): Likewise.
+ (isConsumer): Likewise.
+ (removeConsumer): Likewise.
+ (startProduction): Likewise.
+
+2006-04-06 Roman Kennke <kennke@aicas.com>
+
+ * java/awt/Component.java
+ (AccessibleAWTComponent.getBounds): Return the component
+ bounds regardless of its showing state.
+ (AccessibleAWTComponent.getLocation): Return the component
+ location regardless of its showing state.
+ (AccessibleAWTComponent.getSize): Return the component
+ size regardless of its showing state.
+
+2006-04-06 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JRootPane.java
+ (getAccessibleContext): New method. Provides an accessibleContext
+ for JRootPanes.
+
+2006-04-06 Roman Kennke <kennke@aicas.com>
+
+ * java/awt/Toolkit.java
+ (initAccessibility): Use the 'gnu.classpath.home.url' property
+ to determine the system confiuration directory.
+ * java/awt/Component.java
+ (dispatchEvent): Trigger Toolkit dispatching here.
+ (dispatchEventImpl): Moved Toolkit dispatching to dispatchEvent,
+ so it can't be overridden by subclasses and is performed in
+ any case.
+
+2006-04-06 Wolfgang Baer <WBaer@gmx.de>
+
+ * javax/naming/Binding.java: Added API docs.
+ * javax/naming/NameClassPair.java: Added API docs.
+ (fullName): New field.
+ (setNameInNamespace): New 1.5 method.
+ (getNameInNamespace): Likewise.
+
+2006-04-06 Wolfgang Baer <WBaer@gmx.de>
+
+ * javax/naming/CompositeName.java:
+ (readObject): New deserialization method.
+ (writeObject): New serialization method.
+
+2006-03-29 Nektarios K. Papadopoulos <npapadop at inaccessnetworks.com>
+
+ * javax/security/auth/x500/X500Principal.java
+ (readAttributeValue) Check for separator after quoted value was
+ failing in all cases.
+
+2006-04-06 Mark Wielaard <mark@klomp.org>
+
+ * java/lang/Class.java (getClassLoader): Don't do security check
+ when loader is null.
+
+2006-04-06 Roman Kennke <kennke@aicas.com>
+
+ * java/awt/Toolkit.java
+ (getDefaultToolkit): Initialize accessibility after setting
+ up the toolkit.
+ (initAccessibility): New helper method to setup accessibility.
+
+2006-04-06 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/AbstractButton.java
+ (AccessibleAbstractButton.getAccessibleIcon): Implemented stub.
+ (AccessibleAbstractButton.getAccessibleRelationSet): Implemented
+ stub.
+ (AccessibleAbstractButton.getIndexAtPoint): Implemented stub.
+ (AccessibleAbstractButton.getAccessibleIcon): Implemented stub.
+ (AccessibleAbstractButton.getCharacterBounds): Implemented stub.
+ (AccessibleAbstractButton.getCharCount): Implemented stub.
+ (AccessibleAbstractButton.getCaretPosition): Implemented stub.
+ (AccessibleAbstractButton.getCharacterAttribute): Implemented stub.
+ (AccessibleAbstractButton.getSelectionStart): Implemented stub.
+ (AccessibleAbstractButton.getSelectionEnd): Implemented stub.
+ (AccessibleAbstractButton.getSelectedText): Implemented stub.
+ (AccessibleAbstractButton.getTextRectangle): Removed unneeded
+ private method.
+
+2006-04-06 Roman Kennke <kennke@aicas.com>
+
+ * java/awt/Component.java
+ (AccessibleAWTComponent.getAccessibleStateSet): Don't handle opaque
+ state here. This is only done in JComponent.
+ * javax/swing/JComponent.java
+ (AccessibleJComponent.getAccessibleStateSet): Handle opaque flag
+ here.
+ (getNextFocusableComponent): Implemented stub method.
+ (grabFocus): Implemented stub method.
+ (unregisterKeyboardAction): Implemented stub method.
+ (setNextFocusableComponent): Implemented stub method.
+ * javax/swing/CompatibilityFocusTraversalPolicy.java: New file.
+ This is a helper class for providing compatibility with the older
+ Swing focus API.
+
+2006-04-06 Wolfgang Baer <WBaer@gmx.de>
+
+ Fixes bug #26995
+ * javax/naming/directory/BasicAttribute.java,
+ * javax/naming/directory/BasicAttributes.java:
+ (readObject): New deserialization method.
+ (writeObject): New serialization method.
+
+2006-04-06 Wolfgang Baer <WBaer@gmx.de>
+
+ * javax/xml/validation/SchemaFactory.java: Corrected since tag.
+ (getErrorHandler): Made method abstract.
+ (setErrorHanlder): Likewise.
+ * gnu/xml/validation/relaxng/RELAXNGSchemaFactory.java
+ (getErrorHandler): Implement abstract method from superclass.
+ (setErrorHandler): Likewise.
+ (errorHandler): New field.
+ * gnu/xml/validation/xmlschema/XMLSchemaSchemaFactory.java:
+ (getErrorHandler): Implement abstract method from superclass.
+ (setErrorHandler): Likewise.
+ (errorHandler): New field.
+ * javax/xml/XMLConstants.java: Corrected since tag.
+ (XMLConstants): Added private constructor.
+ * javax/xml/datatype/Duration.java: Corrected since tag.
+ (multiply): Made method abstract.
+ * javax/xml/datatype/DatatypeConstants.java: Corrected since tag.
+ (DatatypeConstants): Added private constructor.
+ * javax/xml/xpath/XPathConstants.java: Corrected since tag.
+ (XPathConstants): Added private constructor.
+
+2006-04-05 Tom Tromey <tromey@redhat.com>
+
+ * javax/security/auth/kerberos/ServicePermission.java: Now final.
+
+2006-04-05 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/26625:
+ * lib/Makefile.am (compile-classes): Touch the output file.
+
+2006-04-05 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/AbstractButton.java
+ (AccessibleAbstractButton.getAccessibleStateSet): Removed handling
+ of the focused state. This is already done in AccessibleAWTComponent.
+
+2006-04-05 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JComponent.java
+ (accessibleContext): Fixed API doc for this field.
+ (AccessibleJComponent.AccessibleFocusHandler): Fixed API docs.
+ (AccessibleJComponent.AccessibleFocusHandler.focusGained):
+ Implemented and added API docs.
+ (AccessibleJComponent.AccessibleFocusHandler.focusLost):
+ Implemented and added API docs.
+ (AccessibleJComponent.AccessibleContainerHandler): Fixed API docs.
+ (AccessibleJComponent.AccessibleContainerHandler.componentAdded):
+ Implemented and added API docs.
+ (AccessibleJComponent.AccessibleContainerHandler.componentRemoved):
+ Implemented and added API docs.
+ (AccessibleJComponent.accessibleContainerHandler): Added API docs.
+ (AccessibleJComponent.accessibleFocusHandler): Added API docs.
+ (AccessibleJComponent.addPropertyChangeListener): Added API docs.
+ (AccessibleJComponent.removePropertyChangeListener): Added API docs.
+ (AccessibleJComponent.getAccessibleStateSet): Simply return
+ super here. Added comment about this.
+
+2006-04-05 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JComponent.java
+ (AccessibleJComponent.addPropertyChangeListener): Install
+ ContainerHandler and FocusHandler here.
+ (AccessibleJComponent.removePropertyChangeListener): Uninstall
+ ContainerHandler and FocusHandler here.
+ (AccessibleJComponent.getAccessibleChildrenCount): Replaced
+ by super.getAccessibleChildrenCount().
+ (AccessibleJComponent.getAccessibleChild): Replaced
+ by super.getAccessibleChild().
+ (AccessibleJComponent.getAccessibleStateSet): Implemented by
+ adding OPAQUE to the supported states.
+ (AccessibleJComponent.getAccessibleName): Added titled border
+ and label fallbacks.
+ (AccessibleJComponent.getAccessibleDescription): Added tooltip
+ and label fallbacks.
+ (AccessibleJComponent.getAccessibleRole): Removed TODO.
+ (AccessibleJComponent.getAccessibleKeyBinding): Added comment
+ explaining why return null seems correct here.
+ * javax/swing/JLabel.java
+ (LABEL_PROPERTY): New constant.
+ (setLabelFor): Store label in labeled component's client properties
+ for the AccessibleJComponent to read.
+
+2006-04-05 Tom Tromey <tromey@redhat.com>
+
+ * java/util/zip/ZipFile.java (available): Defer to super if
+ entry's size is unknown.
+
+2006-04-05 Tom Tromey <tromey@redhat.com>
+
+ * java/net/MimeTypeMapper.java (MimeTypeMapper): Look for system
+ property with mime.types name.
+ * gnu/classpath/SystemProperties.java: Set
+ gnu.classpath.mime.types.file if not already set.
+ * java/net/URLConnection.java (defaultFactory): New field.
+ (guessContentTypeFromStream): Mark as unimplemented.
+ (getContentHandler): Updated with libgcj's implementation.
+ * gnu/java/net/DefaultContentHandlerFactory.java: New file,
+ from libgcj.
+
+2006-04-05 Bryce McKinlay <mckinlay@redhat.com>
+
+ PR classpath/27028
+ PR classpath/24752
+ * java/util/AbstractList.java (hasNext): Don't throw
+ ConcurrentModificationException. Update Javadoc.
+ (hasPrevious): Likewise.
+ (nextIndex): Likewise.
+ (previousIndex): Likewise.
+ * java/util/HashMap.java (hasNext): Likewise.
+ * java/util/Hashtable.java (hasNext): Likewise.
+ * java/util/IdentityHashMap.java (hasNext): Likewise.
+ * java/util/LinkedHashMap.java (hasNext): Likewise.
+ * java/util/LinkedList.java (nextIndex): Likewise.
+ (previousIndex): Likewise.
+ (hasNext): Likewise.
+ (hasPrevious): Likewise.
+ * java/util/TreeMap.java (hasNext): Likewise.
+ * java/util/WeakHashMap.java (hasNext): Likewise.
+
+2006-04-05 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/AbstractButton.java
+ (AccessibleAbstractButton.getAccessibleStateSet): Implemented stub.
+ (AccessibleAbstractButton.doAccessibleAction): Implemented stub.
+ (AccessibleAbstractButton.getAccessibleAction): Implemented stub.
+ (AccessibleAbstractButton.getAccessibleActionCount): Implemented stub.
+ (AccessibleAbstractButton.getAccessibleActionDescription):
+ Implemented stub.
+ (AccessibleAbstractButton.getAccessibleText): Implemented stub.
+ (AccessibleAbstractButton.getAccessibleAction): Implemented stub.
+ (AccessibleAbstractButton.getCurrentAccessibleValue): Implemented stub.
+ (AccessibleAbstractButton.setCurrentAccessibleValue): Implemented stub.
+ (AccessibleAbstractButton.getMinimumAccessibleValue): Implemented stub.
+ (AccessibleAbstractButton.getMaximumAccessibleValue): Implemented stub.
+
+2006-04-05 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JComboBox.java
+ (selectWithKeyChar): Implemented stubbed method.
+
+2006-04-05 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/LookAndFeel.java
+ (installProperty): New method. Allows primitive typed properties
+ to be handled like UIResources.
+ * javax/swing/AbstractButton.java
+ (clientBorderPaintedSet): New field.
+ (clientRolloverEnabledSet): New field.
+ (clientIconTextGapSet): New field.
+ (clientContentAreaFilledSet): New field.
+ (setRolloverEnabled): Set the client field to true.
+ (setBorderPainted): Likewise.
+ (setIconTextGap): Likewise.
+ (setContentAreaFilled): Likewise.
+ (setUIProperty): New helper method.
+ * javax/swing/JComponent.java
+ (clientOpaqueSet): New field.
+ (clientAutoscrollsSet): New field.
+ (setAutoscrolls): Set the client field to true.
+ (setOpaque): Likewise.
+ (setUIProperty): New helper method.
+ * javax/swing/JDesktopPane.java
+ (clientDragModeSet): New field.
+ (setDragMode): Set the client field to true.
+ (setUIProperty): New helper method.
+ * javax/swing/JSplitPane.java
+ (clientDividerSizeSet): New field.
+ (clientOneTouchExpandableSet): New field.
+ (setDividerSize): Set the client field to true.
+ (setOneTouchExpandable): Likewise.
+ (setUIProperty): New helper method.
+ * javax/swing/JTable.java
+ (clientRowHeightSet): New field.
+ (setRowHeight): Set the client field to true.
+ (setUIProperty): New helper method.
+ * javax/swing/JTree.java
+ (clientRowHeightSet): New field.
+ (clientScrollsOnExpandSet): New field.
+ (clientShowsRootHandlesSet): New field.
+ (setRowHeight): Set the client field to true.
+ (setShowsRootHandles): Likewise.
+ (setScrollsOnExpand): Likewise.
+ (setUIProperty): New helper method.
+
+2006-04-05 Roman Kennke <kennke@aicas.com>
+
+ * java/awt/Component.java
+ (getFont): Don't request the font from the peer's graphics. The
+ graphics should instead get the font from the Component, which might
+ result in a loop.
+ (getFocusCycleAncestor): Don't special case Window.
+ (nextFocus): Moved implementation from the DefaultKeyboardFocusManager
+ to here. Correctly determine the focus cycle root.
+ (transferFocusBackward): Likewise.
+ (transferFocusUpCycle): Likewise.
+ * java/awt/Container.java
+ (transferFocusDownCycle): Moved implementation from
+ DefaultKeyboardFocusManager to here.
+ * java/awt/DefaultKeyboardFocusManager.java
+ (focusPreviousComponent): Moved implementation to
+ Component.transferFocusBackward().
+ (focusNextComponent): Moved implementation to
+ Component.nextFocus().
+ (upFocusCycle): Moved implementation to
+ Component.transferFocusUpCycle().
+ (downFocusCycle): Moved implementation to
+ Container.transferFocusDownCycle().
+
+2006-04-05 David Gilbert <david.gilbert@object-refinery.com>
+
+ * java/awt/image/ComponentSampleModel.java
+ (equals): Implemented,
+ (hashCode): Likewise.
+
+2006-04-05 Jeroen Frijters <jeroen@frijters.net>
+
+ * java/lang/Class.java
+ (cast): New method.
+
+2006-04-05 David Gilbert <david.gilbert@object-refinery.com>
+
+ * java/awt/image/ComponentSampleModel.java
+ (getBankIndices): Return a copy of the array, not a reference to the
+ original,
+ (getBandOffsets): Likewise.
+
+2006-04-05 David Gilbert <david.gilbert@object-refinery.com>
+
+ * java/awt/image/ComponentSampleModel.java: Added API docs all over.
+
+2006-04-04 Tom Tromey <tromey@redhat.com>
+
+ * java/net/MimeTypeMapper.java (MimeTypeMapper): Fixed indices.
+
+2006-04-04 Tom Tromey <tromey@redhat.com>
+
+ * java/net/MimeTypeMapper.java (mime_types): No longer static.
+ (MimeTypeMapper): Initialize.
+ (fillFromFile): New method.
+ (main): New method.
+ (mime_strings): Updated.
+
+2006-04-04 Tom Tromey <tromey@redhat.com>
+
+ * lib/gen-classlist.sh.in: Correct handle generated files.
+
+2006-04-04 Ito Kazumitsu <kaz@maczuka.gcd.org>
+
+ * gnu/regexp/CharIndexed.java(setAnchor): New method.
+ * gnu/regexp/CharIndexedInputStream.java(setAnchor): New method.
+ * gnu/regexp/CharIndexedCharSequence.java: New file.
+ * gnu/regexp/CharIndexedCharArray.java: Rewritten as an extention of
+ gnu.regexp.CharIndexedCharSequence.
+ * gnu/regexp/CharIndexedString.java: Likewise.
+ * gnu/regexp/CharIndexedStringBuffer.java: Likewise.
+ * gnu/regexp/RE.java(makeCharIndexed): Make a new CharIndexed
+ using CharIndexedCharSequence. Use setAnchor when the input
+ object is already a CharIndexed.
+ * java/util/regex/Matcher.java(inputCharIndexed): New field
+ to be used as a parameter of the RE#getMatch.
+
+2006-04-04 David Gilbert <david.gilbert@object-refinery.com>
+
+ * java/awt/image/SampleModel.java: Reformatted.
+
+2006-04-04 David Gilbert <david.gilbert@object-refinery.com>
+
+ * java/awt/image/ComponentSampleModel.java
+ (ComponentSampleModel(int, int, int, int, int[])): Added API
+ documentation,
+ (ComponentSampleModel(int, int, int, int, int[], int[]): Throw
+ IllegalArgumentException for DataBuffer.TYPE_UNDEFINED, take copies
+ of the bandOffsets and bankIndices arguments, added API documentation,
+ * java/awt/image/SampleModel.java
+ (SampleModel(int, int, int, int): Throw IllegalArgumentException for
+ unrecognised dataTypes, w * h exceeds Integer.MAX_VALUE, and numBands
+ less than or equal to zero, added API documentation.
+
+2006-04-04 Lillian Angel <langel@redhat.com>
+
+ * java/util/zip/ZipFile.java
+ (getInputStream): Fixed to return size of ZipEntry
+ minus the total bytes read. This guarantees that the
+ right value is returned even if some bytes have already
+ been read.
+
+2006-04-04 Thomas Fitzsimmons <fitzsim@redhat.com>
+
+ * javax/imageio/plugins/jpeg/JPEGImageWriteParam.java (messages):
+ Remove static modifier.
+
+2006-04-04 David Gilbert <david.gilbert@object-refinery.com>
+
+ * java/awt/image/ComponentSampleModel.java: Reformatted.
+
+2006-04-03 Thomas Fitzsimmons <fitzsim@redhat.com>
+
+ * javax/imageio/plugins/jpeg/JPEGImageWriteParam.java: New file.
+ * javax/imageio/plugins/jpeg/JPEGImageReadParam.java: Add
+ retrieval instructions to javadoc header.
+ * javax/imageio/ImageWriteParam.java: Fix javadoc for
+ compressionType field.
+ * lib/Makefile.am (propertydirs): Add javax directory.
+ (propertyfiles): Likewise.
+ * resource/javax/imageio/plugins/jpeg/MessagesBundle.properties:
+ New file.
+
+2006-04-03 Tom Tromey <tromey@redhat.com>
+
+ PR classpath/26971:
+ * javax/naming/directory/BasicAttribute.java: Added missing @since.
+ (BasicAttributeEnumeration.where): Initialize to 0.
+ (BasicAttributeEnumeration.nextElement): Post-increment 'where'.
+
+2006-04-03 Lillian Angel <langel@redhat.com>
+
+ PR classpath/24596 and PR classpath/26930
+ * java/util/zip/ZipFile.java
+ (getInputStream): Override available function for
+ InflaterInputStream instance.
+
+2006-04-03 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * gnu/java/lang/reflect/ClassSignatureParser.java,
+ * gnu/java/lang/reflect/FieldSignatureParser.java,
+ * gnu/java/lang/reflect/GenericSignatureParser.java,
+ * gnu/java/lang/reflect/MethodSignatureParser.java,
+ * gnu/java/lang/reflect/TypeImpl.java,
+ * java/lang/Class.java,
+ * java/lang/reflect/GenericDeclaration.java,
+ * java/lang/reflect/MalformedParameterizedTypeException.java,
+ * java/lang/reflect/TypeVariable.java,
+ * java/util/Arrays.java,
+ * vm/reference/java/lang/VMClass.java,
+ * vm/reference/java/lang/reflect/Constructor.java,
+ * vm/reference/java/lang/reflect/Method.java:
+ Incorporate changes from the generics branch.
+
+2005-10-01 Jeroen Frijters <jeroen@frijters.net>
+
+ * vm/reference/java/lang/reflect/Constructor.java
+ (getSignature): New method.
+ (getGenericExceptionTypes): New method.
+ (getGenericParameterTypes): New method.
+ * vm/reference/java/lang/reflect/Method.java
+ (getSignature): New method.
+ (getGenericExceptionTypes): New method.
+ (getGenericParameterTypes): New method.
+ (getGenericReturnType): New method.
+
+2005-09-30 Jeroen Frijters <jeroen@frijters.net>
+
+ * gnu/java/lang/reflect/FieldSignatureParser.java: New file.
+ * gnu/java/lang/reflect/ClassSignatureParser.java,
+ gnu/java/lang/reflect/GenericSignatureParser.java,
+ gnu/java/lang/reflect/MethodSignatureParser.java:
+ Finished implementation.
+
+2005-09-25 Jeroen Frijters <jeroen@frijters.net>
+
+ * gnu/java/lang/reflect/ClassSignatureParser.java,
+ gnu/java/lang/reflect/GenericSignatureParser.java,
+ gnu/java/lang/reflect/MethodSignatureParser.java: New files.
+ * java/lang/Class.java
+ (getGenericInterfaces, getGenericSuperclass, getTypeParameters):
+ Implemented.
+ * vm/reference/java/lang/VMClass.java
+ (getSimpleName, getDeclaredAnnotations, getCanonicalName,
+ getEnclosingClass, getEnclosingConstructor, getEnclosingMethod,
+ isAnonymousClass, isLocalClass, isMemberClass):
+ Removed generic types from signatures.
+ (getGenericInterfaces, getGenericSuperclass, getTypeParameters):
+ Removed.
+ (getClassSignature): New method.
+ * vm/reference/java/lang/reflect/Constructor.java
+ (getTypeParameters): Implemented.
+ * vm/reference/java/lang/reflect/Method.java
+ (getTypeParameters, getSignature): New methods.
+
+2005-06-09 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/lang/Class.java:
+ (asSubclass(Class)): Documented.
+ (getCanonicalName()): Implemented.
+ (getEnclosingClass()): Implemented.
+ (getEnclosingConstructor()): Implemented.
+ (getEnclosingMethod()): Implemented.
+ (getGenericInterfaces()): Implemented.
+ (getGenericSuperclass()): Implemented.
+ (getTypeParameters()): Implemented.
+ (isAnonymousClass()): Implemented.
+ (isLocalClass()): Implemented.
+ (isMemberClass()): Implemented.
+ * vm/reference/java/lang/VMClass.java:
+ (getSuperClass(Class<?>)): Updated return type.
+ (getSimpleName(Class<?>)): Use VM methods directly.
+ (getCanonicalName(Class<?>)): Implemented.
+ (getEnclosingClass(Class<?>)): New native method.
+ (getEnclosingConstructor(Class<?>)): New native method.
+ (getEnclosingMethod(Class<?>)): New native method.
+ (getGenericInterfaces(Class<?>)): New native method.
+ (getGenericSuperclass(Class<?>)): New native method.
+ (getTypeParameters(Class<T>)): New native method.
+ (isAnonymousClass(Class<?>)): New native method.
+ (isLocalClass(Class<?>)): New native method.
+ (isMemberClass(Class<?>)): New native method.
+ * vm/reference/java/lang/reflect/Constructor.java:
+ (getTypeParameters()): Changed to native method.
+
+2005-05-05 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/lang/Class.java:
+ (getSimpleName()): Implemented.
+ * vm/reference/java/lang/VMClass.java:
+ (getSimpleName()): Reference implementation.
+
+2005-04-20 Tom Tromey <tromey@redhat.com>
+
+ * java/util/Arrays.java (hashCode): New methods.
+ (deepHashCode): New method.
+ (deepEquals): Likewise.
+ (toString): New methods.
+ (deepToString): New method.
+
+2005-04-04 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/lang/Class.java:
+ (isEnum()): New method implemented.
+ (isSynthetic()): New method implemented.
+ (isAnnotation()): New method implemented.
+ * vm/reference/java/lang/VMClass.java:
+ (isEnum()): New native method.
+ (isSynthetic()): New native method.
+ (isAnnotation()): New native method.
+
+2005-03-21 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/lang/Class.java:
+ Implements java.lang.reflect.Type
+
+2006-04-03 Thomas Fitzsimmons <fitzsim@redhat.com>
+
+ * javax/imageio/plugins/jpeg/JPEGImageReadParam.java: New file.
+
+2006-04-03 Tom Tromey <tromey@redhat.com>
+
+ * javax/security/auth/kerberos/ServicePermission.java: New file.
+ * javax/security/auth/kerberos/DelegationPermission.java: New file.
+ * javax/security/auth/kerberos/KerberosKey.java: New file.
+ * javax/security/auth/kerberos/KeyImpl.java: New file.
+ * javax/security/auth/kerberos/KerberosTicket.java: New file.
+ * javax/security/auth/kerberos/KerberosPrincipal.java: New file.
+
+2006-04-03 Sven de Marothy <sven@physto.se>
+
+ * gnu/java/awt/peer/gtk/GtkClipboard.java: Add support for
+ non-GtkImage images.
+
+2006-04-03 Mark Wielaard <mark@klomp.org>
+
+ * lib/gen-classlist.sh.in: Use classes.tmp, not classes.2
+ as temporary file name.
+
+2006-04-03 Dalibor Topic <robilad@kaffe.org>
+
+ * INSTALL: Documented --with-glibj-zip option.
+
+2006-04-03 Dalibor Topic <robilad@kaffe.org>
+
+ Fixed all pscan warnings.
+
+ * native/jni/classpath/jcl.c (JCL_ThrowException),
+ native/jni/classpath/jcl.h (DBG),
+ native/target/generic/target_generic.h (TARGET_NATIVE_LAST_ERROR_STRING_FORMAT),
+ native/target/generic/target_generic_misc.h (TARGET_NATIVE_MISC_FORMAT_STRING0):
+ Use "%s" format in fprintf and snprintf explicitely when printing a single
+ string to prevent format string exploits.
+
+ * native/jni/java-net/javanet.h (DBG): Removed duplicate
+ definition. Included jcl.h instead.
+
+2006-04-03 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/jarsigner/Main.java: Removed unused imports.
+ (provider): Made it protected.
+ (providerInstalled): New field.
+ (Main): Made it a 0-arguments constructor.
+ Removed throws clasue.
+ (main): Removed throws clause.
+ Call processArgs(args) after constructing instance.
+ Call teardown() before existing.
+ (processArgs): Added javadoc.
+ Reduced to throws Exception.
+ (start): Likewise.
+ (teardown): New method.
+ (setupCommonParams): Added javadoc.
+ Install designated provider if not already installed.
+ (installNewProvider): New method.
+ (setupSigningParams): Added javadoc.
+ Instantiate the KeyStore using type only.
+ * tools/gnu/classpath/tools/jarsigner/JarSigner.java:
+ Removed unused imports.
+ (start): Reduced to throws Exception.
+ * tools/gnu/classpath/tools/jarsigner/JarVerifier.java (start): Likewise.
+ * tools/gnu/classpath/tools/jarsigner/HashUtils.java:
+ Re-organized imports.
+ * gnu/java/security/key/KeyPairGeneratorFactory.java (getInstance):
+ Test ignoring case.
+ (getNames): Add "dsa" as an algorithm provided by this Factory.
+ (makeInstance): Construct IllegalArgumentException with 2 arguments.
+
+2006-04-03 Roman Kennke <kennke@aicas.com>
+
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
+ (Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector):
+ Replaced g_free() with pango_item_free() to avoid problems
+ with the allocator.
+
+2006-04-03 Rafael H. Schloming <rafaels@redhat.com>
+
+ Fixes bug #26668
+ * java/util/logging/Level.java (parse): Document.
+ * java/util/logging/LogManager.java (rootLogger): Removed.
+ (LogManager): Just set loggers to new HashMap.
+ (getLogManager): Make synchronized. Create and init LogManager if it
+ doesn't exist yet.
+ (static): Removed block.
+ (MANAGER_PROPERTY): New private final string.
+ (makeLogManager): Use new property string, move warning to
+ createInstance() method.
+ (CONFIG_PROPERTY): New private final string.
+ (initLogManager): New method.
+ (addLogger): Use Logger.root, not rootLogger.
+ (findAncestor): Likewise.
+ (readConfiguration): Move warning to createInstance() method.
+ Add handlers directly to Logger.root. Warn about bad level values.
+ (getClassProperty): Use new locateClass() method.
+ (getInstanceProperty): Only catch specific newInstance Errors.
+ (createInstance): Make private and takes a string to use in warning
+ messages. Use new locateClass() method and generate appropriate
+ warning message.
+ (warn): New methods.
+ (locateClass): Locates a class through the context class loader and
+ system class loader as backup.
+ * java/util/logging/Logger.java (root): New static final field.
+ (Logger): Set parent to root.
+ (setParent): Directly check root field.
+
+2006-04-02 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/Segment.java:
+ (setPosition): Make exception message more verbose.
+ * javax/swing/text/WrappedPlainView.java:
+ (insertUpdate): Removed unneeded repaint call.
+ (changeUpdate): Dito.
+ (removeUpdate): Dito.
+ (WrappedLine.determineNumLines): Do not return numLines, break
+ from loop if no new break point has been calculated.
+ (WrappedLine.updateDamage): Rewritten.
+ (WrappedLine.insertUpdate): Removed unneeded update code.
+ (WrappedLine.removeUpdate): Removed unneeded update code, added
+ comment.
+
+2006-04-02 Dalibor Topic <robilad@kaffe.org>
+
+ * configure.ac (with-glibj-zip): Added new option.
+
+ * examples/Makefile.am,
+ lib/Makefile.am,
+ tools/Makefile.am: Adapted build classpath to use glibj.zip,
+ in addition to classes in lib directory.
+
+2006-04-02 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * tools/gnu/classpath/tools/giop/GRMIC.java,
+ tools/gnu/classpath/tools/giop/IorParser.java,
+ tools/gnu/classpath/tools/giop/grmic/CompilationError.java,
+ tools/gnu/classpath/tools/giop/grmic/Generator.java,
+ tools/gnu/classpath/tools/giop/grmic/GiopIo.java,
+ tools/gnu/classpath/tools/giop/grmic/GiopRmicCompiler.java,
+ tools/gnu/classpath/tools/giop/grmic/HashFinder.java,
+ tools/gnu/classpath/tools/giop/grmic/MethodGenerator.java,
+ tools/gnu/classpath/tools/rmi/RMIC.java,
+ tools/gnu/classpath/tools/rmi/rmic/RmiMethodGenerator.java,
+ tools/gnu/classpath/tools/rmi/rmic/RmicCompiler.java,
+ tools/gnu/classpath/tools/rmi/rmic/WrapUnWrapper.java: Removed
+ linking exception from the licensing header.
+ * tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl_Stub.java:
+ Added licensing header.
+
+2006-04-02 Mark Wielaard <mark@klomp.org>
+
+ * tools/Makefile.am (bin_SCRIPTS): Renamed to jarsigner.sh.
+ (jarsigner): Removed.
+
+2006-04-02 Dalibor Topic <robilad@kaffe.org>
+
+ * configure.ac: don't check for isnan function.
+ * native/fdlibm/fdlibm.h: Always use the isnan macro.
+
+2006-04-02 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * configure.ac: Added tools/jarsigner.sh to AC_CONFIG_FILES.
+ * tools/Makefile.am: Generate jarsigner shell script.
+ * tools/jarsigner.sh.in: New template.
+ * tools/.cvsignore: Added jarsigner.sh.
+
+2006-04-02 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/jarsigner/HashUtils.java: Use GPL.
+ * tools/gnu/classpath/tools/jarsigner/SFHelper.java: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/JarVerifier.java: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/JarSigner.java: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/Main.java: Likewise.
+ Re-organised imports.
+
+2006-04-01 Bernhard Rosenkraenzer <bero@arklinux.org>
+
+ PR classpath/25924:
+ * java/awt/image/DirectColorModel.java (extractAndNormalizeSample):
+ Handle case where alpha==0.
+
+2006-04-02 Robert Schuster <robertschuster@fsfe.org>
+
+ PR #26676
+ * javax/swing/text/Utilities.java:
+ (getTabbedTextOffset): Added check to decrement pos not below zero,
+ changed '>' comparison to '>='.
+ * javax/swing/text/WrappedPlainView.java:
+ (lineHeight): New field.
+ (calculateBreakPosition): Throw InternalError in catch block, removed
+ unneeded brackets, use specific version of
+ Utilities.getTabbedTextOffset.
+ (paint): Set various properties neccessary for drawing.
+ (WrappedLine.paint): Removed code to set field of outer class.
+ (WrappedLine.modelToView): Removed unneeded expression from
+ if-statement.
+ (WrappedLine.viewToModel): Initialize end with endOffset - 1, removed
+ -1 from return statement, copy only a subset into the Segment, removed
+ special handling of mark value - just return it, simplified
+ incrementation of currLineStart.
+ (WrappedLine.insertUpdate): Recalculate numLines, report preference
+ change to parent view.
+ (WrappedLine.removeUpdate): Dito.
+
+2006-04-02 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/Segment.java:
+ (toString): Return empty string when array is null.
+
+2006-04-02 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/plaf/basic/BasicTextUI.java:
+ (damageRange): Use SwingUtilities.computeUnion to avoid
+ unneccessary Rectangle instantiation.
+
+2006-04-01 Tom Tromey <tromey@redhat.com>
+
+ * java/security/cert/Certificate.java (serialVersionUID): Fixed.
+
+2006-04-01 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/CompositeView.java: Fixed copyright header.
+ * javax/swing/text/BoxView.java: Fixed copyright header.
+ * javax/swing/text/WrappedPlainView.java: Fixed copyright header.
+ * javax/swing/text/Utilities.java: Fixed copyright header.
+
+2006-04-01 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/CompositeView.java:
+ (modelToView): Throw BadLocationException when no child
+ view can be found, restructed to throw exception as early
+ as possible.
+ (viewToModel): Use mutable allocation as argument for viewToModel
+ call on child view.
+ * javax/swing/text/BoxView.java:
+ (getViewAtPoint): Call setBounds() r before method returns with
+ suitable child view.
+ * javax/swing/text/Utilities.java:
+ (getPositionBelow): Added try-catch-block around modelToView call,
+ added method return when BadLocationException was thrown.
+ * javax/swing/text/WrappedPlainView.java:
+ (WrappedLine.viewToModel): Changed '<=' to '<' in if-expression,
+ added note about meaning of rect.x and rect.width, removed unneeded
+ checks, added code to not return the last possible document offset.
+
+2006-04-01 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/WrappedPlainView.java:
+ (WrappedLine.viewToModel): Change < to <= in if-statement,
+ removed addition of currLineStart to return value.
+ * javax/swing/text/BoxView.java:
+ (getViewAtPoint): Use copy instead of r for method call
+ which modifies the second argument.
+
+2006-04-01 Mark Wielaard <mark@klomp.org>
+
+ Fixes PR26973
+ * java/util/jar/Attributes.java: Fully qualify java.util.Map.
+
+2006-03-31 Tom Tromey <tromey@redhat.com>
+
+ * lib/split-for-gcj.sh: Updated for multi-field format.
+ * lib/Makefile.am (CLEANFILES): Added classes.2.
+ * lib/gen-classlist.sh.in (GCJ): Removed. Create classes.1 and
+ classes.2 using multiple fields.
+
+2006-03-31 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTable.java (columnSelectionChanged):
+ Removed print statement.
+ * javax/swing/DefaultListSelectionModel.java
+ (addSelectionInterval, removeSelectionInterval):
+ Fire the difference between selection. (setLeadSelectionIndex):
+ Fire the difference and mark current and previous lead
+ selection indexes for repaint.
+
+2006-03-31 Thomas Fitzsimmons <fitzsim@redhat.com>
+
+ * javax/imageio/plugins/jpeg/JPEGHuffmanTable.java: Eliminate
+ unnecessary copying.
+ * javax/imageio/plugins/jpeg/JPEGQTable.java: Likewise.
+
+2006-03-31 Lillian Angel <langel@redhat.com>
+
+ * java/awt/Component.java
+ (translateEvent): oldKey should be the value of the
+ key char.
+
+2006-03-31 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTable.java (columnSelectionChanged):
+ Treat second repaint parameter as width.
+
+2006-03-31 Lillian Angel <langel@redhat.com>
+
+ PR classpath/26924
+ * gnu/java/awt/peer/gtk/GtkCanvasPeer.java
+ (realize): New native function.
+ * include/gnu_java_awt_peer_gtk_GtkCanvasPeer.h:
+ Added new function declaration.
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
+ (realize): New function.
+
+2006-03-31 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/GapContent.java:
+ (replace): Move all Position instances from gap's end to
+ it's start before increasing the gap start.
+ * javax/swing/plaf/basic/BasicTextAreaUI.java:
+ (propertyChanged): Update the view only instead of
+ indicating a document change.
+
+2006-03-31 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JTextField.java
+ (fireActionPerformed): Put the textfields text in the action
+ instead of the action name.
+
+2006-04-01 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/jarsigner/Main.java (setupCommonParams):
+ Check for null jar-file argument.
+ (setupSigningParams): Check for null alias argument.
+
+2006-03-31 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JComponent.java
+ (paintChildren): Split up in two cases, depending on the
+ optimizedDrawingEnabled flag.
+ (paintChildrenWithOverlap): New method. Paints children when
+ not optimizedDrawingEnabled. This implements better painting
+ algorithm for overlapping components, so that the painted
+ regions are minimized.
+ (paintChildrenOptimized): New method. Paints children when
+ when optimizedDrawingEnabled. This implements a painting
+ algorithm that is optimized for the case when all children
+ are guaranteed to be tiled.
+
+2006-03-31 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/jarsigner/SFHelper.java (updateEntry): Use
+ Attributes.putValue(String,String).
+ (finishSigning): Likewise.
+ * gnu/java/util/jar/JarUtils.java (MANIFEST_VERSION): New constant.
+ (SIGNATURE_VERSION): Likewise.
+ (readSFManifest): Use local string constant.
+ (readMainSection): Likewise.
+ (readVersionInfo): Likewise.
+ * java/util/jar/Attributes.java (MANIFEST_VERSION):
+ Redefined using JarUtils constant.
+ (SIGNATURE_VERSION): Likewise.
+ (putValue(Name,String)): Made it private.
+
+2006-03-31 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/DefaultListSelectionModel.java (fireDifference):
+ New method. (clearSelection): Rewritten. (setSelectionInterval):
+ Fire the difference between current and new selection.
+ * javax/swing/JTable.java (columnSelectionChanged, valueChanged):
+ Only repaint the region, where selection has been changed.
+ * javax/swing/plaf/basic/BasicTableUI.java
+ (TableAction.actionPerformed): Do not change the column selection
+ when only row selection change is wanted (and in reverse) and
+ do not call the repaint() here.
+
+2006-03-31 David Gilbert <david.gilbert@object-refinery.com>
+
+ Fixes bug #26951
+ * javax/swing/DefaultComboBoxModel.java
+ (DefaultComboBoxModel(Vector)): Call getSize() instead of
+ vector.size(),
+ (addElement): Call list.addElement() rather than list.add(), and only
+ update selected item if it is currently null,
+ (removeElementAt): Update selected item, then remove the element.
+
+2006-03-31 David Gilbert <david.gilbert@object-refinery.com>
+
+ Fixes bug #26955
+ * java/awt/geom/Point2D.java
+ (distanceSq(double, double)): Fixed order of arguments,
+ (distanceSq(Point2D)): Likewise,
+ (distance(double, double)): Likewise,
+ (distance(Point2D)): Likewise.
+
+2006-03-30 Thomas Fitzsimmons <fitzsim@redhat.com>
+
+ * javax/imageio/plugins/jpeg/JPEGQTable.java: New file.
+ * javax/imageio/plugins/jpeg/JPEGHuffmanTable.java
+ (ACChrominanceLengths, ACChrominanceValues, ACLuminanceLengths,
+ ACLuminanceValues, DCChrominanceLengths, DCChrominanceValues,
+ DCLuminanceLengths, DCLuminanceValues): Remove fields.
+
+2006-03-30 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax.swing.JTable (constructor): Initialize column
+ model column margin and table row margin before setting the
+ table column model. (initialiseLocalVars): Do not call
+ setIntercellSpacing.
+
+2006-03-30 Chris Burdess <dog@gnu.org>
+
+ * javax/xml/datatype/DatatypeFactory.java (newDurationDayTime): Fix
+ method signature.
+ * javax/xml/validation/SchemaFactoryLoader.java: New file.
+
+2006-03-30 Mark Wielaard <mark@klomp.org>
+
+ PR 26848
+ * java/awt/Window.java (dispatchEventImpl): On ComponentEvents
+ adjust bounds. On resize invalidate and validate container.
+ Always pass on ComponentEvents to Container super class.
+ * gnu/java/awt/peer/gtk/GtkFramePeer.java (setBounds): Adjust for
+ menuBar and pass to GtkWindowPeer super class.
+ (postConfigureEvent): Adjust menu bar width. Adjust y and height
+ bounds and pass to GtkWindowPeer super class.
+ * gnu/java/awt/peer/gtk/GtkWindowPeer.java (x, y, width, height):
+ New fields for local bounds.
+ (getX, getY): New methods.
+ (getWidth): Don't call into awtComponent.
+ (getHeight): Likewise.
+ (create): Cache local bounds.
+ (setLocation): Documented, made protected and just call
+ nativeSetLocation.
+ (setLocationUnlocked): Removed unused method.
+ (setBoundsUnlocked): Likewise.
+ (setBounds): Check whether bounds actually changed and cache local
+ bounds.
+ (setSize): Documented and made protected.
+ (setResizable): Documented and cache local bounds.
+ (postConfigureEvent): Update local bounds. Don't call awtComponent
+ directly but post ComponentEvents.
+ (show): Cache local bounds.
+ (getBounds): Override to return cached bounds.
+
+2006-03-30 Lillian Angel <langel@redhat.com>
+
+ * gnu/java/awt/peer/gtk/GdkGraphics.java
+ (drawImage): Added check to prevent NPE.
+ (drawImage): Likewise.
+ (drawImage): Likewise.
+ * java/awt/Choice.java
+ (dispatchEventImpl): New function. selectedIndex was
+ not being updated properly otherwise.
+
+2006-03-30 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JTabbedPane.java
+ (removeTabAt): Removed debug code.
+
+2006-03-30 Roman Kennke <kennke@aicas.com>
+
+ PR 26045
+ * javax/swing/plaf/basic/BasicTextUI.java
+ (installKeyboardActions): Simply call getKeymap() and install this.
+ (createKeymap): Reimplemented to fetch a keymap from the UIManager.
+
+2006-03-30 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JTabbedPane.java
+ (removeTabAt): Adjust selection correctly when removing a tab
+ before the selected tab. Also remove the component from the
+ container, not only the tab object. Repaint and revalidate the
+ component after the removal.
+ (removeAll): Set selection to -1 before removing the tabs.
+
+2006-03-29 Lillian Angel <langel@redhat.com>
+
+ Partial fix for bug #26929
+ * gnu/java/awt/peer/gtk/GtkPanelPeer.java
+ (updateComponent): Removed. We want to clear the panel
+ before painting.
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
+ (Java_gnu_java_awt_peer_gtk_GdkGraphics_clearRect): Fixed typo.
+ Should set the background to the saved background color.
+
+2006-03-29 Mark Wielaard <mark@klomp.org>
+
+ Partial fix for bug #26848 (pack).
+ * gnu/java/awt/peer/gtk/GtkComponentPeer.java (setVisible):
+ Always show instances of Window.
+
+2006-03-29 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JSlider.java
+ (setPaintLabels): Only create standard labels if labelTable is null,
+ * javax/swing/plaf/basic/BasicSliderUI.java
+ (PropertyChangeHandler.propertyChange): Recalculate geometry for
+ "paintTicks" property change,
+ (calculateThumbSize): Updated API docs,
+ (calculateContentRect): Likewise,
+ (calculateTrackBuffer): Take into account the lowest and highest
+ labels when calculating buffer space,
+ (calculateTrackRect): Include labels, if visible, in the calculation of
+ the trackRect position,
+ (calculateTickRect): Height is zero if ticks are not painted,
+ (calculateLabelRect): Use max dimensions of actual labels,
+ (getWidthOfHighValueLabel): Use preferred size,
+ (getWidthOfLowValueLabel): Likewise,
+ (getHeightOfHighValueLabel): Likewise,
+ (getHeightOfLowValueLabel): Likewise,
+ (drawInverted): Just return slider setting,
+ (getHighestValueLabel): Updated API docs,
+ (paintTicks): Removed redundant (and buggy) code, replaced with calls
+ to xPositionForValue() and yPositionForValue(),
+ (paintHorizontalLabel): Removed full qualification of class name,
+ (paintVerticalLabel): Likewise,
+ (xPositionForValue): Reimplemented,
+ (yPositionForValue): Reimplemented,
+ * javax/swing/plaf/metal/MetalSliderUI.java
+ (paintTrack): Made track one pixel longer.
+
+2006-03-29 Tom Tromey <tromey@redhat.com>
+
+ PR gcc/26901:
+ * tools/Makefile.am (JCOMPILER): Added encoding options.
+ * examples/Makefile.am (JCOMPILER): Added encoding options.
+
+2006-03-29 Gary Benson <gbenson@redhat.com>
+
+ Partial fix for PR classpath/24895
+ * java/io/FilePermission.java (implies): Canonicalize paths.
+
+2006-03-29 Robert Schuster <robertschuster@fsfe.org>
+
+ PR 26888
+ * javax/swing/text/GapContent.java:
+ (replace): Added call to resetMarksAtZero.
+
+2006-03-29 Roman Kennke <kennke@aicas.com>
+
+ PR 23527
+ * javax/swing/plaf/basic/BasicMenuItemUI.java
+ (cachedRect): New field.
+ (BasicMenuItemUI): Initialize cachedRect field.
+ (getPreferredMenuItemSize): Use layoutMenuItem() helper method
+ to determine layout. Store maximum accelerator and text width
+ in client properties of parent to allow correct alignment
+ of accelerators among menu items of one menu.
+ (paintMenuItem): Outsourced menu item layout into layoutMenuItem
+ method. Align accelerators according to the values calculated
+ in getPreferredMenuItemSize.
+ (getAcceleratorString) New helper method.
+ (layoutMenuItem): New helper method.
+
+2006-03-29 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/java/rmi/activation/ActivationSystemTransient.java: Rewritten.
+ * gnu/java/rmi/activation/BidiTable.java: Rewritten.
+ * gnu/java/rmi/dgc/LeaseRenewingTask.java (constructor, sheduleLeases):
+ Avoid NPEs.
+ * gnu/java/rmi/server/ActivatableServerRef.java (getRefClass,
+ readExternal, writeExternal): New methods.
+ * gnu/java/rmi/server/UnicastRef.java (invokeCommon): Splitten into
+ two stages, invokeCommon(Remote, ...) and
+ invokeCommen(UnicastConnection, ...).
+ * java/rmi/server/RemoteObject.java (readObject, writeObject): Expect
+ also the ActivatableRef. toString(): Documented.
+ * gnu/java/rmi/server/ActivatableRef.java,
+ tools/gnu/classpath/tools/rmi/Persistent.java,
+ tools/gnu/classpath/tools/rmi/PersistentBidiHashTable.java,
+ tools/gnu/classpath/tools/rmi/PersistentHashTable.java,
+ tools/gnu/classpath/tools/rmi/REGISTRY.java,
+ tools/gnu/classpath/tools/rmi/REGISTRY.txt,
+ tools/gnu/classpath/tools/rmi/RMID.java,
+ tools/gnu/classpath/tools/rmi/RMID.txt,
+ tools/gnu/classpath/tools/rmi/registry/RegistryImpl.java,
+ tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Skel.java,
+ tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Stub.java,
+ tools/gnu/classpath/tools/rmi/registry/package.html,
+ tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl.java,
+ tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl_Stub.java:
+ New files.
+ * tools/README: Documented.
+ * NEWS: Added entry about the activation.
+
+2006-03-29 Roman Kennke <kennke@aicas.com>
+
+ PR 23527
+ * javax/swing/plaf/basic/BasicMenuItemUI.java
+ (viewRect): New field.
+ (textRect): New field.
+ (accelRect): New field.
+ (iconRect): New field.
+ (arrowIconRect): New field.
+ (checkIconRect): New field.
+ (BasicMenuItemUI): Initialize new fields.
+ (paintMenuItem): Rewritten to correctly layout and paint
+ the menu item in a more straightforward way. Use cached rectangle
+ objects for layout.
+ (paintAccelerator): Pulled inside the paintMenuItem method.
+
+2006-03-29 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12Method.jav:
+ Do not use initCause with UnexpectedException.
+ * tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12MethodVoid.jav:
+ Likewise.
+
+2006-03-29 Mark Wielaard <mark@klomp.org>
+
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+ (setCursorID): Removed unused static variable.
+
+2006-03-29 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/plaf/basic/BasicSliderUI.java: Reformatted.
+
+2006-03-29 Mark Wielaard <mark@klomp.org>
+
+ Fixes bug #26527
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+ (gtkWidgetSetCursorUnlocked): Call gdk_flush().
+
+2006-03-28 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/UIManager.java
+ (installLookAndFeel): Implemented.
+ (setInstalledLookAndFeels): Implemented.
+
+2006-03-28 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalButtonUI.java
+ (update): Paint gradient only when the background color
+ is not a UIResource and if the button is neither armed nor
+ pressed and if the button is contentAreaFilled.
+
+2006-03-28 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JLayeredPane.java
+ (addImpl): Repaint added component.
+
+2006-03-28 Ito Kazumitsu <kaz@maczuka.gcd.org>
+
+ * java/util/regex/Matcher.java: Reverted.
+
+2006-03-28 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/text/AsyncBoxView.java
+ (setEstimatedMajorSpan): Made method protected.
+ (getEstimatedMajorSpan): Made method protected.
+ * javax/swing/text/BoxView.java
+ (flipEastAndWestAtEnds): Fixed typo.
+ * javax/swing/text/InternationalFormatter.java
+ (getActions): Made method protected.
+ * javax/swing/text/Position.java
+ (Bias): Made class final.
+ * javax/swing/text/html/HTML.java
+ (MEDIA): Made field package private. Not specified.
+ (NOBR): Made field package private. Not specified.
+ * javax/swing/text/html/NullView.java
+ Made class package private.
+ * javax/swing/text/html/parser/Entity.java
+ Made class non-serializable as specified.
+
+2006-03-28 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalButtonUI.java
+ (update): Don't paint gradient if the background color is
+ no UIResource. Removed double getModel() call. Don't check for
+ OceanTheme.
+
+2006-03-28 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicMenuItemUI.java
+ (paint): Call paintMenuItem with the selectionBackground as
+ parameter.
+ (paintBackground): Fixed the condition and color for the background
+ painting.
+
+2006-03-28 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalTabbedPaneUI.java
+ (tabsOpaque): New field.
+ (paintLeftTabBorder): Paint some parts only when the tabs are
+ opaque. Determine the tab background using the paintLeftTabBorder()
+ helper method.
+ (paintRightTabBorder): Likewise.
+ (installDefaults): Fetch tabsOpaque property from the UIDefaults.
+
+2006-03-27 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/rmi/activation/ActivationGroup_Stub.java:
+ Made final.
+
+2006-03-27 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * java/io/CharArrayWriter.java:
+ (append(char)): Documented.
+ (append(CharSequence)): Likewise.
+ (append(CharSequence,int,int)): Likewise.
+
+2006-03-27 Tom Tromey <tromey@redhat.com>
+
+ * java/io/CharArrayWriter.java (append): New overloads.
+
+2006-03-27 Lillian Angel <langel@redhat.com>
+
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
+ (Java_gnu_java_awt_peer_gtk_GdkGraphics_nativeDispose):
+ Added check for colormap. Prevents assertion error.
+ (Java_gnu_java_awt_peer_gtk_GdkGraphics_setFGColor):
+ Likewise.
+ (Java_gnu_java_awt_peer_gtk_GdkGraphics_nativeCopyState):
+ Likewise.
+ (Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__II):
+ Likewise.
+ (Java_gnu_java_awt_peer_gtk_GdkGraphics_initFromImage):
+ Likewise.
+ (Java_gnu_java_awt_peer_gtk_GdkGraphics_initStateUnlocked):
+ Likewise.
+
+2006-03-27 Dalibor Topic <robilad@kaffe.org>
+
+ * m4/acinclude.m4 (CLASSPATH_FIND_JAVAC): Use
+ AC_MSG_ERROR instead of echoing the error message
+ that no compiler has been found manually.
+
+2006-03-27 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/RepaintManager.java
+ (commitBuffer): Use simple drawImage() method instead of the
+ scaling version.
+
+2006-03-27 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/PlainView.java:
+ (drawLine): Use 'endOffset' instead of 'selectionEnd'
+ for painting the selected line.
+
+2006-03-27 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/plaf/basic/BasicSliderUI.java
+ (getThumbSize): Removed TODO and updated API docs.
+
+2006-03-27 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/DefaultCaret.java:
+ (mouseClicked): Word selection rewritten.
+ (paint): Draw line inside the bounding rectangle.
+ (damage): Retrieve caret height from line height.
+
+2006-03-28 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/jarsigner/Main.java (processArgs): Check
+ for null args.
+ Check for -help option.
+ * tools/gnu/classpath/tools/jarsigner/jarsigner.txt: Added -help option.
+
+2006-03-27 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/text/FieldView.java
+ (getPreferredSpan): Don't include trailing newline in
+ calculations.
+ * javax/swing/text/PlainView.java
+ (drawLine): Don't include trailing newline.
+ (determineMaxLineLength): Don't include trailing newline.
+ (getLineBuffer): Made method final.
+
+2006-03-27 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JSlider.java
+ (AccessibleJSlider.AccessibleJSlider): Minor API doc edit,
+ (AccessibleJSlider.getAccessibleRole): Removed declaration of
+ NotImplementedException,
+ (AccessibleJSlider.getAccessibleValue): Updated API docs.
+
+2006-03-26 Tom Tromey <tromey@redhat.com>
+
+ * NEWS: Updated.
+ * vm/reference/java/lang/reflect/Method.java (METHOD_MODIFIERS):
+ New constant.
+ (getModifiersInternal): Renamed from getModifiers.
+ (getModifiers): New method.
+ (isBridge): Likewise.
+ (isSynthetic): Likewise.
+ (isVarArgs): Likewise.
+ * vm/reference/java/lang/reflect/Field.java (FIELD_MODIFIERS):
+ New constant.
+ (getModifiersInternal): Renamed from getModifiers.
+ (getModifiers): New method.
+ (isSynthetic): Likewise.
+ (isEnumConstant): Likewise.
+ * vm/reference/java/lang/reflect/Constructor.java
+ (getModifiersInternal): Renamed from getModifiers.
+ (getModifiers): New method
+ (CONSTRUCTOR_MODIFIERS): New constant.
+ (isSynthetic): New method.
+ (isVarArgs): Likewise.
+ * java/lang/reflect/Member.java (isSynthetic): New method.
+
+2006-03-26 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * gnu/java/security/jce/hash/HavalSpi.java,
+ * gnu/java/security/jce/hash/MD2Spi.java,
+ * gnu/java/security/jce/hash/MD4Spi.java,
+ * gnu/java/security/jce/hash/MD5Spi.java,
+ * gnu/java/security/jce/hash/MessageDigestAdapter.java,
+ * gnu/java/security/jce/hash/RipeMD128Spi.java,
+ * gnu/java/security/jce/hash/RipeMD160Spi.java,
+ * gnu/java/security/jce/hash/Sha160Spi.java,
+ * gnu/java/security/jce/hash/Sha256Spi.java,
+ * gnu/java/security/jce/hash/Sha384Spi.java,
+ * gnu/java/security/jce/hash/Sha512Spi.java,
+ * gnu/java/security/jce/hash/TigerSpi.java,
+ * gnu/java/security/jce/hash/WhirlpoolSpi.java,
+ * gnu/java/security/jce/sig/DSSKeyPairGeneratorSpi.java,
+ * gnu/java/security/jce/sig/DSSRawSignatureSpi.java,
+ * gnu/java/security/jce/sig/KeyPairGeneratorAdapter.java,
+ * gnu/java/security/jce/sig/RSAPSSRawSignatureSpi.java,
+ * gnu/java/security/jce/sig/SignatureAdapter.java,
+ * gnu/java/security/key/IKeyPairCodec.java,
+ * gnu/java/security/key/IKeyPairGenerator.java,
+ * gnu/java/security/key/KeyPairGeneratorFactory.java,
+ * gnu/java/security/key/dss/DSSKey.java,
+ * gnu/java/security/key/dss/DSSKeyPairRawCodec.java,
+ * gnu/java/security/key/dss/DSSPrivateKey.java,
+ * gnu/java/security/key/dss/DSSPublicKey.java,
+ * gnu/java/security/key/dss/FIPS186.java,
+ * gnu/java/security/key/rsa/GnuRSAKey.java,
+ * gnu/java/security/key/rsa/GnuRSAPrivateKey.java,
+ * gnu/java/security/key/rsa/GnuRSAPublicKey.java,
+ * gnu/java/security/sig/ISignature.java,
+ * gnu/java/security/sig/ISignatureCodec.java,
+ * gnu/java/security/sig/dss/DSSSignature.java,
+ * gnu/java/security/sig/dss/DSSSignatureRawCodec.java,
+ * gnu/java/security/sig/rsa/RSAPSSSignature.java,
+ * gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java,
+ * gnu/java/security/util/Util.java:
+ Remove CVS revision tags.
+
+2006-03-26 Tom Tromey <tromey@redhat.com>
+
+ * java/io/InputStream.java (InputStream): Implements Closeable.
+
+2006-03-26 Ito Kazumitsu <kaz@maczuka.gcd.org>
+
+ * gnu/regexp/CharIndexed.java(setLastMatch, getLastMatch, getAnchor):
+ New methods.
+ * gnu/regexp/CharIndexedCharArray.java(setLastMatch, getLastMatch,
+ getAnchor): New methods.
+ * gnu/regexp/CharIndexedInputStream.java(setLastMatch, getLastMatch,
+ getAnchor): New methods.
+ * gnu/regexp/CharIndexedString.java(setLastMatch, getLastMatch,
+ getAnchor): New methods.
+ * gnu/regexp/CharIndexedStringBuffer.java(setLastMatch, getLastMatch,
+ getAnchor): New methods.
+ * gnu/regexp/REMatch.java(start1): New field.
+ * gnu/regexp/RE.java(initialize): Added support for \z and \G,
+ (match): set the starting position to start1[] instead of start[],
+ (getMatchImpl): Set the found REMatch to the input,
+ (makeCharIndexed): Made public.
+ * gnu/regexp/RETokenEndOfPreviousMatch.java: New file.
+ * gnu/regexp/RETokenEndSub.java(matchThis, findMatch):
+ set the value of start[] copying from start1[].
+ * gnu/regexp/RETokenLookBehind.java(matchThis): Added the settings of
+ offset.
+ * java/util/regex/Matcher.java(inputCharIndexed): New field
+ to be used as a parameter of the RE#getMatch.
+
+2006-03-26 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/java/rmi/activation/DefaultActivationGroup.java:
+ Documented the default jre spawning strategy (none).
+ * java/rmi/activation/ActivationGroup.java (currentGroupId,
+ getSystem): Obtain the acticivation system from the
+ DefaultActivationSystem.
+
+2006-03-26 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/jarsigner/Main.java (setupSigningParams):
+ Ask user for keystore password if one was not provided.
+
+2006-03-26 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/README: Added Security tools section.
+ Documented the jarsigner tool.
+
+2006-03-25 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JScrollBar.java
+ (AccessibleJScrollBar.getAccessibleStateSet): Implemented,
+ (AccessibleJScrollBar.getAccessibleRole): Likewise,
+ (AccessibleJScrollBar.getAccessibleValue): Likewise,
+ (AccessibleJScrollBar.getCurrentAccessibleValue): Likewise,
+ (AccessibleJScrollBar.setCurrentAccessibleValue): Likewise,
+ (AccessibleJScrollBar.getMinimumAccessibleValue): Likewise,
+ (AccessibleJScrollBar.getMaximumAccessibleValue): Likewise,
+ (getAccessibleContext): Updated API docs.
+
+2006-03-25 Tom Tromey <tromey@redhat.com>
+
+ * .externalToolBuilders/CreateLocaleData.launch: Run if resource files
+ change or if generator script changes.
+
+2006-03-25 Tom Tromey <tromey@redhat.com>
+
+ * javax/naming/ldap/StartTlsRequest.java: New file.
+ * javax/naming/ldap/StartTlsResponse.java: New file.
+
+2006-03-25 Olivier Jolly <olivier.jolly@pcedev.com>
+
+ * java/net/URLClassLoader.java (FileURLLoader.getResource): Added test
+ to validate all components of a resource path.
+ (FileURLLoader.walkPathComponents): Helper which ensures that we are
+ allowed to walk through every component of a resource path.
+
+2006-03-25 Michael Koch <konqueror@gmx.de>
+
+ * NEWS: Added item for CLDR 1.3 update.
+
+2006-03-25 Michael Koch <konqueror@gmx.de>
+
+ * resource/gnu/java/locale/LocaleInformation_ar_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_ar_IQ.properties,
+ resource/gnu/java/locale/LocaleInformation_ar_KW.properties,
+ resource/gnu/java/locale/LocaleInformation_ar_LY.properties,
+ resource/gnu/java/locale/LocaleInformation_mn_MN.properties,
+ resource/gnu/java/locale/LocaleInformation_uz_AF.properties:
+ Removed locales.
+
+2006-03-25 Michael Koch <konqueror@gmx.de>
+
+ * resource/gnu/java/locale/LocaleInformation_az.properties,
+ resource/gnu/java/locale/LocaleInformation_bs.properties,
+ resource/gnu/java/locale/LocaleInformation_byn.properties,
+ resource/gnu/java/locale/LocaleInformation_byn_ER.properties,
+ resource/gnu/java/locale/LocaleInformation_el_CY.properties,
+ resource/gnu/java/locale/LocaleInformation_gez.properties,
+ resource/gnu/java/locale/LocaleInformation_gez_ER.properties,
+ resource/gnu/java/locale/LocaleInformation_gez_ET.properties,
+ resource/gnu/java/locale/LocaleInformation_haw.properties,
+ resource/gnu/java/locale/LocaleInformation_haw_US.properties,
+ resource/gnu/java/locale/LocaleInformation_kok.properties,
+ resource/gnu/java/locale/LocaleInformation_kok_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_sid.properties,
+ resource/gnu/java/locale/LocaleInformation_sid_ET.properties,
+ resource/gnu/java/locale/LocaleInformation_sl_SI.properties,
+ resource/gnu/java/locale/LocaleInformation_sr_BA_Cyrl.properties,
+ resource/gnu/java/locale/LocaleInformation_sr_BA_Latn.properties,
+ resource/gnu/java/locale/LocaleInformation_sr_Cyrl.properties,
+ resource/gnu/java/locale/LocaleInformation_syr.properties,
+ resource/gnu/java/locale/LocaleInformation_syr_SY.properties,
+ resource/gnu/java/locale/LocaleInformation_tig.properties,
+ resource/gnu/java/locale/LocaleInformation_tig_ER.properties,
+ resource/gnu/java/locale/LocaleInformation_uz_AF_Arab.properties,
+ resource/gnu/java/locale/LocaleInformation_uz_Arab.properties,
+ resource/gnu/java/locale/LocaleInformation_uz_Latn.properties,
+ resource/gnu/java/locale/LocaleInformation_wal.properties,
+ resource/gnu/java/locale/LocaleInformation_wal_ET.properties:
+ New locales.
+
+2006-03-25 Michael Koch <konqueror@gmx.de>
+
+ * resource/gnu/java/locale/LocaleInformation_fa.properties,
+ resource/gnu/java/locale/LocaleInformation_kn.properties,
+ resource/gnu/java/locale/LocaleInformation_kn_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_ko.properties,
+ resource/gnu/java/locale/LocaleInformation_sl.properties,
+ resource/gnu/java/locale/LocaleInformation_so.properties,
+ resource/gnu/java/locale/LocaleInformation_so_DJ.properties,
+ resource/gnu/java/locale/LocaleInformation_so_ET.properties,
+ resource/gnu/java/locale/LocaleInformation_so_SO.properties,
+ resource/gnu/java/locale/LocaleInformation_sr.properties:
+ Random fixes I forgot to commit before.
+
+2006-03-25 Michael Koch <konqueror@gmx.de>
+
+ * resource/gnu/java/locale/LocaleInformation_ar_JO.properties,
+ resource/gnu/java/locale/LocaleInformation_ar_QA.properties,
+ resource/gnu/java/locale/LocaleInformation_ar_SA.properties,
+ resource/gnu/java/locale/LocaleInformation_ar_SY.properties,
+ resource/gnu/java/locale/LocaleInformation_ar_TN.properties,
+ resource/gnu/java/locale/LocaleInformation_ar_YE.properties,
+ resource/gnu/java/locale/LocaleInformation_as_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_be_BY.properties,
+ resource/gnu/java/locale/LocaleInformation_bn_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_en.properties,
+ resource/gnu/java/locale/LocaleInformation_en_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_en_PK.properties,
+ resource/gnu/java/locale/LocaleInformation_en_US_POSIX.properties,
+ resource/gnu/java/locale/LocaleInformation_es_PY.properties,
+ resource/gnu/java/locale/LocaleInformation_fa.properties,
+ resource/gnu/java/locale/LocaleInformation_fa_AF.properties,
+ resource/gnu/java/locale/LocaleInformation_fa_IR.properties,
+ resource/gnu/java/locale/LocaleInformation_gu_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_hi_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_ja_JP.properties,
+ resource/gnu/java/locale/LocaleInformation_kn_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_mr_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_or_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_pa.properties,
+ resource/gnu/java/locale/LocaleInformation_pa_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_ps_AF.properties,
+ resource/gnu/java/locale/LocaleInformation_ru_RU.properties,
+ resource/gnu/java/locale/LocaleInformation_sa.properties,
+ resource/gnu/java/locale/LocaleInformation_sa_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_ta_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_te_IN.properties:
+ Updated currency formats.
+
+2006-03-25 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/text/AbstractDocument.java
+ (getAttributeContext): Made method final.
+ (getCurrentWriter): Likewise.
+ (getEndPosition): Likewise.
+ (getProperty): Likewise.
+ (getStartPosition): Likewise.
+ (putProperty): Likewise.
+ (readLock): Likewise.
+ (readUnlock): Likewise.
+ (writeLock): Likewise.
+ (writeUnlock): Likewise.
+
+2006-03-25 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/InputMap.java
+ (allKeys): Check if parent keys is null.
+ * javax/swing/KeyboardManager.java
+ (registerEntireMap): Also register map's parent keys.
+ * javax/swing/plaf/metal/MetalRootPaneUI.java
+ (propertyChange): Also call super.propertyChange().
+
+2006-03-25 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * tools/gnu/classpath/tools/jarsigner/HashUtils.java: New file.
+ * tools/gnu/classpath/tools/jarsigner/JarSigner.java: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/JarVerifier.java: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/Main.java (Main): Likewise.
+ * tools/gnu/classpath/tools/jarsigner/SFHelper.java: Likewise.
+ * tools/gnu/classpath/tools/jarsigner/jarsigner.txt: Likewise.
+
+2006-03-25 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * gnu/java/util/jar/JarUtils.java: New file.
+ * java/util/jar/Manifest.java (CRLF): Removed.
+ (read_main_section): Likewise.
+ (read_version_info): Likewise.
+ (expect_header(String,BufferedReader)): Likewise.
+ (expect_header(String,BufferedReader,String)): Likewise.
+ (read_header_value): Likewise.
+ (read_attributes): Likewise.
+ (read_attribute): Likewise.
+ (read_individual_sections): Likewise.
+ (read_section_name): Likewise.
+ (write_main_section): Likewise.
+ (write_version_info): Likewise.
+ (write_header): Likewise.
+ (write_main_attributes): Likewise.
+ (write_attribute_entry): Likewise.
+ (write_individual_sections): Likewise.
+ (write_entry_attributes): Likewise.
+ (read): use JarUtils.
+ (write): Likewise.
+
+2006-03-25 Raif S. Naffah <raif@swiftdsl.com.au>
+
+ * gnu/java/security/pkcs/SignerInfo.java (log): New field.
+ (DEBUG): Removed.
+ (debug): Likewise.
+ (SignerInfo(BERReader)): Updated javadoc.
+ Use JDK logging.
+ (SignerInfo(X500Principal,BigInteger,OID,byte[],OID,byte[],byte[])):
+ New constructor.
+ (encode): New method.
+ * gnu/java/security/pkcs/PKCS7SignedData.java (log): New field.
+ (PKCS7_DATA): Removed.
+ (DEBUG): Likewise.
+ (debug): Likewise.
+ (PKCS7SignedData(BERReader)): Updated javadoc.
+ Use JDK logging.
+ (PKCS7SignedData(Set,PKCS7Data,Certificate[],X509CRL[],Set)): New
+ constructor.
+ (encode): New method.
+ * gnu/java/security/pkcs/PKCS7Data.java: New file.
+ * gnu/java/security/key/dss/DSSKeyPairPKCS8Codec.java (log): New field.
+ (encodePrivateKey): Encode x (private MPN) as an OCTET STRING.
+ (decodePrivateKey): Decode x from an OCTET STRING.
+ * gnu/java/security/key/dss/DSSPublicKey.java (str): New field.
+ (toString): New method.
+ * gnu/java/security/key/dss/DSSPrivateKey.java (DEBUG): New field.
+ (str): Likewise.
+ (toString): New method.
+ * gnu/java/security/key/dss/DSSKey.java (str): New Field.
+ (toString): New method.
+ * gnu/java/security/provider/DSAParameterGenerator.java: Removed.
+
+2006-03-25 Roman Kennke <kennke@aicas.com>
+
+ * java/util/GregorianCalender.java
+ (computeTime): Fix comparison to correctly calculate the
+ calendar.
+
+2006-03-25 Wolfgang Baer <WBaer@gmx.de>
+
+ Fixes bug #26837
+ * java/awt/Window.java:
+ (setFocusCycleRoot): New overriden method.
+ (isFocusCycleRoot): Likewise.
+ (getFocusCycleRootAncestor): Likewise.
+ * java/awt/Container.java:
+ (getFocusTraversalPolicy): Check also for anchestor == null.
+
+2006-03-25 Mark Wielaard <mark@klomp.org>
+
+ Fixes bug #26863 reported by John K Peterson <johnandtina@byu.net>
+ * gnu/java/util/prefs/NodeWriter.java (writeRoot): Don't immediately
+ close root tag.
+
+2006-03-24 Tom Tromey <tromey@redhat.com>
+
+ * javax/imageio/stream/ImageOutputStreamImpl.java (writeBytes):
+ Rewrote.
+ (writeChar): Removed useless cast.
+ (writeChars(String)): Implemented.
+ (writeDouble): Rewrote.
+ (writeFloat): Likewise.
+ (writeUTF): Implemented.
+ * javax/imageio/stream/ImageInputStreamImpl.java (byteOrder): Default
+ to big endian.
+
+2006-03-24 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JButton.java
+ (def): Replaced field with defaultCapable field.
+ (is_def): Removed field.
+ (JButton): Initialize defaultCapable with true.
+ (isDefaultButton): Documented and implemented method by querying
+ the button's root pane if present.
+ (isDefaultCapable): Changed def field to defaultCapable.
+ Added documentation.
+ (paramString): Call isDefaultButton() instead of accessing field,
+ which got removed.
+ (setDefaultCapable): Changed def field to defaultCapable.
+ Added documentation.
+ * javax/swing/JRootPane.java
+ (setDefaultButton): Only change the default button if the
+ new button is defaultCapable.
+ * javax/swing/plaf/basic/BasicRootPaneUI.java
+ (DefaultPressAction): New class.
+ (DefaultReleaseAction): New class.
+ (installKeyboardActions): Implemented.
+ (uninstallKeyboardActions): Implemented.
+ (propertyChange): Implemented.
+ * javax/swing/plaf/metal/MetalBorders.java
+ (ButtonBorder.paintBorder): 'Outsourced' default theme
+ painting to paintDefaultButtonBorder().
+ (ButtonBorder.paintDefaultButtonBorder): New helper method
+ to paint the border in the default theme. This also fixes
+ painting of the border for default buttons.
+ (ButtonBorder.paintOceanButtonBorder): Added support for
+ default button painting. Fixed border for pressed/default state.
+ * javax/swing/plaf/metal/MetalButtonUI.java
+ (update): Only paint gradient when in OceanTheme and when the
+ button is not armed.
+
+2006-03-24 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/java/rmi/activation/ActivationSystemTransient.java:
+ Inherit from Activator.
+
+2006-03-24 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/java/rmi/activation/DefaultActivationGroup.java (newInstance):
+ Print debug message if debug flag is set.
+ * gnu/java/rmi/activation/DefaultActivationSystem.java: Rewritten.
+ * gnu/java/rmi/server/ActivatableServerRef.java (activate): assign
+ detail, do not call iniCause(). (exportClass): New method.
+ * gnu/java/rmi/server/CombinedClassLoader.java (constructor):
+ Ignore null (bootstrap) class loader.
+ * gnu/java/rmi/server/UnicastServerRef.java (methods, skel, stub,
+ buildMethodHash, findStubSkelClass, getHelperClass): Changed
+ visibility to protected.
+ * java/rmi/activation/Activatable.java (export, register): Rewritten.
+ (toStub): New method.
+ * java/rmi/activation/ActivationGroup.java (getSystem): Rewritten.
+ * java/rmi/activation/ActivationSystem.java (SYSTEM_PORT):
+ Explained property java.rmi.activation.port.
+
+2006-03-24 Tom Tromey <tromey@redhat.com>
+
+ * .externalToolBuilders/CreateLocaleData.launch: Updated.
+ * gnu/java/locale/.cvsignore: New file.
+ * lib/Makefile.am (LocaleData.java): Put in gnu/java/locale.
+ * java/util/Locale.java (getAvailableLocales): Clone result.
+ (getISOCountries): Likewise.
+ (getISOLanguages): Likewise.
+ * scripts/generate-locale-list.sh: Make class public. Added new
+ array.
+ * gnu/java/locale/LocaleHelper.java (getCollatorLocales): New method.
+ (getLocaleCount): Likewise.
+ * java/text/Collator.java (getInstance): Javadoc typo fix.
+ (getAvailableLocales): Wrote.
+
+2006-03-24 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JTabbedPane.java
+ (getSelectedComponent): Return null when no component is
+ selected.
+
+2006-03-24 Mark Wielaard <mark@klomp.org>
+
+ * NEWS: Add cursor and selection improvements.
+
+2006-03-23 David Gilbert <david.gilbert@object-refinery.com>
+
+ * java/awt/Component.java
+ (getAccessibleName): Just return accessibleName,
+ * javax/swing/AbstractButton.java
+ (getAccessibleStateSet): Mark as stub,
+ (getAccessibleName): Implemented,
+ (getAcessibleIcon): Mark as stub,
+ (getAccessibleRelationSet): Likewise,
+ (getAccessibleAction): Likewise,
+ (getAccessibleValue): Likewise,
+ (getAccessibleActionCount): Likewise,
+ (getAccessibleActionDescription): Likewise,
+ (doAccessibleAction): Likewise,
+ (getCurrentAccessibleValue): Likewise,
+ (setCurrentAccessibleValue): Likewise,
+ (getMinimumAccessibleValue): Likewise,
+ (getMaximumAccessibleValue): Likewise,
+ (getAccessibleText): Likewise,
+ (getIndexAtPoint): Likewise,
+ (getCharacterBounds): Likewise,
+ (getCharCount): Likewise,
+ (getCaretPosition): Likewise,
+ (getAtIndex): Likewise,
+ (getAfterIndex): Likewise,
+ (getBeforeIndex): Likewise,
+ (getCharacterAttribute): Likewise,
+ (getSelectionStart): Likewise,
+ (getSelectionEnd): Likewise,
+ (getSelectedText): Likewise,
+ (getTextRectangle): Likewise,
+ (setIconTextGap): Fire PropertyChangeEvent, not state changed,
+ (getIconTextGap): Added @since 1.4,
+ (setContentAreaFilled): Reordered code to make event sequence match
+ reference implementation,
+ * javax/swing/JButton.java
+ (getSelectedObjects): Removed,
+ *javax/swing/JComponent.java
+ (getAccessibleName): Call super.
+
+2006-03-23 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JProgressBar.java
+ (AccessibleJProgressBar.getAccessibleStateSet): Implemented,
+ (AccessibleJProgressBar.getAccessibleRole): Added API docs,
+ (AccessibleJProgressBar.getAccessibleValue): Implemented,
+ (AccessibleJProgressBar.getCurrentAccessibleValue): Likewise,
+ (AccessibleJProgressBar.setCurrentAccessibleValue): Likewise,
+ (AccessibleJProgressBar.getMinimumAccessibleValue): Likewise,
+ (AccessibleJProgressBar.getMaximumAccessibleValue): Likewise,
+ (getAccessibleContext): Added API docs.
+
+2006-03-23 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/plaf/basic/BasicTextUI.java:
+ (FocusListener.focusLost): Put current selection into the system
+ clipboard.
+
+2006-03-23 Robert Schuster <robertschuster@fsfe.org>
+
+ * java/awt/Component.java:
+ (processMouseEvent): Remove call to consume event.
+ (dispatchEventImpl): Handle specific events first, do focus request
+ only when mouse event was not yet consumed.
+ * javax/swing/text/DefaultCaret.java:
+ (mousePressed): Rewritten.
+ (setDot): Changed order of operations.
+ (moveDot): Dito.
+
+2006-03-23 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JComponent.java
+ (AccessibleJComponent.changeSupport): Removed field,
+ (AccessibleJComponent.AccessibleJComponent): Updated for removed field,
+ (AccessibleJComponent.addPropertyChangeListener): Call super,
+ (AccessibleJComponent.removePropertyChangeListener): Likewise,
+ * javax/swing/JSlider.java
+ (AccessibleJSlider.getAccessibleStateSet): Implemented,
+ (AccessibleJSlider.getAccessibleRole): Likewise,
+ (AccessibleJSlider.getAccessibleValue): Likewise,
+ (AccessibleJSlider.getCurrentAccessibleValue): Likewise,
+ (AccessibleJSlider.setCurrentAccessibleValue): Likewise,
+ (AccessibleJSlider.getMinimumAccessibleValue): Likewise,
+ (AccessibleJSlider.getMaximumAccessibleValue): Likewise,
+ (getAccessibleContext): Added API docs.
+
+2006-03-23 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/java/rmi/activation/ActivationSystemTransient.java
+ (debug): Made public. (constructor): Made protected.
+ (activate, getActivationDesc): Throw more informative exceptions.
+ * gnu/java/rmi/server/UnicastConnectionManager.java (toString):
+ New method.
+ * gnu/java/rmi/server/UnicastRef.java (remoteToString):
+ Stub, implemented.
+ * gnu/java/rmi/server/UnicastServer.java (incomingMessageCall):
+ Documented.
+ * gnu/java/rmi/server/UnicastServerRef.java (incomingMessageCall):
+ Better exception.
+ * java/rmi/activation/Activatable.java (obtainId): Use the activation
+ system, passed in the activation descriptor field.
+ * java/rmi/activation/ActivationGroup.java (createGroup): Likewise.
+ * java/rmi/activation/ActivationGroupID.java (system, uid): Changed
+ to package private final. (equals): Compare uid, not the system.
+ (hashCode): Forward to uid.hashCode(). toString(): New method.
+ * java/rmi/activation/ActivationID.java (readObject, writeObject):
+ Rewritten. (equals): Compare UID only. toString(): New method.
+ * java/rmi/server/ObjID.java (eq): New method. (equals): Compare also
+ UID (space). (hashCode, toString): Rewritten.
+ * java/rmi/server/RemoteObjectInvocationHandler.java (noArgs):
+ New method. (invoke): Treat null as an empty array for parameters.
+ * java/rmi/server/UID.java (toString): Rewritten. (hashCode):
+ Include count, do not include the static machineId.
+
+2006-03-23 Tom Tromey <tromey@redhat.com>
+
+ * java/net/URLConnection.java (getContent(Class[])): Implemented.
+
+2006-03-23 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * tools/gnu/classpath/tools/giop/GRMIC.java (main): Accept -force.
+ * tools/gnu/classpath/tools/giop/GRMIC.txt: Explain -force.
+ * tools/gnu/classpath/tools/giop/grmic/GiopRmicCompiler.java
+ (force): New field. (setForce): New method. (compile): Handle -force.
+ * tools/gnu/classpath/tools/rmi/RMIC.java (main): Accept -force.
+ * tools/gnu/classpath/tools/rmi/RMIC.txt: Explain -force.
+
+2006-03-23 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JTabbedPane.java
+ (Page.getBackground): Return the JTabbedPane's background,
+ rather than the page's component background.
+ (Page.getForeground): Return the JTabbedPane's foreground,
+ rather than the page's component foreground.
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (uninstallUI): Don't set colors to null.
+ * javax/swing/plaf/metal/MetalTabbedPaneUI.java
+ (paintTabBackground): Correctly determine the tab background.
+ (getUnselectedBackground): New helper method to
+ handle the UI property 'TabbedPane.unselectedBackground'
+ correctly.
+
+2006-03-23 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicInternalFrameUI.java
+ (BorderListener.showingResizeCursor): New field.
+ (BorderListener.mouseMoved, BorderListner.mouseExited):
+ Implemented.
+
+2006-03-23 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JComboBox.java
+ (selectWithKeyChar): Mark as stub,
+ * javax/swing/JFileChooser.java
+ (setDragEnabled): Mark as stub,
+ (getDragEnabled): Likewise,
+ * javax/swing/JSlider.java
+ (AccessibleJSlider.getAccessibleStateSet): Mark as stub,
+ (AccessibleJSlider.getAccessibleRole): Likewise,
+ (AccessibleJSlider.getAccessibleValue): Likewise,
+ (AccessibleJSlider.getCurrentAccessibleValue): Likewise,
+ (AccessibleJSlider.setCurrentAccessibleValue): Likewise,
+ (AccessibleJSlider.getMinimumAccessibleValue): Likewise,
+ (AccessibleJSlider.getMaximumAccessibleValue): Likewise,
+ * javax/swing/UIManager.java
+ (installLookAndFeel): Mark as stub,
+ (setInstalledLookAndFeels): Likewise.
+
+2006-03-23 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/filechooser/UnixFileSystemView.java
+ (getSystemDisplayName): Mark as stub,
+ (getSystemIcon): Likewise,
+ (getSystemTypeDescription): Likewise.
+
+2006-03-23 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/tree/AbstractLayoutCache.java
+ (getNodeDimensions): Mark as stub,
+ (getPreferredHeight): Likewise,
+ (getPreferredWidth): Likewise,
+ (getRowsForPaths): Likewise,
+ (isFixedRowHeight): Likewise,
+ * javax/swing/tree/DefaultTreeModel.java
+ (reload()): Mark as stub,
+ (reload(TreeNode)): Likewise,
+ (nodeStructureChanged): Likewise,
+ * javax/swing/tree/DefaultTreeSelectionModel.java
+ (clone): Mark as stub,
+ (setRowMapper): Likewise,
+ (setSelectionPaths): Likewise,
+ (isRowSelected): Likewise,
+ (resetRowSelection): Likewise,
+ (insureRowContinuity): Likewise,
+ (arePathsContiguous): Likewise,
+ (canPathsBeAdded): Likewise,
+ (canPathsBeRemoved): Likewise,
+ (notifyPathChange): Likewise,
+ (updateLeadIndex): Likewise,
+ (insureUniqueness): Likewise,
+ * javax/swing/tree/FixedHeightLayoutCache.java: Marked all methods as
+ stubs,
+ * javax/swing/tree/VariableHeightLayoutCache.java: Likewise.
+
+2006-03-22 Tom Tromey <tromey@redhat.com>
+
+ * javax/swing/text/StyleContext.java (getStaticAttribute): Mark as
+ stub.
+ (getStaticAttributeKey): Likewise.
+ (readAttributeSet): Likewise.
+ (writeAttributeSet): Likewise.
+ (readAttributes): Likewise.
+ (writeAttributes): Likewise.
+ * javax/swing/text/html/HTMLEditorKit.java (insertAtBoundary): Mark
+ as stub.
+ * javax/swing/text/html/HTMLDocument.java (setParagraphAttributes):
+ Mark as stub.
+ (fireChangedUpdate): Likewise.
+ (start): Likewise.
+ (end): Likewise.
+ (handleEndOfLineString): Likewise.
+ (textAreaContent): Likewise.
+ (preContent): Likewise.
+ (addSpecialElement): Likewise.
+ (setInnerHTML): Likewise.
+ (setOuterHTML): Likewise.
+ (insertBeforeStart): Likewise.
+ (insertBeforeEnd): Likewise.
+ (insertAfterEnd): Likewise.
+ (insertAfterStart): Likewise.
+ * javax/swing/table/JTableHeader.java (AccessibleJTableHeaderEntry):
+ Mark all methods as stub.s
+ * javax/swing/plaf/metal/MetalTreeUI.java (decodeLineStyle): Mark
+ as stub.
+ (paintHorizontalSeparators): Likewise.
+ * javax/swing/plaf/basic/BasicLookAndFeel.java (loadSystemColors):
+ Mark as stub.
+ * javax/swing/MenuSelectionManager.java (processKeyEvent): Mark as
+ stub.
+ * java/beans/beancontext/BeanContextSupport.java: Mark most methods
+ as stubs.
+ * java/beans/beancontext/BeanContextServicesSupport.java: Mark most
+ methods as stubs.
+
+2006-03-22 Mark Wielaard <mark@klomp.org>
+
+ * gnu/java/awt/peer/gtk/GtkCursor.java: New class.
+
+2006-03-22 Mark Wielaard <mark@klomp.org>
+
+ Fixes bug #26527
+ * gnu/java/awt/peer/gtk/GtkComponentPeer.java (gtkWidgetSetCursor):
+ Takes GtkImage, x and y coordinates.
+ (gtkWidgetSetCursorUnlocked): Likewise.
+ (GtkComponentPeer): Set cursor when set.
+ (setCursor): Handle GtkCursor.
+ * gnu/java/awt/peer/gtk/GtkToolkit.java (createCustomCursor):
+ New method.
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+ (gtkWidgetSetCursor): Takes GtkImage, x and y coordinates.
+ (gtkWidgetSetCursorUnlocked): Likewise. Handle custom image.
+ * include/gnu_java_awt_peer_gtk_GtkComponentPeer.h: Regenerated.
+
+2006-03-23 Roman Kennke <kennke@aicas.com>
+
+ PR 26805
+ * gnu/java/security/Registry.java
+ (PKCS5_PAD): Added pad PKCS#5 algorithm.
+ * gnu/javax/crypto/pad/PadFactory.java
+ (getInstance): For PKCS#5, also return PKCS#7 pad
+ algorithm.
+ (getNames): Added PKCS#5.
+ * javax/crypto/KeyGenerator.java
+ (getInstance): Initialize key generator before returning
+ it.
+
+2006-03-23 Ito Kazumitsu <kaz@maczuka.gcd.org>
+
+ * gnu/regexp/RE.java(REG_X_COMMENTS): New copilation flag,
+ (initialize): Ignore whiltespaces and comments if REG_X_COMMENTS is set.
+ * java/util/regex/Pattern.java(constructor): Set RE.REG_X_COMMENTS
+ if COMMENTS is set.
+
+2006-03-22 Tom Tromey <tromey@redhat.com>
+
+ * javax/swing/plaf/synth/SynthStyle.java (getInt): Implemented.
+ (getBoolean): Likewise.
+ (getString): Likewise.
+ (getIcon): Likewise.
+
+2006-03-22 Mark Wielaard <mark@klomp.org>
+
+ Fixes bug #26301
+ * gnu/java/awt/peer/GLightweightPeer.java: Extend MouseAdapter.
+ (GLightweightPeer(Component)): Install MouseListener.
+ (setCursor): Implement.
+ (mouseEntered): New method.
+
+2006-03-22 Tom Tromey <tromey@redhat.com>
+
+ * javax/swing/plaf/synth/ColorType.java (MAX_COUNT): No longer
+ constant.
+ * javax/swing/plaf/synth/SynthStyle.java (getColorForState): Now
+ protected.
+ (getFontForState): Likewise.
+ (getInsets): Added 'result' argument.
+ (getPainter): Renamed.
+
+2006-03-22 Tom Tromey <tromey@redhat.com>
+
+ * javax/swing/plaf/synth/SynthPainter.java
+ (paintScrollBarThumbBackground): Added 'orientation' argument.
+ (paintScrollBarThumbBorder): Likewise.
+ (paintSliderThumbBackground): Likewise.
+ (paintSliderThumbBorder): Likewise.
+ (paintTabbedPaneTabBackground): Added 'index' argument.
+ (paintTabbedPaneTabBorder): Likewise.
+
+2006-03-22 Tom Tromey <tromey@redhat.com>
+
+ * java/awt/ScrollPaneAdjustable.java (paramString): Implemented.
+ (toString): New method.
+
+2006-03-22 Tom Tromey <tromey@redhat.com>
+
+ * doc/hacking.texinfo (Source Code Style Guide): Mention
+ NotImplementedException.
+ * javax/imageio/stream/MemoryCacheImageOutputStream.java
+ (flushBefore): Mark as stub.
+ (read): Likewise.
+ * javax/imageio/stream/MemoryCacheImageInputStream.java (flushBefore):
+ Mark as stub.
+ * javax/imageio/stream/ImageOutputStreamImpl.java (flushBits): Mark
+ as stub.
+ (write): Likewise.
+ (writeBit): Likewise.
+ (writeChars): Likewise.
+ (writeUTF): Likewise.
+ * javax/imageio/stream/FileCacheImageOutputStream.java (read): Mark
+ as stub.
+ (read): Likewise.
+ * java/net/URLConnection.java (getContent): Mark as stub.
+ * java/awt/Window.java (applyResourceBundle): Mark as stub.
+ * java/awt/TexturePaint.java (createContext): Mark as stub.
+ (getTransparency): Mark as stub.
+ * java/awt/ScrollPaneAdjustable.java (paramString): Mark as stub.
+ * java/awt/GridBagLayout.java (AdjustForGravity): Mark as stub.
+ * java/awt/GraphicsConfiguration.java (getBufferCapabilities): Mark as
+ stub.
+ (getImageCapabilities): Likewise.
+ * java/awt/BasicStroke.java (createStrokedShape): Mark as stub.
+ * java/awt/AlphaComposite.java (createContext): Mark as stub.
+ * java/awt/image/renderable/RenderableImageProducer.java: Mark all
+ methods as stubs.
+ * java/awt/font/TextMeasurer.java (deleteChar): Mark as stub.
+ (getAdvanceBetween): Likewise.
+ (getLayout): Likewise.
+ (insertChar): Likewise.
+ (getLineBreakIndex): Likewise.
+ * java/awt/font/ShapeGraphicAttribute.java (draw): Mark as stub.
+ (getAdvance): Likewise.
+ (getAscent): Likewise.
+ (getDescent): Likewise.
+ * java/awt/font/LineBreakMeasurer.java (deleteChar): Mark as stub.
+ (insertChar): Likewise.
+ (nextLayout): Likewise.
+ (nextLayout): Likewise.
+ (nextOffset): Likewise.
+ (nextOffset): Likewise.
+ * java/awt/font/ImageGraphicAttribute.java (draw): Mark as stub.
+ (equals): Likewise.
+ (getAdvance): Likewise.
+ (getAscent): Likewise.
+ (getBounds): Likewise.
+ (getDescent): Likewise.
+ (hashCode): Likewise.
+ (ImageGraphicAttribute): Likewise.
+ * java/awt/font/GraphicAttribute.java (getBounds): Mark as stub.
+ (getJustificationInfo): Likewise.
+ * java/awt/font/GlyphVector.java (getGlyphCharIndex): Mark as stub.
+ (getGlyphCharIndices): Likewise.
+ (getGlyphOutline): Likewise.
+ (getGlyphPixelBounds): Likewise.
+ (getLayoutFlags): Likewise.
+ (getPixelBounds): Likewise.
+ * java/awt/font/GlyphMetrics.java (getLSB): Mark as stub.
+ (getRSB): Likewise.
+ * java/nio/channels/Channels.java (newWriter): Mark as stub.
+ * java/awt/dnd/DragSourceContext.java: Marked most methods as stubs.
+ * java/awt/dnd/DragGestureRecognizer.java (fireDragGestureRecognized):
+ Mark as stub.
+ (resetRecognizer): Likewise.
+ * java/awt/datatransfer/SystemFlavorMap.java (getFlavorsForNative):
+ Mark as stub.
+ (getNativesForFlavor): Likewise.
+ * javax/swing/plaf/synth/SynthStyle.java: Mark all methods as stub.s
+ * javax/swing/plaf/synth/SynthLookAndFeel.java (updateStyles): Mark
+ as stub.
+ (getRegion): Likewise.
+ (createUI): Likewise.
+ (initialize): Likewise.
+ (uninitialize): Likewise.
+ (getDefaults): Likewise.
+ (load): Likewise.
+ (shouldUpdateStyleOnAncestorChanged): Likewise.
+ * javax/swing/plaf/synth/SynthGraphicsUtils.java (getMinimumSize):
+ Mark as stub.
+ (getPreferredSize): Likewise.
+ (getMaximumSize): Likewise.
+ (paintText): Likewise.
+ * java/text/RuleBasedCollator.java (getCollationElementIterator): Mark
+ as stub.
+ * java/text/Collator.java (getAvailableLocales): Mark as stub.
+
+2006-03-22 Wolfgang Baer <WBaer@gmx.de>
+
+ * java/io/ObjectStreamConstants.java: Added since tag.
+ (PROTOCOL_VERSION_1): Added javadoc.
+ (PROTOCOL_VERSION_2): Likewise.
+ * java/io/ObjectOutputStream.java:
+ (setDefaultProtocolVersion): Removed.
+ (useProtocolVersion): Fixed parameter tests. Updated javadoc.
+
+2006-03-21 Lillian Angel <langel@redhat.com>
+
+ * gnu/javax/imageio/bmp/BMPInfoHeader.java
+ (BMPInfoHeader): Removed debug lines.
+ * gnu/javax/imageio/bmp/EncodeRLE4.java
+ (encode): Implemented.
+ (uncompress): New function implemented to
+ uncompress the image before encoding.
+ * gnu/javax/imageio/bmp/EncodeRLE8.java
+ (encode): Implemented.
+ (uncompress): New function implemented to
+ uncompress the image before encoding.
+
+2006-03-21 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/text/html/FormView.java
+ (getImageData): New helper method.
+
+2006-03-21 Tom Tromey <tromey@redhat.com>
+
+ * vm/reference/gnu/classpath/Unsafe.java (arrayBaseOffset): Javadoc
+ fix.
+ (Unsafe): Now final.
+
+2006-03-21 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/text/html/FormView.java
+ (MouseEventListener): New inner class.
+
+2006-03-21 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/text/html/ListView.java: New file.
+
+2006-03-21 Tom Tromey <tromey@redhat.com>
+
+ * java/text/Bidi.java: Completed.
+
+2006-03-21 Anthony Balkissoon <abalkiss@redhat.com>
+
+ * javax/swing/JTable.java:
+ (columnAtPoint): Removed the null check, this method should throw a NPE
+ if the argument is null.
+
+2006-03-21 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/DefaultHighlighter.java:
+ (DefaultHighlighter.DefaultHighlightPainter.paint): Rewritten.
+
+2006-03-21 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/DefaultCaret.java: Added class variable denoting
+ the textcomponent having a selection.
+ (clearSelection): Clear 'componentWithSelection' variable.
+ (handleSelection): Clear selection of current component having a
+ selection before setting a new selection in another component.
+ (mouseDragged): Only react on left mouse button.
+ (mouseClicked): Only react on left mouse button.
+
+2006-03-21 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalTabbedPaneUI.java
+ (paintContentBorderTopEdge): Implemented.
+ (paintContentBorderBottomEdge): Implemented.
+ (paintContentBorderLeftEdge): Implemented.
+ (paintContentBorderRightEdge): Implemented.
+ (isLastTabInRun): New helper method.
+
+2006-03-21 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JTabbedPane.java
+ (Page.getForeground): Fall back to returning the tabbed pane's
+ foreground if no foreground has been exclicitly set.
+
+2006-03-21 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalComboBoxButton.java
+ (setEnabled): Update colors of button correctly.
+ * javax/swing/plaf/metal/MetalComboBoxUI.java
+ (MetalPropertyChangeListener.propertyChange): Update the colors
+ of the list and the button when any of the color properties
+ of the ComboBox change.
+
+2006-03-21 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicButtonUI.java
+ (uninstallDefaults): Only nullify button colors if they are
+ not UIResource instances.
+
+2006-03-21 David Gilbert <david.gilbert@object-refinery.com>
+
+ * javax/swing/JComponent.java
+ (AccessibleJComponent.getAccessibleDescription): Call super,
+ * javax/swing/JToolTip.java: API doc updates all over, plus
+ (AccessibleJToolTip.getAccessibleDescription): Implemented,
+ (AccessibleJToolTip.getAccessibleRole): Implemented,
+ (getAccessibleContext): Implemented,
+ (paramString): Reimplemented,
+ (setComponent): Fire PropertyChangeEvent,
+ (setTipText): Likewise.
+
+2006-03-20 Tom Tromey <tromey@redhat.com>
+
+ * java/security/cert/PKIXCertPathChecker.java: Javadoc fix.
+ * java/security/cert/CertStoreSpi.java: Added import for javadoc.
+ (CertStoreSpi): Updated throws clause.
+ * java/security/cert/CertPathValidatorSpi.java: Added import for
+ javadoc.
+ (engineValidate): Updated 'throws' clause.
+ * java/security/cert/PKIXParameters.java: Javadoc fix.
+ * java/security/cert/X509CertSelector.java
+ (setAuthorityKeyIdentifier): Javadoc fix.
+
+2006-03-20 Tom Tromey <tromey@redhat.com>
+
+ * .classpath: Build gnu.javax.swing.plaf.
+
+2006-03-20 Lillian Angel <langel@redhat.com>
+
+ * gnu/javax/imageio/bmp/BMPDecoder.java:
+ Removed unneeded import.
+ * gnu/javax/imageio/bmp/BMPEncoder.java:
+ New class.
+ * gnu/javax/imageio/bmp/BMPFileHeader.java
+ (BMPFileHeader): New constructor used to create info header
+ for an output stream.
+ (write): Fixed indexes.
+ * gnu/javax/imageio/bmp/BMPImageReaderSpi.java:
+ Initialized writerSpiNames field.
+ * gnu/javax/imageio/bmp/BMPImageWriter.java:
+ New class.
+ * gnu/javax/imageio/bmp/BMPImageWriterSpi.java:
+ New class.
+ * gnu/javax/imageio/bmp/BMPInfoHeader.java:
+ Change visibility for fields.
+ (BMPInfoHeader): New constructor used to create
+ file header for an output stream.
+ (intToDWord): New method. Converts an int to a
+ double word.
+ (intToWord): New method. Converts an int to a word.
+ * gnu/javax/imageio/bmp/DecodeBF32.java:
+ Removed unneeded imports.
+ * gnu/javax/imageio/bmp/EncodeRGB1.java:
+ New class.
+ * gnu/javax/imageio/bmp/EncodeRGB16.java:
+ New class.
+ * gnu/javax/imageio/bmp/EncodeRGB24.java:
+ New class.
+ * gnu/javax/imageio/bmp/EncodeRGB32.java:
+ New class.
+ * gnu/javax/imageio/bmp/EncodeRGB4.java:
+ New class.
+ * gnu/javax/imageio/bmp/EncodeRGB8.java:
+ New class.
+ * gnu/javax/imageio/bmp/EncodeRLE4.java:
+ New class.
+ * gnu/javax/imageio/bmp/EncodeRLE8.java:
+ New class.
+ * javax/imageio/ImageIO.java:
+ Fixed comment.
+
+2006-03-20 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalTabbedPaneUI.java
+ (TabbedPaneLayout.normalizeTabRuns): New method.
+ (createLayoutManager): Return the Metal TabbedPaneLayout, not super.
+ (paintTabBorder): Replaced if-else chain with switch.
+ (paintTopTabBorder): Rewritten to correctly paint tab. Also support
+ Ocean theme.
+ (paintBottomTabBorder): Rewritten to correctly paint tab. Also support
+ Ocean theme.
+ (paintLeftTabBorder): Rewritten to correctly paint tab. Also support
+ Ocean theme.
+ (paintRightTabBorder): Rewritten to correctly paint tab. Also support
+ Ocean theme.
+ (paintTabBackground): Fetch background color from the TabbedPane.
+ Fixed painting and improved by not using fillPolygon, and instead
+ using fillRectangle. Replaced if-else chain with switch.
+ (calculateMaxTabHeight): Added overridden method with FIXME.
+ (getTabRunOverlay): Overridden to provide overlay for LEFT or RIGHT
+ placement.
+ (paintContentBorderTopEdge): Added stub with FIXME.
+ (paintContentBorderBottomEdge): Added stub with FIXME.
+ (paintContentBorderLeftEdge): Added stub with FIXME.
+ (paintContentBorderRightEdge): Added stub with FIXME.
+
+2006-03-20 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (tabsOpaque): New field.
+ (installDefaults): Fetch tabsOpaque property from UIManager.
+ (paintTab): Fill tab background when tabsOpaque property is true.
+ * javax/swing/plaf/basic/BasicLookAndFeel.java
+ (initComponentDefaults): Added TabbedPane.tabsOpaque property.
+
+2006-03-20 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JTabbedPane.java
+ (Pane.getBackground): When no background was explicitly set, return
+ the JTabbedPane's background.
+
+2006-03-20 Wolfgang Baer <WBaer@gmx.de>
+
+ * org/omg/CORBA/ACTIVITY_COMPLETED.java,
+ * org/omg/CORBA/ACTIVITY_REQUIRED.java,
+ * org/omg/CORBA/BAD_INV_ORDER.java,
+ * org/omg/CORBA/BAD_CONTEXT.java,
+ * org/omg/CORBA/BAD_OPERATION.java,
+ * org/omg/CORBA/BAD_PARAM.java,
+ * org/omg/CORBA/BAD_QOS.java,
+ * org/omg/CORBA/BAD_TYPECODE.java,
+ * org/omg/CORBA/CODESET_INCOMPATIBLE.java,
+ * org/omg/CORBA/COMM_FAILURE.java,
+ * org/omg/CORBA/CurrentHolder.java,
+ * org/omg/CORBA/DATA_CONVERSION.java,
+ * org/omg/CORBA/FREE_MEM.java,
+ * org/omg/CORBA/IMP_LIMIT.java,
+ * org/omg/CORBA/INITIALIZE.java,
+ * org/omg/CORBA/INTERNAL.java,
+ * org/omg/CORBA/INTF_REPOS.java,
+ * org/omg/CORBA/INVALID_ACTIVITY.java,
+ * org/omg/CORBA/INVALID_TRANSACTION.java,
+ * org/omg/CORBA/INV_FLAG.java,
+ * org/omg/CORBA/INV_IDENT.java,
+ * org/omg/CORBA/INV_OBJREF.java,
+ * org/omg/CORBA/INV_POLICY.java,
+ * org/omg/CORBA/MARSHAL.java,
+ * org/omg/CORBA/NO_RESOURCES.java,
+ * org/omg/CORBA/NO_MEMORY.java,
+ * org/omg/CORBA/NO_IMPLEMENT.java,
+ * org/omg/CORBA/NO_PERMISSION.java,
+ * org/omg/CORBA/NO_RESPONSE.java,
+ * org/omg/CORBA/OBJECT_NOT_EXIST.java,
+ * org/omg/CORBA/OBJ_ADAPTER.java,
+ * org/omg/CORBA/ParameterModeHolder.java,
+ * org/omg/CORBA/PolicyError.java,
+ * org/omg/CORBA/PolicyErrorHolder.java,
+ * org/omg/CORBA/PolicyHolder.java,
+ * org/omg/CORBA/PolicyListHolder.java,
+ * org/omg/CORBA/REBIND.java,
+ * org/omg/CORBA/TIMEOUT.java,
+ * org/omg/CORBA/TRANSACTION_MODE.java,
+ * org/omg/CORBA/TRANSACTION_REQUIRED.java,
+ * org/omg/CORBA/TRANSACTION_ROLLEDBACK.java,
+ * org/omg/CORBA/TRANSACTION_UNAVAILABLE.java,
+ * org/omg/CORBA/TRANSIENT.java,
+ * org/omg/CORBA/TypeCodeHolder.java,
+ * org/omg/CORBA/UNKNOWN.java,
+ * org/omg/CORBA/UnionMember.java,
+ * org/omg/CORBA/UnknownUserException.java,
+ * org/omg/CORBA/UnknownUserExceptionHolder.java,
+ * org/omg/CORBA/WrongTransactionHolder.java,
+ * org/omg/IOP/IOR.java,
+ * org/omg/IOP/IORHolder.java,
+ * org/omg/IOP/MultipleComponentProfileHolder.java,
+ * org/omg/IOP/ServiceContextHolder.java,
+ * org/omg/IOP/ServiceContextListHolder.java,
+ * org/omg/IOP/TaggedComponentHolder.java,
+ * org/omg/IOP/TaggedProfileHolder.java,
+ * org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.java,
+ * org/omg/PortableInterceptor/ObjectReferenceTemplateHolder.java,
+ * org/omg/PortableInterceptor/IORInterceptor_3_0Holder.java,
+ * org/omg/PortableInterceptor/ObjectReferenceFactoryHolder.java:
+ Made class final, various javadoc fixlets.
+ * org/omg/CORBA/CompletionStatus.java,
+ * org/omg/CORBA/PERSIST_STORE.java,
+ * org/omg/CORBA/ValueMember.java,
+ * org/omg/PortableInterceptor/ForwardRequest.java,
+ * org/omg/PortableInterceptor/InvalidSlot.java,
+ * org/omg/IOP/CodecPackage/TypeMismatch.java,
+ * org/omg/IOP/CodecPackage/InvalidTypeForEncoding.java,
+ * org/omg/IOP/CodecPackage/FormatMismatch.java,
+ * org/omg/IOP/CodecFactoryPackage/UnknownEncoding.java,
+ * org/omg/IOP/Encoding.java,
+ * org/omg/IOP/TaggedComponent.java,
+ * org/omg/IOP/TaggedProfile.java: Made class final.
+ * org/omg/CORBA/SystemException.java: Made class abstract.
+ * org/omg/CORBA/UserException.java: Made class abstract.
+ (UserException): Now protected.
+ (UserException(String)): Likewise.
+ * org/omg/Messaging/SyncScopeHelper.java: Now abstract, javadoc fixes.
+ (typecode): Removed unused private variable.
+
+2006-03-20 Chris Burdess <dog@gnu.org>
+
+ Fixes PR 26761
+ * gnu/xml/stream/XMLParser.java: Permit U+fffd as XML Char.
+
+2006-03-20 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (paintTabArea): Look up tab run indices in tabRuns array instead
+ of using the index directly.
+
+2006-03-20 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (paintTab): Fixed painting.
+ (paintText): Fixed text painting.
+ (paintFocusIndicator): Fixed painting of the focus rectangle.
+ (paintContentBorder): Fixed painting of the content area.
+
+2006-03-20 Mark Wielaard <mark@klomp.org>
+
+ * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java (pixbufLock): New
+ static lock Object field.
+ (produce): Synchronize on pixbufLock when calling initState(),
+ pumpBytes() and pumpDone().
+ (finalize): Likewise when calling finish().
+ (GdkPixbufWriter.write): Likewise when calling streamImage().
+ * gnu/java/awt/peer/gtk/GtkImage.java (GtkImage(String)): Likewise
+ when calling loadPixbuf. Chain exception.
+ (GtkImage(byte[])): Likewise when calling loadImageFromData.
+ (GtkImage(URL)): Likewise.
+ (GtkImage(int,int)): Likewise when calling createPixmap().
+ (GtkImage(GtkImage,int,int,int)): Likewise when calling
+ createScaledPixmap().
+ (GtkImage(Pointer)): Likewise when calling createFromPixbuf().
+ (setImage): Likewise when calling createPixmap() and setPixels().
+ (getSource): Likewise when calling getPixels().
+ (flush): Likewise when calling freePixmap().
+ (finalize): Likewise.
+ (drawImage): Likewise when calling drawPixelsScaledFlipped() and
+ drawPixelsScaledFlipped().
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
+ (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initState): Remove
+ gdk_threads_enter/leave().
+ (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_finish): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpDone): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpBytes): Likewise.
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
+ (Java_gnu_java_awt_peer_gtk_GtkImage_loadPixbuf): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GtkImage_loadImageFromData): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GtkImage_createFromPixbuf): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GtkImage_getPixels): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GtkImage_setPixels): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GtkImage_createPixmap): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GtkImage_freePixmap): Likewise.
+ (Java_gnu_java_awt_peer_gtk_GtkImage_createScaledPixmap): Likewise.
+
+2006-03-20 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (calculateTabHeight): Not need to use SwingUtilities here.
+ (getTabInsets): Do not rotate insets.
+
+2006-03-20 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (paint): Make sure the layout is valid before painting.
+ (paintTabArea): Made tab painting more straightforward and efficient.
+
+2006-03-20 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTable.java (ROWS_PER_WHEEL_CLICK): Removed.
+ (getScrollableUnitIncrement): Rewritten.
+ * javax/swing/JTree.java (ROWS_PER_WHEEL_CLICK): Removed.
+ (getScrollableUnitIncrement): Rewritten.
+ * javax/swing/plaf/basic/BasicScrollPaneUI.java
+ (ROWS_PER_WHEEL_CLICK): New field.
+ (MouseWheelHandler.mouseWheelMoved): Rewritten.
+
+2006-03-20 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (paint): Make sure the layout is valid before painting.
+ (paintTabArea): Made tab painting more straightforward and efficient.
+
+2006-03-20 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicTabbedPaneUI.java
+ (MouseHandler.mousePressed): Rewritten for clearer and simpler
+ code.
+ (MouseHandler.mouseEntered): Implemented to set the rollover tab.
+ (MouseHandler.mouseMoved): Implemented to set the rollover tab.
+ (MouseHandler.mouseExited): Implemented to unset the rollover tab.
+ (TabbedPaneLayout.calculateLayoutInfo): Don't set the component's
+ bounds here. That is moved into layoutContainer().
+ (calculateSize): Correctly respect insets. Made code slightly more
+ clear and efficient.
+ (calculateTabRects): Rewritten completely. The old code was
+ not quite right and unstable in some situations.
+ (layoutContainer): Moved layout of tabbed pane's subcomponents
+ here.
+ (tabRunsDirty): New field.
+ (rolloverTab): New field.
+ (tabForCoordinate): Rewritten for simplicity and correctness.
+ (setRolloverTab): New method.
+ (getRolloverTab): New method.
+
+2006-03-20 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTable.java (getScrollableUnitIncrement): Rewritten.
+ * javax/swing/JTree.java (getScrollableUnitIncrement): Rewritten.
+ (getScrollableUnitIncrement
+ * javax/swing/Scrollable.java: Documented.
+ * javax/swing/plaf/basic/BasicScrollPaneUI.java
+ (MouseWheelHandler):Rewritten.
+
+2006-03-20 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * doc/vmintegration.texinfo:
+ Updated with gnu.classpath.Unsafe
+
+2006-03-20 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * NEWS:
+ Updated with VMArray and Unsafe changes.
+
+2006-03-20 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTable.java (ROWS_PER_WHEEL_CLICK): New field.
+ (getScrollableUnitIncrement): Rewritten.
+ * javax/swing/JTree.java (ROWS_PER_WHEEL_CLICK): New field.
+ (getScrollableUnitIncrement): Rewritten.
+ (getScrollableBlockIncrement): Rewritten.
+ * javax/swing/plaf/basic/BasicScrollPaneUI.java
+ (MouseWheelHandler): Implemented. (ViewportContainerListener):
+ New class. (containerListener): New field. (SCROLL_NON_SCROLABLES):
+ New field. (installListeners): Install wheel listeners.
+ (uninstallListeners): Uninstall wheel listeners.
+ * javax/swing/plaf/basic/BasicTableUI.java: Remove the implementation
+ of the MouseWheelListener. (installListeners): Do not install wheel
+ listener. (ROWS_PER_WHEEL_CLICK): Removed.
+
+2006-03-19 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * vm/reference/gnu/classpath/Unsafe.java:
+ Documented.
+ (getUnsafe()): Updated to handle security.
+
+2006-03-19 Tom Tromey <tromey@redhat.com>
+
+ * vm/reference/gnu/classpath/Unsafe.java:
+ New class to handle low-level facilities for concurrency.
+
+2006-03-19 Michael Barker <mike@middlesoft.co.uk>
+
+ * vm/reference/gnu/java/nio/VMChannel.java: Added, supports setting
+ non-blocking and scatter-gather io operations.
+ * gnu/java/nio/PipeImpl.java: Retrofitted to use VMChannel
+ * gnu/java/nio/SelectorImpl.java
+ (register) Added condition for gnu.java.nio.SocketChannelSelectionKeyImpl
+ * gnu/java/nio/SocketChannelSelectionKeyImpl.java Added.
+ * gnu/java/nio/channels/FileChannelImpl.java: Retrofitted to use VMChannel
+ * java/nio/FileChannel.java
+ (read (ByteBuffer)) Changed to call abstract method.
+ (write (ByteBuffer)) Changed to call abstract method.
+ * include/gnu_java_nio_VMChannel.h: Added.
+ * native/jni/java-nio/gnu_java_nio_VMChannel.c: Added.
+
+2006-03-19 Mark Wielaard <mark@klomp.org>
+
+ * include/Makefile.am: Rename PlainDatagramSocketImpl to
+ VMPlainDatagramSocketImpl and PlainSocketImpl to VMPlainSocketImpl.
+ * include/gnu_java_net_VMPlainDatagramSocketImpl.h: Regenerated.
+ * include/gnu_java_net_VMPlainSocketImpl.h: Likewise.
+
+2006-03-19 Mark Wielaard <mark@klomp.org>
+
+ * gnu/java/awt/peer/gtk/GdkFontPeer.java (getPostScriptName): Return
+ familyName.
+ * gnu/java/awt/peer/gtk/GtkFontPeer.java: Removed unused file.
+
+2006-03-19 Michael Koch <konqueror@gmx.de>
+
+ * resource/gnu/java/locale/LocaleInformation_aa_ET.properties,
+ resource/gnu/java/locale/LocaleInformation_am.properties,
+ resource/gnu/java/locale/LocaleInformation_am_ET.properties,
+ resource/gnu/java/locale/LocaleInformation_as_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_az_Cyrl.properties,
+ resource/gnu/java/locale/LocaleInformation_bg.properties,
+ resource/gnu/java/locale/LocaleInformation_bn_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_ca.properties,
+ resource/gnu/java/locale/LocaleInformation_cs.properties,
+ resource/gnu/java/locale/LocaleInformation_cy.properties,
+ resource/gnu/java/locale/LocaleInformation_da.properties,
+ resource/gnu/java/locale/LocaleInformation_de.properties,
+ resource/gnu/java/locale/LocaleInformation_dv.properties,
+ resource/gnu/java/locale/LocaleInformation_el.properties,
+ resource/gnu/java/locale/LocaleInformation_en.properties,
+ resource/gnu/java/locale/LocaleInformation_en_GB.properties,
+ resource/gnu/java/locale/LocaleInformation_en_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_en_PK.properties,
+ resource/gnu/java/locale/LocaleInformation_en_SG.properties,
+ resource/gnu/java/locale/LocaleInformation_en_US_POSIX.properties,
+ resource/gnu/java/locale/LocaleInformation_es.properties,
+ resource/gnu/java/locale/LocaleInformation_es_AR.properties,
+ resource/gnu/java/locale/LocaleInformation_es_BO.properties,
+ resource/gnu/java/locale/LocaleInformation_es_CL.properties,
+ resource/gnu/java/locale/LocaleInformation_es_CO.properties,
+ resource/gnu/java/locale/LocaleInformation_es_CR.properties,
+ resource/gnu/java/locale/LocaleInformation_es_DO.properties,
+ resource/gnu/java/locale/LocaleInformation_es_EC.properties,
+ resource/gnu/java/locale/LocaleInformation_es_ES.properties,
+ resource/gnu/java/locale/LocaleInformation_es_GT.properties,
+ resource/gnu/java/locale/LocaleInformation_es_HN.properties,
+ resource/gnu/java/locale/LocaleInformation_es_MX.properties,
+ resource/gnu/java/locale/LocaleInformation_es_NI.properties,
+ resource/gnu/java/locale/LocaleInformation_es_PA.properties,
+ resource/gnu/java/locale/LocaleInformation_es_PE.properties,
+ resource/gnu/java/locale/LocaleInformation_es_PR.properties,
+ resource/gnu/java/locale/LocaleInformation_es_PY.properties,
+ resource/gnu/java/locale/LocaleInformation_es_SV.properties,
+ resource/gnu/java/locale/LocaleInformation_es_US.properties,
+ resource/gnu/java/locale/LocaleInformation_es_UY.properties,
+ resource/gnu/java/locale/LocaleInformation_es_VE.properties,
+ resource/gnu/java/locale/LocaleInformation_fa.properties,
+ resource/gnu/java/locale/LocaleInformation_fa_AF.properties,
+ resource/gnu/java/locale/LocaleInformation_fa_IR.properties,
+ resource/gnu/java/locale/LocaleInformation_fi.properties,
+ resource/gnu/java/locale/LocaleInformation_fr.properties,
+ resource/gnu/java/locale/LocaleInformation_fr_CA.properties,
+ resource/gnu/java/locale/LocaleInformation_ga.properties,
+ resource/gnu/java/locale/LocaleInformation_gu_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_hi_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_hr.properties,
+ resource/gnu/java/locale/LocaleInformation_hu.properties,
+ resource/gnu/java/locale/LocaleInformation_id.properties,
+ resource/gnu/java/locale/LocaleInformation_is.properties,
+ resource/gnu/java/locale/LocaleInformation_it.properties,
+ resource/gnu/java/locale/LocaleInformation_ja.properties,
+ resource/gnu/java/locale/LocaleInformation_kk.properties,
+ resource/gnu/java/locale/LocaleInformation_kl.properties,
+ resource/gnu/java/locale/LocaleInformation_km.properties,
+ resource/gnu/java/locale/LocaleInformation_ky.properties,
+ resource/gnu/java/locale/LocaleInformation_lo.properties,
+ resource/gnu/java/locale/LocaleInformation_lo_LA.properties,
+ resource/gnu/java/locale/LocaleInformation_lt.properties,
+ resource/gnu/java/locale/LocaleInformation_lt_LT.properties,
+ resource/gnu/java/locale/LocaleInformation_lv.properties,
+ resource/gnu/java/locale/LocaleInformation_mk.properties,
+ resource/gnu/java/locale/LocaleInformation_mn.properties,
+ resource/gnu/java/locale/LocaleInformation_mr.properties,
+ resource/gnu/java/locale/LocaleInformation_mr_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_ms.properties,
+ resource/gnu/java/locale/LocaleInformation_ms_BN.properties,
+ resource/gnu/java/locale/LocaleInformation_mt.properties,
+ resource/gnu/java/locale/LocaleInformation_nb.properties,
+ resource/gnu/java/locale/LocaleInformation_nl.properties,
+ resource/gnu/java/locale/LocaleInformation_nn.properties,
+ resource/gnu/java/locale/LocaleInformation_om_ET.properties,
+ resource/gnu/java/locale/LocaleInformation_or_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_pa.properties,
+ resource/gnu/java/locale/LocaleInformation_pl.properties,
+ resource/gnu/java/locale/LocaleInformation_pt.properties,
+ resource/gnu/java/locale/LocaleInformation_ru.properties,
+ resource/gnu/java/locale/LocaleInformation_ru_RU.properties,
+ resource/gnu/java/locale/LocaleInformation_ru_UA.properties,
+ resource/gnu/java/locale/LocaleInformation_sa.properties,
+ resource/gnu/java/locale/LocaleInformation_sa_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_sk.properties,
+ resource/gnu/java/locale/LocaleInformation_sr_Latn.properties,
+ resource/gnu/java/locale/LocaleInformation_sv.properties,
+ resource/gnu/java/locale/LocaleInformation_sw.properties,
+ resource/gnu/java/locale/LocaleInformation_sw_TZ.properties,
+ resource/gnu/java/locale/LocaleInformation_ta_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_te.properties,
+ resource/gnu/java/locale/LocaleInformation_te_IN.properties,
+ resource/gnu/java/locale/LocaleInformation_th.properties,
+ resource/gnu/java/locale/LocaleInformation_ti.properties,
+ resource/gnu/java/locale/LocaleInformation_ti_ER.properties,
+ resource/gnu/java/locale/LocaleInformation_ti_ET.properties,
+ resource/gnu/java/locale/LocaleInformation_tr.properties,
+ resource/gnu/java/locale/LocaleInformation_tt.properties,
+ resource/gnu/java/locale/LocaleInformation_uk.properties,
+ resource/gnu/java/locale/LocaleInformation_ur.properties,
+ resource/gnu/java/locale/LocaleInformation_uz.properties,
+ resource/gnu/java/locale/LocaleInformation_zh.properties,
+ resource/gnu/java/locale/LocaleInformation_zh_Hant.properties:
+ More updates for CLDR 1.3.
+
+2006-03-19 Andrew John Hughes <gnu_andrew@member.fsf.org>
+
+ * doc/vmintegration.texinfo:
+ Updated to include VMArray.
+ * include/Makefile.am:
+ Replace java_lang_reflect_Array.h with
+ java_lang_reflect_VMArray.h
+ * include/java_lang_reflect_VMArray.h:
+ New autogenerated header.
+ * include/java_lang_reflect_Array.h:
+ Removed.
+ * java/lang/reflect/Array.java:
+ (newInstance(Class,int)): Calls VMArray.
+ (createMultiArray(Class,int[],int)): Likewise.
+ (createObjectArray(Class,int)): Removed.
+ * native/jni/java-lang/Makefile.am:
+ Replaced java_lang_reflect_Array.c with
+ java_lang_reflect_VMArray.c
+ * native/jni/java-lang/java_lang_reflect_VMArray.c:
+ Renamed from java_lang_reflect_Array.c.
+ * vm/reference/java/lang/reflect/VMArray.java:
+ (createObjectArray(Class,int)): Native method moved
+ from java.lang.reflect.Array.
+
+2006-03-19 Roman Kennke <kennke@aicas.com>
+
+ * gnu/javax/swing/plaf/metal/CustomizableTheme.java: New class.
+ * examples/gnu/classpath/examples/swing/MetalThemeEditor.java:
+ New class.
+ * examples/gnu/classpath/examples/swing/Demo.java
+ (mkButtonBar): Hook up theme editor.
+ (mkMenuBar): Hook up theme editor.
+
+2006-03-19 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicFileChooserUI.java
+ (ApproveSelectionAction.actionPerformed): Added case for when
+ nothing has been selected but the user has typed a filename
+ into the textfield.
+ (getFileName): Return the value of the text field.
+
+2006-03-19 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JColorChooser.java
+ (createDialog): Create JDialog instead of ModalDialog. Make this
+ dialog modal by calling setModal(true).
+ (ModalDialog): Removed unnecessary inner class.
+
+2006-03-19 Tom Tromey <tromey@redhat.com>
+
+ * java/awt/font/NumericShaper.java: Rewrote.
+
+2006-03-19 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicTableUI.java:
+ Implement MouseWheelListener. (ROWS_PER_WHEEL_CLICK):
+ New field. MouseInputHandler.mouseWheelMoved): New method.
+ (installListeners): Register MouseInputHandler as
+ wheel listener also.
+
+2006-03-19 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ PR 26746
+ * javax/swing/ViewportLayout.java (layoutContainer):
+ If Scrollable tracks dimension, set view size to the port size.
+ If port is larger than the view, move the view to the top/left.
+
+2006-03-19 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/MenuSelectionManager.java
+ (isComponentPartOfCurrentMenu): Also consider the first element
+ in a menu selection list. Make a isDescendentFrom check instead
+ of simple equals to also catch sub components.
+
+2006-03-19 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/JComboBox.java
+ (actionPerformed): Fetch selected item directly from the editor
+ instead of trying to get it from the event.
+
+2006-03-19 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicComboBoxEditor.java
+ (listener): Removed field.
+ (BasicComboBoxEditor): Removed initialization of listener field.
+ (addActionListener): Add listener directly to editor.
+ (removeActionListener): Remove listener directly from editor.
+ (ComboBoxEditorListener): Removed class.
+ * javax/swing/plaf/basic/BasicComboBoxUI.java
+ (getPreferredSize): Fixed to return the minimumSize.
+ (getMinimumSize): Improved code for more clearness.
+ (getMaximumSize): Return (32767,32767) as requested by the mauve test.
+ (rectangleForCurrentValue): Correctly respect insets.
+ (getDefaultSize): Return preferredSize here. Dont override height
+ with 100.
+ (getDisplaySize): Moved around code for more clearness. Added
+ handling of prototype renderer.
+ (ComboBoxLayoutManager.layoutContainer): Set editor bounds after
+ arrowButton bounds since the former depends on the latter.
+ * javax/swing/plaf/metal/MetalComboBoxButton.java:
+ (MetalComboBoxButton): Make button rollover disabled.
+ (isFocusTraversable): Return false unconditionally.
+ * javax/swing/plaf/metal/MetalComboBoxEditor.java:
+ (EditorTextField): New class. Fixes the size properties.
+ (MetalComboBoxEditor): Create instance of EditorTextField.
+ * javax/swing/plaf/metal/MetalComboBoxUI.java:
+ (getMinimumSize): Fixed editable size.
+
+2006-03-18 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/JTable.java (BooleanCellRenderer): Rewritten.
+
+2006-03-18 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalToolBarUI.java
+ (update): Added overridden method to support OceanTheme.
+
+2006-03-18 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax/swing/plaf/basic/BasicTableUI.java (KeyHandler.keyTyped):
+ Activate the cell editing on character keystroke.
+
+2006-03-18 Mark Wielaard <mark@klomp.org>
+
+ * java/awt/Component.java (eventTypeEnabled): Handle
+ MouseEvent.MOUSE_WHEEL.
+ * gnu/java/awt/peer/gtk/GtkComponentPeer.java (postMouseWheelEvent):
+ New callback method.
+ * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+ (AWT_MOUSE_WHEEL): New constant.
+ (AWT_WHEEL_UNIT_SCROLL): Likewise.
+ (postMouseWheelEventID): New static variable.
+ (cp_gtk_component_init_jni): Record postMouseWheelEventID.
+ (cp_gtk_component_connect_mouse_signals): Connect scroll-event.
+ (button_number): Renamed to ...
+ (button_number_direction): variable to hold button number or scroll
+ direction.
+ (component_button_press_cb): Use button_number_direction.
+ (component_scroll_cb): New static callback function.
+
+2006-03-18 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax.swing.JTable.java (TableTextField.scrollRectToVisible):
+ Return without action.
+
+2006-03-18 Mark Wielaard <mark@klomp.org>
+
+ * gnu/java/awt/peer/gtk/GtkComponentPeer.java (paintComponent):
+ Don't cast graphics object to GdkGraphics.
+ (updateComponent): Likewise.
+
+2006-03-18 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * examples/gnu/classpath/examples/swing/TableDemo.java
+ (TModel.getColumnClass): Set second column to Icon.
+ (TModel.isCellEditable): Say icons are not editable.
+ (createContent): Fill the in second column with some icons from
+ MetalIconFactory.
+
+2006-03-18 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * examples/gnu/classpath/examples/swing/Demo.java
+ (mkButtonBar): Set maximal button bar height to the preferred height.
+
+2006-03-18 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicComboPopup.java
+ (show): Substract insets from scroller width.
+ (getPopupHeightForRowCount): If height==0, return a default of 100
+ instead for empty ComboBoxes.
+
+2006-03-18 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/basic/BasicLookAndFeel.java
+ (PopupHelper.autoClosePopups): Removed field.
+ (PopupHelper.mousePressed): Removed processing of registered
+ autoclose popups.
+ (registerForAutoClose): Removed unneeded method.
+ (autoClosePopups): Removed unneeded method.
+ (registerForAutoClose): Removed unneeded method.
+
+2006-03-18 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * javax.swing.JTable.java (TableTextField): Set border.
+ (moveToCellBeingEdited): Do not adjust the editor boundaries
+
+2006-03-18 Michael Koch <konqueror@gmx.de>
+
+ * resource/gnu/java/locale/LocaleInformation_aa.properties,
+ resource/gnu/java/locale/LocaleInformation_af.properties,
+ resource/gnu/java/locale/LocaleInformation_am.properties,
+ resource/gnu/java/locale/LocaleInformation_ar.properties,
+ resource/gnu/java/locale/LocaleInformation_az_Cyrl.properties,
+ resource/gnu/java/locale/LocaleInformation_be.properties,
+ resource/gnu/java/locale/LocaleInformation_bg.properties,
+ resource/gnu/java/locale/LocaleInformation_bn.properties,
+ resource/gnu/java/locale/LocaleInformation_ca.properties,
+ resource/gnu/java/locale/LocaleInformation_cs.properties,
+ resource/gnu/java/locale/LocaleInformation_cy.properties,
+ resource/gnu/java/locale/LocaleInformation_da.properties,
+ resource/gnu/java/locale/LocaleInformation_de.properties,
+ resource/gnu/java/locale/LocaleInformation_de_CH.properties,
+ resource/gnu/java/locale/LocaleInformation_dz.properties,
+ resource/gnu/java/locale/LocaleInformation_en.properties,
+ resource/gnu/java/locale/LocaleInformation_eo.properties,
+ resource/gnu/java/locale/LocaleInformation_es.properties,
+ resource/gnu/java/locale/LocaleInformation_et.properties,
+ resource/gnu/java/locale/LocaleInformation_eu.properties,
+ resource/gnu/java/locale/LocaleInformation_fa.properties,
+ resource/gnu/java/locale/LocaleInformation_fa_AF.properties,
+ resource/gnu/java/locale/LocaleInformation_fi.properties,
+ resource/gnu/java/locale/LocaleInformation_fo.properties,
+ resource/gnu/java/locale/LocaleInformation_fr.properties,
+ resource/gnu/java/locale/LocaleInformation_ga.properties,
+ resource/gnu/java/locale/LocaleInformation_gl.properties,
+ resource/gnu/java/locale/LocaleInformation_gu.properties,
+ resource/gnu/java/locale/LocaleInformation_he.properties,
+ resource/gnu/java/locale/LocaleInformation_hi.properties,
+ resource/gnu/java/locale/LocaleInformation_hr.properties,
+ resource/gnu/java/locale/LocaleInformation_hu.properties,
+ resource/gnu/java/locale/LocaleInformation_hy.properties,
+ resource/gnu/java/locale/LocaleInformation_id.properties,
+ resource/gnu/java/locale/LocaleInformation_is.properties,
+ resource/gnu/java/locale/LocaleInformation_it.properties,
+ resource/gnu/java/locale/LocaleInformation_ja.properties,
+ resource/gnu/java/locale/LocaleInformation_ka.properties,
+ resource/gnu/java/locale/LocaleInformation_km.properties,
+ resource/gnu/java/locale/LocaleInformation_ko.properties,
+ resource/gnu/java/locale/LocaleInformation_lo.properties,
+ resource/gnu/java/locale/LocaleInformation_lt.properties,
+ resource/gnu/java/locale/LocaleInformation_lv.properties,
+ resource/gnu/java/locale/LocaleInformation_mk.properties,
+ resource/gnu/java/locale/LocaleInformation_mr.properties,
+ resource/gnu/java/locale/LocaleInformation_ms.properties,
+ resource/gnu/java/locale/LocaleInformation_mt.properties,
+ resource/gnu/java/locale/LocaleInformation_nb.properties,
+ resource/gnu/java/locale/LocaleInformation_nl.properties,
+ resource/gnu/java/locale/LocaleInformation_nn.properties,
+ resource/gnu/java/locale/LocaleInformation_om.properties,
+ resource/gnu/java/locale/LocaleInformation_pl.properties,
+ resource/gnu/java/locale/LocaleInformation_ps.properties,
+ resource/gnu/java/locale/LocaleInformation_pt.properties,
+ resource/gnu/java/locale/LocaleInformation_pt_PT.properties,
+ resource/gnu/java/locale/LocaleInformation_ro.properties,
+ resource/gnu/java/locale/LocaleInformation_ru.properties,
+ resource/gnu/java/locale/LocaleInformation_sk.properties,
+ resource/gnu/java/locale/LocaleInformation_sl.properties,
+ resource/gnu/java/locale/LocaleInformation_so.properties,
+ resource/gnu/java/locale/LocaleInformation_sq.properties,
+ resource/gnu/java/locale/LocaleInformation_sr.properties,
+ resource/gnu/java/locale/LocaleInformation_sr_Latn.properties,
+ resource/gnu/java/locale/LocaleInformation_sv.properties,
+ resource/gnu/java/locale/LocaleInformation_sw.properties,
+ resource/gnu/java/locale/LocaleInformation_ta.properties,
+ resource/gnu/java/locale/LocaleInformation_te.properties,
+ resource/gnu/java/locale/LocaleInformation_th.properties,
+ resource/gnu/java/locale/LocaleInformation_tr.properties,
+ resource/gnu/java/locale/LocaleInformation_uk.properties,
+ resource/gnu/java/locale/LocaleInformation_uz.properties,
+ resource/gnu/java/locale/LocaleInformation_vi.properties,
+ resource/gnu/java/locale/LocaleInformation_zh.properties,
+ resource/gnu/java/locale/LocaleInformation_zh_Hant.properties:
+ Updated to use the new localized strings for currencies, languages,
+ variants, territories, etc.
+
+2006-03-18 Ito Kazumitsu <kaz@maczuka.gcd.org>
+
+ * gnu/regexp/REMatch.java(matchedCharIndexed): New field,
+ (start, end): Added comment about the negative values of them,
+ (finish): Saves the input text in matchedCharIndexed,
+ (toString): If the start or end index is out of bounds of the
+ matched text, get the substring from matchedCharIndexed.
+ Added special handlings in case start/end index < -1,
+ (getSubStartIndex, getStartIndex, getSubEndIndex, getEndIndex):
+ Added special handlings in case start/end index < -1,
+ * gnu/regexp/RETokenLookAhead.java(matchThis): Return the newly
+ found match, but keep the index as the original match.
+ * gnu/regexp/RETokenLookBehind.java(matchThis): Return the newly
+ found match, but keep the index as the original match.
+ * gnu/regexp/RETokenBackRef.java(matchThis): Added special handlings
+ in case start/end index < -1.
+
+2006-03-17 Audrius Meskauskas <AudriusA@Bioinformatics.org>
+
+ * gnu/java/rmi/activation/ActivationSystemTransient.java (debug):
+ Set to false.
+
+2006-03-17 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/DefaultCaret.java:
+ (mouseClicked) Use setDot() and moveDot() instead of
+ JTextComponent.select().
+
+2006-03-17 Roman Kennke <kennke@aicas.com>
+
+ * javax/swing/plaf/metal/MetalComboBoxEditor.java
+ (MetalComboBoxEditorBorder.paintBorder): Implemented special
+ border painting for the Ocean theme.
+ (MetalComboBoxEditor): Create editor directly instead of going
+ to super.
+
2006-03-17 Roman Kennke <kennke@aicas.com>
* javax/swing/text/JTextComponent.java
@@ -40,17 +6318,17 @@
2006-03-17 Roman Kennke <kennke@aicas.com>
* javax/swing/plaf/basic/BasicButtonUI.java
- (installDefaults): Only install UI margin if installed margin
- is null or a UIResource.
- (uninstallDefaults): Only uninstall margin if it's
- a UIResource.
-
-2006-03-17 Robert Schuster <robertschuster@fsfe.org>
-
- * javax/swing/text/DefaultCaret.java:
- (mouseClicked) Use setDot() and moveDot() instead of
- JTextComponent.select().
-
+ (installDefaults): Only install UI margin if installed margin.
+ is null or a UIResource.
+ (uninstallDefaults): Only uninstall margin if it's
+ a UIResource.
+
+ 2006-03-17 Robert Schuster <robertschuster@fsfe.org>
+
+ * javax/swing/text/DefaultCaret.java:
+ (mouseClicked) Use setDot() and moveDot() instead of
+ JTextComponent.select().
+
2006-03-17 Robert Schuster <robertschuster@fsfe.org>
* javax/swing/text/DefaultEditorKit.java: Refactored anonymous
@@ -8145,7 +14423,7 @@
Added deprecated tag.
* javax/swing/text/JTextComponent.java
(AccessibleJTextComponent): Fixed API doc and
- partially implemented.
+ partiall9 implemented.
(getCaretPosition): Fixed API doc and implemented.
(getSelectedText): Fixed API doc.
(getSelectionStart): Likewise.
diff --git a/ChangeLog.native b/ChangeLog.native
index af14f5945..28a1db5c8 100644
--- a/ChangeLog.native
+++ b/ChangeLog.native
@@ -1,3 +1,7 @@
+2006-06-06 Guilhem Lavaux <guilhem@kaffe.org>
+
+ * Merged HEAD as of 2006-05-08.
+
2006-05-09 Guilhem Lavaux <guilhem@kaffe.org>
* native/jni/native-lib/cpnet.c
diff --git a/INSTALL b/INSTALL
index 7da236669..96059a50a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -130,6 +130,8 @@ gives a complete list.
--with-gjdoc generate documentation using gjdoc default=no
--with-jay Regenerate the parsers with jay must be given the
path to the jay executable
+ --with-glibj-zip=ABS.PATH
+ use prebuilt glibj.zip class library
For more flags run configure --help.
diff --git a/NEWS b/NEWS
index fefb48b6d..2cd7afa5b 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,9 @@
+New in release 0.92
+
New in release 0.91 (UNRELEASED)
+* Experimental activation (java.rmi.activation) support, including RMI
+ activation daemon and persistent naming service tools.
* Experimental printing support: The API implementation of the javax.print
packages has been finished and work on the printing provider implementation
started. Currently supported features from the Java Print Service API are
@@ -7,8 +11,55 @@ New in release 0.91 (UNRELEASED)
jobs and support for client-formatted print data. An example application
(see: examples/gnu/classpath/examples/print/Demo) has been added to show
the API usage for service discovery and printing of files.
+* The GTKToolkit now gives access to the both the system clipboard and
+ system selection.
+* Custom mouse cursor support has been added to the gtk+ peers. And cursors
+ can now also be set on light-weight components.
* Free Swing improvements: Support for OceanTheme has been mostly completed
- and turned on as default Metal theme.
+ and turned on as default Metal theme. X11-style Copy and Paste behavior in
+ text components with the middle mouse button. Support cursor changes on
+ various components when resizing. Support for Look and Feel window
+ decorations has been added.
+* Updated locale data information to CLDR 1.3.
+* Various bugs in Classpath's SecureRandom implementations have been
+ fixed; that class now respects the "securerandom.source" security
+ property and the "java.security.egd" system property.
+* Support for assistive technologies has been added to AWT and Swing.
+
+Runtime interface changes:
+
+* A new class, VMArray, is now available which separates the native
+ array creation method from java.lang.reflect.Array.
+* A new class, gnu.classpath.Unsafe, is provided for handling the
+ new low-level operations required by java.util.concurrent.
+* The reference implementations of Method, Constructor, and Field
+ now have a new native getModifiersInternal() method. The public
+ getModifiers() method in each case has been rewritten in terms of
+ this method.
+* The reference implementation of VMThread has been updated to handle
+ the new Thread.UncaughtExceptionHandler support.
+* A new class, java.security.VMSecureRandom, is now available that is
+ used to generate random numbers for seeding cryptographically-secure
+ pseudo-random number generators.
+* VMClass and the reference implementations of Method, Constructor and Field
+ now include a number of 1.5 methods imported from the generics branch.
+ These are all optional (in the sense that the methods associated with them
+ merely fail on use if the VM doesn't provide them, rather than the
+ VM failing altogether), but VMs should aim to support them where possible.
+* The implementation of java.lang.instrument has been merged to the main
+ branch from the generics branch.
+* The VM interfaces of the main branch and the generics branch are now
+ consistent with one another. As a result, the main branch includes an
+ additional environ() function in VMSystem and an additional argument has
+ been added to nativeSpawn() in VMProcess.
+* Annotation support is now available in the main branch, if the VM supports
+ it. The VM should implement VMClass.getDeclaredAnnotations,
+ Constructor.getAnnotation, Constructor.getDeclaredAnnotations,
+ Field.getAnnotation, Field.getDeclaredAnnotations, Method.getAnnotation and
+ Method.getDeclaredAnnotations.
+* java.lang.Package now has a new constructor that takes the defining
+ ClassLoader as an extra argument. If you use a custom version of
+ VMClassLoader, please switch it to use this constructor.
New in release 0.90 (March 6, 2006)
diff --git a/configure.ac b/configure.ac
index 525e182f6..cb95ef2f0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6,7 +6,7 @@ dnl -----------------------------------------------------------
dnl define([AC_CACHE_LOAD], )dnl
dnl define([AC_CACHE_SAVE], )dnl
-AC_INIT([GNU Classpath],[0.91-pre],[classpath@gnu.org],[classpath])
+AC_INIT([GNU Classpath],[0.92-pre],[classpath@gnu.org],[classpath])
AC_CONFIG_SRCDIR(java/lang/System.java)
AC_CANONICAL_TARGET
@@ -33,6 +33,9 @@ esac
CLASSPATH_MODULE="${cp_module} -version-info ${LIBVERSION} -no-undefined"
AC_SUBST(CLASSPATH_MODULE)
+CLASSPATH_CONVENIENCE="-no-undefined"
+AC_SUBST(CLASSPATH_CONVENIENCE)
+
AC_PREREQ(2.59)
AM_INIT_AUTOMAKE([1.9.0 gnu std-options tar-ustar])
AC_CONFIG_HEADERS([include/config.h])
@@ -295,7 +298,7 @@ if test "x${COMPILE_JNI}" = xyes; then
strerror_r \
fcntl \
mmap munmap mincore msync madvise getpagesize sysconf \
- isnan])
+ ])
AC_HEADER_TIME
AC_STRUCT_TM
@@ -586,6 +589,57 @@ AC_ARG_ENABLE([portable-native-sync],
AX_CREATE_STDINT_H([include/config-int.h])
+dnl -----------------------------------------------------------------------
+dnl Support for using a prebuilt class library
+dnl -----------------------------------------------------------------------
+AC_ARG_WITH([glibj_zip],
+ AS_HELP_STRING([--with-glibj-zip=ABS.PATH],
+ [use prebuilt glibj.zip class library]))
+
+case "$with_glibj_zip" in
+"")
+ use_glibj_zip=false
+ ;;
+"no" )
+ use_glibj_zip=false
+ ;;
+"yes")
+ AC_MSG_ERROR([Please suply an absolute path to a prebuilt glibj.zip])
+ ;;
+*)
+ use_glibj_zip=true
+ PATH_TO_GLIBJ_ZIP=$with_glibj_zip
+ ;;
+esac;
+
+AM_CONDITIONAL(USE_PREBUILT_GLIBJ_ZIP, test x$use_glibj_zip = xtrue)
+AC_SUBST(PATH_TO_GLIBJ_ZIP)
+
+
+dnl -----------------------------------------------------------
+dnl Check if local socket support should be included.
+dnl -----------------------------------------------------------
+AC_ARG_ENABLE([local-sockets],
+ [AS_HELP_STRING(--enable-local-sockets,enables local (AF_LOCAL) socket API [default: no])],
+ [case "${enableval}" in
+ yes)
+ ENABLE_LOCAL_SOCKETS=yes
+ ;;
+ *)
+ ENABLE_LOCAL_SOCKETS=no
+ ;;
+ esac],
+ [])
+if test "x$ENABLE_LOCAL_SOCKETS" = "xyes"
+then
+ AC_CHECK_HEADER([sys/un.h])
+ AC_CHECK_FUNCS([read write bind listen accept shutdown], [],
+ AC_MSG_ERROR([networking support not available]))
+ AC_DEFINE(ENABLE_LOCAL_SOCKETS, [1], [Define to enable support for local sockets.])
+fi
+AM_CONDITIONAL(ENABLE_LOCAL_SOCKETS, test "x$ENABLE_LOCAL_SOCKETS" = "xyes")
+
+
dnl -----------------------------------------------------------
dnl output files
dnl -----------------------------------------------------------
@@ -620,9 +674,15 @@ scripts/classpath.spec
lib/Makefile
lib/gen-classlist.sh
lib/copy-vmresources.sh
+tools/appletviewer
tools/Makefile
+tools/jarsigner
+tools/keytool
examples/Makefile
examples/Makefile.jawt])
AC_CONFIG_COMMANDS([gen-classlist],[chmod 755 lib/gen-classlist.sh])
AC_CONFIG_COMMANDS([copy-vmresources],[chmod 755 lib/copy-vmresources.sh])
+AC_CONFIG_COMMANDS([appletviewer],[chmod 755 tools/appletviewer])
+AC_CONFIG_COMMANDS([jarsigner],[chmod 755 tools/jarsigner])
+AC_CONFIG_COMMANDS([keytool],[chmod 755 tools/keytool])
AC_OUTPUT
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 70100ce95..0bd79538b 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -2,7 +2,7 @@ SUBDIRS = api
EXTRA_DIST = README.jaxp
-info_TEXINFOS = hacking.texinfo vmintegration.texinfo
+info_TEXINFOS = hacking.texinfo vmintegration.texinfo tools.texinfo
%.dvi : %.texinfo
texi2dvi $<
@@ -10,4 +10,4 @@ info_TEXINFOS = hacking.texinfo vmintegration.texinfo
%.ps : %.dvi
dvips -o $@ $<
-docs: hacking.ps vmintegration.ps
+docs: hacking.ps vmintegration.ps tools.ps
diff --git a/doc/hacking.texinfo b/doc/hacking.texinfo
index 34b1099fd..efb7aa903 100644
--- a/doc/hacking.texinfo
+++ b/doc/hacking.texinfo
@@ -653,7 +653,11 @@ have @code{serialVersionUID} declared.
@item
Don't declare unchecked exceptions in the @code{throws} clause of a
method. However, if throwing an unchecked exception is part of the
-method's API, you should mention it in the Javadoc.
+method's API, you should mention it in the Javadoc. There is one
+important exception to this rule, which is that a stub method should
+be marked as throwing @code{gnu.classpath.NotImplementedException}.
+This will let our API comparison tools note that the method is not
+fully implemented.
@item
When overriding @code{Object.equals}, remember that @code{instanceof}
diff --git a/doc/vmintegration.texinfo b/doc/vmintegration.texinfo
index e9f104601..a784e6fad 100644
--- a/doc/vmintegration.texinfo
+++ b/doc/vmintegration.texinfo
@@ -200,6 +200,8 @@ implementation.
* java.nio::
* java.nio.channels::
* gnu.java.nio::
+* java.lang.reflect::
+* gnu.java.lang::
* Classpath Callbacks::
@end menu
@@ -226,7 +228,6 @@ become operable.
* java.lang.VMRuntime::
* java.lang.VMString::
* java.lang.VMThread::
-* java.lang.VMInstrumentationImpl::
* java.lang.VMMath::
@end menu
@@ -274,9 +275,12 @@ VM should filter out non-public classes.
@item @code{getDeclaredConstructors(Class,boolean)} -- And constructors.
@item @code{getClassLoader(Class)} -- Returns the @code{ClassLoader} instance
which is responsible for the specified class.
-@item @code{forName(String)} -- The VM should create a @code{Class} instance
-corresponding to the named class. As noted in @ref{VM Hooks}, the internal
-content of the instance is the responsibility of the VM.
+@item @code{forName(String, boolean, ClassLoader)} -- The VM should create a
+@code{Class} instance corresponding to the named class. As noted in
+@ref{VM Hooks}, the internal content of the instance is the
+responsibility of the VM. The supplied class loader is recorded as that
+which loaded the class, and the boolean specifies whether or not to
+run the class initializer.
@item @code{isArray(Class)} -- Another property test, corresponding to a
class file flag.
@item @code{initialize(Class)} -- The VM should initialize the class fully,
@@ -307,15 +311,44 @@ information stored in the class file.
an inner or member class, or @code{null} if the instance refers to a top-level
class.
@end itemize
+@item 1.5
+@itemize @bullet
+@item @code{isSynthetic(Class)} -- Returns true if the flags for this class
+mark it as synthetic.
+@item @code{isAnnotation(Class)} -- Returns true if the flags for this class
+mark it as an annotation.
+@item @code{isEnum(Class)} -- Returns true if the flags for this class
+mark it as an enumeration.
+@item @code{getSimpleName(Class)} -- Returns the simple name of the class.
+A default implementation is provided, but a more efficient version may instead
+be provided by the VM.
+@item @code{getCanonicalName(Class)} -- Returns the canonical name of the
+class. A default implementation is provided, but a more efficient
+version may instead be provided by the VM.
+@item @code{getEnclosingClass(Class)} -- Returns the immediately enclosing
+class (null for a top-level class).
+@item @code{getEnclosingConstructor(Class)} -- Returns the constructor
+which immediately encloses the supplied class.
+@item @code{getEnclosingMethod(Class)} -- Returns the method
+which immediately encloses the supplied class.
+@item @code{getClassSignature(Class)} -- Returns the generic signature of
+the class or null if there isn't one.
+@item @code{isAnonymousClass(Class)} -- Returns true if the class is an
+anonymous class.
+@item @code{isLocalClass(Class)} -- Returns true if the class is an
+local class.
+@item @code{isMemberClass(Class)} -- Returns true if the class is an
+member class.
+@end itemize
@end itemize
@node java.lang.VMObject, java.lang.VMClassLoader, java.lang.VMClass, java.lang
@subsection @code{java.lang.VMObject}
-@code{VMObject} is the bridge between the low level @code{Object} facilities
-such as making a clone, getting the class of the object and the wait/notify
-semantics. This is accomplished using the following @code{native}
-methods.
+@code{VMObject} is the bridge between the low level @code{Object}
+facilities such as making a clone, getting the class of the object and
+the wait/notify semantics. This is accomplished using the following
+@code{native} methods.
@itemize @bullet
@item @code{getClass(Object)} -- Returns the @code{Class} instance for the
@@ -413,13 +446,15 @@ and direct memory manipulation than would have been achieved by using Java.
@item @code{currentTimeMillis()} -- Gets the system time in milliseconds.
@item @code{getenv(String)} -- Returns the value of the specified environment
variable.
+@item @code{getenv()} -- Returns a list of `name=value' pairs which correspond
+to the environment variables.
@end itemize
@item Java Methods
@itemize @bullet
@item @code{makeStandardInputStream()} -- Helps provide the functionality of
-@code{System.in} by wrapping the appropriate file descriptor in a buffered
-file input stream. VMs may choose to create the stream from the descriptor
-differently rather than using this method.
+@code{System.in} by wrapping the appropriate file descriptor in a
+buffered file input stream. VMs may choose to create the stream from
+the descriptor differently rather than using this method.
@item @code{makeStandardOutputStream()} -- Helps provide the functionality of
@code{System.out} by wrapping the appropriate file descriptor in a buffered
file output stream. VMs may choose to create the stream from the descriptor
@@ -540,11 +575,14 @@ for all three by Classpath, making VM implementation optional. These use
the POSIX functions, @code{fork()}, @code{waitpid()} and @code{kill()}.
@itemize @bullet
-@item @code{nativeSpawn(String[],String[],File)} -- The VM should create a
-new process which uses the specified command-line arguments, environment
-variables and working directory. Unlike the other two methods, this
-method is linked to an instance, and must call @code{setProcessInfo()} with
-the results before returning.
+@item @code{nativeSpawn(String[],String[],File,boolean)} -- The VM should
+create a new process which uses the specified command-line arguments,
+environment variables and working directory. Unlike the other two
+methods, this method is linked to an instance, and must call
+@code{setProcessInfo()} with the results before returning. The
+boolean argument maps to the @code{redirectErrorStream} property of
+@code{java.lang.ProcessBuilder}. When true, the output and error streams
+are merged.
@item @code{nativeReap()} -- This is called to perform a reap of any
zombie processes, and should not block, instead returning a boolean as to
whether reaping actually took place.
@@ -609,7 +647,7 @@ A new mapping is created for each new string being @code{intern}ed.
A VM may implement this differently by implementing this method,
which is @code{static} and the only one in @code{VMString}.
-@node java.lang.VMThread,java.lang.VMInstrumentationImpl, java.lang.VMString, java.lang
+@node java.lang.VMThread, java.lang.VMMath, java.lang.VMString, java.lang
@subsection @code{java.lang.VMThread}
@code{VMThread} provides the link between Java's threads and the platform
@@ -685,49 +723,7 @@ having returned true, and is thus deprecated as a result.
@end itemize
@end itemize
-@node java.lang.VMInstrumentationImpl, java.lang.VMMath, java.lang.VMThread, java.lang
-@subsection @code{java.lang.VMInstrumentationImpl}
-
-The @code{java.lang.VMInstrumentationImpl} and
-@code{java.lang.InstrumentationImpl} classes provide an implementation of the
-@code{java.lang.instrument.Instrument} interface. This interface is for java
-1.5 and is only in the generics branch.
-A @code{InstrumentationImpl} object should be created by the VM when agents
-are given in the command line (see the @code{java.lang.instrument} package
-documentation). The VM has to set the static field
-@code{VMClassLoader.instrumenter} to this object. The VM should implement the
-static native methods of the @code{VMInstrumentationImpl} class.
-
-@itemize @bullet
-@item @code{isRedefineClassesSupported()} -- Returns true if the JVM supports
-class redefinition.
-@item @code{redefineClasses()} -- Gives a set of classes with new bytecodes.
-The VM must redefine the classes by reading the new bytecodes.
-@item @code{getAllLoadedClass()} -- Returns an array of all loaded classes.
-@item @code{getInitiatedClass()} -- Returns an array of all classes loaded
-by a specific class loader.
-@item @code{getObjectSize()} -- Gives the size of an object.
-@end itemize
-
-Instrumentation allows to modify the bytecode of a class before it gets read
-by the VM. In GNU Classpath, the @code{ClassLoader.defineClass} method calls
-the @code{VMClassLoader.defineClassWithTransformers} method which first checks
-if @code{VMClassLoader.instrumenter} is @code{null}. If it's the case, it
-directly calls @code{VMClassLoader.defineClass}. If it's not the case, the
-method calls at first the @code{InstrumentationImpl.callTransformers} method,
-which calls each transformer registered to the @code{InstrumentationImpl}
-object and returns a new bytecode array. Then, it calls the
-@code{VMClassLoader.defineClass} method with this new bytecode array.
-
-The second use of instrumentation is to redefine a class after it has been
-loaded by the VM. This is done in the Java application by calling the
-@code{Instrumentation.redefineClasses} method of the standard interface on
-a @code{Instrumentation} object. The @code{InstrumentationImpl.redefineClasses}
-method calls the @code{VMInstrumentationImpl.redefineClasses} native method
-which must be implemented by the VM. The implementation should call the
-@code{InstrumentationImpl.callTransformers} method.
-
-@node java.lang.VMMath, , java.lang.VMInstrumentationImpl, java.lang
+@node java.lang.VMMath,, java.lang.VMThread, java.lang
@subsection @code{java.lang.VMMath}
The @code{VMMath} class provides a series of native methods
@@ -786,6 +782,7 @@ includes the context of a class (the stack) and the system properties.
@menu
* gnu.classpath.VMStackWalker::
* gnu.classpath.VMSystemProperties::
+* gnu.classpath.Unsafe::
@end menu
@node gnu.classpath.VMStackWalker,gnu.classpath.VMSystemProperties,gnu.classpath,gnu.classpath
@@ -809,7 +806,7 @@ accessing @code{getCallingClass()}.
loader of the class.
@end itemize
-@node gnu.classpath.VMSystemProperties,,gnu.classpath.VMStackWalker,gnu.classpath
+@node gnu.classpath.VMSystemProperties,gnu.classpath.Unsafe,gnu.classpath.VMStackWalker,gnu.classpath
@subsection @code{gnu.classpath.VMSystemProperties}
@code{VMSystemProperties} allows the VM to hook into the property creation
@@ -834,6 +831,38 @@ Classpath properties have been added. The main purpose of this is to allow
the VM to alter the properties added by GNU Classpath to suit it.
@end itemize
+@node gnu.classpath.Unsafe,,gnu.classpath.VMSystemProperties,gnu.classpath
+@subsection @code{gnu.classpath.Unsafe}
+
+The @code{Unsafe} class provides access to some low-level unsafe operations
+as required by the addition of the java.util.concurrent classes. These
+focus on direct memory access to the fields within the VM and providing
+atomic update methods.
+
+@itemize @bullet
+@item @code{objectFieldOffset(Field)} -- Provides the caller with the memory
+offset of a particular field.
+@item @code{compareAndSwap*(Object,long,*,*)} -- One of these methods is
+provided for each of int, long and Object (hence the *s). The value of
+a field pointed to by the given Object and offset is compared with the
+first value and replaced with the second if they are the same. The reason
+for this method is to make this change operation atomic.
+@item @code{put/get*(Object,long,*)} -- These are like the last set of
+methods, handling integers, longs and Objects, but the field is always
+changed on a put. Different methods are provided for different semantics.
+Ordered variants perform a lazy put, in that the change does not
+immediately propogate to other threads, while the others provide
+volatile or 'normal' semantics.
+@item @code{arrayBaseOffset(Class)} and @code{arrayIndexScale(Class)} --
+These two methods allow an array class to be traversed by pointer
+arithmetic, by gaining the address of the first element and then
+scaling appropriately for the later ones.
+@item @code{park(boolean,long)} and @code{unpark(Thread)} -- These methods
+block and unblock threads respectively, with an optional timeout being
+provided for the blocking. @code{unpark} is unsafe as the thread may have
+been destroyed by native code.
+@end itemize
+
@node java.util, java.io, gnu.classpath, Classpath Hooks
@section java.util
@@ -970,14 +999,14 @@ is optional.
@section java.security
The @code{java.security} package provides support for Java's security
-architecture. At present, @code{VMAccessController} represents the sole
-VM hook for this.
+architecture.
@menu
* java.security.VMAccessController::
+* java.security.VMSecureRandom::
@end menu
-@node java.security.VMAccessController,,java.security,java.security
+@node java.security.VMAccessController,java.security.VMSecureRandom,java.security,java.security
@subsection @code{java.security.VMAccessController}
The @code{AccessController} is used to perform privileged actions. Its
@@ -1000,6 +1029,23 @@ arrays of classes and method names. The actual implementation returns
an empty array, indicating that there are no permissions.
@end itemize
+@node java.security.VMSecureRandom,,java.security.VMAccessController,java.security
+@subsection @code{java.security.VMSecureRandom}
+
+The @code{VMSecureRandom} class is used to provide access to
+cryptographically secure random numbers. The default implementation
+of the class runs eight threads that increment counters in a tight
+loop, and XORs each counter to produce one byte of seed data. This is
+not very efficient, and is not guaranteed to be random (the thread
+scheduler is probably deterministic, after all). VM implementors
+should provide a version of this class, which implements the method
+@code{generateSeed(byte[],int,int)}, so that it fills the buffer using
+a random seed from a system facility, such as a system entropy
+gathering device or hardware random number generator. The parameters
+are the usual set of buffer, offset and length and the method returns
+the number of bytes actually generated, which may be less than that
+requested.
+
@node java.net, java.nio, java.security, Classpath Hooks
@section java.net
@@ -1111,7 +1157,7 @@ in a @code{FileInputStream}.
in a @code{FileOutputStream}.
@end itemize
-@node gnu.java.nio, Classpath Callbacks, java.nio.channels, Classpath Hooks
+@node gnu.java.nio, java.lang.reflect, java.nio.channels, Classpath Hooks
@section gnu.java.nio
The @code{gnu.java.nio} class provides Classpath implementations of the
@@ -1142,7 +1188,77 @@ operation to be performed. This is represented by the @code{static}
@code{native} method, @code{select(int[],int[],int[],long)}, and a default
implementation of this is provided.
-@node Classpath Callbacks, , gnu.java.nio, Classpath Hooks
+@node java.lang.reflect, gnu.java.lang, gnu.java.nio, Classpath Hooks
+@section @code{java.lang.reflect}
+@code{java.lang.reflect} provides the interface to Java's reflection
+facilities. Via reflection, programmers can obtain type information about
+a particular instance at runtime or dynamically create new instances.
+
+@menu
+* java.lang.reflect.VMArray::
+@end menu
+
+@node java.lang.reflect.VMArray,,,java.lang.reflect
+@subsection @code{java.lang.reflect.VMArray}
+
+The @code{VMArray} class provides a hook, @code{createObjectArray},
+which the VM uses to generate a new non-primitive array of a
+particular class and size. The default implementation simply passes
+the job down to the standard JNI function, @code{NewObjectArray}.
+
+@node gnu.java.lang, Classpath Callbacks, java.lang.reflect, Classpath Hooks
+@section @code{gnu.java.lang}
+
+@code{gnu.java.lang} provides VM interfaces for the GNU
+implementations of features in java.lang. Currently, this includes the
+implementation of instrumentation.
+
+@menu
+* gnu.java.lang.VMInstrumentationImpl::
+@end menu
+
+@node gnu.java.lang.VMInstrumentationImpl,,,gnu.java.lang
+@subsection @code{gnu.java.lang.VMInstrumentationImpl}
+
+The @code{gnu.java.lang.VMInstrumentationImpl} and
+@code{gnu.java.lang.InstrumentationImpl} classes provide an implementation of the
+@code{java.lang.instrument.Instrument} interface.
+A @code{InstrumentationImpl} object should be created by the VM when agents
+are given in the command line (see the @code{java.lang.instrument} package
+documentation). The VM has to set the static field
+@code{VMClassLoader.instrumenter} to this object. The VM should implement the
+static native methods of the @code{VMInstrumentationImpl} class.
+
+@itemize @bullet
+@item @code{isRedefineClassesSupported()} -- Returns true if the JVM supports
+class redefinition.
+@item @code{redefineClasses()} -- Gives a set of classes with new bytecodes.
+The VM must redefine the classes by reading the new bytecodes.
+@item @code{getAllLoadedClass()} -- Returns an array of all loaded classes.
+@item @code{getInitiatedClass()} -- Returns an array of all classes loaded
+by a specific class loader.
+@item @code{getObjectSize()} -- Gives the size of an object.
+@end itemize
+
+Instrumentation allows to modify the bytecode of a class before it gets read
+by the VM. In GNU Classpath, the @code{ClassLoader.defineClass} method calls
+the @code{VMClassLoader.defineClassWithTransformers} method which first checks
+if @code{VMClassLoader.instrumenter} is @code{null}. If it's the case, it
+directly calls @code{VMClassLoader.defineClass}. If it's not the case, the
+method calls at first the @code{InstrumentationImpl.callTransformers} method,
+which calls each transformer registered to the @code{InstrumentationImpl}
+object and returns a new bytecode array. Then, it calls the
+@code{VMClassLoader.defineClass} method with this new bytecode array.
+
+The second use of instrumentation is to redefine a class after it has been
+loaded by the VM. This is done in the Java application by calling the
+@code{Instrumentation.redefineClasses} method of the standard interface on
+a @code{Instrumentation} object. The @code{InstrumentationImpl.redefineClasses}
+method calls the @code{VMInstrumentationImpl.redefineClasses} native method
+which must be implemented by the VM. The implementation should call the
+@code{InstrumentationImpl.callTransformers} method.
+
+@node Classpath Callbacks, , gnu.java.lang, Classpath Hooks
Some of the classes you implement for the VM will need to call back to
package-private methods in Classpath:
diff --git a/doc/www.gnu.org/include/layout.wml b/doc/www.gnu.org/include/layout.wml
index 485b98601..fda795098 100644
--- a/doc/www.gnu.org/include/layout.wml
+++ b/doc/www.gnu.org/include/layout.wml
@@ -128,6 +128,7 @@
<menutitle>External Tools</menutitle>
<menuitem><createlink name="External Packages" url="external.html#packages"></menuitem>
<menuitem><createlink name="ClasspathX" url="http://www.gnu.org/software/classpathx/"></menuitem>
+<menuitem><createlink name="Free Media Project" url="http://fmj.sourceforge.net/"></menuitem>
<menuitem><createlink name="Mauve" url="http://sources.redhat.com/mauve/"></menuitem>
<menuitem><createlink name="Jessie" url="http://www.nongnu.org/jessie/"></menuitem>
<menuitem><createlink name="Jalopy" url="external.html#jalopy"></menuitem>
diff --git a/doc/www.gnu.org/stories.wml b/doc/www.gnu.org/stories.wml
index c01ac1937..e13a95ee1 100644
--- a/doc/www.gnu.org/stories.wml
+++ b/doc/www.gnu.org/stories.wml
@@ -67,7 +67,7 @@ framework, compiles them with GCC, and loads them using a built-in
ELF object file loader.
</project>
-<project url="http://www.ibm.com/developerworks/oss/jikesrvm/" name="Jikes RVM">
+<project url="http://jikesrvm.sourceforge.net/" name="Jikes RVM">
Jikes RVM uses GNU Classpath for all of its libraries. Instructions for using
Classpath are provided in the Jikes RVM user's guide as of the Jikes RVM
release 2.2.1 (4/7/03). Nightly regression tests are run against the latest
@@ -185,9 +185,9 @@ analyze, and change the code for one's purposes.</p>
</entry>
<entry name="IBM's Jikes RVM">
-<createlink url="http://www-124.ibm.com/developerworks/oss/jikesrvm/" name="Jikes RVM"> (the Jikes Research Virtual Machine) provides the research community with a flexible open testbed to prototype virtual machine technologies and experiment with a large variety of design alternatives. The virtual machine infrastructure in the Jikes RVM release was independently developed as part of the Jalapeño research project at the IBM T.J. Watson Research Center.
+<createlink url="http://jikesrvm.sourceforge.net/" name="Jikes RVM"> (the Jikes Research Virtual Machine) provides the research community with a flexible open testbed to prototype virtual machine technologies and experiment with a large variety of design alternatives. The virtual machine infrastructure in the Jikes RVM release was independently developed as part of the Jalapeño research project at the IBM T.J. Watson Research Center.
-<p>[<createlink name="Publications" url="http://www-124.ibm.com/developerworks/oss/jikesrvm/info/papers.shtml">]
+<p>[<createlink name="Publications" url="http://jikesrvm.sourceforge.net/info/papers.shtml">]
</entry>
<entry name="SableVM">
diff --git a/examples/Makefile.am b/examples/Makefile.am
index bf427ee41..71909e8d6 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -1,17 +1,18 @@
## Input file for automake to generate the Makefile.in used by configure
+GLIBJ_CLASSPATH='$(top_builddir)/lib':'$(top_builddir)/lib/glibj.zip'
# Setup the compiler to use the GNU Classpath library we just build
if FOUND_GCJ
-JCOMPILER = $(GCJ) --bootclasspath '$(top_builddir)/lib' --classpath . -C
+JCOMPILER = $(GCJ) -encoding UTF-8 --bootclasspath $(GLIBJ_CLASSPATH) --classpath . -C
else
if FOUND_JIKES
-JCOMPILER = $(JIKES) -bootclasspath '' -extdirs '' -sourcepath '' --classpath $(top_builddir)/lib:.
+JCOMPILER = $(JIKES) $(JIKESENCODING) -bootclasspath '' -extdirs '' -sourcepath '' --classpath $(GLIBJ_CLASSPATH):.
else
if FOUND_GCJX
-JCOMPILER = $(GCJX) -bootclasspath '' -sourcepath '' -classpath $(top_builddir)/lib:.
+JCOMPILER = $(GCJX) -encoding UTF-8 -bootclasspath '' -sourcepath '' -classpath $(GLIBJ_CLASSPATH):.
else
if FOUND_ECJ
-JCOMPILER = $(ECJ) -bootclasspath '$(top_builddir)/lib' -classpath .
+JCOMPILER = $(ECJ) -encoding UTF-8 -bootclasspath $(GLIBJ_CLASSPATH) -classpath .
else
error dunno how to setup the JCOMPILER and compile
endif
diff --git a/examples/gnu/classpath/examples/swing/Demo.java b/examples/gnu/classpath/examples/swing/Demo.java
index 32bf30721..0f0b3555e 100644
--- a/examples/gnu/classpath/examples/swing/Demo.java
+++ b/examples/gnu/classpath/examples/swing/Demo.java
@@ -33,6 +33,7 @@ import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.metal.MetalTheme;
import javax.swing.plaf.metal.OceanTheme;
+import java.lang.reflect.Method;
import java.net.URL;
public class Demo
@@ -147,7 +148,15 @@ public class Demo
TabbedPaneDemo.createDemoFactory())));
examples.add(new JMenuItem(new PopupAction("Tree",
TreeDemo.createDemoFactory())));
+ examples.add(new JMenuItem(new PopupAction("Theme Editor",
+ MetalThemeEditor.createDemoFactory())));
+ examples.add(new JMenuItem(new PopupAction("DocumentFilter",
+ DocumentFilterDemo.createDemoFactory())));
+
+ examples.add(new JMenuItem(new PopupAction("NavigationFilter",
+ NavigationFilterDemo.createDemoFactory())));
+
final JMenuItem vmMenu;
help.add(new JMenuItem("just play with the widgets"));
@@ -164,7 +173,8 @@ public class Demo
+ " Version "
+ System.getProperty("java.vm.version")
+ " distributed by "
- + System.getProperty("java.vm.vendor");
+ + System.getProperty("java.vm.vendor")
+ + ".";
String gnuClasspath = System.getProperty("gnu.classpath.version");
if(gnuClasspath != null)
@@ -195,17 +205,39 @@ public class Demo
// Create themes menu.
themesMenu = new JMenu("Themes");
ButtonGroup themesGroup = new ButtonGroup();
- JRadioButtonMenuItem ocean =
- new JRadioButtonMenuItem(new ChangeThemeAction(new OceanTheme()));
- ocean.setSelected(MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme);
- themesMenu.add(ocean);
- themesGroup.add(ocean);
- JRadioButtonMenuItem steel =
- new JRadioButtonMenuItem(new ChangeThemeAction(new DefaultMetalTheme()));
- ocean.setSelected(MetalLookAndFeel.getCurrentTheme()
- instanceof DefaultMetalTheme);
- themesMenu.add(steel);
- themesGroup.add(steel);
+
+ // In order to make the demo runable on a 1.4 type VM we have to avoid calling
+ // MetalLookAndFeel.getCurrentTheme(). We simply check whether this method exists
+ // and is public.
+ Method m = null;
+ try
+ {
+ m = MetalLookAndFeel.class.getMethod("getCurrentTheme", null);
+ }
+ catch (NoSuchMethodException nsme)
+ {
+ // Ignore it.
+ }
+
+ if (m != null)
+ {
+ JRadioButtonMenuItem ocean =
+ new JRadioButtonMenuItem(new ChangeThemeAction(new OceanTheme()));
+ ocean.setSelected(MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme);
+ themesMenu.add(ocean);
+ themesGroup.add(ocean);
+
+ JRadioButtonMenuItem steel =
+ new JRadioButtonMenuItem(new ChangeThemeAction(new DefaultMetalTheme()));
+ ocean.setSelected(MetalLookAndFeel.getCurrentTheme()
+ instanceof DefaultMetalTheme);
+ themesMenu.add(steel);
+ themesGroup.add(steel);
+ }
+ else
+ {
+ themesMenu.setEnabled(false);
+ }
bar.add(file);
bar.add(edit);
@@ -332,7 +364,10 @@ public class Demo
JPanel main = new JPanel();
main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
desktop = createDesktop();
- main.add(desktop);
+
+ // Put the desktop in a scrollpane. The scrollbars may show then
+ // up when the them or LaF is changed.
+ main.add(new JScrollPane(desktop));
main.add(mkButtonBar());
component.add(main, BorderLayout.CENTER);
frame.pack();
@@ -507,8 +542,13 @@ public class Demo
TabbedPaneDemo.createDemoFactory())));
panel.add(new JButton(new PopupAction("Tree",
TreeDemo.createDemoFactory())));
+ panel.add(new JButton(new PopupAction("Theme Editor",
+ MetalThemeEditor.createDemoFactory())));
JButton exitDisposer = mkDisposerButton(frame);
panel.add(exitDisposer);
+
+ panel.setMaximumSize(new Dimension(Integer.MAX_VALUE,
+ panel.getPreferredSize().height));
exitDisposer.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
diff --git a/examples/gnu/classpath/examples/swing/DocumentFilterDemo.java b/examples/gnu/classpath/examples/swing/DocumentFilterDemo.java
new file mode 100644
index 000000000..28dce1c34
--- /dev/null
+++ b/examples/gnu/classpath/examples/swing/DocumentFilterDemo.java
@@ -0,0 +1,289 @@
+/* DpocumentFilterDemo.java -- An example for the DocumentFilter class.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath examples.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+*/
+
+
+package gnu.classpath.examples.swing;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.GridLayout;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.DocumentFilter;
+import javax.swing.text.TextAction;
+
+/**
+ * A demonstration of the <code>javax.swing.text.DocumentFilter</code> class.
+ *
+ * <p>Similar to a dialog in a popular programming IDE the user can insert
+ * a CVS URL into a textfield and the filter will split the components apart
+ * and will put them into the right textfields saving the user a lot of
+ * typing time.</p>
+ *
+ * @author Robert Schuster
+ */
+public class DocumentFilterDemo
+ extends JPanel
+ implements ActionListener
+{
+ JTextField target;
+
+ JTextField host;
+ JTextField repositoryPath;
+ JTextField user;
+ JTextField password;
+ JComboBox connectionType;
+
+ /**
+ * Creates a new demo instance.
+ */
+ public DocumentFilterDemo()
+ {
+ createContent();
+ // initFrameContent() is only called (from main) when running this app
+ // standalone
+ }
+
+ /**
+ * When the demo is run independently, the frame is displayed, so we should
+ * initialise the content panel (including the demo content and a close
+ * button). But when the demo is run as part of the Swing activity board,
+ * only the demo content panel is used, the frame itself is never displayed,
+ * so we can avoid this step.
+ */
+ void initFrameContent()
+ {
+ JPanel closePanel = new JPanel();
+ JButton closeButton = new JButton("Close");
+ closeButton.setActionCommand("CLOSE");
+ closeButton.addActionListener(this);
+ closePanel.add(closeButton);
+ add(closePanel, BorderLayout.SOUTH);
+ }
+
+ private void createContent()
+ {
+ setLayout(new BorderLayout());
+
+ JPanel panel = new JPanel(new GridLayout(7, 2));
+ panel.add(new JLabel("CVS URL:"));
+ panel.add(target = new JTextField(20));
+ target.setBackground(Color.RED);
+
+ panel.add(new JLabel("Host:"));
+ panel.add(host = new JTextField(20));
+
+ panel.add(new JLabel("Repository Path:"));
+ panel.add(repositoryPath = new JTextField(20));
+
+ panel.add(new JLabel("Username:"));
+ panel.add(user = new JTextField(20));
+
+ panel.add(new JLabel("Password:"));
+ panel.add(password = new JTextField(20));
+
+ panel.add(new JLabel("Connection Type:"));
+ panel.add(connectionType = new JComboBox());
+
+ JButton helpButton = new JButton("Help");
+ panel.add(helpButton);
+
+ helpButton.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent ae)
+ {
+ JOptionPane.showMessageDialog(DocumentFilterDemo.this,
+ "Paste a CVS URL into the red " +
+ "textfield.\nIf you do not want to " +
+ "look up a CVS URL yourself click " +
+ "on the 'provide me an example' " +
+ "button.\nThis will paste a proper " +
+ "string into your clipboard.");
+ }
+ });
+
+ JButton exampleButton = new JButton("Provide me an example!");
+ panel.add(exampleButton);
+ exampleButton.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent ae)
+ {
+ try
+ {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ Clipboard cb = tk.getSystemSelection();
+ StringSelection selection
+ = new StringSelection(":extssh:gnu@cvs.savannah.gnu.org:" +
+ "/cvs/example/project");
+
+ cb.setContents(selection, selection);
+
+ // Confirm success with a beep.
+ tk.beep();
+ }
+ catch (IllegalStateException ise)
+ {
+ JOptionPane.showMessageDialog(DocumentFilterDemo.this,
+ "Clipboard is currently" +
+ " unavailable.",
+ "Error",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ });
+
+ connectionType.addItem("pserver");
+ connectionType.addItem("ext");
+ connectionType.addItem("extssh");
+
+ add(panel);
+
+ AbstractDocument doc = (AbstractDocument) target.getDocument();
+ doc.setDocumentFilter(new CVSFilter());
+ }
+
+ public void actionPerformed(ActionEvent e)
+ {
+ if (e.getActionCommand().equals("CLOSE"))
+ System.exit(0);
+
+ }
+
+ public static void main(String[] args)
+ {
+ SwingUtilities.invokeLater
+ (new Runnable()
+ {
+ public void run()
+ {
+ DocumentFilterDemo app = new DocumentFilterDemo();
+ app.initFrameContent();
+ JFrame frame = new JFrame("DocumentFilterDemo");
+ frame.getContentPane().add(app);
+ frame.pack();
+ frame.setVisible(true);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ }
+ });
+ }
+
+ /**
+ * Returns a DemoFactory that creates a DocumentFilterDemo.
+ *
+ * @return a DemoFactory that creates a DocumentFilterDemo
+ */
+ public static DemoFactory createDemoFactory()
+ {
+ return new DemoFactory()
+ {
+ public JComponent createDemo()
+ {
+ return new DocumentFilterDemo();
+ }
+ };
+ }
+
+ class CVSFilter extends DocumentFilter
+ {
+ // example: pserver:anonymous@cvs.sourceforge.net:/cvsroot/fmj
+ String cvsPattern = ":?(pserver|ext|extssh):(\\w)+(:(\\w)+)?@(\\w|\\.)+:/(\\w|/)*";
+
+ public void insertString(DocumentFilter.FilterBypass fb,
+ int offset, String string,
+ AttributeSet attr)
+ throws BadLocationException
+ {
+ filterString(fb, offset, 0, string, attr, true);
+ }
+
+ public void replace(DocumentFilter.FilterBypass fb,
+ int offset, int length,
+ String string,
+ AttributeSet attr)
+ throws BadLocationException
+ {
+ filterString(fb, offset, length, string, attr, false);
+ }
+
+ public void filterString(DocumentFilter.FilterBypass fb,
+ int offset, int length, String string,
+ AttributeSet attr, boolean insertion)
+ throws BadLocationException
+ {
+ if(string.matches(cvsPattern))
+ {
+ // Split off the connection type part.
+ String[] result = string.split(":", 2);
+
+ // If the string contained a leading colon, result[0]
+ // will be empty at that point. We simply repeat the split
+ // operation on the remaining string and continue.
+ if(result[0].equals(""))
+ result = result[1].split(":", 2);
+
+ connectionType.setSelectedItem(result[0]);
+
+ // Split off the username and password part
+ result = result[1].split("@", 2);
+
+ // Break username and password in half
+ String[] userCredentials = result[0].split(":");
+ user.setText(userCredentials[0]);
+
+ // If the result has two entries the second one will
+ // be the password.
+ if (userCredentials.length == 2)
+ password.setText(userCredentials[1]);
+
+ // Now break the host part apart.
+ result = result[1].split(":");
+
+ host.setText(result[0]);
+
+ repositoryPath.setText(result[1]);
+ }
+
+ // The unmodified string is put into the document.
+ if (insertion)
+ fb.insertString(offset, string, attr);
+ else
+ fb.replace(offset, length, string, attr);
+ }
+
+ }
+
+}
diff --git a/examples/gnu/classpath/examples/swing/MetalThemeEditor.java b/examples/gnu/classpath/examples/swing/MetalThemeEditor.java
new file mode 100644
index 000000000..d3be0b85d
--- /dev/null
+++ b/examples/gnu/classpath/examples/swing/MetalThemeEditor.java
@@ -0,0 +1,585 @@
+/* MetalThemeEditor.java -- Edit themes using this application
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.examples.swing;
+
+import gnu.javax.swing.plaf.metal.CustomizableTheme;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JColorChooser;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+
+/**
+ * This application serves two purposes: 1. demonstrate the color chooser
+ * component, 2. make creating new Metal themes as easy as possible.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class MetalThemeEditor
+ extends JPanel
+{
+ /**
+ * An icon to display a chosen color in a button.
+ */
+ private class ColorIcon implements Icon
+ {
+ /**
+ * The color to be shown on the icon.
+ */
+ Color color;
+
+ /**
+ * Creates a new ColorIcon.
+ *
+ * @param c the color to be displayed
+ */
+ ColorIcon(Color c)
+ {
+ color = c;
+ }
+
+ /**
+ * Returns the icon height, which is 10.
+ *
+ * @return 10
+ */
+ public int getIconHeight()
+ {
+ return 10;
+ }
+
+ /**
+ * Returns the icon width, which is 30.
+ *
+ * @return 30
+ */
+ public int getIconWidth()
+ {
+ return 30;
+ }
+
+ /**
+ * Paints the icon.
+ *
+ * @param c the component to paint on
+ * @param g the graphics to use
+ * @param x the x location
+ * @param y the y location
+ */
+ public void paintIcon(Component c, Graphics g, int x, int y)
+ {
+ g.setColor(color);
+ g.fillRect(x, y, 30, 10);
+ }
+
+ }
+
+ /**
+ * Opens up a color chooser and lets the user select a color for the theme.
+ */
+ private class ChooseColorAction implements ActionListener
+ {
+
+ /**
+ * The button that will get updated when a new color is selected.
+ */
+ private JButton button;
+
+ /**
+ * Specifies which color of the theme should be updated. See constants in
+ * the MetalThemeEditor class.
+ */
+ private int colorType;
+
+ /**
+ * Creates a new ChooseColorAction. The specified button will have its
+ * icon updated to the new color if appropriate.
+ *
+ * @param b the button to update
+ * @param type the color type to update
+ */
+ ChooseColorAction(JButton b, int type)
+ {
+ button = b;
+ colorType = type;
+ }
+
+ /**
+ * Opens a color chooser and lets the user select a color.
+ */
+ public void actionPerformed(ActionEvent event)
+ {
+ Color c = JColorChooser.showDialog(button, "Choose a color",
+ getColor(colorType));
+ if (c != null)
+ {
+ setColor(colorType, c);
+ button.setIcon(new ColorIcon(c));
+ }
+ }
+ }
+
+ /**
+ * Denotes the primary1 color of the theme.
+ */
+ private static final int PRIMARY1 = 0;
+
+ /**
+ * Denotes the primary2 color of the theme.
+ */
+ private static final int PRIMARY2 = 1;
+
+ /**
+ * Denotes the primary3 color of the theme.
+ */
+ private static final int PRIMARY3 = 2;
+
+ /**
+ * Denotes the secondary1 color of the theme.
+ */
+ private static final int SECONDARY1 = 3;
+
+ /**
+ * Denotes the secondary2 color of the theme.
+ */
+ private static final int SECONDARY2 = 4;
+
+ /**
+ * Denotes the secondary3 color of the theme.
+ */
+ private static final int SECONDARY3 = 5;
+
+ /**
+ * The theme that is edited.
+ */
+ CustomizableTheme theme;
+
+ /**
+ * Creates a new instance of the MetalThemeEditor.
+ */
+ MetalThemeEditor()
+ {
+ theme = new CustomizableTheme();
+ setBorder(BorderFactory.createEmptyBorder(12, 12, 11, 11));
+ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+ add(createConfigurationPanel());
+ add(Box.createVerticalStrut(17));
+ add(createButtonPanel());
+ }
+
+ /**
+ * Creates the main panel of the MetalThemeEditor. This is the upper
+ * area where the colors can be selected.
+ *
+ * @return the main panel
+ */
+ private JPanel createConfigurationPanel()
+ {
+ JPanel p = new JPanel();
+ p.setLayout(new GridBagLayout());
+ GridBagConstraints c = new GridBagConstraints();
+ c.weightx = 1;
+ c.weighty = 0;
+ c.fill = GridBagConstraints.HORIZONTAL;
+ Insets labelInsets = new Insets(0, 0, 11, 6);
+ Insets buttonInsets = new Insets(0, 0, 11, 0);
+
+ // Primary 1
+ JLabel primary1Label = new JLabel("Primary 1:");
+ c.gridx = 0;
+ c.gridy = 0;
+ c.insets = labelInsets;
+ p.add(primary1Label, c);
+
+ Icon p1Icon = new ColorIcon(theme.getPrimary1());
+ JButton primary1Button = new JButton(p1Icon);
+ primary1Button.addActionListener(new ChooseColorAction(primary1Button,
+ PRIMARY1));
+ //c.weightx = 0;
+ c.gridx = 1;
+ c.insets = buttonInsets;
+ p.add(primary1Button, c);
+ primary1Label.setLabelFor(primary1Button);
+
+ // Primary 2
+ JLabel primary2Label = new JLabel("Primary 2:");
+ c.gridx = 0;
+ c.gridy = 1;
+ c.insets = labelInsets;
+ p.add(primary2Label, c);
+
+ Icon p2Icon = new ColorIcon(theme.getPrimary2());
+ JButton primary2Button = new JButton(p2Icon);
+ primary2Button.addActionListener(new ChooseColorAction(primary2Button,
+ PRIMARY2));
+ c.gridx = 1;
+ c.insets = buttonInsets;
+ p.add(primary2Button, c);
+ primary2Label.setLabelFor(primary2Button);
+
+ // Primary 3
+ JLabel primary3Label = new JLabel("Primary 3:");
+ c.gridx = 0;
+ c.gridy = 2;
+ c.insets = labelInsets;
+ p.add(primary3Label, c);
+
+ Icon p3Icon = new ColorIcon(theme.getPrimary3());
+ JButton primary3Button = new JButton(p3Icon);
+ primary3Button.addActionListener(new ChooseColorAction(primary3Button,
+ PRIMARY3));
+ c.gridx = 1;
+ c.insets = buttonInsets;
+ p.add(primary3Button, c);
+ primary3Label.setLabelFor(primary3Button);
+
+ // Secondary 1
+ JLabel secondary1Label = new JLabel("Secondary 1:");
+ c.gridx = 0;
+ c.gridy = 3;
+ c.insets = labelInsets;
+ p.add(secondary1Label, c);
+
+ Icon s1Icon = new ColorIcon(theme.getSecondary1());
+ JButton secondary1Button = new JButton(s1Icon);
+ secondary1Button.addActionListener(new ChooseColorAction(secondary1Button,
+ SECONDARY1));
+ c.gridx = 1;
+ c.insets = buttonInsets;
+ p.add(secondary1Button, c);
+ secondary1Label.setLabelFor(secondary1Button);
+
+ // Secondary 2
+ JLabel secondary2Label = new JLabel("Secondary 2:");
+ c.gridx = 0;
+ c.gridy = 4;
+ c.insets = labelInsets;
+ p.add(secondary2Label, c);
+
+ Icon s2Icon = new ColorIcon(theme.getSecondary2());
+ JButton secondary2Button = new JButton(s2Icon);
+ secondary2Button.addActionListener(new ChooseColorAction(secondary2Button,
+ SECONDARY2));
+ c.gridx = 1;
+ c.insets = buttonInsets;
+ p.add(secondary2Button, c);
+ secondary2Label.setLabelFor(secondary2Button);
+
+ // Secondary 3
+ JLabel secondary3Label = new JLabel("Secondary 3:");
+ c.gridx = 0;
+ c.gridy = 5;
+ c.insets = labelInsets;
+ p.add(secondary3Label, c);
+
+ Icon s3Icon = new ColorIcon(theme.getSecondary3());
+ JButton secondary3Button = new JButton(s3Icon);
+ secondary3Button.addActionListener(new ChooseColorAction(secondary3Button,
+ SECONDARY3));
+ c.gridx = 1;
+ c.insets = buttonInsets;
+ p.add(secondary3Button, c);
+ secondary3Label.setLabelFor(secondary3Button);
+
+ return p;
+ }
+
+ /**
+ * Creates the button panel at the bottom of the MetalThemeEditor.
+ *
+ * @return the button panel
+ */
+ private JPanel createButtonPanel()
+ {
+ JPanel p = new JPanel();
+ p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
+ p.add(Box.createHorizontalGlue());
+
+ JButton applyButton = new JButton("Apply");
+ applyButton.addActionListener
+ (new ActionListener()
+ {
+ public void actionPerformed(ActionEvent ev)
+ {
+ try
+ {
+ CustomizableTheme copy = (CustomizableTheme) theme.clone();
+ MetalLookAndFeel.setCurrentTheme(copy);
+ UIManager.setLookAndFeel(new MetalLookAndFeel());
+ Window w = SwingUtilities.getWindowAncestor(MetalThemeEditor.this);
+ SwingUtilities.updateComponentTreeUI(w);
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ });
+ p.add(applyButton);
+
+ p.add(Box.createHorizontalStrut(5));
+
+ JButton exportButton = new JButton("Export as Java File");
+ exportButton.addActionListener
+ (new ActionListener()
+ {
+ public void actionPerformed(ActionEvent ev)
+ {
+ export();
+ }
+ });
+ p.add(exportButton);
+
+ return p;
+ }
+
+ /**
+ * Exports the current theme as Java source file. This will prompt the user
+ * to choose a filename.
+ */
+ void export()
+ {
+ JFileChooser chooser = new JFileChooser();
+ int confirm = chooser.showSaveDialog(this);
+ if (confirm == JFileChooser.APPROVE_OPTION)
+ exportToFile(chooser.getSelectedFile());
+ }
+
+ /**
+ * Writes out the current configured Metal theme as Java source file.
+ *
+ * @param file the file to write into
+ */
+ void exportToFile(File file)
+ {
+ String fileName = file.getName();
+ if (! fileName.endsWith(".java"))
+ {
+ JOptionPane.showMessageDialog(this,
+ "Filename does not denote a Java source file",
+ "Invalid filename",
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ String className = fileName.substring(0, fileName.length() - 5);
+ Color p1 = theme.getPrimary1();
+ Color p2 = theme.getPrimary2();
+ Color p3 = theme.getPrimary3();
+ Color s1 = theme.getSecondary1();
+ Color s2 = theme.getSecondary2();
+ Color s3 = theme.getSecondary3();
+
+ try
+ {
+ FileOutputStream out = new FileOutputStream(file);
+ Writer writer = new OutputStreamWriter(out);
+ writer.write("import javax.swing.plaf.ColorUIResource;\n");
+ writer.write("import javax.swing.plaf.metal.DefaultMetalTheme;\n");
+ writer.write("public class " + className + " extends DefaultMetalTheme\n");
+ writer.write("{\n");
+ writer.write(" protected ColorUIResource getPrimary1()\n");
+ writer.write(" {\n");
+ writer.write(" return new ColorUIResource(" + p1.getRGB() + ");\n");
+ writer.write(" }\n");
+ writer.write(" protected ColorUIResource getPrimary2()\n");
+ writer.write(" {\n");
+ writer.write(" return new ColorUIResource(" + p2.getRGB() + ");\n");
+ writer.write(" }\n");
+ writer.write(" protected ColorUIResource getPrimary3()\n");
+ writer.write(" {\n");
+ writer.write(" return new ColorUIResource(" + p3.getRGB() + ");\n");
+ writer.write(" }\n");
+ writer.write(" protected ColorUIResource getSecondary1()\n");
+ writer.write(" {\n");
+ writer.write(" return new ColorUIResource(" + s1.getRGB() + ");\n");
+ writer.write(" }\n");
+ writer.write(" protected ColorUIResource getSecondary2()\n");
+ writer.write(" {\n");
+ writer.write(" return new ColorUIResource(" + s2.getRGB() + ");\n");
+ writer.write(" }\n");
+ writer.write(" protected ColorUIResource getSecondary3()\n");
+ writer.write(" {\n");
+ writer.write(" return new ColorUIResource(" + s3.getRGB() + ");\n");
+ writer.write(" }\n");
+ writer.write("}\n");
+ writer.close();
+ out.close();
+ }
+ catch (FileNotFoundException ex)
+ {
+ ex.printStackTrace();
+ }
+ catch (IOException ex)
+ {
+ ex.printStackTrace();
+ }
+
+ }
+
+ /**
+ * Returns the color of the theme with the specified type. For the possible
+ * types see the constants of this class.
+ *
+ * @param colorType the color type to fetch from the theme
+ *
+ * @return the current color of the specified type
+ *
+ * @throws IllegalArgumentException for illegal color types
+ */
+ Color getColor(int colorType)
+ {
+ Color color = null;
+ switch (colorType)
+ {
+ case PRIMARY1:
+ color = theme.getPrimary1();
+ break;
+ case PRIMARY2:
+ color = theme.getPrimary2();
+ break;
+ case PRIMARY3:
+ color = theme.getPrimary3();
+ break;
+ case SECONDARY1:
+ color = theme.getSecondary1();
+ break;
+ case SECONDARY2:
+ color = theme.getSecondary2();
+ break;
+ case SECONDARY3:
+ color = theme.getSecondary3();
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown color type: " + colorType);
+ }
+ return color;
+ }
+
+ /**
+ * Sets the color of the specified type in the current theme.
+ *
+ * @param colorType the color type
+ * @param color the color to set
+ *
+ * @throws IllegalArgumentException for illegal color types
+ */
+ void setColor(int colorType, Color color)
+ {
+ switch (colorType)
+ {
+ case PRIMARY1:
+ theme.setPrimary1(color);
+ break;
+ case PRIMARY2:
+ theme.setPrimary2(color);
+ break;
+ case PRIMARY3:
+ theme.setPrimary3(color);
+ break;
+ case SECONDARY1:
+ theme.setSecondary1(color);
+ break;
+ case SECONDARY2:
+ theme.setSecondary2(color);
+ break;
+ case SECONDARY3:
+ theme.setSecondary3(color);
+ break;
+ default:
+ throw new IllegalArgumentException("Illegal color type: " + colorType);
+ }
+ }
+
+ /**
+ * The entry point to the application.
+ *
+ * @param args ignored
+ */
+ public static void main(String[] args)
+ {
+ JFrame f = new JFrame("MetalThemeEditor");
+ f.setContentPane(new MetalThemeEditor());
+ f.pack();
+ f.setVisible(true);
+ }
+
+ /**
+ * Returns a DemoFactory that creates a MetalThemeEditor.
+ *
+ * @return a DemoFactory that creates a MetalThemeEditor
+ */
+ public static DemoFactory createDemoFactory()
+ {
+ return new DemoFactory()
+ {
+ public JComponent createDemo()
+ {
+ return new MetalThemeEditor();
+ }
+ };
+ }
+}
diff --git a/examples/gnu/classpath/examples/swing/NavigationFilterDemo.java b/examples/gnu/classpath/examples/swing/NavigationFilterDemo.java
new file mode 100644
index 000000000..6c1be74cc
--- /dev/null
+++ b/examples/gnu/classpath/examples/swing/NavigationFilterDemo.java
@@ -0,0 +1,206 @@
+/* NavigationFilterDemo.java -- An example for the NavigationFilter class.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath examples.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+*/
+
+
+package gnu.classpath.examples.swing;
+
+import java.awt.BorderLayout;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.NavigationFilter;
+import javax.swing.text.Position;
+import javax.swing.text.Utilities;
+
+/**
+ * A demonstration of the <code>javax.swing.text.NavigationFilter</code> class.
+ *
+ * <p>It shows a NavigationFilter which lets you walk word-wise
+ * through a text.</p>
+ *
+ * @author Robert Schuster
+ */
+public class NavigationFilterDemo
+ extends JPanel
+ implements ActionListener
+{
+
+ JTextArea textArea;
+
+ /**
+ * Creates a new demo instance.
+ */
+ public NavigationFilterDemo()
+ {
+ createContent();
+ // initFrameContent() is only called (from main) when running this app
+ // standalone
+ }
+
+ /**
+ * When the demo is run independently, the frame is displayed, so we should
+ * initialise the content panel (including the demo content and a close
+ * button). But when the demo is run as part of the Swing activity board,
+ * only the demo content panel is used, the frame itself is never displayed,
+ * so we can avoid this step.
+ */
+ void initFrameContent()
+ {
+ JPanel closePanel = new JPanel();
+ JButton closeButton = new JButton("Close");
+ closeButton.setActionCommand("CLOSE");
+ closeButton.addActionListener(this);
+ closePanel.add(closeButton);
+ add(closePanel, BorderLayout.SOUTH);
+ }
+
+ private void createContent()
+ {
+ setLayout(new BorderLayout());
+
+ add(textArea = new JTextArea(10, 20));
+
+ textArea.setWrapStyleWord(true);
+
+ textArea.setLineWrap(true);
+
+ textArea.setNavigationFilter(new WordFilter());
+
+ textArea.setText("GNU Classpath, Essential Libraries for Java, " +
+ "is a GNU project to create free core class " +
+ "libraries for use with virtual machines and " +
+ "compilers for the java programming language.");
+ }
+
+ public void actionPerformed(ActionEvent e)
+ {
+ if (e.getActionCommand().equals("CLOSE"))
+ System.exit(0);
+
+ }
+
+ public static void main(String[] args)
+ {
+ SwingUtilities.invokeLater
+ (new Runnable()
+ {
+ public void run()
+ {
+ NavigationFilterDemo app = new NavigationFilterDemo();
+ app.initFrameContent();
+ JFrame frame = new JFrame("NavigationFilterDemo");
+ frame.getContentPane().add(app);
+ frame.pack();
+ frame.setVisible(true);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ }
+ });
+ }
+
+ /**
+ * Returns a DemoFactory that creates a NavigationFilterDemo.
+ *
+ * @return a DemoFactory that creates a NavigationFilterDemo
+ */
+ public static DemoFactory createDemoFactory()
+ {
+ return new DemoFactory()
+ {
+ public JComponent createDemo()
+ {
+ return new NavigationFilterDemo();
+ }
+ };
+ }
+
+ class WordFilter extends NavigationFilter
+ {
+ public int getNextVisualPositionFrom(JTextComponent text,
+ int pos,
+ Position.Bias bias,
+ int direction,
+ Position.Bias[] biasRet)
+ throws BadLocationException
+ {
+ Point pt;
+
+ int newpos = pos;
+ switch (direction)
+ {
+ case SwingConstants.NORTH:
+ // Find out where the caret want to be positioned ideally.
+ pt = text.getCaret().getMagicCaretPosition();
+
+ // Calculate its position above.
+ newpos = Utilities.getPositionAbove(text, pos, pt.x);
+
+ // If we have a valid position, then calculate the next word start
+ // from there.
+ if (newpos != -1)
+ return Utilities.getWordStart(text, newpos);
+ else
+ return pos;
+ case SwingConstants.SOUTH:
+ // Find out where the caret want to be positioned ideally.
+ pt = text.getCaret().getMagicCaretPosition();
+
+ // Calculate its position below.
+ newpos = Utilities.getPositionBelow(text, pos, pt.x);
+
+ // If we have a valid position, then calculate the next word start
+ // from there.
+ if (newpos != -1)
+ return Utilities.getWordStart(text, newpos);
+ else
+ return pos;
+ case SwingConstants.WEST:
+ // Calculate the next word start.
+ newpos = Utilities.getWordStart(text, newpos);;
+
+ // If that means that the caret will not move, return
+ // the start of the previous word.
+ if (newpos != pos)
+ return newpos;
+ else
+ return Utilities.getPreviousWord(text, newpos);
+ case SwingConstants.EAST:
+ // Simply calculate the next word's start offset.
+ return Utilities.getNextWord(text, newpos);
+ default:
+ // Do whatever the super implementation did.
+ return super.getNextVisualPositionFrom(text, pos, bias,
+ direction, biasRet);
+ }
+ }
+
+ }
+
+}
diff --git a/examples/gnu/classpath/examples/swing/TableDemo.java b/examples/gnu/classpath/examples/swing/TableDemo.java
index cd445cf63..e661ee3ad 100644
--- a/examples/gnu/classpath/examples/swing/TableDemo.java
+++ b/examples/gnu/classpath/examples/swing/TableDemo.java
@@ -41,12 +41,14 @@ package gnu.classpath.examples.swing;
import java.awt.BorderLayout;
import java.awt.Dimension;
+import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
+import javax.swing.plaf.metal.MetalIconFactory;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
@@ -76,11 +78,12 @@ public class TableDemo extends JPanel
{
/**
- * Return true if the cell is editable. All cells are editable.
+ * Return true if the cell is editable.
+ * Icons are not editable, other cells are editable.
*/
- public boolean isCellEditable(int parm1, int parm2)
+ public boolean isCellEditable(int row, int column)
{
- return true;
+ return column!=1;
}
/**
@@ -126,12 +129,15 @@ public class TableDemo extends JPanel
}
/**
- * The first column contains booleans, others - default class.
+ * The first column contains booleans, the second - icons,
+ * others - default class.
*/
public Class getColumnClass(int column)
{
if (column == 0)
return Boolean.class;
+ else if (column == 1)
+ return Icon.class;
else
return super.getColumnClass(column);
}
@@ -171,14 +177,24 @@ public class TableDemo extends JPanel
{
setLayout(new BorderLayout());
values = new Object[rows][];
+
+ // The icons that appear in the icon column.
+ Icon[] icons = new Icon[]
+ {
+ MetalIconFactory.getTreeComputerIcon(),
+ MetalIconFactory.getTreeHardDriveIcon(),
+ MetalIconFactory.getTreeFolderIcon(),
+ };
+
for (int i = 0; i < values.length; i++)
{
values[i] = new Object[cols];
- for (int j = 1; j < cols; j++)
+ for (int j = 2; j < cols; j++)
{
values[i][j] = "" + ((char) ('a' + j)) + i;
}
values [i][0] = i % 2 == 0? Boolean.TRUE : Boolean.FALSE;
+ values [i][1] = icons [ i % icons.length ];
}
table.setModel(model);
@@ -190,7 +206,7 @@ public class TableDemo extends JPanel
TableColumn column = new TableColumn(i);
// Showing the variable width columns.
- int width = 100+20*i;
+ int width = 100+10*i;
column.setPreferredWidth(width);
// If we do not set the header value here, the value, returned
diff --git a/examples/gnu/classpath/examples/swing/TextAreaDemo.java b/examples/gnu/classpath/examples/swing/TextAreaDemo.java
index 6efad8477..b72997cb3 100644
--- a/examples/gnu/classpath/examples/swing/TextAreaDemo.java
+++ b/examples/gnu/classpath/examples/swing/TextAreaDemo.java
@@ -1,5 +1,5 @@
/* TextAreaDemo.java -- An example showing various textareas in Swing.
- Copyright (C) 2005, 2006, Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath examples.
@@ -426,7 +426,7 @@ public class TextAreaDemo
innerPanel.add(new JScrollPane(textarea10));
textarea11 = new JTextArea("custom background", 10, 15);
- textarea11.setForeground(Color.YELLOW);
+ textarea11.setBackground(Color.YELLOW);
innerPanel.add(new JScrollPane(textarea11));
textarea12 = new JTextArea("custom disabled textcolor", 10, 15);
@@ -438,7 +438,7 @@ public class TextAreaDemo
innerPanel.add(new JScrollPane(textarea13));
textarea14 = new JTextArea("custom selection color", 10, 15);
- textarea14.setSelectionColor(Color.CYAN);
+ textarea14.setSelectionColor(Color.RED);
innerPanel.add(new JScrollPane(textarea14));
textarea14b = new JTextArea("custom selection and selected text color", 10, 15);
diff --git a/examples/gnu/classpath/examples/swing/TextFieldDemo.java b/examples/gnu/classpath/examples/swing/TextFieldDemo.java
index 6e5239fc8..ba0fefa31 100644
--- a/examples/gnu/classpath/examples/swing/TextFieldDemo.java
+++ b/examples/gnu/classpath/examples/swing/TextFieldDemo.java
@@ -1,5 +1,5 @@
/* TextFieldDemo.java -- An example showing various textfields in Swing.
- Copyright (C) 2005, 2006, Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath examples.
@@ -27,7 +27,9 @@ import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
+import java.awt.Point;
import java.awt.Rectangle;
+import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -39,11 +41,19 @@ import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
+import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
+import javax.swing.border.CompoundBorder;
+import javax.swing.border.EmptyBorder;
+import javax.swing.border.LineBorder;
+import javax.swing.border.TitledBorder;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultCaret;
+import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;
+import javax.swing.text.View;
+import javax.swing.text.LayeredHighlighter.LayerPainter;
/**
* A simple textfield demo showing various textfields in different states.
@@ -108,52 +118,88 @@ public class TextFieldDemo
}
}
}
+
+ static class DemoHighlightPainter
+ extends LayerPainter
+ {
+
+ static DemoHighlightPainter INSTANCE = new DemoHighlightPainter();
+
+
+ static Color[] colors = { Color.BLUE, Color.CYAN, Color.GRAY, Color.GREEN,
+ Color.MAGENTA, Color.ORANGE, Color.PINK,
+ Color.ORANGE, Color.RED, Color.BLUE, Color.YELLOW };
+
+
+ public DemoHighlightPainter()
+ {
+ super();
+ }
+
+ private void paintHighlight(Graphics g, Rectangle rect)
+ {
+ g.fillRect(rect.x, rect.y, rect.width, rect.height);
+ }
+
+ public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent t)
+ {
+ try
+ {
+
+ for (int i = p0; i < p1; i++)
+ {
+ Rectangle r = t.modelToView(i);
+ Point l1 = t.modelToView(i + 1).getLocation();
+
+ g.setColor(colors[(int) (Math.random() * colors.length)]);
+ g.fillOval(r.x, r.y, l1.x - r.x, r.height);
+ }
+ }
+ catch (BadLocationException ble)
+ {
+ }
+ }
+
+ public Shape paintLayer(Graphics g, int p0, int p1, Shape bounds,
+ JTextComponent c, View view)
+ {
+ paint(g, p0, p1, bounds, c);
+
+ return bounds;
+ }
+
+ }
/**
* The left aligned textfields and state buttons.
*/
- JTextField textfield1;
- JTextField textfield2;
- JTextField textfield3;
- JCheckBox enabled1;
- JCheckBox editable1;
- JPanel textFieldPanel1;
+ Compound compound1;
+
/**
* The right aligned textfields and state buttons.
*/
- JTextField textfield4;
- JTextField textfield5;
- JTextField textfield6;
- JCheckBox enabled2;
- JCheckBox editable2;
+ Compound compound2;
/**
* The centered textfields and state buttons.
*/
- JTextField textfield7;
- JTextField textfield8;
- JTextField textfield9;
- JCheckBox enabled3;
- JCheckBox editable3;
+ Compound compound3;
/**
* The custom colored textfields and state buttons.
*/
- JTextField textfield10;
- JTextField textfield11;
- JTextField textfield12;
- JTextField textfield13;
- JTextField textfield14;
- JCheckBox enabled4;
- JCheckBox editable4;
+ Compound compound4;
+ Compound compound5;
/**
- * Some miscallenous textfield demos.
+ * Some miscellaneous textfield demos.
*/
- JTextField textfield15;
- JTextField textfield16;
- JCheckBox enabled5;
- JCheckBox editable5;
+ Compound compound6;
+
+ /**
+ * Some textfields with custom borders.
+ */
+ Compound compound7;
/**
* Creates a new demo instance.
@@ -191,231 +237,182 @@ public class TextFieldDemo
private void createContent()
{
setLayout(new BorderLayout());
- JPanel panel = new JPanel(new GridLayout(5, 1));
+ JPanel panel = new JPanel(new GridLayout(7, 1));
panel.add(createLeftAlignedPanel());
panel.add(createRightAlignedPanel());
panel.add(createCenteredPanel());
- panel.add(createCustomColoredPanel());
+ panel.add(createCustomColorPanel1());
+ panel.add(createCustomColorPanel2());
+ panel.add(createCustomBordersPanel());
panel.add(createMiscPanel());
- add(panel);
+
+ // Put everything in a scroll pane to make it neccessary
+ // to reach the bottom inner panels if the screen is to small.
+ add(new JScrollPane(panel));
}
private JPanel createLeftAlignedPanel()
{
- JPanel panel = new JPanel(new BorderLayout());
- panel.setBorder(BorderFactory.createTitledBorder("Left aligned"));
+ compound1 = createTextFieldCompound("Left aligned", 1);
+
+ compound1.setupTextfields("Hello World!",
+ JTextField.LEFT,
+ new Font[] { new Font("Dialog", Font.PLAIN, 8),
+ new Font("Dialog", Font.ITALIC, 12),
+ new Font("Dialog", Font.BOLD, 14)
+ });
- textFieldPanel1 = new JPanel();
- textFieldPanel1.setLayout(new BoxLayout(textFieldPanel1, BoxLayout.X_AXIS));
-
- textfield1 = new JTextField("Hello World!");
- textfield1.setHorizontalAlignment(JTextField.LEFT);
- textfield1.setFont(new Font("Dialog", Font.PLAIN, 8));
- textFieldPanel1.add(textfield1);
-
- textfield2 = new JTextField("Hello World!");
- textfield2.setHorizontalAlignment(JTextField.LEFT);
- textfield2.setFont(new Font("Dialog", Font.ITALIC, 12));
- textFieldPanel1.add(textfield2);
-
- textfield3 = new JTextField("Hello World!");
- textfield3.setHorizontalAlignment(JTextField.LEFT);
- textfield3.setFont(new Font("Dialog", Font.BOLD, 14));
- textFieldPanel1.add(textfield3);
+ return compound1.panel;
+ }
+
+ private Compound createTextFieldCompound(String title, int actionCommandNo)
+ {
+ Compound compound = new Compound();
+ compound.panel = new JPanel(new BorderLayout());
+ compound.panel.setBorder(BorderFactory.createTitledBorder(title));
+
+ compound.textFieldPanel = new JPanel();
+ compound.textFieldPanel.setLayout(new BoxLayout(compound.textFieldPanel, BoxLayout.X_AXIS));
- panel.add(textFieldPanel1);
+ compound.panel.add(compound.textFieldPanel);
JPanel statePanel = new JPanel();
statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
statePanel.add(Box.createVerticalGlue());
- enabled1 = new JCheckBox("enabled");
- enabled1.setSelected(true);
- enabled1.addActionListener(this);
- enabled1.setActionCommand("ENABLED1");
- statePanel.add(enabled1);
- editable1 = new JCheckBox("editable");
- editable1.setSelected(true);
- editable1.addActionListener(this);
- editable1.setActionCommand("EDITABLE1");
- statePanel.add(editable1);
+ compound.enabled = new JCheckBox("enabled");
+ compound.enabled.setSelected(true);
+ compound.enabled.addActionListener(this);
+ compound.enabled.setActionCommand("ENABLED" + actionCommandNo);
+ statePanel.add(compound.enabled);
+ compound.editable = new JCheckBox("editable");
+ compound.editable.setSelected(true);
+ compound.editable.addActionListener(this);
+ compound.editable.setActionCommand("EDITABLE" + actionCommandNo);
+ statePanel.add(compound.editable);
statePanel.add(Box.createVerticalGlue());
- panel.add(statePanel, BorderLayout.EAST);
+ compound.panel.add(statePanel, BorderLayout.EAST);
- return panel;
+ return compound;
}
private JPanel createRightAlignedPanel()
{
- JPanel panel = new JPanel(new BorderLayout());
- panel.setBorder(BorderFactory.createTitledBorder("Right aligned"));
+ compound2 = createTextFieldCompound("Right aligned", 2);
+
+ compound2.setupTextfields("Hello World!",
+ JTextField.RIGHT,
+ new Font[] { new Font("Dialog", Font.PLAIN, 8),
+ new Font("Dialog", Font.ITALIC, 12),
+ new Font("Dialog", Font.BOLD, 14)
+ });
- JPanel textFieldPanel = new JPanel();
- textFieldPanel.setLayout(new BoxLayout(textFieldPanel, BoxLayout.X_AXIS));
-
- textfield4 = new JTextField("Hello World!");
- textfield4.setHorizontalAlignment(JTextField.RIGHT);
- textfield4.setFont(new Font("Dialog", Font.PLAIN, 8));
- textFieldPanel.add(textfield4);
-
- textfield5 = new JTextField("Hello World!");
- textfield5.setHorizontalAlignment(JTextField.RIGHT);
- textfield5.setFont(new Font("Dialog", Font.ITALIC, 12));
- textFieldPanel.add(textfield5);
-
- textfield6 = new JTextField("Hello World!");
- textfield6.setHorizontalAlignment(JTextField.RIGHT);
- textfield6.setFont(new Font("Dialog", Font.BOLD, 14));
- textFieldPanel.add(textfield6);
-
- panel.add(textFieldPanel);
-
- JPanel statePanel = new JPanel();
- statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
- statePanel.add(Box.createVerticalGlue());
- enabled2 = new JCheckBox("enabled");
- enabled2.setSelected(true);
- enabled2.addActionListener(this);
- enabled2.setActionCommand("ENABLED2");
- statePanel.add(enabled2);
- editable2 = new JCheckBox("editable");
- editable2.setSelected(true);
- editable2.addActionListener(this);
- editable2.setActionCommand("EDITABLE2");
- statePanel.add(editable2);
- statePanel.add(Box.createVerticalGlue());
- panel.add(statePanel, BorderLayout.EAST);
-
- return panel;
+ return compound2.panel;
}
private JPanel createCenteredPanel()
{
- JPanel panel = new JPanel(new BorderLayout());
- panel.setBorder(BorderFactory.createTitledBorder("Centered"));
-
- JPanel textFieldPanel = new JPanel();
- textFieldPanel.setLayout(new BoxLayout(textFieldPanel, BoxLayout.X_AXIS));
-
- textfield7 = new JTextField("Hello World!");
- textfield7.setHorizontalAlignment(JTextField.CENTER);
- textfield7.setFont(new Font("Dialog", Font.PLAIN, 8));
- textFieldPanel.add(textfield7);
-
- textfield8 = new JTextField("Hello World!");
- textfield8.setHorizontalAlignment(JTextField.CENTER);
- textfield8.setFont(new Font("Dialog", Font.ITALIC, 12));
- textFieldPanel.add(textfield8);
-
- textfield9 = new JTextField("Hello World!");
- textfield9.setHorizontalAlignment(JTextField.CENTER);
- textfield9.setFont(new Font("Dialog", Font.BOLD, 14));
- textFieldPanel.add(textfield9);
-
- panel.add(textFieldPanel);
-
- JPanel statePanel = new JPanel();
- statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
- statePanel.add(Box.createVerticalGlue());
- enabled3 = new JCheckBox("enabled");
- enabled3.setSelected(true);
- enabled3.addActionListener(this);
- enabled3.setActionCommand("ENABLED3");
- statePanel.add(enabled3);
- editable3 = new JCheckBox("editable");
- editable3.setSelected(true);
- editable3.addActionListener(this);
- editable3.setActionCommand("EDITABLE3");
- statePanel.add(editable3);
- statePanel.add(Box.createVerticalGlue());
- panel.add(statePanel, BorderLayout.EAST);
-
- return panel;
+ compound3 = createTextFieldCompound("Centered", 3);
+
+ compound3.setupTextfields("Hello World!",
+ JTextField.CENTER,
+ new Font[] { new Font("Dialog", Font.PLAIN, 8),
+ new Font("Dialog", Font.ITALIC, 12),
+ new Font("Dialog", Font.BOLD, 14)
+ });
+
+ return compound3.panel;
}
- private JPanel createCustomColoredPanel()
+ private JPanel createCustomColorPanel1()
{
- JPanel panel = new JPanel(new BorderLayout());
-
- JPanel textFieldPanel = new JPanel();
- panel.setBorder(BorderFactory.createTitledBorder("Custom colors"));
- textFieldPanel.setLayout(new BoxLayout(textFieldPanel, BoxLayout.X_AXIS));
-
- textfield10 = new JTextField("custom foreground");
- textfield10.setForeground(Color.GREEN);
- textFieldPanel.add(textfield10);
+ compound4 = createTextFieldCompound("Custom colors I", 4);
- textfield11 = new JTextField("custom background");
- textfield11.setForeground(Color.YELLOW);
- textFieldPanel.add(textfield11);
+ compound4.textfield1 = new JTextField("custom foreground");
+ compound4.textfield1.setForeground(Color.RED);
+ compound4.textFieldPanel.add(compound4.textfield1);
- textfield12 = new JTextField("custom disabled textcolor");
- textfield12.setDisabledTextColor(Color.BLUE);
- textFieldPanel.add(textfield12);
+ compound4.textfield2 = new JTextField("custom background");
+ compound4.textfield2.setBackground(Color.YELLOW);
+ compound4.textFieldPanel.add(compound4.textfield2);
- textfield13 = new JTextField("custom selected text color");
- textfield13.setSelectedTextColor(Color.RED);
- textFieldPanel.add(textfield13);
-
- textfield14 = new JTextField("custom selection color");
- textfield14.setSelectionColor(Color.CYAN);
- textFieldPanel.add(textfield14);
+ compound4.textfield3 = new JTextField("custom foreground and background");
+ compound4.textfield3.setForeground(Color.RED);
+ compound4.textfield3.setBackground(Color.YELLOW);
+ compound4.textFieldPanel.add(compound4.textfield3);
+
+ return compound4.panel;
+
+ }
+
+ private JPanel createCustomColorPanel2()
+ {
+ compound5 = createTextFieldCompound("Custom colors II", 5);
- panel.add(textFieldPanel);
+ compound5.textfield1 = new JTextField("custom disabled textcolor");
+ compound5.textfield1.setDisabledTextColor(Color.BLUE);
+ compound5.textFieldPanel.add(compound5.textfield1);
- JPanel statePanel = new JPanel();
- statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
- statePanel.add(Box.createVerticalGlue());
- enabled4 = new JCheckBox("enabled");
- enabled4.setSelected(true);
- enabled4.addActionListener(this);
- enabled4.setActionCommand("ENABLED4");
- statePanel.add(enabled4);
- editable4 = new JCheckBox("editable");
- editable4.setSelected(true);
- editable4.addActionListener(this);
- editable4.setActionCommand("EDITABLE4");
- statePanel.add(editable4);
- statePanel.add(Box.createVerticalGlue());
- panel.add(statePanel, BorderLayout.EAST);
+ compound5.textfield2 = new JTextField("custom selected text color");
+ compound5.textfield2.setSelectedTextColor(Color.RED);
+ compound5.textFieldPanel.add(compound5.textfield2);
- return panel;
+ compound5.textfield3 = new JTextField("custom selection color");
+ compound5.textfield3.setSelectionColor(Color.BLACK);
+ compound5.textFieldPanel.add(compound5.textfield3);
+
+ return compound5.panel;
+
}
private JPanel createMiscPanel()
{
- JPanel panel = new JPanel(new BorderLayout());
- panel.setBorder(BorderFactory.createTitledBorder("Miscallenous"));
-
- JPanel textFieldPanel = new JPanel();
- textFieldPanel.setLayout(new BoxLayout(textFieldPanel, BoxLayout.X_AXIS));
+ compound6 = createTextFieldCompound("Miscellaneous", 6);
+
+ compound6.textfield1 = new JTextField("Custom Caret");
+ compound6.textfield1.setCaret(new CornerCaret());
+ compound6.textFieldPanel.add(compound6.textfield1);
+
+ compound6.textfield2 = new JTextField("Custom Caret color");
+ compound6.textfield2.setForeground(Color.LIGHT_GRAY);
+ compound6.textfield2.setBackground(Color.BLACK);
+ compound6.textfield2.setSelectedTextColor(Color.BLACK);
+ compound6.textfield2.setCaretColor(Color.WHITE);
+ compound6.textfield2.setSelectionColor(Color.DARK_GRAY);
+ compound6.textFieldPanel.add(compound6.textfield2);
+
+ compound6.textfield3 = new JTextField("Custom highlighter");
+ compound6.textfield3.setCaret(new DefaultCaret()
+ {
+ public Highlighter.HighlightPainter getSelectionPainter()
+ {
+ return DemoHighlightPainter.INSTANCE;
+ }
+ });
+ compound6.textFieldPanel.add(compound6.textfield3);
- textfield15 = new JTextField("Custom Caret");
- textfield15.setCaret(new CornerCaret());
- textFieldPanel.add(textfield15);
+ return compound6.panel;
+ }
+
+ private JPanel createCustomBordersPanel()
+ {
+ compound7 = createTextFieldCompound("Custom borders", 7);
- textfield16 = new JTextField("Custom Caret color");
- textfield16.setCaretColor(Color.MAGENTA);
- textFieldPanel.add(textfield16);
+ compound7.textfield1 = new JTextField("red 5 pixel lineborder");
+ compound7.textfield1.setBorder(new LineBorder(Color.RED, 5));
+ compound7.textFieldPanel.add(compound7.textfield1);
- panel.add(textFieldPanel);
+ compound7.textfield2 = new JTextField("complex irregular border");
- JPanel statePanel = new JPanel();
- statePanel.setLayout(new BoxLayout(statePanel, BoxLayout.Y_AXIS));
- statePanel.add(Box.createVerticalGlue());
- enabled5 = new JCheckBox("enabled");
- enabled5.setSelected(true);
- enabled5.addActionListener(this);
- enabled5.setActionCommand("ENABLED5");
- statePanel.add(enabled5);
- editable5 = new JCheckBox("editable");
- editable5.setSelected(true);
- editable5.addActionListener(this);
- editable5.setActionCommand("EDITABLE5");
- statePanel.add(editable5);
- statePanel.add(Box.createVerticalGlue());
- panel.add(statePanel, BorderLayout.EAST);
+ CompoundBorder innerCompound = new CompoundBorder(new EmptyBorder(5, 40, 15, 10), new LineBorder(Color.BLACK));
+ CompoundBorder outerCompound = new CompoundBorder(new LineBorder(Color.BLACK), innerCompound);
+ compound7.textfield2.setBorder(outerCompound);
+ compound7.textFieldPanel.add(compound7.textfield2);
- return panel;
+ compound7.textfield3 = new JTextField("a titled border", 10);
+ compound7.textfield3.setBorder(new TitledBorder(null, "Freak Out Border", TitledBorder.CENTER, TitledBorder.LEFT));
+ compound7.textFieldPanel.add(compound7.textfield3);
+
+ return compound7.panel;
}
public void actionPerformed(ActionEvent e)
@@ -426,63 +423,101 @@ public class TextFieldDemo
}
else if (e.getActionCommand().equals("ENABLED1"))
{
- boolean enabled = enabled1.isSelected();
- textfield1.setEnabled(enabled);
- textfield2.setEnabled(enabled);
- textfield3.setEnabled(enabled);
+ boolean enabled = compound1.enabled.isSelected();
+ compound1.textfield1.setEnabled(enabled);
+ compound1.textfield2.setEnabled(enabled);
+ compound1.textfield3.setEnabled(enabled);
}
else if (e.getActionCommand().equals("EDITABLE1"))
{
- boolean editable = editable1.isSelected();
- textfield1.setEditable(editable);
- textfield2.setEditable(editable);
- textfield3.setEditable(editable);
+ boolean editable = compound1.editable.isSelected();
+ compound1.textfield1.setEditable(editable);
+ compound1.textfield2.setEditable(editable);
+ compound1.textfield3.setEditable(editable);
}
else if (e.getActionCommand().equals("ENABLED2"))
{
- boolean enabled = enabled2.isSelected();
- textfield4.setEnabled(enabled);
- textfield5.setEnabled(enabled);
- textfield6.setEnabled(enabled);
+ boolean enabled = compound2.enabled.isSelected();
+ compound2.textfield1.setEnabled(enabled);
+ compound2.textfield2.setEnabled(enabled);
+ compound2.textfield3.setEnabled(enabled);
}
else if (e.getActionCommand().equals("EDITABLE2"))
{
- boolean editable = editable2.isSelected();
- textfield4.setEditable(editable);
- textfield5.setEditable(editable);
- textfield6.setEditable(editable);
+ boolean editable = compound2.editable.isSelected();
+ compound2.textfield1.setEditable(editable);
+ compound2.textfield2.setEditable(editable);
+ compound2.textfield3.setEditable(editable);
}
else if (e.getActionCommand().equals("ENABLED3"))
{
- boolean enabled = enabled3.isSelected();
- textfield7.setEnabled(enabled);
- textfield8.setEnabled(enabled);
- textfield9.setEnabled(enabled);
+ boolean enabled = compound3.enabled.isSelected();
+ compound3.textfield1.setEnabled(enabled);
+ compound3.textfield2.setEnabled(enabled);
+ compound3.textfield3.setEnabled(enabled);
}
else if (e.getActionCommand().equals("EDITABLE3"))
{
- boolean editable = editable3.isSelected();
- textfield7.setEditable(editable);
- textfield8.setEditable(editable);
- textfield9.setEditable(editable);
+ boolean editable = compound3.editable.isSelected();
+ compound3.textfield1.setEditable(editable);
+ compound3.textfield2.setEditable(editable);
+ compound3.textfield3.setEditable(editable);
}
else if (e.getActionCommand().equals("ENABLED4"))
{
- boolean enabled = enabled4.isSelected();
- textfield10.setEnabled(enabled);
- textfield11.setEnabled(enabled);
- textfield12.setEnabled(enabled);
- textfield13.setEnabled(enabled);
- textfield14.setEnabled(enabled);
+ boolean enabled = compound4.enabled.isSelected();
+ compound4.textfield1.setEnabled(enabled);
+ compound4.textfield2.setEnabled(enabled);
+ compound4.textfield3.setEnabled(enabled);
}
else if (e.getActionCommand().equals("EDITABLE4"))
{
- boolean editable = editable4.isSelected();
- textfield10.setEditable(editable);
- textfield11.setEditable(editable);
- textfield12.setEditable(editable);
- textfield13.setEditable(editable);
- textfield14.setEditable(editable);
+ boolean editable = compound4.editable.isSelected();
+ compound4.textfield1.setEditable(editable);
+ compound4.textfield2.setEditable(editable);
+ compound4.textfield3.setEditable(editable);
+ }
+ else if (e.getActionCommand().equals("ENABLED5"))
+ {
+ boolean enabled = compound5.enabled.isSelected();
+ compound5.textfield1.setEnabled(enabled);
+ compound5.textfield2.setEnabled(enabled);
+ compound5.textfield3.setEnabled(enabled);
+ }
+ else if (e.getActionCommand().equals("EDITABLE5"))
+ {
+ boolean editable = compound5.editable.isSelected();
+ compound5.textfield1.setEditable(editable);
+ compound5.textfield2.setEditable(editable);
+ compound5.textfield3.setEditable(editable);
+ }
+ else if (e.getActionCommand().equals("ENABLED6"))
+ {
+ boolean enabled = compound6.enabled.isSelected();
+ compound6.textfield1.setEnabled(enabled);
+ compound6.textfield2.setEnabled(enabled);
+ compound6.textfield3.setEnabled(enabled);
+ }
+ else if (e.getActionCommand().equals("EDITABLE6"))
+ {
+ boolean editable = compound6.editable.isSelected();
+ compound6.textfield1.setEditable(editable);
+ compound6.textfield2.setEditable(editable);
+ compound6.textfield3.setEditable(editable);
+ }
+ else if (e.getActionCommand().equals("ENABLED7"))
+ {
+ boolean enabled = compound7.enabled.isSelected();
+ compound7.textfield1.setEnabled(enabled);
+ compound7.textfield2.setEnabled(enabled);
+ compound7.textfield3.setEnabled(enabled);
+ }
+ else if (e.getActionCommand().equals("EDITABLE7"))
+ {
+ boolean editable = compound7.editable.isSelected();
+ compound7.textfield1.setEditable(editable);
+ compound7.textfield2.setEditable(editable);
+ compound7.textfield3.setEditable(editable);
}
}
@@ -519,4 +554,41 @@ public class TextFieldDemo
};
}
+ static class Compound
+ {
+ JTextField textfield1;
+ JTextField textfield2;
+ JTextField textfield3;
+ JCheckBox enabled;
+ JCheckBox editable;
+ JPanel textFieldPanel;
+ JPanel panel;
+
+ /** Creates and initializes the textfields with the same text and
+ * alignment but with a different font.
+ *
+ * @param title The text for the textfields.
+ * @param align The alignment for the textfields.
+ * @param fonts The fonts to be used for the textfields.
+ */
+ void setupTextfields(String title, int align, Font[] fonts)
+ {
+ textfield1 = new JTextField(title);
+ textfield1.setHorizontalAlignment(align);
+ textfield1.setFont(fonts[0]);
+ textFieldPanel.add(textfield1);
+
+ textfield2 = new JTextField(title);
+ textfield2.setHorizontalAlignment(align);
+ textfield2.setFont(fonts[1]);
+ textFieldPanel.add(textfield2);
+
+ textfield3 = new JTextField(title);
+ textfield3.setHorizontalAlignment(align);
+ textfield3.setFont(fonts[2]);
+ textFieldPanel.add(textfield3);
+ }
+
+ }
+
}
diff --git a/examples/gnu/classpath/examples/swing/TreeDemo.java b/examples/gnu/classpath/examples/swing/TreeDemo.java
index 9c6c3b87e..32f765f73 100644
--- a/examples/gnu/classpath/examples/swing/TreeDemo.java
+++ b/examples/gnu/classpath/examples/swing/TreeDemo.java
@@ -39,19 +39,27 @@ exception statement from your version. */
package gnu.classpath.examples.swing;
import java.awt.BorderLayout;
+import java.awt.JobAttributes.DefaultSelectionType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import javax.swing.DebugGraphics;
import javax.swing.JButton;
+import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
+import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeSelectionModel;
public class TreeDemo
extends JPanel
@@ -129,9 +137,10 @@ public class TreeDemo
final JTree tree = new JTree(root);
tree.setLargeModel(true);
tree.setEditable(true);
- DefaultTreeSelectionModel dtsm = new DefaultTreeSelectionModel();
- dtsm.setSelectionMode(DefaultTreeSelectionModel.SINGLE_TREE_SELECTION);
- tree.setSelectionModel(dtsm);
+ final DefaultTreeSelectionModel selModel = new DefaultTreeSelectionModel();
+ selModel.setSelectionMode(
+ DefaultTreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
+ tree.setSelectionModel(selModel);
// buttons to add and delete
JButton add = new JButton("add element");
@@ -147,21 +156,79 @@ public class TreeDemo
DefaultMutableTreeNode n = (DefaultMutableTreeNode) p.
getLastPathComponent();
n.add(new DefaultMutableTreeNode("New Element"));
- tree.repaint();
+
+ // The expansion state of the parent node does not change
+ // by default. We will expand it manually, to ensure that the
+ // added node is immediately visible.
+ tree.expandPath(p);
+
+ // Refresh the tree (.repaint would be not enough both in
+ // Classpath and Sun implementations).
+ DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
+ model.reload(n);
break;
}
}
}
});
-
-
+
+ // Demonstration of the various selection modes
+ final JCheckBox cbSingle = new JCheckBox("single selection");
+ cbSingle.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ if (cbSingle.isSelected())
+ selModel.setSelectionMode(
+ DefaultTreeSelectionModel.SINGLE_TREE_SELECTION);
+ else
+ selModel.setSelectionMode(
+ DefaultTreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
+ }
+ });
+
+ // Demonstration of the root visibility changes
+ final JCheckBox cbRoot = new JCheckBox("root");
+ cbRoot.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ tree.setRootVisible(cbRoot.isSelected());
+ }
+ });
+ cbRoot.setSelected(true);
+
+ // Demonstration of the tree selection listener.
+ final JLabel choice = new JLabel("Make a choice");
+ tree.getSelectionModel().addTreeSelectionListener(
+ new TreeSelectionListener()
+ {
+ public void valueChanged(TreeSelectionEvent event)
+ {
+ TreePath was = event.getOldLeadSelectionPath();
+ TreePath now = event.getNewLeadSelectionPath();
+ String swas =
+ was == null ? "none":was.getLastPathComponent().toString();
+ String snow =
+ now == null ? "none":now.getLastPathComponent().toString();
+ choice.setText("From "+swas+" to "+snow);
+ }
+ }
+ );
+
setLayout(new BorderLayout());
JPanel p2 = new JPanel();
p2.add(add);
+ p2.add(cbSingle);
+ p2.add(cbRoot);
+
+ tree.getSelectionModel().
+ setSelectionMode(DefaultTreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
add(p2, BorderLayout.NORTH);
add(new JScrollPane(tree), BorderLayout.CENTER);
+ add(choice, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e)
diff --git a/gnu/CORBA/CDR/EncapsulationStream.java b/gnu/CORBA/CDR/EncapsulationStream.java
index 4945d9c90..e42991232 100644
--- a/gnu/CORBA/CDR/EncapsulationStream.java
+++ b/gnu/CORBA/CDR/EncapsulationStream.java
@@ -79,6 +79,7 @@ public class EncapsulationStream
boolean use_big_endian)
{
super();
+ setBigEndian(use_big_endian);
buffer = new AligningOutput();
setOutputStream(buffer);
parent = _parent;
diff --git a/gnu/CORBA/GIOP/MessageHeader.java b/gnu/CORBA/GIOP/MessageHeader.java
index e1bdb512b..025283858 100644
--- a/gnu/CORBA/GIOP/MessageHeader.java
+++ b/gnu/CORBA/GIOP/MessageHeader.java
@@ -51,6 +51,7 @@ import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.portable.IDLEntity;
import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -273,20 +274,36 @@ public class MessageHeader
* Read the header from the stream.
*
* @param istream a stream to read from.
- *
* @throws MARSHAL if this is not a GIOP 1.0 header.
*/
- public void read(java.io.InputStream istream)
- throws MARSHAL
+ public void read(java.io.InputStream istream)
+ throws MARSHAL, EOFException
{
try
{
byte[] xMagic = new byte[MAGIC.length];
- istream.read(xMagic);
- if (!Arrays.equals(xMagic, MAGIC))
+ int r = istream.read(xMagic);
+ int minor;
+ if (! Arrays.equals(xMagic, MAGIC))
{
- MARSHAL m = new MARSHAL("Not a GIOP message");
- m.minor = Minor.Giop;
+ StringBuffer b = new StringBuffer();
+ if (r == - 1)
+ {
+ b.append("Immediate EOF");
+ minor = Minor.EOF;
+ }
+ else
+ {
+ minor = Minor.Giop;
+ b.append(r + " bytes: ");
+ for (int i = 0; i < xMagic.length; i++)
+ {
+ b.append(Integer.toHexString(xMagic[i] & 0xFF));
+ b.append(' ');
+ }
+ }
+ MARSHAL m = new MARSHAL("Not a GIOP message: " + b);
+ m.minor = minor;
throw m;
}
@@ -354,7 +371,7 @@ public class MessageHeader
}
catch (IOException ex)
{
- MARSHAL t = new MARSHAL();
+ MARSHAL t = new MARSHAL(ex.getMessage());
t.minor = Minor.Header;
t.initCause(ex);
throw t;
diff --git a/gnu/CORBA/IorDelegate.java b/gnu/CORBA/IorDelegate.java
index 27fb5de9a..8eb43aa7d 100644
--- a/gnu/CORBA/IorDelegate.java
+++ b/gnu/CORBA/IorDelegate.java
@@ -407,20 +407,7 @@ public class IorDelegate extends SimpleDelegate
*/
public void release(org.omg.CORBA.Object target)
{
- String key = ior.Internet.host + ":" + ior.Internet.port;
-
- Socket socket = SocketRepository.get_socket(key);
- try
- {
- if (socket != null)
- {
- socket.close();
- }
- }
- catch (IOException ex)
- {
- // do nothing, then.
- }
+ // Do nothing here.
}
/**
diff --git a/gnu/CORBA/NamingService/NameParser.java b/gnu/CORBA/NamingService/NameParser.java
index 422db1c58..c750b2eb4 100644
--- a/gnu/CORBA/NamingService/NameParser.java
+++ b/gnu/CORBA/NamingService/NameParser.java
@@ -1,5 +1,5 @@
/* NameParser.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -425,7 +425,8 @@ public class NameParser
else
{
Delegate delegate = ((ObjectImpl) object)._get_delegate();
- ns = new _NamingContextStub(delegate);
+ ns = new _NamingContextStub();
+ ((_NamingContextStub) ns)._set_delegate(delegate);
}
}
catch (Exception ex)
diff --git a/gnu/CORBA/OrbRestricted.java b/gnu/CORBA/OrbRestricted.java
index c0401800a..c34584995 100644
--- a/gnu/CORBA/OrbRestricted.java
+++ b/gnu/CORBA/OrbRestricted.java
@@ -41,11 +41,13 @@ package gnu.CORBA;
import gnu.CORBA.CDR.BufferedCdrOutput;
import gnu.CORBA.typecodes.AliasTypeCode;
import gnu.CORBA.typecodes.ArrayTypeCode;
+import gnu.CORBA.typecodes.PrimitiveTypeCode;
import gnu.CORBA.typecodes.RecordTypeCode;
import gnu.CORBA.typecodes.StringTypeCode;
import org.omg.CORBA.Any;
import org.omg.CORBA.BAD_PARAM;
+import org.omg.CORBA.Context;
import org.omg.CORBA.ContextList;
import org.omg.CORBA.Environment;
import org.omg.CORBA.ExceptionList;
@@ -526,4 +528,57 @@ public class OrbRestricted extends org.omg.CORBA_2_3.ORB
super.destroy();
}
+
+ /**
+ * Create a typecode, representing a tree-like structure.
+ * This structure contains a member that is a sequence of the same type,
+ * as the structure itself. You can imagine as if the folder definition
+ * contains a variable-length array of the enclosed (nested) folder
+ * definitions. In this way, it is possible to have a tree like
+ * structure that can be transferred via CORBA CDR stream.
+ *
+ * @deprecated It is easier and clearler to use a combination of
+ * create_recursive_tc and create_sequence_tc instead.
+ *
+ * @param bound the maximal expected number of the nested components
+ * on each node; 0 if not limited.
+ *
+ * @param offset the position of the field in the returned structure
+ * that contains the sequence of the structures of the same field.
+ * The members before this field are intialised using parameterless
+ * StructMember constructor.
+ *
+ * @return a typecode, defining a stucture, where a member at the
+ * <code>offset</code> position defines an array of the identical
+ * structures.
+ *
+ * @see #create_recursive_tc(String)
+ * @see #create_sequence_tc(int, TypeCode)
+ */
+ public TypeCode create_recursive_sequence_tc(int bound, int offset)
+ {
+ RecordTypeCode r = new RecordTypeCode(TCKind.tk_struct);
+ for (int i = 0; i < offset; i++)
+ r.add(new StructMember());
+
+ TypeCode recurs = new PrimitiveTypeCode(TCKind.tk_sequence);
+
+ r.add(new StructMember("", recurs, null));
+ return r;
+ }
+
+ /**
+ * Get the default context of this ORB. This is an initial root of all
+ * contexts.
+ *
+ * The default method returns a new context with the empty name and
+ * no parent context.
+ *
+ * @return the default context of this ORB.
+ */
+ public Context get_default_context()
+ {
+ return new gnuContext("", null);
+ }
+
} \ No newline at end of file
diff --git a/gnu/CORBA/SocketRepository.java b/gnu/CORBA/SocketRepository.java
index e48a9a5da..5d4a5099c 100644
--- a/gnu/CORBA/SocketRepository.java
+++ b/gnu/CORBA/SocketRepository.java
@@ -116,9 +116,6 @@ public class SocketRepository
*/
public static Socket get_socket(Object key)
{
- if (true)
- return null;
-
synchronized (sockets)
{
Socket s = (Socket) sockets.get(key);
diff --git a/gnu/CORBA/gnuRequest.java b/gnu/CORBA/gnuRequest.java
index 5adf74129..0b3338d34 100644
--- a/gnu/CORBA/gnuRequest.java
+++ b/gnu/CORBA/gnuRequest.java
@@ -83,6 +83,7 @@ import org.omg.PortableInterceptor.ClientRequestInterceptorOperations;
import org.omg.PortableInterceptor.ForwardRequest;
import org.omg.PortableInterceptor.InvalidSlot;
+import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -593,7 +594,7 @@ public class gnuRequest extends Request implements Cloneable
{
final gnuRequest cloned = Clone();
cloned.oneWay = true;
-
+
new Thread()
{
public void run()
@@ -717,12 +718,11 @@ public class gnuRequest extends Request implements Cloneable
* property ({@link #setIOR(IOR)} before calling this method.
*
* @throws BAD_INV_ORDER, minor code 0, if the IOR has not been previously set
- * or if the direct argument addition is mixed with the direct argument
- * writing into the output stream.
- *
+ * or if the direct argument addition is mixed with the direct
+ * argument writing into the output stream.
* @return the server response in binary form.
*/
- public synchronized RawReply submit()
+public synchronized RawReply submit()
throws ForwardRequest
{
gnu.CORBA.GIOP.MessageHeader header = new gnu.CORBA.GIOP.MessageHeader();
@@ -788,20 +788,21 @@ public class gnuRequest extends Request implements Cloneable
if (socket == null)
{
- // The BindException may be thrown under very heavy parallel
+ // The IOException may be thrown under very heavy parallel
// load. For some time, just wait, exceptiong the socket to free.
Open: for (int i = 0; i < PAUSE_STEPS; i++)
{
try
{
if (orb instanceof OrbFunctional)
- socket = ((OrbFunctional) orb).socketFactory.createClientSocket(
- ior.Internet.host, ior.Internet.port);
+ socket = ((OrbFunctional) orb).socketFactory.
+ createClientSocket(
+ ior.Internet.host, ior.Internet.port);
else
socket = new Socket(ior.Internet.host, ior.Internet.port);
break Open;
}
- catch (BindException ex)
+ catch (IOException ex)
{
try
{
@@ -833,7 +834,7 @@ public class gnuRequest extends Request implements Cloneable
request_part.buffer.writeTo(socketOutput);
socketOutput.flush();
- if (!socket.isClosed())
+ if (!socket.isClosed() && !oneWay)
{
MessageHeader response_header = new MessageHeader();
InputStream socketInput = socket.getInputStream();
@@ -937,6 +938,10 @@ public class gnuRequest extends Request implements Cloneable
throws SystemException, ForwardRequest
{
RawReply response = submit();
+
+ // If this is a one way message, do not care about the response.
+ if (oneWay && response == EMPTY)
+ return;
if (m_rph == null)
m_rph = response.header.create_reply_header();
diff --git a/gnu/classpath/NotImplementedException.java b/gnu/classpath/NotImplementedException.java
new file mode 100644
index 000000000..5b8c7f6d3
--- /dev/null
+++ b/gnu/classpath/NotImplementedException.java
@@ -0,0 +1,61 @@
+/* NotImplementedException.java -- Marker for stub methods
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath;
+
+/**
+ * This class is used as a marker to indicate that a given method
+ * is merely a stub, requiring implementation. For historical
+ * reasons, GNU Classpath includes a number of stub methods. We
+ * don't wish to remove them, but we do want to make them easily
+ * discoverable. JAPI will notice methods declared as throwing
+ * this exception and mark them appropriately.
+ */
+public class NotImplementedException
+ extends RuntimeException
+{
+ private static final long serialVersionUID = 5112972057211125814L;
+
+ /**
+ * This class is not instantiable. It should only be used
+ * in a method 'throws' clause -- not actually ever thrown.
+ */
+ private NotImplementedException()
+ {
+ }
+}
diff --git a/gnu/classpath/SystemProperties.java b/gnu/classpath/SystemProperties.java
index 573736a48..991279eab 100644
--- a/gnu/classpath/SystemProperties.java
+++ b/gnu/classpath/SystemProperties.java
@@ -111,6 +111,13 @@ public class SystemProperties
defaultProperties.put("java.io.tmpdir",
defaultProperties.get("java.tmpdir"));
+ // FIXME: we need a better way to handle this.
+ // For instance, having a single VM class for each OS might help.
+ if (defaultProperties.get("gnu.classpath.mime.types.file") == null
+ && "Linux".equals(defaultProperties.get("os.name")))
+ defaultProperties.put("gnu.classpath.mime.types.file",
+ "/etc/mime.types");
+
VMSystemProperties.postInit(defaultProperties);
// Note that we use clone here and not new. Some programs assume
diff --git a/gnu/classpath/debug/Simple1LineFormatter.java b/gnu/classpath/debug/Simple1LineFormatter.java
index 0bdf22a19..a95f8a9d2 100644
--- a/gnu/classpath/debug/Simple1LineFormatter.java
+++ b/gnu/classpath/debug/Simple1LineFormatter.java
@@ -91,20 +91,27 @@ public class Simple1LineFormatter
extends Formatter
{
private static final String DAT_PATTERN = "yyyy-MM-dd HH:mm:ss.SSSS Z ";
- private static final DateFormat DAT_FORMAT = new SimpleDateFormat(DAT_PATTERN);
private static final String THREAD_PATTERN = " #########0;-#########0";
- private static final NumberFormat THREAD_FORMAT = new DecimalFormat(THREAD_PATTERN);
private static final String SPACES_32 = " ";
private static final String SPACES_6 = " ";
private static final String LS = SystemProperties.getProperty("line.separator");
+ private DateFormat dateFormat;
+ private NumberFormat threadFormat;
+
// default 0-arguments constructor
public String format(LogRecord record)
{
- StringBuffer sb = new StringBuffer(180)
- .append(DAT_FORMAT.format(new Date(record.getMillis())))
- .append(THREAD_FORMAT.format(record.getThreadID()))
+ if (dateFormat == null)
+ dateFormat = new SimpleDateFormat(DAT_PATTERN);
+
+ if (threadFormat == null)
+ threadFormat = new DecimalFormat(THREAD_PATTERN);
+
+ StringBuilder sb = new StringBuilder(180)
+ .append(dateFormat.format(new Date(record.getMillis())))
+ .append(threadFormat.format(record.getThreadID()))
.append(" ");
String s = record.getSourceClassName();
if (s == null)
diff --git a/gnu/classpath/jdwp/util/Value.java b/gnu/classpath/jdwp/util/Value.java
index c73ffef80..414c4a33b 100644
--- a/gnu/classpath/jdwp/util/Value.java
+++ b/gnu/classpath/jdwp/util/Value.java
@@ -1,5 +1,5 @@
/* Value.java -- class to read/write JDWP tagged and untagged values
- Copyright (C) 2005 Free Software Foundation
+ Copyright (C) 2005, 2006, Free Software Foundation
This file is part of GNU Classpath.
@@ -232,7 +232,7 @@ public class Value
else if (type == short.class)
return new Short(bb.getShort());
else if (type == boolean.class)
- return (bb.get() == 0) ? new Boolean(false) : new Boolean(true);
+ return Boolean.valueOf(bb.get() != 0);
else if (type == void.class)
return new byte[0];
else
diff --git a/gnu/java/awt/font/FontDelegate.java b/gnu/java/awt/font/FontDelegate.java
new file mode 100644
index 000000000..a26510ee2
--- /dev/null
+++ b/gnu/java/awt/font/FontDelegate.java
@@ -0,0 +1,313 @@
+/* FontDelegate.java -- Interface implemented by all font delegates.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.font;
+
+import java.awt.Font;
+import java.awt.font.FontRenderContext;
+import java.awt.font.GlyphVector;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
+import java.text.CharacterIterator;
+import java.util.Locale;
+
+
+/**
+ * The interface that all font delegate objects implement,
+ * irrespective of where they get their information from.
+ *
+ * <p><b>Thread Safety:</b> All classes that implement the
+ * <code>FontDelegate</code> interface must allow calling these
+ * methods from multiple concurrent threads. The delegates are
+ * responsible for performing the necessary synchronization.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+public interface FontDelegate
+{
+ /**
+ * Returns the full name of this font face in the specified
+ * locale, for example <i>&#x201c;Univers Light&#x201d;</i>.
+ *
+ * @param locale the locale for which to localize the name.
+ *
+ * @return the face name.
+ */
+ public String getFullName(Locale locale);
+
+
+ /**
+ * Returns the name of the family to which this font face belongs,
+ * for example <i>&#x201c;Univers&#x201d;</i>.
+ *
+ * @param locale the locale for which to localize the name.
+ *
+ * @return the family name.
+ */
+ public String getFamilyName(Locale locale);
+
+
+ /**
+ * Returns the name of this font face inside the family, for example
+ * <i>&#x201c;Light&#x201d;</i>.
+ *
+ * @param locale the locale for which to localize the name.
+ *
+ * @return the name of the face inside its family.
+ */
+ public String getSubFamilyName(Locale locale);
+
+
+ /**
+ * Returns the PostScript name of this font face, for example
+ * <i>&#x201c;Helvetica-Bold&#x201d;</i>.
+ *
+ * @return the PostScript name, or <code>null</code> if the font
+ * does not provide a PostScript name.
+ */
+ public String getPostScriptName();
+
+
+ /**
+ * Returns the number of glyphs in this font face.
+ */
+ public int getNumGlyphs();
+
+
+ /**
+ * Returns the index of the glyph which gets displayed if the font
+ * cannot map a Unicode code point to a glyph. Many fonts show this
+ * glyph as an empty box.
+ */
+ public int getMissingGlyphCode();
+
+
+ /**
+ * Creates a GlyphVector by mapping each character in a
+ * CharacterIterator to the corresponding glyph.
+ *
+ * <p>The mapping takes only the font&#x2019;s <code>cmap</code>
+ * tables into consideration. No other operations (such as glyph
+ * re-ordering, composition, or ligature substitution) are
+ * performed. This means that the resulting GlyphVector will not be
+ * correct for text in languages that have complex
+ * character-to-glyph mappings, such as Arabic, Hebrew, Hindi, or
+ * Thai.
+ *
+ * @param font the font object that the created GlyphVector
+ * will return when it gets asked for its font. This argument is
+ * needed because the public API works with java.awt.Font,
+ * not with some private delegate like OpenTypeFont.
+ *
+ * @param frc the font rendering parameters that are used for
+ * measuring glyphs. The exact placement of text slightly depends on
+ * device-specific characteristics, for instance the device
+ * resolution or anti-aliasing. For this reason, any measurements
+ * will only be accurate if the passed
+ * <code>FontRenderContext</code> correctly reflects the relevant
+ * parameters. Hence, <code>frc</code> should be obtained from the
+ * same <code>Graphics2D</code> that will be used for drawing, and
+ * any rendering hints should be set to the desired values before
+ * obtaining <code>frc</code>.
+ *
+ * @param ci a CharacterIterator for iterating over the
+ * characters to be displayed.
+ */
+ public GlyphVector createGlyphVector(Font font,
+ FontRenderContext frc,
+ CharacterIterator ci);
+
+
+ /**
+ * Determines the advance width and height for a glyph.
+ *
+ * @param glyphIndex the glyph whose advance width is to be
+ * determined.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialias <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @param advance a point whose <code>x</code> and <code>y</code>
+ * fields will hold the advance in each direction. It is well
+ * possible that both values are non-zero, for example for rotated
+ * text or for Urdu fonts.
+ */
+ public void getAdvance(int glyphIndex,
+ float pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ boolean fractionalMetrics,
+ boolean horizontal,
+ Point2D advance);
+
+
+ /**
+ * Returns the shape of a glyph.
+ *
+ * @param glyphIndex the glyph whose advance width is to be
+ * determined.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialias <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts, this
+ * parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional
+ * metrics, <code>false</code> for rounding the result to a pixel
+ * boundary.
+ *
+ * @return the scaled and grid-fitted outline of the specified
+ * glyph, or <code>null</code> for bitmap fonts.
+ */
+ public GeneralPath getGlyphOutline(int glyphIndex,
+ float pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ boolean fractionalMetrics);
+
+
+ /**
+ * Returns a name for the specified glyph. This is useful for
+ * generating PostScript or PDF files that embed some glyphs of a
+ * font.
+ *
+ * <p><b>Names are not unique:</b> Under some rare circumstances,
+ * the same name can be returned for different glyphs. It is
+ * therefore recommended that printer drivers check whether the same
+ * name has already been returned for antoher glyph, and make the
+ * name unique by adding the string ".alt" followed by the glyph
+ * index.</p>
+ *
+ * <p>This situation would occur for an OpenType or TrueType font
+ * that has a <code>post</code> table of format 3 and provides a
+ * mapping from glyph IDs to Unicode sequences through a
+ * <code>Zapf</code> table. If the same sequence of Unicode
+ * codepoints leads to different glyphs (depending on contextual
+ * position, for example, or on typographic sophistication level),
+ * the same name would get synthesized for those glyphs.
+ *
+ * @param glyphIndex the glyph whose name the caller wants to
+ * retrieve.
+ */
+ public String getGlyphName(int glyphIndex);
+
+
+ /**
+ * Determines the distance between the base line and the highest
+ * ascender.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialiased <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the ascent, which usually is a positive number.
+ */
+ public float getAscent(float pointSize,
+ AffineTransform transform,
+ boolean antialiased,
+ boolean fractionalMetrics,
+ boolean horizontal);
+
+
+ /**
+ * Determines the distance between the base line and the lowest
+ * descender.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialiased <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the descent, which usually is a nagative number.
+ */
+ public float getDescent(float pointSize,
+ AffineTransform transform,
+ boolean antialiased,
+ boolean fractionalMetrics,
+ boolean horizontal);
+}
diff --git a/gnu/java/awt/font/FontFactory.java b/gnu/java/awt/font/FontFactory.java
new file mode 100644
index 000000000..6c1084eef
--- /dev/null
+++ b/gnu/java/awt/font/FontFactory.java
@@ -0,0 +1,90 @@
+/* FontFactory.java -- Factory for font delegates.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.font;
+
+import java.nio.ByteBuffer;
+
+import java.awt.FontFormatException;
+import gnu.java.awt.font.opentype.OpenTypeFontFactory;
+
+
+/**
+ * A factory for creating font delegate objects.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+public final class FontFactory
+{
+ /**
+ * The constructor is private so nobody can construct an instance
+ */
+ private FontFactory()
+ {
+ }
+
+
+ /**
+ * Creates FontDelegate objects for the fonts in the specified buffer.
+ * The following font formats are currently recognized:
+ * recognized font formats are:
+ *
+ * <p><ul>
+ * <li>OpenType (*.otf);</li>
+ * <li>TrueType (*.ttf);</li>
+ * <li>TrueType Collections (*.ttc);</li>
+ * <li>Apple MacOS X data-fork font (*.dfont).</li></ul>
+ *
+ * <p>Some formats may contain more than a single font, for example
+ * *.ttc and *.dfont files. This is the reason why this function
+ * returns an array.
+ *
+ * <p>The implementation reads data from the buffer only when
+ * needed. Therefore, it greatly increases efficiency if
+ * <code>buf</code> has been obtained through mapping a file into
+ * the virtual address space.
+ *
+ * @throws FontFormatException if the font data is not in one of the
+ * known formats.
+ */
+ public static FontDelegate[] createFonts(ByteBuffer buf)
+ throws FontFormatException
+ {
+ return OpenTypeFontFactory.createFonts(buf);
+ }
+}
diff --git a/gnu/java/awt/font/GNUGlyphVector.java b/gnu/java/awt/font/GNUGlyphVector.java
new file mode 100644
index 000000000..9688698de
--- /dev/null
+++ b/gnu/java/awt/font/GNUGlyphVector.java
@@ -0,0 +1,596 @@
+/* GNUGlyphVector.java -- The GNU implementation of GlyphVector.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font;
+
+import java.awt.Font;
+import java.awt.font.FontRenderContext;
+import java.awt.font.GlyphMetrics;
+import java.awt.font.GlyphJustificationInfo;
+import java.awt.font.GlyphVector;
+
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+
+
+/**
+ * The GNU implementation of the abstract GlyphVector class, which
+ * uses the services provided by a FontDelegate for its functionality.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+public class GNUGlyphVector
+ extends GlyphVector
+{
+ private FontDelegate fontDelegate;
+ private Font font;
+ private FontRenderContext renderContext;
+ private int[] glyphs;
+ private float fontSize;
+ private AffineTransform transform;
+ private boolean valid;
+
+
+ /**
+ * The position of each glyph. The horizontal position of the
+ * <code>i</code>-th glyph is at <code>pos[i * 2]</code>, its
+ * vertical position at <code>pos[i * 2 + 1]</code>. The total
+ * advance width of the entire vector is stored at
+ * <code>pos[numGlyphs]</code>, the total advance height at
+ * <code>pos[numGlyphs + 1]</code>.
+ */
+ private float[] pos;
+
+
+ private AffineTransform[] transforms;
+ private int layoutFlags;
+
+
+ /**
+ * Constructs a new GNUGlyphVector.
+ *
+ * @param fontDelegate the FontDelegate that creates this vector.
+ *
+ * @param font the Font that this GlyphVector will return for {@link
+ * #getFont()}. That object is also used to determine the point
+ * size, which affects the affine transformation used by the font
+ * scaler.
+ *
+ * @param renderContext an object with parameters for font
+ * rendering, such as whether anti-aliasing is enabled.
+ *
+ * @param glyphs the glyphs in this vector.
+ */
+ public GNUGlyphVector(FontDelegate fontDelegate,
+ Font font,
+ FontRenderContext renderContext,
+ int[] glyphs)
+ {
+ this.fontDelegate = fontDelegate;
+ this.font = font;
+ this.renderContext = renderContext;
+ this.glyphs = glyphs;
+
+ fontSize = font.getSize2D();
+ transform = font.getTransform(); // returns a modifiable copy
+ transform.concatenate(renderContext.getTransform());
+ }
+
+
+
+ /**
+ * Returns the font of the glyphs in this GlyphVector.
+ */
+ public Font getFont()
+ {
+ return font;
+ }
+
+
+ /**
+ * Returns the FontRenderContext that is used to calculate the
+ * extent and position of the glyphs.
+ */
+ public FontRenderContext getFontRenderContext()
+ {
+ return renderContext;
+ }
+
+
+ /**
+ * Moves each glyph in the vector to its default position.
+ */
+ public void performDefaultLayout()
+ {
+ float x, y, advanceWidth, advanceHeight;
+ int i, p;
+ AffineTransform tx;
+ Point2D.Float advance = new Point2D.Float();
+
+ pos = new float[(glyphs.length + 1) * 2];
+ x = y = 0.0f;
+ p = 0;
+ for (i = p = 0; i < glyphs.length; i++)
+ {
+ p += 2;
+
+ if ((transforms == null) || (tx = transforms[i]) == null)
+ tx = this.transform;
+ else
+ {
+ tx = new AffineTransform(tx);
+ tx.concatenate(this.transform);
+ }
+
+ fontDelegate.getAdvance(glyphs[i], fontSize, tx,
+ renderContext.isAntiAliased(),
+ renderContext.usesFractionalMetrics(),
+ /* horizontal */ true,
+ advance);
+ pos[p] = x += advance.x;
+ pos[p + 1] = y += advance.y;
+ }
+ valid = true;
+ }
+
+
+ /**
+ * Determines the number of glyphs in this GlyphVector.
+ */
+ public int getNumGlyphs()
+ {
+ return glyphs.length;
+ }
+
+
+ /**
+ * Determines the glyph number by index in this vector.
+ * Glyph numbers are specific to each font, so two fonts
+ * will likely assign different numbers to the same glyph.
+ *
+ * @param glyphIndex the index of the glyph whose glyph number is to
+ * be retrieved.
+ *
+ * @throws IndexOutOfBoundsException if <code>glyphIndex</code>
+ * is not in the range <code[0 .. getNumGlyphs() - 1]</code>.
+ */
+ public int getGlyphCode(int glyphIndex)
+ {
+ /* The exception is thrown automatically if the index is out
+ * of the valid bounds.
+ */
+ return glyphs[glyphIndex];
+ }
+
+
+ /**
+ * Returns a slice of this GlyphVector.
+ *
+ * @param firstGlyphIndex the index of the first glyph in the
+ * returned slice.
+ *
+ * @param numEntries the size of the returned slice.
+ *
+ * @param outCodes a pre-allocated array for storing the slice,
+ * or <code>null</code> to cause allocation of a new array.
+ *
+ * @return a slice of this GlyphVector. If <code>outCodes</code>
+ * is <code>null</code>, the slice will be stored into a freshly
+ * allocated array; otherwise, the result will be stored into
+ * <code>outCodes</code>.
+ */
+ public int[] getGlyphCodes(int firstGlyphIndex,
+ int numEntries,
+ int[] outCodes)
+ {
+ if (numEntries < 0)
+ throw new IllegalArgumentException();
+ if (outCodes == null)
+ outCodes = new int[numEntries];
+ System.arraycopy(glyphs, firstGlyphIndex, outCodes, 0, numEntries);
+ return outCodes;
+ }
+
+
+ public Rectangle2D getLogicalBounds()
+ {
+ float ascent, descent;
+
+ validate();
+
+ return new Rectangle2D.Float(0, 0,
+ pos[pos.length - 2],
+ getAscent() - getDescent());
+ }
+
+
+ public Rectangle2D getVisualBounds()
+ {
+ validate();
+
+ // FIXME: Not yet implemented.
+ return getLogicalBounds();
+ }
+
+
+ /**
+ * Returns the shape of this GlyphVector.
+ */
+ public Shape getOutline()
+ {
+ validate();
+ return getOutline(0.0f, 0.0f);
+ }
+
+
+ /**
+ * Returns the shape of this GlyphVector, translated to the
+ * specified position.
+ *
+ * @param x the horizontal position for rendering this vector.
+ * @param y the vertical position for rendering this vector.
+ */
+ public Shape getOutline(float x, float y)
+ {
+ validate();
+
+ GeneralPath outline = new GeneralPath();
+ int len = glyphs.length;
+ for (int i = 0; i < len; i++)
+ {
+ GeneralPath p = new GeneralPath(getGlyphOutline(i));
+ outline.append(p, false);
+ }
+ AffineTransform t = new AffineTransform();
+ t.translate(x, y);
+ outline.transform(t);
+ return outline;
+ }
+
+
+ /**
+ * Determines the shape of the specified glyph.
+ *
+ * @throws IndexOutOfBoundsException if <code>glyphIndex</code> is
+ * not in the range <code[0 .. getNumGlyphs()]</code>.
+ */
+ public Shape getGlyphOutline(int glyphIndex)
+ {
+ AffineTransform tx, glyphTx;
+ GeneralPath path;
+
+ validate();
+
+ if ((transforms != null)
+ && ((glyphTx = transforms[glyphIndex]) != null))
+ {
+ tx = new AffineTransform(transform);
+ tx.concatenate(glyphTx);
+ }
+ else
+ tx = transform;
+
+ path = fontDelegate.getGlyphOutline(glyphs[glyphIndex], fontSize, tx,
+ renderContext.isAntiAliased(),
+ renderContext.usesFractionalMetrics());
+
+ tx = new AffineTransform();
+ tx.translate(pos[glyphIndex * 2], pos[glyphIndex * 2 + 1]);
+ path.transform(tx);
+ return path;
+ }
+
+
+ /**
+ * Determines the position of the specified glyph, or the
+ * total advance width and height of the vector.
+ *
+ * @param glyphIndex the index of the glyph in question.
+ * If this value equals <code>getNumGlyphs()</code>, the
+ * position <i>after</i> the last glyph will be returned,
+ * which is the total advance width and height of the vector.
+ *
+ * @throws IndexOutOfBoundsException if <code>glyphIndex</code> is
+ * not in the range <code[0 .. getNumGlyphs()]</code>.
+ */
+ public Point2D getGlyphPosition(int glyphIndex)
+ {
+ validate();
+ return new Point2D.Float(pos[glyphIndex * 2],
+ pos[glyphIndex * 2 + 1]);
+ }
+
+
+ /**
+ * Moves the specified glyph to a new position, or changes the
+ * advance width and height of the entire glyph vector.
+ *
+ * <p>Note that the position of an individual glyph may also
+ * affected by its affine transformation.
+ *
+ * @param glyphIndex the index of the moved glyph. If
+ * <code>glyphIndex</code> equals the total number of glyphs in this
+ * vector, the advance width and height of the vector is changed.
+ *
+ * @param position the new position of the glyph.
+ *
+ * @throws IndexOutOfBoundsException if <code>glyphIndex</code> is
+ * not in the range <code[0 .. getNumGlyphs()]</code>.
+ */
+ public void setGlyphPosition(int glyphIndex, Point2D position)
+ {
+ validate();
+ pos[glyphIndex * 2] = (float) position.getX();
+ pos[glyphIndex * 2 + 1] = (float) position.getY();
+ }
+
+
+ /**
+ * Returns the affine transformation that is applied to the
+ * glyph at the specified index.
+ *
+ * @param glyphIndex the index of the glyph whose transformation
+ * is to be retrieved.
+ *
+ * @return an affine transformation, or <code>null</code>
+ * for the identity transformation.
+ *
+ * @throws IndexOutOfBoundsException if <code>glyphIndex</code> is
+ * not in the range <code[0 .. getNumGlyphs() - 1]</code>.
+ */
+ public AffineTransform getGlyphTransform(int glyphIndex)
+ {
+ if (transforms == null)
+ return null;
+ else
+ return transforms[glyphIndex];
+ }
+
+
+ /**
+ * Applies an affine transformation to the glyph at the specified
+ * index.
+ *
+ * @param glyphIndex the index of the glyph to which the
+ * transformation is applied.
+ *
+ * @param transform the affine transformation for the glyph, or
+ * <code>null</code> for an identity transformation.
+ */
+ public void setGlyphTransform(int glyphIndex,
+ AffineTransform transform)
+ {
+ if (transforms == null)
+ transforms = new AffineTransform[glyphs.length];
+ transforms[glyphIndex] = transform;
+
+ /* If the GlyphVector has only a transform for a single glyph, and
+ * the caller clears its transform, the FLAG_HAS_TRANSFORMS bit
+ * should be cleared in layoutFlags. However, this would require
+ * that we keep track of the number of transformed glyphs, or that
+ * we count them when a transform is cleared. This would
+ * complicate the code quite a bit. Note that the only drawback of
+ * wrongly setting FLAG_HAS_TRANSFORMS is that a slower code path
+ * might be taken for rendering the vector. Right now, we never
+ * really look at the flag, so it does not make any difference.
+ */
+ if (transform != null)
+ layoutFlags |= FLAG_HAS_TRANSFORMS;
+ valid = false;
+ }
+
+
+ /**
+ * Returns flags that can be used for optimizing the rendering
+ * of this GlyphVector.
+ *
+ * @return a bit mask with the applicable flags set.
+ *
+ * @since 1.4
+ *
+ * @see GlyphVector#FLAG_HAS_POSITION_ADJUSTMENTS
+ * @see GlyphVector#FLAG_HAS_TRANSFORMS
+ * @see GlyphVector#FLAG_RUN_RTL
+ * @see GlyphVector#FLAG_COMPLEX_GLYPHS
+ * @see GlyphVector#FLAG_MASK
+ */
+ public int getLayoutFlags()
+ {
+ return layoutFlags;
+ }
+
+
+ /**
+ * Returns the positions of a range of glyphs in this vector.
+ *
+ * @param firstGlyphIndex the index of the first glyph whose
+ * position is retrieved.
+ *
+ * @param numGlyphs the number of glyphs whose positions
+ * are retrieved.
+ *
+ * @param outPositions an array for storing the results
+ * (the length must be at least twice <code>numGlyphs</code>),
+ * or <code>null</code> for freshly allocating an array.
+ *
+ * @return an array with the glyph positions. The horizontal
+ * position of the <code>i</code>-th glyph is at index <code>2 *
+ * i</code>, the vertical position at index <code>2 * i + 1</code>.
+ *
+ * @throws IllegalArgumentException if <code>numGlyphs</code>
+ * is less than zero.
+ *
+ * @throws IndexOutOfBoundsException if either
+ * <code>firstGlyphIndex</code> or <code>(firstGlyphIndex +
+ * numGlyphs)</code> is not in the range <code>[0 .. getNumGlyphs() -
+ * 1]</code>.
+ */
+ public float[] getGlyphPositions(int firstGlyphIndex,
+ int numGlyphs,
+ float[] outPositions)
+ {
+ if (numGlyphs < 0)
+ throw new IllegalArgumentException();
+
+ validate();
+ if (outPositions == null)
+ outPositions = new float[numGlyphs * 2];
+
+ System.arraycopy(/*src */ pos, /* srcStart */ firstGlyphIndex * 2,
+ /* dest */ outPositions, /* destStart */ 0,
+ /* length */ numGlyphs * 2);
+ return outPositions;
+ }
+
+
+ private float getAscent()
+ {
+ return fontDelegate.getAscent(fontSize, transform,
+ renderContext.isAntiAliased(),
+ renderContext.usesFractionalMetrics(),
+ /* horizontal */ true);
+ }
+
+
+ private float getDescent()
+ {
+ return fontDelegate.getDescent(fontSize, transform,
+ renderContext.isAntiAliased(),
+ renderContext.usesFractionalMetrics(),
+ /* horizontal */ true);
+ }
+
+
+ public Shape getGlyphLogicalBounds(int glyphIndex)
+ {
+ float x, y, ascent;
+
+ validate();
+ ascent = getAscent();
+ x = pos[glyphIndex * 2];
+ y = pos[glyphIndex * 2 + 1];
+
+ return new Rectangle2D.Float(x, y - ascent,
+ pos[(glyphIndex + 1) * 2] - x,
+ ascent - getDescent());
+ }
+
+
+ public Shape getGlyphVisualBounds(int glyphIndex)
+ {
+ return getGlyphOutline(glyphIndex).getBounds2D();
+ }
+
+
+ /**
+ * Determines the metrics of the glyph at the specified index.
+ *
+ * @param glyphIndex the index of the glyph whose metrics is to be
+ * retrieved.
+ *
+ * @throws IndexOutOfBoundsException if <code>glyphIndex</code> is
+ * not in the range <code[0 .. getNumGlyphs() - 1]</code>.
+ */
+ public GlyphMetrics getGlyphMetrics(int glyphIndex)
+ {
+ // FIXME: Not yet implemented.
+ throw new UnsupportedOperationException();
+ }
+
+
+ /**
+ * Determines the justification information for the glyph at the
+ * specified index.
+ *
+ * @param glyphIndex the index of the glyph whose justification
+ * information is to be retrieved.
+ *
+ * @throws IndexOutOfBoundsException if <code>glyphIndex</code> is
+ * not in the range <code[0 .. getNumGlyphs() - 1]</code>.
+ */
+ public GlyphJustificationInfo getGlyphJustificationInfo(int glyphIndex)
+ {
+ // FIXME: Not yet implemented.
+ throw new UnsupportedOperationException();
+ }
+
+
+ /**
+ * Determines whether another GlyphVector is for the same font and
+ * rendering context, uses the same glyphs and positions them to the
+ * same location.
+ *
+ * @param other the GlyphVector to compare with.
+ *
+ * @return <code>true</code> if the two vectors are equal,
+ * <code>false</code> otherwise.
+ */
+ public boolean equals(GlyphVector other)
+ {
+ GNUGlyphVector o;
+ if (!(other instanceof GNUGlyphVector))
+ return false;
+
+ o = (GNUGlyphVector) other;
+ if ((this.font != o.font)
+ || (this.fontDelegate != o.fontDelegate)
+ || (this.renderContext != o.renderContext)
+ || (this.glyphs.length != o.glyphs.length))
+ return false;
+
+ for (int i = 0; i < glyphs.length; i++)
+ if (this.glyphs[i] != o.glyphs[i])
+ return false;
+
+ validate();
+ o.validate();
+ for (int i = 0; i < pos.length; i++)
+ if (this.pos[i] != o.pos[i])
+ return false;
+
+ return true;
+ }
+
+ private void validate()
+ {
+ if (!valid)
+ performDefaultLayout();
+ }
+}
diff --git a/gnu/java/awt/font/opentype/CharGlyphMap.java b/gnu/java/awt/font/opentype/CharGlyphMap.java
new file mode 100644
index 000000000..6ada3b147
--- /dev/null
+++ b/gnu/java/awt/font/opentype/CharGlyphMap.java
@@ -0,0 +1,1027 @@
+/* CharGlyphMap.java -- Manages the 'cmap' table of TrueType fonts
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.font.opentype;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.ShortBuffer;
+import java.nio.IntBuffer;
+
+
+/**
+ * A mapping from Unicode codepoints to glyphs. This mapping
+ * does not perform any re-ordering or decomposition, so it
+ * is not everything that is needed to support Unicode.
+ *
+ * <p>This class manages the <code>cmap</code> table of
+ * OpenType and TrueType fonts.
+ *
+ * @see <a href="http://partners.adobe.com/asn/tech/type/opentype/cmap.jsp">
+ * the <code>cmap</code> part of Adobe&#x2019; OpenType Specification</a>
+ *
+ * @see <a href="http://developer.apple.com/fonts/TTRefMan/RM06/Chap6cmap.html">
+ * the <code>cmap</code> section of Apple&#x2019;s TrueType Reference
+ * Manual</a>
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+abstract class CharGlyphMap
+{
+ private static final int PLATFORM_UNICODE = 0;
+ private static final int PLATFORM_MACINTOSH = 1;
+ private static final int PLATFORM_MICROSOFT = 3;
+
+
+ /**
+ * Determines the glyph index for a given Unicode codepoint. Users
+ * should be aware that the character-to-glyph mapping not not
+ * everything that is needed for full Unicode support. For example,
+ * the <code>cmap</code> table is not able to synthesize accented
+ * glyphs from the canonical decomposition sequence, even if the
+ * font would contain a glyph for the composed form.
+ *
+ * @param ucs4 the Unicode codepoint in UCS-4 encoding. Surrogates
+ * (U+D800 to U+DFFF) cannot be passed, they must be mapped to
+ * UCS-4 first.
+ *
+ * @return the glyph index, or 0 if the font does not contain
+ * a glyph for this codepoint.
+ */
+ public abstract int getGlyph(int ucs4);
+
+
+ /**
+ * Reads a CharGlyphMap from an OpenType or TrueType <code>cmap</code>
+ * table. The current implementation works as follows:
+ *
+ * <p><ol><li>If the font has a type 4 cmap for the Unicode platform
+ * (encoding 0, 1, 2, 3 or 4), or a type 4 cmap for the Microsoft
+ * platform (encodings 1 or 10), that table is used to map Unicode
+ * codepoints to glyphs. Most recent fonts, both for Macintosh and
+ * Windows, should provide such a table.</li>
+ *
+ * <li>Otherwise, if the font has any type 0 cmap for the Macintosh
+ * platform, a Unicode-to-glyph mapping is synthesized from certain
+ * type 0 cmaps. The current implementation collects mappings from
+ * Roman, Icelandic, Turkish, Croatian, Romanian, Eastern European,
+ * Cyrillic, Greek, Hebrew, Arabic and Farsi cmaps.</li>.</ol>
+ *
+ * @param buf a buffer whose position is right at the start
+ * of the entire <code>cmap</code> table, and whose limit
+ * is at its end.
+ *
+ * @return a concrete subclass of <code>CharGlyphMap</code>
+ * that performs the mapping.
+ *
+ * @see <a href=
+ * "http://partners.adobe.com/asn/tech/type/opentype/cmap.jsp"
+ * >the <code>cmap</code> part of Adobe&#x2019; OpenType Specification</a>
+ *
+ * @see <a href=
+ * "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6cmap.html"
+ * >the <code>cmap</code> section of Apple&#x2019;s TrueType Reference
+ * Manual</a>
+ */
+ public static CharGlyphMap forTable(ByteBuffer buf)
+ {
+ boolean hasType0 = false;
+ int start4 = -1, platform4 = 0, encoding4 = 0;
+ int start12 = -1, platform12 = 0, encoding12 = 0;
+ int version;
+ int numTables;
+ int tableStart = buf.position();
+ int limit = buf.limit();
+ int format, platform, language, encoding, length, offset;
+
+ version = buf.getChar();
+ if (version != 0)
+ return null;
+
+ numTables = buf.getChar();
+ for (int i = 0; i < numTables; i++)
+ {
+ buf.limit(limit).position(tableStart + 4 + i * 8);
+ platform = buf.getChar();
+ encoding = buf.getChar();
+ offset = tableStart + buf.getInt();
+
+ buf.position(offset);
+ format = buf.getChar();
+
+ switch (format)
+ {
+ case 0:
+ hasType0 = true;
+ break;
+
+ case 4:
+ length = buf.getChar();
+ language = buf.getChar();
+ if ((start4 == -1)
+ && Type4.isSupported(platform, language, encoding))
+ {
+ start4 = offset;
+ platform4 = platform;
+ encoding4 = encoding;
+ }
+ break;
+
+ case 12:
+ if ((start12 == -1) && Type12.isSupported(platform, encoding))
+ {
+ start12 = offset;
+ platform12 = platform;
+ encoding12 = encoding;
+ }
+ break;
+ }
+ }
+
+
+ if (start12 >= 0)
+ {
+ try
+ {
+ buf.limit(limit).position(start12);
+ return new Type12(buf, platform12, encoding12);
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ if (start4 >= 0)
+ {
+ try
+ {
+ buf.limit(limit).position(start4);
+ return Type4.readTable(buf, platform4, encoding4);
+ }
+ catch (Exception ex)
+ {
+ }
+ }
+
+ if (hasType0)
+ {
+ try
+ {
+ buf.limit(limit).position(tableStart);
+ return new Type0(buf);
+ }
+ catch (Exception ex)
+ {
+ }
+ }
+
+ return new Dummy();
+ }
+
+
+ /**
+ * A dummy mapping that maps anything to the undefined glyph.
+ * Used if no other cmap is understood in a font.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+ private static final class Dummy
+ extends CharGlyphMap
+ {
+ public int getGlyph(int ucs4)
+ {
+ return 0;
+ }
+ }
+
+
+ /**
+ * A mapping from Unicode code points to glyph IDs through CMAP Type
+ * 0 tables. These tables have serious limitations: Only the first
+ * 256 glyphs can be addressed, and the source of the mapping is not
+ * Unicode, but an encoding used on the Macintosh.
+ *
+ * <p>However, some fonts have only a Type 0 cmap. In this case, we
+ * process all the Type 0 tables we understand, and establish
+ * a reversed glyph-to-Unicode mapping. When a glyph is requested
+ * for a given Unicode character, we perform a linear search on the
+ * reversed table to find the glyph which maps to the requested
+ * character. While not blazingly fast, this gives a reasonable
+ * fallback for old fonts.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+ private static final class Type0
+ extends CharGlyphMap
+ {
+ /**
+ * An array whose <code>i</code>-th element indicates the
+ * Unicode code point of glyph <code>i</code> in the font.
+ */
+ private char[] glyphToUCS2 = new char[256];
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Arabic encoding.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/ARABIC.TXT"
+ * >the Unicode mapping table for the MacOS Arabic encoding</a>
+ */
+ private static final String UPPER_ARABIC
+ = "\u007e\u0000\u00c4\u00a0\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1"
+ + "\u00e0\u00e2\u00e4\u06ba\u00ab\u00e7\u00e9\u00e8\u00ea\u00eb"
+ + "\u00ed\u2026\u00ee\u00ef\u00f1\u00f3\u00bb\u00f4\u00f6\u00f7"
+ + "\u00fa\u00f9\u00fb\u00fc\u0020\u0021\"\u0023\u0024\u066a"
+ + "\u0026\u0027\u0028\u0029\u002a\u002b\u060c\u002d\u002e\u002f"
+ + "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669"
+ + "\u003a\u061b\u003c\u003d\u003e\u061f\u274a\u0621\u0622\u0623"
+ + "\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d"
+ + "\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637"
+ + "\u0638\u0639\u063a\u005b\\\u005d\u005e\u005f\u0640\u0641"
+ + "\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u064b"
+ + "\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u067e\u0679\u0686"
+ + "\u06d5\u06a4\u06af\u0688\u0691\u007b\u007c\u007d\u0698\u06d2";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS East European Roman encoding.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/CENTEURO.TXT"
+ * >the Unicode mapping table for the MacOS Central European
+ * encoding</a>
+ */
+ private static final String UPPER_EAST_EUROPEAN_ROMAN
+ = "\u007e\u0000\u00c4\u0100\u0101\u00c9\u0104\u00d6\u00dc\u00e1"
+ + "\u0105\u010c\u00e4\u010d\u0106\u0107\u00e9\u0179\u017a\u010e"
+ + "\u00ed\u010f\u0112\u0113\u0116\u00f3\u0117\u00f4\u00f6\u00f5"
+ + "\u00fa\u011a\u011b\u00fc\u2020\u00b0\u0118\u00a3\u00a7\u2022"
+ + "\u00b6\u00df\u00ae\u00a9\u2122\u0119\u00a8\u2260\u0123\u012e"
+ + "\u012f\u012a\u2264\u2265\u012b\u0136\u2202\u2211\u0142\u013b"
+ + "\u013c\u013d\u013e\u0139\u013a\u0145\u0146\u0143\u00ac\u221a"
+ + "\u0144\u0147\u2206\u00ab\u00bb\u2026\u00a0\u0148\u0150\u00d5"
+ + "\u0151\u014c\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca"
+ + "\u014d\u0154\u0155\u0158\u2039\u203a\u0159\u0156\u0157\u0160"
+ + "\u201a\u201e\u0161\u015a\u015b\u00c1\u0164\u0165\u00cd\u017d"
+ + "\u017e\u016a\u00d3\u00d4\u016b\u016e\u00da\u016f\u0170\u0171"
+ + "\u0172\u0173\u00dd\u00fd\u0137\u017b\u0141\u017c\u0122\u02c7";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Roman encoding for the Croatian language.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/CROATIAN.TXT"
+ * >the Unicode mapping table for the MacOS Croatian encoding</a>
+ */
+ private static final String UPPER_CROATIAN
+ = "\u007e\u0000\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1"
+ + "\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb"
+ + "\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5"
+ + "\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022"
+ + "\u00b6\u00df\u00ae\u0160\u2122\u00b4\u00a8\u2260\u017d\u00d8"
+ + "\u221e\u00b1\u2264\u2265\u2206\u00b5\u2202\u2211\u220f\u0161"
+ + "\u222b\u00aa\u00ba\u03a9\u017e\u00f8\u00bf\u00a1\u00ac\u221a"
+ + "\u0192\u2248\u0106\u00ab\u010c\u2026\u00a0\u00c0\u00c3\u00d5"
+ + "\u0152\u0153\u0110\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca"
+ + "\uf8ff\u00a9\u2044\u20ac\u2039\u203a\u00c6\u00bb\u2013\u00b7"
+ + "\u201a\u201e\u2030\u00c2\u0107\u00c1\u010d\u00c8\u00cd\u00ce"
+ + "\u00cf\u00cc\u00d3\u00d4\u0111\u00d2\u00da\u00db\u00d9\u0131"
+ + "\u02c6\u02dc\u00af\u03c0\u00cb\u02da\u00b8\u00ca\u00e6\u02c7";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Cyrillic encoding.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/CYRILLIC.TXT"
+ * >the Unicode mapping table for the MacOS Cyrillic encoding</a>
+ */
+ private static final String UPPER_CYRILLIC
+ = "\u007e\u0000\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417"
+ + "\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421"
+ + "\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b"
+ + "\u042c\u042d\u042e\u042f\u2020\u00b0\u0490\u00a3\u00a7\u2022"
+ + "\u00b6\u0406\u00ae\u00a9\u2122\u0402\u0452\u2260\u0403\u0453"
+ + "\u221e\u00b1\u2264\u2265\u0456\u00b5\u0491\u0408\u0404\u0454"
+ + "\u0407\u0457\u0409\u0459\u040a\u045a\u0458\u0405\u00ac\u221a"
+ + "\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u040b\u045b\u040c"
+ + "\u045c\u0455\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u201e"
+ + "\u040e\u045e\u040f\u045f\u2116\u0401\u0451\u044f\u0430\u0431"
+ + "\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b"
+ + "\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445"
+ + "\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u20ac";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Arabic encoding with the Farsi language.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/FARSI.TXT"
+ * >the Unicode mapping table for the MacOS Farsi encoding</a>
+ */
+ private static final String UPPER_FARSI
+ = "\u007e\u0000\u00c4\u00a0\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1"
+ + "\u00e0\u00e2\u00e4\u06ba\u00ab\u00e7\u00e9\u00e8\u00ea\u00eb"
+ + "\u00ed\u2026\u00ee\u00ef\u00f1\u00f3\u00bb\u00f4\u00f6\u00f7"
+ + "\u00fa\u00f9\u00fb\u00fc\u0020\u0021\"\u0023\u0024\u066a"
+ + "\u0026\u0027\u0028\u0029\u002a\u002b\u060c\u002d\u002e\u002f"
+ + "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9"
+ + "\u003a\u061b\u003c\u003d\u003e\u061f\u274a\u0621\u0622\u0623"
+ + "\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d"
+ + "\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637"
+ + "\u0638\u0639\u063a\u005b\\\u005d\u005e\u005f\u0640\u0641"
+ + "\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u064b"
+ + "\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u067e\u0679\u0686"
+ + "\u06d5\u06a4\u06af\u0688\u0691\u007b\u007c\u007d\u0698\u06d2";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Greek encoding.
+ *
+ * @see <a
+ * href="http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/GREEK.TXT"
+ * >the Unicode mapping table for the MacOS Greek encoding</a>
+ */
+ private static final String UPPER_GREEK
+ = "\u007e\u0000\u00c4\u00b9\u00b2\u00c9\u00b3\u00d6\u00dc\u0385"
+ + "\u00e0\u00e2\u00e4\u0384\u00a8\u00e7\u00e9\u00e8\u00ea\u00eb"
+ + "\u00a3\u2122\u00ee\u00ef\u2022\u00bd\u2030\u00f4\u00f6\u00a6"
+ + "\u20ac\u00f9\u00fb\u00fc\u2020\u0393\u0394\u0398\u039b\u039e"
+ + "\u03a0\u00df\u00ae\u00a9\u03a3\u03aa\u00a7\u2260\u00b0\u00b7"
+ + "\u0391\u00b1\u2264\u2265\u00a5\u0392\u0395\u0396\u0397\u0399"
+ + "\u039a\u039c\u03a6\u03ab\u03a8\u03a9\u03ac\u039d\u00ac\u039f"
+ + "\u03a1\u2248\u03a4\u00ab\u00bb\u2026\u00a0\u03a5\u03a7\u0386"
+ + "\u0388\u0153\u2013\u2015\u201c\u201d\u2018\u2019\u00f7\u0389"
+ + "\u038a\u038c\u038e\u03ad\u03ae\u03af\u03cc\u038f\u03cd\u03b1"
+ + "\u03b2\u03c8\u03b4\u03b5\u03c6\u03b3\u03b7\u03b9\u03be\u03ba"
+ + "\u03bb\u03bc\u03bd\u03bf\u03c0\u03ce\u03c1\u03c3\u03c4\u03b8"
+ + "\u03c9\u03c2\u03c7\u03c5\u03b6\u03ca\u03cb\u0390\u03b0\u00ad";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Hebrew encoding.
+ *
+ * <p>The codepoint 0x81 (HEBREW LIGATURE YIDDISH YOD YOD PATAH)
+ * has no composed Unicode equivalent, but is expressed as the
+ * sequence U+05F2 U+05B7 in Unicode. A similar situation exists
+ * with the codepoint 0xC0 (HEBREW LIGATURE LAMED HOLAM), which
+ * MacOS converts to U+F86A U+05DC U+05B9. To correctly deal
+ * with these sequences, we probably should synthesize a ligature
+ * table if a Hebrew font only provides a Type 0 CMAP.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/HEBREW.TXT"
+ * >the Unicode mapping table for the MacOS Hebrew encoding</a>
+ */
+ private static final String UPPER_HEBREW
+ = "\u007e\u0000\u00c4\u0000\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1"
+ + "\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb"
+ + "\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5"
+ + "\u00fa\u00f9\u00fb\u00fc\u0020\u0021\"\u0023\u0024\u0025"
+ + "\u20aa\u0027\u0029\u0028\u002a\u002b\u002c\u002d\u002e\u002f"
+ + "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039"
+ + "\u003a\u003b\u003c\u003d\u003e\u003f\u0000\u201e\uf89b\uf89c"
+ + "\uf89d\uf89e\u05bc\ufb4b\ufb35\u2026\u00a0\u05b8\u05b7\u05b5"
+ + "\u05b6\u05b4\u2013\u2014\u201c\u201d\u2018\u2019\ufb2a\ufb2b"
+ + "\u05bf\u05b0\u05b2\u05b1\u05bb\u05b9\u0000\u05b3\u05d0\u05d1"
+ + "\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db"
+ + "\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5"
+ + "\u05e6\u05e7\u05e8\u05e9\u05ea\u007d\u005d\u007b\u005b\u007c";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Roman encoding with the Icelandic language.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/ICELAND.TXT"
+ * >the Unicode mapping table for the MacOS Icelandic encoding</a>
+ */
+ private static final String UPPER_ICELANDIC
+ = "\u007e\u0000\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1"
+ + "\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb"
+ + "\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5"
+ + "\u00fa\u00f9\u00fb\u00fc\u00dd\u00b0\u00a2\u00a3\u00a7\u2022"
+ + "\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8"
+ + "\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0"
+ + "\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a"
+ + "\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5"
+ + "\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca"
+ + "\u00ff\u0178\u2044\u20ac\u00d0\u00f0\u00de\u00fe\u00fd\u00b7"
+ + "\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce"
+ + "\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\u0131"
+ + "\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Roman encoding for most languages. Exceptions include
+ * Croatian, Icelandic, Romanian, and Turkish.
+ *
+ * @see <a
+ * href="http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/ROMAN.TXT"
+ * >the Unicode mapping table for the MacOS Roman encoding</a>
+ */
+ private static final String UPPER_ROMAN
+ = "\u007e\u0000\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1"
+ + "\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb"
+ + "\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5"
+ + "\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022"
+ + "\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8"
+ + "\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0"
+ + "\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a"
+ + "\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5"
+ + "\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca"
+ + "\u00ff\u0178\u2044\u20ac\u2039\u203a\ufb01\ufb02\u2021\u00b7"
+ + "\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce"
+ + "\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\u0131"
+ + "\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Roman encoding with the Romanian language.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/ROMANIAN.TXT"
+ * >the Unicode mapping table for the MacOS Romanian encoding</a>
+ */
+ private static final String UPPER_ROMANIAN
+ = "\u007e\u0000\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1"
+ + "\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb"
+ + "\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5"
+ + "\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022"
+ + "\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u0102\u0218"
+ + "\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0"
+ + "\u222b\u00aa\u00ba\u03a9\u0103\u0219\u00bf\u00a1\u00ac\u221a"
+ + "\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5"
+ + "\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca"
+ + "\u00ff\u0178\u2044\u20ac\u2039\u203a\u021a\u021b\u2021\u00b7"
+ + "\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce"
+ + "\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\u0131"
+ + "\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7";
+
+
+ /**
+ * A String whose <code>charAt(i)</code> is the Unicode character
+ * that corresponds to the codepoint <code>i + 127</code> in the
+ * MacOS Roman encoding with the Turkish language.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/TURKISH.TXT"
+ * >the Unicode mapping table for the MacOS Turkish encoding</a>
+ */
+ private static final String UPPER_TURKISH
+ = "\u007e\u0000\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1"
+ + "\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb"
+ + "\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5"
+ + "\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022"
+ + "\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8"
+ + "\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0"
+ + "\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a"
+ + "\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5"
+ + "\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca"
+ + "\u00ff\u0178\u011e\u011f\u0130\u0131\u015e\u015f\u2021\u00b7"
+ + "\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce"
+ + "\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\uf8a0"
+ + "\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7";
+
+
+ /**
+ * Constructs a CharGlyphMap.Type0 from all type 0 cmaps provided
+ * by the font. The implementation is able to fuse multiple type
+ * 0 cmaps, such as the MacRoman, Turkish, Icelandic and Croatian
+ * encoding, into a single map from Unicode characters to glyph
+ * indices.
+ *
+ * @param buf a ByteBuffer whose position is right at the
+ * beginning of the entire cmap table of the font (<i>not</i>
+ * at some subtable).
+ */
+ public Type0(ByteBuffer buf)
+ {
+ int numTables;
+ int tableStart = buf.position();
+ int limit = buf.limit();
+
+ /* The CMAP version must be 0. */
+ if (buf.getChar() != 0)
+ throw new IllegalStateException();
+
+ numTables = buf.getChar();
+ for (int i = 0; i < numTables; i++)
+ {
+ buf.limit(limit).position(tableStart + 4 + i * 8);
+ int platform = buf.getChar();
+ int encoding = buf.getChar();
+ int offset = tableStart + buf.getInt();
+
+ buf.position(offset);
+ int format = buf.getChar();
+ int length = buf.getChar();
+ buf.limit(offset + length);
+ int language = buf.getChar();
+
+ if (format == 0)
+ readSingleTable(buf, platform, language, encoding);
+ }
+ }
+
+
+ /**
+ * Processes a CMAP Type 0 table whose platform, encoding and
+ * language are already known.
+ *
+ * @param buf the buffer to read the table from, positioned
+ * right after the language tag.
+ */
+ private void readSingleTable(ByteBuffer buf,
+ int platform, int language,
+ int encoding)
+ {
+ String upper = getUpper129(platform, encoding, language);
+ if (upper == null)
+ return;
+
+ /* Skip the MacOS codepoints [0 .. 31] because they do not
+ * correspond to any Unicode codepoint.
+ */
+ buf.position(buf.position() + 32);
+
+ /* Irrespective of script and language, the MacOS codepoints
+ * [32 .. 126] correspond to the same Unicode codepoint.
+ */
+ for (int i = 32; i < 126; i++)
+ glyphToUCS2[buf.get() & 0xff] = (char) i;
+
+ for (int i = 127; i < 256; i++)
+ glyphToUCS2[buf.get() & 0xff] = upper.charAt(i - 127);
+
+ /* Glyph 0 is always the undefined character, which has
+ * no codepoint in Unicode.
+ */
+ glyphToUCS2[0] = 0;
+ }
+
+
+ /**
+ * Determines the glyph index for a given Unicode codepoint.
+ *
+ * @param ucs4 the Unicode codepoint in UCS-4 encoding.
+ *
+ * @return the glyph index, or 0 if the font does not contain
+ * a glyph for this codepoint.
+ */
+ public int getGlyph(int ucs4)
+ {
+ /* This linear search is not exactly super fast. However,
+ * only really ancient fonts have only a type 0 cmap,
+ * so it should not hurt in very many cases. If it shows
+ * to be a performance problem, one could do a binary search
+ * on a 256-entry table sorted by Unicode codepoint. The
+ * matching index of that table could then be used to look
+ * up the glyph ID at that position.
+ */
+ for (int i = 0; i < 256; i++)
+ if (glyphToUCS2[i] == ucs4)
+ return i;
+ return 0;
+ }
+
+
+ /**
+ * Returns a String whose <code>charAt(i)</code> is the Unicode
+ * character that corresponds to the codepoint <code>i +
+ * 127</code> in the encoding specified by the platform, script
+ * and language tag of a Type 0 CMAP.
+ *
+ * @param language the language tag in the cmap subtable. For the
+ * Macintosh platform, this is 0 to indicate language-neutral
+ * encoding, or the MacOS language code <i>plus one.</i> The
+ * Apple documentation does not mention that one needs to be
+ * added, but the Adobe OpenType specification does.
+ *
+ * @return a String for mapping the top 129 characters to
+ * UCS-2. If <code>platform</code> is not <code>1</code>
+ * (indicating Macintosh), or if the combination of
+ * <code>script</code> and <code>language</code> is not
+ * recognized, <code>null</code> will be returned.
+ */
+ private static String getUpper129(int platform, int script, int language)
+ {
+ if (platform != PLATFORM_MACINTOSH)
+ return null;
+
+ switch (script)
+ {
+ case 0: /* smRoman */
+ if (language == /* langIcelandic+1 */ 16)
+ return UPPER_ICELANDIC;
+ else if (language == /* langTurkish+1 */ 18)
+ return UPPER_TURKISH;
+ else if (language == /* langCroatian+1 */ 19)
+ return UPPER_CROATIAN;
+ else if (language == /* langRomanian+1 */ 38)
+ return UPPER_ROMANIAN;
+ else if (language == /* language-neutral */ 0)
+ return UPPER_ROMAN;
+ else
+ return null;
+
+ case 4: /* smArabic */
+ if (language == /* langFarsi+1 */ 32)
+ return UPPER_FARSI;
+ else
+ return UPPER_ARABIC;
+
+ case 5: /* smHebrew */
+ return UPPER_HEBREW;
+
+ case 6: /* smGreek */
+ return UPPER_GREEK;
+
+ case 7: /* smCyrillic */
+ return UPPER_CYRILLIC;
+
+ case 29: /* smSlavic == smEastEurRoman */
+ return UPPER_EAST_EUROPEAN_ROMAN;
+ }
+
+ return null;
+ }
+ }
+
+
+ /**
+ * A mapping from Unicode code points to glyph IDs through CMAP Type
+ * 4 tables. These tables are able to map two-byte encoded text
+ * to glyph IDs, such as Unicode Basic Multilingual Plane which
+ * contains U+0000 .. U+FFFE without surrogates.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+ private static final class Type4
+ extends CharGlyphMap
+ {
+ /**
+ * Determines whether this implementation supports a combination
+ * of platform, language and encoding is supported for a type 4
+ * <code>cmap</code> table.
+ *
+ * <p>Currently, we support the following combinations:
+ *
+ * <ul><li>the Unicode platform in encodings 0, 1, 2, 3 and
+ * 4;</li>
+ *
+ * <li>the Microsoft platform in encodings 1 (Basic Multilingual
+ * Plane) and 10 (full Unicode).</li></ul>
+ *
+ * <p>Most recent Macintosh fonts provide a type 4
+ * <code>cmap</code> for Unicode. Microsoft recommends providing a
+ * type 4 <code>cmap</code> for encoding 1 of the Microsoft
+ * platform. The implementation of GNU Classpath supports both
+ * variants.
+ *
+ * <p>Not supported are ShiftJIS, Big5, Wansung, Johab, and other
+ * non-Unicode encodings. Text can easily be converted to Unicode
+ * using the java.nio.charset package.
+ */
+ static boolean isSupported(int platform, int language, int encoding)
+ {
+ switch (platform)
+ {
+ case PLATFORM_UNICODE:
+ return (encoding >= 0) && (encoding <= 4);
+
+ case PLATFORM_MICROSOFT:
+ return (encoding == /* Basic Multilingual Plane */ 1)
+ || (encoding == /* Full Unicode */ 10);
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Processes a CMAP Type 4 table whose platform, encoding and
+ * language are already known. We understand the Unicode platform
+ * with encodings 0, 1, 2, 3 and 4, and the Microsoft platform
+ * with encodings 1 (Unicode BMP) and 10 (UCS-4).
+ *
+ * @param buf the buffer to read the table from, positioned at
+ * its beginning.
+ *
+ * @return a Type4 table, or <code>null</code> if the combination
+ * of platform and encoding is not understood.
+ */
+ static Type4 readTable(ByteBuffer buf,
+ int platform, int encoding)
+ {
+ int tableStart = buf.position();
+ char format = buf.getChar();
+ int length = buf.getChar();
+ int language = buf.getChar();
+
+ if ((format != 4) || !isSupported(platform, language, encoding))
+ throw new IllegalArgumentException();
+
+ buf.limit(tableStart + length);
+
+ int segCountX2 = buf.getChar();
+ int segCount = segCountX2 / 2;
+ int searchRange = buf.getChar();
+ int entrySelector = buf.getChar();
+ int rangeShift = buf.getChar();
+
+ CharBuffer endCode, startCode, idRangeOffset_glyphID;
+ ShortBuffer idDelta;
+
+ int pos = buf.position();
+ endCode = buf.asCharBuffer();
+ pos += segCountX2 + /* reservedPad */ 2;
+
+ buf.position(pos);
+ startCode = buf.asCharBuffer();
+ pos += segCountX2;
+
+ buf.position(pos);
+ idDelta = buf.asShortBuffer();
+ pos += segCountX2;
+
+ buf.position(pos);
+ idRangeOffset_glyphID = buf.asCharBuffer();
+
+ endCode.limit(segCount);
+ startCode.limit(segCount);
+ idDelta.limit(segCount);
+ idRangeOffset_glyphID.limit((buf.limit() - pos) / 2);
+
+ return new Type4(segCount,
+ endCode, startCode, idDelta,
+ idRangeOffset_glyphID);
+ }
+
+
+ private CharBuffer lastChar;
+ private CharBuffer firstChar;
+ private ShortBuffer idDelta;
+ private CharBuffer rangeID;
+ private int numSegments;
+
+ private Type4(int numSegments,
+ CharBuffer lastChar, CharBuffer firstChar,
+ ShortBuffer idDelta, CharBuffer rangeID)
+ {
+ this.numSegments = numSegments;
+ this.lastChar = lastChar;
+ this.firstChar = firstChar;
+ this.idDelta = idDelta;
+ this.rangeID = rangeID;
+ }
+
+
+ /**
+ * Determines the glyph index for a given Unicode codepoint.
+ *
+ * @param ucs4 the Unicode codepoint in UCS-4 encoding.
+ *
+ * @return the glyph index, or 0 if the font does not contain
+ * a glyph for this codepoint.
+ */
+ public int getGlyph(int ucs4)
+ {
+ char c, segStart;
+ int segment, idRangeOffset;
+
+ if (ucs4 > 0xffff)
+ return 0;
+
+ c = (char) ucs4;
+ segment = find(c);
+ segStart = firstChar.get(segment);
+ if ((c < segStart) || (c > lastChar.get(segment)))
+ return 0;
+
+ /*
+ * System.out.println("seg " + segment
+ * + ", range=" + (int) rangeID[segment]
+ * + ", delta=" + delta[segment]);
+ */
+
+ idRangeOffset = rangeID.get(segment);
+ if (idRangeOffset == 0)
+ return (int) (char) (((int) c) + idDelta.get(segment));
+ int result = rangeID.get((idRangeOffset >> 1)
+ + (c - segStart) + segment);
+ if (result == 0)
+ return 0;
+ return (int) (char) (result + idDelta.get(segment));
+ }
+
+
+ private int find(char c)
+ {
+ int min, max, mid;
+
+ min = 0;
+ max = numSegments - 1;
+ mid = max >> 1;
+
+ while (min < max)
+ {
+ // System.out.println("(" + min + "," + max + ") " + mid);
+ char val = lastChar.get(mid);
+ if (val == c)
+ break;
+ else if (val < c)
+ min = mid + 1;
+ else if (val > c)
+ max = mid;
+ mid = (min + max) >> 1;
+ }
+
+ return mid;
+ }
+ }
+
+
+ /**
+ * A mapping from Unicode code points to glyph IDs through CMAP Type
+ * 12 tables. These tables are able to map four-byte encoded text
+ * to glyph IDs, such as Unicode UCS-4.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+ private static final class Type12
+ extends CharGlyphMap
+ {
+ int numGroups;
+ IntBuffer data;
+
+
+ /**
+ * Determines whether this implementation supports a combination
+ * of platform and encoding for a type 12 <code>cmap</code> table.
+ *
+ * <p>Currently, we support the following combinations:
+ *
+ * <ul><li>the Unicode platform in encodings 0, 1, 2, 3 and
+ * 4;</li>
+ *
+ * <li>the Microsoft platform in encodings 1 (Basic Multilingual
+ * Plane) and 10 (full Unicode).</li></ul>
+ */
+ static boolean isSupported(int platform, int encoding)
+ {
+ switch (platform)
+ {
+ case PLATFORM_UNICODE:
+ return (encoding >= 0) && (encoding <= 4);
+
+ case PLATFORM_MICROSOFT:
+ return (encoding == /* Basic Multilingual Plane */ 1)
+ || (encoding == /* Full Unicode */ 10);
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Constructs a <code>cmap</code> type 12 table whose platform and
+ * encoding are already known. We understand the Unicode platform
+ * with encodings 0, 1, 2, 3 and 4, and the Microsoft platform
+ * with encodings 1 (Unicode BMP) and 10 (UCS-4).
+ *
+ * @param buf the buffer to read the table from, positioned at
+ * its beginning.
+ */
+ Type12(ByteBuffer buf, int platform, int encoding)
+ {
+ int tableStart = buf.position();
+ int format = buf.getChar();
+ if ((format != 12) || !isSupported(platform, encoding))
+ throw new IllegalStateException();
+
+ buf.getChar(); // skip reserved field
+ buf.limit(tableStart + buf.getInt());
+ int language = buf.getInt();
+ numGroups = buf.getInt();
+ data = buf.asIntBuffer();
+ }
+
+
+ /**
+ * Determines the glyph index for a given Unicode codepoint. Users
+ * should be aware that the character-to-glyph mapping not not
+ * everything that is needed for full Unicode support. For example,
+ * the <code>cmap</code> table is not able to synthesize accented
+ * glyphs from the canonical decomposition sequence, even if the
+ * font would contain a glyph for the composed form.
+ *
+ * @param ucs4 the Unicode codepoint in UCS-4 encoding. Surrogates
+ * (U+D800 to U+DFFF) cannot be passed, they must be mapped to
+ * UCS-4 first.
+ *
+ * @return the glyph index, or 0 if the font does not contain
+ * a glyph for this codepoint.
+ */
+ public int getGlyph(int ucs4)
+ {
+ int min, max, mid, startCharCode, endCharCode;
+
+ min = 0;
+ max = numGroups - 1;
+ mid = max >> 1;
+ do
+ {
+ startCharCode = data.get(3 * mid);
+ endCharCode = data.get(3 * mid + 1);
+
+
+ /*
+ System.out.println("group " + mid + " (U+"
+ + Integer.toHexString(startCharCode)
+ + " .. U+" + Integer.toHexString(endCharCode)
+ + "): glyph " + (int) data.get(mid*3+2));
+ */
+
+ if ((startCharCode <= ucs4) && (ucs4 <= endCharCode))
+ return ucs4
+ - startCharCode
+ + /* startGlyphID */ data.get(mid * 3 + 2);
+
+ if (endCharCode < ucs4)
+ min = mid + 1;
+ else
+ max = mid;
+ mid = (min + max) >> 1;
+ }
+ while (min < max);
+
+ startCharCode = data.get(3 * mid);
+ endCharCode = data.get(3 * mid + 1);
+ if ((startCharCode <= ucs4) && (ucs4 <= endCharCode))
+ return ucs4
+ - startCharCode
+ + /* startGlyphID */ data.get(mid * 3 + 2);
+
+ return 0;
+ }
+ }
+}
diff --git a/gnu/java/awt/font/opentype/GlyphNamer.java b/gnu/java/awt/font/opentype/GlyphNamer.java
new file mode 100644
index 000000000..ea4b8e2a1
--- /dev/null
+++ b/gnu/java/awt/font/opentype/GlyphNamer.java
@@ -0,0 +1,1133 @@
+/* GlyphNamer.java -- Provides glyph names.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype;
+
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+import java.nio.CharBuffer;
+
+
+/**
+ * Provides names for glyphs, which is useful when embedding fonts
+ * in PostScript or PDF documents.
+ *
+ * <p>If the font has a <code>Zapf</code> table, it is used to map
+ * glyph IDs back to a sequence of Unicode codepoints, which then
+ * makes it possible to look up or synthesize a PostScript glyph name
+ * according to Adobe&#x2019;s conventions. This allows to extract the
+ * original text from the generated PDF or PostScript file, which is
+ * important for indexing, searching and extracting.
+ *
+ * <p>Otherwise, glyph names are taken from the <a href=
+ * "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6post.html"
+ * ><code>post</code> table</a>. All known formats (1, 2, 2.5, 3 and
+ * 4) are supported.
+ *
+ * <p><b>Open Tasks:</b> The code could be cleaner structured by
+ * having separate sub-classes for each variant of the POST table.
+ * Also, the implementation should not read in all glyph names if a
+ * font provides them in a POST table of type 2. It would be
+ * sufficient to just read in the offsets and delay the String
+ * fetching and conversion to the time when the glyph name is actually
+ * requested.
+ *
+ * <p><b>Lack of Thread Safety:</b> The GlyphNamer class is
+ * intentionally <i>not</i> safe to access from multiple concurrent
+ * threads. Synchronization needs to be performed externally. Usually,
+ * the font has already obtained a lock before calling the GlyphNamer.
+ * It would thus be wasteful to acquire additional locks for the
+ * GlyphNamer.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+final class GlyphNamer
+{
+ /**
+ * The 'post' table of the font.
+ */
+ private ByteBuffer postTable;
+
+
+ /**
+ * The 'Zapf' table of the font, or null if the font has no
+ * such table.
+ */
+ private ByteBuffer zapfTable;
+
+
+ /**
+ * The offset of each glyph relative to the Zapf table,
+ * or null if the font does not have a Zapf table.
+ */
+ private IntBuffer zapfOffsets;
+
+
+ /**
+ * The offset from the start of the Zapf table to the start
+ * of the extra info area.
+ */
+ private int zapfExtraInfo;
+
+
+ /**
+ * The format of the post table, a Fixed 16.16 number.
+ */
+ private int postFormat;
+
+
+ /**
+ * An array of glyph names. Used for table formats 1, 2, 2.5.
+ */
+ private String[] glyphNames;
+
+
+ /**
+ * An array from glyph to character codes. Similar to the
+ * workings of a Zapf table, but maps to CID instead of
+ * Unicode. Used for table format 4.
+ */
+ private CharBuffer glyphCharacterCodes;
+
+
+ /**
+ * The PostScript names of the 258 standard Macintosh glyphs. Note
+ * that some of these glyphs are not in the Adobe Standard Glyph
+ * List for New Fonts, namely .notdef, .null, nonmarkingreturn,
+ * nonbreakingspace, apple, onesuperior, twosuperior, and
+ * threesuperior.
+ */
+ private static final String[] STANDARD_POSTSCRIPT_GLYPH_NAMES =
+ {
+ ".notdef", // glyph #0
+ ".null", // glyph #1
+ "nonmarkingreturn", // glyph #2
+ "space", // glyph #3
+ "exclam", // glyph #4
+ "quotedbl", // glyph #5
+ "numbersign", // glyph #6
+ "dollar", // glyph #7
+ "percent", // glyph #8
+ "ampersand", // glyph #9
+ "quotesingle", // glyph #10
+ "parenleft", // glyph #11
+ "parenright", // glyph #12
+ "asterisk", // glyph #13
+ "plus", // glyph #14
+ "comma", // glyph #15
+ "hyphen", // glyph #16
+ "period", // glyph #17
+ "slash", // glyph #18
+ "zero", // glyph #19
+ "one", // glyph #20
+ "two", // glyph #21
+ "three", // glyph #22
+ "four", // glyph #23
+ "five", // glyph #24
+ "six", // glyph #25
+ "seven", // glyph #26
+ "eight", // glyph #27
+ "nine", // glyph #28
+ "colon", // glyph #29
+ "semicolon", // glyph #30
+ "less", // glyph #31
+ "equal", // glyph #32
+ "greater", // glyph #33
+ "question", // glyph #34
+ "at", // glyph #35
+ "A", // glyph #36
+ "B", // glyph #37
+ "C", // glyph #38
+ "D", // glyph #39
+ "E", // glyph #40
+ "F", // glyph #41
+ "G", // glyph #42
+ "H", // glyph #43
+ "I", // glyph #44
+ "J", // glyph #45
+ "K", // glyph #46
+ "L", // glyph #47
+ "M", // glyph #48
+ "N", // glyph #49
+ "O", // glyph #50
+ "P", // glyph #51
+ "Q", // glyph #52
+ "R", // glyph #53
+ "S", // glyph #54
+ "T", // glyph #55
+ "U", // glyph #56
+ "V", // glyph #57
+ "W", // glyph #58
+ "X", // glyph #59
+ "Y", // glyph #60
+ "Z", // glyph #61
+ "bracketleft", // glyph #62
+ "backslash", // glyph #63
+ "bracketright", // glyph #64
+ "asciicircum", // glyph #65
+ "underscore", // glyph #66
+ "grave", // glyph #67
+ "a", // glyph #68
+ "b", // glyph #69
+ "c", // glyph #70
+ "d", // glyph #71
+ "e", // glyph #72
+ "f", // glyph #73
+ "g", // glyph #74
+ "h", // glyph #75
+ "i", // glyph #76
+ "j", // glyph #77
+ "k", // glyph #78
+ "l", // glyph #79
+ "m", // glyph #80
+ "n", // glyph #81
+ "o", // glyph #82
+ "p", // glyph #83
+ "q", // glyph #84
+ "r", // glyph #85
+ "s", // glyph #86
+ "t", // glyph #87
+ "u", // glyph #88
+ "v", // glyph #89
+ "w", // glyph #90
+ "x", // glyph #91
+ "y", // glyph #92
+ "z", // glyph #93
+ "braceleft", // glyph #94
+ "bar", // glyph #95
+ "braceright", // glyph #96
+ "asciitilde", // glyph #97
+ "Adieresis", // glyph #98
+ "Aring", // glyph #99
+ "Ccedilla", // glyph #100
+ "Eacute", // glyph #101
+ "Ntilde", // glyph #102
+ "Odieresis", // glyph #103
+ "Udieresis", // glyph #104
+ "aacute", // glyph #105
+ "agrave", // glyph #106
+ "acircumflex", // glyph #107
+ "adieresis", // glyph #108
+ "atilde", // glyph #109
+ "aring", // glyph #110
+ "ccedilla", // glyph #111
+ "eacute", // glyph #112
+ "egrave", // glyph #113
+ "ecircumflex", // glyph #114
+ "edieresis", // glyph #115
+ "iacute", // glyph #116
+ "igrave", // glyph #117
+ "icircumflex", // glyph #118
+ "idieresis", // glyph #119
+ "ntilde", // glyph #120
+ "oacute", // glyph #121
+ "ograve", // glyph #122
+ "ocircumflex", // glyph #123
+ "odieresis", // glyph #124
+ "otilde", // glyph #125
+ "uacute", // glyph #126
+ "ugrave", // glyph #127
+ "ucircumflex", // glyph #128
+ "udieresis", // glyph #129
+ "dagger", // glyph #130
+ "degree", // glyph #131
+ "cent", // glyph #132
+ "sterling", // glyph #133
+ "section", // glyph #134
+ "bullet", // glyph #135
+ "paragraph", // glyph #136
+ "germandbls", // glyph #137
+ "registered", // glyph #138
+ "copyright", // glyph #139
+ "trademark", // glyph #140
+ "acute", // glyph #141
+ "dieresis", // glyph #142
+ "notequal", // glyph #143
+ "AE", // glyph #144
+ "Oslash", // glyph #145
+ "infinity", // glyph #146
+ "plusminus", // glyph #147
+ "lessequal", // glyph #148
+ "greaterequal", // glyph #149
+ "yen", // glyph #150
+ "mu", // glyph #151
+ "partialdiff", // glyph #152
+ "summation", // glyph #153
+ "product", // glyph #154
+ "pi", // glyph #155
+ "integral", // glyph #156
+ "ordfeminine", // glyph #157
+ "ordmasculine", // glyph #158
+ "Omega", // glyph #159
+ "ae", // glyph #160
+ "oslash", // glyph #161
+ "questiondown", // glyph #162
+ "exclamdown", // glyph #163
+ "logicalnot", // glyph #164
+ "radical", // glyph #165
+ "florin", // glyph #166
+ "approxequal", // glyph #167
+ "Delta", // glyph #168
+ "guillemotleft", // glyph #169
+ "guillemotright", // glyph #170
+ "ellipsis", // glyph #171
+ "nonbreakingspace", // glyph #172
+ "Agrave", // glyph #173
+ "Atilde", // glyph #174
+ "Otilde", // glyph #175
+ "OE", // glyph #176
+ "oe", // glyph #177
+ "endash", // glyph #178
+ "emdash", // glyph #179
+ "quotedblleft", // glyph #180
+ "quotedblright", // glyph #181
+ "quoteleft", // glyph #182
+ "quoteright", // glyph #183
+ "divide", // glyph #184
+ "lozenge", // glyph #185
+ "ydieresis", // glyph #186
+ "Ydieresis", // glyph #187
+ "fraction", // glyph #188
+ "currency", // glyph #189
+ "guilsinglleft", // glyph #190
+ "guilsinglright", // glyph #191
+ "fi", // glyph #192
+ "fl", // glyph #193
+ "daggerdbl", // glyph #194
+ "periodcentered", // glyph #195
+ "quotesinglbase", // glyph #196
+ "quotedblbase", // glyph #197
+ "perthousand", // glyph #198
+ "Acircumflex", // glyph #199
+ "Ecircumflex", // glyph #200
+ "Aacute", // glyph #201
+ "Edieresis", // glyph #202
+ "Egrave", // glyph #203
+ "Iacute", // glyph #204
+ "Icircumflex", // glyph #205
+ "Idieresis", // glyph #206
+ "Igrave", // glyph #207
+ "Oacute", // glyph #208
+ "Ocircumflex", // glyph #209
+ "apple", // glyph #210
+ "Ograve", // glyph #211
+ "Uacute", // glyph #212
+ "Ucircumflex", // glyph #213
+ "Ugrave", // glyph #214
+ "dotlessi", // glyph #215
+ "circumflex", // glyph #216
+ "tilde", // glyph #217
+ "macron", // glyph #218
+ "breve", // glyph #219
+ "dotaccent", // glyph #220
+ "ring", // glyph #221
+ "cedilla", // glyph #222
+ "hungarumlaut", // glyph #223
+ "ogonek", // glyph #224
+ "caron", // glyph #225
+ "Lslash", // glyph #226
+ "lslash", // glyph #227
+ "Scaron", // glyph #228
+ "scaron", // glyph #229
+ "Zcaron", // glyph #230
+ "zcaron", // glyph #231
+ "brokenbar", // glyph #232
+ "Eth", // glyph #233
+ "eth", // glyph #234
+ "Yacute", // glyph #235
+ "yacute", // glyph #236
+ "Thorn", // glyph #237
+ "thorn", // glyph #238
+ "minus", // glyph #239
+ "multiply", // glyph #240
+ "onesuperior", // glyph #241
+ "twosuperior", // glyph #242
+ "threesuperior", // glyph #243
+ "onehalf", // glyph #244
+ "onequarter", // glyph #245
+ "threequarters", // glyph #246
+ "franc", // glyph #247
+ "Gbreve", // glyph #248
+ "gbreve", // glyph #249
+ "Idotaccent", // glyph #250
+ "Scedilla", // glyph #251
+ "scedilla", // glyph #252
+ "Cacute", // glyph #253
+ "cacute", // glyph #254
+ "Ccaron", // glyph #255
+ "ccaron", // glyph #256
+ "dcroat" // glyph #257
+ };
+
+
+ private GlyphNamer(int numGlyphs,
+ ByteBuffer postTable,
+ ByteBuffer zapfTable)
+ {
+ this.postTable = postTable;
+ this.zapfTable = zapfTable;
+
+ if ((zapfTable != null) && (zapfTable.getInt(0) == 0x00010000))
+ {
+ readZapf(numGlyphs);
+ return;
+ }
+
+ readPost();
+ }
+
+
+ /**
+ * Sets up the information which allows to retrieve the information
+ * on demand.
+ *
+ * @param numGlyphs the number of glyphs in the font. This value
+ * comes from the <code>maxp</code> table.
+ */
+ public static GlyphNamer forTables(int numGlyphs,
+ ByteBuffer postTable,
+ ByteBuffer zapfTable)
+ {
+ return new GlyphNamer(numGlyphs, postTable, zapfTable);
+ }
+
+
+ /**
+ * Retrieves or synthesizes a PostScript name for the glyph.
+ * Although the code is reasonably fast, it is recommended
+ * to cache the results in the printer driver.
+ *
+ * <p>If a font provides a 'Zapf' table, the reverse mapping
+ * from glyph to UTF-16 sequence is performed, and a glyph
+ * name is synthesized following the recommendations by Adobe.
+ * This allows to extract the original text from the generated
+ * PostScript or PDF, which is a requirement for indexing
+ * and searching.
+ *
+ * <p>If a font does not provide a 'Zapf' table, the glyph name
+ * is taken from the 'post' table. Note that some fonts have
+ * wrong data in their post data, in which case the resulting
+ * name will be garbage. Usually, this does not hurt, unless
+ * the user wants to extract text from the generated PostScript
+ * or PDF file. The GNU implementation understands all known
+ * formats of the post table (1, 2, 2.5, 3 and 4).
+ *
+ * @param glyph the index of the glyph whose name is to be
+ * retrieved.
+ *
+ * @return the glyph name, such as <code>A</code>,
+ * <code>gcircumflex</code>, <code>z_uni0302</code>, or
+ * <code>u11C42</code>.</li>
+ */
+ String getGlyphName(int glyph)
+ {
+ if (zapfOffsets != null)
+ {
+ zapfTable.position(zapfOffsets.get(glyph) + 8);
+ int numChars = zapfTable.getChar();
+ char[] chars = new char[numChars];
+ for (int i = 0; i < numChars; i++)
+ chars[i] = zapfTable.getChar();
+ return getGlyphName(chars);
+ }
+
+
+ /* Type 1, Type 2, Type 2.5 */
+ if (glyphNames != null)
+ return glyphNames[glyph];
+
+ /* Type 4: Synthesized glyph name. */
+ if (glyphCharacterCodes != null)
+ return "a" + glyphCharacterCodes.get(glyph);
+
+ /* Type 3: Arbitrary, but unique name for the glyph.
+ *
+ * To find out what a good naming scheme would be, we have printed
+ * a document containing the character U+201C in the font
+ * "Hiragino Kaku Gothic Pro W3" (by Dainippon Screen Mfg. Co.,
+ * Ltd.) on Apple MacOS X 10.1.5. This font has a type 3 'post'
+ * table, and its 'cmap' maps U+201C to glyph #108. The generated
+ * PostScript file defined a character whose name was "g108".
+ *
+ * Therefore, we use 'g' as name prefix. According to the
+ * TrueType/OpenType specification, it should not matter what
+ * prefix we use. On the other hand, it does not hurt either to be
+ * compatible with a good printer driver.
+ *
+ * Actually, that specific font also contains a 'Zapf' table,
+ * which allows to generate glyph names according to Adobe's
+ * conventions, so that extracting text from and searching in the
+ * generated PostScript or PDF becomes possible. While the Apple
+ * PostScript printer driver does not seem to use the 'Zapf' table
+ * for this purpose, we do.
+ */
+ return "g" + glyph;
+ }
+
+
+ /**
+ * Sets up some buffers which allow to quickly read information from
+ * the Zapf table.
+ *
+ * @see <a href=
+ * "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6Zapf.html">
+ * Apple&#x2019;s documentation of the <code>Zapf</code> table</a>
+ */
+ private void readZapf(int numGlyphs)
+ {
+ zapfExtraInfo = zapfTable.getInt(4);
+ zapfTable.position(8);
+ zapfOffsets = zapfTable.asIntBuffer();
+ zapfOffsets.limit(numGlyphs);
+ }
+
+
+ /**
+ * Reads in the PostScript data from a <code>post</code> table of a
+ * TrueType or OpenType font. The implementation currently
+ * understands the table formats 1, 2, 2.5, 3, and 4.
+ */
+ private void readPost()
+ {
+ int numGlyphs, nameIndex, maxNameIndex;
+ char[] nameIndices;
+ String[] names;
+ byte[] pascalName;
+
+ postTable.position(0);
+ postFormat = postTable.getInt();
+ switch (postFormat)
+ {
+ case 0x00010000:
+ glyphNames = STANDARD_POSTSCRIPT_GLYPH_NAMES;
+ return;
+
+ case 0x00020000:
+ postTable.position(32);
+ numGlyphs = postTable.getChar();
+ glyphNames = new String[numGlyphs];
+ pascalName = new byte[255];
+ nameIndices = new char[numGlyphs];
+ maxNameIndex = 0;
+ for (int i = 0; i < numGlyphs; i++)
+ maxNameIndex = Math.max(maxNameIndex,
+ nameIndices[i] = postTable.getChar());
+
+ names = new String[Math.max(maxNameIndex - 258 + 1, 0)];
+ for (int i = 258; i <= maxNameIndex; i++)
+ {
+ int nameLen = (postTable.get() & 0xff);
+ postTable.get(pascalName, 0, nameLen);
+ names[i - 258] = new String(pascalName, 0, nameLen);
+ }
+ for (int i = 0; i < numGlyphs; i++)
+ {
+ nameIndex = nameIndices[i];
+ if (nameIndex < 258)
+ glyphNames[i] = STANDARD_POSTSCRIPT_GLYPH_NAMES[nameIndex];
+ else
+ glyphNames[i] = names[nameIndex - 258];
+ }
+ return;
+
+ case 0x00025000: // in case some font has a wrong representation of 2.5
+ case 0x00028000:
+ /* Format 2.5 is a re-ordering of the standard names. It has
+ * been deprecated in February 2000, but might still occasionally
+ * float around. Since it can be supported with so little code,
+ * we do so.
+ */
+ postTable.position(32);
+ numGlyphs = postTable.getChar();
+ glyphNames = new String[numGlyphs];
+ for (int i = 0; i < numGlyphs; i++)
+ glyphNames[i] = STANDARD_POSTSCRIPT_GLYPH_NAMES[i + postTable.get()];
+ return;
+
+ case 0x00030000:
+ /* Format 3 leaves it to the printer driver to choose whatever
+ * name it wants to.
+ */
+ return;
+
+ case 0x00040000:
+ /* Format 4 is used by Apple for composite fonts that have
+ * synthetic glyph names. The name of a glyph is "a" plus
+ * the integer (in decimal notation) that follows the table
+ * after numGlyphs.
+ */
+ postTable.position(32);
+ numGlyphs = postTable.getChar();
+ glyphCharacterCodes = postTable.asCharBuffer();
+ glyphCharacterCodes.limit(numGlyphs);
+ return;
+ }
+ }
+
+
+
+ /* For generating the following tables, a quick-and-dirty Python
+ * script was used. It is unlikely that we ever need to run it
+ * again, but for information and convenient access, it is included
+ * below. Initial '#' characters need to be removed from the generated
+ * strings, they are present so that the lines not break in the middle
+ * of Java escape sequences (no, this is not very clean).
+ *
+ * import string
+ *
+ * javaEscapes = {0x22:'\\"', 0x5c:'\\\\'}
+ * def escape(c):
+ * if javaEscapes.has_key(c):
+ * return javaEscapes[c]
+ * elif 0x20 <= c <= 0x7e:
+ * return chr(c)
+ * else:
+ * return '\\u%04x' % c
+ *
+ * def dump(name, s, stride):
+ * s = ('#' * stride) + s
+ * print " private static final String %s" % name
+ * for i in range(0, len(s), 60):
+ * print ' + "%s"' % s[i:i+60]
+ *
+ * glyphs = {}
+ * for line in open('aglfn13.txt', 'r').readlines():
+ * if line[0] == '#': continue
+ * [ucs, glyphName, desc] = line.split(';')
+ * glyph = int('0x' + ucs, 0)
+ * assert (not glyphs.has_key(glyph)) or (glyphs[glyph] == glyphName)
+ * glyphs[glyph] = glyphName
+ * del glyphs[0] # arrowvertex
+ * k = glyphs.keys()
+ * k.sort()
+ * numGlyphs = len(k)
+ * names = ''
+ * pos = []
+ * for glyph in k:
+ * pos.append(len(names) + 1)
+ * names = names + '/' + glyphs[glyph]
+ * dump('AGLFN_GLYPHS', string.join(map(escape, k), ''), 5)
+ * dump('AGLFN_NAME_OFFSET', string.join(map(escape, pos), ''), 4)
+ * dump('AGLFN_NAMES', names + '/', 0)
+ */
+
+
+ /**
+ * A String that contains the Unicode codepoint for each glyph
+ * in the Adobe Glyph List. The characters are in sorted order.
+ *
+ * Generated from the Adobe Glyph List for New Fonts, version 1.1
+ * of 17 April 2003.
+ *
+ * @see <a href=
+ * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
+ * Glyph List for New Fonts</a>
+ */
+ private static final String AGLFN_GLYPHS
+ = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU"
+ + "VWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u00a1\u00a2\u00a3"
+ + "\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ae"
+ + "\u00af\u00b0\u00b1\u00b4\u00b5\u00b6\u00b7\u00b8\u00ba\u00bb"
+ + "\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5"
+ + "\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf"
+ + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9"
+ + "\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3"
+ + "\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed"
+ + "\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7"
+ + "\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe\u00ff\u0100\u0101"
+ + "\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b"
+ + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115"
+ + "\u0116\u0117\u0118\u0119\u011a\u011b\u011c\u011d\u011e\u011f"
+ + "\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129"
+ + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0132\u0133"
+ + "\u0134\u0135\u0136\u0137\u0138\u0139\u013a\u013b\u013c\u013d"
+ + "\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147"
+ + "\u0148\u0149\u014a\u014b\u014c\u014d\u014e\u014f\u0150\u0151"
+ + "\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b"
+ + "\u015c\u015d\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165"
+ + "\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d\u016e\u016f"
+ + "\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179"
+ + "\u017a\u017b\u017c\u017d\u017e\u017f\u0192\u01a0\u01a1\u01af"
+ + "\u01b0\u01e6\u01e7\u01fa\u01fb\u01fc\u01fd\u01fe\u01ff\u0218"
+ + "\u0219\u02bc\u02bd\u02c6\u02c7\u02d8\u02d9\u02da\u02db\u02dc"
+ + "\u02dd\u0300\u0301\u0303\u0309\u0323\u0384\u0385\u0386\u0387"
+ + "\u0388\u0389\u038a\u038c\u038e\u038f\u0390\u0391\u0392\u0393"
+ + "\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e"
+ + "\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03aa"
+ + "\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4"
+ + "\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bd\u03be\u03bf"
+ + "\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9"
+ + "\u03ca\u03cb\u03cc\u03cd\u03ce\u03d1\u03d2\u03d5\u03d6\u0401"
+ + "\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b"
+ + "\u040c\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416"
+ + "\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420"
+ + "\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a"
+ + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434"
+ + "\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e"
+ + "\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448"
+ + "\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0451\u0452\u0453"
+ + "\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045e"
+ + "\u045f\u0462\u0463\u0472\u0473\u0474\u0475\u0490\u0491\u04d9"
+ + "\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9"
+ + "\u05bb\u05bc\u05bd\u05be\u05bf\u05c0\u05c1\u05c2\u05c3\u05d0"
+ + "\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da"
+ + "\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4"
+ + "\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u05f0\u05f1\u05f2\u060c"
+ + "\u061b\u061f\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628"
+ + "\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632"
+ + "\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\u0640\u0641"
+ + "\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u064b"
+ + "\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u0660\u0661\u0662"
+ + "\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u066a\u066d\u0679"
+ + "\u067e\u0686\u0688\u0691\u0698\u06a4\u06af\u06ba\u06d2\u06d5"
+ + "\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u200c\u200d"
+ + "\u200e\u200f\u2012\u2013\u2014\u2015\u2017\u2018\u2019\u201a"
+ + "\u201b\u201c\u201d\u201e\u2020\u2021\u2022\u2024\u2025\u2026"
+ + "\u202c\u202d\u202e\u2030\u2032\u2033\u2039\u203a\u203c\u2044"
+ + "\u20a1\u20a3\u20a4\u20a7\u20aa\u20ab\u20ac\u2105\u2111\u2113"
+ + "\u2116\u2118\u211c\u211e\u2122\u2126\u212e\u2135\u2153\u2154"
+ + "\u215b\u215c\u215d\u215e\u2190\u2191\u2192\u2193\u2194\u2195"
+ + "\u21a8\u21b5\u21d0\u21d1\u21d2\u21d3\u21d4\u2200\u2202\u2203"
+ + "\u2205\u2206\u2207\u2208\u2209\u220b\u220f\u2211\u2212\u2217"
+ + "\u221a\u221d\u221e\u221f\u2220\u2227\u2228\u2229\u222a\u222b"
+ + "\u2234\u223c\u2245\u2248\u2260\u2261\u2264\u2265\u2282\u2283"
+ + "\u2284\u2286\u2287\u2295\u2297\u22a5\u22c5\u2302\u2310\u2320"
+ + "\u2321\u2329\u232a\u2500\u2502\u250c\u2510\u2514\u2518\u251c"
+ + "\u2524\u252c\u2534\u253c\u2550\u2551\u2552\u2553\u2554\u2555"
+ + "\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f"
+ + "\u2560\u2561\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569"
+ + "\u256a\u256b\u256c\u2580\u2584\u2588\u258c\u2590\u2591\u2592"
+ + "\u2593\u25a0\u25a1\u25aa\u25ab\u25ac\u25b2\u25ba\u25bc\u25c4"
+ + "\u25ca\u25cb\u25cf\u25d8\u25d9\u25e6\u263a\u263b\u263c\u2640"
+ + "\u2642\u2660\u2663\u2665\u2666\u266a\u266b";
+
+
+ /**
+ * The offset of each glyph name in AGLFN_NAMES.
+ *
+ * Generated from the Adobe Glyph List for New Fonts, version 1.1
+ * of 17 April 2003.
+ *
+ * @see <a href=
+ * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
+ * Glyph List for New Fonts</a>
+ */
+ private static final String AGLFN_NAME_OFFSET
+ = "\u0001\u0007\u000e\u0017\")1;GQ\\ejpw~\u0084\u0089\u008d"
+ + "\u0091\u0097\u009c\u00a1\u00a5\u00ab\u00b1\u00b6\u00bc\u00c6"
+ + "\u00cb\u00d1\u00d9\u00e2\u00e5\u00e7\u00e9\u00eb\u00ed\u00ef"
+ + "\u00f1\u00f3\u00f5\u00f7\u00f9\u00fb\u00fd\u00ff\u0101\u0103"
+ + "\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117"
+ + "\u0119\u0125\u012f\u013c\u0148\u0153\u0159\u015b\u015d\u015f"
+ + "\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173"
+ + "\u0175\u0177\u0179\u017b\u017d\u017f\u0181\u0183\u0185\u0187"
+ + "\u0189\u018b\u018d\u0197\u019b\u01a6\u01b1\u01bc\u01c1\u01ca"
+ + "\u01d3\u01d7\u01e1\u01e9\u01f2\u01fc\u0208\u0216\u0221\u022c"
+ + "\u0233\u023a\u0244\u024a\u024d\u0257\u0266\u026e\u027b\u028a"
+ + "\u0295\u029d\u02ab\u02b8\u02bf\u02c6\u02d2\u02d9\u02e3\u02e9"
+ + "\u02ec\u02f5\u02fc\u0303\u030f\u0319\u0320\u0327\u0333\u033d"
+ + "\u0341\u0348\u034f\u0356\u0362\u0369\u0373\u037c\u0383\u038a"
+ + "\u0391\u039d\u03a7\u03ae\u03b4\u03bf\u03c6\u03cd\u03d9\u03e0"
+ + "\u03ea\u03f0\u03f3\u03fc\u0403\u040a\u0416\u0420\u0427\u042e"
+ + "\u043a\u0444\u0448\u044f\u0456\u045d\u0469\u0470\u047a\u0481"
+ + "\u0488\u048f\u0496\u04a2\u04ac\u04b3\u04b9\u04c3\u04cb\u04d3"
+ + "\u04da\u04e1\u04e9\u04f1\u04f8\u04ff\u050b\u0517\u0522\u052d"
+ + "\u0534\u053b\u0542\u0549\u0550\u0557\u055f\u0567\u056e\u0575"
+ + "\u0580\u058b\u0593\u059b\u05a2\u05a9\u05b5\u05c1\u05c8\u05cf"
+ + "\u05da\u05e5\u05f2\u05ff\u060b\u0617\u061c\u0621\u0628\u062f"
+ + "\u0637\u063f\u0646\u064d\u0655\u065d\u0668\u0671\u0674\u0677"
+ + "\u0683\u068f\u069c\u06a9\u06b6\u06bd\u06c4\u06d1\u06de\u06e5"
+ + "\u06ec\u06f1\u06f6\u06fd\u0704\u070b\u0712\u071f\u072c\u0733"
+ + "\u073a\u0746\u074a\u074e\u0756\u075e\u0765\u076c\u077a\u0788"
+ + "\u078b\u078e\u0795\u079c\u07a9\u07b6\u07bd\u07c4\u07cb\u07d2"
+ + "\u07de\u07ea\u07f3\u07fc\u0803\u080a\u0817\u0824\u082b\u0832"
+ + "\u0837\u083c\u0843\u084a\u0852\u085a\u0861\u0868\u086e\u0874"
+ + "\u0882\u0890\u0898\u08a0\u08ac\u08b8\u08c4\u08d0\u08da\u08e1"
+ + "\u08e8\u08f3\u08fe\u0905\u090c\u0912\u0919\u091f\u0925\u092b"
+ + "\u0931\u0938\u093f\u094a\u0955\u095d\u0965\u0971\u097d\u098a"
+ + "\u0997\u09a1\u09ab\u09b6\u09bc\u09c2\u09cc\u09d1\u09d8\u09de"
+ + "\u09eb\u09f5\u09ff\u0a09\u0a17\u0a24\u0a2a\u0a38\u0a43\u0a4d"
+ + "\u0a5a\u0a63\u0a6d\u0a7a\u0a87\u0a92\u0aa4\u0aaa\u0aaf\u0ab5"
+ + "\u0abd\u0ac2\u0ac6\u0acc\u0ad1\u0ad7\u0ade\u0ae1\u0ae4\u0ae7"
+ + "\u0aef\u0af2\u0af6\u0afc\u0b00\u0b08\u0b0c\u0b10\u0b14\u0b21"
+ + "\u0b31\u0b3c\u0b49\u0b52\u0b5c\u0b71\u0b77\u0b7c\u0b82\u0b88"
+ + "\u0b90\u0b95\u0b99\u0b9f\u0ba4\u0baa\u0bb1\u0bb4\u0bb7\u0bbf"
+ + "\u0bc2\u0bc6\u0bcd\u0bd3\u0bd7\u0bdf\u0be3\u0be7\u0beb\u0bf1"
+ + "\u0bfe\u0c0e\u0c1b\u0c28\u0c33\u0c3a\u0c43\u0c48\u0c4f\u0c59"
+ + "\u0c63\u0c6d\u0c77\u0c81\u0c8b\u0c95\u0c9f\u0ca9\u0cb3\u0cbd"
+ + "\u0cc7\u0cd1\u0cdb\u0ce5\u0cef\u0cf9\u0d03\u0d0d\u0d17\u0d21"
+ + "\u0d2b\u0d35\u0d3f\u0d49\u0d53\u0d5d\u0d67\u0d71\u0d7b\u0d85"
+ + "\u0d8f\u0d99\u0da3\u0dad\u0db7\u0dc1\u0dcb\u0dd5\u0ddf\u0de9"
+ + "\u0df3\u0dfd\u0e07\u0e11\u0e1b\u0e25\u0e2f\u0e39\u0e43\u0e4d"
+ + "\u0e57\u0e61\u0e6b\u0e75\u0e7f\u0e89\u0e93\u0e9d\u0ea7\u0eb1"
+ + "\u0ebb\u0ec5\u0ecf\u0ed9\u0ee3\u0eed\u0ef7\u0f01\u0f0b\u0f15"
+ + "\u0f1f\u0f29\u0f33\u0f3d\u0f47\u0f51\u0f5b\u0f65\u0f6f\u0f79"
+ + "\u0f83\u0f8d\u0f97\u0fa1\u0fab\u0fb5\u0fbf\u0fc9\u0fd3\u0fdd"
+ + "\u0fe7\u0ff1\u0ffb\u1005\u100f\u1019\u1023\u102d\u1037\u1041"
+ + "\u104b\u1055\u105f\u1069\u1073\u107d\u1087\u1091\u109b\u10a5"
+ + "\u10af\u10b9\u10c3\u10cd\u10d7\u10e1\u10eb\u10f5\u10ff\u1109"
+ + "\u1113\u111d\u1127\u1131\u113b\u1145\u114f\u1159\u1163\u116d"
+ + "\u1177\u1181\u118b\u1195\u119f\u11a9\u11b3\u11bd\u11c7\u11d1"
+ + "\u11db\u11e5\u11ef\u11f9\u1203\u120d\u1217\u1221\u122b\u1235"
+ + "\u123f\u1249\u1253\u125d\u1267\u1271\u127b\u1285\u128f\u1299"
+ + "\u12a3\u12ad\u12b7\u12c1\u12cb\u12d5\u12df\u12e9\u12f3\u12fd"
+ + "\u1307\u1311\u131b\u1325\u132f\u1339\u1343\u134d\u1357\u1361"
+ + "\u136b\u1375\u137f\u1389\u1393\u139d\u13a7\u13b1\u13bb\u13c5"
+ + "\u13cf\u13d9\u13e3\u13ed\u13f7\u1401\u140b\u1415\u141f\u1429"
+ + "\u1433\u143d\u1447\u1451\u145b\u1465\u146f\u1479\u1483\u148d"
+ + "\u1497\u14a1\u14ab\u14b5\u14bf\u14c9\u14d3\u14dd\u14e7\u14f1"
+ + "\u14f8\u14ff\u1506\u150d\u1517\u1521\u1528\u152f\u1539\u1541"
+ + "\u1549\u1551\u155c\u1563\u156a\u1574\u1582\u158c\u1597\u15a6"
+ + "\u15b4\u15c1\u15cf\u15dc\u15e3\u15ed\u15f4\u1603\u1612\u161b"
+ + "\u1625\u162f\u1639\u1645\u164c\u1653\u1661\u1670\u167a\u1683"
+ + "\u1691\u1697\u169c\u16a3\u16ad\u16b2\u16b7\u16c1\u16ca\u16d4"
+ + "\u16de\u16ea\u16f3\u1700\u170a\u1710\u171a\u1720\u1729\u1733"
+ + "\u173d\u174a\u1756\u1763\u176d\u1775\u1780\u178a\u1794\u179e"
+ + "\u17ab\u17ba\u17c7\u17d2\u17e0\u17ed\u17fa\u1804\u1810\u181c"
+ + "\u1825\u182b\u1834\u183c\u1847\u1850\u1858\u1862\u1868\u1875"
+ + "\u187d\u188a\u1893\u189e\u18a4\u18af\u18b9\u18c6\u18cc\u18d5"
+ + "\u18df\u18e7\u18f1\u18fd\u1906\u1912\u191c\u1929\u1936\u1945"
+ + "\u194f\u195c\u196b\u1976\u1985\u1993\u199b\u19a1\u19af\u19ba"
+ + "\u19c5\u19cf\u19da\u19e3\u19ec\u19f5\u19fe\u1a07\u1a10\u1a19"
+ + "\u1a22\u1a2b\u1a34\u1a3d\u1a46\u1a4f\u1a58\u1a61\u1a6a\u1a73"
+ + "\u1a7c\u1a85\u1a8e\u1a97\u1aa0\u1aa9\u1ab2\u1abb\u1ac4\u1acd"
+ + "\u1ad6\u1adf\u1ae8\u1af1\u1afa\u1b03\u1b0c\u1b15\u1b1e\u1b27"
+ + "\u1b30\u1b39\u1b42\u1b4a\u1b52\u1b58\u1b60\u1b68\u1b70\u1b76"
+ + "\u1b7e\u1b88\u1b8f\u1b96\u1b9d\u1ba8\u1bb0\u1bb8\u1bc0\u1bc8"
+ + "\u1bd0\u1bd7\u1bde\u1be8\u1bf2\u1bfd\u1c07\u1c14\u1c18\u1c1f"
+ + "\u1c24\u1c2a\u1c2f\u1c35\u1c3d\u1c49";
+
+
+ /**
+ * The name of each glyph in the Adobe Glyph List for New Fonts
+ * (AGLFN). The name of the n-th glyph starts at position
+ * AGLFN_NAME_OFFSET.charAt(n). It ends before the following
+ * slash (slashes cannot be part of a PostScript name, which
+ * is why we use it for separation).
+ *
+ * <p>Generated from the Adobe Glyph List for New Fonts, version 1.1
+ * of 17 April 2003.
+ *
+ * @see <a href=
+ * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
+ * Glyph List for New Fonts</a>
+ */
+ private static final String AGLFN_NAMES
+ = "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/q"
+ + "uotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/p"
+ + "eriod/slash/zero/one/two/three/four/five/six/seven/eight/nin"
+ + "e/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F"
+ + "/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backsla"
+ + "sh/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h"
+ + "/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/bracerigh"
+ + "t/asciitilde/exclamdown/cent/sterling/currency/yen/brokenbar"
+ + "/section/dieresis/copyright/ordfeminine/guillemotleft/logica"
+ + "lnot/registered/macron/degree/plusminus/acute/mu/paragraph/p"
+ + "eriodcentered/cedilla/ordmasculine/guillemotright/onequarter"
+ + "/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumfle"
+ + "x/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumfl"
+ + "ex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/"
+ + "Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/U"
+ + "grave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/a"
+ + "grave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/"
+ + "egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumfle"
+ + "x/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odie"
+ + "resis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacu"
+ + "te/thorn/ydieresis/Amacron/amacron/Abreve/abreve/Aogonek/aog"
+ + "onek/Cacute/cacute/Ccircumflex/ccircumflex/Cdotaccent/cdotac"
+ + "cent/Ccaron/ccaron/Dcaron/dcaron/Dcroat/dcroat/Emacron/emacr"
+ + "on/Ebreve/ebreve/Edotaccent/edotaccent/Eogonek/eogonek/Ecaro"
+ + "n/ecaron/Gcircumflex/gcircumflex/Gbreve/gbreve/Gdotaccent/gd"
+ + "otaccent/Gcommaaccent/gcommaaccent/Hcircumflex/hcircumflex/H"
+ + "bar/hbar/Itilde/itilde/Imacron/imacron/Ibreve/ibreve/Iogonek"
+ + "/iogonek/Idotaccent/dotlessi/IJ/ij/Jcircumflex/jcircumflex/K"
+ + "commaaccent/kcommaaccent/kgreenlandic/Lacute/lacute/Lcommaac"
+ + "cent/lcommaaccent/Lcaron/lcaron/Ldot/ldot/Lslash/lslash/Nacu"
+ + "te/nacute/Ncommaaccent/ncommaaccent/Ncaron/ncaron/napostroph"
+ + "e/Eng/eng/Omacron/omacron/Obreve/obreve/Ohungarumlaut/ohunga"
+ + "rumlaut/OE/oe/Racute/racute/Rcommaaccent/rcommaaccent/Rcaron"
+ + "/rcaron/Sacute/sacute/Scircumflex/scircumflex/Scedilla/scedi"
+ + "lla/Scaron/scaron/Tcommaaccent/tcommaaccent/Tcaron/tcaron/Tb"
+ + "ar/tbar/Utilde/utilde/Umacron/umacron/Ubreve/ubreve/Uring/ur"
+ + "ing/Uhungarumlaut/uhungarumlaut/Uogonek/uogonek/Wcircumflex/"
+ + "wcircumflex/Ycircumflex/ycircumflex/Ydieresis/Zacute/zacute/"
+ + "Zdotaccent/zdotaccent/Zcaron/zcaron/longs/florin/Ohorn/ohorn"
+ + "/Uhorn/uhorn/Gcaron/gcaron/Aringacute/aringacute/AEacute/aea"
+ + "cute/Oslashacute/oslashacute/Scommaaccent/scommaaccent/afii5"
+ + "7929/afii64937/circumflex/caron/breve/dotaccent/ring/ogonek/"
+ + "tilde/hungarumlaut/gravecomb/acutecomb/tildecomb/hookaboveco"
+ + "mb/dotbelowcomb/tonos/dieresistonos/Alphatonos/anoteleia/Eps"
+ + "ilontonos/Etatonos/Iotatonos/Omicrontonos/Upsilontonos/Omega"
+ + "tonos/iotadieresistonos/Alpha/Beta/Gamma/Epsilon/Zeta/Eta/Th"
+ + "eta/Iota/Kappa/Lambda/Mu/Nu/Xi/Omicron/Pi/Rho/Sigma/Tau/Upsi"
+ + "lon/Phi/Chi/Psi/Iotadieresis/Upsilondieresis/alphatonos/epsi"
+ + "lontonos/etatonos/iotatonos/upsilondieresistonos/alpha/beta/"
+ + "gamma/delta/epsilon/zeta/eta/theta/iota/kappa/lambda/nu/xi/o"
+ + "micron/pi/rho/sigma1/sigma/tau/upsilon/phi/chi/psi/omega/iot"
+ + "adieresis/upsilondieresis/omicrontonos/upsilontonos/omegaton"
+ + "os/theta1/Upsilon1/phi1/omega1/afii10023/afii10051/afii10052"
+ + "/afii10053/afii10054/afii10055/afii10056/afii10057/afii10058"
+ + "/afii10059/afii10060/afii10061/afii10062/afii10145/afii10017"
+ + "/afii10018/afii10019/afii10020/afii10021/afii10022/afii10024"
+ + "/afii10025/afii10026/afii10027/afii10028/afii10029/afii10030"
+ + "/afii10031/afii10032/afii10033/afii10034/afii10035/afii10036"
+ + "/afii10037/afii10038/afii10039/afii10040/afii10041/afii10042"
+ + "/afii10043/afii10044/afii10045/afii10046/afii10047/afii10048"
+ + "/afii10049/afii10065/afii10066/afii10067/afii10068/afii10069"
+ + "/afii10070/afii10072/afii10073/afii10074/afii10075/afii10076"
+ + "/afii10077/afii10078/afii10079/afii10080/afii10081/afii10082"
+ + "/afii10083/afii10084/afii10085/afii10086/afii10087/afii10088"
+ + "/afii10089/afii10090/afii10091/afii10092/afii10093/afii10094"
+ + "/afii10095/afii10096/afii10097/afii10071/afii10099/afii10100"
+ + "/afii10101/afii10102/afii10103/afii10104/afii10105/afii10106"
+ + "/afii10107/afii10108/afii10109/afii10110/afii10193/afii10146"
+ + "/afii10194/afii10147/afii10195/afii10148/afii10196/afii10050"
+ + "/afii10098/afii10846/afii57799/afii57801/afii57800/afii57802"
+ + "/afii57793/afii57794/afii57795/afii57798/afii57797/afii57806"
+ + "/afii57796/afii57807/afii57839/afii57645/afii57841/afii57842"
+ + "/afii57804/afii57803/afii57658/afii57664/afii57665/afii57666"
+ + "/afii57667/afii57668/afii57669/afii57670/afii57671/afii57672"
+ + "/afii57673/afii57674/afii57675/afii57676/afii57677/afii57678"
+ + "/afii57679/afii57680/afii57681/afii57682/afii57683/afii57684"
+ + "/afii57685/afii57686/afii57687/afii57688/afii57689/afii57690"
+ + "/afii57716/afii57717/afii57718/afii57388/afii57403/afii57407"
+ + "/afii57409/afii57410/afii57411/afii57412/afii57413/afii57414"
+ + "/afii57415/afii57416/afii57417/afii57418/afii57419/afii57420"
+ + "/afii57421/afii57422/afii57423/afii57424/afii57425/afii57426"
+ + "/afii57427/afii57428/afii57429/afii57430/afii57431/afii57432"
+ + "/afii57433/afii57434/afii57440/afii57441/afii57442/afii57443"
+ + "/afii57444/afii57445/afii57446/afii57470/afii57448/afii57449"
+ + "/afii57450/afii57451/afii57452/afii57453/afii57454/afii57455"
+ + "/afii57456/afii57457/afii57458/afii57392/afii57393/afii57394"
+ + "/afii57395/afii57396/afii57397/afii57398/afii57399/afii57400"
+ + "/afii57401/afii57381/afii63167/afii57511/afii57506/afii57507"
+ + "/afii57512/afii57513/afii57508/afii57505/afii57509/afii57514"
+ + "/afii57519/afii57534/Wgrave/wgrave/Wacute/wacute/Wdieresis/w"
+ + "dieresis/Ygrave/ygrave/afii61664/afii301/afii299/afii300/fig"
+ + "uredash/endash/emdash/afii00208/underscoredbl/quoteleft/quot"
+ + "eright/quotesinglbase/quotereversed/quotedblleft/quotedblrig"
+ + "ht/quotedblbase/dagger/daggerdbl/bullet/onedotenleader/twodo"
+ + "tenleader/ellipsis/afii61573/afii61574/afii61575/perthousand"
+ + "/minute/second/guilsinglleft/guilsinglright/exclamdbl/fracti"
+ + "on/colonmonetary/franc/lira/peseta/afii57636/dong/Euro/afii6"
+ + "1248/Ifraktur/afii61289/afii61352/weierstrass/Rfraktur/presc"
+ + "ription/trademark/Omega/estimated/aleph/onethird/twothirds/o"
+ + "neeighth/threeeighths/fiveeighths/seveneighths/arrowleft/arr"
+ + "owup/arrowright/arrowdown/arrowboth/arrowupdn/arrowupdnbse/c"
+ + "arriagereturn/arrowdblleft/arrowdblup/arrowdblright/arrowdbl"
+ + "down/arrowdblboth/universal/partialdiff/existential/emptyset"
+ + "/Delta/gradient/element/notelement/suchthat/product/summatio"
+ + "n/minus/asteriskmath/radical/proportional/infinity/orthogona"
+ + "l/angle/logicaland/logicalor/intersection/union/integral/the"
+ + "refore/similar/congruent/approxequal/notequal/equivalence/le"
+ + "ssequal/greaterequal/propersubset/propersuperset/notsubset/r"
+ + "eflexsubset/reflexsuperset/circleplus/circlemultiply/perpend"
+ + "icular/dotmath/house/revlogicalnot/integraltp/integralbt/ang"
+ + "leleft/angleright/SF100000/SF110000/SF010000/SF030000/SF0200"
+ + "00/SF040000/SF080000/SF090000/SF060000/SF070000/SF050000/SF4"
+ + "30000/SF240000/SF510000/SF520000/SF390000/SF220000/SF210000/"
+ + "SF250000/SF500000/SF490000/SF380000/SF280000/SF270000/SF2600"
+ + "00/SF360000/SF370000/SF420000/SF190000/SF200000/SF230000/SF4"
+ + "70000/SF480000/SF410000/SF450000/SF460000/SF400000/SF540000/"
+ + "SF530000/SF440000/upblock/dnblock/block/lfblock/rtblock/ltsh"
+ + "ade/shade/dkshade/filledbox/H22073/H18543/H18551/filledrect/"
+ + "triagup/triagrt/triagdn/triaglf/lozenge/circle/H18533/invbul"
+ + "let/invcircle/openbullet/smileface/invsmileface/sun/female/m"
+ + "ale/spade/club/heart/diamond/musicalnote/musicalnotedbl/";
+
+
+ /**
+ * Determines the name of a glyph according to the Adobe Glyph List
+ * for New Fonts (AGLFN). Because all glyphs in AGLFN correspond to
+ * a precomposed Unicode codepoint, the mismatch between characters
+ * and glyphs is not an issue here.
+ *
+ * @param c the Unicode codepoint that corresponds to the glyph, for
+ * example <code>0x010a</code> for <code>LATIN CAPITAL LETTER C WITH
+ * DOT ABOVE</code>.
+ *
+ * @return the glyph name, for example <code>Cdotaccent</code>. If
+ * the glyph is not in the <i>Adobe Glyph List for New Fonts</i>,
+ * <code>null</code> is returned.
+ *
+ * @see <a href=
+ * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
+ * Glyph List for New Fonts (AGLFN), version 1.1 of April 17,
+ * 2003</a>
+ *
+ * @see <a href=
+ * "http://partners.adobe.com/asn/developer/type/unicodegn.html#6"
+ * >Adobe&#x2019;s guidelines related to Unicode</a>
+ */
+ private static String getAGLFNName(char c)
+ {
+ int min, max, mid;
+ char midChar;
+
+ /* Performs a binary search in the sorted array (actually, a
+ * String) of glyphs in the Adobe Glyph List for New Fonts.
+ *
+ * A good compiler might be able to optimize a call to charAt for
+ * a static final String, but this routine is probably not that
+ * critical to performance.
+ */
+ min = 0;
+ max = AGLFN_GLYPHS.length() - 1;
+ mid = max >> 1;
+ midChar = AGLFN_GLYPHS.charAt(mid);
+ do
+ {
+ if (midChar == c)
+ break;
+ else if (midChar < c)
+ min = mid + 1;
+ else
+ max = mid;
+ mid = (min + max) >> 1;
+ midChar = AGLFN_GLYPHS.charAt(mid);
+ }
+ while (min < max);
+
+ if (midChar != c)
+ return null;
+
+ int pos = AGLFN_NAME_OFFSET.charAt(mid);
+ return AGLFN_NAMES.substring(pos, AGLFN_NAMES.indexOf('/', pos));
+ }
+
+
+ /**
+ * Returns the PostScript name of a glyph, given the sequence of
+ * Unicode characters that is required to produce the glyph. The
+ * returned name follows Adobe&#x2019;s glyph naming recommendations
+ * in order to allow searching and indexing of the produced
+ * PostScript and PDF.
+ *
+ * <p>Some examples:
+ * <ul><li><code>U+0041</code> gives <code>A</code>;</li>
+ * <li><code>U+011D</code> gives <code>gcircumflex</code>;</li>
+ * <li><code>U+007A U+0302</code> gives <code>z_uni0302</code>;</li>
+ * <li><code>U+D807 U+DC42</code> (an UTF-16 escape sequence)
+ * gives <code>u11C42</code>;</li>
+ * </ul>.
+ *
+ * <p>The routine does <i>not</i> bring sequences in any canonical
+ * form. Therefore, the result for <code>U+0067 U+0302</code> (the
+ * decomposition of <code>U+011D</code>) will be
+ * <code>g_uni0302</code>, not <code>gcircumflex</code>.
+ *
+ * @see <a href=
+ * "http://partners.adobe.com/asn/tech/type/unicodegn.jsp" >Unicode
+ * and Glyph Names</a> and <a href=
+ * "http://partners.adobe.com/asn/tech/type/glyphnamelimits.jsp"
+ * >Glyph Names and Current Implementations</a>
+ */
+ private static String getGlyphName(char[] chars)
+ {
+ char c;
+ String name;
+ int numChars;
+ boolean hasSurrogates = false;
+
+ if ((chars == null) || ((numChars = chars.length) == 0))
+ return ".notdef";
+
+ /* The vast majority of cases will be just a single character.
+ * Therefore, we have a special code path for this case.
+ */
+ if (numChars == 1)
+ {
+ c = chars[0];
+ name = getAGLFNName(c);
+ if (name != null)
+ return name;
+ }
+
+ StringBuffer buf = new StringBuffer(numChars * 8);
+ for (int i = 0; i < numChars; i++)
+ {
+ if (i > 0)
+ buf.append('_');
+ c = chars[i];
+
+ /* handle surrogate pairs */
+ if (c >> 10 == 0x36) // U+D800 .. U+DBFF: High surrogate
+ {
+ /* Adobe recommends using the 'u' prefix only for
+ * characters outside the Unicode Basic Multilingual Plane,
+ * because Acrobat 4 and 5 understand only the "uni" prefix.
+ * The 'u' prefix will be supported by Acrobat 6 and later.
+ *
+ * For further information, please refer to this page:
+ * http://partners.adobe.com/asn/tech/type/glyphnamelimits.jsp#3
+ */
+ int ucs4 = (((c & 0x3ff) << 10) | (chars[++i] & 0x3ff)) + 0x10000;
+ buf.append('u');
+ buf.append(Integer.toHexString(ucs4).toUpperCase());
+ }
+ else
+ {
+ /* Try the Adobe Glyph List. */
+ name = getAGLFNName(c);
+ if (name != null)
+ buf.append(name);
+ else
+ {
+ char nibble;
+ buf.append("uni");
+ nibble = (char) (((c >> 12) & 0xf) + 0x30);
+ if (nibble > 0x39)
+ nibble += 7;
+ buf.append(nibble);
+ nibble = (char) (((c >> 8) & 0xf) + 0x30);
+ if (nibble > 0x39)
+ nibble += 7;
+ buf.append(nibble);
+ nibble = (char) (((c >> 4) & 0xf) + 0x30);
+ if (nibble > 0x39)
+ nibble += 7;
+ buf.append(nibble);
+ nibble = (char) (((c >> 0) & 0xf) + 0x30);
+ if (nibble > 0x39)
+ nibble += 7;
+ buf.append(nibble);
+ }
+ }
+ }
+ return buf.toString();
+ }
+}
diff --git a/gnu/java/awt/font/opentype/MacResourceFork.java b/gnu/java/awt/font/opentype/MacResourceFork.java
new file mode 100644
index 000000000..8115e0403
--- /dev/null
+++ b/gnu/java/awt/font/opentype/MacResourceFork.java
@@ -0,0 +1,235 @@
+/* MacResourceFork.java -- Parses MacOS resource forks.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.font.opentype;
+
+import java.nio.ByteBuffer;
+
+
+/**
+ * A class for accessing data that is stored in the resource fork of
+ * Macintosh files. Writing resource forks is currently not supported.
+ *
+ * <p>The gnu.java.awt.font package uses this class for accessing
+ * fonts in the MacOS X ".dfont" format, which is is a file in the
+ * format of a Macintosh resource fork, but stored in the normal data
+ * fork of the file.
+ *
+ * <p>The implementation has been designed to work efficiently with
+ * the virtual memory subsystem. It is recommended to pass an
+ * instance of {@link java.nio.MappedByteBuffer} to the constructor.
+ *
+ * <p>Thread Safety: All access is synchronized on the ByteBuffer
+ * that is passed to the constructor.
+ *
+ * @see <a href=
+ * "http://developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-99.html"
+ * >Apple&#x2019; developer documentation about the Resource File
+ * Format</a>
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+final class MacResourceFork
+{
+ int[] types;
+ Resource[][] resources;
+ ByteBuffer buf;
+
+ public MacResourceFork(ByteBuffer buf)
+ {
+ int typeListOffset;
+ int refListOffset;
+ int nameListOffset;
+ int mapOffset, mapLen;
+ int dataOffset, dataLen;
+ int numTypes;
+
+ synchronized (buf)
+ {
+ buf = buf.duplicate();
+ this.buf = buf;
+ buf.position(0);
+ dataOffset = buf.getInt();
+ mapOffset = buf.getInt();
+ dataLen = buf.getInt();
+ mapLen = buf.getInt();
+ buf.position(mapOffset + 24);
+ refListOffset = mapOffset + buf.getChar();
+ nameListOffset = mapOffset + buf.getChar();
+ numTypes = buf.getChar() + 1;
+ types = new int[numTypes];
+ resources = new Resource[numTypes][];
+
+ /* Parse resource type list. */
+ typeListOffset = buf.position();
+ for (int i = 0; i < numTypes; i++)
+ {
+ buf.position(typeListOffset + 8 * i);
+ int resType = buf.getInt();
+ int numRes = buf.getChar() + 1;
+
+ types[i] = resType;
+ resources[i] = new Resource[numRes];
+
+ buf.position(refListOffset + buf.getChar());
+ for (int j = 0; j < numRes; j++)
+ {
+ short resID = buf.getShort();
+ int resNameOffset = nameListOffset + buf.getChar();
+ int resDataOffset = buf.getInt();
+ byte resAttr = (byte) (resDataOffset >> 24);
+ resDataOffset = dataOffset + (resDataOffset & 0x00ffffff);
+ buf.getInt(); /* skip four reserved bytes */
+
+ Resource rsrc = new Resource(buf, resType, resID, resDataOffset,
+ resNameOffset);
+ resources[i][j] = rsrc;
+ }
+ }
+ }
+ }
+
+
+ public Resource[] getResources(int type)
+ {
+ synchronized (buf)
+ {
+ for (int i = 0; i < types.length; i++)
+ {
+ if (types[i] == type)
+ return resources[i];
+ }
+ }
+ return null;
+ }
+
+
+ public Resource getResource(int type, short id)
+ {
+ Resource[] res;
+
+ synchronized (buf)
+ {
+ for (int i = 0; i < types.length; i++)
+ {
+ if (types[i] != type)
+ continue;
+
+ res = resources[i];
+ for (int j = 0; j < res.length; j++)
+ if (res[j].getID() == id)
+ return res[j];
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * A single resource that is contained in a resource fork.
+ */
+ public static final class Resource
+ {
+ int type;
+ short id;
+ byte attribute;
+ int nameOffset;
+ int dataOffset;
+ ByteBuffer buf;
+
+ private Resource(ByteBuffer buf,
+ int type, short id, int dataOffset, int nameOffset)
+ {
+ this.buf = buf;
+ this.type = type;
+ this.id = id;
+ this.dataOffset = dataOffset;
+ this.nameOffset = nameOffset;
+ }
+
+
+ /**
+ * Returns the type of this resource.
+ *
+ * @return an <code>int</code> encoding a four-byte type tag,
+ * such as <code>0x464f4e54</code> for <code>'FONT'</code>.
+ */
+ public int getType()
+ {
+ return type;
+ }
+
+
+ /**
+ * Returns the ID of this resource.
+ */
+ public short getID()
+ {
+ return id;
+ }
+
+
+ /**
+ * Retrieves the content of the resource. Only one page of memory
+ * is touched, irrespective of the actual size of the resource.
+ */
+ public ByteBuffer getContent()
+ {
+ synchronized (buf)
+ {
+ buf.limit(buf.capacity());
+ int len = buf.getInt(dataOffset);
+ buf.position(dataOffset + 4).limit(dataOffset + 4 + len);
+ return buf.slice();
+ }
+ }
+
+
+ /**
+ * Determines the length of the resource in bytes.
+ */
+ public int getLength()
+ {
+ synchronized (buf)
+ {
+ return buf.getInt(dataOffset);
+ }
+ }
+ }
+}
diff --git a/gnu/java/awt/font/opentype/NameDecoder.java b/gnu/java/awt/font/opentype/NameDecoder.java
new file mode 100644
index 000000000..bc0c0df09
--- /dev/null
+++ b/gnu/java/awt/font/opentype/NameDecoder.java
@@ -0,0 +1,686 @@
+/* NameDecoder.java -- Decodes names of OpenType and TrueType fonts.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.util.Locale;
+
+
+/**
+ * A utility class that helps with decoding the names of OpenType
+ * and TrueType fonts.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+class NameDecoder
+{
+ public static final int NAME_COPYRIGHT = 0;
+
+
+ /**
+ * Specifies the name of the family to which a font belongs, for
+ * example &#x201c;Univers&#x201d;.
+ */
+ public static final int NAME_FAMILY = 1;
+
+
+ /**
+ * Specified the name of the font inside its family, for
+ * example &#x201c;Light&#x201d;.
+ */
+ public static final int NAME_SUBFAMILY = 2;
+
+
+ public static final int NAME_UNIQUE = 3;
+
+
+ /**
+ * Specifies the full human-readable name of a font, for example
+ * &#x201c;Univers Light&#x201d;
+ */
+ public static final int NAME_FULL = 4;
+
+
+ public static final int NAME_VERSION = 5;
+
+
+ /**
+ * Specifies the PostScript name of a font, for example
+ * &#x201c;Univers-Light&#x201d;.
+ */
+ public static final int NAME_POSTSCRIPT = 6;
+
+
+ public static final int NAME_TRADEMARK = 7;
+ public static final int NAME_MANUFACTURER = 8;
+ public static final int NAME_DESIGNER = 9;
+ public static final int NAME_DESCRIPTION = 10;
+ public static final int NAME_VENDOR_URL = 11;
+ public static final int NAME_DESIGNER_URL = 12;
+ public static final int NAME_LICENSE = 13;
+ public static final int NAME_LICENSE_URL = 14;
+ public static final int NAME_PREFERRED_FAMILY = 16;
+ public static final int NAME_PREFERRED_SUBFAMILY = 17;
+ public static final int NAME_FULL_MACCOMPATIBLE = 18;
+ public static final int NAME_SAMPLE_TEXT = 19;
+ public static final int NAME_POSTSCRIPT_CID = 20;
+
+
+ private static final int PLATFORM_MACINTOSH = 1;
+ private static final int PLATFORM_MICROSOFT = 3;
+
+
+ public static String getName(ByteBuffer nameTable,
+ int name, Locale locale)
+ {
+ int numRecords;
+ int macLanguage, msLanguage;
+ int offset;
+ int namePlatform, nameEncoding, nameLanguage, nameID, nameLen;
+ int nameStart;
+ String result;
+ boolean match;
+
+ if (nameTable == null)
+ return null;
+
+ nameTable.position(0);
+ /* We understand only format 0 of the name table. */
+ if (nameTable.getChar() != 0)
+ return null;
+
+ macLanguage = getMacLanguageCode(locale);
+ msLanguage = getMicrosoftLanguageCode(locale);
+ numRecords = nameTable.getChar();
+ offset = nameTable.getChar();
+
+ for (int i = 0; i < numRecords; i++)
+ {
+ namePlatform = nameTable.getChar();
+ nameEncoding = nameTable.getChar();
+ nameLanguage = nameTable.getChar();
+ nameID = nameTable.getChar();
+ nameLen = nameTable.getChar();
+ nameStart = offset + nameTable.getChar();
+
+
+ if (nameID != name)
+ continue;
+
+ match = false;
+ switch (namePlatform)
+ {
+ case PLATFORM_MACINTOSH:
+ if ((nameLanguage == macLanguage) || (locale == null))
+ match = true;
+ else
+ {
+ switch (macLanguage)
+ {
+ case 49: /* Azerbaijani/Cyrillic */
+ match = (nameLanguage == /* Azerbaijani/Arabic */ 50)
+ || (nameLanguage == /* Azerbaijani/Roman */ 150);
+ break;
+
+ case 57: /* Mongolian/Mongolian */
+ match = (nameLanguage == /* Mongolian/Cyrillic */ 58);
+ break;
+
+ case 83: /* Malay/Roman */
+ match = (nameLanguage == /* Malay/Arabic */ 84);
+ break;
+ }
+ }
+ break;
+
+ case PLATFORM_MICROSOFT:
+ if (((nameLanguage & 0xff) == msLanguage) || (locale == null))
+ match = true;
+ break;
+ }
+
+
+ if (match)
+ {
+ result = decodeName(namePlatform, nameEncoding, nameLanguage,
+ nameTable, nameStart, nameLen);
+ if (result != null)
+ return result;
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * The language codes used by the Macintosh operating system. MacOS
+ * defines numeric language identifiers in the range [0 .. 95] and
+ * [128 .. 150]. To map this numeric identifier into an ISO 639
+ * language code, multiply it by two and take the substring at that
+ * position.
+ *
+ * <p>ISO 639 has revised the code for some languages, namely
+ * <code>he</code> for Hebrew (formerly <code>iw</code>),
+ * <code>yi</code> (formerly <code>ji</code>), and <code>id</code>
+ * for Indonesian (formerly <code>in</code>). In those cases, this
+ * table intentionally contains the older, obsolete code. The
+ * reason is that this is the code which
+ * java.util.Locale.getLanguage() is specified to return. The
+ * implementation of {@link #getMacLanguageCode} depends on this.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/unicode/onlinedat/languages.html"
+ * >Language Codes: ISO 639, Microsoft and Macintosh</a>
+ */
+ private static final String macLanguageCodes
+ // 0 1 2
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ = "enfrdeitnlsvesdaptnoiwjaarfielismttrhrzhurhithkoltplhuetlv "
+
+ // 3 4 5
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ + "fofaruzhnlgdsqrocssksljisrmkbgukbeuzkkazazhykamokytgtkmnmnps"
+
+ // 6 7 8
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ + "kukssdbonesamrbnasgupaormlkntatesimykmloviintlmsmsamti sosw"
+
+ // 9 10 11
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ + "rwrn mgeo "
+
+ // 12 13 14
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ + " cyeucalaqugnayttugtsjwsuglafbriugdgvgatoelkl"
+
+ // 15
+ // 0
+ + "az";
+
+
+ /**
+ * The primary language IDs used by the Microsoft operating systems.
+ *
+ * <p>ISO 639 has revised the code for some languages, namely
+ * <code>he</code> for Hebrew (formerly <code>iw</code>),
+ * <code>yi</code> (formerly <code>ji</code>), and <code>id</code>
+ * for Indonesian (formerly <code>in</code>). In those cases, this
+ * table intentionally contains the older, obsolete code. The
+ * reason is that this is the code which
+ * java.util.Locale.getLanguage() is specified to return. The
+ * implementation of {@link #getMicrosoftLanguageCode} depends on
+ * this.
+ *
+ * @see <a href=
+ * "http://www.unicode.org/unicode/onlinedat/languages.html"
+ * >Language Codes: ISO 639, Microsoft and Macintosh</a>
+ */
+ private static final String microsoftLanguageCodes
+ // 0 1 2
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ = " arbgcazhcsdadeelenesfifriwhuisitjakonlnoplptrmrorushsksqsv"
+
+ // 3 4 5
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ + "thtrurinukbesletlvlttgfavihyazeu mk ts xhzuafkafohimt "
+
+ // 6 7 8
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ + "gajimskkkyswtkuzttbnpaguortateknmlasmrsamnbocykmlomygl sd"
+
+ // 9 10 11
+ // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+ + " si iuam ksnefypstl ha yo omtign laso";
+
+
+ /**
+ * Maps a Java Locale into a MacOS language code.
+ *
+ * <p>For languages that are written in several script systems,
+ * MacOS defines multiple language codes. Java Locales have a
+ * variant which could be used for that purpose, but a small
+ * test program revealed that with Sun's JDK 1.4.1_01, only two
+ * of 134 available Locales have a variant tag (namely no_NO_NY
+ * and th_TH_TH).</p>
+ *
+ * <p>The following cases are problematic:
+ *
+ * <ul> <li>Azerbaijani (az): The MacOS language code is 49 if
+ * Azerbaijani is written in the Cyrillic script; 50 if written in
+ * the Arabic script; 150 if written in the Roman script. This
+ * method will always return 49 for the Azerbaijani locale.</li>
+ *
+ * <li>Mongolian (mn): The MacOS language code is 57 if Mongolian is
+ * written in the Mongolian script; 58 if written in the Cyrillic
+ * script. This method will always return 57 for the Mongolian
+ * locale.</li>
+ *
+ * <li>Malay (ms): The MacOS language code is 83 if Malay is written
+ * in the Roman script; 84 if written in the Arabic script. This
+ * method will always return 83 for the Malay locale.</li> </ul>
+ *
+ * @return a MacOS language code, or -1 if there is no such code for
+ * <code>loc</code>&#x2019;s language.
+ */
+ private static int getMacLanguageCode(Locale loc)
+ {
+ int code;
+
+ if (loc == null)
+ return -1;
+
+ code = findLanguageCode(loc.getLanguage(), macLanguageCodes);
+ switch (code)
+ {
+ case 19:
+ /* Traditional Chinese (MacOS language #19) and and Simplified
+ * Chinese (MacOS language #33) both have "zh" as their ISO 639
+ * code.
+ */
+ if (loc.equals(Locale.SIMPLIFIED_CHINESE))
+ code = 33;
+ break;
+
+ // Other special cases would be 49, 57 and 83, but we do not
+ // know what do do about them. See the method documentation for
+ // details.
+ }
+
+ return code;
+ }
+
+
+ /**
+ * Maps a Java Locale into a Microsoft language code.
+ */
+ private static int getMicrosoftLanguageCode(Locale locale)
+ {
+ String isoCode;
+ int code;
+
+ if (locale == null)
+ return -1;
+
+ isoCode = locale.getLanguage();
+ code = findLanguageCode(isoCode, microsoftLanguageCodes);
+ if (code == -1)
+ {
+ if (isoCode.equals("hr") || isoCode.equals("sr"))
+ {
+ /* Microsoft uses code 26 for "sh" (Serbo-Croatian),
+ * "hr" (Croatian) and "sr" (Serbian). Our table contains
+ * "sh".
+ */
+ code = 26;
+ }
+ else if (isoCode.equals("gd"))
+ {
+ /* Microsoft uses code 60 for "gd" (Scottish Gaelic) and
+ * "ga" (Irish Gaelic). Out table contains "ga".
+ */
+ code = 60;
+ }
+ }
+ return code;
+ }
+
+
+ private static int findLanguageCode(String lang, String langCodes)
+ {
+ int index;
+ if (lang == null)
+ return -1;
+
+ if (lang.length() != 2)
+ return -1;
+
+ index = 0;
+ do
+ {
+ index = langCodes.indexOf(lang, index);
+
+ /* The index must be even to be considered a match. Otherwise, we
+ * could match with the second letter of one language and the
+ * first of antoher one.
+ */
+ }
+ while (!((index < 0) || ((index & 1) == 0)));
+ if (index < 0)
+ return -1;
+
+ index = index / 2;
+ return index;
+ }
+
+
+ private static String decodeName(int platform, int encoding, int language,
+ ByteBuffer buffer, int offset, int len)
+ {
+ byte[] byteBuf;
+ String charsetName;
+ int oldPosition;
+
+ charsetName = getCharsetName(platform, language, encoding);
+ if (charsetName == null)
+ return null;
+
+ byteBuf = new byte[len];
+ oldPosition = buffer.position();
+ try
+ {
+ buffer.position(offset);
+ buffer.get(byteBuf);
+ try
+ {
+ return new String(byteBuf, charsetName);
+ }
+ catch (UnsupportedEncodingException uex)
+ {
+ }
+ }
+ finally
+ {
+ buffer.position(oldPosition);
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Maps a MacOS language code into a Java Locale.
+ *
+ * @param macLanguageCode the MacOS language code for
+ * the language whose Java locale is to be retrieved.
+ *
+ * @return an suitable Locale, or <code>null</code> if
+ * the mapping cannot be performed.
+ */
+ private static Locale getMacLocale(int macLanguageCode)
+ {
+ String isoCode;
+
+ switch (macLanguageCode)
+ {
+ case 0: return Locale.ENGLISH;
+ case 1: return Locale.FRENCH;
+ case 2: return Locale.GERMAN;
+ case 3: return Locale.ITALIAN;
+ case 11: return Locale.JAPANESE;
+ case 23: return Locale.KOREAN;
+ case 19: return Locale.TRADITIONAL_CHINESE;
+ case 33: return Locale.SIMPLIFIED_CHINESE;
+ }
+
+ if ((macLanguageCode < 0) || (macLanguageCode > 150))
+ return null;
+
+ isoCode = macLanguageCodes.substring(macLanguageCode << 1,
+ (macLanguageCode + 1) << 1);
+ if (isoCode.charAt(0) == ' ')
+ return null;
+
+ return new Locale(isoCode);
+ }
+
+
+
+ /**
+ * Maps a Windows LCID into a Java Locale.
+ *
+ * @param lcid the Windows language ID whose Java locale
+ * is to be retrieved.
+ *
+ * @return an suitable Locale, or <code>null</code> if
+ * the mapping cannot be performed.
+ */
+ private static Locale getWindowsLocale(int lcid)
+ {
+ /* FIXME: This is grossly incomplete. */
+ switch (lcid)
+ {
+ case 0x0407: return Locale.GERMAN;
+ case 0x0408: return new Locale("el", "GR");
+ case 0x0409: return Locale.ENGLISH;
+ case 0x040b: return new Locale("fi");
+ case 0x040c: return Locale.FRENCH;
+ case 0x0416: return new Locale("pt");
+ case 0x0807: return new Locale("de", "CH");
+ case 0x0809: return new Locale("en", "UK");
+ case 0x080c: return new Locale("fr", "BE");
+ case 0x0816: return new Locale("pt", "BR");
+ case 0x0c07: return new Locale("de", "AT");
+ case 0x0c09: return new Locale("en", "AU");
+ case 0x0c0c: return new Locale("fr", "CA");
+ case 0x1007: return new Locale("de", "LU");
+ case 0x1009: return new Locale("en", "CA");
+ case 0x100c: return new Locale("fr", "CH");
+ case 0x1407: return new Locale("de", "LI");
+ case 0x1409: return new Locale("en", "NZ");
+ case 0x140c: return new Locale("fr", "LU");
+ case 0x1809: return new Locale("en", "IE");
+
+ default:
+ return null;
+ }
+ }
+
+
+ /**
+ * Maps a Macintosh Script Manager code to the name of the
+ * corresponding Java Charset.
+ *
+ * @param macScript a MacOS ScriptCode, for example
+ * 6 for <code>smGreek</code>.
+ *
+ * @return a String that can be used to retrieve a Java
+ * CharsetDecorder, for example <code>MacGreek</code>, or
+ * <code>null</code> if <code>macScript</code> has an
+ * unsupported value.
+ */
+ private static String getMacCharsetName(int macScript)
+ {
+ switch (macScript)
+ {
+ case 0: return "MacRoman";
+ case 1: return "MacJapanese";
+ case 2: return "MacKorean";
+ case 3: return "MacTradChinese";
+ case 4: return "MacArabic";
+ case 5: return "MacHebrew";
+ case 6: return "MacGreek";
+ case 7: return "MacCyrillic";
+ case 8: return "MacRSymbol";
+ case 9: return "MacDevanagari";
+ case 10: return "MacGurmukhi";
+ case 11: return "MacGujarati";
+ case 12: return "MacOriya";
+ case 13: return "MacBengali";
+ case 14: return "MacTamil";
+ case 15: return "MacTelugu";
+ case 16: return "MacKannada";
+ case 17: return "MacMalayalam";
+ case 18: return "MacSinhalese";
+ case 19: return "MacBurmese";
+ case 20: return "MacKhmer";
+ case 21: return "MacThai";
+ case 22: return "MacLao";
+ case 23: return "MacGeorgian";
+ case 24: return "MacArmenian";
+ case 25: return "MacSimpChinese";
+ case 26: return "MacTibetan";
+ case 27: return "MacMongolian";
+ case 28: return "MacEthiopic";
+ case 29: return "MacCentralEurope";
+ case 30: return "MacVietnamese";
+ case 31: return "MacExtArabic";
+
+ default: return null;
+ }
+ }
+
+
+ /**
+ * Maps a Microsoft locale ID (LCID) to the name of the
+ * corresponding Java Charset.
+ *
+ * @param lcid the Microsoft locale ID.
+ *
+ * @return a String that can be used to retrieve a Java
+ * CharsetDecorder, for example <code>windows-1252</code>, or
+ * <code>null</code> if <code>lcid</code> has an unsupported value.
+ */
+ private static String getMicrosoftCharsetName(int lcid)
+ {
+ int lang;
+ char codePage = '?';
+
+ /* Extract the language code from the LCID. */
+ lang = lcid & 0x3ff;
+
+ /* In the majority of cases, the language alone determines the
+ * codepage.
+ */
+ if (lang < 100)
+ codePage = (" 612D022322225022EC2202201?002A462110777 68 ?2 1 "
+ + " 2 2 2112 ?1 1 2 2 ")
+ .charAt(lang);
+
+ /* There are a few exceptions, however, where multiple code pages
+ * are used for the same language. */
+ if (codePage == '?')
+ {
+ switch (lcid)
+ {
+ case 0x041a: // Croatian --> Windows-1250 (Central Europe)
+ case 0x081a: // Serbian (Latin) --> Windows-1250 (Central Europe)
+ codePage = '0';
+ break;
+
+ case 0x42c: // Azeri (Latin) --> Windows-1254 (Turkish)
+ case 0x443: // Uzbek (Latin) --> Windows-1254 (Turkish)
+ codePage = '4';
+ break;
+
+ case 0x82c: // Azeri (Cyrillic) --> Windows-1251 (Cyrillic)
+ case 0x843: // Uzbek (Cyrillic) --> Windows-1251 (Cyrillic)
+ case 0xc1a: // Serbian (Cyrillic) --> Windows-1251 (Cyrillic)
+ codePage = '1';
+ break;
+ }
+ }
+
+ switch (codePage)
+ {
+ case '0': return "windows-1250"; // Central Europe
+ case '1': return "windows-1251"; // Cyrillic
+ case '2': return "windows-1252"; // Latin 1
+ case '3': return "windows-1253"; // Greek
+ case '4': return "windows-1254"; // Turkish
+ case '5': return "windows-1255"; // Hebrew
+ case '6': return "windows-1256"; // Arabic
+ case '7': return "windows-1257"; // Baltic
+ case '8': return "windows-1258"; // Vietnam
+ case 'A': return "windows-874"; // Thai
+ case 'B': return "windows-936"; // Simplified Chinese, GBK
+ case 'C': return "windows-949"; // Korean
+ case 'D': return "windows-950"; // Traditional Chinese, Big5
+ case 'E': return "windows-932"; // Japanese Shift-JIS
+ default: return null;
+ }
+ }
+
+
+ /**
+ * Returns the Locale of an OpenType name.
+ *
+ * @param platform the OpenType platform ID.
+ *
+ * @param language the language tag of the OpenType name. If
+ * <code>platform</code> is 1, this is the MacOS language code.
+ *
+ * @param encoding the encoding tag of the OpenType name. If
+ * <code>platform</code> is 1, this is the MacOS script code.
+ */
+ public static Locale getLocale(int platform, int language, int encoding)
+ {
+ switch (platform)
+ {
+ case 1: /* Apple Macintosh */
+ return getMacLocale(language);
+
+ case 3: /* Microsoft Windows */
+ return getWindowsLocale(language);
+
+ default:
+ return null;
+ }
+ }
+
+
+ /**
+ * Determines the name of the charset for an OpenType font name.
+ *
+ * @param platform the OpenType platform ID.
+ *
+ * @param language the language tag of the OpenType name. If
+ * <code>platform</code> is 1, this is the MacOS language code.
+ *
+ * @param encoding the encoding tag of the OpenType name. If
+ * <code>platform</code> is 1, this is the MacOS script code.
+ *
+ * @return a charset name such as <code>&quot;MacRoman&quot;</code>,
+ * or <code>null</code> if the combination is not known.
+ */
+ public static String getCharsetName(int platform, int language, int encoding)
+ {
+ switch (platform)
+ {
+ case 1: /* Apple Macintosh */
+ return getMacCharsetName(encoding);
+
+ case 3: /* Microsoft Windows */
+ return getMicrosoftCharsetName(language);
+
+ default:
+ return null;
+ }
+ }
+}
diff --git a/gnu/java/awt/font/opentype/OpenTypeFont.java b/gnu/java/awt/font/opentype/OpenTypeFont.java
new file mode 100644
index 000000000..9ee28d76b
--- /dev/null
+++ b/gnu/java/awt/font/opentype/OpenTypeFont.java
@@ -0,0 +1,825 @@
+/* OpenTypeFont.java -- Manages OpenType and TrueType fonts.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype;
+
+import java.awt.Font;
+import java.awt.FontFormatException;
+import java.awt.font.FontRenderContext;
+import java.awt.font.GlyphVector;
+import java.awt.font.OpenType;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
+import java.nio.ByteBuffer;
+import java.text.CharacterIterator;
+import java.util.Locale;
+
+import gnu.java.awt.font.FontDelegate;
+import gnu.java.awt.font.GNUGlyphVector;
+import gnu.java.awt.font.opentype.truetype.TrueTypeScaler;
+
+
+/**
+ * A font that takes its data from OpenType or TrueType font tables.
+ *
+ * <p>OpenType is an extension of the TrueType font format. In addition
+ * to tables for names, kerning or layout, it also stores the shapes
+ * of individual glyphs. Three formats are recognized for glyphs:
+ * Quadratic splines (classic TrueType), cubic splines (PostScript),
+ * and bitmaps.
+ *
+ * @see <a
+ * href="http://partners.adobe.com/asn/tech/type/opentype/">Adobe&#x2019;s
+ * OpenType specification</a>
+ *
+ * @see <a
+ * href="http://developer.apple.com/fonts/TTRefMan/">Apple&#x2019;s</code>
+ * TrueType specification</a>
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+public final class OpenTypeFont
+ implements FontDelegate
+{
+ static final int TAG_OTTO = 0x4f54544f; // 'OTTO'
+ static final int TAG_SFNT = 0x73666e74; // 'sfnt'
+ static final int TAG_TRUE = 0x74727565; // 'true'
+ static final int TAG_TTCF = 0x74746366; // 'ttcf'
+ static final int TAG_ZAPF = 0x5a617066; // 'Zapf'
+
+
+ /**
+ * A buffer containing the font data. Note that this may well be an
+ * instance of the subclass MappedByteBuffer, in which case the
+ * virtual memory subsystem can more efficiently handle requests for
+ * font data. This is especially recommended for large font files
+ * that contain many glyphs that are rarely accessed.
+ */
+ ByteBuffer buf;
+
+
+ /**
+ * The number of glyphs in this font.
+ */
+ final int numGlyphs;
+
+ int[] tableTag, tableStart, tableLength;
+
+
+ /**
+ * The version of the font in 16.16 fixed-point encoding, for
+ * example 0x00010000 for version 1.0. There are also two special
+ * version IDs used by fonts for Apple Macintosh, namely 'true'
+ * (0x74727565) and 'typ1'. OpenType fonts sometimes have 'OTTO' as
+ * their version.
+ */
+ private int version;
+
+
+ /**
+ * The number of font units per em. For fonts with TrueType
+ * outlines, this is usually a power of two (such as 2048). For
+ * OpenType fonts with PostScript outlines, other values are
+ * acceptable (such as 1000).
+ */
+ private int unitsPerEm;
+
+
+ /**
+ * A factor to convert font units into ems. This value is <code>1 /
+ * unitsPerEm</code>.
+ */
+ private float emsPerUnit;
+
+
+ /**
+ * The scaler to which the actual scaling work is delegated.
+ */
+ private Scaler scaler;
+
+
+ /**
+ * A delegate object for mapping Unicode UCS-4 codepoints to glyph
+ * IDs.
+ */
+ private CharGlyphMap cmap;
+
+
+ /**
+ * A delegate object for providing a name for each glyph.
+ */
+ private GlyphNamer glyphNamer;
+
+
+ /**
+ * Constructs an OpenType or TrueType font.
+ *
+ * @param buf a buffer with the contents of the font file. It is
+ * recommended to use a <code>MappedByteBuffer</code> for very
+ * large font files.
+ *
+ * @param offsetTablePosition the position of the OpenType offset
+ * table in the font file. The offset table of most OpenType and
+ * TrueType fonts starts at position 0. However, so-called TrueType
+ * Collections support multiple OpenType fonts in a single file,
+ * which allows sharing some glyphs between fonts. If many glyphs
+ * are shared (for example all the Kanji glyphs between multiple
+ * Japanese fonts), the space savings can be considerable. In that
+ * case, the offset table of each individual font would start at its
+ * own position.
+ *
+ * @throws java.awt.FontFormatException if the font data is
+ * not in OpenType or TrueType format.
+ */
+ OpenTypeFont(ByteBuffer buf, int offsetTablePosition)
+ throws FontFormatException
+ {
+ int numTables, searchRange, entrySelector, rangeShift;
+
+ //buf = buf.duplicate();
+ this.buf = buf;
+ buf.limit(buf.capacity());
+ buf.position(offsetTablePosition);
+
+ /* Check that the font data is in a supported format. */
+ version = buf.getInt();
+ switch (version)
+ {
+ case 0x00010000: // Microsoft TrueType
+ case OpenType.TAG_TYP1: // Adobe PostScript embeded in Apple SFNT ('typ1')
+ case TAG_SFNT: // Apple TrueType
+ case TAG_TRUE: // Apple TrueType
+ case TAG_OTTO: // OpenType
+ break;
+
+ default:
+ throw new FontFormatException("not in OpenType or TrueType format");
+ }
+
+ numTables = buf.getShort();
+ searchRange = buf.getShort();
+ entrySelector = buf.getShort();
+ rangeShift = buf.getShort();
+
+ tableTag = new int[numTables];
+ tableStart = new int[numTables];
+ tableLength = new int[numTables];
+ int lastTag = 0;
+ for (int i = 0; i < numTables; i++)
+ {
+ tableTag[i] = buf.getInt();
+ if (lastTag >= tableTag[i])
+ throw new FontFormatException("unordered OpenType table");
+
+ buf.getInt(); // ignore checksum
+ tableStart[i] = buf.getInt();
+ tableLength[i] = buf.getInt();
+
+ //System.out.println(tagToString(tableTag[i]) + ", " + tableLength[i]);
+ }
+
+ ByteBuffer head = getFontTable(OpenType.TAG_HEAD);
+ if ((head.getInt(0) != 0x00010000)
+ || (head.getInt(12) != 0x5f0f3cf5))
+ throw new FontFormatException("unsupported head version");
+
+ unitsPerEm = head.getChar(18);
+ emsPerUnit = 1.0f / (float) unitsPerEm;
+
+
+ ByteBuffer maxp = getFontTable(OpenType.TAG_MAXP);
+ int maxpVersion = maxp.getInt(0);
+ switch (maxpVersion)
+ {
+ case 0x00005000: /* version 0.5, with wrong fractional part */
+ numGlyphs = maxp.getChar(4);
+ break;
+
+ case 0x00010000: /* version 1.0 */
+ numGlyphs = maxp.getChar(4);
+ scaler = new TrueTypeScaler(unitsPerEm,
+ getFontTable(OpenType.TAG_HHEA),
+ getFontTable(OpenType.TAG_HMTX),
+ getFontTable(OpenType.TAG_VHEA),
+ getFontTable(OpenType.TAG_VMTX),
+ maxp,
+ getFontTable(OpenType.TAG_CVT),
+ getFontTable(OpenType.TAG_FPGM),
+ /* loca format */ head.getShort(50),
+ getFontTable(OpenType.TAG_LOCA),
+ getFontTable(OpenType.TAG_GLYF),
+ getFontTable(OpenType.TAG_PREP));
+ break;
+
+ default:
+ throw new FontFormatException("unsupported maxp version");
+ }
+ }
+
+
+ /**
+ * Determines the index of a table into the offset table. The
+ * result can be used to find the offset and length of a table, as
+ * in <code>tableStart[getTableIndex(TAG_NAME)]</code>.
+ *
+ * @param tag the table identifier, for instance
+ * <code>OpenType.TAG_NAME</code>.
+ *
+ * @return the index of that table into the offset table, or
+ * -1 if the font does not contain the table specified by
+ * <code>tag</code>.
+ */
+ private int getTableIndex(int tag)
+ {
+ /* FIXME: Since the font specification requires tableTag[] to be
+ * ordered, one should do binary search here.
+ */
+ for (int i = 0; i < tableTag.length; i++)
+ if (tableTag[i] == tag)
+ return i;
+ return -1;
+ }
+
+
+
+ /**
+ * Returns the name of the family to which this font face belongs,
+ * for example <i>&#x201c;Univers&#x201d;</i>.
+ *
+ * @param locale the locale for which to localize the name.
+ *
+ * @return the family name.
+ */
+ public synchronized String getFamilyName(Locale locale)
+ {
+ String name;
+
+ if (locale == null)
+ locale = Locale.getDefault();
+
+ name = getName(NameDecoder.NAME_FAMILY, locale);
+ if (name == null)
+ name = getName(NameDecoder.NAME_FAMILY, Locale.ENGLISH);
+ if (name == null)
+ name = getName(NameDecoder.NAME_FAMILY, /* any language */ null);
+ if (name == null)
+ name = getName(NameDecoder.NAME_FULL, locale);
+ if (name == null)
+ name = getName(NameDecoder.NAME_FULL, /* any language */ null);
+ return name;
+ }
+
+
+ /**
+ * Returns the name of this font face inside the family, for example
+ * <i>&#x201c;Light&#x201d;</i>.
+ *
+ * @param locale the locale for which to localize the name.
+ *
+ * @return the name of the face inside its family.
+ */
+ public synchronized String getSubFamilyName(Locale locale)
+ {
+ String name;
+
+ if (locale == null)
+ locale = Locale.getDefault();
+
+ name = getName(NameDecoder.NAME_SUBFAMILY, locale);
+ if (name == null)
+ {
+ name = getName(NameDecoder.NAME_SUBFAMILY, Locale.ENGLISH);
+ if ("Regular".equals(name))
+ name = null;
+ }
+
+ if (name == null)
+ {
+ String lang = locale.getLanguage();
+ if ("de".equals(lang))
+ name = "Standard";
+ else if ("fr".equals(lang))
+ name = "Standard";
+ else if ("it".equals(lang))
+ name = "Normale";
+ else if ("nl".equals(lang))
+ name = "Normaal";
+ else if ("fi".equals(lang))
+ name = "Normaali";
+ else if ("sv".equals(lang))
+ name = "Normal";
+ else
+ name = "Regular";
+ }
+
+ return name;
+ }
+
+
+
+ /**
+ * Returns the full name of this font face, for example
+ * <i>&#x201c;Univers Light&#x201d;</i>.
+ *
+ * @param locale the locale for which to localize the name.
+ *
+ * @return the face name.
+ */
+ public synchronized String getFullName(Locale locale)
+ {
+ String name;
+
+ if (locale == null)
+ locale = Locale.getDefault();
+
+ name = getName(NameDecoder.NAME_FULL, locale);
+ if (name == null)
+ name = getName(NameDecoder.NAME_FULL, Locale.ENGLISH);
+ if (name == null)
+ name = getName(NameDecoder.NAME_FULL, /* any language */ null);
+
+ return name;
+ }
+
+
+ /**
+ * Returns the PostScript name of this font face, for example
+ * <i>&#x201c;Univers-Light&#x201d;</i>.
+ *
+ * @return the PostScript name, or <code>null</code> if the font
+ * does not provide a PostScript name.
+ */
+ public synchronized String getPostScriptName()
+ {
+ return getName(NameDecoder.NAME_POSTSCRIPT, /* any language */ null);
+ }
+
+
+ /**
+ * Returns the number of glyphs in this font face.
+ */
+ public int getNumGlyphs()
+ {
+ /* No synchronization is needed because the number of glyphs is
+ * set in the constructor, and it cannot change during the
+ * lifetime of the object.
+ */
+ return numGlyphs;
+ }
+
+
+ /**
+ * Returns the index of the glyph which gets displayed if the font
+ * cannot map a Unicode code point to a glyph. Many fonts show this
+ * glyph as an empty box.
+ */
+ public int getMissingGlyphCode()
+ {
+ /* No synchronization is needed because the result is constant. */
+ return 0;
+ }
+
+
+ /**
+ * The font&#x2019;s name table, or <code>null</code> if this
+ * table has not yet been accessed.
+ */
+ private ByteBuffer nameTable;
+
+
+ /**
+ * Extracts a String from the font&#x2019;s name table.
+ *
+ * @param name the numeric TrueType or OpenType name ID.
+ *
+ * @param locale the locale for which names shall be localized, or
+ * <code>null</code> if the locale does mot matter because the name
+ * is known to be language-independent (for example, because it is
+ * the PostScript name).
+ */
+ private String getName(int name, Locale locale)
+ {
+ if (nameTable == null)
+ nameTable = getFontTable(OpenType.TAG_NAME);
+ return NameDecoder.getName(nameTable, name, locale);
+ }
+
+
+ /**
+ * Returns the version of the font.
+ *
+ * @see java.awt.font.OpenType#getVersion
+ *
+ * @return the version in 16.16 fixed-point encoding, for example
+ * 0x00010000 for version 1.0.
+ */
+ public int getVersion()
+ {
+ /* No synchronization is needed because the version is set in the
+ * constructor, and it cannot change during the lifetime of the
+ * object.
+ */
+ return version;
+ }
+
+
+ /**
+ * Creates a view buffer for an OpenType table. The caller can
+ * access the returned buffer without needing to synchronize access
+ * from multiple threads.
+ *
+ * @param tag the table identifier, for example
+ * <code>OpenType.GLYF</code>.
+ *
+ * @return a slice of the underlying buffer containing the table, or
+ * <code>null</code> if the font does not contain the requested
+ * table.
+ */
+ public synchronized ByteBuffer getFontTable(int tag)
+ {
+ int index, start, len;
+ ByteBuffer result;
+
+ index = getTableIndex(tag);
+ if (index < 0)
+ return null;
+
+ start = tableStart[index];
+ len = tableLength[index];
+ buf.limit(start + len).position(start);
+ result = buf.slice();
+ result.limit(len);
+ return result;
+ }
+
+
+ /**
+ * Returns the size of one of the tables in the font,
+ * or -1 if the table does not exist.
+ */
+ public int getFontTableSize(int tag)
+ {
+ int index = getTableIndex(tag);
+ if (index == -1)
+ return index;
+ return tableLength[index];
+ }
+
+
+ private CharGlyphMap getCharGlyphMap()
+ {
+ if (cmap != null)
+ return cmap;
+
+ synchronized (this)
+ {
+ if (cmap == null)
+ {
+ int index = getTableIndex(OpenType.TAG_CMAP);
+ int start = tableStart[index];
+ buf.limit(start + tableLength[index]).position(start);
+ cmap = CharGlyphMap.forTable(buf);
+ }
+ return cmap;
+ }
+ }
+
+
+
+ /**
+ * Looks up a glyph in the font&#x2019;s <code>cmap</code> tables,
+ * without performing any glyph substitution or reordering. Because
+ * of this limitation, this method cannot be used for script systems
+ * that need advanced glyph mapping, such as Arabic, Korean, or even
+ * Latin with exotic accents.
+ *
+ * <p>It is safe to call this method from any thread.
+ *
+ * @param ucs4 the Unicode codepoint in the 32-bit Unicode character
+ * set UCS-4. Because UTF-16 surrogates do not correspond to a single
+ * glyph, it does not make sense to pass them here.
+ *
+ * @return the glyph index, or zero if the font does not contain
+ * a glyph for the specified codepoint.
+ */
+ public int getGlyph(int ucs4)
+ {
+ return getCharGlyphMap().getGlyph(ucs4);
+ }
+
+
+ /**
+ * Creates a GlyphVector by mapping each character in a
+ * CharacterIterator to the corresponding glyph.
+ *
+ * <p>The mapping takes only the font&#x2019;s <code>cmap</code>
+ * tables into consideration. No other operations (such as glyph
+ * re-ordering, composition, or ligature substitution) are
+ * performed. This means that the resulting GlyphVector will not be
+ * correct for text in languages that have complex
+ * character-to-glyph mappings, such as Arabic, Hebrew, Hindi, or
+ * Thai.
+ *
+ * @param font the font object that the created GlyphVector
+ * will return when it gets asked for its font. This argument is
+ * needed because the public API works with java.awt.Font,
+ * not with some private delegate like OpenTypeFont.
+ *
+ * @param frc the font rendering parameters that are used for
+ * measuring glyphs. The exact placement of text slightly depends on
+ * device-specific characteristics, for instance the device
+ * resolution or anti-aliasing. For this reason, any measurements
+ * will only be accurate if the passed
+ * <code>FontRenderContext</code> correctly reflects the relevant
+ * parameters. Hence, <code>frc</code> should be obtained from the
+ * same <code>Graphics2D</code> that will be used for drawing, and
+ * any rendering hints should be set to the desired values before
+ * obtaining <code>frc</code>.
+ *
+ * @param ci a CharacterIterator for iterating over the
+ * characters to be displayed.
+ */
+ public synchronized GlyphVector createGlyphVector(Font font,
+ FontRenderContext frc,
+ CharacterIterator ci)
+ {
+ CharGlyphMap cmap;
+ int numGlyphs;
+ int[] glyphs;
+ int glyph;
+ int c;
+
+ cmap = getCharGlyphMap();
+ numGlyphs = ci.getEndIndex() - ci.getBeginIndex();
+ glyphs = new int[numGlyphs];
+ glyph = 0;
+ for (c = ci.first(); c != CharacterIterator.DONE; c = ci.next())
+ {
+ /* handle surrogate pairs */
+ if (c >> 10 == 0x36) // U+D800 .. U+DBFF: High surrogate
+ c = (((c & 0x3ff) << 10) | (ci.next() & 0x3ff)) + 0x10000;
+ glyphs[glyph] = cmap.getGlyph(c);
+ glyph += 1;
+ }
+
+ /* If we had surrogates, the allocated array is too large.
+ * Because this will occur very rarely, it seems acceptable to
+ * re-allocate a shorter array and copy the contents around.
+ */
+ if (glyph != numGlyphs)
+ {
+ int[] newGlyphs = new int[glyph];
+ System.arraycopy(glyphs, 0, newGlyphs, 0, glyph);
+ glyphs = newGlyphs;
+ }
+
+ return new GNUGlyphVector(this, font, frc, glyphs);
+ }
+
+
+
+ /**
+ * Determines the advance width for a glyph.
+ *
+ * @param glyphIndex the glyph whose advance width is to be
+ * determined.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialias <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @param advance a point whose <code>x</code> and <code>y</code>
+ * fields will hold the advance in each direction. It is possible
+ * that both values are non-zero, for example if
+ * <code>transform</code> is a rotation, or in the case of Urdu
+ * fonts.
+ */
+ public synchronized void getAdvance(int glyphIndex,
+ float pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ boolean fractionalMetrics,
+ boolean horizontal,
+ Point2D advance)
+ {
+ /* Delegate the measurement to the scaler. The synchronization is
+ * needed because the scaler is not synchronized.
+ */
+ scaler.getAdvance(glyphIndex, pointSize, transform,
+ antialias, fractionalMetrics, horizontal,
+ advance);
+ }
+
+
+ /**
+ * Returns the shape of a glyph.
+ *
+ * @param glyph the glyph whose advance width is to be determined
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialias <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts, this
+ * parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional
+ * metrics, <code>false</code> for rounding the result to a pixel
+ * boundary.
+ *
+ * @return the scaled and grid-fitted outline of the specified
+ * glyph, or <code>null</code> for bitmap fonts.
+ */
+ public synchronized GeneralPath getGlyphOutline(int glyph,
+ float pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ boolean fractionalMetrics)
+ {
+ /* The synchronization is needed because the scaler is not
+ * synchronized.
+ */
+ return scaler.getOutline(glyph, pointSize, transform,
+ antialias, fractionalMetrics);
+ }
+
+
+ /**
+ * Returns a name for the specified glyph. This is useful for
+ * generating PostScript or PDF files that embed some glyphs of a
+ * font.
+ *
+ * <p><b>Names are not unique:</b> Under some rare circumstances,
+ * the same name can be returned for different glyphs. It is
+ * therefore recommended that printer drivers check whether the same
+ * name has already been returned for antoher glyph, and make the
+ * name unique by adding the string ".alt" followed by the glyph
+ * index.</p>
+ *
+ * <p>This situation would occur for an OpenType or TrueType font
+ * that has a <code>post</code> table of format 3 and provides a
+ * mapping from glyph IDs to Unicode sequences through a
+ * <code>Zapf</code> table. If the same sequence of Unicode
+ * codepoints leads to different glyphs (depending on contextual
+ * position, for example, or on typographic sophistication level),
+ * the same name would get synthesized for those glyphs.
+ *
+ * @param glyphIndex the glyph whose name the caller wants to
+ * retrieve.
+ */
+ public synchronized String getGlyphName(int glyphIndex)
+ {
+ if (glyphNamer == null)
+ glyphNamer = GlyphNamer.forTables(numGlyphs,
+ getFontTable(OpenType.TAG_POST),
+ getFontTable(TAG_ZAPF));
+
+ return glyphNamer.getGlyphName(glyphIndex);
+ }
+
+
+ /**
+ * Determines the distance between the base line and the highest
+ * ascender.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialiased <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the ascent, which usually is a positive number.
+ */
+ public synchronized float getAscent(float pointSize,
+ AffineTransform transform,
+ boolean antialiased,
+ boolean fractionalMetrics,
+ boolean horizontal)
+ {
+ return scaler.getAscent(pointSize, transform,
+ antialiased, fractionalMetrics,
+ horizontal);
+ }
+
+
+ /**
+ * Determines the distance between the base line and the lowest
+ * descender.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialiased <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the descent, which usually is a nagative number.
+ */
+ public synchronized float getDescent(float pointSize,
+ AffineTransform transform,
+ boolean antialiased,
+ boolean fractionalMetrics,
+ boolean horizontal)
+ {
+ return scaler.getDescent(pointSize, transform,
+ antialiased, fractionalMetrics,
+ horizontal);
+ }
+
+
+ /**
+ * Converts a four-byte tag identifier into a String that can be
+ * displayed when debugging this class.
+ *
+ * @param tag the tag as an <code>int</code>.
+ *
+ * @return the tag in human-readable form, for example
+ * <code>name</code> or <code>glyf</code>.
+ */
+ static String tagToString(int tag)
+ {
+ char[] c = new char[4];
+ c[0] = (char) ((tag >> 24) & 0xff);
+ c[1] = (char) ((tag >> 16) & 0xff);
+ c[2] = (char) ((tag >> 8) & 0xff);
+ c[3] = (char) (tag & 0xff);
+ return new String(c);
+ }
+}
diff --git a/gnu/java/awt/font/opentype/OpenTypeFontFactory.java b/gnu/java/awt/font/opentype/OpenTypeFontFactory.java
new file mode 100644
index 000000000..3a00dfba2
--- /dev/null
+++ b/gnu/java/awt/font/opentype/OpenTypeFontFactory.java
@@ -0,0 +1,140 @@
+/* OpenTypeFontFactory.java -- Creates OpenType and TrueType fonts.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype;
+
+import gnu.java.awt.font.FontDelegate;
+import java.awt.FontFormatException;
+import java.awt.font.OpenType;
+import java.nio.ByteBuffer;
+
+
+/**
+ * A factory for creating fonts that are stored in an
+ * <i>sfnt</i>-housed format, for example OpenType or TrueType.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+public final class OpenTypeFontFactory
+{
+ /**
+ * The constructor is private so nobody can construct an instance
+ * of this class.
+ */
+ private OpenTypeFontFactory()
+ {
+ }
+
+
+ /**
+ * Creates FontDelegate objects for the fonts in the specified
+ * buffer. The following font formats are currently recognized:
+ *
+ * <p><ul>
+ * <li>OpenType (*.otf);</li>
+ * <li>TrueType (*.ttf);</li>
+ * <li>TrueType Collections (*.ttc);</li>
+ * <li>Apple MacOS X data-fork font (*.dfont).</li></ul>
+ *
+ * <p>Some formats may contain more than a single font, for example
+ * *.ttc and *.dfont files. This is the reason why this function
+ * returns an array.
+ *
+ * <p>The implementation reads data from the buffer only when
+ * needed. Therefore, it greatly increases efficiency if
+ * <code>buf</code> has been obtained through mapping a file into
+ * the virtual address space.
+ *
+ * @throws FontFormatException if the font data is not in one of the
+ * known formats.
+ */
+ public static FontDelegate[] createFonts(ByteBuffer buf)
+ throws FontFormatException
+ {
+ OpenTypeFont[] fonts;
+ int version;
+
+ version = buf.getInt(0);
+ switch (version)
+ {
+ case 0x00010000: // Microsoft Windows TrueType
+ case OpenType.TAG_TYP1: // Apple MacOS PostScript ('typ1')
+ case OpenTypeFont.TAG_SFNT: // Apple MacOS TrueType ('sfnt')
+ case OpenTypeFont.TAG_TRUE: // Apple MacOS TrueType ('true')
+ case OpenTypeFont.TAG_OTTO: // OpenType
+ return new OpenTypeFont[] { new OpenTypeFont(buf, 0) };
+ }
+
+
+ /* TrueType Collection, see "TrueType Collections" in
+ * http://partners.adobe.com/asn/tech/type/opentype/otff.html
+ */
+ if (version == OpenTypeFont.TAG_TTCF)
+ {
+ // This code has never been tested.
+ fonts = new OpenTypeFont[buf.getInt(8)];
+ for (int i = 0; i < fonts.length; i++)
+ fonts[i] = new OpenTypeFont(buf, buf.getInt(16 + 4 * i));
+ return fonts;
+ }
+
+
+ /* The MacOS X .dfont format is a Macintosh resource fork in
+ * a normal file, contaning one or several 'sfnt' resources.
+ * Unfortunately, MacOS resource forks have no magic code
+ * that could be used for identification. Instead, we just try
+ * to extract at least one 'sfnt'.
+ */
+ try
+ {
+ MacResourceFork fork = new MacResourceFork(buf);
+ MacResourceFork.Resource[] rsrc;
+
+ rsrc = fork.getResources(OpenTypeFont.TAG_SFNT);
+ fonts = new OpenTypeFont[rsrc.length];
+ for (int i = 0; i < fonts.length; i++)
+ fonts[i] = new OpenTypeFont(rsrc[i].getContent(), 0);
+
+ return fonts;
+ }
+ catch (Exception ex)
+ {
+ }
+
+ throw new FontFormatException("not in OpenType or TrueType format");
+ }
+}
diff --git a/gnu/java/awt/font/opentype/Scaler.java b/gnu/java/awt/font/opentype/Scaler.java
new file mode 100644
index 000000000..499c3ea52
--- /dev/null
+++ b/gnu/java/awt/font/opentype/Scaler.java
@@ -0,0 +1,192 @@
+/* Scaler.java -- Common superclass for font scalers.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype;
+
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
+
+
+/**
+ * An common superclass for all font scalers. The main task of font
+ * scaler is to retrieve a scaled and hinted outline for a glyph.
+ *
+ * <p>To make text more legible, high-quality fonts contain
+ * instructions (sometimes also called &#x201c;hints&#x201d;) for
+ * moving the scaled control points towards the coordinate grid of the
+ * display device.
+ *
+ * <p><b>Lack of Thread Safety:</b> Font scalers are intentionally
+ * <i>not</i> safe to access from multiple concurrent
+ * threads. Synchronization needs to be performed externally. Usually,
+ * the font that uses this scaler already has obtained a lock before
+ * calling the scaler.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+public abstract class Scaler
+{
+ /**
+ * Retrieves the scaled outline of a glyph, adjusting control points
+ * to the raster grid if necessary.
+ *
+ * @param glyph the glyph number whose outline is retrieved.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialias whether or not the rasterizer will perform
+ * anti-aliasing on the returned path.
+ *
+ * @param fractionalMetrics <code>false</code> for adjusting glyph
+ * positions to the raster grid of device space.
+ *
+ * @return the scaled and grid-fitted outline of the specified
+ * glyph, or <code>null</code> for bitmap fonts.
+ */
+ public abstract GeneralPath getOutline(int glyph,
+ float pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ boolean fractionalMetrics);
+
+
+ /**
+ * Determines the advance width and height for a glyph.
+ *
+ * @param glyphIndex the glyph whose advance width is to be
+ * determined.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialias <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @param advance a point whose <code>x</code> and <code>y</code>
+ * fields will hold the advance in each direction. It is well
+ * possible that both values are non-zero, for example for rotated
+ * text or for Urdu fonts.
+ */
+ public abstract void getAdvance(int glyphIndex,
+ float pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ boolean fractionalMetrics,
+ boolean horizontal,
+ Point2D advance);
+
+
+ /**
+ * Determines the distance between the base line and the highest
+ * ascender.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialias <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the ascent, which usually is a positive number.
+ */
+ public abstract float getAscent(float pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ boolean fractionalMetrics,
+ boolean horizontal);
+
+
+ /**
+ * Determines the distance between the base line and the lowest
+ * descender.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialiased <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the descent, which usually is a nagative number.
+ */
+ public abstract float getDescent(float pointSize,
+ AffineTransform transform,
+ boolean antialiased,
+ boolean fractionalMetrics,
+ boolean horizontal);
+}
diff --git a/gnu/java/awt/font/opentype/truetype/Fixed.java b/gnu/java/awt/font/opentype/truetype/Fixed.java
new file mode 100644
index 000000000..5d81c5d2e
--- /dev/null
+++ b/gnu/java/awt/font/opentype/truetype/Fixed.java
@@ -0,0 +1,161 @@
+/* Fixed.java -- Fixed-point arithmetics for TrueType coordinates.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.font.opentype.truetype;
+
+
+/**
+ * A utility class for fixed-point arithmetics, where numbers are
+ * represented with 26 dot 6 digits. This representation is used by
+ * TrueType coordinates.
+ *
+ * <p>A good compiler will inline calls of methods in this class.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+final class Fixed
+{
+ public static final int ONE = 1<<6;
+
+
+ /**
+ * The constructor is private so nobody can use it.
+ */
+ private Fixed()
+ {
+ }
+
+
+ /**
+ * Multiplies two fixed-point numbers.
+ */
+ public static int mul(int a, int b)
+ {
+ return (int) ((((long) a) * b) >> 6);
+ }
+
+
+ public static int div(int a, int b)
+ {
+ return (int) ((((long) a) << 6) / b);
+ }
+
+
+
+ public static int ceil(int a)
+ {
+ return (a + 63) & -64;
+ }
+
+
+ public static int floor(int a)
+ {
+ return a & -64;
+ }
+
+
+ /**
+ * Calculates the length of a fixed-point vector.
+ */
+ public static int vectorLength(int x, int y)
+ {
+ int shift;
+ float fx, fy;
+
+ if (x == 0)
+ return Math.abs(y);
+ else if (y == 0)
+ return Math.abs(x);
+
+ /* Use the FPU. */
+ fx = ((float) x) / 64.0f;
+ fy = ((float) y) / 64.0f;
+ return (int) (Math.sqrt(fx * fx + fy * fy) * 64.0);
+ }
+
+
+ public static int intValue(int f)
+ {
+ return f >> 6;
+ }
+
+
+ public static float floatValue(int f)
+ {
+ return ((float) f) / 64;
+ }
+
+
+ public static double doubleValue(int f)
+ {
+ return ((double) f) / 64;
+ }
+
+
+ public static int valueOf(float f)
+ {
+ return (int) (f * 64);
+ }
+
+
+ public static int valueOf(double d)
+ {
+ return (int) (d * 64);
+ }
+
+
+ /**
+ * Makes a string representation of a fixed-point number.
+ */
+ public static String toString(int f)
+ {
+ return String.valueOf(floatValue(f));
+ }
+
+
+ public static String toString(int x, int y)
+ {
+ StringBuffer sbuf = new StringBuffer(40);
+ sbuf.append('(');
+ sbuf.append(((float) x) / 64);
+ sbuf.append(", ");
+ sbuf.append(((float) y) / 64);
+ sbuf.append(')');
+ return sbuf.toString();
+ }
+}
diff --git a/gnu/java/awt/font/opentype/truetype/GlyphLoader.java b/gnu/java/awt/font/opentype/truetype/GlyphLoader.java
new file mode 100644
index 000000000..b12d7782b
--- /dev/null
+++ b/gnu/java/awt/font/opentype/truetype/GlyphLoader.java
@@ -0,0 +1,437 @@
+/* GlyphLoader.java -- Helper for loading TrueType glyph outlines.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.font.opentype.truetype;
+
+import java.awt.geom.AffineTransform;
+import java.nio.ByteBuffer;
+
+
+/**
+ * A class for loading scaled and hinted glyph outlines.
+ *
+ * <p><b>Lack of Thread Safety:</b> Glyph loaders are intentionally
+ * <i>not</i> safe to access from multiple concurrent
+ * threads. Synchronization needs to be performed externally. Usually,
+ * the font has already obtained a lock before calling the scaler,
+ * which in turn calls the GlyphLoader. It would thus be wasteful to
+ * acquire additional locks for the GlyphLoader.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+final class GlyphLoader
+{
+ /**
+ * A helper object for locating glyph data. GlyphLocator is an
+ * abstract superclass, and there is a concretization for each glyph
+ * location table ('loca') format.
+ */
+ private final GlyphLocator glyphLocator;
+
+
+ /**
+ * A helper object for measuring the advance width and height of a
+ * glyph.
+ */
+ private final GlyphMeasurer glyphMeasurer;
+
+
+ /**
+ * The virtual machine for executing TrueType bytecodes.
+ */
+ private final VirtualMachine vm;
+
+
+ /**
+ * The number of font units in one em. A typical value is 2048,
+ * but this depends on the font.
+ */
+ private final int unitsPerEm;
+
+ private final int[] contourEndPoints;
+ private final byte[] pointFlags;
+
+
+ /**
+ * Constructs a GlyphLoader.
+ */
+ GlyphLoader(GlyphLocator glyphLocator, VirtualMachine vm,
+ int unitsPerEm, int maxContours, int maxPoints,
+ GlyphMeasurer glyphMeasurer)
+ {
+ this.glyphLocator = glyphLocator;
+ this.glyphMeasurer = glyphMeasurer;
+ this.unitsPerEm = unitsPerEm;
+ this.vm = vm;
+
+ contourEndPoints = new int[maxContours];
+ pointFlags = new byte[maxPoints];
+ }
+
+
+ /**
+ * @param glyphIndex the number of the glyph whose outlines are to be
+ * retrieved.
+ */
+ public void loadGlyph(int glyphIndex,
+ double pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ Zone glyphZone)
+ {
+ glyphZone.setNumPoints(4);
+ loadSubGlyph(glyphIndex, pointSize, transform, antialias, glyphZone,
+ 0, 0);
+ }
+
+
+ private void loadSubGlyph(int glyphIndex,
+ double pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ Zone glyphZone,
+ int preTranslateX,
+ int preTranslateY)
+ {
+ ByteBuffer glyph;
+ int numContours;
+ int xMin, yMin, xMax, yMax;
+ byte flag;
+
+ glyph = glyphLocator.getGlyphData(glyphIndex);
+
+ if (glyph == null)
+ {
+ glyphZone.setNumPoints(4);
+ setPhantomPoints(glyphIndex, 0, glyphZone);
+ glyphZone.transform(pointSize, transform, unitsPerEm,
+ preTranslateX, preTranslateY);
+ return;
+ }
+
+ numContours = glyph.getShort();
+ xMin = glyph.getChar();
+ yMin = glyph.getChar();
+ xMax = glyph.getChar();
+ yMax = glyph.getChar();
+
+
+ if (numContours >= 0)
+ loadSimpleGlyph(glyphIndex, pointSize, transform, antialias,
+ numContours, glyph, glyphZone,
+ preTranslateX, preTranslateY);
+ else
+ loadCompoundGlyph(glyphIndex, pointSize, transform, antialias,
+ glyph, glyphZone,
+ preTranslateX, preTranslateY);
+ }
+
+
+ private void loadSimpleGlyph(int glyphIndex,
+ double pointSize, AffineTransform transform,
+ boolean antialias,
+ int numContours, ByteBuffer glyph,
+ Zone glyphZone,
+ int preTranslateX, int preTranslateY)
+ {
+ int numPoints;
+ int posInstructions, numInstructions;
+ boolean execInstructions;
+
+ execInstructions = vm.setup(pointSize, transform, antialias);
+
+ /* Load the contour end points and determine the number of
+ * points.
+ */
+ for (int i = 0; i < numContours; i++)
+ contourEndPoints[i] = glyph.getChar();
+ if (numContours > 0)
+ numPoints = 1 + contourEndPoints[numContours - 1];
+ else
+ numPoints = 0;
+ glyphZone.setNumPoints(numPoints + 4);
+
+ numInstructions = glyph.getChar();
+ posInstructions = glyph.position();
+ glyph.position(posInstructions + numInstructions);
+ loadFlags(numPoints, glyph);
+ loadCoordinates(numPoints, glyph, glyphZone);
+ for (int i = 0; i < numContours; i++)
+ glyphZone.setContourEnd(contourEndPoints[i], true);
+
+ setPhantomPoints(glyphIndex, numPoints, glyphZone);
+ glyphZone.transform(pointSize, transform, unitsPerEm,
+ preTranslateX, preTranslateY);
+
+ if (execInstructions)
+ {
+ // FIXME: Hint the glyph.
+ }
+ }
+
+
+ private static final short ARGS_ARE_WORDS = 1;
+ private static final short ARGS_ARE_XY_VALUES = 2;
+ private static final short ROUND_XY_TO_GRID = 4;
+ private static final short WE_HAVE_A_SCALE = 8;
+ private static final short MORE_COMPONENTS = 32;
+ private static final short WE_HAVE_AN_X_AND_Y_SCALE = 64;
+ private static final short WE_HAVE_A_TWO_BY_TWO = 128;
+ private static final short WE_HAVE_INSTRUCTIONS = 256;
+ private static final short USE_MY_METRICS = 512;
+ private static final short OVERLAP_COMPOUND = 1024;
+ private static final short SCALED_COMPONENT_OFFSET = 2048;
+ private static final short UNSCALED_COMPONENT_OFFSET = 4096;
+
+ private void loadCompoundGlyph(int glyphIndex,
+ double pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ ByteBuffer glyph,
+ Zone glyphZone,
+ int preTranslateX, int preTranslateY)
+ {
+ short flags;
+ int subGlyphIndex;
+ int metricsGlyphIndex;
+ Zone subGlyphZone = new Zone(glyphZone.getCapacity());
+ int arg1, arg2;
+ double a, b, c, d, e, f;
+ AffineTransform componentTransform = new AffineTransform();
+
+ /* By default, use the metrics of the compound glyph. The default
+ * is overridden if some component glyph has the USE_MY_METRICS
+ * flag set.
+ */
+ metricsGlyphIndex = glyphIndex;
+
+ do
+ {
+ flags = glyph.getShort();
+ subGlyphIndex = glyph.getChar();
+
+ if ((flags & USE_MY_METRICS) != 0)
+ metricsGlyphIndex = subGlyphIndex;
+
+ if ((flags & ARGS_ARE_WORDS) != 0)
+ {
+ arg1 = glyph.getShort();
+ arg2 = glyph.getShort();
+ }
+ else
+ {
+ arg1 = glyph.get();
+ arg2 = glyph.get();
+ }
+
+ if ((flags & WE_HAVE_A_SCALE) != 0)
+ {
+ a = d = getDouble214(glyph);
+ b = c = 0.0;
+ }
+ else if ((flags & WE_HAVE_AN_X_AND_Y_SCALE) != 0)
+ {
+ a = getDouble214(glyph);
+ d = getDouble214(glyph);
+ b = c = 0.0;
+ }
+ else if ((flags & WE_HAVE_A_TWO_BY_TWO) != 0)
+ {
+ a = getDouble214(glyph);
+ b = getDouble214(glyph);
+ c = getDouble214(glyph);
+ d = getDouble214(glyph);
+ }
+ else
+ {
+ a = d = 1.0;
+ b = c = 0.0;
+ }
+
+ double m = Math.max(Math.abs(a), Math.abs(b));
+ double n = Math.max(Math.abs(c), Math.abs(d));
+
+ /* The Apple TrueType specification actually says that m is
+ * multiplied by two if
+ *
+ * abs(abs(a) - abs(c)) <= 33/65536,
+ *
+ * but this is probably a typo. On 2003-07-23, Sascha Brawer
+ * wrote an e-mail message to applefonts@apple.com, asking
+ * whether this might possibly be an error in the specification.
+ */
+ if (Math.abs(Math.abs(a) - Math.abs(b)) <= 33.0/65536.0)
+ m = m * 2;
+
+ if (Math.abs(Math.abs(c) - Math.abs(d)) <= 33.0/65536.0)
+ n = n * 2;
+
+ if ((flags & ARGS_ARE_XY_VALUES) != 0)
+ {
+ e = m * arg1;
+ f = n * arg2;
+ }
+ else
+ e = f = 0.0;
+
+ componentTransform.setTransform(a, b, c, d, 0.0, 0.0);
+
+ // System.out.println("componentTransform = " + componentTransform
+ // + ", e=" + e + ", f=" + f);
+ componentTransform.concatenate(transform);
+
+ int pos = glyph.position();
+ int lim = glyph.limit();
+
+ loadSubGlyph(subGlyphIndex, pointSize, componentTransform,
+ antialias, subGlyphZone,
+ Math.round((float) e + preTranslateX),
+ Math.round(-((float) f + preTranslateY)));
+ glyphZone.combineWithSubGlyph(subGlyphZone, 4);
+ glyph.limit(lim).position(pos);
+ }
+ while ((flags & MORE_COMPONENTS) != 0);
+
+ setPhantomPoints(metricsGlyphIndex, glyphZone.getSize() - 4, glyphZone);
+ }
+
+
+ private double getDouble214(ByteBuffer buf)
+ {
+ return ((double) buf.getShort()) / (1 << 14);
+ }
+
+
+ /**
+ * Loads the per-point flags of a glyph into the
+ * <code>pointFlags</code> field.
+ */
+ private void loadFlags(int numPoints, ByteBuffer glyph)
+ {
+ byte flag;
+ int numRepetitions;
+
+ for (int i = 0; i < numPoints; i++)
+ {
+ pointFlags[i] = flag = glyph.get();
+ if ((flag & 8) != 0)
+ {
+ numRepetitions = ((int) glyph.get()) & 0xff;
+ while (numRepetitions > 0)
+ {
+ pointFlags[++i] = flag;
+ --numRepetitions;
+ }
+ }
+ }
+ }
+
+
+ private void loadCoordinates(int numPoints, ByteBuffer glyph,
+ Zone glyphZone)
+ {
+ int x, y;
+ byte flag;
+
+ x = 0;
+ for (int i = 0; i < numPoints; i++)
+ {
+ flag = pointFlags[i];
+ if ((flag & 2) == 0)
+ {
+ if ((flag & 16) == 0)
+ x += glyph.getShort();
+ }
+ else
+ {
+ if ((flag & 16) != 0)
+ x += (glyph.get() & 0xff);
+ else
+ x -= (glyph.get() & 0xff);
+ }
+ glyphZone.setOriginalX(i, x);
+ glyphZone.setOnCurve(i, (flag & 1) == 1);
+ }
+
+ y = 0;
+ for (int i = 0; i < numPoints; i++)
+ {
+ flag = pointFlags[i];
+ if ((flag & 4) == 0)
+ {
+ if ((flag & 32) == 0)
+ y += glyph.getShort();
+ }
+ else
+ {
+ if ((flag & 32) != 0)
+ y += (glyph.get() & 0xff);
+ else
+ y -= (glyph.get() & 0xff);
+ }
+ glyphZone.setOriginalY(i, -y);
+ }
+ }
+
+
+ private void setPhantomPoints(int glyphIndex, int numPoints,
+ Zone glyphZone)
+ {
+ /* Phantom point 0: Character origin. */
+ glyphZone.setOriginalX(numPoints, 0);
+ glyphZone.setOriginalY(numPoints, 0);
+
+ /* Phantom point 1: Horizontal advance point. */
+ glyphZone.setOriginalX(numPoints + 1,
+ glyphMeasurer.getAdvanceWidth(glyphIndex, true));
+ glyphZone.setOriginalY(numPoints + 1,
+ glyphMeasurer.getAdvanceHeight(glyphIndex, true));
+
+ /* Phantom point 2: Vertical origin. */
+ int vertX = glyphMeasurer.getAscent(/* vertical */ false);
+ int vertY = glyphMeasurer.getAscent(/* horizontal */ true);
+ glyphZone.setOriginalX(numPoints + 2, vertX);
+ glyphZone.setOriginalY(numPoints + 2, vertY);
+
+ /* Phantom point 3: Vertical advance point. */
+ glyphZone.setOriginalX(numPoints + 3,
+ vertX + glyphMeasurer.getAdvanceWidth(glyphIndex, false));
+ glyphZone.setOriginalY(numPoints + 3,
+ vertY + glyphMeasurer.getAdvanceHeight(glyphIndex, false));
+ }
+}
diff --git a/gnu/java/awt/font/opentype/truetype/GlyphLocator.java b/gnu/java/awt/font/opentype/truetype/GlyphLocator.java
new file mode 100644
index 000000000..a2db8aca7
--- /dev/null
+++ b/gnu/java/awt/font/opentype/truetype/GlyphLocator.java
@@ -0,0 +1,187 @@
+/* GlyphLocator.java -- Locates outlines of TrueType glyphs.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype.truetype;
+
+import java.awt.FontFormatException;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.IntBuffer;
+
+
+/**
+ * Locates glyph outlines in a TrueType or OpenType <code>glyf</code>
+ * table.
+ *
+ * @see <a href=
+ * "http://partners.adobe.com/asn/tech/type/opentype/loca.html"
+ * >Adobe&#x2019;s specification of the OpenType &#x2018;loca&#x2019;
+ * table</a>
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+abstract class GlyphLocator
+{
+ /**
+ * The actual glyph data of the font, which is contained in the
+ * 'glyf' table.
+ */
+ protected ByteBuffer glyfTable;
+
+
+ /**
+ * Creates a new GlyphLocator for a <code>loca</code> table.
+ *
+ * @param format the format of the <code>loca</code> table. The
+ * value must be 0 for two-byte offsets, or 1 for four-byte
+ * offsets. TrueType and OpenType fonts indicate the format in the
+ * <code>indexToLoc</code> field of the <a href=
+ * "http://partners.adobe.com/asn/tech/type/opentype/head.html"
+ * >font header</a>.
+ *
+ * @param loca the <code>loca</code> table of the font, which
+ * contains the position of each glyph in the <code>glyf</code>
+ * table.
+ *
+ * @param glyf the <code>glyf</code> table of the font, which
+ * contains the outline data of each glyph.
+ *
+ * @throws FontFormatException if <code>format</code> is neither 0
+ * nor 1.
+ */
+ public static GlyphLocator forTable(int format, ByteBuffer loca,
+ ByteBuffer glyf)
+ throws FontFormatException
+ {
+ switch (format)
+ {
+ case 0:
+ return new GlyphLocator.TwoByte(loca, glyf);
+
+ case 1:
+ return new GlyphLocator.FourByte(loca, glyf);
+
+ default:
+ throw new FontFormatException("unsupported loca format");
+ }
+ }
+
+
+ /**
+ * Locates the outline data for a glyph.
+ *
+ * <p>For efficiency, the glyph locator does not create a new buffer
+ * for each invocation. Instead, this method always returns the same
+ * buffer object. Therefore, the data of a glyph must have been read
+ * completely before another glyph of the same font gets requested
+ * through this method.
+ *
+ * @param glyph the number of the glyph whose outlines are to be
+ * retrieved.
+ *
+ * @return a buffer whose position is set to the first byte of glyph
+ * data, and whose limit is set to disallow accessing any data that
+ * does not belong to the glyph. If there is no outline data for the
+ * requested glyph, as would be the case for the space glyph, the
+ * result will be <code>null</code>.
+ */
+ public abstract ByteBuffer getGlyphData(int glyph);
+
+
+ /**
+ * A GlyphLocator that locates glyphs using two-byte offsets,
+ * interpreting <code>loca</code> tables of format 0.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+ private final static class TwoByte
+ extends GlyphLocator
+ {
+ final CharBuffer indexToLoc;
+
+ TwoByte(ByteBuffer loca, ByteBuffer glyf)
+ {
+ this.glyfTable = glyf;
+ indexToLoc = loca.asCharBuffer();
+ }
+
+
+ public ByteBuffer getGlyphData(int glyph)
+ {
+ int offset, limit;
+ offset = ((int) indexToLoc.get(glyph)) << 1;
+ limit = ((int) indexToLoc.get(glyph + 1)) << 1;
+ if (offset >= limit)
+ return null;
+
+ glyfTable.limit(limit).position(offset);
+ return glyfTable;
+ }
+ }
+
+
+ /**
+ * A GlyphLocator that locates glyphs using four-byte offsets,
+ * interpreting <code>loca</code> tables of format 1.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+ private final static class FourByte
+ extends GlyphLocator
+ {
+ final IntBuffer indexToLoc;
+
+ FourByte(ByteBuffer loca, ByteBuffer glyf)
+ {
+ this.glyfTable = glyf;
+ indexToLoc = loca.asIntBuffer();
+ }
+
+
+ public ByteBuffer getGlyphData(int glyph)
+ {
+ int offset, limit;
+ offset = indexToLoc.get(glyph);
+ limit = indexToLoc.get(glyph + 1);
+ if (offset >= limit)
+ return null;
+
+ glyfTable.limit(limit).position(offset);
+ return glyfTable;
+ }
+ }
+}
diff --git a/gnu/java/awt/font/opentype/truetype/GlyphMeasurer.java b/gnu/java/awt/font/opentype/truetype/GlyphMeasurer.java
new file mode 100644
index 000000000..bbd0b9bff
--- /dev/null
+++ b/gnu/java/awt/font/opentype/truetype/GlyphMeasurer.java
@@ -0,0 +1,228 @@
+/* GlyphMeasurer.java -- Helper for measuring TrueType glyphs.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.font.opentype.truetype;
+
+import java.awt.FontFormatException;
+import java.nio.ByteBuffer;
+import java.nio.ShortBuffer;
+
+
+/**
+ * A class for measuring TrueType and OpenType glyphs.
+ *
+ * <p><b>Lack of Thread Safety:</b> Glyph measurers are intentionally
+ * <i>not</i> safe to access from multiple concurrent
+ * threads. Synchronization needs to be performed externally. Usually,
+ * the font has already obtained a lock before calling the scaler,
+ * which in turn calls the GlyphMeasurer. It would thus be wasteful to
+ * acquire additional locks for the GlyphMeasurer.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+final class GlyphMeasurer
+{
+ /**
+ * A view buffer that allows accessing the contents of the
+ * font&#x2019;s <code>hmtx</code> table as shorts.
+ */
+ private final ShortBuffer horizontalGlyphMetrics;
+
+
+ /**
+ * A view buffer that allows accessing the contents of the
+ * font&#x2019;s <code>vmtx</code> table as shorts.
+ */
+ private final ShortBuffer verticalGlyphMetrics;
+
+
+ private final int numLongHorizontalMetricsEntries;
+ private final int numLongVerticalMetricsEntries;
+
+ private final int horizontalAscent;
+ private final int verticalAscent;
+
+ private final int horizontalDescent;
+ private final int verticalDescent;
+
+ private final int horizontalLineGap;
+
+
+ /**
+ * Constructs a GlyphMeasurer from TrueType/OpenType font tables.
+ *
+ * @param hhea the <code>hhea</code> table, which contains
+ * information about horizontal metrics that is common to all
+ * glyphs.
+ *
+ * @param hmtx the <code>hmtx</code> table, which contains
+ * glyph-specific information about horizontal metrics.
+ *
+ * @param vhea the <code>vhea</code> table, which contains
+ * information about vertical metrics that is common to all
+ * glyphs. If a font does not provide such a table, pass
+ * <code>null</code>.
+ *
+ * @param vmtx the <code>vmtx</code> table, which contains
+ * glyph-specific information about vertical metrics. If a font
+ * does not provide such a table, pass <code>null</code>.
+ */
+ GlyphMeasurer(ByteBuffer hhea, ByteBuffer hmtx,
+ ByteBuffer vhea, ByteBuffer vmtx)
+ throws FontFormatException
+ {
+ if ((hhea.getInt(0) != 0x00010000) || (hhea.getInt(30) != 0))
+ throw new FontFormatException("unsupported hhea format");
+
+ horizontalAscent = hhea.getShort(4);
+ horizontalDescent = hhea.getShort(6);
+ horizontalLineGap = hhea.getShort(8);
+
+ numLongHorizontalMetricsEntries = hhea.getChar(34);
+ horizontalGlyphMetrics = hmtx.asShortBuffer();
+
+ if (vhea != null)
+ {
+ verticalAscent = vhea.getShort(4);
+ verticalDescent = vhea.getShort(6);
+ numLongVerticalMetricsEntries = vhea.getChar(34);
+ verticalGlyphMetrics = vmtx.asShortBuffer();
+ }
+ else
+ {
+ verticalAscent = /* advanceWidthMax */ hhea.getChar(10) / 2;
+ verticalDescent = -verticalAscent;
+ numLongVerticalMetricsEntries = 0;
+ verticalGlyphMetrics = null;
+ }
+ }
+
+
+ /**
+ * Returns the distance from the baseline to the highest ascender.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the maximal ascent, in font units.
+ */
+ public int getAscent(boolean horizontal)
+ {
+ return horizontal ? horizontalAscent : verticalAscent;
+ }
+
+
+ /**
+ * Returns the distance from the baseline to the lowest descender.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the maximal descent, in font units.
+ */
+ public int getDescent(boolean horizontal)
+ {
+ return horizontal ? horizontalDescent : verticalDescent;
+ }
+
+
+ /**
+ * Returns the typographic line gap.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the line gap, in font units.
+ */
+ public int getLineGap(boolean horizontal)
+ {
+ return horizontalLineGap;
+ }
+
+
+ /**
+ * Determines the advance width of a glyph, without considering
+ * hinting.
+ *
+ * @param glyphIndex the index of the glyph whose advance width is
+ * to be determined.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the advance width, in font units.
+ */
+ public int getAdvanceWidth(int glyphIndex, boolean horizontal)
+ {
+ if (!horizontal)
+ return 0;
+
+ glyphIndex = Math.min(glyphIndex,
+ numLongHorizontalMetricsEntries - 1);
+ return horizontalGlyphMetrics.get(glyphIndex << 1);
+ }
+
+
+ /**
+ * Determines the advance width of a glyph, without considering
+ * hinting.
+ *
+ * @param glyphIndex the index of the glyph whose advance width is
+ * to be determined.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the advance width, in font units.
+ */
+ public int getAdvanceHeight(int glyphIndex, boolean horizontal)
+ {
+ if (horizontal)
+ return 0;
+
+ /* If a font does not provide vertical glyph metrics, advance
+ * by the height of one horizontal line.
+ */
+ if (verticalGlyphMetrics == null)
+ return horizontalAscent - horizontalDescent + horizontalLineGap;
+
+ glyphIndex = Math.min(glyphIndex,
+ numLongVerticalMetricsEntries - 1);
+ return verticalGlyphMetrics.get(glyphIndex << 1);
+ }
+}
diff --git a/gnu/java/awt/font/opentype/truetype/TrueTypeScaler.java b/gnu/java/awt/font/opentype/truetype/TrueTypeScaler.java
new file mode 100644
index 000000000..e4d7309cb
--- /dev/null
+++ b/gnu/java/awt/font/opentype/truetype/TrueTypeScaler.java
@@ -0,0 +1,372 @@
+/* TrueTypeScaler.java -- Font scaler for TrueType outlines.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype.truetype;
+
+import gnu.java.awt.font.opentype.Scaler;
+
+import java.awt.FontFormatException;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
+import java.nio.ByteBuffer;
+
+
+/**
+ * A scaler for fonts whose outlines are described in the TrueType
+ * format.
+ *
+ * <p><b>Lack of Thread Safety:</b> Font scalers are intentionally
+ * <i>not</i> safe to access from multiple concurrent threads.
+ * Synchronization needs to be performed externally. Usually, the font
+ * that uses this scaler already has obtained a lock before calling
+ * the scaler.
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+public final class TrueTypeScaler
+ extends Scaler
+{
+ /**
+ * The TrueType or OpenType table that contains the glyph outlines.
+ */
+ private ByteBuffer glyfTable;
+
+
+ /**
+ * A helper object for loading glyph outlines.
+ */
+ private GlyphLoader glyphLoader;
+
+
+ /**
+ * A helper object for measuring the advance width and height of a
+ * glyph.
+ */
+ private final GlyphMeasurer glyphMeasurer;
+
+ private final Zone glyphZone;
+
+
+ /**
+ * The number of units per em. A typical value is 2048, but some
+ * font use other numbers as well.
+ */
+ private int unitsPerEm;
+
+
+ /**
+ * Constructs a new TrueTypeScaler.
+ *
+ * @param unitsPerEm the number of font units per em. This value can
+ * be retrieved from the font&#x2019;s <code>head</code> table.
+ *
+ * @param maxp the <code>maxp</code> table of the font, which
+ * contains various constants needed for setting up the virtual
+ * machine that interprets TrueType bytecodes.
+ *
+ * @param controlValueTable the <code>cvt</code> table of the font,
+ * which contains the initial values of the control value table.
+ *
+ * @param fpgm the <code>fpgm</code> table of the font, which
+ * contains a font program that is executed exactly once. The
+ * purpose of the font program is to define functions and to patch
+ * the interpreter.
+ *
+ * @param locaFormat the format of the <code>loca</code> table. The
+ * value must be 0 for two-byte offsets, or 1 for four-byte
+ * offsets. TrueType and OpenType fonts indicate the format in the
+ * <code>indexToLoc</code> field of the <a href=
+ * "http://partners.adobe.com/asn/tech/type/opentype/head.html"
+ * >font header</a>.
+ *
+ * @param loca the <code>loca</code> table of the font, which
+ * contains for each glyph the offset of its outline data
+ * in <code>glyf</code>.
+ *
+ * @param glyf the <code>glyf</code> table of the font, which
+ * contains the outline data for all glyphs in the font.
+ *
+ * @param preProgram the <code>prep</code> table of the font, which
+ * contains a program that is executed whenever the point size or
+ * the device transform have changed. This program is called
+ * pre-program because it gets executed before the instructions of
+ * the individual glyphs. If the font does not contain a
+ * pre-program, pass <code>null</code>.
+ *
+ * @throws FontFormatException if <code>format</code> is neither 0
+ * nor 1.
+ */
+ public TrueTypeScaler(int unitsPerEm,
+ ByteBuffer hhea,
+ ByteBuffer htmx,
+ ByteBuffer vhea,
+ ByteBuffer vtmx,
+ ByteBuffer maxp,
+ ByteBuffer controlValueTable,
+ ByteBuffer fpgm,
+ int locaFormat, ByteBuffer loca,
+ ByteBuffer glyf,
+ ByteBuffer preProgram)
+ throws FontFormatException
+ {
+ int maxContours, maxPoints;
+ VirtualMachine vm;
+
+ maxContours = Math.max(/* maxContours */ (int) maxp.getChar(8),
+ /* maxCompositeContours */ (int) maxp.getChar(12))
+ + /* fix for some broken fonts */ 8;
+ maxPoints = Math.max(/* maxPoints */ (int) maxp.getChar(6),
+ /* maxCompositePoints */ (int) maxp.getChar(10))
+ + /* fix for some broken fonts */ 12;
+
+
+ glyphZone = new Zone(maxPoints + /* four phantom points */ 4);
+ this.glyfTable = glyf;
+ vm = new VirtualMachine(unitsPerEm, maxp,
+ controlValueTable, fpgm,
+ preProgram);
+
+ GlyphLocator locator = GlyphLocator.forTable(locaFormat, loca, glyf);
+ glyphMeasurer = new GlyphMeasurer(hhea, htmx, vhea, vtmx);
+ glyphLoader = new GlyphLoader(locator, vm, unitsPerEm,
+ maxContours, maxPoints,
+ glyphMeasurer);
+
+ this.unitsPerEm = unitsPerEm;
+ }
+
+
+ /**
+ * Retrieves the scaled outline of a glyph, adjusting control points
+ * to the raster grid if necessary.
+ *
+ * @param glyphIndex the glyph number whose outline is retrieved.
+ *
+ * @param pointSize the point size for the glyph.
+ *
+ * @param deviceTransform an affine transformation for the device.
+ *
+ * @param antialias whether or not the rasterizer will perform
+ * anti-aliasing on the returned path.
+ *
+ * @param fractionalMetrics <code>false</code> for adjusting glyph
+ * positions to the raster grid of device space.
+ */
+ public GeneralPath getOutline(int glyphIndex,
+ float pointSize,
+ AffineTransform deviceTransform,
+ boolean antialias,
+ boolean fractionalMetrics)
+ {
+ glyphLoader.loadGlyph(glyphIndex, pointSize, deviceTransform,
+ antialias, glyphZone);
+ return glyphZone.getPath();
+ }
+
+
+ /**
+ * Determines the advance width and height for a glyph.
+ *
+ * @param glyphIndex the glyph whose advance width and height is to
+ * be determined.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialias <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @param advance a point whose <code>x</code> and <code>y</code>
+ * fields will hold the advance in each direction. It is possible
+ * that both values are non-zero, for example if
+ * <code>transform</code> is a rotation, or in the case of Urdu
+ * fonts.
+ */
+ public void getAdvance(int glyphIndex,
+ float pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ boolean fractionalMetrics,
+ boolean horizontal,
+ Point2D advance)
+ {
+ double x, y;
+ double scaleFactor = (double) pointSize / unitsPerEm;
+
+ /* FIXME: Should grid-fit if needed. Also, use cache if present
+ * in the font.
+ */
+ advance.setLocation(
+ scaleFactor * glyphMeasurer.getAdvanceWidth(glyphIndex, horizontal),
+ scaleFactor * glyphMeasurer.getAdvanceHeight(glyphIndex, horizontal));
+
+ transform.transform(advance, advance);
+ }
+
+
+ /**
+ * Scales a value from font units to pixels, given the point size
+ * and the transform.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional
+ * metrics, <code>false</code> for rounding the result to a pixel
+ * boundary.
+ *
+ * @param horizontal <code>true</code> if the <code>funits</code>
+ * value is along the x axis, <code>false</code> if it is along the
+ * y axis.
+ */
+ private float scaleFromFUnits(int funits,
+ float pointSize,
+ AffineTransform transform,
+ boolean fractionalMetrics,
+ boolean horizontal)
+ {
+ double s;
+
+ s = (double) pointSize / unitsPerEm;
+ if (transform != null)
+ s *= horizontal ? transform.getScaleY() : transform.getScaleX();
+ s *= funits;
+ if (!fractionalMetrics)
+ s = Math.round(s);
+ return (float) s;
+ }
+
+
+ /**
+ * Determines the distance between the base line and the highest
+ * ascender.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialias <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the ascent, which usually is a positive number.
+ */
+ public float getAscent(float pointSize,
+ AffineTransform transform,
+ boolean antialias,
+ boolean fractionalMetrics,
+ boolean horizontal)
+ {
+ /* Note that the ascent is orthogonal to the direction of line
+ * layout: If the line direction is horizontal, the measurement of
+ * ascent is along the vertical axis, and vice versa.
+ */
+ return scaleFromFUnits(glyphMeasurer.getAscent(horizontal),
+ pointSize,
+ transform,
+ fractionalMetrics,
+ /* reverse */ !horizontal);
+ }
+
+
+ /**
+ * Determines the distance between the base line and the lowest
+ * descender.
+ *
+ * @param pointSize the point size of the font.
+ *
+ * @param transform a transform that is applied in addition to
+ * scaling to the specified point size. This is often used for
+ * scaling according to the device resolution. Those who lack any
+ * aesthetic sense may also use the transform to slant or stretch
+ * glyphs.
+ *
+ * @param antialiased <code>true</code> for anti-aliased rendering,
+ * <code>false</code> for normal rendering. For hinted fonts,
+ * this parameter may indeed affect the result.
+ *
+ * @param fractionalMetrics <code>true</code> for fractional metrics,
+ * <code>false</code> for rounding the result to a pixel boundary.
+ *
+ * @param horizontal <code>true</code> for horizontal line layout,
+ * <code>false</code> for vertical line layout.
+ *
+ * @return the descent, which usually is a nagative number.
+ */
+ public float getDescent(float pointSize,
+ AffineTransform transform,
+ boolean antialiased,
+ boolean fractionalMetrics,
+ boolean horizontal)
+ {
+ /* Note that the descent is orthogonal to the direction of line
+ * layout: If the line direction is horizontal, the measurement of
+ * descent is along the vertical axis, and vice versa.
+ */
+ return scaleFromFUnits(glyphMeasurer.getDescent(horizontal),
+ pointSize,
+ transform,
+ fractionalMetrics,
+ /* reverse */ !horizontal);
+ }
+}
diff --git a/gnu/java/awt/font/opentype/truetype/VirtualMachine.java b/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
new file mode 100644
index 000000000..6f53af672
--- /dev/null
+++ b/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
@@ -0,0 +1,1809 @@
+/* VirtualMachine.java -- Virtual machine for TrueType bytecodes.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype.truetype;
+
+import java.awt.FontFormatException;
+import java.awt.geom.AffineTransform;
+import java.nio.ByteBuffer;
+import java.nio.ShortBuffer;
+
+
+/**
+ * A virtual machine for interpreting TrueType bytecodes.
+ *
+ * <p><b>Lack of Thread Safety:</b> The virtual machine is
+ * intentionally <i>not</i> safe to access from multiple concurrent
+ * threads. Synchronization needs to be performed externally. Usually,
+ * the font has already obtained a lock before calling the scaler,
+ * which in turn calls the VM. It would be wasteful to acquire
+ * additional locks for the VM.
+ *
+ * <p><b>Implementation Status:</b> The current implementation can
+ * execute pre-programs of fonts, but it does not yet actually move
+ * any points. Control flow and arithmeti instructions are
+ * implemented, but most geometric instructions are not working
+ * yet. So, the VirtualMachine class is currently a no-op. However,
+ * not very much is missing. You are more than welcome to complete the
+ * implementation.
+ *
+ * <p><b>Patents:</b> Apple Computer holds three United States Patents
+ * for the mathematical algorithms that are used by TrueType
+ * instructions. The monopoly granted by these patents will expire in
+ * October 2009. Before the expiration date, a license must be
+ * obtained from Apple Computer to use the patented technology inside
+ * the United States. For other countries, different dates might
+ * apply, or no license might be needed.
+ *
+ * <p>The default build of this class does not use the patented
+ * algorithms. If you have obtained a license from Apple, or if the
+ * patent protection has expired, or if no license is required for
+ * your contry, you can set a flag in the source file which will
+ * enable the use of the patented mathematical algorithms.</p>
+ *
+ * <p>The relevant patents are listed subsequently.</p>
+ *
+ * <p><ol><li>United States Patent 5155805, <i>Method and Apparatus
+ * for Moving Control Points in Displaying Digital Typeface on Raster
+ * Output Devices,</i> invented by Sampo Kaasila, assigned to Apple
+ * Computer. Filing date: May 8, 1989. Date of patent: October 13,
+ * 1992.</li>
+ *
+ * <li>United States Patent 5159668, <i>Method and Apparatus for
+ * Manipulating Outlines in Improving Digital Typeface on Raster
+ * Output Devices,</i> invented by Sampo Kaasila, assigned to Apple
+ * Computer. Filing date: May 8, 1989. Date of patent: October 27,
+ * 1992.</li>
+ *
+ * <li>United States Patent 5325479, <i>Method and Apparatus for
+ * Moving Control Points in Displaying Digital Typeface on Raster
+ * Output Devices,</i> invented by Sampo Kaasila, assigned to Apple
+ * Computer. Filing date: May 28, 1989. Date of patent: June 28, 1994
+ * (with a statement that &#x201c;[t]he portion of the term of this
+ * patent subsequent to Oct. 13, 2009 has been
+ * disclaimed&#x201d;).</li></ol>
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+class VirtualMachine
+{
+ /**
+ * Indicates whether or not to perform hinting operations that are
+ * protected by a number of US patents, two of which will expire on
+ * October 13, 2009, and one of which will expire on October 27,
+ * 2009.
+ */
+ private final static boolean PATENTED_HINTING = false;
+
+
+ /**
+ * Indicates whether the execution of the Virtual Machine is traced
+ * to System.out.
+ */
+ private final static boolean TRACE_EXECUTION = false;
+
+
+ /**
+ * The value 1 in 2-dot-14 fixed notation.
+ */
+ private static final short ONE_214 = 0x4000; // 1 << 14
+
+
+ /**
+ * The storage area of the virtual machine.
+ */
+ private final int[] storage;
+
+
+ /**
+ * The stack. The stack grows from bottom to top, so
+ * <code>sp[0]</code> gets used before <code>sp[1]</code>.
+ */
+ private int[] stack;
+
+
+ /**
+ * The maximum number of stack elements.
+ */
+ private final int maxStackElements;
+
+
+ /**
+ * The current stack pointer of the virtual machine.
+ */
+ private int sp;
+
+
+ /**
+ * fdefBuffer[i] is the buffer that contains the TrueType
+ * instructions of function #i. Most of the time, functions are
+ * defined in the font program, but a font may also re-define
+ * functions in its CVT program.
+ */
+ private ByteBuffer[] fdefBuffer;
+
+
+ /**
+ * fdefEntryPoint[i] is the position in fdefBuffer[i] where the
+ * first TrueType instruction after the FDEF is located.
+ */
+ private int[] fdefEntryPoint;
+
+
+ /**
+ * The original Control Value Table, sometimes abbreviated as CVT.
+ * The table contains signed 16-bit FUnits. Some fonts have no CVT,
+ * in which case the field will be <code>null</code>.
+ */
+ private ShortBuffer controlValueTable;
+
+
+ /**
+ * The scaled values inside the control value table.
+ */
+ private int[] cvt;
+
+
+ /**
+ * A value that is used by rounding operations to compensate for dot
+ * gain.
+ */
+ private int engineCompensation = 0;
+
+
+ /**
+ * The contents of the font&#x2019;s <code>fpgm</code> table, or
+ * <code>null</code> after the font program has been executed once.
+ */
+ private ByteBuffer fontProgram;
+
+
+ /**
+ * The <code>prep</code> table of the font, which contains a program
+ * that is executed whenever the point size or the device transform
+ * have changed. This program is called pre-program because it gets
+ * executed before the instructions of the individual glyphs. If
+ * the font does not contain a pre-program, the value of this field
+ * is <code>null</code>.
+ */
+ private ByteBuffer preProgram;
+
+
+ /**
+ * The number of points in the Twilight Zone.
+ */
+ private int numTwilightPoints;
+
+
+ /**
+ * The current point size of the scaled font. The value is in Fixed
+ * 26.6 notation.
+ */
+ private int pointSize; // 26.6
+
+ private AffineTransform deviceTransform;
+
+ private int scaleX, scaleY, shearX, shearY; // 26.6
+
+
+ /**
+ * Indicates whether or not scan-line conversion will use
+ * anti-aliasing (with gray levels). Font programs can ask for this
+ * value with the <code>GETINFO</code> instruction, and some
+ * programs may behave differently according to this setting.
+ */
+ private boolean antialiased;
+
+
+ /* Graphics State. FIXME: Move this to its own class? Some
+ * documentation would not hurt, either.
+ */
+ private int cvtCutIn; // 26.6
+ private int deltaBase; // uint32
+ private int deltaShift; // uint32
+ private short freeX; // 2.14
+ private short freeY; // 2.14
+ private int loop; // int
+ private int minimumDistance; // 26.6
+ private short projX; // 2.14
+ private short projY; // 2.14
+ private short dualX; // 2.14
+ private short dualY; // 2.14
+ private int rp0, rp1, rp2; // point numbers
+ private boolean scanControl;
+ private int scanType;
+ private int singleWidthValue; // 26.6
+ private Zone zp0, zp1, zp2;
+
+ private Zone twilightZone;
+ private Zone glyphZone;
+
+
+ /**
+ * Indicates whether or not the instructions that are associated
+ * with individual glyphs shall be executed. Set as a side effect
+ * of executing the pre-program when the point size, device
+ * transform or some other relevant parameter have changed.
+ */
+ private boolean executeGlyphInstructions;
+
+
+ /**
+ * Indicates whether to ignore any modifications to the control
+ * value table that the font&#x2019;s pre-program might have
+ * performed. Set as a side effect of executing the pre-program
+ * when the point size, device transform or some other relevant
+ * parameter have changed.
+ */
+ private boolean ignoreCVTProgram;
+
+
+ /**
+ * The length of the space between rounded values. A value
+ * of zero means that rounding has been switched off.
+ */
+ private int roundPeriod; // 26.6
+
+
+ /**
+ * The offset of the rounded values from multiples of
+ * <code>roundPeriod</code>.
+ */
+ private int roundPhase; // 26.6
+
+
+ private int roundThreshold; // 26.6
+
+
+ /**
+ * A cache for the number of pixels per EM. The value is a normal
+ * integer, not a fixed point notation.
+ *
+ * @see #getPixelsPerEM()
+ */
+ private int cachedPixelsPerEM;
+
+
+ /**
+ * The number of font units per EM.
+ */
+ private int unitsPerEm;
+
+
+ /**
+ * Constructs a new Virtual Machine for executing TrueType
+ * instructions.
+ *
+ * @param unitsPerEm the number of font units in one typographic
+ * em.
+ *
+ * @param preProgram the <code>prep</code> table of the font, which
+ * contains a program that is executed whenever the point size or
+ * the device transform have changed. This program is called
+ * pre-program because it gets executed before the instructions of
+ * the individual glyphs. If the font does not contain a
+ * pre-program, pass <code>null</code>.
+ */
+ VirtualMachine(int unitsPerEm,
+ ByteBuffer maxp,
+ ByteBuffer controlValueTable,
+ ByteBuffer fontProgram,
+ ByteBuffer preProgram)
+ throws FontFormatException
+ {
+ int maxStorage, numFunctionDefs, maxInstructionDefs;
+
+ if (maxp.getInt(0) != 0x00010000)
+ throw new FontFormatException("unsupported maxp version");
+
+ this.unitsPerEm = unitsPerEm;
+ maxStorage = maxp.getChar(18);
+
+ /* FreeType says that there exist some broken fonts (like
+ * "Keystrokes MT") that contain function defs, but have a zero
+ * value in their maxp table.
+ */
+ numFunctionDefs = maxp.getChar(20);
+ if (numFunctionDefs == 0)
+ numFunctionDefs = 64;
+ fdefBuffer = new ByteBuffer[numFunctionDefs];
+ fdefEntryPoint = new int[numFunctionDefs];
+
+ /* Read the contents of the Control Value Table. */
+ if (controlValueTable != null)
+ this.controlValueTable = controlValueTable.asShortBuffer();
+
+ maxInstructionDefs = maxp.getChar(22);
+ maxStackElements = maxp.getChar(24);
+ storage = new int[maxStorage];
+ this.fontProgram = fontProgram;
+ this.preProgram = preProgram;
+ numTwilightPoints = maxp.getChar(16);
+ }
+
+
+ /**
+ * Sets the graphics state to default values.
+ */
+ private void resetGraphicsState()
+ {
+ /* The freedom, projection and dual vector default to the x axis. */
+ freeX = projX = dualX = ONE_214;
+ freeY = projY = dualX = 0;
+ cachedPixelsPerEM = 0;
+
+ cvtCutIn = 68; // 17/16 in 26.6 notation
+ deltaBase = 9;
+ deltaShift = 3;
+ loop = 1;
+ minimumDistance = Fixed.ONE;
+ singleWidthValue = 0;
+ rp0 = rp1 = rp2 = 0;
+ scanControl = false;
+ scanType = 2;
+ zp0 = zp1 = zp2 = getZone(1);
+
+ setRoundingMode(Fixed.ONE, 0x48); // round to grid
+ }
+
+
+ /**
+ * Reloads the control value table and scales each entry from font
+ * units to pixel values.
+ */
+ private void reloadControlValueTable()
+ {
+ /* Some TrueType fonts have no control value table. */
+ if (controlValueTable == null)
+ return;
+
+ /* Read in the Control Value Table. */
+ if (cvt == null)
+ cvt = new int[controlValueTable.capacity()];
+
+ /* Scale the entries. */
+ for (int i = 0; i < cvt.length; i++)
+ cvt[i] = funitsToPixels(controlValueTable.get(i));
+ }
+
+
+ /**
+ * Scales a value from font unites to pixels.
+ *
+ * @return the scaled value.
+ */
+ private int funitsToPixels(int funits)
+ {
+ return (int) (((long) funits * scaleY + (unitsPerEm>>1))
+ / unitsPerEm);
+ }
+
+
+ /**
+ * Sets up the virtual machine for the specified parameters. If
+ * there is no change to the last set-up, the method will quickly
+ * return. Otherwise, the font&#x2019;s pre-program will be
+ * executed.
+ *
+ * @param pointSize the point size of the scaled font.
+ *
+ * @param deviceTransform an affine transformation which gets
+ * applied in addition to scaling by <code>pointSize</code>. Font
+ * programs can separately inquire about the point size. For this
+ * reason, it is not recommended to pre-multiply the point size to
+ * the device transformation.
+ *
+ * @param antialiased <code>true</code> if the scan-line conversion
+ * algorithm will use gray levels to give a smoother appearance,
+ * <code>false</code> otherwise. Font programs can ask for this
+ * value with the <code>GETINFO</code> instruction, and some
+ * programs may behave differently according to this setting.
+ */
+ public boolean setup(double pointSize,
+ AffineTransform deviceTransform,
+ boolean antialiased)
+ {
+ boolean changeCTM;
+ int pointSize_Fixed;
+
+ if (stack == null)
+ stack = new int[maxStackElements];
+
+ if (twilightZone == null)
+ twilightZone = new Zone(numTwilightPoints);
+
+ /* If the font program has not yet been executed, do so. */
+ if (fontProgram != null)
+ {
+ resetGraphicsState();
+ sp = -1;
+ execute(fontProgram, 0);
+ fontProgram = null; // prevent further execution
+ }
+
+ /* Determine whether the transformation matrix has changed. */
+ pointSize_Fixed = Fixed.valueOf(pointSize);
+ changeCTM = ((pointSize_Fixed != this.pointSize)
+ || !deviceTransform.equals(this.deviceTransform)
+ || (antialiased != this.antialiased));
+
+ if (changeCTM)
+ {
+ this.pointSize = pointSize_Fixed;
+ this.deviceTransform = deviceTransform;
+ this.antialiased = antialiased;
+ scaleX = (int) (deviceTransform.getScaleX() * pointSize * 64);
+ scaleY = (int) (deviceTransform.getScaleY() * pointSize * 64);
+ shearX = (int) (deviceTransform.getShearX() * pointSize * 64);
+ shearY = (int) (deviceTransform.getShearY() * pointSize * 64);
+
+ resetGraphicsState();
+ reloadControlValueTable();
+ executeGlyphInstructions = true;
+ ignoreCVTProgram = false;
+
+ if (preProgram != null)
+ {
+ sp = -1;
+ execute(preProgram, 0);
+ if (ignoreCVTProgram)
+ reloadControlValueTable();
+ }
+ }
+
+ return executeGlyphInstructions;
+ }
+
+
+ /**
+ * Executes a stream of TrueType instructions.
+ */
+ private void execute(ByteBuffer instructions, int pos)
+ {
+ instructions.position(pos);
+
+ // FIXME: SECURITY: Possible denial-of-service attack
+ // via instructions that have an endless loop.
+ while (instructions.hasRemaining()
+ && executeInstruction(instructions))
+ ;
+ }
+
+
+ /**
+ * Writes a textual description of the current TrueType instruction,
+ * including the top stack elements, to <code>System.out</code>.
+ * This is useful for debugging.
+ *
+ * @param inst the instruction stream, positioned at the current
+ * instruction.
+ */
+ private void dumpInstruction(ByteBuffer inst)
+ {
+ StringBuffer sbuf = new StringBuffer(40);
+ int pc = inst.position();
+ int bcode = inst.get(pc) & 0xff;
+ int count;
+ int delta;
+
+ char pcPrefix = 'c';
+ for (int i = 0; i < fdefBuffer.length; i++)
+ {
+ if (fdefBuffer[i] == inst)
+ {
+ pcPrefix = 'f';
+ break;
+ }
+ }
+ sbuf.append(pcPrefix);
+
+
+ sbuf.append(getHex((short) inst.position()));
+ sbuf.append(": ");
+ sbuf.append(getHex((byte) bcode));
+ sbuf.append(" ");
+ sbuf.append(INST_NAME[bcode]);
+
+ if (bcode == 0x40) // NPUSHB
+ {
+ count = inst.get(pc + 1) & 0xff;
+ sbuf.append(" (");
+ sbuf.append(count);
+ sbuf.append(") ");
+ for (int i = 0; i < count; i++)
+ {
+ if (i > 0)
+ sbuf.append(" ");
+ sbuf.append('$');
+ sbuf.append(getHex(inst.get(pc + 2 + i)));
+ }
+ }
+ if (bcode == 0x41) // NPUSHW
+ {
+ count = inst.get(pc + 1) & 0xff;
+ sbuf.append(" (");
+ sbuf.append(count);
+ sbuf.append(") ");
+ for (int i = 0; i < count; i++)
+ {
+ if (i > 0)
+ sbuf.append(' ');
+ sbuf.append('$');
+ sbuf.append(getHex(inst.getShort(pc + 2 + 2*i)));
+ }
+ }
+ else
+ {
+ count = getInstructionLength(bcode) - 1;
+ for (int i = 0; i < count; i++)
+ {
+ sbuf.append(" $");
+ sbuf.append(getHex(inst.get(pc + 1 + i)));
+ }
+ }
+
+ while (sbuf.length() < 30)
+ sbuf.append(' ');
+ sbuf.append('|');
+ sbuf.append(sp + 1);
+ sbuf.append("| ");
+ for (int i = sp; i >= Math.max(0, sp - 5); i = i - 1)
+ {
+ if (i < sp)
+ sbuf.append(" ");
+ if ((stack[i] >> 16) != 0)
+ sbuf.append(getHex((short) (stack[i] >> 16)));
+ sbuf.append(getHex((short) stack[i]));
+ }
+ System.out.println(sbuf);
+ }
+
+
+ private static char getNibble(int i, int rightShift)
+ {
+ i = (i >> rightShift) & 15;
+ if (i < 10)
+ return (char) (i + '0');
+ else
+ return (char) (i + 'a' - 10);
+ }
+
+
+ private static String getHex(byte b)
+ {
+ char[] a = new char[2];
+ a[0] = getNibble(b, 4);
+ a[1] = getNibble(b, 0);
+ return new String(a);
+ }
+
+
+ private static String getHex(short b)
+ {
+ char[] a = new char[4];
+ a[0] = getNibble(b, 12);
+ a[1] = getNibble(b, 8);
+ a[2] = getNibble(b, 4);
+ a[3] = getNibble(b, 0);
+ return new String(a);
+ }
+
+
+ /**
+ * Skips any instructions until the specified opcode has been
+ * encoutered.
+ *
+ * @param inst the current instruction stream. After the call,
+ * the position of <code>inst</code> is right after the first
+ * occurence of <code>opcode</code>.
+ *
+ * @param opcode1 the opcode for which to look.
+ *
+ * @param opcode2 another opcode for which to look. Pass -1
+ * if only <code>opcode1</code> would terminate skipping.
+ *
+ * @param illegalCode1 an opcode that must not be encountered
+ * while skipping. Pass -1 if any opcode is acceptable.
+ *
+ * @param illegalCode2 another opcode that must not be encountered
+ * while skipping. Pass -1 to perform no check.
+ *
+ * @param handleNestedIfClauses <code>true</code> to handle
+ * nested <code>IF [ELSE] EIF</code> clauses, <code>false</code>
+ * to ignore them. From the TrueType specification document,
+ * one would think that nested if clauses would not be valid,
+ * but they do appear in some fonts.
+ *
+ * @throws IllegalStateException if <code>illegalCode1</code> or
+ * <code>illegalCode2</code> has been encountered while skipping.
+ */
+ private static void skipAfter(ByteBuffer inst,
+ int opcode1, int opcode2,
+ int illegalCode1, int illegalCode2,
+ boolean handleNestedIfClauses)
+ {
+ int pos = inst.position();
+ int curOpcode;
+ int instLen;
+ int nestingLevel = 0; // increased inside IF [ELSE] EIF sequences
+
+ while (true)
+ {
+ curOpcode = inst.get(pos) & 0xff;
+ instLen = getInstructionLength(curOpcode);
+
+ if (false && TRACE_EXECUTION)
+ {
+ for (int i = 0; i < nestingLevel; i++)
+ System.out.print("--");
+ System.out.print("--" + pos + "-" + INST_NAME[curOpcode]);
+ if (nestingLevel > 0)
+ System.out.print(", ifNestingLevel=" + nestingLevel);
+ System.out.println();
+ }
+
+ if (curOpcode == 0x40) // NPUSHB
+ pos += 1 + (inst.get(pos + 1) & 0xff);
+ else if (curOpcode == 0x41) // NPUSHW
+ pos += 1 + 2 * (inst.get(pos + 1) & 0xff);
+ else
+ pos += instLen;
+
+ if ((nestingLevel == 0)
+ && ((curOpcode == opcode1) || (curOpcode == opcode2)))
+ break;
+
+ if (handleNestedIfClauses)
+ {
+ if (curOpcode == /* IF */ 0x58)
+ ++nestingLevel;
+ else if (curOpcode == /* EIF */ 0x59)
+ --nestingLevel;
+ }
+
+ if ((nestingLevel < 0)
+ || (curOpcode == illegalCode1)
+ || (curOpcode == illegalCode2))
+ throw new IllegalStateException();
+ }
+
+ inst.position(pos);
+ }
+
+
+ /**
+ * Returns the number of bytes that a TrueType instruction occupies.
+ *
+ * @param opcode the instruction.
+ *
+ * @return the number of bytes occupied by the instructions and its
+ * operands. For <code>NPUSHB</code> and <code>NPUSHW</code>, where
+ * the instruction length depends on the first operand byte, the
+ * result is -1.
+ */
+ private static int getInstructionLength(int opcode)
+ {
+ /* NPUSHB, NPUSHW --> see following byte */
+ if ((opcode == 0x40) || (opcode == 0x41))
+ return -1;
+
+ /* PUSHB[0] .. PUSHB[7] --> 2, 3, 4, 5, 6, 7, 8, 9 */
+ if ((opcode >= 0xb0) && (opcode <= 0xb7))
+ return opcode - 0xae;
+
+ /* PUSHW[0] .. PUSHW[7] --> 3, 5, 6, 7, 11, 13, 15, 17*/
+ if ((opcode >= 0xb8) && (opcode <= 0xbf))
+ return 1 + ((opcode - 0xb7) << 1);
+
+ return 1;
+ }
+
+
+ /**
+ * Executes a single TrueType instruction. This is the core
+ * routine of the Virtual Machine.
+ *
+ * @return <code>true</code> if another instruction shall be
+ * executed in the same call frame; <code>false</code> if the
+ * current call frame shall be popped.
+ */
+ private boolean executeInstruction(ByteBuffer inst)
+ {
+ if (TRACE_EXECUTION)
+ dumpInstruction(inst);
+
+ int i, count, e1, e2, e3, e4, x, y;
+ int bcode = inst.get() & 0xff;
+
+ switch (bcode)
+ {
+ case 0x00: // SVTCA[0], Set freedom and proj. Vectors To Coord. Axis [y]
+ setFreedomVector((short) 0, ONE_214);
+ setProjectionVector((short) 0, ONE_214);
+ break;
+
+ case 0x01: // SVTCA[1], Set freedom and proj. Vectors To Coord. Axis [x]
+ setFreedomVector(ONE_214, (short) 0);
+ setProjectionVector(ONE_214, (short) 0);
+ break;
+
+ case 0x02: // SPVTCA[0], Set Projection Vector To Coordinate Axis [y]
+ setProjectionVector((short) 0, ONE_214);
+ break;
+
+ case 0x03: // SPVTCA[1], Set Projection Vector To Coordinate Axis [x]
+ setProjectionVector(ONE_214, (short) 0);
+ break;
+
+ case 0x0c: // GPV, Get Projection Vector
+ stack[++sp] = projX;
+ stack[++sp] = projY;
+ break;
+
+ case 0x0d: // GPV, Get Freedom Vector
+ stack[++sp] = freeX;
+ stack[++sp] = freeY;
+ break;
+
+ case 0x0F: // ISECT, move point p to the InterSECTION of two lines
+ sp -= 4;
+ handleISECT(stack[sp], stack[sp+1], stack[sp+2],
+ stack[sp+3], stack[sp+4]);
+ break;
+
+ case 0x10: // SRP0, Set Reference Point 0
+ rp0 = stack[sp--];
+ break;
+
+ case 0x11: // SRP1, Set Reference Point 1
+ rp1 = stack[sp--];
+ break;
+
+ case 0x12: // SRP2, Set Reference Point 2
+ rp2 = stack[sp--];
+ break;
+
+ case 0x13: // SZP0, Set Zone Pointer 0
+ zp0 = getZone(stack[sp--]);
+ break;
+
+ case 0x14: // SZP1, Set Zone Pointer 1
+ zp1 = getZone(stack[sp--]);
+ break;
+
+ case 0x15: // SZP2, Set Zone Pointer 2
+ zp2 = getZone(stack[sp--]);
+ break;
+
+ case 0x16: // SZPS, Set Zone PointerS
+ zp0 = zp1 = zp2 = getZone(stack[sp--]);
+ break;
+
+ case 0x17: // SLOOP, Set LOOP variable
+ loop = stack[sp--];
+ break;
+
+ case 0x18: // RTG, Round To Grid
+ setRoundingMode(Fixed.ONE, 0x48);
+ break;
+
+ case 0x19: // RTHG, Round To Half Grid
+ setRoundingMode(Fixed.ONE, 0x68);
+ break;
+
+ case 0x1a: // SMD, Set Minimum Distance
+ minimumDistance = stack[sp--];
+ break;
+
+ case 0x1B: // ELSE, ELSE clause
+ skipAfter(inst,
+ /* look for: EIF, -- */ 0x59, -1,
+ /* illegal: --, -- */ -1, -1,
+ /* handle nested if clauses */ true);
+ break;
+
+ case 0x1C: // JMPR, JuMP Relative
+ inst.position(inst.position() - 1 + stack[sp--]);
+ break;
+
+ case 0x1D: // SCVTCI, Set Control Value Table Cut-In
+ cvtCutIn = stack[sp--];
+ break;
+
+ case 0x1F: // SSW, Set Single Width
+ singleWidthValue = stack[sp--];
+ break;
+
+ case 0x20: // DUP, DUPlicate top stack element
+ e1 = stack[sp];
+ stack[++sp] = e1;
+ break;
+
+ case 0x21: // POP, POP top stack element
+ sp--;
+ break;
+
+ case 0x22: // CLEAR, CLEAR the stack
+ sp = -1;
+ break;
+
+ case 0x23: // SWAP, SWAP the top two elements on the stack
+ e1 = stack[sp--];
+ e2 = stack[sp];
+ stack[sp] = e1;
+ stack[++sp] = e2;
+ break;
+
+ case 0x24: // DEPTH, DEPTH of the stack
+ stack[++sp] = sp + 1;
+ break;
+
+ case 0x25: // CINDEX, Copy the INDEXed element to the top of the stack
+ stack[sp] = stack[sp - stack[sp]];
+ break;
+
+ case 0x26: // MINDEX, Move the INDEXed element to the top of the stack
+ i = stack[sp];
+ e1 = stack[sp - i];
+ System.arraycopy(/* src */ stack, /* srcPos */ sp - i + 1,
+ /* dest */ stack, /* destPos*/ sp - i,
+ /* length */ i - 1);
+ --sp;
+ stack[sp] = e1;
+ break;
+
+ case 0x2a: // LOOPCALL, LOOP and CALL function
+ i = stack[sp--];
+ count = stack[sp--];
+ e1 = inst.position();
+ e2 = sp;
+ for (int j = 0; j < count; j++)
+ execute(fdefBuffer[i], fdefEntryPoint[i]);
+ inst.position(e1);
+ break;
+
+ case 0x2B: // CALL, CALL function
+ i = stack[sp--];
+ e1 = inst.position();
+ e2 = sp;
+ execute(fdefBuffer[i], fdefEntryPoint[i]);
+ inst.position(e1);
+ break;
+
+ case 0x2C: // FDEF, Function DEFinition
+ i = stack[sp--];
+ fdefBuffer[i] = inst;
+ fdefEntryPoint[i] = inst.position();
+ skipAfter(inst,
+ /* look for: ENDF */ 0x2d,
+ /* look for: --- */ -1,
+ /* illegal: IDEF */ 0x89,
+ /* illegal: FDEF */ 0x2c,
+ /* do not handle nested if clauses */ false);
+ break;
+
+ case 0x2D: // ENDF, END Function definition
+ /* Pop the current stack frame. */
+ return false;
+
+ case 0x2e: // MDAP[0], Move Direct Absolute Point
+ handleMDAP(stack[sp--], /* round */ false);
+ break;
+
+ case 0x2f: // MDAP[1], Move Direct Absolute Point
+ handleMDAP(stack[sp--], /* round */ true);
+ break;
+
+ case 0x39: // IP, Interpolate Point by the last relative stretch
+ handleIP();
+ break;
+
+ case 0x3d: // RTDG, Round To Double Grid
+ setRoundingMode(Fixed.ONE, 0x08);
+ roundThreshold = roundThreshold / 64; // period/128
+ break;
+
+ case 0x3e: // MIAP[0], Move Indirect Absolute Point
+ e1 = stack[sp--];
+ handleMIAP(e1, stack[sp--], /* round */ false);
+ break;
+
+ case 0x3f: // MIAP[1], Move Indirect Absolute Point
+ e1 = stack[sp--];
+ handleMIAP(e1, stack[sp--], /* round */ true);
+ break;
+
+ case 0x40: // NPUSHB
+ count = inst.get() & 0xff;
+ for (i = 0; i < count; i++)
+ stack[++sp] = inst.get() & 0xff;
+ break;
+
+ case 0x41: // NPUSHW
+ count = inst.get() & 0xff;
+ for (i = 0; i < count; i++)
+ stack[++sp] = inst.getShort();
+ break;
+
+ case 0x42: // WS, Write Store
+ e1 = stack[sp--]; i = stack[sp--];
+ storage[i] = e1;
+ break;
+
+ case 0x43: // RS, Read Store
+ stack[sp] = storage[stack[sp]];
+ break;
+
+ case 0x44: // WCVTP, Write Control Value Table in Pixel units
+ e1 = stack[sp--];
+ i = stack[sp--];
+ if (i < cvt.length)
+ cvt[i] = e1;
+ break;
+
+ case 0x45: // RCVT, Read Control Value Table entry
+ if (stack[sp] < cvt.length)
+ stack[sp] = cvt[stack[sp]];
+ else
+ stack[sp] = 0;
+ break;
+
+ case 0x46: // GC[0], Get Coordinate projected onto the projection vector
+ stack[sp] = getProjection(zp2, stack[sp]);
+ break;
+
+ case 0x47: // GC[1], Get Coordinate projected onto the projection vector
+ stack[sp] = getOriginalProjection(zp2, stack[sp]);
+ break;
+
+ case 0x4B: // MPPEM, Measure Pixels Per EM
+ stack[++sp] = getPixelsPerEM();
+ break;
+
+ case 0x4c: // MPS, Measure Point Size
+ /* FreeType2 returns pixels per em here, because they think that
+ * the point size would be irrelevant in a given font program.
+ * This is extremely surprising, because the appearance of good
+ * fonts _should_ change with point size. For example, a good
+ * font should be wider at small point sizes, and the holes
+ * inside glyphs ("Punzen" in German, I do not know the correct
+ * English expression) should be larger. Note that this change
+ * of appearance is dependent on point size, _not_ the
+ * resolution of the display device.
+ */
+ stack[++sp] = pointSize;
+ break;
+
+ case 0x4f: // DEBUG, DEBUG call
+ sp--;
+ break;
+
+ case 0x50: // LT, Less Than
+ e1 = stack[sp--];
+ stack[sp] = (stack[sp] < e1) ? 1 : 0;
+ break;
+
+ case 0x51: // LTEQ, Greater Than or EQual
+ e1 = stack[sp--];
+ stack[sp] = (stack[sp] <= e1) ? 1 : 0;
+ break;
+
+ case 0x52: // GT, Greater Than
+ e1 = stack[sp--];
+ stack[sp] = (stack[sp] > e1) ? 1 : 0;
+ break;
+
+ case 0x53: // GTEQ, Greater Than or EQual
+ e1 = stack[sp--];
+ stack[sp] = (stack[sp] >= e1) ? 1 : 0;
+ break;
+
+ case 0x54: // EQ, EQual
+ e1 = stack[sp--];
+ stack[sp] = (stack[sp] == e1) ? 1 : 0;
+ break;
+
+ case 0x55: // NEQ, Not EQual
+ e1 = stack[sp--];
+ stack[sp] = (stack[sp] != e1) ? 1 : 0;
+ break;
+
+ case 0x58: // IF, IF test
+ if (stack[sp--] == 0)
+ skipAfter(inst,
+ /* look for: ELSE */ 0x1B,
+ /* look for: EIF */ 0x59,
+ /* illegal: -- */ -1,
+ /* illegal: -- */ -1,
+ /* handle nested if clauses */ true);
+ break;
+
+ case 0x59: // EIF, End IF
+ // Do nothing.
+ break;
+
+ case 0x5A: // AND
+ e1 = stack[sp--];
+ stack[sp] = ((e1 != 0) && (stack[sp] != 0)) ? 1 : 0;
+ break;
+
+ case 0x5B: // OR
+ e1 = stack[sp--];
+ stack[sp] = ((e1 != 0) || (stack[sp] != 0)) ? 1 : 0;
+ break;
+
+ case 0x5e: // SDB, Set Delta Base in the graphics state
+ deltaBase = stack[sp--];
+ break;
+
+ case 0x5f: // SDS, Set Delta Shift in the graphics state
+ deltaShift = stack[sp--];
+ break;
+
+ case 0x60: // ADD
+ e1 = stack[sp--];
+ stack[sp] += e1;
+ break;
+
+ case 0x61: // SUB, SUBtract
+ e1 = stack[sp--];
+ stack[sp] -= e1;
+ break;
+
+ case 0x62: // DIV, DIVide
+ e1 = stack[sp--];
+ stack[sp] = Fixed.div(e1, stack[sp]);
+ break;
+
+ case 0x63: // MUL, MULtiply
+ e1 = stack[sp--];
+ stack[sp] = Fixed.mul(e1, stack[sp]);
+ break;
+
+ case 0x64: // ABS, ABSolute value
+ stack[sp] = Math.abs(stack[sp]);
+ break;
+
+ case 0x65: // NEG, NEGate
+ stack[sp] = -stack[sp];
+ break;
+
+ case 0x66: // FLOOR
+ stack[sp] = Fixed.floor(stack[sp]);
+ break;
+
+ case 0x67: // CEILING
+ stack[sp] = Fixed.ceil(stack[sp]);
+ break;
+
+ case 0x68: // ROUND[0] -- round grey distance
+ stack[sp] = round(stack[sp], /* no engine compensation */ 0);
+ break;
+
+ case 0x69: // ROUND[1] -- round black distance
+ stack[sp] = round(stack[sp], -engineCompensation);
+ break;
+
+ case 0x6a: // ROUND[2] -- round white distance
+ stack[sp] = round(stack[sp], engineCompensation);
+ break;
+
+ case 0x6b: // ROUND[3] -- round distance (not yet defined)
+ stack[sp] = round(stack[sp], /* no engine compensation */ 0);
+ break;
+
+ case 0x6c: // NROUND[0] -- compensate grey distance
+ stack[sp] = nround(stack[sp], 0);
+ break;
+
+ case 0x6d: // NROUND[1] -- compensate black distance
+ stack[sp] = nround(stack[sp], -engineCompensation);
+ break;
+
+ case 0x6e: // NROUND[2] -- compensate white distance
+ stack[sp] = nround(stack[sp], engineCompensation);
+ break;
+
+ case 0x6f: // NROUND[3] -- compensate distance (not yet defined)
+ stack[sp] = nround(stack[sp], 0);
+ break;
+
+ case 0x70: // WCVTF, Write Control Value Table in Funits
+ e1 = stack[sp--];
+ cvt[stack[sp--]] = e1 * getPixelsPerEM();
+ break;
+
+ case 0x73: // DELTAC1, DELTA exception C1
+ count = stack[sp--];
+ sp -= 2 * count;
+ deltaC(stack, sp + 1, count, 0);
+ break;
+
+ case 0x74: // DELTAC2, DELTA exception C2
+ count = stack[sp--];
+ sp -= 2 * count;
+ deltaC(stack, sp + 1, count, 16);
+ break;
+
+ case 0x75: // DELTAC3, DELTA exception C3
+ count = stack[sp--];
+ sp -= 2 * count;
+ deltaC(stack, sp + 1, count, 32);
+ break;
+
+ case 0x76: // SROUND, Super ROUND
+ setRoundingMode(Fixed.ONE, stack[sp--]);
+ break;
+
+ case 0x77: // S45ROUND, Super ROUND 45 degrees
+ setRoundingMode(/* sqrt(2)/2 */ 0x2d, stack[sp--]);
+ break;
+
+ case 0x78: // JROT, Jump Relative On True
+ e1 = stack[sp--];
+ i = inst.position() - 1 + stack[sp--];
+ if (e1 != 0)
+ inst.position(i);
+ break;
+
+ case 0x79: // JROF, Jump Relative On False
+ e1 = stack[sp--];
+ i = inst.position() - 1 + stack[sp--];
+ if (e1 == 0)
+ inst.position(i);
+ break;
+
+ case 0x7a: // ROFF, Round OFF
+ roundPeriod = 0;
+ break;
+
+ case 0x7c: // RUTG, Round Up To Grid
+ setRoundingMode(Fixed.ONE, 0x40);
+ break;
+
+ case 0x7d: // RDTG, Round Down To Grid
+ setRoundingMode(Fixed.ONE, 0x40);
+ roundThreshold = 0;
+ break;
+
+ case 0x7e: // SANGW, Set ANGle Weight (no-op according to TrueType spec)
+ case 0x7f: // AA, Adjust Angle (no-op according to TrueType spec)
+ sp--;
+ break;
+
+ case 0x85: // SCANCTRL, SCAN conversion ConTRoL
+ e1 = stack[sp--];
+ int ppemThreshold = e1 & 255;
+ scanControl = false;
+ boolean ppemCondition = (ppemThreshold == 255)
+ || ((ppemThreshold != 0) && (getPixelsPerEM() > ppemThreshold));
+ if (((e1 & (1<<8)) != 0) && ppemCondition)
+ scanControl = true;
+ if (((e1 & (1<<9)) != 0) && isRotated())
+ scanControl = true;
+ if (((e1 & (1<<10)) != 0) && isStretched())
+ scanControl = true;
+ if (((e1 & (1<<11)) != 0) && !ppemCondition)
+ scanControl = false;
+ if (((e1 & (1<<12)) != 0) && !isRotated())
+ scanControl = false;
+ if (((e1 & (1<<13)) != 0) && !isStretched())
+ scanControl = false;
+ break;
+
+ case 0x88: // GETINFO, GET INFOrmation
+ e1 = 0;
+ if ((stack[sp] & 1) != 0) // ask for rasterizer version
+ e1 |= 35; // "Microsoft Rasterizer version 1.7" (grayscale-capable)
+ if (((stack[sp] & 2) != 0) && isRotated())
+ e1 |= 1 << 8; // bit 8: glyph has been rotated
+ if (((stack[sp] & 4) != 0) && isStretched())
+ e1 |= 1 << 9; // bit 9: glyph has been stretched
+ if (((stack[sp] & 32) != 0) && antialiased)
+ e1 |= 1 << 12; // bit 12: antialiasing is active
+ stack[sp] = e1;
+ break;
+
+ case 0x8a: // ROLL, ROLL the top three stack elements
+ e1 = stack[sp - 2];
+ stack[sp - 2] = stack[sp - 1];
+ stack[sp - 1] = stack[sp];
+ stack[sp] = e1;
+ break;
+
+ case 0x8b: // MAX, MAXimum of top two stack elements
+ e1 = stack[sp--];
+ stack[sp] = Math.max(e1, stack[sp]);
+ break;
+
+ case 0x8c: // MIN, MINimum of top two stack elements
+ e1 = stack[sp--];
+ stack[sp] = Math.min(e1, stack[sp]);
+ break;
+
+ case 0x8d: // SCANTYPE
+ scanType = stack[sp--];
+ break;
+
+ case 0x8e: // INSTCTRL, INSTRuction execution ConTRoL
+ e1 = stack[sp--]; // selector
+ e2 = stack[sp--]; // value
+ switch (e1)
+ {
+ case 1:
+ executeGlyphInstructions = (e2 == 0);
+ break;
+
+ case 2:
+ ignoreCVTProgram = (e2 != 0);
+ break;
+ }
+ break;
+
+ case 0xb0: // PUSHB[0]
+ case 0xb1: // PUSHB[1]
+ case 0xb2: // PUSHB[2]
+ case 0xb3: // PUSHB[3]
+ case 0xb4: // PUSHB[4]
+ case 0xb5: // PUSHB[5]
+ case 0xb6: // PUSHB[6]
+ case 0xb7: // PUSHB[7]
+ count = bcode - 0xb0 + 1;
+ for (i = 0; i < count; i++)
+ stack[++sp] = inst.get() & 0xff;
+ break;
+
+ case 0xb8: // PUSHW[0]
+ case 0xb9: // PUSHW[1]
+ case 0xba: // PUSHW[2]
+ case 0xbb: // PUSHW[3]
+ case 0xbc: // PUSHW[4]
+ case 0xbd: // PUSHW[5]
+ case 0xbe: // PUSHW[6]
+ case 0xbf: // PUSHW[7]
+ count = bcode - 0xb8 + 1;
+ for (i = 0; i < count; i++)
+ stack[++sp] = inst.getShort();
+ break;
+
+ // MIRPxxxx, Move Indirect Relative Point
+ case 0xe0: case 0xe1: case 0xe2: case 0xe3:
+ case 0xe4: case 0xe5: case 0xe6: case 0xe7:
+ case 0xe8: case 0xe9: case 0xea: case 0xeb:
+ case 0xec: case 0xed: case 0xee: case 0xef:
+ case 0xf0: case 0xf1: case 0xf2: case 0xf3:
+ case 0xf4: case 0xf5: case 0xf6: case 0xf7:
+ case 0xf8: case 0xf9: case 0xfa: case 0xfb:
+ case 0xfc: case 0xfd: case 0xfe: case 0xff:
+ e1 = stack[sp--];
+ handleMIRP(bcode, /* point */ e1, /* cvtIndex */ stack[sp--]);
+ break;
+
+ default:
+ throw new IllegalStateException();
+ }
+
+ return true;
+ }
+
+
+ /**
+ * Sets the rounding mode.
+ *
+ * @param period the grid period in fixed-point notation, such as
+ * {@link Fixed#ONE} for the <code>SROUND</code> instruction or
+ * <code>sqrt(2)/2</code> for the <code>S45ROUND</code> instruction.
+ *
+ * @param mode a byte whose bits are set according to the TrueType
+ * specification for SROUND and S45ROUND parameters.
+ */
+ private void setRoundingMode(int period, int mode)
+ {
+ /* Set the period. */
+ switch ((mode & 0xc0) >> 6)
+ {
+ case 0:
+ roundPeriod = period / 2;
+ break;
+
+ case 2:
+ roundPeriod = period * 2;
+ break;
+
+ default:
+ roundPeriod = period;
+ break;
+ }
+
+ /* Set the phase. */
+ switch ((mode & 0x30) >> 4)
+ {
+ case 0:
+ roundPhase = 0;
+ break;
+
+ case 1:
+ roundPhase = roundPeriod >> 2; // period/4
+ break;
+
+ case 2:
+ roundPhase = roundPeriod >> 1; // period/2
+ break;
+
+ case 3:
+ roundPhase = (roundPeriod >> 1) + (roundPeriod >> 2); // period * 3/4
+ break;
+ }
+
+ /* Set the threshold. */
+ int threshold = mode & 0x0f;
+ if (threshold == 0)
+ roundThreshold = roundPeriod - Fixed.ONE;
+ else
+ roundThreshold = ((threshold - 4) * roundPeriod) / 8;
+ }
+
+
+
+ /**
+ * Implements the DELTAC instructions. These instructions check
+ * whether the current number of pixels per em is contained in an
+ * exception table. If it is, a delta value is determined, and the
+ * specified entry in the Control Value Table is modified according
+ * to the delta.
+ *
+ * @param pairs the delta table. Because the delta table is on
+ * the stack, callers usually just want to pass the stack array.
+ *
+ * @param offset the offset of the first pair in <code>pairs</code>.
+ *
+ * @param numPairs the number of pairs.
+ *
+ * @param base 0 for <code>DELTAC1</code>, 16 for <code>DELTAC2</code>,
+ * or 32 for <code>DELTAC2</code>.
+ *
+ * @see <a href=
+ * "http://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html#DELTAC1"
+ * >Apple&#x2019;s documentation for <code>DELTAC1</code></a>, <a href=
+ * "http://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html#DELTAC2"
+ * ><code>DELTAC2</code></a>, and <a href=
+ * "http://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html#DELTAC3"
+ * ><code>DELTAC3</code></a>
+ */
+ private void deltaC(int[] pairs, int offset, int numPairs, int base)
+ {
+ int arg, relativePpem;
+ int ppemTrigger = getPixelsPerEM() - (deltaBase + base);
+ int delta, cvtIndex, rightShift;
+ for (int i = 0; i < numPairs; i++)
+ {
+ arg = pairs[offset + 2 * i];
+ relativePpem = (arg >> 4) & 15;
+ if (relativePpem == ppemTrigger)
+ {
+ delta = (arg & 15) - 8;
+ if (delta >= 0)
+ ++delta;
+
+ rightShift = deltaShift - 6;
+ if (rightShift > 0)
+ delta = delta >> rightShift;
+ else if (rightShift < 0)
+ delta = delta << (-rightShift);
+ cvt[pairs[offset + 2 * i + 1]] += delta;
+
+ break;
+ }
+ }
+ }
+
+
+ private Zone getZone(int zoneNumber)
+ {
+ return (zoneNumber == 0) ? twilightZone : glyphZone;
+ }
+
+
+ /**
+ * Projects the specified vector along the current projection
+ * vector.
+ *
+ * @param x the x component of the input vector, in 26.6 fixed-point
+ * notation.
+ *
+ * @param y the y component of the input vector, in 26.6 fixed-point
+ * notation.
+ *
+ * @return the projected distance, in 26.6 fixed-point notation.
+ */
+ private int getProjection(int x, int y)
+ {
+ return (int) (((((long) x) * projX + ((long) y) * projY)) >> 14);
+ }
+
+
+ /**
+ * Projects the specified vector along the current dual projection
+ * vector.
+ *
+ * @param x the x component of the input vector, in 26.6 fixed-point
+ * notation.
+ *
+ * @param y the y component of the input vector, in 26.6 fixed-point
+ * notation.
+ *
+ * @return the projected distance, in 26.6 fixed-point notation.
+ */
+ private int getDualProjection(int x, int y)
+ {
+ return (int) (((((long) x) * dualX + ((long) y) * dualY)) >> 14);
+ }
+
+
+ private int getProjection(Zone zone, int point)
+ {
+ return getProjection(zone.getX(point), zone.getY(point));
+ }
+
+
+ private int getOriginalProjection(Zone zone, int point)
+ {
+ return getDualProjection(zone.getOriginalX(point),
+ zone.getOriginalY(point));
+ }
+
+
+ private void handleISECT(int a0, int a1, int b0, int b1, int p)
+ {
+ System.out.println("FIXME: Unimplemented ISECT " + p);
+ }
+
+
+ private static int muldiv(int a, int b, int c)
+ {
+ int s;
+ s = a; a = Math.abs(a);
+ s ^= b; b = Math.abs(b);
+ s ^= c; c = Math.abs(c);
+ a = (int) ((((long) a) * b + (c>>1)) / c);
+ return (s < 0) ? -a : a;
+ }
+
+
+ private int getFreeDotProj()
+ {
+ int result;
+
+ result = ((((int) projX) * freeX) << 2)
+ + ((((int) projY) * freeY) << 2);
+
+ /* FIXME: This seems somewhat bogus. Need to contact the
+ * developers of FreeType.
+ */
+ if (Math.abs(result) < 0x4000000)
+ result = 0x40000000;
+ return result;
+ }
+
+
+ private void movePoint(Zone zone, int point, int distance)
+ {
+ int freeDotProj = getFreeDotProj();
+ int c;
+
+ if (freeX != 0)
+ {
+ c = zone.getX(point);
+ c += muldiv(distance, freeX << 16, freeDotProj);
+ zone.setX(point, c, /* touch */ true);
+ }
+
+ if (freeY != 0)
+ {
+ c = zone.getY(point);
+ c += muldiv(distance, freeY << 16, freeDotProj);
+ zone.setY(point, c, /* touch */ true);
+ }
+
+ if (TRACE_EXECUTION)
+ {
+ System.out.println("point[" + point + "] moved to "
+ + Fixed.toString(zone.getX(point),
+ zone.getY(point)));
+ dumpVectors();
+ }
+ }
+
+ private void dumpVectors()
+ {
+ System.out.println(" proj=" + Fixed.toString(projX>>8, projY>>8)
+ + ", free=" + Fixed.toString(freeX>>8, freeY>>8));
+ }
+
+
+ private void handleIP()
+ {
+ // Implementation taken from FreeType.
+ int p, org_a, org_b, org_x, cur_a, cur_b, cur_x, distance;
+ int freeDotProj;
+
+ org_a = getOriginalProjection(zp0, rp1);
+ cur_a = getProjection(zp0, rp1);
+
+ org_b = getOriginalProjection(zp1, rp2);
+ cur_b = getProjection(zp1, rp2);
+
+ while (--loop >= 0)
+ {
+ p = stack[sp--];
+ org_x = getOriginalProjection(zp2, p);
+ cur_x = getProjection(zp2, p);
+
+ if (((org_a <= org_b) && (org_x <= org_a))
+ || ((org_a > org_b) && (org_x >= org_a)))
+ distance = (cur_a - org_a) + (org_x - cur_x);
+ else if (((org_a <= org_b) && (org_x >= org_b))
+ || ((org_a > org_b) && (org_x < org_b)))
+ distance = (cur_b - org_b) + (org_x - cur_x);
+ else
+ distance = muldiv(cur_b - cur_a, org_x - org_a, org_b - org_a)
+ + (cur_a - cur_x);
+ movePoint(zp2, p, distance);
+ }
+ loop = 1;
+ }
+
+
+ private void handleMDAP(int point, boolean round)
+ {
+ System.out.println("FIXME: Unimplemented MDAP: point "
+ + point + "/" + zp0);
+ }
+
+
+ private void handleMIAP(int cvtIndex, int point, boolean round)
+ {
+ int previousPos, pos;
+
+ previousPos = getProjection(zp0, point);
+ pos = cvt[cvtIndex];
+
+ if (round)
+ {
+ if (Math.abs(pos - previousPos) > cvtCutIn)
+ pos = previousPos;
+ pos = round(pos, /* no engine compensation */ 0);
+ }
+ movePoint(zp0, point, pos - previousPos);
+ rp0 = rp1 = point;
+ }
+
+
+ private void handleMIRP(int bcode, int point, int cvtIndex)
+ {
+ System.out.println("FIXME: Unimplemented mirp " + point + ", " + cvtIndex);
+ }
+
+
+
+ private int round(int distance, int compensation)
+ {
+ int result;
+
+ if (roundPeriod == 0)
+ return nround(distance, compensation);
+
+ if (distance >= 0)
+ {
+ result = distance + compensation - roundPhase + roundThreshold;
+ result &= -roundPeriod; // truncate to the next lowest periodic value
+ return Math.max(result, 0) + roundPhase;
+ }
+ else
+ {
+ result = compensation - roundPhase + roundThreshold - distance;
+ result &= -roundPeriod;
+ return Math.max(-result, 0) - roundPhase;
+ }
+ }
+
+
+ private static int nround(int distance, int compensation)
+ {
+ if (distance >= 0)
+ return Math.max(distance + compensation, 0);
+ else
+ return Math.min(distance - compensation, 0);
+ }
+
+
+ /**
+ * Determines whether the current glyph is rotated.
+ *
+ * @return <code>false</code> if the shearing factors for the
+ * <i>x</i> and <i>y</i> axes are zero; <code>true</code> if they
+ * are non-zero.
+ */
+ private boolean isRotated()
+ {
+ return (shearX != 0) || (shearY != 0);
+ }
+
+
+ /**
+ * Determines whether the current glyph is stretched.
+ *
+ * @return <code>false</code> if the scaling factors for the
+ * <i>x</i> and <i>y</i> axes are are equal; <code>true</code> if
+ * they differ.
+ */
+ private boolean isStretched()
+ {
+ return scaleX != scaleY;
+ }
+
+
+ /**
+ * Returns how many pixels there are per EM, in direction of the
+ * current projection vector. The result is a normal integer,
+ * not a Fixed.
+ */
+ private int getPixelsPerEM()
+ {
+ if (cachedPixelsPerEM == 0)
+ {
+ cachedPixelsPerEM = Fixed.intValue(Fixed.vectorLength(
+ applyCTM_x(projX >> 8, projY >> 8),
+ applyCTM_y(projX >> 8, projY >> 8)));
+ }
+
+ return cachedPixelsPerEM;
+ }
+
+
+ private void setProjectionVector(short x, short y)
+ {
+ if (PATENTED_HINTING)
+ {
+ if ((x != projX) || (y != projY))
+ cachedPixelsPerEM = 0;
+
+ projX = x;
+ projY = y;
+ }
+ }
+
+
+ private void setFreedomVector(short x, short y)
+ {
+ if (PATENTED_HINTING)
+ {
+ freeX = x;
+ freeY = y;
+ }
+ }
+
+
+ private void setDualVector(short x, short y)
+ {
+ if (PATENTED_HINTING)
+ {
+ dualX = x;
+ dualY = y;
+ }
+ }
+
+
+ private int applyCTM_x(int x, int y)
+ {
+ return (int) (((long) scaleX * x + (long) shearX * y) >> 6);
+ }
+
+ private int applyCTM_y(int x, int y)
+ {
+ return (int) (((long) shearY * x + (long) scaleY * y) >> 6);
+ }
+
+
+ private static final String[] INST_NAME =
+ {
+ /* 00 */ "SVTCA[0]", "SVTCA[1]", "SPVTCA[0]", "SPVTCA[1]",
+ /* 04 */ "INST_04", "INST_05", "INST_06", "INST_07",
+ /* 08 */ "INST_08", "INST_09", "INST_0A", "INST_0B",
+ /* 0c */ "GPV", "GFV", "INST_0E", "ISECT",
+ /* 10 */ "SRP0", "SRP1", "SRP2", "SZP0",
+ /* 14 */ "SZP1", "SZP2", "SZPS", "SLOOP",
+ /* 18 */ "RTG", "RTHG", "SMD", "ELSE",
+ /* 1c */ "JMPR", "SCVTCI", "INST_1E", "SSW",
+ /* 20 */ "DUP", "POP", "CLEAR", "SWAP",
+ /* 24 */ "DEPTH", "CINDEX", "MINDEX", "INST_27",
+ /* 28 */ "INST_28", "INST_29", "LOOPCALL", "CALL",
+ /* 2c */ "FDEF", "ENDF", "MDAP[0]", "MDAP[1]",
+ /* 30 */ "IUP[0]", "IUP[1]", "SHP[0]", "SHP[1]",
+ /* 34 */ "INST_34", "INST_35", "INST_36", "INST_37",
+ /* 38 */ "INST_38", "IP", "INST_3A", "INST_3B",
+ /* 3c */ "INST_3C", "RTDG", "MIAP[0]", "MIAP[1]",
+ /* 40 */ "NPUSHB", "NPUSHW", "WS", "RS",
+ /* 44 */ "WCVTP", "RCVT", "GC[0]", "GC[1]",
+ /* 48 */ "INST_48", "INST_49", "INST_4A", "MPPEM",
+ /* 4c */ "MPS", "FLIPON", "FLIPOFF", "DEBUG",
+ /* 50 */ "LT", "LTEQ", "GT", "GTEQ",
+ /* 54 */ "EQ", "NEQ", "INST_56", "INST_57",
+ /* 58 */ "IF", "EIF", "AND", "OR",
+ /* 5c */ "INST_5C", "INST_5D", "SDB", "SDS",
+ /* 60 */ "ADD", "SUB", "DIV", "MUL",
+ /* 64 */ "ABS", "NEG", "FLOOR", "CEILING",
+ /* 68 */ "ROUND[0]", "ROUND[1]", "ROUND[2]", "ROUND[3]",
+ /* 6c */ "NROUND[0]", "NROUND[1]", "NROUND[2]", "NROUND[3]",
+ /* 70 */ "WCVTF", "INST_71", "INST_72", "DELTAC1",
+ /* 74 */ "DELTAC2", "DELTAC3", "SROUND", "S45ROUND",
+ /* 78 */ "JROT", "JROF", "ROFF", "INST_7B",
+ /* 7c */ "RUTG", "RDTG", "SANGW", "AA",
+ /* 80 */ "FLIPPT", "FLIPRGON", "FLIPRGOFF", "INST_83",
+ /* 84 */ "INST_84", "SCANCTRL", "INST_86", "INST_87",
+ /* 88 */ "GETINFO", "INST_89", "ROLL", "MAX",
+ /* 8c */ "MIN", "SCANTYPE", "INSTCTRL", "INST_8F",
+ /* 90 */ "INST_90", "INST_91", "INST_92", "INST_93",
+ /* 94 */ "INST_94", "INST_95", "INST_96", "INST_97",
+ /* 98 */ "INST_98", "INST_99", "INST_9A", "INST_9B",
+ /* 9c */ "INST_9C", "INST_9D", "INST_9E", "INST_9F",
+ /* a0 */ "INST_A0", "INST_A1", "INST_A2", "INST_A3",
+ /* a4 */ "INST_A4", "INST_A5", "INST_A6", "INST_A7",
+ /* a8 */ "INST_A8", "INST_A9", "INST_AA", "INST_AB",
+ /* ac */ "INST_AC", "INST_AD", "INST_AE", "INST_AF",
+ /* b0 */ "PUSHB[0]", "PUSHB[1]", "PUSHB[2]", "PUSHB[3]",
+ /* b4 */ "PUSHB[4]", "PUSHB[5]", "PUSHB[6]", "PUSHB[7]",
+ /* b8 */ "PUSHW[0]", "PUSHW[1]", "PUSHW[2]", "PUSHW[3]",
+ /* bc */ "PUSHW[4]", "PUSHW[5]", "PUSHW[6]", "PUSHW[7]",
+ /* c0 */ "INST_C0", "INST_C1", "INST_C2", "INST_C3",
+ /* c4 */ "INST_C4", "INST_C5", "INST_C6", "INST_C7",
+ /* c8 */ "INST_C8", "INST_C9", "INST_CA", "INST_CB",
+ /* cc */ "INST_CC", "INST_CD", "INST_CE", "INST_CF",
+ /* d0 */ "INST_D0", "INST_D1", "INST_D2", "INST_D3",
+ /* d4 */ "INST_D4", "INST_D5", "INST_D6", "INST_D7",
+ /* d8 */ "INST_D8", "INST_D9", "INST_DA", "INST_DB",
+ /* dc */ "INST_DC", "INST_DD", "INST_DE", "INST_DF",
+ /* e0 */ "MIRP00000", "MIRP00001", "MIRP00010", "MIRP00011",
+ /* e4 */ "MIRP00100", "MIRP00101", "MIRP00110", "MIRP00111",
+ /* e8 */ "MIRP01000", "MIRP01001", "MIRP01010", "MIRP01011",
+ /* ec */ "MIRP01100", "MIRP01101", "MIRP01110", "MIRP01111",
+ /* f0 */ "MIRP10000", "MIRP10001", "MIRP10010", "MIRP10011",
+ /* f4 */ "MIRP10100", "MIRP10101", "MIRP10110", "MIRP10111",
+ /* f8 */ "MIRP11000", "MIRP11001", "MIRP11010", "MIRP11011",
+ /* fc */ "MIRP11100", "MIRP11101", "MIRP11110", "MIRP11111"
+ };
+}
diff --git a/gnu/java/awt/font/opentype/truetype/Zone.java b/gnu/java/awt/font/opentype/truetype/Zone.java
new file mode 100644
index 000000000..c0a3947f6
--- /dev/null
+++ b/gnu/java/awt/font/opentype/truetype/Zone.java
@@ -0,0 +1,243 @@
+/* Zone.java -- A collection of points with some additional information.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype.truetype;
+
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.PathIterator;
+
+
+/**
+ * A collection of points with some additional information.
+ */
+final class Zone
+{
+ private final int[] pos;
+ private final int[] origPos;
+ private final byte[] flags;
+ private int numPoints;
+
+ private static final int FLAG_TOUCHED_X = 1;
+ private static final int FLAG_TOUCHED_Y = 2;
+ private static final int FLAG_ON_CURVE = 4;
+ private static final int FLAG_CONTOUR_END = 8;
+
+ public Zone(int maxNumPoints)
+ {
+ origPos = new int[maxNumPoints * 2];
+ pos = new int[maxNumPoints * 2];
+ flags = new byte[maxNumPoints];
+ }
+
+
+ public int getCapacity()
+ {
+ return flags.length;
+ }
+
+
+ public int getSize()
+ {
+ return numPoints;
+ }
+
+
+ public int getX(int point)
+ {
+ return pos[2 * point];
+ }
+
+
+ public void setX(int point, int value, boolean touch)
+ {
+ pos[2 * point] = value;
+ if (touch)
+ flags[point] |= FLAG_TOUCHED_X;
+ }
+
+
+ public void setY(int point, int value, boolean touch)
+ {
+ pos[2 * point + 1] = value;
+ if (touch)
+ flags[point] |= FLAG_TOUCHED_Y;
+ }
+
+
+ public int getY(int point)
+ {
+ return pos[2 * point + 1];
+ }
+
+
+ public int getOriginalX(int point)
+ {
+ return origPos[2 * point];
+ }
+
+
+ public int getOriginalY(int point)
+ {
+ return origPos[2 * point + 1];
+ }
+
+
+ public void setOriginalX(int point, int x)
+ {
+ origPos[2 * point] = x;
+ }
+
+ public void setOriginalY(int point, int y)
+ {
+ origPos[2 * point + 1] = y;
+ }
+
+ public void setNumPoints(int numPoints)
+ {
+ this.numPoints = numPoints;
+ for (int i = 0; i < numPoints; i++)
+ flags[i] = 0;
+ for (int i = 0; i < 2 * numPoints; i++)
+ origPos[i] = pos[i] = 0;
+ }
+
+
+ public boolean isOnCurve(int point)
+ {
+ return (flags[point] & FLAG_ON_CURVE) != 0;
+ }
+
+
+ public void setOnCurve(int point, boolean onCurve)
+ {
+ if (onCurve)
+ flags[point] |= FLAG_ON_CURVE;
+ else
+ flags[point] &= ~FLAG_ON_CURVE;
+ }
+
+
+ public boolean isContourEnd(int point)
+ {
+ return (flags[point] & FLAG_CONTOUR_END) != 0;
+ }
+
+
+ public void setContourEnd(int point, boolean segEnd)
+ {
+ if (segEnd)
+ flags[point] |= FLAG_CONTOUR_END;
+ else
+ flags[point] &= ~FLAG_CONTOUR_END;
+ }
+
+
+
+
+ void transform(double pointSize, AffineTransform deviceTransform,
+ int unitsPerEm, int preTranslateX, int preTranslateY)
+ {
+ double scaleX, scaleY, shearX, shearY;
+ double factor;
+
+ factor = pointSize / (double) unitsPerEm;
+ scaleX = deviceTransform.getScaleX() * factor;
+ scaleY = deviceTransform.getScaleY() * factor;
+ shearX = deviceTransform.getShearX() * factor;
+ shearY = deviceTransform.getShearY() * factor;
+
+ for (int i = 0; i < numPoints; i++)
+ {
+ int x = origPos[2 * i] + preTranslateX;
+ int y = origPos[2 * i + 1] + preTranslateY;
+
+ origPos[2*i] = pos[2 * i] = Fixed.valueOf(scaleX * x + shearX * y);
+ origPos[2*i+1] = pos[2 * i + 1] = Fixed.valueOf(shearY * x + scaleY * y);
+ }
+ }
+
+
+
+ void combineWithSubGlyph(Zone zone, int numPhantomPoints)
+ {
+ int offset = this.numPoints - numPhantomPoints;
+ int count = zone.numPoints;
+ System.arraycopy(zone.origPos, 0, this.origPos, 2 * offset,
+ count * 2);
+ System.arraycopy(zone.pos, 0, this.pos, 2 * offset,
+ count * 2);
+ System.arraycopy(zone.flags, 0, this.flags, offset, count);
+ this.numPoints += count - numPhantomPoints;
+ }
+
+
+ private void dump()
+ {
+ for (int i = 0; i < numPoints; i++)
+ {
+ System.out.print(" " + i + ": ");
+ System.out.print(Fixed.toString(pos[i*2], pos[i*2+1]));
+ System.out.print(' ');
+ System.out.print(Fixed.toString(origPos[i*2], origPos[i*2+1]));
+ System.out.print(' ');
+ if (isOnCurve(i))
+ System.out.print('.');
+ else
+ System.out.print('c');
+ if (isContourEnd(i))
+ System.out.print('E');
+ System.out.println();
+ if (isContourEnd(i))
+ System.out.println();
+ }
+ }
+
+
+ public PathIterator getPathIterator()
+ {
+ return new ZonePathIterator(this);
+ }
+
+
+ public GeneralPath getPath()
+ {
+ GeneralPath p = new GeneralPath(GeneralPath.WIND_NON_ZERO, numPoints);
+ p.append(getPathIterator(), /* connect */ false);
+ return p;
+ }
+}
diff --git a/gnu/java/awt/font/opentype/truetype/ZonePathIterator.java b/gnu/java/awt/font/opentype/truetype/ZonePathIterator.java
new file mode 100644
index 000000000..d000b9c3e
--- /dev/null
+++ b/gnu/java/awt/font/opentype/truetype/ZonePathIterator.java
@@ -0,0 +1,391 @@
+/* ZonePathIterator.java -- A PathIterator over glyph zones.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.font.opentype.truetype;
+
+import java.awt.geom.PathIterator;
+
+
+/**
+ * A PathIterator that enumerates the non-phantom points in a zone.
+ *
+ * <p><b>Lack of thread safety:</b> Instances of this class are
+ * <i>not</i> safe to access from multiple concurrent threads.
+ *
+ * @see Zone
+ *
+ * @author Sascha Brawer (brawer@dandelis.ch)
+ */
+final class ZonePathIterator
+ implements PathIterator
+{
+ /**
+ * If <code>state</code> has this value, <code>currentSegment</code>
+ * will emit a <code>SEG_LINETO</code> or <code>SEG_QUADTO</code> segment
+ * to the current point. For a discussion of subtleties of on-curve
+ * and off-curve points, please refer to the documentation for
+ * {@link #getSegment}.
+ */
+ private static final int EMIT_SEGMENT = 0;
+
+
+ /**
+ * If <code>state</code> has this value, <code>currentSegment</code>
+ * will emit a <code>SEG_CLOSE</code> in order to close the sub-path
+ * for the current contour.
+ */
+ private static final int EMIT_CLOSE = 1;
+
+
+ /**
+ * If <code>state</code> has this value, <code>currentSegment</code>
+ * will emit a <code>SEG_MOVETO</code> segment to the first point in
+ * the current contour. If the first point is off-curve, a suitable
+ * on-curve point is calculated.
+ *
+ * @see #getStartSegment
+ */
+ private static final int EMIT_MOVETO = 2;
+
+
+ /**
+ * The state of the iterator, which is one of
+ * <code>EMIT_SEGMENT</code>, <code>EMIT_CLOSE</code>, or
+ * <code>EMIT_MOVETO</code>.
+ */
+ private int state;
+
+
+
+ /**
+ * The zone whose segments are enumerated by this iterator.
+ */
+ private Zone zone;
+
+
+ /**
+ * The total number of points in the zone, not including the four
+ * phantom points at its end.
+ */
+ private int numPoints;
+
+
+ /**
+ * The number of the current point.
+ */
+ private int curPoint;
+
+
+ /**
+ * The number of the first point in the current contour.
+ */
+ private int contourStart;
+
+
+
+ /**
+ * Constructs a ZonePathIterator for the specified zone.
+ *
+ * @param zone the zone whose segments will be enumerated
+ * by this iterator.
+ */
+ ZonePathIterator(Zone zone)
+ {
+ this.zone = zone;
+ numPoints = zone.getSize() - /* four phantom points */ 4;
+
+ // The first segment that needs to be emitted is a SEG_MOVETO.
+ state = EMIT_MOVETO;
+ }
+
+
+ /**
+ * Returns the winding rule. TrueType glyphs always use the non-zero
+ * winding rule, so this method will always return {@link
+ * PathIterator#WIND_NON_ZERO}.
+ */
+ public int getWindingRule()
+ {
+ return PathIterator.WIND_NON_ZERO;
+ }
+
+
+
+ public boolean isDone()
+ {
+ return (state != EMIT_CLOSE) && (curPoint >= numPoints);
+ }
+
+
+ public void next()
+ {
+ boolean onCurve;
+
+ /* If the current point is the end of a segment, and no SEG_CLOSE
+ * has been emitted yet, this will be the next segment.
+ */
+ if (zone.isContourEnd(curPoint) && (state != EMIT_CLOSE))
+ {
+ state = EMIT_CLOSE;
+ return;
+ }
+
+ /* If the previously emitted segment was a SEG_CLOSE, we are now
+ * at the beginning of a new contour.
+ */
+ if (state == EMIT_CLOSE)
+ {
+ contourStart = ++curPoint;
+ state = EMIT_MOVETO;
+ return;
+ }
+
+ onCurve = zone.isOnCurve(curPoint);
+
+ /* If the last segment was a moveto, and the current point
+ * (which is the first point in the contour) is off-curve,
+ * we need to emit a quadto segment for the first point.
+ */
+ if ((state == EMIT_MOVETO) && !onCurve)
+ {
+ state = EMIT_SEGMENT;
+ return;
+ }
+
+
+ curPoint++;
+
+ /* If the last point has been off-curve, and the now current
+ * point is on-curve, the last segment was a quadto that
+ * had the now current point at its end. In this case, we can
+ * skip a segment.
+ */
+ if (!onCurve && zone.isOnCurve(curPoint))
+ {
+ /* But if the skipped point is the end of a contour, we must not
+ * skip the SEG_CLOSE. An example where this matters is the 'o'
+ * glyph in the Helvetica font face that comes with MacOS X
+ * 10.1.5.
+ */
+ if (zone.isContourEnd(curPoint))
+ {
+ state = EMIT_CLOSE;
+ return;
+ }
+
+ curPoint++;
+ }
+
+ state = EMIT_SEGMENT;
+ }
+
+
+ /**
+ * Determines the successor of the current point in the current
+ * contour. The successor of the last point in a contour is the
+ * start of that contour.
+ *
+ * @return the number of the point that follows the current point in
+ * the same contour.
+ */
+ private int getSuccessor(int p)
+ {
+ if (zone.isContourEnd(p))
+ return contourStart;
+ else
+ return p + 1;
+ }
+
+
+
+ /**
+ * Retrieves the current path segment using single-precision
+ * coordinate values.
+ */
+ public int currentSegment(float[] coords)
+ {
+ switch (state)
+ {
+ case EMIT_CLOSE:
+ return PathIterator.SEG_CLOSE;
+
+ case EMIT_MOVETO:
+ return getStartSegment(curPoint, coords);
+
+ default:
+ return getSegment(curPoint, coords);
+ }
+ }
+
+
+ /**
+ * A helper array that is used by {@link
+ * #currentSegment(double[])}.
+ */
+ float[] floats;
+
+
+ /**
+ * Retrieves the current path segment using double-precision
+ * coordinate values.
+ */
+ public int currentSegment(double[] coords)
+ {
+ if (floats == null)
+ floats = new float[6];
+ int result;
+
+ result = currentSegment(floats);
+ for (int i = 0; i < 6; i++)
+ coords[i] = floats[i];
+ return result;
+ }
+
+
+ /**
+ * Returns the segment for the specified point.
+ *
+ * <p><img src="doc-files/ZonePathIterator-1.png" width="426"
+ * height="194" alt="An example curve" /></p>
+ *
+ * <p>If <code>cur</code> is an on-curve point, the returned segment
+ * is a straight line to <code>cur</code>. In the illustration, this
+ * would be the case for <code>cur = 4</code>.</p>
+ *
+ * <p>If <code>cur</code> is an off-curve point, and
+ * <code>cur</code>&#x2019;s successor <code>succ</code> is also
+ * off-curve, the returned segment is a quadratic B&eacute;zier
+ * spline whose control point is <code>cur</code>, and whose end
+ * point is located at the middle of the line connecting
+ * <code>cur</code> and <code>succ</code>. In the illustration,
+ * this would be the case for <code>cur = 5</code>.</p>
+ *
+ * <p>If <code>cur</code> is an off-curve point, and
+ * <code>cur</code>&#x2019;s successor <code>succ</code> is
+ * on-curve, the returned segment is a quadratic B&eacute;zier
+ * spline whose control point is <code>cur</code>, and whose end
+ * point is <code>succ</code>. In the illustration, this would
+ * be the case for <code>cur = 6</code>.</p>
+ *
+ * @return either <code>PathIterator.SEG_LINETO</code> or
+ * <code>PathIterator.SEG_QUADTO</code>.
+ */
+ private int getSegment(int cur, float[] coords)
+ {
+ int curX, curY;
+ int succ, succX, succY;
+
+ curX = zone.getX(cur);
+ curY = zone.getY(cur);
+ coords[0] = Fixed.floatValue(curX);
+ coords[1] = Fixed.floatValue(curY);
+
+ if (zone.isOnCurve(cur))
+ return PathIterator.SEG_LINETO;
+
+ succ = getSuccessor(cur);
+ succX = zone.getX(succ);
+ succY = zone.getY(succ);
+
+ if (zone.isOnCurve(succ))
+ {
+ coords[2] = Fixed.floatValue(succX);
+ coords[3] = Fixed.floatValue(succY);
+ }
+ else
+ {
+ coords[2] = Fixed.floatValue((curX + succX) / 2);
+ coords[3] = Fixed.floatValue((curY + succY) / 2);
+ }
+ return PathIterator.SEG_QUADTO;
+ }
+
+
+ /**
+ * Returns the start segment for the contour which starts
+ * at the specified point.
+ *
+ * <p>If the contour starts with an on-curve point, the returned
+ * segment is a <code>SEG_MOVETO</code> to that point.</p>
+ *
+ * <p>If the contour starts with an off-curve point, and the contour
+ * ends with an on-curve point, the returned segment is a
+ * <code>SEG_MOVETO</code> to the end point.</p>
+ *
+ * <p>If the contour starts with an off-curve point, and the contour
+ * also ends with an off-curve point, the returned segment is a
+ * <code>SEG_MOVETO</code> to the location at the middle between the
+ * start and end points of the contour.</p>
+ *
+ * @return <code>PathIterator.SEG_MOVETO</code>.
+ */
+ private int getStartSegment(int contourStart, float[] coords)
+ {
+ int x, y;
+
+ if (zone.isOnCurve(contourStart))
+ {
+ x = zone.getX(contourStart);
+ y = zone.getY(contourStart);
+ }
+ else
+ {
+ /* Find the last point of the current contour. */
+ int contourEnd = contourStart;
+ while (!zone.isContourEnd(contourEnd))
+ ++contourEnd;
+
+ if (zone.isOnCurve(contourEnd))
+ {
+ /* An example is the 'o' glyph of the Helvetica which comes
+ * with Apple MacOS X 10.1.5.
+ */
+ x = zone.getX(contourEnd);
+ y = zone.getY(contourEnd);
+ }
+ else
+ {
+ x = (zone.getX(contourStart) + zone.getX(contourEnd)) / 2;
+ y = (zone.getY(contourStart) + zone.getY(contourEnd)) / 2;
+ }
+ }
+
+ coords[0] = Fixed.floatValue(x);
+ coords[1] = Fixed.floatValue(y);
+ return PathIterator.SEG_MOVETO;
+ }
+}
diff --git a/gnu/java/awt/java2d/AbstractGraphics2D.java b/gnu/java/awt/java2d/AbstractGraphics2D.java
new file mode 100644
index 000000000..e55d317fd
--- /dev/null
+++ b/gnu/java/awt/java2d/AbstractGraphics2D.java
@@ -0,0 +1,1927 @@
+/* AbstractGraphics2D.java -- Abstract Graphics2D implementation
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.awt.java2d;
+
+import java.awt.AWTError;
+import java.awt.AlphaComposite;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.CompositeContext;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Paint;
+import java.awt.PaintContext;
+import java.awt.Polygon;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Shape;
+import java.awt.Stroke;
+import java.awt.Toolkit;
+import java.awt.RenderingHints.Key;
+import java.awt.font.FontRenderContext;
+import java.awt.font.GlyphVector;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Arc2D;
+import java.awt.geom.Area;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Line2D;
+import java.awt.geom.NoninvertibleTransformException;
+import java.awt.geom.PathIterator;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.ColorModel;
+import java.awt.image.ImageObserver;
+import java.awt.image.Raster;
+import java.awt.image.RenderedImage;
+import java.awt.image.WritableRaster;
+import java.awt.image.renderable.RenderableImage;
+import java.text.AttributedCharacterIterator;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Implements general and shared behaviour for Graphics2D implementation.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public abstract class AbstractGraphics2D
+ extends Graphics2D
+ implements Cloneable
+{
+
+ /**
+ * Accuracy of the sampling in the anti-aliasing shape filler.
+ * Lower values give more speed, while higher values give more quality.
+ * It is advisable to choose powers of two.
+ */
+ private static final int AA_SAMPLING = 8;
+
+ /**
+ * The transformation for this Graphics2D instance
+ */
+ private AffineTransform transform;
+
+ /**
+ * The foreground.
+ */
+ private Paint paint;
+
+ /**
+ * The background.
+ */
+ private Color background;
+
+ /**
+ * The current font.
+ */
+ private Font font;
+
+ /**
+ * The current composite setting.
+ */
+ private Composite composite;
+
+ /**
+ * The current stroke setting.
+ */
+ private Stroke stroke;
+
+ /**
+ * The current clip. This clip is in user coordinate space.
+ */
+ private Shape clip;
+
+ /**
+ * The rendering hints.
+ */
+ private RenderingHints renderingHints;
+
+ /**
+ * The paint raster.
+ */
+ private Raster paintRaster;
+
+ /**
+ * A cached pixel array.
+ */
+ private int[] pixel;
+
+ /**
+ * The raster of the destination surface. This is where the painting is
+ * performed.
+ */
+ private WritableRaster destinationRaster;
+
+ /**
+ * Stores the alpha values for a scanline in the anti-aliasing shape
+ * renderer.
+ */
+ private transient int[] alpha;
+
+ /**
+ * The edge table for the scanline conversion algorithms.
+ */
+ private transient ArrayList[] edgeTable;
+
+ /**
+ * Indicates if cerain graphics primitives can be rendered in an optimized
+ * fashion. This will be the case if the following conditions are met:
+ * - The transform may only be a translation, no rotation, shearing or
+ * scaling.
+ * - The paint must be a solid color.
+ * - The composite must be an AlphaComposite.SrcOver.
+ * - The clip must be a Rectangle.
+ * - The stroke must be a plain BasicStroke().
+ *
+ * These conditions represent the standard settings of a new
+ * AbstractGraphics2D object and will be the most commonly used setting
+ * in Swing rendering and should therefore be optimized as much as possible.
+ */
+ private boolean isOptimized;
+
+ /**
+ * Creates a new AbstractGraphics2D instance.
+ */
+ protected AbstractGraphics2D()
+ {
+ transform = new AffineTransform();
+ background = Color.WHITE;
+ composite = AlphaComposite.SrcOver;
+ stroke = new BasicStroke();
+ HashMap hints = new HashMap();
+ hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
+ hints.put(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_DEFAULT);
+ renderingHints = new RenderingHints(hints);
+
+ pixel = new int[4];
+ }
+
+ /**
+ * Draws the specified shape. The shape is passed through the current stroke
+ * and is then forwarded to {@link #fillShape}.
+ *
+ * @param shape the shape to draw
+ */
+ public void draw(Shape shape)
+ {
+ // Stroke the shape.
+ Shape strokedShape = stroke.createStrokedShape(shape);
+
+ // Clip the stroked shape.
+// Shape clipped = clipShape(strokedShape);
+// if (clipped != null)
+// {
+// // Fill the shape.
+// fillShape(clipped, false);
+// }
+ // FIXME: Clipping doesn't seem to work.
+ fillShape(strokedShape, false);
+ }
+
+ public boolean drawImage(Image image, AffineTransform xform, ImageObserver obs)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ public void drawImage(BufferedImage image, BufferedImageOp op, int x, int y)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ public void drawRenderedImage(RenderedImage image, AffineTransform xform)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ public void drawRenderableImage(RenderableImage image, AffineTransform xform)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ /**
+ * Draws the specified string at the specified location.
+ *
+ * @param text the string to draw
+ * @param x the x location, relative to the bounding rectangle of the text
+ * @param y the y location, relative to the bounding rectangle of the text
+ */
+ public void drawString(String text, int x, int y)
+ {
+ FontRenderContext ctx = getFontRenderContext();
+ GlyphVector gv = font.createGlyphVector(ctx, text.toCharArray());
+ drawGlyphVector(gv, x, y);
+ }
+
+ /**
+ * Draws the specified string at the specified location.
+ *
+ * @param text the string to draw
+ * @param x the x location, relative to the bounding rectangle of the text
+ * @param y the y location, relative to the bounding rectangle of the text
+ */
+ public void drawString(String text, float x, float y)
+ {
+ FontRenderContext ctx = getFontRenderContext();
+ GlyphVector gv = font.createGlyphVector(ctx, text.toCharArray());
+ drawGlyphVector(gv, x, y);
+ }
+
+ /**
+ * Draws the specified string (as AttributedCharacterIterator) at the
+ * specified location.
+ *
+ * @param iterator the string to draw
+ * @param x the x location, relative to the bounding rectangle of the text
+ * @param y the y location, relative to the bounding rectangle of the text
+ */
+ public void drawString(AttributedCharacterIterator iterator, int x, int y)
+ {
+ FontRenderContext ctx = getFontRenderContext();
+ GlyphVector gv = font.createGlyphVector(ctx, iterator);
+ drawGlyphVector(gv, x, y);
+ }
+
+ /**
+ * Draws the specified string (as AttributedCharacterIterator) at the
+ * specified location.
+ *
+ * @param iterator the string to draw
+ * @param x the x location, relative to the bounding rectangle of the text
+ * @param y the y location, relative to the bounding rectangle of the text
+ */
+ public void drawString(AttributedCharacterIterator iterator, float x, float y)
+ {
+ FontRenderContext ctx = getFontRenderContext();
+ GlyphVector gv = font.createGlyphVector(ctx, iterator);
+ drawGlyphVector(gv, x, y);
+ }
+
+ /**
+ * Fills the specified shape with the current foreground.
+ *
+ * @param shape the shape to fill
+ */
+ public void fill(Shape shape)
+ {
+ fillShape(shape, false);
+ }
+
+ public boolean hit(Rectangle rect, Shape text, boolean onStroke)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ /**
+ * Sets the composite.
+ *
+ * @param comp the composite to set
+ */
+ public void setComposite(Composite comp)
+ {
+ composite = comp;
+ if (! (comp.equals(AlphaComposite.SrcOver)))
+ isOptimized = false;
+ else
+ updateOptimization();
+ }
+
+ /**
+ * Sets the current foreground.
+ *
+ * @param p the foreground to set.
+ */
+ public void setPaint(Paint p)
+ {
+ if (p != null)
+ {
+ paint = p;
+
+ if (! (paint instanceof Color))
+ isOptimized = false;
+ else
+ {
+ updateOptimization();
+ rawSetForeground((Color) paint);
+ }
+ }
+ }
+
+ /**
+ * Sets the stroke for this graphics object.
+ *
+ * @param s the stroke to set
+ */
+ public void setStroke(Stroke s)
+ {
+ stroke = s;
+ if (! stroke.equals(new BasicStroke()))
+ isOptimized = false;
+ else
+ updateOptimization();
+ }
+
+ /**
+ * Sets the specified rendering hint.
+ *
+ * @param hintKey the key of the rendering hint
+ * @param hintValue the value
+ */
+ public void setRenderingHint(Key hintKey, Object hintValue)
+ {
+ renderingHints.put(hintKey, hintValue);
+ }
+
+ /**
+ * Returns the rendering hint for the specified key.
+ *
+ * @param hintKey the rendering hint key
+ *
+ * @return the rendering hint for the specified key
+ */
+ public Object getRenderingHint(Key hintKey)
+ {
+ return renderingHints.get(hintKey);
+ }
+
+ /**
+ * Sets the specified rendering hints.
+ *
+ * @param hints the rendering hints to set
+ */
+ public void setRenderingHints(Map hints)
+ {
+ renderingHints.clear();
+ renderingHints.putAll(hints);
+ }
+
+ /**
+ * Adds the specified rendering hints.
+ *
+ * @param hints the rendering hints to add
+ */
+ public void addRenderingHints(Map hints)
+ {
+ renderingHints.putAll(hints);
+ }
+
+ /**
+ * Returns the current rendering hints.
+ *
+ * @return the current rendering hints
+ */
+ public RenderingHints getRenderingHints()
+ {
+ return (RenderingHints) renderingHints.clone();
+ }
+
+ /**
+ * Translates the coordinate system by (x, y).
+ *
+ * @param x the translation X coordinate
+ * @param y the translation Y coordinate
+ */
+ public void translate(int x, int y)
+ {
+ transform.translate(x, y);
+
+ // Update the clip. We special-case rectangular clips here, because they
+ // are so common (e.g. in Swing).
+ if (clip != null)
+ {
+ if (clip instanceof Rectangle)
+ {
+ Rectangle r = (Rectangle) clip;
+ r.x -= x;
+ r.y -= y;
+ setClip(r);
+ }
+ else
+ {
+ AffineTransform clipTransform = new AffineTransform();
+ clipTransform.translate(-x, -y);
+ updateClip(clipTransform);
+ }
+ }
+ }
+
+ /**
+ * Translates the coordinate system by (tx, ty).
+ *
+ * @param tx the translation X coordinate
+ * @param ty the translation Y coordinate
+ */
+ public void translate(double tx, double ty)
+ {
+ transform.translate(tx, ty);
+
+ // Update the clip. We special-case rectangular clips here, because they
+ // are so common (e.g. in Swing).
+ if (clip != null)
+ {
+ if (clip instanceof Rectangle)
+ {
+ Rectangle r = (Rectangle) clip;
+ r.x -= tx;
+ r.y -= ty;
+ }
+ else
+ {
+ AffineTransform clipTransform = new AffineTransform();
+ clipTransform.translate(-tx, -ty);
+ updateClip(clipTransform);
+ }
+ }
+ }
+
+ /**
+ * Rotates the coordinate system by <code>theta</code> degrees.
+ *
+ * @param theta the angle be which to rotate the coordinate system
+ */
+ public void rotate(double theta)
+ {
+ transform.rotate(theta);
+ if (clip != null)
+ {
+ AffineTransform clipTransform = new AffineTransform();
+ clipTransform.rotate(-theta);
+ updateClip(clipTransform);
+ }
+ updateOptimization();
+ }
+
+ /**
+ * Rotates the coordinate system by <code>theta</code> around the point
+ * (x, y).
+ *
+ * @param theta the angle by which to rotate the coordinate system
+ * @param x the point around which to rotate, X coordinate
+ * @param y the point around which to rotate, Y coordinate
+ */
+ public void rotate(double theta, double x, double y)
+ {
+ transform.rotate(theta, x, y);
+ if (clip != null)
+ {
+ AffineTransform clipTransform = new AffineTransform();
+ clipTransform.rotate(-theta, x, y);
+ updateClip(clipTransform);
+ }
+ updateOptimization();
+ }
+
+ /**
+ * Scales the coordinate system by the factors <code>scaleX</code> and
+ * <code>scaleY</code>.
+ *
+ * @param scaleX the factor by which to scale the X axis
+ * @param scaleY the factor by which to scale the Y axis
+ */
+ public void scale(double scaleX, double scaleY)
+ {
+ transform.scale(scaleX, scaleY);
+ if (clip != null)
+ {
+ AffineTransform clipTransform = new AffineTransform();
+ clipTransform.scale(-scaleX, -scaleY);
+ updateClip(clipTransform);
+ }
+ updateOptimization();
+ }
+
+ /**
+ * Shears the coordinate system by <code>shearX</code> and
+ * <code>shearY</code>.
+ *
+ * @param shearX the X shearing
+ * @param shearY the Y shearing
+ */
+ public void shear(double shearX, double shearY)
+ {
+ transform.shear(shearX, shearY);
+ if (clip != null)
+ {
+ AffineTransform clipTransform = new AffineTransform();
+ clipTransform.shear(-shearX, -shearY);
+ updateClip(clipTransform);
+ }
+ updateOptimization();
+ }
+
+ /**
+ * Transforms the coordinate system using the specified transform
+ * <code>t</code>.
+ *
+ * @param t the transform
+ */
+ public void transform(AffineTransform t)
+ {
+ transform.concatenate(t);
+ try
+ {
+ AffineTransform clipTransform = t.createInverse();
+ updateClip(clipTransform);
+ }
+ catch (NoninvertibleTransformException ex)
+ {
+ // TODO: How can we deal properly with this?
+ ex.printStackTrace();
+ }
+ updateOptimization();
+ }
+
+ /**
+ * Sets the transformation for this Graphics object.
+ *
+ * @param t the transformation to set
+ */
+ public void setTransform(AffineTransform t)
+ {
+ // Transform clip into target space using the old transform.
+ updateClip(transform);
+ transform.setTransform(t);
+ // Transform the clip back into user space using the inverse new transform.
+ try
+ {
+ updateClip(transform.createInverse());
+ }
+ catch (NoninvertibleTransformException ex)
+ {
+ // TODO: How can we deal properly with this?
+ ex.printStackTrace();
+ }
+ updateOptimization();
+ }
+
+ /**
+ * Returns the transformation of this coordinate system.
+ *
+ * @return the transformation of this coordinate system
+ */
+ public AffineTransform getTransform()
+ {
+ return (AffineTransform) transform.clone();
+ }
+
+ /**
+ * Returns the current foreground.
+ *
+ * @return the current foreground
+ */
+ public Paint getPaint()
+ {
+ return paint;
+ }
+
+
+ /**
+ * Returns the current composite.
+ *
+ * @return the current composite
+ */
+ public Composite getComposite()
+ {
+ return composite;
+ }
+
+ /**
+ * Sets the current background.
+ *
+ * @param color the background to set.
+ */
+ public void setBackground(Color color)
+ {
+ background = color;
+ }
+
+ /**
+ * Returns the current background.
+ *
+ * @return the current background
+ */
+ public Color getBackground()
+ {
+ return background;
+ }
+
+ /**
+ * Returns the current stroke.
+ *
+ * @return the current stroke
+ */
+ public Stroke getStroke()
+ {
+ return stroke;
+ }
+
+ /**
+ * Intersects the clip of this graphics object with the specified clip.
+ *
+ * @param s the clip with which the current clip should be intersected
+ */
+ public void clip(Shape s)
+ {
+ // Initialize clip if not already present.
+ if (clip == null)
+ clip = s;
+
+ // This is so common, let's optimize this.
+ else if (clip instanceof Rectangle && s instanceof Rectangle)
+ {
+ Rectangle clipRect = (Rectangle) clip;
+ Rectangle r = (Rectangle) s;
+ computeIntersection(r.x, r.y, r.width, r.height, clipRect);
+ // Call setClip so that subclasses get notified.
+ setClip(clipRect);
+ }
+ else
+ {
+ Area current;
+ if (clip instanceof Area)
+ current = (Area) clip;
+ else
+ current = new Area(clip);
+
+ Area intersect;
+ if (s instanceof Area)
+ intersect = (Area) s;
+ else
+ intersect = new Area(s);
+
+ current.intersect(intersect);
+ clip = current;
+ isOptimized = false;
+ // Call setClip so that subclasses get notified.
+ setClip(clip);
+ }
+ }
+
+ public FontRenderContext getFontRenderContext()
+ {
+ //return new FontRenderContext(transform, false, false);
+ return new FontRenderContext(new AffineTransform(), false, false);
+ }
+
+ /**
+ * Draws the specified glyph vector at the specified location.
+ *
+ * @param gv the glyph vector to draw
+ * @param x the location, x coordinate
+ * @param y the location, y coordinate
+ */
+ public void drawGlyphVector(GlyphVector gv, float x, float y)
+ {
+ int numGlyphs = gv.getNumGlyphs();
+ AffineTransform t = new AffineTransform();
+ t.translate(x, y);
+
+// // TODO: We could use fill(gv.getOutline()), but that seems to be
+ // slightly more inefficient.
+ for (int i = 0; i < numGlyphs; i++)
+ {
+ //fill(gv.getGlyphVisualBounds(i));
+ GeneralPath p = new GeneralPath(gv.getGlyphOutline(i));
+ p.transform(t);
+ //Shape clipped = clipShape(p);
+ //if (clipped != null)
+ // fillShape(clipped, true);
+ // FIXME: Clipping doesn't seem to work correctly.
+ fillShape(p, true);
+ }
+ }
+
+ /**
+ * Creates a copy of this graphics object.
+ *
+ * @return a copy of this graphics object
+ */
+ public Graphics create()
+ {
+ AbstractGraphics2D copy = (AbstractGraphics2D) clone();
+ return copy;
+ }
+
+ /**
+ * Creates and returns a copy of this Graphics object. This should
+ * be overridden by subclasses if additional state must be handled when
+ * cloning. This is called by {@link #create()}.
+ *
+ * @return a copy of this Graphics object
+ */
+ protected Object clone()
+ {
+ try
+ {
+ AbstractGraphics2D copy = (AbstractGraphics2D) super.clone();
+ // Copy the clip. If it's a Rectangle, preserve that for optimization.
+ if (clip instanceof Rectangle)
+ copy.clip = new Rectangle((Rectangle) clip);
+ else
+ copy.clip = new GeneralPath(clip);
+
+ copy.renderingHints = new RenderingHints(renderingHints);
+ copy.transform = new AffineTransform(transform);
+ // The remaining state is inmmutable and doesn't need to be copied.
+ return copy;
+ }
+ catch (CloneNotSupportedException ex)
+ {
+ AWTError err = new AWTError("Unexpected exception while cloning");
+ err.initCause(ex);
+ throw err;
+ }
+ }
+
+ /**
+ * Returns the current foreground.
+ */
+ public Color getColor()
+ {
+ Color c = null;
+ if (paint instanceof Color)
+ c = (Color) paint;
+ return c;
+ }
+
+ /**
+ * Sets the current foreground.
+ *
+ * @param color the foreground to set
+ */
+ public void setColor(Color color)
+ {
+ setPaint(color);
+ }
+
+ public void setPaintMode()
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ public void setXORMode(Color color)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ /**
+ * Returns the current font.
+ *
+ * @return the current font
+ */
+ public Font getFont()
+ {
+ return font;
+ }
+
+ /**
+ * Sets the font on this graphics object. When <code>f == null</code>, the
+ * current setting is not changed.
+ *
+ * @param f the font to set
+ */
+ public void setFont(Font f)
+ {
+ if (f != null)
+ font = f;
+ }
+
+ /**
+ * Returns the font metrics for the specified font.
+ *
+ * @param font the font for which to fetch the font metrics
+ *
+ * @return the font metrics for the specified font
+ */
+ public FontMetrics getFontMetrics(Font font)
+ {
+ return Toolkit.getDefaultToolkit().getFontMetrics(font);
+ }
+
+ /**
+ * Returns the bounds of the current clip.
+ *
+ * @return the bounds of the current clip
+ */
+ public Rectangle getClipBounds()
+ {
+ Rectangle b = null;
+ if (clip != null)
+ b = clip.getBounds();
+ return b;
+ }
+
+ /**
+ * Intersects the current clipping region with the specified rectangle.
+ *
+ * @param x the x coordinate of the rectangle
+ * @param y the y coordinate of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public void clipRect(int x, int y, int width, int height)
+ {
+ clip(new Rectangle(x, y, width, height));
+ }
+
+ /**
+ * Sets the clip to the specified rectangle.
+ *
+ * @param x the x coordinate of the clip rectangle
+ * @param y the y coordinate of the clip rectangle
+ * @param width the width of the clip rectangle
+ * @param height the height of the clip rectangle
+ */
+ public void setClip(int x, int y, int width, int height)
+ {
+ setClip(new Rectangle(x, y, width, height));
+ }
+
+ /**
+ * Returns the current clip.
+ *
+ * @return the current clip
+ */
+ public Shape getClip()
+ {
+ return clip;
+ }
+
+ /**
+ * Sets the current clipping area to <code>clip</code>.
+ *
+ * @param c the clip to set
+ */
+ public void setClip(Shape c)
+ {
+ clip = c;
+ if (! (clip instanceof Rectangle))
+ isOptimized = false;
+ else
+ updateOptimization();
+ }
+
+ public void copyArea(int x, int y, int width, int height, int dx, int dy)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ /**
+ * Draws a line from (x1, y1) to (x2, y2).
+ *
+ * This implementation transforms the coordinates and forwards the call to
+ * {@link #rawDrawLine}.
+ */
+ public void drawLine(int x1, int y1, int x2, int y2)
+ {
+ if (isOptimized)
+ {
+ int tx = (int) transform.getTranslateX();
+ int ty = (int) transform.getTranslateY();
+ rawDrawLine(x1 + tx, y1 + ty, x2 + tx, y2 + ty);
+ }
+ else
+ {
+ Line2D line = new Line2D.Double(x1, y1, x2, y2);
+ draw(line);
+ }
+ }
+
+ /**
+ * Fills a rectangle with the current paint.
+ *
+ * @param x the upper left corner, X coordinate
+ * @param y the upper left corner, Y coordinate
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public void fillRect(int x, int y, int width, int height)
+ {
+ if (isOptimized)
+ {
+ int tx = (int) transform.getTranslateX();
+ int ty = (int) transform.getTranslateY();
+ rawFillRect(x + tx, y + ty, width, height);
+ }
+ else
+ {
+ fill(new Rectangle(x, y, width, height));
+ }
+ }
+
+ /**
+ * Fills a rectangle with the current background color.
+ *
+ * This implementation temporarily sets the foreground color to the
+ * background and forwards the call to {@link #fillRect(int, int, int, int)}.
+ *
+ * @param x the upper left corner, X coordinate
+ * @param y the upper left corner, Y coordinate
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public void clearRect(int x, int y, int width, int height)
+ {
+ Paint savedForeground = getPaint();
+ setPaint(getBackground());
+ //System.err.println("clearRect transform type: " + transform.getType());
+ fillRect(x, y, width, height);
+ setPaint(savedForeground);
+ }
+
+ /**
+ * Draws a rounded rectangle.
+ *
+ * @param x the x coordinate of the rectangle
+ * @param y the y coordinate of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ * @param arcWidth the width of the arcs
+ * @param arcHeight the height of the arcs
+ */
+ public void drawRoundRect(int x, int y, int width, int height, int arcWidth,
+ int arcHeight)
+ {
+ draw(new RoundRectangle2D.Double(x, y, width, height, arcWidth,
+ arcHeight));
+ }
+
+ /**
+ * Fills a rounded rectangle.
+ *
+ * @param x the x coordinate of the rectangle
+ * @param y the y coordinate of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ * @param arcWidth the width of the arcs
+ * @param arcHeight the height of the arcs
+ */
+ public void fillRoundRect(int x, int y, int width, int height, int arcWidth,
+ int arcHeight)
+ {
+ fill(new RoundRectangle2D.Double(x, y, width, height, arcWidth,
+ arcHeight));
+ }
+
+ /**
+ * Draws the outline of an oval.
+ *
+ * @param x the upper left corner of the bounding rectangle of the ellipse
+ * @param y the upper left corner of the bounding rectangle of the ellipse
+ * @param width the width of the ellipse
+ * @param height the height of the ellipse
+ */
+ public void drawOval(int x, int y, int width, int height)
+ {
+ draw(new Ellipse2D.Double(x, y, width, height));
+ }
+
+ /**
+ * Fills an oval.
+ *
+ * @param x the upper left corner of the bounding rectangle of the ellipse
+ * @param y the upper left corner of the bounding rectangle of the ellipse
+ * @param width the width of the ellipse
+ * @param height the height of the ellipse
+ */
+ public void fillOval(int x, int y, int width, int height)
+ {
+ fill(new Ellipse2D.Double(x, y, width, height));
+ }
+
+ /**
+ * Draws an arc.
+ */
+ public void drawArc(int x, int y, int width, int height, int arcStart,
+ int arcAngle)
+ {
+ draw(new Arc2D.Double(x, y, width, height, arcStart, arcAngle,
+ Arc2D.OPEN));
+ }
+
+ /**
+ * Fills an arc.
+ */
+ public void fillArc(int x, int y, int width, int height, int arcStart,
+ int arcAngle)
+ {
+ fill(new Arc2D.Double(x, y, width, height, arcStart, arcAngle,
+ Arc2D.OPEN));
+ }
+
+ public void drawPolyline(int[] xPoints, int[] yPoints, int npoints)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ /**
+ * Draws the outline of a polygon.
+ */
+ public void drawPolygon(int[] xPoints, int[] yPoints, int npoints)
+ {
+ draw(new Polygon(xPoints, yPoints, npoints));
+ }
+
+ /**
+ * Fills the outline of a polygon.
+ */
+ public void fillPolygon(int[] xPoints, int[] yPoints, int npoints)
+ {
+ fill(new Polygon(xPoints, yPoints, npoints));
+ }
+
+ public boolean drawImage(Image image, int x, int y, ImageObserver observer)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ public boolean drawImage(Image image, int x, int y, int width, int height,
+ ImageObserver observer)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ public boolean drawImage(Image image, int x, int y, Color bgcolor,
+ ImageObserver observer)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ public boolean drawImage(Image image, int x, int y, int width, int height,
+ Color bgcolor, ImageObserver observer)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2,
+ int sx1, int sy1, int sx2, int sy2,
+ ImageObserver observer)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2,
+ int sx1, int sy1, int sx2, int sy2, Color bgcolor,
+ ImageObserver observer)
+ {
+ // FIXME: Implement this.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ /**
+ * Disposes this graphics object.
+ */
+ public void dispose()
+ {
+ // Nothing special to do here.
+ }
+
+ /**
+ * Fills the specified shape. The shape has already been clipped against the
+ * current clip.
+ *
+ * @param s the shape to fill
+ * @param isFont <code>true</code> if the shape is a font outline
+ */
+ protected void fillShape(Shape s, boolean isFont)
+ {
+ // Determine if we need to antialias stuff.
+ boolean antialias = false;
+ if (isFont)
+ {
+ Object v = renderingHints.get(RenderingHints.KEY_TEXT_ANTIALIASING);
+ // We default to antialiasing on for text as long as we have no
+ // good hinting implemented.
+ antialias = (v == RenderingHints.VALUE_TEXT_ANTIALIAS_ON
+ || v == RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
+ }
+ else
+ {
+ Object v = renderingHints.get(RenderingHints.KEY_ANTIALIASING);
+ antialias = (v == RenderingHints.VALUE_ANTIALIAS_ON);
+ }
+
+ Rectangle2D userBounds = s.getBounds2D();
+ Rectangle2D deviceBounds = new Rectangle2D.Double();
+ ArrayList segs = getSegments(s, transform, deviceBounds, false);
+ Rectangle2D clipBounds = new Rectangle2D.Double();
+ ArrayList clipSegs = getSegments(clip, transform, clipBounds, true);
+ segs.addAll(clipSegs);
+ Rectangle2D inclClipBounds = new Rectangle2D.Double();
+ Rectangle2D.union(clipBounds, deviceBounds, inclClipBounds);
+ if (segs.size() > 0)
+ {
+ if (antialias)
+ fillShapeAntialias(segs, deviceBounds, userBounds);
+ else
+ rawFillShape(segs, deviceBounds, userBounds, inclClipBounds);
+ }
+ }
+
+ /**
+ * Draws one pixel in the target coordinate space. This method draws the
+ * specified pixel by getting the painting pixel for that coordinate
+ * from the paintContext and compositing the pixel with the compositeContext.
+ * The resulting pixel is then set by calling {@link #rawSetPixel}.
+ *
+ * @param x the x coordinate
+ * @param y the y coordinate
+ */
+ protected void drawPixel(int x, int y)
+ {
+ // FIXME: Implement efficient compositing.
+ if (! (paint instanceof Color))
+ {
+ int[] paintPixel = paintRaster.getPixel(x, y, pixel);
+ Color c = new Color(paintPixel[0], paintPixel[1], paintPixel[2]);
+ rawSetForeground(c);
+ }
+ rawSetPixel(x, y);
+ }
+
+ /**
+ * Draws a pixel in the target coordinate space using the specified color.
+ *
+ * @param x the x coordinate
+ * @param y the y coordinate
+ */
+ protected void rawSetPixel(int x, int y)
+ {
+ // FIXME: Provide default implementation or remove method.
+ }
+
+ /**
+ * Sets the foreground color for drawing.
+ *
+ * @param c the color to set
+ */
+ protected void rawSetForeground(Color c)
+ {
+ // Probably remove method.
+ }
+
+ protected void rawSetForeground(int r, int g, int b)
+ {
+ rawSetForeground(new Color(r, g, b));
+ }
+
+ /**
+ * Returns the color model of this Graphics object.
+ *
+ * @return the color model of this Graphics object
+ */
+ protected abstract ColorModel getColorModel();
+
+ /**
+ * Returns the bounds of the target.
+ *
+ * @return the bounds of the target
+ */
+ protected Rectangle getDeviceBounds()
+ {
+ return destinationRaster.getBounds();
+ }
+
+ /**
+ * Draws a line in optimization mode. The implementation should respect the
+ * clip but can assume that it is a rectangle.
+ *
+ * @param x0 the starting point, X coordinate
+ * @param y0 the starting point, Y coordinate
+ * @param x1 the end point, X coordinate
+ * @param y1 the end point, Y coordinate
+ */
+ protected void rawDrawLine(int x0, int y0, int x1, int y1)
+ {
+ // This is an implementation of Bresenham's line drawing algorithm.
+ int dy = y1 - y0;
+ int dx = x1 - x0;
+ int stepx, stepy;
+
+ if (dy < 0)
+ {
+ dy = -dy;
+ stepy = -1;
+ }
+ else
+ {
+ stepy = 1;
+ }
+ if (dx < 0)
+ {
+ dx = -dx;
+ stepx = -1;
+ }
+ else
+ {
+ stepx = 1;
+ }
+ dy <<= 1;
+ dx <<= 1;
+
+ drawPixel(x0, y0);
+ if (dx > dy)
+ {
+ int fraction = dy - (dx >> 1); // same as 2*dy - dx
+ while (x0 != x1)
+ {
+ if (fraction >= 0)
+ {
+ y0 += stepy;
+ fraction -= dx;
+ }
+ x0 += stepx;
+ fraction += dy;
+ drawPixel(x0, y0);
+ }
+ }
+ else
+ {
+ int fraction = dx - (dy >> 1);
+ while (y0 != y1)
+ {
+ if (fraction >= 0)
+ {
+ x0 += stepx;
+ fraction -= dy;
+ }
+ y0 += stepy;
+ fraction += dx;
+ drawPixel(x0, y0);
+ }
+ }
+ }
+
+ /**
+ * Fills a rectangle in optimization mode. The implementation should respect
+ * the clip but can assume that it is a rectangle.
+ *
+ * @param x the upper left corner, X coordinate
+ * @param y the upper left corner, Y coordinate
+ * @param w the width
+ * @param h the height
+ */
+ protected void rawFillRect(int x, int y, int w, int h)
+ {
+ int x2 = x + w;
+ int y2 = y + h;
+ for (int xc = x; xc < x2; xc++)
+ {
+ for (int yc = y; yc < y2; yc++)
+ {
+ drawPixel(xc, yc);
+ }
+ }
+ }
+
+ /**
+ * Fills the specified polygon. This should be overridden by backends
+ * that support accelerated (native) polygon filling, which is the
+ * case for most toolkit window and offscreen image implementations.
+ *
+ * The polygon is already clipped when this method is called.
+ */
+ protected void rawFillShape(ArrayList segs, Rectangle2D deviceBounds2D,
+ Rectangle2D userBounds,
+ Rectangle2D inclClipBounds)
+ {
+ // This is an implementation of a polygon scanline conversion algorithm
+ // described here:
+ // http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/scan/
+
+ // Create table of all edges.
+ // The edge buckets, sorted and indexed by their Y values.
+
+ double minX = deviceBounds2D.getMinX();
+ double minY = deviceBounds2D.getMinY();
+ double maxX = deviceBounds2D.getMaxX();
+ double maxY = deviceBounds2D.getMaxY();
+ double icMinY = inclClipBounds.getMinY();
+ double icMaxY = inclClipBounds.getMaxY();
+ Rectangle deviceBounds = new Rectangle((int) minX, (int) minY,
+ (int) Math.ceil(maxX) - (int) minX,
+ (int) Math.ceil(maxY) - (int) minY);
+ PaintContext pCtx = paint.createContext(getColorModel(), deviceBounds,
+ userBounds, transform, renderingHints);
+
+ ArrayList[] edgeTable = new ArrayList[(int) Math.ceil(icMaxY)
+ - (int) Math.ceil(icMinY) + 1];
+
+ for (Iterator i = segs.iterator(); i.hasNext();)
+ {
+ PolyEdge edge = (PolyEdge) i.next();
+ int yindex = (int) ((int) Math.ceil(edge.y0) - (int) Math.ceil(icMinY));
+ if (edgeTable[yindex] == null) // Create bucket when needed.
+ edgeTable[yindex] = new ArrayList();
+ edgeTable[yindex].add(edge); // Add edge to the bucket of its line.
+ }
+
+ // TODO: The following could be useful for a future optimization.
+// // Sort all the edges in the edge table within their buckets.
+// for (int y = 0; y < edgeTable.length; y++)
+// {
+// if (edgeTable[y] != null)
+// Collections.sort(edgeTable[y]);
+// }
+
+ // The activeEdges list contains all the edges of the current scanline
+ // ordered by their intersection points with this scanline.
+ ArrayList activeEdges = new ArrayList();
+ PolyEdgeComparator comparator = new PolyEdgeComparator();
+
+ // Scan all relevant lines.
+ int minYInt = (int) Math.ceil(icMinY);
+ for (int y = minYInt; y <= maxY; y++)
+ {
+ ArrayList bucket = edgeTable[y - minYInt];
+ // Update all the x intersections in the current activeEdges table
+ // and remove entries that are no longer in the scanline.
+ for (Iterator i = activeEdges.iterator(); i.hasNext();)
+ {
+ PolyEdge edge = (PolyEdge) i.next();
+ if (y > edge.y1)
+ i.remove();
+ else
+ {
+ edge.xIntersection += edge.slope;
+ //edge.xIntersection = edge.x0 + edge.slope * (y - edge.y0);
+ //System.err.println("edge.xIntersection: " + edge.xIntersection);
+ }
+ }
+
+ if (bucket != null)
+ activeEdges.addAll(bucket);
+
+ // Sort current edges. We are using a bubble sort, because the order
+ // of the intersections will not change in most situations. They
+ // will only change, when edges intersect each other.
+ int size = activeEdges.size();
+ if (size > 1)
+ {
+ for (int i = 1; i < size; i++)
+ {
+ PolyEdge e1 = (PolyEdge) activeEdges.get(i - 1);
+ PolyEdge e2 = (PolyEdge) activeEdges.get(i);
+ if (comparator.compare(e1, e2) > 0)
+ {
+ // Swap e2 with its left neighbor until it 'fits'.
+ int j = i;
+ do
+ {
+ activeEdges.set(j, e1);
+ activeEdges.set(j - 1, e2);
+ j--;
+ if (j >= 1)
+ e1 = (PolyEdge) activeEdges.get(j - 1);
+ } while (j >= 1 && comparator.compare(e1, e2) > 0);
+ }
+ }
+ }
+
+ // Now draw all pixels inside the polygon.
+ // This is the last edge that intersected the scanline.
+ PolyEdge previous = null; // Gets initialized below.
+ boolean insideShape = false;
+ boolean insideClip = false;
+ //System.err.println("scanline: " + y);
+ for (Iterator i = activeEdges.iterator(); i.hasNext();)
+ {
+ PolyEdge edge = (PolyEdge) i.next();
+ if (edge.y1 <= y)
+ continue;
+
+ // Draw scanline when we are inside the shape AND inside the
+ // clip.
+ if (insideClip && insideShape)
+ {
+ int x0 = (int) previous.xIntersection;
+ int x1 = (int) edge.xIntersection;
+ if (x0 < x1)
+ fillScanline(pCtx, x0, x1, y);
+ }
+ // Update state.
+ if (edge.y1 > y)
+ {
+ previous = edge;
+ if (edge.isClip)
+ insideClip = ! insideClip;
+ else
+ insideShape = ! insideShape;
+ }
+ }
+ }
+ pCtx.dispose();
+ }
+
+ /**
+ * Paints a scanline between x0 and x1.
+ *
+ * @param x0 the left offset
+ * @param x1 the right offset
+ * @param y the scanline
+ */
+ protected void fillScanline(PaintContext pCtx, int x0, int x1, int y)
+ {
+ Raster paintRaster = pCtx.getRaster(x0, y, x1 - x0, 1);
+ ColorModel paintColorModel = pCtx.getColorModel();
+ CompositeContext cCtx = composite.createContext(paintColorModel,
+ getColorModel(),
+ renderingHints);
+ cCtx.compose(paintRaster, destinationRaster, destinationRaster);
+ updateRaster(destinationRaster, x0, y, x1 - x0, 1);
+ cCtx.dispose();
+ }
+
+ /**
+ * Fills arbitrary shapes in an anti-aliased fashion.
+ *
+ * @param segs the line segments which define the shape which is to be filled
+ */
+ private void fillShapeAntialias(ArrayList segs, Rectangle2D deviceBounds2D,
+ Rectangle2D userBounds)
+ {
+ // This is an implementation of a polygon scanline conversion algorithm
+ // described here:
+ // http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/scan/
+ // The antialiasing is implemented using a sampling technique, we do
+ // not scan whole lines but fractions of the line.
+
+ double minX = deviceBounds2D.getMinX();
+ double minY = deviceBounds2D.getMinY();
+ double maxX = deviceBounds2D.getMaxX();
+ double maxY = deviceBounds2D.getMaxY();
+
+ Rectangle deviceBounds = new Rectangle((int) minX, (int) minY,
+ (int) Math.ceil(maxX) - (int) minX,
+ (int) Math.ceil(maxY) - (int) minY);
+ PaintContext pCtx = paint.createContext(getColorModel(), deviceBounds,
+ userBounds, transform,
+ renderingHints);
+
+ // This array will contain the oversampled transparency values for
+ // each pixel in the scanline.
+ int numScanlines = (int) Math.ceil(maxY) - (int) minY;
+ int numScanlinePixels = (int) Math.ceil(maxX) - (int) minX + 1;
+ if (alpha == null || alpha.length < (numScanlinePixels + 1))
+ alpha = new int[numScanlinePixels + 1];
+
+ int firstLine = (int) minY;
+ //System.err.println("minY: " + minY);
+ int firstSubline = (int) (Math.ceil((minY - Math.floor(minY)) * AA_SAMPLING));
+ double firstLineDouble = firstLine + firstSubline / (double) AA_SAMPLING;
+ //System.err.println("firstSubline: " + firstSubline);
+
+ // Create table of all edges.
+ // The edge buckets, sorted and indexed by their Y values.
+ //System.err.println("numScanlines: " + numScanlines);
+ if (edgeTable == null
+ || edgeTable.length < numScanlines * AA_SAMPLING + AA_SAMPLING)
+ edgeTable = new ArrayList[numScanlines * AA_SAMPLING + AA_SAMPLING];
+
+ //System.err.println("firstLineDouble: " + firstLineDouble);
+
+ for (Iterator i = segs.iterator(); i.hasNext();)
+ {
+ PolyEdge edge = (PolyEdge) i.next();
+ int yindex = (int) (Math.ceil((edge.y0 - firstLineDouble) * AA_SAMPLING));
+ //System.err.println("yindex: " + yindex + " for y0: " + edge.y0);
+ // Initialize edge's slope and initial xIntersection.
+ edge.slope = ((edge.x1 - edge.x0) / (edge.y1 - edge.y0)) / AA_SAMPLING;
+ if (edge.y0 == edge.y1) // Horizontal edge.
+ edge.xIntersection = Math.min(edge.x0, edge.x1);
+ else
+ {
+ double alignedFirst = Math.ceil(edge.y0 * AA_SAMPLING) / AA_SAMPLING;
+ edge.xIntersection = edge.x0 + (edge.slope * AA_SAMPLING) * (alignedFirst - edge.y0);
+ }
+ //System.err.println(edge);
+ // FIXME: Sanity check should not be needed when clipping works.
+ if (yindex >= 0 && yindex < edgeTable.length)
+ {
+ if (edgeTable[yindex] == null) // Create bucket when needed.
+ edgeTable[yindex] = new ArrayList();
+ edgeTable[yindex].add(edge); // Add edge to the bucket of its line.
+ }
+ }
+
+ // The activeEdges list contains all the edges of the current scanline
+ // ordered by their intersection points with this scanline.
+ ArrayList activeEdges = new ArrayList();
+ PolyEdgeComparator comparator = new PolyEdgeComparator();
+
+ // Scan all lines.
+ int yindex = 0;
+ //System.err.println("firstLine: " + firstLine + ", maxY: " + maxY + ", firstSubline: " + firstSubline);
+ for (int y = firstLine; y <= maxY; y++)
+ {
+ for (int subY = firstSubline; subY < AA_SAMPLING; subY++)
+ {
+ //System.err.println("scanline: " + y + ", subScanline: " + subY);
+ ArrayList bucket = edgeTable[yindex];
+ // Update all the x intersections in the current activeEdges table
+ // and remove entries that are no longer in the scanline.
+ for (Iterator i = activeEdges.iterator(); i.hasNext();)
+ {
+ PolyEdge edge = (PolyEdge) i.next();
+ // TODO: Do the following using integer arithmetics.
+ if ((y + ((double) subY / (double) AA_SAMPLING)) > edge.y1)
+ i.remove();
+ else
+ {
+ edge.xIntersection += edge.slope;
+ //System.err.println("edge: " + edge);
+ //edge.xIntersection = edge.x0 + edge.slope * (y - edge.y0);
+ //System.err.println("edge.xIntersection: " + edge.xIntersection);
+ }
+ }
+
+ if (bucket != null)
+ {
+ activeEdges.addAll(bucket);
+ edgeTable[yindex].clear();
+ }
+
+ // Sort current edges. We are using a bubble sort, because the order
+ // of the intersections will not change in most situations. They
+ // will only change, when edges intersect each other.
+ int size = activeEdges.size();
+ if (size > 1)
+ {
+ for (int i = 1; i < size; i++)
+ {
+ PolyEdge e1 = (PolyEdge) activeEdges.get(i - 1);
+ PolyEdge e2 = (PolyEdge) activeEdges.get(i);
+ if (comparator.compare(e1, e2) > 0)
+ {
+ // Swap e2 with its left neighbor until it 'fits'.
+ int j = i;
+ do
+ {
+ activeEdges.set(j, e1);
+ activeEdges.set(j - 1, e2);
+ j--;
+ if (j >= 1)
+ e1 = (PolyEdge) activeEdges.get(j - 1);
+ } while (j >= 1 && comparator.compare(e1, e2) > 0);
+ }
+ }
+ }
+
+ // Now draw all pixels inside the polygon.
+ // This is the last edge that intersected the scanline.
+ PolyEdge previous = null; // Gets initialized below.
+ boolean active = false;
+ //System.err.println("scanline: " + y + ", subscanline: " + subY);
+ for (Iterator i = activeEdges.iterator(); i.hasNext();)
+ {
+ PolyEdge edge = (PolyEdge) i.next();
+ // Only fill scanline, if the current edge actually intersects
+ // the scanline. There may be edges that lie completely
+ // within the current scanline.
+ //System.err.println("previous: " + previous);
+ //System.err.println("edge: " + edge);
+ if (active)
+ {
+ // TODO: Use integer arithmetics here.
+ if (edge.y1 > (y + (subY / (double) AA_SAMPLING)))
+ {
+ //System.err.println(edge);
+ // TODO: Eliminate the aligments.
+ int x0 = (int) Math.min(Math.max(previous.xIntersection, minX), maxX);
+ int x1 = (int) Math.min(Math.max(edge.xIntersection, minX), maxX);
+ //System.err.println("minX: " + minX + ", x0: " + x0 + ", x1: " + x1 + ", maxX: " + maxX);
+ // TODO: Pull out cast.
+ alpha[x0 - (int) minX]++;
+ alpha[x1 - (int) minX + 1]--;
+ previous = edge;
+ active = false;
+ }
+ }
+ else
+ {
+ // TODO: Use integer arithmetics here.
+ if (edge.y1 > (y + (subY / (double) AA_SAMPLING)))
+ {
+ //System.err.println(edge);
+ previous = edge;
+ active = true;
+ }
+ }
+ }
+ yindex++;
+ }
+ firstSubline = 0;
+ // Render full scanline.
+ //System.err.println("scanline: " + y);
+ fillScanlineAA(alpha, (int) minX, (int) y, numScanlinePixels, pCtx);
+ }
+ if (paint instanceof Color && composite == AlphaComposite.SrcOver)
+ rawSetForeground((Color) paint);
+
+ pCtx.dispose();
+ }
+
+ /**
+ * Fills a horizontal line between x0 and x1 for anti aliased rendering.
+ * the alpha array contains the deltas of the alpha values from one pixel
+ * to the next.
+ *
+ * @param alpha the alpha values in the scanline
+ * @param x0 the beginning of the scanline
+ * @param y the y coordinate of the line
+ */
+ private void fillScanlineAA(int[] alpha, int x0, int y, int numScanlinePixels,
+ PaintContext pCtx)
+ {
+ // FIXME: This doesn't work. Fixit.
+ CompositeContext cCtx = composite.createContext(pCtx.getColorModel(),
+ getColorModel(),
+ renderingHints);
+ Raster paintRaster = pCtx.getRaster(x0, y, numScanlinePixels, 1);
+ System.err.println("paintColorModel: " + pCtx.getColorModel());
+ WritableRaster aaRaster = paintRaster.createCompatibleWritableRaster();
+ int numBands = paintRaster.getNumBands();
+ int[] pixels = new int[numScanlinePixels + paintRaster.getNumBands()];
+ pixels = paintRaster.getPixels(x0, y, numScanlinePixels, 1, pixels);
+ ColorModel cm = pCtx.getColorModel();
+
+ double lastAlpha = 0.;
+ int lastAlphaInt = 0;
+ int[] components = new int[4];
+
+ for (int i = 0; i < pixels.length; i++)
+ {
+ if (alpha[i] != 0)
+ {
+ lastAlphaInt += alpha[i];
+ lastAlpha = lastAlphaInt / AA_SAMPLING;
+ }
+ components = cm.getComponents(pixel[i], components, 0);
+ components[0] = (int) (components[0] * lastAlpha);
+ pixel[i] = cm.getDataElement(components, 0);
+ }
+
+ aaRaster.setPixels(0, 0, numScanlinePixels, 1, pixels);
+ cCtx.compose(aaRaster, destinationRaster, destinationRaster);
+ updateRaster(destinationRaster, x0, y, numScanlinePixels, 1);
+
+ cCtx.dispose();
+ }
+
+
+ /**
+ * Initializes this graphics object. This must be called by subclasses in
+ * order to correctly initialize the state of this object.
+ */
+ protected void init()
+ {
+ setPaint(Color.BLACK);
+ setFont(new Font("SansSerif", Font.PLAIN, 12));
+ isOptimized = true;
+
+ // FIXME: Should not be necessary. A clip of null should mean
+ // 'clip against device bounds.
+ clip = getDeviceBounds();
+ destinationRaster = getDestinationRaster();
+ }
+
+ /**
+ * Returns a WritableRaster that is used by this class to perform the
+ * rendering in. It is not necessary that the target surface immediately
+ * reflects changes in the raster. Updates to the raster are notified via
+ * {@link #updateRaster}.
+ *
+ * @return the destination raster
+ */
+ protected abstract WritableRaster getDestinationRaster();
+
+ /**
+ * Notifies the backend that the raster has changed in the specified
+ * rectangular area. The raster that is provided in this method is always
+ * the same as the one returned in {@link #getDestinationRaster}.
+ * Backends that reflect changes to this raster directly don't need to do
+ * anything here.
+ *
+ * @param raster the updated raster, identical to the raster returned
+ * by {@link #getDestinationRaster()}
+ * @param x the upper left corner of the updated region, X coordinate
+ * @param y the upper lef corner of the updated region, Y coordinate
+ * @param w the width of the updated region
+ * @param h the height of the updated region
+ */
+ protected void updateRaster(Raster raster, int x, int y, int w, int h)
+ {
+ // Nothing to do here. Backends that need to update their surface
+ // to reflect the change should override this method.
+ }
+
+ // Some helper methods.
+
+ /**
+ * Helper method to check and update the optimization conditions.
+ */
+ private void updateOptimization()
+ {
+ int transformType = transform.getType();
+ boolean optimizedTransform = false;
+ if (transformType == AffineTransform.TYPE_IDENTITY
+ || transformType == AffineTransform.TYPE_TRANSLATION)
+ optimizedTransform = true;
+
+ boolean optimizedClip = (clip == null || clip instanceof Rectangle);
+ isOptimized = optimizedClip
+ && optimizedTransform && paint instanceof Color
+ && composite == AlphaComposite.SrcOver
+ && stroke.equals(new BasicStroke());
+ }
+
+ /**
+ * Calculates the intersection of two rectangles. The result is stored
+ * in <code>rect</code>. This is basically the same
+ * like {@link Rectangle#intersection(Rectangle)}, only that it does not
+ * create new Rectangle instances. The tradeoff is that you loose any data in
+ * <code>rect</code>.
+ *
+ * @param x upper-left x coodinate of first rectangle
+ * @param y upper-left y coodinate of first rectangle
+ * @param w width of first rectangle
+ * @param h height of first rectangle
+ * @param rect a Rectangle object of the second rectangle
+ *
+ * @throws NullPointerException if rect is null
+ *
+ * @return a rectangle corresponding to the intersection of the
+ * two rectangles. An empty rectangle is returned if the rectangles
+ * do not overlap
+ */
+ private static Rectangle computeIntersection(int x, int y, int w, int h,
+ Rectangle rect)
+ {
+ int x2 = (int) rect.x;
+ int y2 = (int) rect.y;
+ int w2 = (int) rect.width;
+ int h2 = (int) rect.height;
+
+ int dx = (x > x2) ? x : x2;
+ int dy = (y > y2) ? y : y2;
+ int dw = (x + w < x2 + w2) ? (x + w - dx) : (x2 + w2 - dx);
+ int dh = (y + h < y2 + h2) ? (y + h - dy) : (y2 + h2 - dy);
+
+ if (dw >= 0 && dh >= 0)
+ rect.setBounds(dx, dy, dw, dh);
+ else
+ rect.setBounds(0, 0, 0, 0);
+
+ return rect;
+ }
+
+ /**
+ * Helper method to transform the clip. This is called by the various
+ * transformation-manipulation methods to update the clip (which is in
+ * userspace) accordingly.
+ *
+ * The transform usually is the inverse transform that was applied to the
+ * graphics object.
+ *
+ * @param t the transform to apply to the clip
+ */
+ private void updateClip(AffineTransform t)
+ {
+ if (! (clip instanceof GeneralPath))
+ clip = new GeneralPath(clip);
+
+ GeneralPath p = (GeneralPath) clip;
+ p.transform(t);
+ }
+
+ /**
+ * Converts the specified shape into a list of segments.
+ *
+ * @param s the shape to convert
+ * @param t the transformation to apply before converting
+ * @param deviceBounds an output parameter; holds the bounding rectangle of
+ * s in device space after return
+ * @param isClip true when the shape is a clip, false for normal shapes;
+ * this influences the settings in the created PolyEdge instances.
+ *
+ * @return a list of PolyEdge that form the shape in device space
+ */
+ private ArrayList getSegments(Shape s, AffineTransform t,
+ Rectangle2D deviceBounds, boolean isClip)
+ {
+ // Flatten the path. TODO: Determine the best flattening factor
+ // wrt to speed and quality.
+ PathIterator path = s.getPathIterator(getTransform(), 1.0);
+
+ // Build up polygons and let the native backend render this using
+ // rawFillShape() which would provide a default implementation for
+ // drawPixel using a PolyScan algorithm.
+ double[] seg = new double[6];
+
+ // TODO: Use ArrayList<PolyEdge> here when availble.
+ ArrayList segs = new ArrayList();
+ double segX = 0.; // The start point of the current edge.
+ double segY = 0.;
+ double polyX = 0.; // The start point of the current polygon.
+ double polyY = 0.;
+
+ double minX = Integer.MAX_VALUE;
+ double maxX = Integer.MIN_VALUE;
+ double minY = Integer.MAX_VALUE;
+ double maxY = Integer.MIN_VALUE;
+
+ //System.err.println("fill polygon");
+ while (! path.isDone())
+ {
+ int segType = path.currentSegment(seg);
+ minX = Math.min(minX, seg[0]);
+ maxX = Math.max(maxX, seg[0]);
+ minY = Math.min(minY, seg[1]);
+ maxY = Math.max(maxY, seg[1]);
+
+ //System.err.println("segment: " + segType + ", " + seg[0] + ", " + seg[1]);
+ if (segType == PathIterator.SEG_MOVETO)
+ {
+ segX = seg[0];
+ segY = seg[1];
+ polyX = seg[0];
+ polyY = seg[1];
+ }
+ else if (segType == PathIterator.SEG_CLOSE)
+ {
+ // Close the polyline.
+ PolyEdge edge = new PolyEdge(segX, segY, polyX, polyY, isClip);
+ segs.add(edge);
+ }
+ else if (segType == PathIterator.SEG_LINETO)
+ {
+ PolyEdge edge = new PolyEdge(segX, segY, seg[0], seg[1], isClip);
+ segs.add(edge);
+ segX = seg[0];
+ segY = seg[1];
+ }
+ path.next();
+ }
+ deviceBounds.setRect(minX, minY, maxX - minX, maxY - minY);
+ return segs;
+ }
+}
diff --git a/gnu/java/awt/java2d/AlphaCompositeContext.java b/gnu/java/awt/java2d/AlphaCompositeContext.java
new file mode 100644
index 000000000..e67c92148
--- /dev/null
+++ b/gnu/java/awt/java2d/AlphaCompositeContext.java
@@ -0,0 +1,316 @@
+/* AlphaCompositeContext.java -- CompositeContext impl for AlphaComposite
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.java2d;
+
+import java.awt.AWTError;
+import java.awt.AlphaComposite;
+import java.awt.CompositeContext;
+import java.awt.image.ColorModel;
+import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
+
+/**
+ * A CompositeContext implementation for {@link AlphaComposite}.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class AlphaCompositeContext
+ implements CompositeContext
+{
+
+ /**
+ * The Composite object for which we perform compositing.
+ */
+ private AlphaComposite composite;
+
+ /**
+ * The source color model.
+ */
+ private ColorModel srcColorModel;
+
+ /**
+ * The destination color model.
+ */
+ private ColorModel dstColorModel;
+
+ /**
+ * The blending factor for the source.
+ */
+ private float fs;
+
+ /**
+ * The blending factor for the destination.
+ */
+ private float fd;
+
+ /**
+ * Creates a new AlphaCompositeContext.
+ *
+ * @param aComp the AlphaComposite object
+ * @param srcCM the source color model
+ * @param dstCM the destination color model
+ */
+ public AlphaCompositeContext(AlphaComposite aComp, ColorModel srcCM,
+ ColorModel dstCM)
+ {
+ composite = aComp;
+ srcColorModel = srcCM;
+ dstColorModel = dstCM;
+
+
+ // Determine the blending factors according to the rule in the
+ // AlphaComposite. For some rules the factors must be determined
+ // dynamically because they depend on the actual pixel value.
+ switch (composite.getRule())
+ {
+ case AlphaComposite.CLEAR:
+ fs = 0.F;
+ fd= 0.F;
+ break;
+ case AlphaComposite.DST:
+ fs = 0.F;
+ fd= 1.F;
+ break;
+ case AlphaComposite.DST_ATOP:
+ fs = 1.F; // Determined later as 1 - alpha_dst;
+ fd = 1.F; // Determined later as alpha_src;
+ break;
+ case AlphaComposite.DST_IN:
+ fs = 0.F;
+ fd = 0.F; // Determined later as alpha_src;
+ break;
+ case AlphaComposite.DST_OUT:
+ fs = 0.F;
+ fd = 0.F; // Determined later as 1 - alpha_src;
+ break;
+ case AlphaComposite.DST_OVER:
+ fs = 1.F; // Determined later as 1 - alpha_dst.
+ fd= 1.F;
+ break;
+ case AlphaComposite.SRC:
+ fs = 1.F;
+ fd= 0.F;
+ break;
+ case AlphaComposite.SRC_ATOP:
+ fs = 1.F; // Determined later as alpha_dst;
+ fd = 1.F; // Determined later as 1 - alpha_src;
+ break;
+ case AlphaComposite.SRC_IN:
+ fs = 0.F; // Determined later as alpha_dst;
+ fd = 0.F;
+ break;
+ case AlphaComposite.SRC_OUT:
+ fs = 0.F; // Determined later as 1 - alpha_dst;
+ fd = 0.F;
+ break;
+ case AlphaComposite.SRC_OVER:
+ fs = 1.F;
+ fd= 1.F; // Determined later as 1 - alpha_src.
+ break;
+ case AlphaComposite.XOR:
+ fs = 1.F; // Determined later as 1 - alpha_dst.
+ fd= 1.F; // Determined later as 1 - alpha_src.
+ break;
+ default:
+ throw new AWTError("Illegal AlphaComposite rule");
+ }
+
+ }
+
+ /**
+ * Releases all resources held by this composite object.
+ */
+ public void dispose()
+ {
+ // Nothing to do here yet.
+ }
+
+ /**
+ * Performs compositing according to the rules specified in the
+ * AlphaComposite from the constructor.
+ */
+ public void compose(Raster src, Raster dstIn, WritableRaster dstOut)
+ {
+
+ // TODO: This implementation is very general and highly inefficient. There
+ // are two possible ways to optimize this:
+ // 1. Special cased implementations for common ColorModels and transfer
+ // types.
+ // 2. Native implementation.
+
+ int x0 = src.getMinX();
+ int y0 = src.getMinY();
+ int width = src.getWidth();
+ int height = src.getHeight();
+ int x1 = x0 + width;
+ int y1 = y0 + height;
+
+ Object srcPixel = null;
+ Object dstPixel = null;
+
+ // Prepare the array that holds the color and alpha components of the
+ // source pixels.
+ float[] srcComponents;
+ int srcComponentsLength = srcColorModel.getNumComponents();
+ if (! srcColorModel.hasAlpha())
+ srcComponentsLength += 1;
+ srcComponents = new float[srcComponentsLength];
+
+ // Prepare the array that holds the color and alpha components of the
+ // destination pixels.
+ float[] dstComponents;
+ int dstComponentsLength = dstColorModel.getNumComponents();
+ if (! dstColorModel.hasAlpha())
+ dstComponentsLength += 1;
+ dstComponents = new float[dstComponentsLength];
+
+ if (srcComponentsLength != dstComponentsLength)
+ throw new AWTError("The color models of the source and destination have"
+ + "incompatible number of color components");
+
+ int srcTransferType = srcColorModel.getTransferType();
+ int dstTransferType = dstColorModel.getTransferType();
+
+ for (int y = y0; y < y1; y++)
+ {
+ for (int x = x0; x < x1; x++)
+ {
+ // Fetch source pixel.
+ srcPixel = src.getDataElements(x, y, (int[]) srcPixel);
+ // Fetch destination pixel.
+ dstPixel = dstIn.getDataElements(x, y, dstPixel);
+ // Get normalized components. This is the only type that is
+ // guaranteed to be supported by all ColorModels.
+ srcComponents =
+ srcColorModel.getNormalizedComponents(srcPixel, srcComponents, 0);
+ if (! srcColorModel.hasAlpha())
+ srcComponents[srcComponentsLength - 1] = 1.0F;
+ dstComponents =
+ dstColorModel.getNormalizedComponents(dstPixel, dstComponents, 0);
+ if (! dstColorModel.hasAlpha())
+ dstComponents[dstComponentsLength - 1] = 1.0F;
+
+ // Prepare the input.
+ float compositeAlpha = composite.getAlpha();
+ srcComponents[srcComponentsLength - 1] *= compositeAlpha;
+ if (srcColorModel.isAlphaPremultiplied())
+ {
+ for (int i = srcComponentsLength - 2; i >= 0; i--)
+ srcComponents[i] *= compositeAlpha;
+ }
+ else
+ {
+ for (int i = srcComponentsLength - 1; i >= 0; i--)
+ srcComponents[i] *= srcComponents[srcComponentsLength - 1];
+ }
+ if (! dstColorModel.isAlphaPremultiplied())
+ {
+ for (int i = dstComponentsLength - 2; i >= 0; i--)
+ dstComponents[i] *= dstComponents[dstComponents.length - 1];
+ }
+
+ // Determine the blending factors according to the rule in the
+ // AlphaComposite. For some rules the factors must be determined
+ // dynamically because they depend on the actual pixel value.
+ float srcAlpha = srcComponents[srcComponentsLength - 1];
+ float dstAlpha = dstComponents[dstComponentsLength - 1];
+ switch (composite.getRule())
+ {
+ case AlphaComposite.DST_ATOP:
+ fs = 1.F - dstAlpha;
+ fd = srcAlpha;
+ break;
+ case AlphaComposite.DST_IN:
+ fd = srcAlpha;
+ break;
+ case AlphaComposite.DST_OUT:
+ fd = 1.F - srcAlpha;
+ break;
+ case AlphaComposite.DST_OVER:
+ fs = 1.F - dstAlpha;
+ break;
+ case AlphaComposite.SRC_ATOP:
+ fs = srcAlpha;
+ fd = 1.F - srcAlpha;
+ break;
+ case AlphaComposite.SRC_IN:
+ fs = dstAlpha;
+ break;
+ case AlphaComposite.SRC_OUT:
+ fs = 1.F - dstAlpha;
+ break;
+ case AlphaComposite.SRC_OVER:
+ fd= 1.F - srcAlpha;
+ break;
+ case AlphaComposite.XOR:
+ fs = 1.F - dstAlpha;
+ fd= 1.F - srcAlpha;
+ break;
+ default:
+ // For the other cases the factors have already been determined
+ // in the constructor.
+ }
+
+ // Apply the blending equation to the pixels.
+ for (int i = 0; i < srcComponentsLength; i++)
+ {
+ dstComponents[i] = srcComponents[i] * fs
+ + dstComponents[i] * fd;
+ }
+
+ // Convert the result back when the destination is not
+ // alpha-premultiplied.
+ dstAlpha = dstComponents[dstComponentsLength - 1];
+ if (!dstColorModel.isAlphaPremultiplied() && dstAlpha != 0.F)
+ {
+ for (int i = 0; i < dstComponentsLength - 1; i++)
+ {
+ dstComponents[i] = dstComponents[i] / dstAlpha;
+ }
+ }
+
+ // Store the result in the destination raster.
+ dstPixel = dstColorModel.getDataElements(dstComponents, 0,
+ dstPixel);
+ dstOut.setDataElements(x, y, dstPixel);
+ } // End X loop.
+ } // End Y loop.
+ }
+
+}
diff --git a/gnu/java/awt/java2d/CubicSegment.java b/gnu/java/awt/java2d/CubicSegment.java
new file mode 100644
index 000000000..1e568f722
--- /dev/null
+++ b/gnu/java/awt/java2d/CubicSegment.java
@@ -0,0 +1,128 @@
+/* CubicSegment.java -- Cubic segment used for BasicStroke
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.java2d;
+
+
+import java.awt.geom.Point2D;
+
+/**
+ * Cubic Bezier curve segment
+ */
+public class CubicSegment extends Segment
+{
+ public Point2D cp1; // control points
+ public Point2D cp2; // control points
+
+ /**
+ * Constructor - takes coordinates of the starting point,
+ * first control point, second control point and end point,
+ * respecively.
+ */
+ public CubicSegment(double x1, double y1, double c1x, double c1y,
+ double c2x, double c2y, double x2, double y2)
+ {
+ super();
+ P1 = new Point2D.Double(x1, y1);
+ P2 = new Point2D.Double(x2, y2);
+ cp1 = new Point2D.Double(c1x, c1y);
+ cp2 = new Point2D.Double(c2x, c2y);
+ }
+
+ public CubicSegment(Point2D p1, Point2D cp1, Point2D cp2, Point2D p2)
+ {
+ super();
+ P1 = p1;
+ P2 = p2;
+ this.cp1 = cp1;
+ this.cp2 = cp2;
+ }
+
+ /**
+ * Clones this segment
+ */
+ public Object clone()
+ {
+ return new CubicSegment(P1.getX(), P1.getY(), cp1.getX(), cp1.getY(),
+ cp2.getX(), cp2.getY(), P2.getX(), P2.getY());
+ }
+
+ /**
+ * Get the "top" and "bottom" segments of this segment.
+ * First array element is p0 + normal, second is p0 - normal.
+ */
+ public Segment[] getDisplacedSegments(double radius)
+ {
+ this.radius = radius;
+ double x0 = P1.getX();
+ double y0 = P1.getY();
+ double x1 = cp1.getX();
+ double y1 = cp1.getY();
+ double x2 = cp2.getX();
+ double y2 = cp2.getY();
+ double x3 = P2.getX();
+ double y3 = P2.getY();
+ double[] p1 = normal(x0, y0, x1, y1);
+ double[] p2 = normal(x2, y2, x3, y3);
+
+
+ // FIXME: Doesn't compile.
+ // return new Segment[]{s1, s2};
+ return new Segment[0];
+ }
+
+ public void reverse()
+ {
+ Point2D temp = P1;
+ P1 = P2;
+ P2 = temp;
+ temp = cp1;
+ cp1 = cp2;
+ cp2 = temp;
+ }
+
+ public double[] first()
+ {
+ return new double[]{cp1.getX(), cp1.getY()};
+ }
+
+ public double[] last()
+ {
+ return new double[]{cp2.getX(), cp2.getY()};
+ }
+} // class CubicSegment
diff --git a/gnu/java/awt/java2d/LineSegment.java b/gnu/java/awt/java2d/LineSegment.java
new file mode 100644
index 000000000..9c0bcc7ea
--- /dev/null
+++ b/gnu/java/awt/java2d/LineSegment.java
@@ -0,0 +1,103 @@
+/* LineSegment.java -- Line segment used for BasicStroke
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.java2d;
+
+
+import java.awt.geom.Point2D;
+
+public class LineSegment extends Segment
+{
+ public LineSegment(double x1, double y1, double x2, double y2)
+ {
+ super();
+ P1 = new Point2D.Double(x1, y1);
+ P2 = new Point2D.Double(x2, y2);
+ }
+
+ public LineSegment(Point2D p1, Point2D p2)
+ {
+ super();
+ P1 = (Point2D) p1.clone();
+ P2 = (Point2D) p2.clone();
+ }
+
+ /**
+ * Clones this segment
+ */
+ public Object clone()
+ {
+ return new LineSegment(P1, P2);
+ }
+
+ /**
+ * Get the "top" and "bottom" segments of this segment.
+ * First array element is p0 + normal, second is p0 - normal.
+ */
+ public Segment[] getDisplacedSegments(double radius)
+ {
+ this.radius = radius;
+ double x0 = P1.getX();
+ double y0 = P1.getY();
+ double x1 = P2.getX();
+ double y1 = P2.getY();
+ double[] p = normal(x0, y0, x1, y1);
+ Segment s1 = (new LineSegment(x0 + p[0], y0 + p[1],
+ x1 + p[0], y1 + p[1] ));
+ Segment s2 = (new LineSegment(x0 - p[0], y0 - p[1],
+ x1 - p[0], y1 - p[1] ));
+ return new Segment[]{s1, s2};
+ }
+
+ public void reverse()
+ {
+ Point2D p = P1;
+ P1 = P2;
+ P2 = p;
+ }
+
+ public double[] first()
+ {
+ return new double[]{P2.getX(), P2.getY()};
+ }
+
+ public double[] last()
+ {
+ return new double[]{P1.getX(), P1.getY()};
+ }
+} // class LineSegment
diff --git a/gnu/java/awt/java2d/PolyEdge.java b/gnu/java/awt/java2d/PolyEdge.java
new file mode 100644
index 000000000..8dbdbabcb
--- /dev/null
+++ b/gnu/java/awt/java2d/PolyEdge.java
@@ -0,0 +1,123 @@
+/* PolyEdge.java -- An edge in a polygon, used for polygon filling
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.java2d;
+
+/**
+ * An edge in a polygon. This is used by the scanline conversion algorithm
+ * implemented in {@link AbstractGraphics2D#rawFillShape}.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class PolyEdge
+ implements Comparable
+{
+
+ /**
+ * The start and end coordinates of the edge. y0 is always smaller or equal
+ * than y1.
+ */
+ public double x0, y0, x1, y1;
+
+ /**
+ * The slope of the edge. This is dx / dy.
+ */
+ double slope;
+
+ /**
+ * The intersection of this edge with the current scanline.
+ */
+ double xIntersection;
+
+ /**
+ * Indicates whether this edge is from the clip or from the target shape.
+ */
+ boolean isClip;
+
+ /**
+ * Creates a new PolyEdge with the specified coordinates.
+ *
+ * @param x0 the starting point, x coordinate
+ * @param y0 the starting point, y coordinate
+ * @param x1 the end point, x coordinate
+ * @param y1 the end point, y coordinate
+ */
+ PolyEdge(double x0, double y0, double x1, double y1, boolean clip)
+ {
+ isClip = clip;
+ if (y0 < y1)
+ {
+ this.x0 = x0;
+ this.y0 = y0;
+ this.x1 = x1;
+ this.y1 = y1;
+ }
+ else
+ {
+ this.x0 = x1;
+ this.y0 = y1;
+ this.x1 = x0;
+ this.y1 = y0;
+ }
+ slope = (this.x1 - this.x0) / (this.y1 - this.y0);
+ if (this.y0 == this.y1) // Horizontal edge.
+ xIntersection = Math.min(this.x0, this.x1);
+ else
+ xIntersection = this.x0 + slope * (Math.ceil(this.y0) - this.y0);
+ }
+
+ /**
+ * Sorts PolyEdges by the x coordinate from the minimum x value.
+ */
+ public int compareTo(Object o)
+ {
+ PolyEdge other = (PolyEdge) o;
+ int comp = 0;
+ if (x0 < other.x0)
+ comp = -1;
+ else if (x0 > other.x0)
+ comp = 1;
+ return comp;
+ }
+
+ public String toString()
+ {
+ return "Edge: " + x0 + ", " + y0 + ", " + x1 + ", " + y1 + ", slope: "
+ + slope + ", xIntersection: " + xIntersection;
+ }
+}
diff --git a/gnu/java/awt/java2d/PolyEdgeComparator.java b/gnu/java/awt/java2d/PolyEdgeComparator.java
new file mode 100644
index 000000000..6706f2294
--- /dev/null
+++ b/gnu/java/awt/java2d/PolyEdgeComparator.java
@@ -0,0 +1,70 @@
+/* PolyEdgeComparator.java -- Sorts PolyEdges by their current intersection
+ points
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.java2d;
+
+import java.util.Comparator;
+
+/**
+ * Sorts {@link PolyEdge}s by their current intersection points.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class PolyEdgeComparator
+ implements Comparator
+{
+
+ /**
+ * The current scanline.
+ */
+ int y;
+
+ public int compare(Object o1, Object o2)
+ {
+ PolyEdge edge1 = (PolyEdge) o1;
+ PolyEdge edge2 = (PolyEdge) o2;
+ int comp = 0;
+ if (edge1.xIntersection < edge2.xIntersection)
+ comp = -1;
+ else if (edge1.xIntersection > edge2.xIntersection)
+ comp = 1;
+ return comp;
+ }
+
+}
diff --git a/gnu/java/awt/java2d/QuadSegment.java b/gnu/java/awt/java2d/QuadSegment.java
new file mode 100644
index 000000000..9c15a8cfd
--- /dev/null
+++ b/gnu/java/awt/java2d/QuadSegment.java
@@ -0,0 +1,213 @@
+/* QuadSegment.java -- QuadCurve segment used for BasicStroke
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.java2d;
+
+
+import java.awt.geom.Point2D;
+import java.awt.geom.QuadCurve2D;
+
+/**
+ * Quadratic Bezier curve segment
+ *
+ * Note: Most peers don't support quadratics directly, so it might make
+ * sense to represent them as cubics internally and just be done with it.
+ * I think we should be peer-agnostic, however, and stay faithful to the
+ * input geometry types as far as possible.
+ */
+public class QuadSegment extends Segment
+{
+ public Point2D cp; // control point
+
+ /**
+ * Constructor, takes the coordinates of the start, control,
+ * and end point, respectively.
+ */
+ public QuadSegment(double x1, double y1, double cx, double cy, double x2,
+ double y2)
+ {
+ super();
+ P1 = new Point2D.Double(x1, y1);
+ P2 = new Point2D.Double(x2, y2);
+ cp = new Point2D.Double(cx, cy);
+ }
+
+ public QuadSegment(Point2D p1, Point2D cp, Point2D p2)
+ {
+ super();
+ P1 = p1;
+ P2 = p2;
+ this.cp = cp;
+ }
+
+ public QuadSegment(QuadCurve2D curve)
+ {
+ super();
+ P1 = curve.getP1();
+ P2 = curve.getP2();
+ this.cp = curve.getCtrlPt();
+ }
+
+ /**
+ * Clones this segment
+ */
+ public Object clone()
+ {
+ return new QuadSegment(P1.getX(), P1.getY(), cp.getX(), cp.getY(),
+ P2.getX(), P2.getY());
+ }
+
+ /**
+ * Get the "top" and "bottom" segments of a given segment.
+ * First array element is p0 + normal, second is p0 - normal.
+ */
+ public Segment[] getDisplacedSegments(double radius)
+ {
+ this.radius = radius;
+ double x0 = P1.getX();
+ double y0 = P1.getY();
+ double x1 = cp.getX();
+ double y1 = cp.getY();
+ double x2 = P2.getX();
+ double y2 = P2.getY();
+
+ QuadCurve2D left = new QuadCurve2D.Double();
+ QuadCurve2D right = new QuadCurve2D.Double();
+ QuadCurve2D orig = new QuadCurve2D.Double(x0, y0, x1, y1, x2, y2);
+ orig.subdivide(left, right);
+
+ QuadSegment s1 = offsetSubdivided(left, true);
+ QuadSegment s2 = offsetSubdivided(left, false);
+
+ s1.add( offsetSubdivided(right, true) );
+ s2.add( offsetSubdivided(right, false) );
+
+ return new Segment[]{s1, s2};
+ }
+
+ private QuadSegment offsetSubdivided(QuadCurve2D curve, boolean plus)
+ {
+ double[] n1 = normal(curve.getX1(), curve.getY1(),
+ curve.getCtrlX(), curve.getCtrlY());
+ double[] n2 = normal(curve.getCtrlX(), curve.getCtrlY(),
+ curve.getX2(), curve.getY2());
+
+ Point2D cp;
+ QuadSegment s;
+ if( plus )
+ {
+ cp = lineIntersection(curve.getX1() + n1[0],
+ curve.getY1() + n1[1],
+ curve.getCtrlX() + n1[0],
+ curve.getCtrlY() + n1[1],
+ curve.getCtrlX() + n2[0],
+ curve.getCtrlY() + n2[1],
+ curve.getX2() + n2[0],
+ curve.getY2() + n2[1], true);
+ s = new QuadSegment(curve.getX1() + n1[0], curve.getY1() + n1[1],
+ cp.getX(), cp.getY(),
+ curve.getX2() + n2[0], curve.getY2() + n2[1]);
+ }
+ else
+ {
+ cp = lineIntersection(curve.getX1() - n1[0],
+ curve.getY1() - n1[1],
+ curve.getCtrlX() - n1[0],
+ curve.getCtrlY() - n1[1],
+ curve.getCtrlX() - n2[0],
+ curve.getCtrlY() - n2[1],
+ curve.getX2() - n2[0],
+ curve.getY2() - n2[1], true);
+
+ s = new QuadSegment(curve.getX1() - n1[0], curve.getY1() - n1[1],
+ cp.getX(), cp.getY(),
+ curve.getX2() - n2[0], curve.getY2() - n2[1]);
+ }
+
+ return s;
+ }
+
+ private Point2D lineIntersection(double X1, double Y1,
+ double X2, double Y2,
+ double X3, double Y3,
+ double X4, double Y4,
+ boolean infinite)
+ {
+ double x1 = X1;
+ double y1 = Y1;
+ double rx = X2 - x1;
+ double ry = Y2 - y1;
+
+ double x2 = X3;
+ double y2 = Y3;
+ double sx = X4 - x2;
+ double sy = Y4 - y2;
+
+ double determinant = sx * ry - sy * rx;
+ double nom = (sx * (y2 - y1) + sy * (x1 - x2));
+
+ // lines can be considered parallel.
+ if (Math.abs(determinant) < 1E-6)
+ return null;
+
+ nom = nom / determinant;
+
+ // check if lines are within the bounds
+ if(!infinite && (nom > 1.0 || nom < 0.0))
+ return null;
+
+ return new Point2D.Double(x1 + nom * rx, y1 + nom * ry);
+ }
+
+ public void reverse()
+ {
+ Point2D p = P1;
+ P1 = P2;
+ P2 = p;
+ }
+
+ public double[] first()
+ {
+ return new double[]{cp.getX(), cp.getY()};
+ }
+
+ public double[] last()
+ {
+ return new double[]{cp.getX(), cp.getY()};
+ }
+}
diff --git a/gnu/java/awt/java2d/RasterGraphics.java b/gnu/java/awt/java2d/RasterGraphics.java
new file mode 100644
index 000000000..4de8035c6
--- /dev/null
+++ b/gnu/java/awt/java2d/RasterGraphics.java
@@ -0,0 +1,101 @@
+/* RasterGraphics.java -- A Graphics2D impl for Rasters
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.java2d;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.image.ColorModel;
+import java.awt.image.WritableRaster;
+
+/**
+ * A Graphics2D implementation that operates on Raster objects. This is
+ * primarily used for BufferedImages, but can theoretically be used on
+ * arbitrary WritableRasters.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class RasterGraphics
+ extends AbstractGraphics2D
+{
+
+ /**
+ * The raster on which we operate.
+ */
+ private WritableRaster raster;
+
+ /**
+ * The color model of this Graphics instance.
+ */
+ private ColorModel colorModel;
+
+ public RasterGraphics(WritableRaster r, ColorModel cm)
+ {
+ raster = r;
+ colorModel = cm;
+ }
+
+ /**
+ * Returns the color model of this Graphics object.
+ *
+ * @return the color model of this Graphics object
+ */
+ protected ColorModel getColorModel()
+ {
+ return colorModel;
+ }
+
+ /**
+ * Returns a WritableRaster that is used by this class to perform the
+ * rendering in. It is not necessary that the target surface immediately
+ * reflects changes in the raster. Updates to the raster are notified via
+ * {@link AbstractGraphics2D#updateRaster}.
+ *
+ * @return the destination raster
+ */
+ protected WritableRaster getDestinationRaster()
+ {
+ return raster;
+ }
+
+ public GraphicsConfiguration getDeviceConfiguration()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/gnu/java/awt/java2d/Segment.java b/gnu/java/awt/java2d/Segment.java
new file mode 100644
index 000000000..9a985f696
--- /dev/null
+++ b/gnu/java/awt/java2d/Segment.java
@@ -0,0 +1,131 @@
+/* Segment.java -- Abstract segment used for BasicStroke
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.java2d;
+
+import java.awt.geom.Point2D;
+
+public abstract class Segment implements Cloneable
+{
+ // segment type, PathIterator segment types are used.
+ public Point2D P1;
+ public Point2D P2;
+ public Segment next;
+ public Segment last;
+ protected double radius;
+
+ public Segment()
+ {
+ P1 = P2 = null;
+ next = null;
+ last = this;
+ }
+
+ public void add(Segment newsegment)
+ {
+ last.next = newsegment;
+ last = last.next;
+ }
+
+ /**
+ * Reverses the orientation of the whole polygon
+ */
+ public void reverseAll()
+ {
+ reverse();
+ Segment v = next;
+ Segment former = this;
+ next = null;
+
+ while (v != null)
+ {
+ v.reverse();
+ v.last = this;
+ Segment oldnext = v.next;
+ v.next = former;
+
+ former = v;
+ v = oldnext; // move to the next in list
+ }
+ }
+
+ public String toString()
+ {
+ return "Segment:"+P1+", "+P2;
+ }
+
+ /**
+ * Get the normal vector to the slope of the line.
+ * Returns: 0.5*width*(norm of derivative of the (x0,y0)-(x1,y1) vector)
+ */
+ protected double[] normal(double x0, double y0, double x1, double y1)
+ {
+ double dx = (x1 - x0);
+ double dy = (y1 - y0);
+ if( dy == 0 )
+ {
+ dy = radius * ((dx > 0)?1:-1);
+ dx = 0;
+ }
+ else if( dx == 0 )
+ {
+ dx = radius * ((dy > 0)?-1:1);
+ dy = 0;
+ }
+ else
+ {
+ double N = Math.sqrt(dx * dx + dy * dy);
+ double odx = dx;
+ dx = -radius * dy / N;
+ dy = radius * odx / N;
+ }
+ return new double[]{ dx, dy };
+ }
+
+ public abstract void reverse();
+
+ /**
+ * Get the "top" and "bottom" segments of a segment.
+ * First array element is p0 + normal, second is p0 - normal.
+ */
+ public abstract Segment[] getDisplacedSegments(double radius);
+
+ public abstract double[] first();
+ public abstract double[] last();
+
+}
diff --git a/gnu/java/awt/peer/GLightweightPeer.java b/gnu/java/awt/peer/GLightweightPeer.java
index daaa143d0..88733b92f 100644
--- a/gnu/java/awt/peer/GLightweightPeer.java
+++ b/gnu/java/awt/peer/GLightweightPeer.java
@@ -1,5 +1,5 @@
/* GLightweightPeer.java --
- Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -54,11 +54,14 @@ import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
import java.awt.event.PaintEvent;
import java.awt.image.ColorModel;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.awt.image.VolatileImage;
+import java.awt.peer.ComponentPeer;
import java.awt.peer.ContainerPeer;
import java.awt.peer.LightweightPeer;
@@ -79,7 +82,7 @@ import java.awt.peer.LightweightPeer;
* Lightweight components are painted directly onto their parent
* containers through an Image object provided by the toolkit.
*/
-public class GLightweightPeer
+public class GLightweightPeer
implements LightweightPeer, ContainerPeer
{
private Component comp;
@@ -247,7 +250,25 @@ public class GLightweightPeer
public void setBounds(int x, int y, int width, int height) {}
- public void setCursor(Cursor cursor) {}
+ /**
+ * Sets the cursor on the heavy-weight parent peer.
+ * Called by the MouseListener on mouse enter.
+ */
+ public void setCursor(Cursor cursor)
+ {
+ Component p = comp.getParent();
+ while (p != null && p.isLightweight())
+ p = p.getParent();
+
+ if (p != null)
+ {
+ // Don't actually change the cursor of the component
+ // otherwise other childs inherit this cursor.
+ ComponentPeer peer = p.getPeer();
+ if (peer != null)
+ peer.setCursor(cursor);
+ }
+ }
public void setEnabled(boolean enabled) {}
diff --git a/gnu/java/awt/peer/gtk/GdkFontPeer.java b/gnu/java/awt/peer/gtk/GdkFontPeer.java
index 2b2dfa64e..82744480d 100644
--- a/gnu/java/awt/peer/gtk/GdkFontPeer.java
+++ b/gnu/java/awt/peer/gtk/GdkFontPeer.java
@@ -1,5 +1,5 @@
/* GdkFontPeer.java -- Implements FontPeer with GTK+
- Copyright (C) 1999, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -158,7 +158,7 @@ public class GdkFontPeer extends ClasspathFontPeer
public String getPostScriptName(Font font)
{
- return null;
+ return this.familyName;
}
public boolean canDisplay (Font font, char c)
diff --git a/gnu/java/awt/peer/gtk/GdkGraphics.java b/gnu/java/awt/peer/gtk/GdkGraphics.java
index c45892800..3c3cbdf32 100644
--- a/gnu/java/awt/peer/gtk/GdkGraphics.java
+++ b/gnu/java/awt/peer/gtk/GdkGraphics.java
@@ -219,8 +219,10 @@ public class GdkGraphics extends Graphics
public boolean drawImage (Image img, int x, int y,
Color bgcolor, ImageObserver observer)
{
- return drawImage(img, x, y, img.getWidth(null), img.getHeight(null),
- bgcolor, observer);
+ if (img != null)
+ return drawImage(img, x, y, img.getWidth(null), img.getHeight(null),
+ bgcolor, observer);
+ return false;
}
public boolean drawImage (Image img, int x, int y, ImageObserver observer)
@@ -228,16 +230,19 @@ public class GdkGraphics extends Graphics
return drawImage (img, x, y, null, observer);
}
- public boolean drawImage (Image img, int x, int y, int width, int height,
- Color bgcolor, ImageObserver observer)
+ public boolean drawImage(Image img, int x, int y, int width, int height,
+ Color bgcolor, ImageObserver observer)
{
- if (img instanceof GtkImage)
- return ((GtkImage)img).drawImage (this, x, y, width, height,
- bgcolor, observer);
- else
- return (new GtkImage(img.getSource())).drawImage (this, x, y,
- width, height,
- bgcolor, observer);
+ if (img != null)
+ {
+ if (img instanceof GtkImage)
+ return ((GtkImage) img).drawImage(this, x, y, width, height, bgcolor,
+ observer);
+ return (new GtkImage(img.getSource())).drawImage(this, x, y, width,
+ height, bgcolor,
+ observer);
+ }
+ return false;
}
public boolean drawImage (Image img, int x, int y, int width, int height,
@@ -250,14 +255,16 @@ public class GdkGraphics extends Graphics
int sx1, int sy1, int sx2, int sy2,
Color bgcolor, ImageObserver observer)
{
- if (img instanceof GtkImage)
- return ((GtkImage)img).drawImage(this, dx1, dy1, dx2, dy2,
- sx1, sy1, sx2, sy2, bgcolor, observer);
- else
- return (new GtkImage(img.getSource())).drawImage(this, dx1, dy1,
- dx2, dy2,
- sx1, sy1, sx2, sy2,
- bgcolor, observer);
+ if (img != null)
+ {
+ if (img instanceof GtkImage)
+ return ((GtkImage) img).drawImage(this, dx1, dy1, dx2, dy2, sx1, sy1,
+ sx2, sy2, bgcolor, observer);
+ return (new GtkImage(img.getSource())).drawImage(this, dx1, dy1, dx2,
+ dy2, sx1, sy1, sx2,
+ sy2, bgcolor, observer);
+ }
+ return false;
}
public boolean drawImage (Image img, int dx1, int dy1, int dx2, int dy2,
diff --git a/gnu/java/awt/peer/gtk/GdkGraphics2D.java b/gnu/java/awt/peer/gtk/GdkGraphics2D.java
index 195304dce..323d5614a 100644
--- a/gnu/java/awt/peer/gtk/GdkGraphics2D.java
+++ b/gnu/java/awt/peer/gtk/GdkGraphics2D.java
@@ -1229,7 +1229,10 @@ public class GdkGraphics2D extends Graphics2D
drawPixels(pixels, r.getWidth(), r.getHeight(), r.getWidth(), i2u);
updateBufferedImage();
-
+
+ // Cairo seems loosing the current color.
+ setColor(fg);
+
return true;
}
diff --git a/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java b/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java
index 054ebaaae..72908ff5c 100644
--- a/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java
+++ b/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java
@@ -1,5 +1,5 @@
/* GdkPixbufDecoder.java -- Image data decoding object
- Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -82,6 +82,14 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder
initStaticState ();
}
+ /**
+ * Lock that should be held for all gdkpixbuf operations. We don't use
+ * the global gdk_threads_enter/leave functions since gdkpixbuf
+ * operations can be done in parallel to drawing and manipulating gtk
+ * widgets.
+ */
+ static Object pixbufLock = new Object();
+
static native void initStaticState();
private final int native_state = GtkGenericPeer.getUniqueInteger ();
@@ -92,6 +100,7 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder
Vector curr;
// interface to GdkPixbuf
+ // These native functions should be called with the pixbufLock held.
native void initState ();
native void pumpBytes (byte[] bytes, int len) throws IOException;
native void pumpDone () throws IOException;
@@ -171,11 +180,26 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder
byte bytes[] = new byte[4096];
int len = 0;
- initState();
+ synchronized(pixbufLock)
+ {
+ initState();
+ }
needsClose = true;
+
+ // Note: We don't want the pixbufLock while reading from the InputStream.
while ((len = is.read (bytes)) != -1)
- pumpBytes (bytes, len);
- pumpDone();
+ {
+ synchronized(pixbufLock)
+ {
+ pumpBytes (bytes, len);
+ }
+ }
+
+ synchronized(pixbufLock)
+ {
+ pumpDone();
+ }
+
needsClose = false;
for (int i = 0; i < curr.size (); i++)
@@ -189,7 +213,10 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder
public void finalize()
{
- finish(needsClose);
+ synchronized(pixbufLock)
+ {
+ finish(needsClose);
+ }
}
@@ -495,8 +522,11 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder
}
processImageStarted(1);
- streamImage(pixels, this.ext, width, height, model.hasAlpha(),
- (DataOutput) this.getOutput());
+ synchronized(pixbufLock)
+ {
+ streamImage(pixels, this.ext, width, height, model.hasAlpha(),
+ (DataOutput) this.getOutput());
+ }
processImageComplete();
}
}
diff --git a/gnu/java/awt/peer/gtk/GtkCanvasPeer.java b/gnu/java/awt/peer/gtk/GtkCanvasPeer.java
index 16166afa4..797d653d2 100644
--- a/gnu/java/awt/peer/gtk/GtkCanvasPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkCanvasPeer.java
@@ -38,16 +38,14 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
-import java.awt.AWTEvent;
import java.awt.Canvas;
import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.event.PaintEvent;
import java.awt.peer.CanvasPeer;
public class GtkCanvasPeer extends GtkComponentPeer implements CanvasPeer
{
native void create ();
+ native void realize ();
public GtkCanvasPeer (Canvas c)
{
diff --git a/gnu/java/awt/peer/gtk/GtkClipboard.java b/gnu/java/awt/peer/gtk/GtkClipboard.java
index ceb42599b..f520fe224 100644
--- a/gnu/java/awt/peer/gtk/GtkClipboard.java
+++ b/gnu/java/awt/peer/gtk/GtkClipboard.java
@@ -172,15 +172,12 @@ public class GtkClipboard extends Clipboard
|| flavor.isRepresentationClassReader())
text = true;
- // XXX - We only support automatic image conversion for
- // GtkImages at the moment. So explicitly check that we have
- // one.
if (! images && flavors[i].equals(DataFlavor.imageFlavor))
{
try
{
Object o = contents.getTransferData(DataFlavor.imageFlavor);
- if (o instanceof GtkImage)
+ if (o instanceof Image)
images = true;
}
catch (UnsupportedFlavorException ufe)
@@ -291,7 +288,11 @@ public class GtkClipboard extends Clipboard
try
{
- return (GtkImage) contents.getTransferData(DataFlavor.imageFlavor);
+ Object o = contents.getTransferData(DataFlavor.imageFlavor);
+ if( o instanceof GtkImage )
+ return (GtkImage) o;
+ else
+ return new GtkImage(((Image)o).getSource());
}
catch (UnsupportedFlavorException ufe)
{
diff --git a/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/gnu/java/awt/peer/gtk/GtkComponentPeer.java
index 61cc3a82a..1a85de5fe 100644
--- a/gnu/java/awt/peer/gtk/GtkComponentPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkComponentPeer.java
@@ -63,6 +63,7 @@ import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
+import java.awt.event.MouseWheelEvent;
import java.awt.event.PaintEvent;
import java.awt.event.TextEvent;
import java.awt.image.BufferedImage;
@@ -98,8 +99,9 @@ public class GtkComponentPeer extends GtkGenericPeer
native void gtkWidgetGetPreferredDimensions (int[] dim);
native void gtkWindowGetLocationOnScreen (int[] point);
native void gtkWidgetGetLocationOnScreen (int[] point);
- native void gtkWidgetSetCursor (int type);
- native void gtkWidgetSetCursorUnlocked (int type);
+ native void gtkWidgetSetCursor (int type, GtkImage image, int x, int y);
+ native void gtkWidgetSetCursorUnlocked (int type, GtkImage image,
+ int x, int y);
native void gtkWidgetSetBackground (int red, int green, int blue);
native void gtkWidgetSetForeground (int red, int green, int blue);
native void gtkWidgetSetSensitive (boolean sensitive);
@@ -148,6 +150,9 @@ public class GtkComponentPeer extends GtkGenericPeer
setNativeEventMask ();
realize ();
+
+ if (awtComponent.isCursorSet())
+ setCursor ();
}
void setParentAndBounds ()
@@ -313,7 +318,7 @@ public class GtkComponentPeer extends GtkGenericPeer
// seems expensive. However, the graphics state does not carry
// over between calls to paint, and resetting the graphics object
// may even be more costly than simply creating a new one.
- GdkGraphics g = (GdkGraphics) getGraphics();
+ Graphics g = getGraphics();
g.setClip(event.getUpdateRect());
@@ -332,7 +337,7 @@ public class GtkComponentPeer extends GtkGenericPeer
|| (awtComponent.getWidth() < 1 || awtComponent.getHeight() < 1))
return;
- GdkGraphics g = (GdkGraphics) getGraphics();
+ Graphics g = getGraphics();
g.setClip(event.getUpdateRect());
@@ -502,10 +507,28 @@ public class GtkComponentPeer extends GtkGenericPeer
public void setCursor (Cursor cursor)
{
+ int x, y;
+ GtkImage image;
+ int type = cursor.getType();
+ if (cursor instanceof GtkCursor)
+ {
+ GtkCursor gtkCursor = (GtkCursor) cursor;
+ image = gtkCursor.getGtkImage();
+ Point hotspot = gtkCursor.getHotspot();
+ x = hotspot.x;
+ y = hotspot.y;
+ }
+ else
+ {
+ image = null;
+ x = 0;
+ y = 0;
+ }
+
if (Thread.currentThread() == GtkToolkit.mainThread)
- gtkWidgetSetCursorUnlocked (cursor.getType ());
+ gtkWidgetSetCursorUnlocked(cursor.getType(), image, x, y);
else
- gtkWidgetSetCursor (cursor.getType ());
+ gtkWidgetSetCursor(cursor.getType(), image, x, y);
}
public void setEnabled (boolean b)
@@ -544,7 +567,7 @@ public class GtkComponentPeer extends GtkGenericPeer
public void setVisible (boolean b)
{
// Only really set visible when component is bigger than zero pixels.
- if (b)
+ if (b && ! (awtComponent instanceof Window))
{
Rectangle bounds = awtComponent.getBounds();
b = (bounds.width > 0) && (bounds.height > 0);
@@ -573,6 +596,19 @@ public class GtkComponentPeer extends GtkGenericPeer
clickCount, popupTrigger));
}
+ /**
+ * Callback for component_scroll_cb.
+ */
+ protected void postMouseWheelEvent(int id, long when, int mods,
+ int x, int y, int clickCount,
+ boolean popupTrigger,
+ int type, int amount, int rotation)
+ {
+ q().postEvent(new MouseWheelEvent(awtComponent, id, when, mods,
+ x, y, clickCount, popupTrigger,
+ type, amount, rotation));
+ }
+
protected void postExposeEvent (int x, int y, int width, int height)
{
q().postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT,
diff --git a/gnu/java/awt/peer/gtk/GtkCursor.java b/gnu/java/awt/peer/gtk/GtkCursor.java
new file mode 100644
index 000000000..eb9e713d0
--- /dev/null
+++ b/gnu/java/awt/peer/gtk/GtkCursor.java
@@ -0,0 +1,72 @@
+/* GtkCursor.java -- Simple wrapper for custom cursor.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.awt.peer.gtk;
+
+import java.awt.Cursor;
+import java.awt.Image;
+import java.awt.Point;
+
+/**
+ * Simple wrapper for custom Cursor.
+ */
+public class GtkCursor extends Cursor
+{
+ private final GtkImage image;
+ private final Point hotspot;
+
+ GtkCursor(Image image, Point hotspot, String name)
+ {
+ super(name);
+ if (image instanceof GtkImage)
+ this.image = (GtkImage) image;
+ else
+ this.image = new GtkImage(image.getSource());
+ this.hotspot = hotspot;
+ }
+
+ GtkImage getGtkImage()
+ {
+ return image;
+ }
+
+ Point getHotspot()
+ {
+ return hotspot;
+ }
+}
diff --git a/gnu/java/awt/peer/gtk/GtkFontPeer.java b/gnu/java/awt/peer/gtk/GtkFontPeer.java
deleted file mode 100644
index 80ad15803..000000000
--- a/gnu/java/awt/peer/gtk/GtkFontPeer.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/* GtkFontPeer.java -- Implements FontPeer with GTK+
- Copyright (C) 1999, 2004, 2005 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-
-package gnu.java.awt.peer.gtk;
-
-import gnu.java.awt.peer.ClasspathFontPeer;
-
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.font.FontRenderContext;
-import java.awt.font.GlyphVector;
-import java.awt.font.LineMetrics;
-import java.awt.geom.Rectangle2D;
-import java.text.CharacterIterator;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class GtkFontPeer extends ClasspathFontPeer
-{
- private static ResourceBundle bundle;
-
- static
- {
- try
- {
- bundle = ResourceBundle.getBundle ("gnu.java.awt.peer.gtk.font");
- }
- catch (Throwable ignored)
- {
- bundle = null;
- }
- }
-
- private final String Xname;
-
- public GtkFontPeer (String name, int style)
- {
- // All fonts get a default size of 12 if size is not specified.
- this(name, style, 12);
- }
-
- public GtkFontPeer (String name, int style, int size)
- {
- super(name, style, size);
-
- String Xname = null;
- if (bundle != null)
- {
- try
- {
- Xname = bundle.getString (name.toLowerCase () + "." + style);
- }
- catch (MissingResourceException mre)
- {
- // ignored
- }
- }
-
- if (Xname == null)
- {
- String weight;
- String slant;
- String spacing;
-
- if (style == Font.ITALIC || (style == (Font.BOLD+Font.ITALIC)))
- slant = "i";
- else
- slant = "r";
- if (style == Font.BOLD || (style == (Font.BOLD+Font.ITALIC)))
- weight = "bold";
- else
- weight = "medium";
- if (name.equals("Serif") || name.equals("SansSerif")
- || name.equals("Helvetica") || name.equals("Times"))
- spacing = "p";
- else
- spacing = "c";
-
- Xname = "-*-*-" + weight + "-" + slant + "-normal-*-*-" + size + "-*-*-" + spacing + "-*-*-*";
- }
-
- this.Xname = Xname;
- }
-
- public String getXLFD ()
- {
- return Xname;
- }
-
-
- /* remaining methods are for static compatibility with the newer
- ClasspathFontPeer superclass; none of these methods ever existed or
- worked on the older FontPeer interface, but we need to pretend to
- support them anyways. */
-
- public boolean canDisplay (Font font, char c)
- {
- throw new UnsupportedOperationException();
- }
-
- public int canDisplayUpTo (Font font, CharacterIterator i, int start, int limit)
- {
- throw new UnsupportedOperationException();
- }
-
- public String getSubFamilyName (Font font, Locale locale)
- {
- throw new UnsupportedOperationException();
- }
-
- public String getPostScriptName (Font font)
- {
- throw new UnsupportedOperationException();
- }
-
- public int getNumGlyphs (Font font)
- {
- throw new UnsupportedOperationException();
- }
-
- public int getMissingGlyphCode (Font font)
- {
- throw new UnsupportedOperationException();
- }
-
- public byte getBaselineFor (Font font, char c)
- {
- throw new UnsupportedOperationException();
- }
-
- public String getGlyphName (Font font, int glyphIndex)
- {
- throw new UnsupportedOperationException();
- }
-
- public GlyphVector createGlyphVector (Font font,
- FontRenderContext frc,
- CharacterIterator ci)
- {
- throw new UnsupportedOperationException();
- }
-
- public GlyphVector createGlyphVector (Font font,
- FontRenderContext ctx,
- int[] glyphCodes)
- {
- throw new UnsupportedOperationException();
- }
-
- public GlyphVector layoutGlyphVector (Font font,
- FontRenderContext frc,
- char[] chars, int start,
- int limit, int flags)
- {
- throw new UnsupportedOperationException();
- }
-
- public FontMetrics getFontMetrics (Font font)
- {
- throw new UnsupportedOperationException();
- }
-
- public boolean hasUniformLineMetrics (Font font)
- {
- throw new UnsupportedOperationException();
- }
-
- public LineMetrics getLineMetrics (Font font,
- CharacterIterator ci,
- int begin, int limit,
- FontRenderContext rc)
- {
- throw new UnsupportedOperationException();
- }
-
- public Rectangle2D getMaxCharBounds (Font font,
- FontRenderContext rc)
- {
- throw new UnsupportedOperationException();
- }
-
- public Rectangle2D getStringBounds (Font font,
- CharacterIterator ci,
- int begin, int limit,
- FontRenderContext frc)
- {
- throw new UnsupportedOperationException();
- }
-}
diff --git a/gnu/java/awt/peer/gtk/GtkFramePeer.java b/gnu/java/awt/peer/gtk/GtkFramePeer.java
index c8cc9423b..6ec0b7298 100644
--- a/gnu/java/awt/peer/gtk/GtkFramePeer.java
+++ b/gnu/java/awt/peer/gtk/GtkFramePeer.java
@@ -1,5 +1,5 @@
/* GtkFramePeer.java -- Implements FramePeer with GTK
- Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2002, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -122,25 +122,11 @@ public class GtkFramePeer extends GtkWindowPeer
public void setBounds (int x, int y, int width, int height)
{
- // prevent window_configure_cb -> awtComponent.setSize ->
- // peer.setBounds -> nativeSetBounds self-deadlock on GDK lock.
- if (Thread.currentThread() == GtkToolkit.mainThread)
- {
- int menuBarWidth = width - insets.left - insets.right;
- if (menuBar != null && menuBarWidth > 0)
- setMenuBarWidthUnlocked (menuBar, menuBarWidth);
-
- return;
- }
-
int menuBarWidth = width - insets.left - insets.right;
if (menuBar != null && menuBarWidth > 0)
setMenuBarWidth (menuBar, menuBarWidth);
- nativeSetBounds (x, y,
- width - insets.left - insets.right,
- height - insets.top - insets.bottom
- + menuBarHeight);
+ super.setBounds(x, y, width, height + menuBarHeight);
}
public void setResizable (boolean resizable)
@@ -198,26 +184,19 @@ public class GtkFramePeer extends GtkWindowPeer
protected void postConfigureEvent (int x, int y, int width, int height)
{
- int frame_width = width + insets.left + insets.right;
+ if (menuBar != null && width > 0)
+ setMenuBarWidthUnlocked (menuBar, width);
+
// Since insets.top already includes the MenuBar's height, we need
// to subtract the MenuBar's height from the top inset.
- int frame_height = height + insets.top + insets.bottom - menuBarHeight;
-
- if (frame_width != awtComponent.getWidth()
- || frame_height != awtComponent.getHeight())
- awtComponent.setSize(frame_width, frame_height);
+ int frame_height = height - menuBarHeight;
- int frame_x = x - insets.left;
// Likewise, since insets.top includes the MenuBar height, we need
// to add back the MenuBar height to the frame's y position. If
// no MenuBar exists in this frame, the MenuBar height will be 0.
- int frame_y = y - insets.top + menuBarHeight;
+ int frame_y = y + menuBarHeight;
- if (frame_x != awtComponent.getX()
- || frame_y != awtComponent.getY())
- {
- // awtComponent.setLocation(frame_x, frame_y);
- }
+ super.postConfigureEvent(x, frame_y, width, frame_height);
}
public int getState ()
diff --git a/gnu/java/awt/peer/gtk/GtkImage.java b/gnu/java/awt/peer/gtk/GtkImage.java
index b48a2049e..5e5f1de01 100644
--- a/gnu/java/awt/peer/gtk/GtkImage.java
+++ b/gnu/java/awt/peer/gtk/GtkImage.java
@@ -123,41 +123,50 @@ public class GtkImage extends Image
/**
* Returns a copy of the pixel data as a java array.
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
*/
private native int[] getPixels();
/**
* Sets the pixel data from a java array.
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
*/
private native void setPixels(int[] pixels);
/**
* Loads an image using gdk-pixbuf from a file.
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
*/
private native boolean loadPixbuf(String name);
/**
* Loads an image using gdk-pixbuf from data.
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
*/
private native boolean loadImageFromData(byte[] data);
/**
* Allocates a Gtk Pixbuf or pixmap
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
*/
private native void createPixmap();
/**
* Frees the above.
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
*/
private native void freePixmap();
/**
* Sets the pixmap to scaled copy of src image. hints are rendering hints.
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
*/
private native void createScaledPixmap(GtkImage src, int hints);
/**
* Draws the image, optionally scaled and composited.
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
+ * Also acquires global gdk lock for drawing.
*/
private native void drawPixelsScaled (GdkGraphics gc,
int bg_red, int bg_green, int bg_blue,
@@ -166,6 +175,8 @@ public class GtkImage extends Image
/**
* Draws the image, optionally scaled flipped and composited.
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
+ * Also acquires global gdk lock for drawing.
*/
private native void drawPixelsScaledFlipped (GdkGraphics gc,
int bg_red, int bg_green,
@@ -219,12 +230,21 @@ public class GtkImage extends Image
File f = new File(filename);
try
{
- if (loadPixbuf(f.getCanonicalPath()) != true)
- throw new IllegalArgumentException("Couldn't load image: "+filename);
+ String path = f.getCanonicalPath();
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ if (loadPixbuf(f.getCanonicalPath()) != true)
+ throw new IllegalArgumentException("Couldn't load image: "
+ + filename);
+ }
}
catch(IOException e)
{
- throw new IllegalArgumentException("Couldn't load image: "+filename);
+ IllegalArgumentException iae;
+ iae = new IllegalArgumentException("Couldn't load image: "
+ + filename);
+ iae.initCause(e);
+ throw iae;
}
isLoaded = true;
@@ -241,8 +261,11 @@ public class GtkImage extends Image
*/
public GtkImage (byte[] data)
{
- if (loadImageFromData (data) != true)
- throw new IllegalArgumentException ("Couldn't load image.");
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ if (loadImageFromData (data) != true)
+ throw new IllegalArgumentException ("Couldn't load image.");
+ }
isLoaded = true;
observers = null;
@@ -277,8 +300,12 @@ public class GtkImage extends Image
{
throw new IllegalArgumentException ("Couldn't load image.");
}
- if (loadImageFromData (baos.toByteArray()) != true)
- throw new IllegalArgumentException ("Couldn't load image.");
+ byte[] array = baos.toByteArray();
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ if (loadImageFromData(array) != true)
+ throw new IllegalArgumentException ("Couldn't load image.");
+ }
isLoaded = true;
observers = null;
@@ -296,7 +323,10 @@ public class GtkImage extends Image
isLoaded = true;
observers = null;
offScreen = true;
- createPixmap();
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ createPixmap();
+ }
}
/**
@@ -312,7 +342,10 @@ public class GtkImage extends Image
offScreen = false;
// Use the GDK scaling method.
- createScaledPixmap(src, hints);
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ createScaledPixmap(src, hints);
+ }
}
/**
@@ -322,7 +355,10 @@ public class GtkImage extends Image
GtkImage (Pointer pixbuf)
{
pixmap = pixbuf;
- createFromPixbuf();
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ createFromPixbuf();
+ }
isLoaded = true;
observers = null;
offScreen = false;
@@ -349,6 +385,7 @@ public class GtkImage extends Image
/**
* Native helper function for constructor that takes a pixbuf Pointer.
+ * Should be called with the GdkPixbufDecoder.pixbufLock held.
*/
private native void createFromPixbuf();
@@ -370,8 +407,11 @@ public class GtkImage extends Image
isLoaded = true;
deliver();
- createPixmap();
- setPixels(pixels);
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ createPixmap();
+ setPixels(pixels);
+ }
}
// java.awt.Image methods ////////////////////////////////////////////////
@@ -408,7 +448,13 @@ public class GtkImage extends Image
{
if (!isLoaded)
return null;
- return new MemoryImageSource(width, height, nativeModel, getPixels(),
+
+ int[] pixels;
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ pixels = getPixels();
+ }
+ return new MemoryImageSource(width, height, nativeModel, pixels,
0, width);
}
@@ -454,7 +500,10 @@ public class GtkImage extends Image
{
observers = new Vector();
isLoaded = false;
- freePixmap();
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ freePixmap();
+ }
source.startProduction(new GtkImageConsumer(this, source));
}
}
@@ -462,7 +511,12 @@ public class GtkImage extends Image
public void finalize()
{
if (isLoaded)
- freePixmap();
+ {
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ freePixmap();
+ }
+ }
}
/**
@@ -529,23 +583,29 @@ public class GtkImage extends Image
srcHeight = height - srcY;
}
+ if ( this.width <= 0 || this.height <= 0 )
+ return true;
+
if ( srcWidth <= 0 || srcHeight <= 0 || dstWidth <= 0 || dstHeight <= 0)
return true;
- if(bgcolor != null)
- drawPixelsScaledFlipped (g, bgcolor.getRed (), bgcolor.getGreen (),
- bgcolor.getBlue (),
- flipX, flipY,
- srcX, srcY,
- srcWidth, srcHeight,
- dstX, dstY,
- dstWidth, dstHeight,
- true);
- else
- drawPixelsScaledFlipped (g, 0, 0, 0, flipX, flipY,
- srcX, srcY, srcWidth, srcHeight,
- dstX, dstY, dstWidth, dstHeight,
- false);
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ if(bgcolor != null)
+ drawPixelsScaledFlipped (g, bgcolor.getRed (), bgcolor.getGreen (),
+ bgcolor.getBlue (),
+ flipX, flipY,
+ srcX, srcY,
+ srcWidth, srcHeight,
+ dstX, dstY,
+ dstWidth, dstHeight,
+ true);
+ else
+ drawPixelsScaledFlipped (g, 0, 0, 0, flipX, flipY,
+ srcX, srcY, srcWidth, srcHeight,
+ dstX, dstY, dstWidth, dstHeight,
+ false);
+ }
return true;
}
@@ -559,11 +619,17 @@ public class GtkImage extends Image
if (addObserver(observer))
return false;
- if(bgcolor != null)
- drawPixelsScaled(g, bgcolor.getRed (), bgcolor.getGreen (),
- bgcolor.getBlue (), x, y, width, height, true);
- else
- drawPixelsScaled(g, 0, 0, 0, x, y, width, height, false);
+ if ( this.width <= 0 || this.height <= 0 )
+ return true;
+
+ synchronized(GdkPixbufDecoder.pixbufLock)
+ {
+ if(bgcolor != null)
+ drawPixelsScaled(g, bgcolor.getRed (), bgcolor.getGreen (),
+ bgcolor.getBlue (), x, y, width, height, true);
+ else
+ drawPixelsScaled(g, 0, 0, 0, x, y, width, height, false);
+ }
return true;
}
diff --git a/gnu/java/awt/peer/gtk/GtkPanelPeer.java b/gnu/java/awt/peer/gtk/GtkPanelPeer.java
index 16eb8c8fb..51fe2bc8e 100644
--- a/gnu/java/awt/peer/gtk/GtkPanelPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkPanelPeer.java
@@ -39,9 +39,7 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
import java.awt.AWTEvent;
-import java.awt.Graphics;
import java.awt.Panel;
-import java.awt.event.ComponentEvent;
import java.awt.event.MouseEvent;
import java.awt.event.PaintEvent;
import java.awt.peer.PanelPeer;
@@ -62,16 +60,9 @@ public class GtkPanelPeer extends GtkContainerPeer
if (id == MouseEvent.MOUSE_PRESSED)
awtComponent.requestFocusInWindow();
-
+
super.handleEvent(event);
}
- protected void updateComponent (PaintEvent event)
- {
- // Do not want to clear anything before painting. Sun never
- // calls Panel.update, only Panel.paint.
- paintComponent(event);
- }
-
native void connectSignals ();
}
diff --git a/gnu/java/awt/peer/gtk/GtkToolkit.java b/gnu/java/awt/peer/gtk/GtkToolkit.java
index 084bdd3f2..7757db0c5 100644
--- a/gnu/java/awt/peer/gtk/GtkToolkit.java
+++ b/gnu/java/awt/peer/gtk/GtkToolkit.java
@@ -579,6 +579,11 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit
return q;
}
+ public Cursor createCustomCursor(Image image, Point hotspot, String name)
+ {
+ return new GtkCursor(image, hotspot, name);
+ }
+
protected native void loadSystemColors (int[] systemColors);
public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent e)
diff --git a/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/gnu/java/awt/peer/gtk/GtkWindowPeer.java
index 70c6615fa..d15beacb4 100644
--- a/gnu/java/awt/peer/gtk/GtkWindowPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkWindowPeer.java
@@ -1,5 +1,5 @@
/* GtkWindowPeer.java -- Implements WindowPeer with GTK
- Copyright (C) 1998, 1999, 2002, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -44,6 +44,7 @@ import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Window;
+import java.awt.event.ComponentEvent;
import java.awt.event.PaintEvent;
import java.awt.event.WindowEvent;
import java.awt.peer.WindowPeer;
@@ -63,20 +64,37 @@ public class GtkWindowPeer extends GtkContainerPeer
private boolean hasBeenShown = false;
private int oldState = Frame.NORMAL;
+ // Cached awt window component location, width and height.
+ private int x, y, width, height;
+
native void gtkWindowSetTitle (String title);
native void gtkWindowSetResizable (boolean resizable);
native void gtkWindowSetModal (boolean modal);
native void realize ();
+ /** Returns the cached width of the AWT window component. */
+ int getX ()
+ {
+ return x;
+ }
+
+ /** Returns the cached width of the AWT window component. */
+ int getY ()
+ {
+ return y;
+ }
+
+ /** Returns the cached width of the AWT window component. */
int getWidth ()
{
- return awtComponent.getWidth();
+ return width;
}
+ /** Returns the cached height of the AWT window component. */
int getHeight ()
{
- return awtComponent.getHeight();
+ return height;
}
native void create (int type, boolean decorated, GtkWindowPeer parent);
@@ -86,6 +104,10 @@ public class GtkWindowPeer extends GtkContainerPeer
Window window = (Window) awtComponent;
GtkWindowPeer parent_peer = null;
Component parent = awtComponent.getParent();
+ x = awtComponent.getX();
+ y = awtComponent.getY();
+ height = awtComponent.getHeight();
+ width = awtComponent.getWidth();
if (!window.isFocusableWindow())
type = GDK_WINDOW_TYPE_HINT_MENU;
@@ -130,37 +152,28 @@ public class GtkWindowPeer extends GtkContainerPeer
native void nativeSetLocation (int x, int y);
native void nativeSetLocationUnlocked (int x, int y);
- public void setLocation (int x, int y)
+ // Called from show.
+ protected void setLocation (int x, int y)
{
- // prevent window_configure_cb -> awtComponent.setSize ->
- // peer.setBounds -> nativeSetBounds self-deadlock on GDK lock.
- if (Thread.currentThread() == GtkToolkit.mainThread)
- return;
nativeSetLocation (x, y);
}
- public void setLocationUnlocked (int x, int y)
- {
- nativeSetLocationUnlocked (x, y);
- }
-
public void setBounds (int x, int y, int width, int height)
{
- // prevent window_configure_cb -> awtComponent.setSize ->
- // peer.setBounds -> nativeSetBounds self-deadlock on GDK lock.
- if (Thread.currentThread() == GtkToolkit.mainThread)
- return;
-
- nativeSetBounds (x, y,
- width - insets.left - insets.right,
- height - insets.top - insets.bottom);
- }
-
- public void setBoundsUnlocked (int x, int y, int width, int height)
- {
- nativeSetBoundsUnlocked (x, y,
- width - insets.left - insets.right,
- height - insets.top - insets.bottom);
+ if (x != getX()
+ || y != getY()
+ || width != getWidth()
+ || height != getHeight())
+ {
+ this.x = x;
+ this.y = y;
+ this.width = width;
+ this.height = height;
+
+ nativeSetBounds (x, y,
+ width - insets.left - insets.right,
+ height - insets.top - insets.bottom);
+ }
}
public void setTitle (String title)
@@ -168,15 +181,25 @@ public class GtkWindowPeer extends GtkContainerPeer
gtkWindowSetTitle (title);
}
- native void setSize (int width, int height);
-
+ // Called from setResizable
+ protected native void setSize (int width, int height);
+
+ /**
+ * Needed by both GtkFramePeer and GtkDialogPeer subclasses, so
+ * implemented here. But never actually called on a GtkWindowPeer
+ * itself.
+ */
public void setResizable (boolean resizable)
{
// Call setSize; otherwise when resizable is changed from true to
// false the window will shrink to the dimensions it had before it
// was resizable.
- setSize (awtComponent.getWidth() - insets.left - insets.right,
- awtComponent.getHeight() - insets.top - insets.bottom);
+ x = awtComponent.getX();
+ y = awtComponent.getY();
+ width = awtComponent.getWidth();
+ height = awtComponent.getHeight();
+ setSize (width - insets.left - insets.right,
+ height - insets.top - insets.bottom);
gtkWindowSetResizable (resizable);
}
@@ -196,23 +219,35 @@ public class GtkWindowPeer extends GtkContainerPeer
int frame_width = width + insets.left + insets.right;
int frame_height = height + insets.top + insets.bottom;
- if (frame_width != awtComponent.getWidth()
- || frame_height != awtComponent.getHeight())
- awtComponent.setSize(frame_width, frame_height);
+ if (frame_width != getWidth()
+ || frame_height != getHeight())
+ {
+ this.width = frame_width;
+ this.height = frame_height;
+ q().postEvent(new ComponentEvent(awtComponent,
+ ComponentEvent.COMPONENT_RESIZED));
+ }
int frame_x = x - insets.left;
int frame_y = y - insets.top;
- if (frame_x != awtComponent.getX()
- || frame_y != awtComponent.getY())
+ if (frame_x != getX()
+ || frame_y != getY())
{
- // awtComponent.setLocation(frame_x, frame_y);
+ this.x = frame_x;
+ this.y = frame_y;
+ q().postEvent(new ComponentEvent(awtComponent,
+ ComponentEvent.COMPONENT_MOVED));
}
}
public void show ()
{
- setLocation(awtComponent.getX(), awtComponent.getY());
+ x = awtComponent.getX();
+ y = awtComponent.getY();
+ width = awtComponent.getWidth();
+ height = awtComponent.getHeight();
+ setLocation(x, y);
setVisible (true);
}
@@ -296,4 +331,11 @@ public class GtkWindowPeer extends GtkContainerPeer
x + insets.left, y + insets.top,
clickCount, popupTrigger);
}
+
+ // We override this to keep it in sync with our internal
+ // representation.
+ public Rectangle getBounds()
+ {
+ return new Rectangle(x, y, width, height);
+ }
}
diff --git a/gnu/java/awt/peer/swing/SwingComponentPeer.java b/gnu/java/awt/peer/swing/SwingComponentPeer.java
index 5e34bc9dd..5d484e021 100644
--- a/gnu/java/awt/peer/swing/SwingComponentPeer.java
+++ b/gnu/java/awt/peer/swing/SwingComponentPeer.java
@@ -590,8 +590,7 @@ public class SwingComponentPeer
*/
public void setBounds(int x, int y, int width, int height)
{
- if (swingComponent != null)
- swingComponent.getJComponent().setBounds(x, y, width, height);
+ reshape(x, y, width, height);
}
/**
diff --git a/gnu/java/awt/peer/swing/SwingContainerPeer.java b/gnu/java/awt/peer/swing/SwingContainerPeer.java
index 37bea751f..0b2fb992f 100644
--- a/gnu/java/awt/peer/swing/SwingContainerPeer.java
+++ b/gnu/java/awt/peer/swing/SwingContainerPeer.java
@@ -61,7 +61,7 @@ public class SwingContainerPeer
*
* @param awtCont
*/
- public SwingContainerPeer(Container awtCont)
+ public SwingContainerPeer(Component awtCont)
{
init(awtCont, null);
}
@@ -92,12 +92,7 @@ public class SwingContainerPeer
*/
public Insets getInsets()
{
- Insets retVal;
- if (swingComponent != null)
- retVal = swingComponent.getJComponent().getInsets();
- else
- retVal = new Insets(0, 0, 0, 0);
- return retVal;
+ return insets();
}
/**
@@ -214,12 +209,15 @@ public class SwingContainerPeer
protected void handleMouseEvent(MouseEvent ev)
{
Component comp = awtComponent.getComponentAt(ev.getPoint());
- ComponentPeer peer = comp.getPeer();
- if (awtComponent != comp && !comp.isLightweight() && peer instanceof SwingComponentPeer)
+ if (comp != null)
{
- ev.translatePoint(comp.getX(), comp.getY());
- ev.setSource(comp);
- ((SwingComponentPeer) peer).handleMouseEvent(ev);
+ ComponentPeer peer = comp.getPeer();
+ if (awtComponent != comp && !comp.isLightweight() && peer instanceof SwingComponentPeer)
+ {
+ ev.translatePoint(comp.getX(), comp.getY());
+ ev.setSource(comp);
+ ((SwingComponentPeer) peer).handleMouseEvent(ev);
+ }
}
}
@@ -231,11 +229,14 @@ public class SwingContainerPeer
protected void handleMouseMotionEvent(MouseEvent ev)
{
Component comp = awtComponent.getComponentAt(ev.getPoint());
- ComponentPeer peer = comp.getPeer();
- if (awtComponent != comp && !comp.isLightweight() && peer instanceof SwingComponentPeer)
+ if (comp != null)
{
- ev.translatePoint(comp.getX(), comp.getY());
- ((SwingComponentPeer) peer).handleMouseMotionEvent(ev);
+ ComponentPeer peer = comp.getPeer();
+ if (awtComponent != comp && !comp.isLightweight() && peer instanceof SwingComponentPeer)
+ {
+ ev.translatePoint(comp.getX(), comp.getY());
+ ((SwingComponentPeer) peer).handleMouseMotionEvent(ev);
+ }
}
}
}
diff --git a/gnu/java/lang/InstrumentationImpl.java b/gnu/java/lang/InstrumentationImpl.java
new file mode 100644
index 000000000..7bfed4582
--- /dev/null
+++ b/gnu/java/lang/InstrumentationImpl.java
@@ -0,0 +1,243 @@
+/* InstrumentationImpl.java -- GNU implementation of
+ java.lang.instrument.Instrumentation
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.lang;
+
+import java.lang.instrument.Instrumentation;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.ClassDefinition;
+import java.lang.instrument.UnmodifiableClassException;
+import java.lang.instrument.IllegalClassFormatException;
+
+import java.security.ProtectionDomain;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * An Instrumentation object has transformers that will
+ * be called each time a class is defined or redefined.
+ * The object is given to a <code>premain</code> function
+ * that is called before the <code>main</code> function.
+ *
+ * @author Nicolas Geoffray (nicolas.geoffray@menlina.com)
+ * @since 1.5
+ */
+public final class InstrumentationImpl implements Instrumentation
+{
+
+ /* List of transformers */
+ /* FIXME[GENERICS]: Should be ClassFileTransformer list */
+ private ArrayList transformers = new ArrayList();
+
+
+ private InstrumentationImpl()
+ {
+ }
+
+ /**
+ * Adds a <code>ClassFileTransformer</class> object
+ * to the instrumentation. Each time a class is defined
+ * or redefined, the <code>transform</code> method of the
+ * <code>transformer</code> object is called.
+ *
+ * @param transformer the transformer to add
+ * @throws NullPointerException if transformer is null
+ */
+ public void addTransformer(ClassFileTransformer transformer)
+ {
+ if (transformer == null)
+ throw new NullPointerException();
+ synchronized(transformers)
+ {
+ transformers.add(transformer);
+ }
+ }
+
+ /**
+ * Removes the given transformer from the set of transformers
+ * this Instrumentation object has.
+ *
+ * @param transformer the transformer to remove
+ * @return true if the transformer was found and removed, false if
+ * the transformer was not found
+ * @throws NullPointerException if transformer is null
+ */
+ public boolean removeTransformer(ClassFileTransformer transformer)
+ {
+ if (transformer == null)
+ throw new NullPointerException();
+
+ boolean result;
+ synchronized (transformers)
+ {
+ result = transformers.remove(transformer);
+ }
+ return result;
+ }
+
+ /**
+ * Returns if the current JVM supports class redefinition
+ *
+ * @return true if the current JVM supports class redefinition
+ */
+ public boolean isRedefineClassesSupported()
+ {
+ return VMInstrumentationImpl.isRedefineClassesSupported();
+ }
+
+ /**
+ * Redefine classes present in the definitions array, with
+ * the corresponding class files.
+ *
+ * @param definitions an array of classes to redefine
+ *
+ * @throws ClassNotFoundException if a class cannot be found
+ * @throws UnmodifiableClassException if a class cannot be modified
+ * @throws UnsupportedOperationException if the JVM does not support
+ * redefinition or the redefinition made unsupported changes
+ * @throws ClassFormatError if a class file is not valid
+ * @throws NoClassDefFoundError if a class name is not equal to the name
+ * in the class file specified
+ * @throws UnsupportedClassVersionError if the class file version numbers
+ * are unsupported
+ * @throws ClassCircularityError if circularity occured with the new
+ * classes
+ * @throws LinkageError if a linkage error occurs
+ * @throws NullPointerException if the definitions array is null, or any
+ * of its element
+ *
+ * @see isRedefineClassesSupported()
+ * @see addTransformer(java.lang.instrument.ClassFileTransformer)
+ * @see ClassFileTransformer
+ */
+ public void redefineClasses(ClassDefinition[] definitions)
+ throws ClassNotFoundException,
+ UnmodifiableClassException
+ {
+ if (!isRedefineClassesSupported())
+ throw new UnsupportedOperationException();
+
+ VMInstrumentationImpl.redefineClasses(this, definitions);
+ }
+
+
+ /**
+ * Get all the classes loaded by the JVM.
+ *
+ * @return an array containing all the classes loaded by the JVM. The array
+ * is empty if no class is loaded.
+ */
+ public Class[] getAllLoadedClasses()
+ {
+ return VMInstrumentationImpl.getAllLoadedClasses();
+ }
+
+ /**
+ * Get all the classes loaded by a given class loader
+ *
+ * @param loader the loader
+ *
+ * @return an array containing all the classes loaded by the given loader.
+ * The array is empty if no class was loaded by the loader.
+ */
+ public Class[] getInitiatedClasses(ClassLoader loader)
+ {
+ return VMInstrumentationImpl.getInitiatedClasses(loader);
+ }
+
+ /**
+ * Get the size of an object.
+ *
+ * @param objectToSize the object
+ * @return the size of the object
+ * @throws NullPointerException if objectToSize is null.
+ */
+ public long getObjectSize(Object objectToSize)
+ {
+ // We alleviate the VM work
+ if (objectToSize == null)
+ throw new NullPointerException();
+ return VMInstrumentationImpl.getObjectSize(objectToSize);
+ }
+
+ /**
+ * Called by the VM or redefineClasses to call each transformer
+ *
+ * @param loader the loader of the class
+ * @param className the name of the class with packages separated with "/"
+ * @param classBeingRedefined the class being redefined if it's the case,
+ * null otherwise
+ * @param protectionDomain the protection domain of the class being defined
+ * or redefined
+ * @param classfileBuffer the input byte buffer in class file format
+ *
+ * @return the new class file
+ */
+ /* FIXME[GENERICS]: Should be Class<?> */
+ public byte[] callTransformers(ClassLoader loader, String className,
+ Class classBeingRedefined, ProtectionDomain protectionDomain,
+ byte[] classfileBuffer)
+ {
+ byte[] newBuffer = null;
+ byte[] oldBuffer = classfileBuffer;
+ ClassFileTransformer current;
+ synchronized (transformers)
+ {
+ Iterator i = transformers.iterator();
+ while (i.hasNext())
+ {
+ /* FIXME[GENERICS]: Remove cast */
+ current = (ClassFileTransformer) i.next();
+ try
+ {
+ newBuffer = current.transform(loader, className,
+ classBeingRedefined, protectionDomain, oldBuffer);
+ }
+ catch (IllegalClassFormatException ignored)
+ {
+ //IGNORED
+ }
+ if (newBuffer != null)
+ oldBuffer = newBuffer;
+ }
+ }
+ return oldBuffer;
+ }
+}
diff --git a/gnu/java/lang/reflect/ClassSignatureParser.java b/gnu/java/lang/reflect/ClassSignatureParser.java
new file mode 100644
index 000000000..0c9b96292
--- /dev/null
+++ b/gnu/java/lang/reflect/ClassSignatureParser.java
@@ -0,0 +1,92 @@
+/* ClassSignatureParser.java
+ Copyright (C) 2005
+ Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.lang.reflect;
+
+import java.lang.reflect.*;
+import java.util.ArrayList;
+
+public class ClassSignatureParser extends GenericSignatureParser
+{
+ private TypeVariable[] typeParameters;
+ private Type superclassType;
+ private Type[] interfaceTypes;
+
+ public ClassSignatureParser(Class c, String signature)
+ {
+ super(c, c.getClassLoader(), signature);
+
+ if (peekChar() == '<')
+ {
+ typeParameters = readFormalTypeParameters();
+ }
+ else
+ {
+ typeParameters = new TypeVariable[0];
+ }
+ // SuperclassSignature
+ superclassType = readClassTypeSignature();
+ ArrayList interfaces = new ArrayList();
+ while (peekChar() == 'L')
+ {
+ // SuperinterfaceSignature
+ interfaces.add(readClassTypeSignature());
+ }
+ interfaceTypes = new Type[interfaces.size()];
+ interfaces.toArray(interfaceTypes);
+ end();
+ }
+
+ public TypeVariable[] getTypeParameters()
+ {
+ TypeImpl.resolve(typeParameters);
+ return typeParameters;
+ }
+
+ public Type getSuperclassType()
+ {
+ superclassType = TypeImpl.resolve(superclassType);
+ return superclassType;
+ }
+
+ public Type[] getInterfaceTypes()
+ {
+ TypeImpl.resolve(interfaceTypes);
+ return interfaceTypes;
+ }
+}
diff --git a/gnu/java/lang/reflect/FieldSignatureParser.java b/gnu/java/lang/reflect/FieldSignatureParser.java
new file mode 100644
index 000000000..16622d33f
--- /dev/null
+++ b/gnu/java/lang/reflect/FieldSignatureParser.java
@@ -0,0 +1,103 @@
+/* FieldSignatureParser.java
+ Copyright (C) 2005
+ Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.lang.reflect;
+
+import java.lang.reflect.GenericSignatureFormatError;
+import java.lang.reflect.Type;
+
+public final class FieldSignatureParser extends GenericSignatureParser
+{
+ private Type type;
+
+ public FieldSignatureParser(Class container, String signature)
+ {
+ super(container, container.getClassLoader(), signature);
+
+ switch (peekChar())
+ {
+ case 'L':
+ case '[':
+ case 'T':
+ type = readFieldTypeSignature();
+ break;
+ case 'Z':
+ consume('Z');
+ type = boolean.class;
+ break;
+ case 'B':
+ consume('B');
+ type = byte.class;
+ break;
+ case 'S':
+ consume('S');
+ type = short.class;
+ break;
+ case 'C':
+ consume('C');
+ type = char.class;
+ break;
+ case 'I':
+ consume('I');
+ type = int.class;
+ break;
+ case 'F':
+ consume('F');
+ type = float.class;
+ break;
+ case 'J':
+ consume('J');
+ type = long.class;
+ break;
+ case 'D':
+ consume('D');
+ type = double.class;
+ break;
+ default:
+ throw new GenericSignatureFormatError();
+ }
+
+ end();
+ }
+
+ public Type getFieldType()
+ {
+ type = TypeImpl.resolve(type);
+ return type;
+ }
+}
diff --git a/gnu/java/lang/reflect/GenericSignatureParser.java b/gnu/java/lang/reflect/GenericSignatureParser.java
new file mode 100644
index 000000000..399f1bdc4
--- /dev/null
+++ b/gnu/java/lang/reflect/GenericSignatureParser.java
@@ -0,0 +1,622 @@
+/* GenericSignatureParser.java
+ Copyright (C) 2005
+ Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.lang.reflect;
+
+import java.lang.reflect.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+final class TypeVariableImpl extends TypeImpl implements TypeVariable
+{
+ private GenericDeclaration decl;
+ private Type[] bounds;
+ private String name;
+
+ TypeVariableImpl(GenericDeclaration decl, Type[] bounds, String name)
+ {
+ this.decl = decl;
+ this.bounds = bounds;
+ this.name = name;
+ }
+
+ Type resolve()
+ {
+ return this;
+ }
+
+ /* FIXME[GENERICS]: Remove cast */
+ public Type[] getBounds()
+ {
+ resolve(bounds);
+ return (Type[]) bounds.clone();
+ }
+
+ public GenericDeclaration getGenericDeclaration()
+ {
+ return decl;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public boolean equals(Object obj)
+ {
+ if (obj instanceof TypeVariableImpl)
+ {
+ TypeVariableImpl other = (TypeVariableImpl)obj;
+ return decl.equals(other.decl) && name.equals(other.name);
+ }
+ return false;
+ }
+
+ public int hashCode()
+ {
+ return 0x5f4d5156 ^ decl.hashCode() ^ name.hashCode();
+ }
+
+ public String toString()
+ {
+ return name;
+ }
+}
+
+final class ParameterizedTypeImpl extends TypeImpl implements ParameterizedType
+{
+ private String rawTypeName;
+ private ClassLoader loader;
+ private Class rawType;
+ private Type owner;
+ private Type[] typeArgs;
+
+ ParameterizedTypeImpl(String rawTypeName, ClassLoader loader, Type owner,
+ Type[] typeArgs)
+ {
+ this.rawTypeName = rawTypeName;
+ this.loader = loader;
+ this.owner = owner;
+ this.typeArgs = typeArgs;
+ }
+
+ Type resolve()
+ {
+ if (rawType == null)
+ {
+ try
+ {
+ rawType = Class.forName(rawTypeName, false, loader);
+ }
+ catch (ClassNotFoundException x)
+ {
+ throw new TypeNotPresentException(rawTypeName, x);
+ }
+ }
+ if (typeArgs == null)
+ {
+ if (owner == null)
+ {
+ return rawType;
+ }
+ typeArgs = new Type[0];
+ }
+ resolve(typeArgs);
+ owner = resolve(owner);
+ return this;
+ }
+
+ /* FIXME[GENERICS]: Remove cast */
+ public Type[] getActualTypeArguments()
+ {
+ return (Type[]) typeArgs.clone();
+ }
+
+ public Type getRawType()
+ {
+ return rawType;
+ }
+
+ public Type getOwnerType()
+ {
+ return owner;
+ }
+
+ public boolean equals(Object obj)
+ {
+ if (obj instanceof ParameterizedTypeImpl)
+ {
+ ParameterizedTypeImpl other = (ParameterizedTypeImpl)obj;
+ return rawType.equals(other.rawType)
+ && ((owner == null && other.owner == null)
+ || owner.equals(other.owner))
+ && Arrays.deepEquals(typeArgs, other.typeArgs);
+ }
+ return false;
+ }
+
+ public int hashCode()
+ {
+ int h = 0x58158970 ^ rawType.hashCode();
+ if (owner != null)
+ {
+ h ^= Integer.reverse(owner.hashCode());
+ }
+ for (int i = 0; i < typeArgs.length; i++)
+ {
+ h ^= Integer.rotateLeft(typeArgs[i].hashCode(), i);
+ }
+ return h;
+ }
+
+ public String toString()
+ {
+ StringBuilder sb = new StringBuilder();
+ if (owner != null)
+ {
+ sb.append(owner);
+ sb.append('.');
+ sb.append(rawType.getSimpleName());
+ }
+ else
+ {
+ sb.append(rawTypeName);
+ }
+ if (typeArgs.length > 0)
+ {
+ sb.append('<');
+ for (int i = 0; i < typeArgs.length; i++)
+ {
+ if (i > 0)
+ sb.append(", ");
+ if (typeArgs[i] instanceof Class)
+ {
+ sb.append(((Class)typeArgs[i]).getName());
+ }
+ else
+ {
+ sb.append(typeArgs[i]);
+ }
+ }
+ sb.append('>');
+ }
+ return sb.toString();
+ }
+}
+
+final class GenericArrayTypeImpl extends TypeImpl implements GenericArrayType
+{
+ private Type componentType;
+
+ GenericArrayTypeImpl(Type componentType)
+ {
+ this.componentType = componentType;
+ }
+
+ Type resolve()
+ {
+ componentType = resolve(componentType);
+ return this;
+ }
+
+ public Type getGenericComponentType()
+ {
+ return componentType;
+ }
+
+ public boolean equals(Object obj)
+ {
+ if (obj instanceof GenericArrayTypeImpl)
+ {
+ GenericArrayTypeImpl other = (GenericArrayTypeImpl)obj;
+ return componentType.equals(other.componentType);
+ }
+ return false;
+ }
+
+ public int hashCode()
+ {
+ return 0x4be37a7f ^ componentType.hashCode();
+ }
+
+ public String toString()
+ {
+ return componentType + "[]";
+ }
+}
+
+final class UnresolvedTypeVariable extends TypeImpl implements Type
+{
+ private GenericDeclaration decl;
+ private String name;
+
+ UnresolvedTypeVariable(GenericDeclaration decl, String name)
+ {
+ this.decl = decl;
+ this.name = name;
+ }
+
+ Type resolve()
+ {
+ GenericDeclaration d = decl;
+ while (d != null)
+ {
+ TypeVariable[] vars = d.getTypeParameters();
+ for (int a = 0; a < vars.length ; ++a)
+ {
+ if (vars[a].getName().equals(name))
+ {
+ return vars[a];
+ }
+ }
+ d = getParent(d);
+ }
+ throw new MalformedParameterizedTypeException();
+ }
+
+ private static GenericDeclaration getParent(GenericDeclaration d)
+ {
+ if (d instanceof Class)
+ {
+ Method m = ((Class)d).getEnclosingMethod();
+ if (m != null)
+ {
+ return m;
+ }
+ Constructor c = ((Class)d).getEnclosingConstructor();
+ if (c != null)
+ {
+ return c;
+ }
+ return ((Class)d).getEnclosingClass();
+ }
+ else if (d instanceof Method)
+ {
+ return ((Method)d).getDeclaringClass();
+ }
+ else if (d instanceof Constructor)
+ {
+ return ((Constructor)d).getDeclaringClass();
+ }
+ else
+ {
+ // TODO figure out what this represents
+ throw new Error();
+ }
+ }
+}
+
+final class WildcardTypeImpl extends TypeImpl implements WildcardType
+{
+ private Type lower;
+ private Type upper;
+
+ WildcardTypeImpl(Type lower, Type upper)
+ {
+ this.lower = lower;
+ this.upper = upper;
+ }
+
+ Type resolve()
+ {
+ upper = resolve(upper);
+ lower = resolve(lower);
+ return this;
+ }
+
+ public Type[] getUpperBounds()
+ {
+ if (upper == null)
+ {
+ return new Type[0];
+ }
+ return new Type[] { upper };
+ }
+
+ public Type[] getLowerBounds()
+ {
+ if (lower == null)
+ {
+ return new Type[0];
+ }
+ return new Type[] { lower };
+ }
+
+ public boolean equals(Object obj)
+ {
+ if (obj instanceof WildcardTypeImpl)
+ {
+ WildcardTypeImpl other = (WildcardTypeImpl)obj;
+ return Arrays.deepEquals(getUpperBounds(), other.getUpperBounds())
+ && Arrays.deepEquals(getLowerBounds(), other.getLowerBounds());
+ }
+ return false;
+ }
+
+ public int hashCode()
+ {
+ int h = 0x75d074fd;
+ if (upper != null)
+ {
+ h ^= upper.hashCode();
+ }
+ if (lower != null)
+ {
+ h ^= lower.hashCode();
+ }
+ return h;
+ }
+
+ public String toString()
+ {
+ if (lower != null)
+ {
+ return "? super " + lower;
+ }
+ if (upper == java.lang.Object.class)
+ {
+ return "?";
+ }
+ return "? extends " + upper;
+ }
+}
+
+class GenericSignatureParser
+{
+ private ClassLoader loader;
+ private GenericDeclaration container;
+ private String signature;
+ private int pos;
+
+ GenericSignatureParser(GenericDeclaration container, ClassLoader loader,
+ String signature)
+ {
+ this.container = container;
+ this.loader = loader;
+ this.signature = signature;
+ }
+
+ TypeVariable[] readFormalTypeParameters()
+ {
+ consume('<');
+ ArrayList params = new ArrayList();
+ do
+ {
+ // TODO should we handle name clashes?
+ params.add(readFormalTypeParameter());
+ } while (peekChar() != '>');
+ consume('>');
+ TypeVariable[] list = new TypeVariable[params.size()];
+ params.toArray(list);
+ return list;
+ }
+
+ private TypeVariable readFormalTypeParameter()
+ {
+ String identifier = readIdentifier();
+ consume(':');
+ ArrayList bounds = new ArrayList();
+ if (peekChar() != ':')
+ {
+ bounds.add(readFieldTypeSignature());
+ }
+ while (peekChar() == ':')
+ {
+ consume(':');
+ bounds.add(readFieldTypeSignature());
+ }
+ Type[] b = new Type[bounds.size()];
+ bounds.toArray(b);
+ return new TypeVariableImpl(container, b, identifier);
+ }
+
+ Type readFieldTypeSignature()
+ {
+ switch (peekChar())
+ {
+ case 'L':
+ return readClassTypeSignature();
+ case '[':
+ return readArrayTypeSignature();
+ case 'T':
+ return readTypeVariableSignature();
+ default:
+ throw new GenericSignatureFormatError();
+ }
+ }
+
+ Type readClassTypeSignature()
+ {
+ consume('L');
+ String className = "";
+ for (;;)
+ {
+ String part = readIdentifier();
+ if (peekChar() != '/')
+ {
+ className += part;
+ break;
+ }
+ consume('/');
+ className += part + ".";
+ }
+ Type[] typeArguments = null;
+ if (peekChar() == '<')
+ {
+ typeArguments = readTypeArguments();
+ }
+ Type type = new ParameterizedTypeImpl(className, loader, null,
+ typeArguments);
+ while (peekChar() == '.')
+ {
+ consume('.');
+ className += "$" + readIdentifier();
+ typeArguments = null;
+ if (peekChar() == '<')
+ {
+ typeArguments = readTypeArguments();
+ }
+ type = new ParameterizedTypeImpl(className, loader, type,
+ typeArguments);
+ }
+ consume(';');
+ return type;
+ }
+
+ private Type[] readTypeArguments()
+ {
+ consume('<');
+ ArrayList list = new ArrayList();
+ do
+ {
+ list.add(readTypeArgument());
+ } while ((peekChar() != '>'));
+ consume('>');
+ Type[] arr = new Type[list.size()];
+ list.toArray(arr);
+ return arr;
+ }
+
+ private Type readTypeArgument()
+ {
+ char c = peekChar();
+ if (c == '+')
+ {
+ consume('+');
+ return new WildcardTypeImpl(null, readFieldTypeSignature());
+ }
+ else if (c == '-')
+ {
+ consume('-');
+ return new WildcardTypeImpl(readFieldTypeSignature(),
+ java.lang.Object.class);
+ }
+ else if (c == '*')
+ {
+ consume('*');
+ return new WildcardTypeImpl(null, java.lang.Object.class);
+ }
+ else
+ {
+ return readFieldTypeSignature();
+ }
+ }
+
+ Type readArrayTypeSignature()
+ {
+ consume('[');
+ switch (peekChar())
+ {
+ case 'L':
+ case '[':
+ case 'T':
+ return new GenericArrayTypeImpl(readFieldTypeSignature());
+ case 'Z':
+ consume('Z');
+ return boolean[].class;
+ case 'B':
+ consume('B');
+ return byte[].class;
+ case 'S':
+ consume('S');
+ return short[].class;
+ case 'C':
+ consume('C');
+ return char[].class;
+ case 'I':
+ consume('I');
+ return int[].class;
+ case 'F':
+ consume('F');
+ return float[].class;
+ case 'J':
+ consume('J');
+ return long[].class;
+ case 'D':
+ consume('D');
+ return double[].class;
+ default:
+ throw new GenericSignatureFormatError();
+ }
+ }
+
+ Type readTypeVariableSignature()
+ {
+ consume('T');
+ String identifier = readIdentifier();
+ consume(';');
+ return new UnresolvedTypeVariable(container, identifier);
+ }
+
+ private String readIdentifier()
+ {
+ int start = pos;
+ char c;
+ do
+ {
+ readChar();
+ c = peekChar();
+ } while (";:./<>-+*".indexOf(c) == -1);
+ return signature.substring(start, pos);
+ }
+
+ final char peekChar()
+ {
+ if (pos == signature.length())
+ return '\u0000';
+ else
+ return signature.charAt(pos);
+ }
+
+ final char readChar()
+ {
+ return signature.charAt(pos++);
+ }
+
+ final void consume(char c)
+ {
+ if (readChar() != c)
+ throw new GenericSignatureFormatError();
+ }
+
+ final void end()
+ {
+ if (pos != signature.length())
+ throw new GenericSignatureFormatError();
+ }
+}
diff --git a/gnu/java/lang/reflect/MethodSignatureParser.java b/gnu/java/lang/reflect/MethodSignatureParser.java
new file mode 100644
index 000000000..16b1af99b
--- /dev/null
+++ b/gnu/java/lang/reflect/MethodSignatureParser.java
@@ -0,0 +1,167 @@
+/* MethodSignatureParser.java
+ Copyright (C) 2005
+ Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.lang.reflect;
+
+import java.lang.reflect.*;
+import java.util.ArrayList;
+
+public class MethodSignatureParser extends GenericSignatureParser
+{
+ private TypeVariable[] typeParameters;
+ private Type[] argTypes;
+ private Type retType;
+ private Type[] throwsSigs;
+
+ public MethodSignatureParser(Method method, String signature)
+ {
+ this(method, method.getDeclaringClass().getClassLoader(), signature);
+ }
+
+ public MethodSignatureParser(Constructor method, String signature)
+ {
+ this(method, method.getDeclaringClass().getClassLoader(), signature);
+ }
+
+ private MethodSignatureParser(GenericDeclaration wrapper,
+ ClassLoader loader, String signature)
+ {
+ super(wrapper, loader, signature);
+
+ if (peekChar() == '<')
+ {
+ typeParameters = readFormalTypeParameters();
+ }
+ else
+ {
+ typeParameters = new TypeVariable[0];
+ }
+ consume('(');
+ ArrayList args = new ArrayList();
+ while (peekChar() != ')')
+ {
+ args.add(readTypeSignature());
+ }
+ argTypes = new Type[args.size()];
+ args.toArray(argTypes);
+ consume(')');
+ retType = readTypeSignature();
+ ArrayList throwsSigs = new ArrayList();
+ while (peekChar() == '^')
+ {
+ consume('^');
+ if(peekChar() == 'T')
+ {
+ throwsSigs.add(readTypeVariableSignature());
+ }
+ else
+ {
+ throwsSigs.add(readClassTypeSignature());
+ }
+ }
+ this.throwsSigs = new Type[throwsSigs.size()];
+ throwsSigs.toArray(this.throwsSigs);
+ end();
+ }
+
+ public TypeVariable[] getTypeParameters()
+ {
+ TypeImpl.resolve(typeParameters);
+ return typeParameters;
+ }
+
+ public Type[] getGenericParameterTypes()
+ {
+ TypeImpl.resolve(argTypes);
+ return argTypes;
+ }
+
+ public Type getGenericReturnType()
+ {
+ retType = TypeImpl.resolve(retType);
+ return retType;
+ }
+
+ public Type[] getGenericExceptionTypes()
+ {
+ TypeImpl.resolve(throwsSigs);
+ return throwsSigs;
+ }
+
+ private Type readTypeSignature()
+ {
+ switch (peekChar())
+ {
+ case 'T':
+ return readTypeVariableSignature();
+ case 'L':
+ return readClassTypeSignature();
+ case '[':
+ return readArrayTypeSignature();
+ case 'Z':
+ consume('Z');
+ return boolean.class;
+ case 'B':
+ consume('B');
+ return byte.class;
+ case 'S':
+ consume('S');
+ return short.class;
+ case 'C':
+ consume('C');
+ return char.class;
+ case 'I':
+ consume('I');
+ return int.class;
+ case 'F':
+ consume('F');
+ return float.class;
+ case 'J':
+ consume('J');
+ return long.class;
+ case 'D':
+ consume('D');
+ return double.class;
+ case 'V':
+ consume('V');
+ return void.class;
+ default:
+ throw new GenericSignatureFormatError();
+ }
+ }
+}
diff --git a/gnu/java/lang/reflect/TypeImpl.java b/gnu/java/lang/reflect/TypeImpl.java
new file mode 100644
index 000000000..30906f629
--- /dev/null
+++ b/gnu/java/lang/reflect/TypeImpl.java
@@ -0,0 +1,63 @@
+/* TypeImpl.java
+ Copyright (C) 2005
+ Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.lang.reflect;
+
+import java.lang.reflect.Type;
+
+abstract class TypeImpl implements Type
+{
+ abstract Type resolve();
+
+ static void resolve(Type[] types)
+ {
+ for (int i = 0; i < types.length; i++)
+ {
+ types[i] = resolve(types[i]);
+ }
+ }
+
+ static Type resolve(Type type)
+ {
+ if (type instanceof TypeImpl)
+ {
+ type = ((TypeImpl) type).resolve();
+ }
+ return type;
+ }
+}
diff --git a/gnu/java/locale/.cvsignore b/gnu/java/locale/.cvsignore
new file mode 100644
index 000000000..d41ae8d81
--- /dev/null
+++ b/gnu/java/locale/.cvsignore
@@ -0,0 +1 @@
+LocaleData.java
diff --git a/gnu/java/locale/LocaleHelper.java b/gnu/java/locale/LocaleHelper.java
index ff0029390..cec014717 100644
--- a/gnu/java/locale/LocaleHelper.java
+++ b/gnu/java/locale/LocaleHelper.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.locale;
+import java.text.Collator;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
@@ -154,5 +155,57 @@ public class LocaleHelper
}
return localizedString;
}
+
+ /**
+ * Return an array of all the locales for which there is a
+ * {@link Collator} instance. A new array is returned each time.
+ */
+ public static Locale[] getCollatorLocales()
+ {
+ // For now we don't bother caching. This is probably
+ // not called very frequently. And, we would have to
+ // clone the array anyway.
+ if (LocaleData.collatorLocaleNames.length == 0)
+ return new Locale[] { Locale.US };
+ Locale[] result = new Locale[LocaleData.collatorLocaleNames.length];
+ for (int i = 0; i < result.length; ++i)
+ {
+ String language;
+ String region = "";
+ String variant = "";
+ String name = LocaleData.collatorLocaleNames[i];
+
+ language = name.substring(0, 2);
+
+ if (name.length() > 2)
+ region = name.substring(3);
+
+ int index = region.indexOf("_");
+ if (index > 0)
+ {
+ variant = region.substring(index + 1);
+ region = region.substring(0, index - 1);
+ }
+
+ result[i] = new Locale(language, region, variant);
+ }
+ return result;
+ }
+
+ /**
+ * Return the number of locales we know of.
+ */
+ public static int getLocaleCount()
+ {
+ return LocaleData.localeNames.length;
+ }
+
+ /**
+ * Return the Nth locale name.
+ */
+ public static String getLocaleName(int n)
+ {
+ return LocaleData.localeNames[n];
+ }
}
diff --git a/gnu/java/net/DefaultContentHandlerFactory.java b/gnu/java/net/DefaultContentHandlerFactory.java
new file mode 100644
index 000000000..bb0a7ce5d
--- /dev/null
+++ b/gnu/java/net/DefaultContentHandlerFactory.java
@@ -0,0 +1,94 @@
+/* DefaultContentHandlerFactory.java
+ Copyright (C) 2004 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.net;
+
+import java.io.IOException;
+import java.net.ContentHandler;
+import java.net.ContentHandlerFactory;
+import java.net.URLConnection;
+import java.util.Arrays;
+import java.util.HashSet;
+
+/** Content Handler for Image types, using the AWT Toolkit's image decoder. */
+class ImageHandler extends ContentHandler
+{
+ static ImageHandler instance = new ImageHandler();
+
+ public Object getContent(URLConnection urlc) throws IOException
+ {
+ // FIXME: implement using ImageIO
+ // ClasspathToolkit tk = (ClasspathToolkit) Toolkit.getDefaultToolkit();
+ // java.awt.image.ImageProducer ip = tk.createImageProducer(urlc.getURL());
+ // return ip;
+ return null;
+ }
+}
+
+/**
+ */
+public class DefaultContentHandlerFactory implements ContentHandlerFactory
+{
+ /** For now, hard code the list of types that we assume should
+ * be supported by the Toolkit. ClasspathToolkit should perhaps provide
+ * an API to express what Image MIME types the Toolkit understands.
+ */
+ private static String[] known_image_types =
+ {
+ "image/bmp",
+ "image/gif",
+ "image/jpeg",
+ "image/png",
+ "image/tiff",
+ "image/x-portable-anymap",
+ "image/x-cmu-raster",
+ "image/x-xbitmap",
+ "image/x-xpixmap"
+ };
+
+ private static HashSet imageTypes
+ = new HashSet(Arrays.asList(known_image_types));
+
+ public ContentHandler createContentHandler(String mimeType)
+ {
+ if (imageTypes.contains(mimeType))
+ return ImageHandler.instance;
+ // Currently, only image types are handled.
+ return null;
+ }
+}
diff --git a/gnu/java/net/IndexListParser.java b/gnu/java/net/IndexListParser.java
new file mode 100644
index 000000000..31a6dbbc8
--- /dev/null
+++ b/gnu/java/net/IndexListParser.java
@@ -0,0 +1,159 @@
+/* IndexListParser.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.net;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.jar.JarFile;
+
+/**
+ * The INDEX.LIST file contains sections each separated by a blank line.
+ * Each section defines the content of a jar, with a
+ * header defining the jar file path name, followed by a list of paths.
+ * The jar file paths are relative to the codebase of the root jar.
+ *
+ Specification
+ index file : version-info blankline section*
+ version-info : JarIndex-Version: version-number
+ version-number : digit+{.digit+}*
+ section : body blankline
+ body : header name*
+ header : char+.jar newline
+ name : char+ newline
+
+ * @author langel at redhat dot com
+ */
+public class IndexListParser
+{
+ String filePath = "META-INF/INDEX.LIST";
+ String versInfo = "JarIndex-Version: ";
+ double versionNumber;
+ ArrayList headers = new ArrayList();
+
+ /**
+ * Parses the given jarfile's INDEX.LIST file if it exists.
+ *
+ * @param jarfile - the given jar file
+ * @param baseJarURL - the codebase of the jar file
+ * @param baseURL - the base url for the headers
+ */
+ public IndexListParser(JarFile jarfile, URL baseJarURL, URL baseURL)
+ {
+ try
+ {
+ // Parse INDEX.LIST if it exists
+ if (jarfile.getEntry(filePath) != null)
+ {
+ BufferedReader br = new BufferedReader(new InputStreamReader(new URL(baseJarURL,
+ filePath).openStream()));
+
+ // Must start with version info
+ String line = br.readLine();
+ if (!line.startsWith(versInfo))
+ return;
+ versionNumber = Double.parseDouble(line.substring(versInfo.length()).trim());
+
+ // Blank line must be next
+ line = br.readLine();
+ if (!line.equals(""))
+ {
+ clearAll();
+ return;
+ }
+
+ // May contain sections
+ line = br.readLine();
+ while (line != null)
+ {
+ headers.add(new URL(baseURL, line));
+
+ // Skip all names in the section
+ while (! (line = br.readLine()).equals(""));
+ line = br.readLine();
+ }
+ }
+ // else INDEX.LIST does not exist
+ }
+ catch (Exception ex)
+ {
+ clearAll();
+ }
+ }
+
+ /**
+ * Clears all the variables. This is called when parsing fails.
+ */
+ void clearAll()
+ {
+ versionNumber = 0;
+ headers.clear();
+ }
+
+ /**
+ * Gets the version info for the file.
+ *
+ * @return the version info.
+ */
+ public String getVersionInfo()
+ {
+ return versInfo + getVersionNumber();
+ }
+
+ /**
+ * Gets the version number of the file.
+ *
+ * @return the version number.
+ */
+ public double getVersionNumber()
+ {
+ return versionNumber;
+ }
+
+ /**
+ * Gets the array list of all the headers found in the file.
+ *
+ * @return an array list of all the headers.
+ */
+ public ArrayList getHeaders()
+ {
+ return headers;
+ }
+}
diff --git a/gnu/java/net/local/LocalServerSocket.java b/gnu/java/net/local/LocalServerSocket.java
new file mode 100644
index 000000000..15163f243
--- /dev/null
+++ b/gnu/java/net/local/LocalServerSocket.java
@@ -0,0 +1,172 @@
+/* LocalServerSocket.java -- a unix domain server socket.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is a part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.net.local;
+
+import java.io.IOException;
+
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.SocketException;
+
+public final class LocalServerSocket extends ServerSocket
+{
+
+ // Fields.
+ // -------------------------------------------------------------------------
+
+ private LocalSocketImpl myImpl;
+ private boolean closed;
+
+ // Constructors.
+ // -------------------------------------------------------------------------
+
+ public LocalServerSocket () throws IOException
+ {
+ myImpl = new LocalSocketImpl ();
+ }
+
+ public LocalServerSocket (SocketAddress bindPoint) throws IOException
+ {
+ this ();
+ bind (bindPoint);
+ }
+
+ // Instance methods.
+ // -------------------------------------------------------------------------
+
+ public void bind (SocketAddress bindPoint) throws IOException
+ {
+ bind (bindPoint, 0);
+ }
+
+ public void bind (SocketAddress bindPoint, int backlog) throws IOException
+ {
+ myImpl.doCreate ();
+ myImpl.bind (bindPoint);
+ myImpl.listen (backlog);
+ }
+
+ public InetAddress getInetAddress ()
+ {
+ return null;
+ }
+
+ public int getLocalPort ()
+ {
+ return -1;
+ }
+
+ public SocketAddress getLocalSocketAddress ()
+ {
+ return myImpl.getLocalAddress ();
+ }
+
+ public Socket accept () throws IOException
+ {
+ LocalSocket s = new LocalSocket (true);
+ myImpl.accept (s.getLocalImpl());
+ s.localConnected = true;
+ return s;
+ }
+
+ public void close () throws IOException
+ {
+ myImpl.close ();
+ myImpl.unlink ();
+ closed = true;
+ }
+
+ public boolean isBound ()
+ {
+ return myImpl.getLocalAddress () != null;
+ }
+
+ public boolean isClosed ()
+ {
+ return closed;
+ }
+
+ public void setSoTimeout (int timeout)
+ {
+ throw new UnsupportedOperationException ("local sockets do not support timeouts");
+ }
+
+ public int getSoTimeout ()
+ {
+ throw new UnsupportedOperationException ("local sockets do not support timeouts");
+ }
+
+ public void setReuseAddress (boolean b)
+ {
+ throw new UnsupportedOperationException ("local sockets do not support reuse address");
+ }
+
+ public boolean getReuseAddress ()
+ {
+ throw new UnsupportedOperationException ("local sockets do not support reuse address");
+ }
+
+ public String toString ()
+ {
+ return LocalServerSocket.class.getName() + " [ address="
+ + myImpl.getLocalAddress() + " ]";
+ }
+
+ public void setReceiveBufferSize (int size)
+ {
+ throw new UnsupportedOperationException ("local sockets do not support buffer size");
+ }
+
+ public int getReceiveBufferSize ()
+ {
+ throw new UnsupportedOperationException ("local sockets do not support buffer size");
+ }
+
+ public void setSendBufferSize (int size)
+ {
+ throw new UnsupportedOperationException ("local sockets do not support buffer size");
+ }
+
+ public int getSendBufferSize ()
+ {
+ throw new UnsupportedOperationException ("local sockets do not support buffer size");
+ }
+}
diff --git a/gnu/java/net/local/LocalSocket.java b/gnu/java/net/local/LocalSocket.java
new file mode 100644
index 000000000..b977d69c1
--- /dev/null
+++ b/gnu/java/net/local/LocalSocket.java
@@ -0,0 +1,312 @@
+/* LocalSocket.java -- a unix domain client socket.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is a part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.net.local;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.net.SocketImpl;
+
+import java.nio.channels.IllegalBlockingModeException;
+import java.nio.channels.SocketChannel;
+
+/**
+ * A local, or unix-domain socket. Unix domain sockets are connected on the
+ * local filesystem itself, rather than a remote address.
+ */
+public final class LocalSocket extends Socket
+{
+
+ // Fields.
+ // -------------------------------------------------------------------------
+
+ private final LocalSocketImpl localimpl;
+ boolean localClosed;
+ boolean localConnected;
+
+ // Constructors.
+ // -------------------------------------------------------------------------
+
+ public LocalSocket () throws SocketException
+ {
+ super ();
+ localimpl = new LocalSocketImpl ();
+ }
+
+ public LocalSocket (LocalSocketAddress addr) throws SocketException
+ {
+ this ();
+ try
+ {
+ connect (addr);
+ }
+ catch (IOException ioe)
+ {
+ SocketException se = new SocketException ();
+ se.initCause (ioe);
+ throw se;
+ }
+ }
+
+ LocalSocket (boolean nocreate) throws IOException
+ {
+ super ();
+ localimpl = new LocalSocketImpl (nocreate);
+ }
+
+ // Instance methods.
+ // -------------------------------------------------------------------------
+
+ public void bind (SocketAddress bindpoint) throws IOException
+ {
+ throw new SocketException ("binding local client sockets is nonsensical");
+ }
+
+ public void connect (SocketAddress endpoint, int timeout) throws IOException
+ {
+ if (isClosed ())
+ {
+ throw new SocketException ("socket is closed");
+ }
+ if (! (endpoint instanceof LocalSocketAddress))
+ {
+ throw new IllegalArgumentException ("socket address is not a local address");
+ }
+ if (getChannel() != null && !getChannel().isBlocking())
+ {
+ throw new IllegalBlockingModeException ();
+ }
+
+ try
+ {
+ localimpl.doCreate ();
+ localimpl.localConnect ((LocalSocketAddress) endpoint);
+ }
+ catch (IOException ioe)
+ {
+ close ();
+ throw ioe;
+ }
+ localConnected = true;
+ }
+
+ public InetAddress getInetAddress ()
+ {
+ return null;
+ }
+
+ public InetAddress getLocalAddress ()
+ {
+ return null;
+ }
+
+ public int getPort ()
+ {
+ return -1;
+ }
+
+ public int getLocalPort ()
+ {
+ return -1;
+ }
+
+ public SocketChannel getChannel ()
+ {
+ return null;
+ }
+
+ public SocketAddress getLocalSocketAddress ()
+ {
+ return localimpl.getLocalAddress ();
+ }
+
+ public SocketAddress getRemoteSocketAddress ()
+ {
+ return localimpl.getRemoteAddress ();
+ }
+
+ public InputStream getInputStream () throws IOException
+ {
+ return localimpl.getInputStream ();
+ }
+
+ public OutputStream getOutputStream () throws IOException
+ {
+ return localimpl.getOutputStream ();
+ }
+
+ public void sendUrgentData (int b) throws IOException
+ {
+ localimpl.sendUrgentData (b);
+ }
+
+ public synchronized void close () throws IOException
+ {
+ localimpl.close ();
+ localClosed = true;
+ }
+
+ public void shutdownInput () throws IOException
+ {
+ localimpl.shutdownInput ();
+ }
+
+ public void shutdownOutput () throws IOException
+ {
+ localimpl.shutdownOutput ();
+ }
+
+ public boolean isClosed ()
+ {
+ return localClosed;
+ }
+
+ public boolean isBound ()
+ {
+ return false;
+ }
+
+ public boolean isConnected ()
+ {
+ return localConnected;
+ }
+
+ // Unsupported methods.
+ // -------------------------------------------------------------------------
+
+ public void setTcpNoDelay (boolean b) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public boolean getTcpNoDelay() throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public void setSoLinger (boolean b, int i) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public int getSoLinger () throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public void setOOBInline (boolean b) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public boolean getOOBInline () throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public void setSoTimeout (int i) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public int getSoTimeout () throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public void setSendBufferSize (int i) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public int getSendBufferSize() throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public void setReceiveBufferSize (int i) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public int getReceiveBufferSize () throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public void setKeepAlive (boolean b) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public boolean getKeepAlive () throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public void setTrafficClass (int i) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public int getTrafficClass () throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public void setReuseAddress (boolean b) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ public boolean getReuseAddress () throws SocketException
+ {
+ throw new SocketException ("local sockets do not support this option");
+ }
+
+ LocalSocketImpl getLocalImpl ()
+ {
+ return localimpl;
+ }
+}
diff --git a/gnu/java/net/local/LocalSocketAddress.java b/gnu/java/net/local/LocalSocketAddress.java
new file mode 100644
index 000000000..ac5c53db2
--- /dev/null
+++ b/gnu/java/net/local/LocalSocketAddress.java
@@ -0,0 +1,100 @@
+/* LocalSocketAddress.java -- unix-domain socket address.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is a part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.net.local;
+
+import java.net.SocketAddress;
+
+public final class LocalSocketAddress extends SocketAddress
+{
+
+ // Fields.
+ // -------------------------------------------------------------------------
+
+ private final String path;
+
+ // Constructor.
+ // -------------------------------------------------------------------------
+
+ /**
+ * Creates a new unix domain socket address.
+ *
+ * @param path The path to the socket.
+ * @throws NullPointerException If <i>path</i> is <tt>null</tt>.
+ */
+ public LocalSocketAddress (String path)
+ {
+ if (path == null)
+ {
+ throw new NullPointerException ();
+ }
+ this.path = path;
+ }
+
+ // Instance methods.
+ // -------------------------------------------------------------------------
+
+ /**
+ * Returns the path of the socket.
+ *
+ * @return The path.
+ */
+ public String getPath ()
+ {
+ return path;
+ }
+
+ public boolean equals (Object o)
+ {
+ if (!(o instanceof LocalSocketAddress))
+ {
+ return false;
+ }
+ return getPath ().equals (((LocalSocketAddress) o).getPath ());
+ }
+
+ public int hashCode ()
+ {
+ return path.hashCode();
+ }
+
+ public String toString ()
+ {
+ return super.toString() + " [ " + path + " ]";
+ }
+}
diff --git a/gnu/java/net/local/LocalSocketImpl.java b/gnu/java/net/local/LocalSocketImpl.java
new file mode 100644
index 000000000..f907e5f46
--- /dev/null
+++ b/gnu/java/net/local/LocalSocketImpl.java
@@ -0,0 +1,322 @@
+/* LocalSocketImpl.java -- a unix domain client socket implementation.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is a part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.net.local;
+
+import java.io.FileDescriptor;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.net.InetAddress;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.net.SocketImpl;
+
+final class LocalSocketImpl extends SocketImpl
+{
+
+ // Fields.
+ // -------------------------------------------------------------------------
+
+ private boolean created;
+ private InputStream in;
+ private OutputStream out;
+ private int socket_fd;
+ private LocalSocketAddress local;
+ private LocalSocketAddress remote;
+
+ static
+ {
+ try
+ {
+ System.loadLibrary ("javanet");
+ }
+ catch (Exception x)
+ {
+ x.printStackTrace ();
+ }
+ }
+
+ // Constructor.
+ // -------------------------------------------------------------------------
+
+ LocalSocketImpl ()
+ {
+ this (false);
+ }
+
+ LocalSocketImpl (boolean nocreate)
+ {
+ created = nocreate;
+ socket_fd = -1;
+ fd = new FileDescriptor ();
+ }
+
+ // Instance methods.
+ // -------------------------------------------------------------------------
+
+ public void setOption (int opt, Object value) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support options");
+ }
+
+ public Object getOption (int opt) throws SocketException
+ {
+ throw new SocketException ("local sockets do not support options");
+ }
+
+ protected native void create (boolean stream) throws IOException;
+ protected native void listen (int timeout) throws IOException;
+ protected native void accept (LocalSocketImpl socket) throws IOException;
+ protected native int available () throws IOException;
+ protected native void close () throws IOException;
+ protected native void sendUrgentData (int data) throws IOException;
+ protected native void shutdownInput () throws IOException;
+ protected native void shutdownOutput () throws IOException;
+
+ native void unlink () throws IOException;
+ native void localBind (LocalSocketAddress addr) throws IOException;
+ native void localConnect (LocalSocketAddress addr) throws IOException;
+ native int read (byte[] buf, int off, int len) throws IOException;
+ native void write (byte[] buf, int off, int len) throws IOException;
+
+ void doCreate () throws IOException
+ {
+ if (!created)
+ {
+ create (true);
+ }
+ }
+
+ LocalSocketAddress getLocalAddress ()
+ {
+ return local;
+ }
+
+ LocalSocketAddress getRemoteAddress ()
+ {
+ return remote;
+ }
+
+ protected InputStream getInputStream()
+ {
+ if (in == null)
+ {
+ in = new LocalInputStream (this);
+ }
+
+ return in;
+ }
+
+ protected OutputStream getOutputStream()
+ {
+ if (out == null)
+ {
+ out = new LocalOutputStream (this);
+ }
+
+ return out;
+ }
+
+ protected void accept (SocketImpl impl) throws IOException
+ {
+ if (! (impl instanceof LocalSocketImpl))
+ {
+ throw new IllegalArgumentException ("not a local socket");
+ }
+ accept ((LocalSocketImpl) impl);
+ }
+
+ protected void connect (String host, int port) throws IOException
+ {
+ throw new SocketException ("this is a local socket");
+ }
+
+ protected void connect (InetAddress addr, int port) throws IOException
+ {
+ throw new SocketException ("this is a local socket");
+ }
+
+ protected void connect(SocketAddress addr, int timeout) throws IOException
+ {
+ if (! (addr instanceof LocalSocketAddress))
+ {
+ throw new SocketException ("address is not local");
+ }
+ localConnect ((LocalSocketAddress) addr);
+ }
+
+ protected void bind (InetAddress addr, int port) throws IOException
+ {
+ throw new SocketException ("this is a local socket");
+ }
+
+ protected void bind (SocketAddress addr) throws IOException
+ {
+ if (! (addr instanceof LocalSocketAddress))
+ {
+ throw new SocketException ("address is not local");
+ }
+ localBind ((LocalSocketAddress) addr);
+ }
+
+ // Inner classes.
+ // -------------------------------------------------------------------------
+
+ class LocalInputStream extends InputStream
+ {
+
+ // Field.
+ // -----------------------------------------------------------------------
+
+ private final LocalSocketImpl impl;
+
+ // Constructor.
+ // -----------------------------------------------------------------------
+
+ LocalInputStream (LocalSocketImpl impl)
+ {
+ this.impl = impl;
+ }
+
+ // Instance methods.
+ // -----------------------------------------------------------------------
+
+ public int available () throws IOException
+ {
+ return impl.available();
+ }
+
+ public boolean markSupported ()
+ {
+ return false;
+ }
+
+ public void mark (int readLimit)
+ {
+ }
+
+ public void reset () throws IOException
+ {
+ throw new IOException ("mark/reset not supported");
+ }
+
+ public void close () throws IOException
+ {
+ impl.close();
+ }
+
+ public int read () throws IOException
+ {
+ byte[] buf = new byte[1];
+ int ret = read (buf);
+ if (ret != -1)
+ {
+ return buf[0] & 0xFF;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+
+ public int read (byte[] buf) throws IOException
+ {
+ return read (buf, 0, buf.length);
+ }
+
+ public int read (byte[] buf, int off, int len) throws IOException
+ {
+ int ret = impl.read (buf, off, len);
+
+ if (ret == 0)
+ {
+ return -1;
+ }
+
+ return ret;
+ }
+ }
+
+ class LocalOutputStream extends OutputStream
+ {
+
+ // Field.
+ // -----------------------------------------------------------------------
+
+ private final LocalSocketImpl impl;
+
+ // Constructor.
+ // -----------------------------------------------------------------------
+
+ LocalOutputStream (LocalSocketImpl impl)
+ {
+ this.impl = impl;
+ }
+
+ // Instance methods.
+ // -----------------------------------------------------------------------
+
+ public void close () throws IOException
+ {
+ impl.close ();
+ }
+
+ public void flush () throws IOException
+ {
+ }
+
+ public void write (int b) throws IOException
+ {
+ byte[] buf = new byte [1];
+ buf[0] = (byte) b;
+ write (buf);
+ }
+
+ public void write (byte[] buf) throws IOException
+ {
+ write (buf, 0, buf.length);
+ }
+
+ public void write (byte[] buf, int off, int len) throws IOException
+ {
+ impl.write (buf, off, len);
+ }
+ }
+}
diff --git a/gnu/java/net/protocol/ftp/FTPConnection.java b/gnu/java/net/protocol/ftp/FTPConnection.java
index d0f48727c..f5317d479 100644
--- a/gnu/java/net/protocol/ftp/FTPConnection.java
+++ b/gnu/java/net/protocol/ftp/FTPConnection.java
@@ -429,6 +429,9 @@ public class FTPConnection
public boolean changeWorkingDirectory(String path)
throws IOException
{
+ // Do nothing if the path is empty.
+ if (path.length() == 0)
+ return true;
String cmd = CWD + ' ' + path;
send(cmd);
FTPResponse response = getResponse();
diff --git a/gnu/java/net/protocol/http/HTTPURLConnection.java b/gnu/java/net/protocol/http/HTTPURLConnection.java
index 5300c664c..0dce7c75b 100644
--- a/gnu/java/net/protocol/http/HTTPURLConnection.java
+++ b/gnu/java/net/protocol/http/HTTPURLConnection.java
@@ -267,6 +267,8 @@ public class HTTPURLConnection
secure = false;
start = 7;
int end = location.indexOf('/', start);
+ if (end == -1)
+ end = location.length();
host = location.substring(start, end);
int ci = host.lastIndexOf(':');
if (ci != -1)
@@ -288,6 +290,8 @@ public class HTTPURLConnection
secure = true;
start = 8;
int end = location.indexOf('/', start);
+ if (end == -1)
+ end = location.length();
host = location.substring(start, end);
int ci = host.lastIndexOf(':');
if (ci != -1)
diff --git a/gnu/java/nio/ChannelReader.java b/gnu/java/nio/ChannelReader.java
index 44fe6625a..1e7372d2e 100644
--- a/gnu/java/nio/ChannelReader.java
+++ b/gnu/java/nio/ChannelReader.java
@@ -92,120 +92,126 @@ public class ChannelReader extends Reader
public int read(char[] buf, int offset, int count) throws IOException
{
- // I declared channel being null meaning that the reader is closed.
- if (!channel.isOpen())
- throw new IOException("Reader was already closed.");
-
- // I declared decoder being null meaning that there is no more data to read
- // and convert.
- if (decoder == null)
- return -1;
-
- // Stores the amount of character being read. It -1 so that if no conversion
- // occured the caller will see this as an 'end of file'.
- int sum = -1;
-
- // Copies any characters which may be left from the last invocation into the
- // destination array.
- if (charBuffer.remaining() > 0)
+ synchronized (lock)
{
- sum = Math.min(count, charBuffer.remaining());
- charBuffer.get(buf, offset, sum);
-
- // Updates the control variables according to the latest copy operation.
- offset += sum;
- count -= sum;
- }
-
- // Copies the character which have not been put in the destination array to
- // the beginning. If data is actually copied count will be 0. If no data is
- // copied count is >0 and we can now convert some more characters.
- charBuffer.compact();
-
- int converted = 0;
- boolean last = false;
-
- while (count != 0)
- {
- // Tries to convert some bytes (Which will intentionally fail in the
- // first place because we have not read any bytes yet.)
- CoderResult result = decoder.decode(byteBuffer, charBuffer, last);
- if (result.isMalformed() || result.isUnmappable())
- {
- // JDK throws exception when bytes are malformed for sure.
- // FIXME: Unsure what happens when a character is simply
- // unmappable.
- result.throwException();
- }
-
- // Marks that we should end this loop regardless whether the caller
- // wants more chars or not, when this was the last conversion.
- if (last)
+ // I declared channel being null meaning that the reader is closed.
+ if (!channel.isOpen())
+ throw new IOException("Reader was already closed.");
+
+ // I declared decoder being null meaning that there is no more data to read
+ // and convert.
+ if (decoder == null)
+ return -1;
+
+ // Stores the amount of character being read. It -1 so that if no conversion
+ // occured the caller will see this as an 'end of file'.
+ int sum = -1;
+
+ // Copies any characters which may be left from the last invocation into the
+ // destination array.
+ if (charBuffer.remaining() > 0)
{
- decoder = null;
+ sum = Math.min(count, charBuffer.remaining());
+ charBuffer.get(buf, offset, sum);
+
+ // Updates the control variables according to the latest copy operation.
+ offset += sum;
+ count -= sum;
}
- else if (result.isUnderflow())
+
+ // Copies the character which have not been put in the destination array to
+ // the beginning. If data is actually copied count will be 0. If no data is
+ // copied count is >0 and we can now convert some more characters.
+ charBuffer.compact();
+
+ int converted = 0;
+ boolean last = false;
+
+ while (count != 0)
{
- // We need more bytes to do the conversion.
-
- // Copies the not yet converted bytes to the beginning making it
- // being able to receive more bytes.
- byteBuffer.compact();
-
- // Reads in another bunch of bytes for being converted.
- if (channel.read(byteBuffer) == -1)
+ // Tries to convert some bytes (Which will intentionally fail in the
+ // first place because we have not read any bytes yet.)
+ CoderResult result = decoder.decode(byteBuffer, charBuffer, last);
+ if (result.isMalformed() || result.isUnmappable())
{
- // If there is no more data available in the channel we mark
- // that state for the final character conversion run which is
- // done in the next loop iteration.
- last = true;
+ // JDK throws exception when bytes are malformed for sure.
+ // FIXME: Unsure what happens when a character is simply
+ // unmappable.
+ result.throwException();
}
-
- // Prepares the byteBuffer for the next character conversion run.
- byteBuffer.flip();
+
+ // Marks that we should end this loop regardless whether the caller
+ // wants more chars or not, when this was the last conversion.
+ if (last)
+ {
+ decoder = null;
+ }
+ else if (result.isUnderflow())
+ {
+ // We need more bytes to do the conversion.
+
+ // Copies the not yet converted bytes to the beginning making it
+ // being able to receive more bytes.
+ byteBuffer.compact();
+
+ // Reads in another bunch of bytes for being converted.
+ if (channel.read(byteBuffer) == -1)
+ {
+ // If there is no more data available in the channel we mark
+ // that state for the final character conversion run which is
+ // done in the next loop iteration.
+ last = true;
+ }
+
+ // Prepares the byteBuffer for the next character conversion run.
+ byteBuffer.flip();
+ }
+
+ // Prepares the charBuffer for being drained.
+ charBuffer.flip();
+
+ converted = Math.min(count, charBuffer.remaining());
+ charBuffer.get(buf, offset, converted);
+
+ // Copies characters which have not yet being copied into the char-Array
+ // to the beginning making it possible to read them later (If data is
+ // really copied here, then the caller has received enough characters so
+ // far.).
+ charBuffer.compact();
+
+ // Updates the control variables according to the latest copy operation.
+ offset += converted;
+ count -= converted;
+
+ // Updates the amount of transferred characters.
+ sum += converted;
+
+ if (decoder == null)
+ {
+ break;
+ }
+
+ // Now that more characters have been transfered we let the loop decide
+ // what to do next.
}
-
- // Prepares the charBuffer for being drained.
+
+ // Makes the charBuffer ready for reading on the next invocation.
charBuffer.flip();
-
- converted = Math.min(count, charBuffer.remaining());
- charBuffer.get(buf, offset, converted);
-
- // Copies characters which have not yet being copied into the char-Array
- // to the beginning making it possible to read them later (If data is
- // really copied here, then the caller has received enough characters so
- // far.).
- charBuffer.compact();
-
- // Updates the control variables according to the latest copy operation.
- offset += converted;
- count -= converted;
-
- // Updates the amount of transferred characters.
- sum += converted;
-
- if (decoder == null)
- {
- break;
- }
-
- // Now that more characters have been transfered we let the loop decide
- // what to do next.
+
+ return sum;
}
-
- // Makes the charBuffer ready for reading on the next invocation.
- charBuffer.flip();
-
- return sum;
}
public void close() throws IOException
{
- channel.close();
+ synchronized (lock)
+ {
+ channel.close();
- // Makes sure all intermediate data is released by the decoder.
- if (decoder != null)
- decoder.reset();
+ // Makes sure all intermediate data is released by the decoder.
+ if (decoder != null)
+ decoder.reset();
+ }
}
}
diff --git a/gnu/java/nio/ChannelWriter.java b/gnu/java/nio/ChannelWriter.java
new file mode 100644
index 000000000..8e533ccbf
--- /dev/null
+++ b/gnu/java/nio/ChannelWriter.java
@@ -0,0 +1,190 @@
+/* ChannelWriter.java -- nio / writer bridge
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.nio;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.channels.WritableByteChannel;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CoderResult;
+
+/**
+ * A Writer implementation that works by wrapping an NIO channel.
+ */
+public class ChannelWriter
+ extends Writer
+{
+ private static final int DEFAULT_BUFFER_CAP = 8192;
+
+ /**
+ * The output channel.
+ */
+ private WritableByteChannel byteChannel;
+
+ /**
+ * The encoder to use.
+ */
+ private CharsetEncoder enc;
+
+ /**
+ * The byte buffer. Translated characters are stored here on their way out.
+ */
+ private ByteBuffer byteBuffer;
+
+ /**
+ * The character buffer. Characters are stored here on their way into
+ * the encoder.
+ */
+ private CharBuffer charBuffer;
+
+ private void writeBuffer() throws IOException
+ {
+ byteBuffer.flip();
+ byteChannel.write(byteBuffer);
+ }
+
+ /**
+ * Create a new instance, given the output byte channel, the encoder
+ * to use, and the minimum buffer capacity.
+ */
+ public ChannelWriter(WritableByteChannel ch, CharsetEncoder enc,
+ int minBufferCap)
+ {
+ this.byteChannel = ch;
+ this.enc = enc;
+ if (minBufferCap == -1)
+ minBufferCap = DEFAULT_BUFFER_CAP;
+ this.byteBuffer
+ = ByteBuffer.allocate((int) (minBufferCap * enc.maxBytesPerChar()));
+ this.charBuffer = CharBuffer.allocate(minBufferCap);
+ this.charBuffer.clear();
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.Writer#flush()
+ */
+ public void flush() throws IOException
+ {
+ // Presumably if we have characters in our buffer, it is
+ // due to an underflow. So we don't bother trying to flush
+ // that here.
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.Writer#close()
+ */
+ public void close() throws IOException
+ {
+ synchronized (lock)
+ {
+ if (enc == null)
+ throw new IOException("writer already closed");
+
+ byteBuffer.clear();
+ charBuffer.flip();
+ CoderResult res = enc.encode(charBuffer, byteBuffer, true);
+ if (res.isError() || res.isMalformed() || res.isUnmappable())
+ res.throwException();
+ writeBuffer();
+
+ byteBuffer.clear();
+ res = enc.flush(byteBuffer);
+ if (res.isError() || res.isMalformed() || res.isUnmappable())
+ res.throwException();
+ writeBuffer();
+ enc = null;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.Writer#write(char[], int, int)
+ */
+ public void write(char[] buf, int offset, int len) throws IOException
+ {
+ synchronized (lock)
+ {
+ if (enc == null)
+ throw new IOException("writer already closed");
+ int lastLen = -1;
+ while (len > 0)
+ {
+ // Copy data into our character buffer.
+ int allowed = Math.min(charBuffer.remaining(), len);
+ charBuffer.put(buf, offset, allowed);
+ // Update for the next pass through the loop.
+ offset += allowed;
+ len -= allowed;
+ charBuffer.flip();
+ // If we didn't make any progress, we want to clean up
+ // and save our state for the next write().
+ if (len == lastLen)
+ {
+ if (len <= charBuffer.remaining())
+ {
+ charBuffer.put(buf, offset, len);
+ charBuffer.flip();
+ }
+ else
+ {
+ CharBuffer ncb = CharBuffer.allocate(charBuffer.length()
+ + len);
+ ncb.put(charBuffer);
+ ncb.put(buf, offset, len);
+ charBuffer = ncb;
+ }
+ break;
+ }
+ lastLen = len;
+
+ // Convert.
+ byteBuffer.clear();
+ CoderResult res = enc.encode(charBuffer, byteBuffer, false);
+ // Compact here, as we want to leave the buffer in the
+ // right state for any future put()s.
+ charBuffer.compact();
+ if (res.isError() || res.isMalformed() || res.isUnmappable())
+ res.throwException();
+ // Write the byte buffer to the output channel.
+ writeBuffer();
+ }
+ }
+ }
+}
diff --git a/gnu/java/rmi/activation/ActivationSystemTransient.java b/gnu/java/rmi/activation/ActivationSystemTransient.java
index 65e5bde63..1557220e1 100644
--- a/gnu/java/rmi/activation/ActivationSystemTransient.java
+++ b/gnu/java/rmi/activation/ActivationSystemTransient.java
@@ -1,4 +1,4 @@
-/* DefaultActivationSystem.java -- FIXME: briefly describe file purpose
+/* ActivationSystemTransient.java -- The transient RMI object activation system.
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -49,6 +49,7 @@ import java.rmi.activation.ActivationID;
import java.rmi.activation.ActivationInstantiator;
import java.rmi.activation.ActivationMonitor;
import java.rmi.activation.ActivationSystem;
+import java.rmi.activation.Activator;
import java.rmi.activation.UnknownGroupException;
import java.rmi.activation.UnknownObjectException;
import java.util.HashMap;
@@ -63,28 +64,28 @@ import java.util.Map;
*/
public class ActivationSystemTransient
extends DefaultActivationSystem
- implements ActivationSystem, ActivationMonitor
+ implements ActivationSystem, ActivationMonitor, Activator
{
/**
* Maps group identifiers into group descriptions.
*/
- BidiTable groupDescs = new BidiTable();
+ protected final BidiTable groupDescs;
/**
* Maps object identifiers into object activation descriptions
*/
- BidiTable descriptions = new BidiTable();
+ protected final BidiTable descriptions;
/**
- * Maps group descriptions into group object instantiators.
+ * Maps group identifiers into already activated groups.
*/
- Map groupInstantiators = new Hashtable();
+ protected transient final Map groupInstantiators = new Hashtable();
/**
* The cache of the activated objects, maps activation ids to remote
* object stubs.
*/
- Map activatedObjects = new HashMap();
+ protected transient final Map activatedObjects = new HashMap();
/**
* The object incarnation counter.
@@ -99,13 +100,25 @@ public class ActivationSystemTransient
/**
* Set to true to print the event messages to console.
*/
- static boolean debug = false;
+ public static boolean debug = false;
+
+
+ /**
+ * Creates the group which uses the given maps to store the data.
+ */
+ protected ActivationSystemTransient(BidiTable objectDescriptions,
+ BidiTable groupDescriptiopns)
+ {
+ descriptions = objectDescriptions;
+ groupDescs = groupDescriptiopns;
+ }
/**
- * This group should not be instantiated outside the group code.
+ * Creates the group with transient maps.
*/
- private ActivationSystemTransient()
+ protected ActivationSystemTransient()
{
+ this (new BidiTable(), new BidiTable());
}
public static ActivationSystem getInstance()
@@ -133,7 +146,8 @@ public class ActivationSystemTransient
ActivationDesc desc = (ActivationDesc) descriptions.get(id);
if (desc == null)
- throw new UnknownObjectException(id == null ? "null" : id.toString());
+ throw new UnknownObjectException("Activating unknown object "+
+ id == null ? "null" : id.toString());
ActivationInstantiator group =
(ActivationInstantiator) groupInstantiators.get(desc.getGroupID());
@@ -145,8 +159,8 @@ public class ActivationSystemTransient
ActivationGroupDesc adesc = (ActivationGroupDesc) groupDescs.get(gid);
if (adesc == null)
- throw new UnknownGroupException("Unknown group, " + gid + " for "
- + id+" this "+this);
+ throw new UnknownGroupException("Activating unknown group "
+ + gid + " for "+ id+" this "+this);
synchronized (ActivationSystemTransient.class)
{
@@ -190,7 +204,8 @@ public class ActivationSystemTransient
{
ActivationDesc desc = (ActivationDesc) descriptions.get(id);
if (desc == null)
- throw new UnknownObjectException(id == null ? "null" : id.toString());
+ throw new UnknownObjectException("No desc for "+
+ id == null ? "null" : id.toString());
return desc;
}
@@ -279,11 +294,13 @@ public class ActivationSystemTransient
}
/**
- * No action.
+ * Calls .shutdown on all bidirectional tables (has no effect if these
+ * table are not persistent).
*/
public void shutdown() throws RemoteException
{
- // Nothing to do.
+ descriptions.shutdown();
+ groupDescs.shutdown();
}
/**
diff --git a/gnu/java/rmi/activation/BidiTable.java b/gnu/java/rmi/activation/BidiTable.java
index 0a8d895f3..5e421fe8d 100644
--- a/gnu/java/rmi/activation/BidiTable.java
+++ b/gnu/java/rmi/activation/BidiTable.java
@@ -38,7 +38,10 @@ exception statement from your version. */
package gnu.java.rmi.activation;
-import java.util.Hashtable;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
/**
* The bidirectional hash table, maps both a to b and b to a.
@@ -55,17 +58,36 @@ public class BidiTable
/**
* Maps keys to values
*/
- Hashtable k2v = new Hashtable();
+ protected Map k2v;
/**
* Maps values to keys (in reverse)
*/
- Hashtable v2k = new Hashtable();
+ protected Map v2k;
+
+ /**
+ * Create a new table that is ready to use.
+ */
+ public BidiTable()
+ {
+ k2v = new HashMap();
+ v2k = new HashMap();
+ }
+
+ /**
+ * Create a new instance where the hashtable fields are not initialised
+ * (called from derivatives that intialise hashtables in they own way.
+ *
+ * @param flags currently used to mark the different constructor only.
+ */
+ protected BidiTable(int flags)
+ {
+ }
/**
* Get key by value
*/
- Object getKey(Object value)
+ public synchronized Object getKey(Object value)
{
return v2k.get(value);
}
@@ -73,7 +95,7 @@ public class BidiTable
/**
* Put key-value pair.
*/
- public void put(Object key, Object value)
+ public synchronized void put(Object key, Object value)
{
k2v.put(key, value);
v2k.put(value, key);
@@ -82,7 +104,7 @@ public class BidiTable
/**
* Get value from key
*/
- public Object get(Object key)
+ public synchronized Object get(Object key)
{
return k2v.get(key);
}
@@ -90,7 +112,7 @@ public class BidiTable
/**
* Remove the key-value pair by key
*/
- public void removeKey(Object key)
+ public synchronized void removeKey(Object key)
{
Object value = k2v.get(key);
if (value!=null)
@@ -103,9 +125,39 @@ public class BidiTable
/**
* Check if the table contains this key.
*/
- public boolean containsKey(Object key)
+ public synchronized boolean containsKey(Object key)
{
return k2v.containsKey(key);
}
+ /**
+ * This method is called before exit and may be used to write the database
+ * to the disk. The default method does nothing.
+ */
+ public synchronized void shutdown()
+ {
+ }
+
+ /**
+ * Get the size.
+ */
+ public synchronized int size()
+ {
+ return k2v.size();
+ }
+
+ /**
+ * Get the key collection.
+ */
+ public synchronized Object[] keys()
+ {
+ Collection keys = k2v.keySet();
+ Object[] k = new Object[keys.size()];
+
+ Iterator iter = keys.iterator();
+ for (int i = 0; i < k.length; i++)
+ k[i] = iter.next();
+
+ return k;
+ }
}
diff --git a/gnu/java/rmi/activation/DefaultActivationGroup.java b/gnu/java/rmi/activation/DefaultActivationGroup.java
index 95c5a4139..3a654f246 100644
--- a/gnu/java/rmi/activation/DefaultActivationGroup.java
+++ b/gnu/java/rmi/activation/DefaultActivationGroup.java
@@ -55,7 +55,8 @@ import java.rmi.activation.UnknownObjectException;
/**
* The default activation group class. This activation group assumes that
* all classes are accessible via current thread context class loader.
- * The remote class loading is not supported for security reasons.
+ * The remote class loading is not supported for security reasons. The
+ * activation always occurs in the current jre.
*
* @author Audrius Meskauskas (audriusa@Bioinformatics.org)
*/
@@ -120,6 +121,9 @@ public class DefaultActivationGroup
{
try
{
+ if (ActivationSystemTransient.debug)
+ System.out.println("Instantiating "+desc.getClassName());
+
Remote object;
Class objectClass;
diff --git a/gnu/java/rmi/activation/DefaultActivationSystem.java b/gnu/java/rmi/activation/DefaultActivationSystem.java
index 75fb45160..754b5dcb9 100644
--- a/gnu/java/rmi/activation/DefaultActivationSystem.java
+++ b/gnu/java/rmi/activation/DefaultActivationSystem.java
@@ -39,19 +39,80 @@ exception statement from your version. */
package gnu.java.rmi.activation;
import java.rmi.activation.ActivationSystem;
-import java.rmi.activation.Activator;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
/**
- * The default activation system for this jre.
+ * Finds and returns the default activation system for this jre.
*
- * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
*/
public abstract class DefaultActivationSystem
- implements ActivationSystem, Activator
{
/**
- * The singleton instance of the default activation system.
+ * The activation system (assigned if once found).
*/
- public static final ActivationSystem singleton
- = ActivationSystemTransient.getInstance();
+ static ActivationSystem system;
+
+ /**
+ * The default activation registry port.
+ */
+ static int ACTIVATION_REGISTRY_PORT;
+
+ /**
+ * The name of the activation system registry port property.
+ */
+ static String AS_PORT_PROPERTY = "java.rmi.activation.port";
+
+ /**
+ * The defalut name of the activation system in the activation registry.
+ */
+ static String ACTIVATION_SYSTEM_NAME = "java.rmi.activation.ActivationSystem";
+
+ /**
+ * Get the activation system, default for this jre. If no external activation
+ * system exists, the internal activation system will be activated. This
+ * internal system is limited in capabilities and should be used exclusively
+ * for automated testing, to avoid necessity of starting rmi daemon during
+ * testing process.
+ */
+ public static ActivationSystem get()
+ {
+ if (system == null)
+ try
+ {
+ // Obtain the port:
+ String asr = System.getProperty("java.rmi.activation.port");
+
+ if (asr != null)
+ {
+ try
+ {
+ ACTIVATION_REGISTRY_PORT = Integer.parseInt(asr);
+ if (ACTIVATION_REGISTRY_PORT <= 0)
+ throw new InternalError("Invalid " + asr + " value, "
+ + ACTIVATION_REGISTRY_PORT);
+ }
+ catch (NumberFormatException e)
+ {
+ throw new InternalError("Unable to parse " + asr
+ + " to integer");
+ }
+ }
+ else
+ ACTIVATION_REGISTRY_PORT = ActivationSystem.SYSTEM_PORT;
+
+ // Expect the naming service running first.
+ // The local host may want to use the shared registry
+ Registry r = LocateRegistry.getRegistry(ACTIVATION_REGISTRY_PORT);
+ ActivationSystem system = (ActivationSystem) r.lookup(ACTIVATION_SYSTEM_NAME);
+ return system;
+ }
+ catch (Exception ex)
+ {
+ system = ActivationSystemTransient.getInstance();
+ }
+
+ return system;
+ }
}
diff --git a/gnu/java/rmi/dgc/LeaseRenewingTask.java b/gnu/java/rmi/dgc/LeaseRenewingTask.java
index 7e3bb258b..ffb5560af 100644
--- a/gnu/java/rmi/dgc/LeaseRenewingTask.java
+++ b/gnu/java/rmi/dgc/LeaseRenewingTask.java
@@ -110,9 +110,12 @@ public class LeaseRenewingTask
*/
public LeaseRenewingTask(UnicastRef renewIt)
{
- ref.add(new WeakReference(renewIt));
lease = notifyDGC(renewIt);
- schedule(lease);
+ if (lease != null)
+ {
+ schedule(lease);
+ ref.add(new WeakReference(renewIt));
+ }
}
/**
@@ -122,6 +125,9 @@ public class LeaseRenewingTask
*/
public static void scheduleLeases(UnicastRef renewIt)
{
+ // No need to schedule leases for null.
+ if (renewIt == null)
+ return;
try {
synchronized (existingTasks)
{
@@ -144,7 +150,9 @@ public class LeaseRenewingTask
}
catch (Exception ex)
{
- ex.printStackTrace();
+ InternalError ierr = new InternalError("Lease for "+renewIt);
+ ierr.initCause(ex);
+ throw ierr;
}
}
diff --git a/gnu/java/rmi/server/ActivatableRef.java b/gnu/java/rmi/server/ActivatableRef.java
new file mode 100644
index 000000000..d191c0c17
--- /dev/null
+++ b/gnu/java/rmi/server/ActivatableRef.java
@@ -0,0 +1,175 @@
+/* ActivatableRef.java -- Activatable server reference
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.rmi.server;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.activation.ActivationException;
+import java.rmi.activation.ActivationID;
+import java.rmi.server.ObjID;
+import java.rmi.server.RMIClientSocketFactory;
+import java.rmi.server.RemoteObject;
+import java.rmi.server.RemoteObjectInvocationHandler;
+import java.rmi.server.RemoteRef;
+
+/**
+ * The activatable reference works like UnicastRef, but if the remote object
+ * appears to be not accessible, it tries to reactivate it before reporting
+ * any errors. Apart the fields of the UnicastRef, the activatable reference
+ * contains the ActivationID that is used for this activation.
+ *
+ * @author Audrius Meskauskas (Audriusa@Bioinformatics.org)
+ */
+public class ActivatableRef extends UnicastRef
+{
+ /**
+ * Use serial version UID for iteroperability
+ */
+ private static final long serialVersionUID = 1;
+
+ /**
+ * The activation id.
+ */
+ ActivationID actId;
+
+ /**
+ * Delegate call to the superclass.
+ */
+ public ActivatableRef()
+ {
+ super();
+ }
+
+ /**
+ * Delegate call to the superclass.
+ */
+ public ActivatableRef(ObjID objid, String host, int port,
+ RMIClientSocketFactory csf)
+ {
+ super(objid, host, port, csf);
+ }
+
+ /**
+ * Delegate call to the superclass.
+ */
+ public ActivatableRef(ObjID objid)
+ {
+ super(objid);
+ }
+
+ /**
+ * Get the referencing class.
+ */
+ public String getRefClass(ObjectOutput out)
+ {
+ return "ActivatableRef";
+ }
+
+ /**
+ * Read the content from the input stream.
+ */
+ public void readExternal(ObjectInput in) throws IOException,
+ ClassNotFoundException
+ {
+ super.readExternal(in);
+ actId = (ActivationID) in.readObject();
+ }
+
+ /**
+ * Write the content to the output stream.
+ */
+ public void writeExternal(ObjectOutput out) throws IOException
+ {
+ super.writeExternal(out);
+ out.writeObject(actId);
+ }
+
+ /**
+ * Invoke the remote method on the given object and try to activate the object
+ * if it is not reacheable with the current manager.
+ */
+ protected Object invokeCommon(Remote obj, Method method, Object[] params,
+ int opnum, long hash) throws Exception
+ {
+ UnicastConnection conn;
+ try
+ {
+ conn = manager.getConnection();
+ }
+ catch (IOException e1)
+ {
+ // Connection failed: try to activate.
+ Remote reactivated = actId.activate(false);
+
+ if (reactivated instanceof RemoteObject)
+ {
+ RemoteRef ref = ((RemoteObject) reactivated).getRef();
+ manager = ((UnicastRef) ref).manager;
+ }
+ else if (Proxy.isProxyClass(reactivated.getClass()))
+ {
+ RemoteObjectInvocationHandler hander =
+ (RemoteObjectInvocationHandler)
+ Proxy.getInvocationHandler(reactivated);
+
+ RemoteRef ref = hander.getRef();
+ manager = ((UnicastRef) ref).manager;
+ }
+ else
+ throw new ActivationException("Activating into unsupported class "
+ + reactivated.getClass());
+
+ try
+ {
+ conn = manager.getConnection();
+ }
+ catch (IOException e2)
+ {
+ throw new RemoteException("connection failed to host: "
+ + manager.serverName, e1);
+ }
+ }
+ return invokeCommon(conn, obj, method, params, opnum, hash);
+ }
+}
diff --git a/gnu/java/rmi/server/ActivatableServerRef.java b/gnu/java/rmi/server/ActivatableServerRef.java
index 6463f40d2..09595ec5f 100644
--- a/gnu/java/rmi/server/ActivatableServerRef.java
+++ b/gnu/java/rmi/server/ActivatableServerRef.java
@@ -38,11 +38,16 @@ exception statement from your version. */
package gnu.java.rmi.server;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.activation.ActivationID;
import java.rmi.server.ObjID;
import java.rmi.server.RMIServerSocketFactory;
+import java.rmi.server.RemoteStub;
+import java.rmi.server.Skeleton;
/**
* The activatable server reference works like UnicastServerReference, but it
@@ -117,7 +122,7 @@ public class ActivatableServerRef extends UnicastServerRef
catch (Exception exc)
{
RemoteException rx = new RemoteException("Activation failed.");
- rx.initCause(exc);
+ rx.detail = exc;
throw rx;
}
}
@@ -143,4 +148,80 @@ public class ActivatableServerRef extends UnicastServerRef
UnicastServer.registerActivatable(this);
return r;
}
+
+ /**
+ * Export object and ensure it is present in the server activation table as
+ * well.
+ *
+ * @param aClass the class being exported, must implement Remote.
+ */
+ public Remote exportClass(Class aClass) throws RemoteException
+ {
+ if (!Remote.class.isAssignableFrom(aClass))
+ throw new InternalError(aClass.getName()+" must implement Remote");
+
+ String ignoreStubs;
+
+ ClassLoader loader =aClass.getClassLoader();
+
+ // Stubs are always searched for the bootstrap classes that may have
+ // obsolete pattern and may still need also skeletons.
+ if (loader==null)
+ ignoreStubs = "false";
+ else
+ ignoreStubs = System.getProperty("java.rmi.server.ignoreStubClasses",
+ "false");
+
+ if (! ignoreStubs.equals("true"))
+ {
+ // Find and install the stub
+ Class cls = aClass;
+
+ // where ist the _Stub? (check superclasses also)
+ Class expCls = expCls = findStubSkelClass(cls);
+
+ if (expCls != null)
+ {
+ stub = (RemoteStub) getHelperClass(expCls, "_Stub");
+ // Find and install the skeleton (if there is one)
+ skel = (Skeleton) getHelperClass(expCls, "_Skel");
+ }
+ }
+
+ if (stub == null)
+ stub = createProxyStub(aClass, this);
+
+ // Build hash of methods which may be called.
+ buildMethodHash(aClass, true);
+
+ UnicastServer.registerActivatable(this);
+ return stub;
+ }
+
+ /**
+ * Get the referencing class.
+ */
+ public String getRefClass(ObjectOutput out)
+ {
+ return "ActivatableRef";
+ }
+
+ /**
+ * Read the content from the input stream.
+ */
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
+ {
+ super.readExternal(in);
+ actId = (ActivationID) in.readObject();
+ }
+
+ /**
+ * Write the content to the output stream.
+ */
+ public void writeExternal(ObjectOutput out) throws IOException
+ {
+ super.writeExternal(out);
+ out.writeObject(actId);
+ }
+
}
diff --git a/gnu/java/rmi/server/CombinedClassLoader.java b/gnu/java/rmi/server/CombinedClassLoader.java
index efffda4c6..6225fb30b 100644
--- a/gnu/java/rmi/server/CombinedClassLoader.java
+++ b/gnu/java/rmi/server/CombinedClassLoader.java
@@ -77,7 +77,7 @@ public class CombinedClassLoader extends ClassLoader
while (iter.hasNext())
{
cl = iter.next();
- if (!sLoaders.contains(cl))
+ if (cl!=null && !sLoaders.contains(cl))
sLoaders.add(cl);
}
diff --git a/gnu/java/rmi/server/UnicastConnectionManager.java b/gnu/java/rmi/server/UnicastConnectionManager.java
index 08f6a9bc3..9715d4a31 100644
--- a/gnu/java/rmi/server/UnicastConnectionManager.java
+++ b/gnu/java/rmi/server/UnicastConnectionManager.java
@@ -311,6 +311,14 @@ private UnicastConnection getClientConnection() throws IOException {
}
/**
+ * Get the string representation, describing the connection.
+ */
+public String toString()
+{
+ return serverName+":"+serverPort+" ("+serverobj+")";
+}
+
+/**
* Discard a connection when we're done with it - maybe it can be
* recycled.
*/
@@ -443,4 +451,12 @@ public boolean equals(Object obj) {
return (false);
}
+ /**
+ * Get the string representation, describing the connection.
+ */
+ public String toString()
+ {
+ return host+":"+port+" ("+other+")";
+ }
+
}
diff --git a/gnu/java/rmi/server/UnicastRef.java b/gnu/java/rmi/server/UnicastRef.java
index 907f4a51d..def1acdcf 100644
--- a/gnu/java/rmi/server/UnicastRef.java
+++ b/gnu/java/rmi/server/UnicastRef.java
@@ -251,21 +251,34 @@ public class UnicastRef
return (Lease) returnval;
}
-
- private Object invokeCommon(Remote obj, Method method, Object[] params,
- int opnum, long hash) throws Exception
+ /**
+ * Invoke the remote method on the given object. This part is overridden by
+ * the activatable objects.
+ */
+ protected Object invokeCommon(Remote obj, Method method, Object[] params,
+ int opnum, long hash) throws Exception
{
UnicastConnection conn;
try
{
conn = manager.getConnection();
+ return invokeCommon(conn, obj, method, params, opnum, hash);
}
catch (IOException e1)
{
throw new RemoteException("connection failed to host: "
+ manager.serverName, e1);
}
+ }
+ /**
+ * Invoke the remote method on the given object when connection is already
+ * established.
+ */
+ protected Object invokeCommon(UnicastConnection conn, Remote obj,
+ Method method, Object[] params, int opnum,
+ long hash) throws Exception
+ {
ObjectOutputStream out;
DataOutputStream dout;
try
@@ -326,7 +339,7 @@ public class UnicastRef
else
{
returnval = ((RMIObjectInputStream) in).readValue(cls); // get
- // returnvalue
+ // returnvalue
}
}
catch (IOException e3)
@@ -448,10 +461,16 @@ public class UnicastRef
{
return ("UnicastRef");
}
-
+
+ /**
+ * Return the string representing the remote reference information.
+ */
public String remoteToString()
{
- throw new Error("Not implemented");
+ if (manager!=null)
+ return manager.toString();
+ else
+ return "null manager";
}
public void dump(UnicastConnection conn)
diff --git a/gnu/java/rmi/server/UnicastServer.java b/gnu/java/rmi/server/UnicastServer.java
index 3b06984aa..7fe539546 100644
--- a/gnu/java/rmi/server/UnicastServer.java
+++ b/gnu/java/rmi/server/UnicastServer.java
@@ -244,7 +244,12 @@ public class UnicastServer
throw new Exception("bad method type");
}
}
-
+
+ /**
+ * This method is invoked when the remote call is received. The method
+ * dispatches the call to the responsible object, connected to this
+ * server via UnicastServerReference.
+ */
private static void incomingMessageCall(UnicastConnection conn)
throws IOException
{
@@ -282,14 +287,14 @@ public class UnicastServer
catch (Error e)
{
returnval = new ServerError(
- "An Error is thrown while processing the invocation on the server",
- e);
+ "Server error, ObjID: " + objid +
+ ", method: " + method + ", hash: "+ hash, e);
returncode = RETURN_NACK;
}
}
else
{
- returnval = new NoSuchObjectException("");
+ returnval = new NoSuchObjectException("ObjID: " + objid);
returncode = RETURN_NACK;
}
diff --git a/gnu/java/rmi/server/UnicastServerRef.java b/gnu/java/rmi/server/UnicastServerRef.java
index 577dae157..cd891a1aa 100644
--- a/gnu/java/rmi/server/UnicastServerRef.java
+++ b/gnu/java/rmi/server/UnicastServerRef.java
@@ -84,18 +84,18 @@ public class UnicastServerRef
/**
* The skeleton (if any), associated with the exported remote object.
*/
- private Skeleton skel;
+ protected Skeleton skel;
/**
* The stub, associated with the exported remote object (may be proxy class).
*/
- private Remote stub;
+ protected Remote stub;
/**
* The method table (RMI hash code to method) of the methods of the
* exported object.
*/
- private Hashtable methods = new Hashtable();
+ protected Hashtable methods = new Hashtable();
/**
* Used by serialization.
@@ -205,7 +205,7 @@ public class UnicastServerRef
*
* @return the class having stub defined, null if none.
*/
- private Class findStubSkelClass(Class startCls)
+ protected Class findStubSkelClass(Class startCls)
{
Class cls = startCls;
@@ -245,7 +245,7 @@ public class UnicastServerRef
* @return the instantiated instance of the helper class or null if the
* helper class cannot be found or instantiated.
*/
- private Object getHelperClass(Class cls, String type)
+ protected Object getHelperClass(Class cls, String type)
{
try
{
@@ -313,7 +313,7 @@ public class UnicastServerRef
* @param build if true, the class methods are added to the table. If
* false, they are removed from the table.
*/
- private void buildMethodHash(Class cls, boolean build)
+ protected void buildMethodHash(Class cls, boolean build)
{
Method[] meths = cls.getMethods();
for (int i = 0; i < meths.length; i++)
@@ -360,7 +360,8 @@ public class UnicastServerRef
// meth);
if (meth == null)
{
- throw new NoSuchMethodException();
+ throw new NoSuchMethodException(
+ myself.getClass().getName()+" hash "+hash);
}
ObjectInputStream in = conn.getObjectInputStream();
@@ -420,9 +421,8 @@ public class UnicastServerRef
else
{
if (skel == null)
- {
- throw new NoSuchMethodException();
- }
+ throw new NoSuchMethodException("JDK 1.1 call - Skeleton required");
+
UnicastRemoteCall call = new UnicastRemoteCall(conn);
skel.dispatch(myself, call, method, hash);
if (! call.isReturnValue())
diff --git a/gnu/java/security/Engine.java b/gnu/java/security/Engine.java
index 4b6bd10d9..f3be45075 100644
--- a/gnu/java/security/Engine.java
+++ b/gnu/java/security/Engine.java
@@ -166,6 +166,7 @@ public final class Engine
ClassLoader loader = provider.getClass().getClassLoader();
Constructor constructor = null;
String error = algorithm;
+ Throwable cause;
try
{
@@ -179,29 +180,38 @@ public final class Engine
catch (ClassNotFoundException cnfe)
{
error = "class not found: " + algorithm;
+ cause = cnfe;
}
catch (IllegalAccessException iae)
{
error = "illegal access: " + iae.getMessage();
+ cause = iae;
}
catch (InstantiationException ie)
{
error = "instantiation exception: " + ie.getMessage();
+ cause = ie;
}
catch (ExceptionInInitializerError eiie)
{
error = "exception in initializer: " + eiie.getMessage();
+ cause = eiie;
}
catch (SecurityException se)
{
error = "security exception: " + se.getMessage();
+ cause = se;
}
catch (NoSuchMethodException nsme)
{
error = "no appropriate constructor found";
+ cause = nsme;
}
- throw new NoSuchAlgorithmException(error);
+ NoSuchAlgorithmException nsae = new NoSuchAlgorithmException(error);
+ nsae.initCause(cause);
+
+ throw nsae;
}
// Own methods.
diff --git a/gnu/java/security/Properties.java b/gnu/java/security/Properties.java
index 813888c20..860b7d928 100644
--- a/gnu/java/security/Properties.java
+++ b/gnu/java/security/Properties.java
@@ -333,9 +333,9 @@ public final class Properties
handleBooleanProperty(DO_RSA_BLINDING);
// re-sync the 'known' properties
- reproducible = new Boolean((String) props.get(REPRODUCIBLE_PRNG)).booleanValue();
- checkForWeakKeys = new Boolean((String) props.get(CHECK_WEAK_KEYS)).booleanValue();
- doRSABlinding = new Boolean((String) props.get(DO_RSA_BLINDING)).booleanValue();
+ reproducible = Boolean.valueOf((String) props.get(REPRODUCIBLE_PRNG)).booleanValue();
+ checkForWeakKeys = Boolean.valueOf((String) props.get(CHECK_WEAK_KEYS)).booleanValue();
+ doRSABlinding = Boolean.valueOf((String) props.get(DO_RSA_BLINDING)).booleanValue();
// This does not change.
props.put(VERSION, Registry.VERSION_STRING);
diff --git a/gnu/java/security/Registry.java b/gnu/java/security/Registry.java
index efb54e714..0cb925135 100644
--- a/gnu/java/security/Registry.java
+++ b/gnu/java/security/Registry.java
@@ -159,6 +159,9 @@ public interface Registry
// Padding scheme names and synonyms........................................
+ /** PKCS#5 padding scheme. */
+ String PKCS5_PAD = "pkcs5";
+
/** PKCS#7 padding scheme. */
String PKCS7_PAD = "pkcs7";
diff --git a/gnu/java/security/hash/Haval.java b/gnu/java/security/hash/Haval.java
index f9f3282f2..1bf75652d 100644
--- a/gnu/java/security/hash/Haval.java
+++ b/gnu/java/security/hash/Haval.java
@@ -567,7 +567,7 @@ public class Haval extends BaseHash
{
if (valid == null)
{
- valid = new Boolean(DIGEST0.equals(Util.toString(new Haval().digest())));
+ valid = Boolean.valueOf(DIGEST0.equals(Util.toString(new Haval().digest())));
}
return valid.booleanValue();
}
diff --git a/gnu/java/security/hash/MD2.java b/gnu/java/security/hash/MD2.java
index 41e876983..2a93c42c4 100644
--- a/gnu/java/security/hash/MD2.java
+++ b/gnu/java/security/hash/MD2.java
@@ -181,7 +181,7 @@ public class MD2 extends BaseHash
{
if (valid == null)
{
- valid = new Boolean(DIGEST0.equals(Util.toString(new MD2().digest())));
+ valid = Boolean.valueOf(DIGEST0.equals(Util.toString(new MD2().digest())));
}
return valid.booleanValue();
}
diff --git a/gnu/java/security/hash/MD4.java b/gnu/java/security/hash/MD4.java
index 54dda358b..a09eb1705 100644
--- a/gnu/java/security/hash/MD4.java
+++ b/gnu/java/security/hash/MD4.java
@@ -154,7 +154,7 @@ public class MD4 extends BaseHash
{
if (valid == null)
{
- valid = new Boolean(DIGEST0.equals(Util.toString(new MD4().digest())));
+ valid = Boolean.valueOf(DIGEST0.equals(Util.toString(new MD4().digest())));
}
return valid.booleanValue();
}
diff --git a/gnu/java/security/hash/MD5.java b/gnu/java/security/hash/MD5.java
index 463292984..165392394 100644
--- a/gnu/java/security/hash/MD5.java
+++ b/gnu/java/security/hash/MD5.java
@@ -358,7 +358,7 @@ public class MD5 extends BaseHash
{
if (valid == null)
{
- valid = new Boolean(DIGEST0.equals(Util.toString(new MD5().digest())));
+ valid = Boolean.valueOf(DIGEST0.equals(Util.toString(new MD5().digest())));
}
return valid.booleanValue();
}
diff --git a/gnu/java/security/hash/RipeMD128.java b/gnu/java/security/hash/RipeMD128.java
index 83e8f2504..31874a0c2 100644
--- a/gnu/java/security/hash/RipeMD128.java
+++ b/gnu/java/security/hash/RipeMD128.java
@@ -283,7 +283,7 @@ public class RipeMD128 extends BaseHash
{
if (valid == null)
{
- valid = new Boolean
+ valid = Boolean.valueOf
(DIGEST0.equals(Util.toString(new RipeMD128().digest())));
}
return valid.booleanValue();
diff --git a/gnu/java/security/hash/RipeMD160.java b/gnu/java/security/hash/RipeMD160.java
index 73ecc5161..642ffb32d 100644
--- a/gnu/java/security/hash/RipeMD160.java
+++ b/gnu/java/security/hash/RipeMD160.java
@@ -320,7 +320,7 @@ public class RipeMD160 extends BaseHash
{
if (valid == null)
{
- valid = new Boolean
+ valid = Boolean.valueOf
(DIGEST0.equals(Util.toString(new RipeMD160().digest())));
}
return valid.booleanValue();
diff --git a/gnu/java/security/hash/Sha160.java b/gnu/java/security/hash/Sha160.java
index bf5f45652..037b118e6 100644
--- a/gnu/java/security/hash/Sha160.java
+++ b/gnu/java/security/hash/Sha160.java
@@ -229,7 +229,7 @@ public class Sha160 extends BaseHash
md.update((byte) 0x62); // b
md.update((byte) 0x63); // c
String result = Util.toString(md.digest());
- valid = new Boolean(DIGEST0.equals(result));
+ valid = Boolean.valueOf(DIGEST0.equals(result));
}
return valid.booleanValue();
}
diff --git a/gnu/java/security/hash/Sha256.java b/gnu/java/security/hash/Sha256.java
index 9ef70a1a6..284425ea4 100644
--- a/gnu/java/security/hash/Sha256.java
+++ b/gnu/java/security/hash/Sha256.java
@@ -217,7 +217,7 @@ public class Sha256 extends BaseHash
md.update((byte) 0x62); // b
md.update((byte) 0x63); // c
String result = Util.toString(md.digest());
- valid = new Boolean(DIGEST0.equals(result));
+ valid = Boolean.valueOf(DIGEST0.equals(result));
}
return valid.booleanValue();
diff --git a/gnu/java/security/hash/Sha384.java b/gnu/java/security/hash/Sha384.java
index 2f619dc98..332f048d7 100644
--- a/gnu/java/security/hash/Sha384.java
+++ b/gnu/java/security/hash/Sha384.java
@@ -254,7 +254,7 @@ public class Sha384 extends BaseHash
md.update((byte) 0x62); // b
md.update((byte) 0x63); // c
String result = Util.toString(md.digest());
- valid = new Boolean(DIGEST0.equals(result));
+ valid = Boolean.valueOf(DIGEST0.equals(result));
}
return valid.booleanValue();
}
diff --git a/gnu/java/security/hash/Sha512.java b/gnu/java/security/hash/Sha512.java
index 798b34dfc..da035dcfc 100644
--- a/gnu/java/security/hash/Sha512.java
+++ b/gnu/java/security/hash/Sha512.java
@@ -256,7 +256,7 @@ public class Sha512 extends BaseHash
md.update((byte) 0x62); // b
md.update((byte) 0x63); // c
String result = Util.toString(md.digest());
- valid = new Boolean(DIGEST0.equals(result));
+ valid = Boolean.valueOf(DIGEST0.equals(result));
}
return valid.booleanValue();
}
diff --git a/gnu/java/security/hash/Tiger.java b/gnu/java/security/hash/Tiger.java
index f39fed30d..be0921dce 100644
--- a/gnu/java/security/hash/Tiger.java
+++ b/gnu/java/security/hash/Tiger.java
@@ -640,7 +640,7 @@ public class Tiger extends BaseHash
{
if (valid == null)
{
- valid = new Boolean(DIGEST0.equals(Util.toString(new Tiger().digest())));
+ valid = Boolean.valueOf(DIGEST0.equals(Util.toString(new Tiger().digest())));
}
return valid.booleanValue();
}
diff --git a/gnu/java/security/hash/Whirlpool.java b/gnu/java/security/hash/Whirlpool.java
index 8c5d9f360..b10fa53cd 100644
--- a/gnu/java/security/hash/Whirlpool.java
+++ b/gnu/java/security/hash/Whirlpool.java
@@ -42,25 +42,25 @@ import gnu.java.security.Registry;
import gnu.java.security.util.Util;
/**
- * <p>Whirlpool, a new 512-bit hashing function operating on messages less than
+ * Whirlpool, a new 512-bit hashing function operating on messages less than
* 2 ** 256 bits in length. The function structure is designed according to the
* Wide Trail strategy and permits a wide variety of implementation trade-offs.
- * </p>
- *
- * <p><b>IMPORTANT</b>: This implementation is not thread-safe.</p>
- *
- * <p>References:</p>
- *
+ * <p>
+ * This implementation is of Whirlpool Version 3, described in [1] last revised
+ * on May 24th, 2003.
+ * <p>
+ * <b>IMPORTANT</b>: This implementation is not thread-safe.
+ * <p>
+ * References:
* <ol>
* <li><a href="http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html">
* The WHIRLPOOL Hashing Function</a>.<br>
* <a href="mailto:paulo.barreto@terra.com.br">Paulo S.L.M. Barreto</a> and
- * <a href="mailto:vincent.rijmen@esat.kuleuven.ac.be">Vincent Rijmen</a>.</li>
+ * <a href="mailto:vincent.rijmen@iaik.tugraz.at">Vincent Rijmen</a>.</li>
* </ol>
*/
public final class Whirlpool extends BaseHash
{
-
// Debugging methods and variables
// -------------------------------------------------------------------------
@@ -74,45 +74,43 @@ public final class Whirlpool extends BaseHash
private static final int BLOCK_SIZE = 64; // inner block size in bytes
/** The digest of the 0-bit long message. */
- private static final String DIGEST0 = "470F0409ABAA446E49667D4EBE12A14387CEDBD10DD17B8243CAD550A089DC0F"
- + "EEA7AA40F6C2AAAB71C6EBD076E43C7CFCA0AD32567897DCB5969861049A0F5A";
-
- private static final int R = 10; // default number of rounds
-
- private static final String Sd = // p. 19 [WHIRLPOOL]
- "\u1823\uc6E8\u87B8\u014F\u36A6\ud2F5\u796F\u9152"
- + "\u60Bc\u9B8E\uA30c\u7B35\u1dE0\ud7c2\u2E4B\uFE57"
- + "\u1577\u37E5\u9FF0\u4AdA\u58c9\u290A\uB1A0\u6B85"
- + "\uBd5d\u10F4\ucB3E\u0567\uE427\u418B\uA77d\u95d8"
- + "\uFBEE\u7c66\udd17\u479E\ucA2d\uBF07\uAd5A\u8333"
- + "\u6302\uAA71\uc819\u49d9\uF2E3\u5B88\u9A26\u32B0"
- + "\uE90F\ud580\uBEcd\u3448\uFF7A\u905F\u2068\u1AAE"
- + "\uB454\u9322\u64F1\u7312\u4008\uc3Ec\udBA1\u8d3d"
- + "\u9700\ucF2B\u7682\ud61B\uB5AF\u6A50\u45F3\u30EF"
- + "\u3F55\uA2EA\u65BA\u2Fc0\udE1c\uFd4d\u9275\u068A"
- + "\uB2E6\u0E1F\u62d4\uA896\uF9c5\u2559\u8472\u394c"
- + "\u5E78\u388c\ud1A5\uE261\uB321\u9c1E\u43c7\uFc04"
- + "\u5199\u6d0d\uFAdF\u7E24\u3BAB\ucE11\u8F4E\uB7EB"
- + "\u3c81\u94F7\uB913\u2cd3\uE76E\uc403\u5644\u7FA9"
- + "\u2ABB\uc153\udc0B\u9d6c\u3174\uF646\uAc89\u14E1"
- + "\u163A\u6909\u70B6\ud0Ed\ucc42\u98A4\u285c\uF886";
-
+ private static final String DIGEST0 =
+ "19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A7"
+ + "3E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3";
+
+ /** Default number of rounds. */
+ private static final int R = 10;
+
+ /** Whirlpool S-box; p. 19. */
+ private static final String S_box = // p. 19 [WHIRLPOOL]
+ "\u1823\uc6E8\u87B8\u014F\u36A6\ud2F5\u796F\u9152" +
+ "\u60Bc\u9B8E\uA30c\u7B35\u1dE0\ud7c2\u2E4B\uFE57" +
+ "\u1577\u37E5\u9FF0\u4AdA\u58c9\u290A\uB1A0\u6B85" +
+ "\uBd5d\u10F4\ucB3E\u0567\uE427\u418B\uA77d\u95d8" +
+ "\uFBEE\u7c66\udd17\u479E\ucA2d\uBF07\uAd5A\u8333" +
+ "\u6302\uAA71\uc819\u49d9\uF2E3\u5B88\u9A26\u32B0" +
+ "\uE90F\ud580\uBEcd\u3448\uFF7A\u905F\u2068\u1AAE" +
+ "\uB454\u9322\u64F1\u7312\u4008\uc3Ec\udBA1\u8d3d" +
+ "\u9700\ucF2B\u7682\ud61B\uB5AF\u6A50\u45F3\u30EF" +
+ "\u3F55\uA2EA\u65BA\u2Fc0\udE1c\uFd4d\u9275\u068A" +
+ "\uB2E6\u0E1F\u62d4\uA896\uF9c5\u2559\u8472\u394c" +
+ "\u5E78\u388c\ud1A5\uE261\uB321\u9c1E\u43c7\uFc04" +
+ "\u5199\u6d0d\uFAdF\u7E24\u3BAB\ucE11\u8F4E\uB7EB" +
+ "\u3c81\u94F7\uB913\u2cd3\uE76E\uc403\u5644\u7FA9" +
+ "\u2ABB\uc153\udc0B\u9d6c\u3174\uF646\uAc89\u14E1" +
+ "\u163A\u6909\u70B6\ud0Ed\ucc42\u98A4\u285c\uF886";
+
+ /** The 64-bit lookup tables; section 7.1 p. 13. */
private static final long[] T0 = new long[256];
-
private static final long[] T1 = new long[256];
-
private static final long[] T2 = new long[256];
-
private static final long[] T3 = new long[256];
-
private static final long[] T4 = new long[256];
-
private static final long[] T5 = new long[256];
-
private static final long[] T6 = new long[256];
-
private static final long[] T7 = new long[256];
+ /** The round constants. */
private static final long[] rc = new long[R];
/** caches the result of the correctness test, once executed. */
@@ -123,12 +121,10 @@ public final class Whirlpool extends BaseHash
/** Work area for computing the round key schedule. */
private long k00, k01, k02, k03, k04, k05, k06, k07;
-
private long Kr0, Kr1, Kr2, Kr3, Kr4, Kr5, Kr6, Kr7;
/** work area for transforming the 512-bit buffer. */
private long n0, n1, n2, n3, n4, n5, n6, n7;
-
private long nn0, nn1, nn2, nn3, nn4, nn5, nn6, nn7;
/** work area for holding block cipher's intermediate values. */
@@ -140,72 +136,67 @@ public final class Whirlpool extends BaseHash
{
long time = System.currentTimeMillis();
- int ROOT = 0x11d; // para. 2.1 [WHIRLPOOL]
+ int ROOT = 0x11D; // para. 2.1 [WHIRLPOOL]
int i, r, j;
- long s, s2, s3, s4, s5, s8, s9, t;
+ long s1, s2, s4, s5, s8, s9, t;
char c;
final byte[] S = new byte[256];
for (i = 0; i < 256; i++)
{
- c = Sd.charAt(i >>> 1);
+ c = S_box.charAt(i >>> 1);
- s = ((i & 1) == 0 ? c >>> 8 : c) & 0xFFL;
- s2 = s << 1;
+ s1 = ((i & 1) == 0 ? c >>> 8 : c) & 0xFFL;
+ s2 = s1 << 1;
if (s2 > 0xFFL)
- {
- s2 ^= ROOT;
- }
- s3 = s2 ^ s;
+ s2 ^= ROOT;
+
s4 = s2 << 1;
if (s4 > 0xFFL)
- {
- s4 ^= ROOT;
- }
- s5 = s4 ^ s;
+ s4 ^= ROOT;
+
+ s5 = s4 ^ s1;
s8 = s4 << 1;
if (s8 > 0xFFL)
- {
- s8 ^= ROOT;
- }
- s9 = s8 ^ s;
+ s8 ^= ROOT;
- S[i] = (byte) s;
- T0[i] = t = s << 56 | s << 48 | s3 << 40 | s << 32 | s5 << 24
- | s8 << 16 | s9 << 8 | s5;
- T1[i] = t >>> 8 | t << 56;
+ s9 = s8 ^ s1;
+
+ T0[i] = t = s1 << 56 | s1 << 48 | s4 << 40 | s1 << 32
+ | s8 << 24 | s5 << 16 | s2 << 8 | s9;
+ T1[i] = t >>> 8 | t << 56;
T2[i] = t >>> 16 | t << 48;
T3[i] = t >>> 24 | t << 40;
T4[i] = t >>> 32 | t << 32;
T5[i] = t >>> 40 | t << 24;
T6[i] = t >>> 48 | t << 16;
- T7[i] = t >>> 56 | t << 8;
+ T7[i] = t >>> 56 | t << 8;
}
- for (r = 1, i = 0, j = 0; r < R + 1; r++)
- {
- rc[i++] = (S[j++] & 0xFFL) << 56 | (S[j++] & 0xFFL) << 48
- | (S[j++] & 0xFFL) << 40 | (S[j++] & 0xFFL) << 32
- | (S[j++] & 0xFFL) << 24 | (S[j++] & 0xFFL) << 16
- | (S[j++] & 0xFFL) << 8 | (S[j++] & 0xFFL);
- }
+ for (r = 0, i = 0; r < R; )
+ rc[r++] = (T0[i++] & 0xFF00000000000000L)
+ ^ (T1[i++] & 0x00FF000000000000L)
+ ^ (T2[i++] & 0x0000FF0000000000L)
+ ^ (T3[i++] & 0x000000FF00000000L)
+ ^ (T4[i++] & 0x00000000FF000000L)
+ ^ (T5[i++] & 0x0000000000FF0000L)
+ ^ (T6[i++] & 0x000000000000FF00L)
+ ^ (T7[i++] & 0x00000000000000FFL);
time = System.currentTimeMillis() - time;
-
if (DEBUG && debuglevel > 8)
{
System.out.println("==========");
System.out.println();
System.out.println("Static data");
System.out.println();
-
+
System.out.println();
System.out.println("T0[]:");
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
- {
- System.out.print("0x" + Util.toString(T0[i * 4 + j]) + ", ");
- }
+ System.out.print("0x" + Util.toString(T0[i * 4 + j]) + ", ");
+
System.out.println();
}
System.out.println();
@@ -213,9 +204,8 @@ public final class Whirlpool extends BaseHash
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
- {
- System.out.print("0x" + Util.toString(T1[i * 4 + j]) + ", ");
- }
+ System.out.print("0x" + Util.toString(T1[i * 4 + j]) + ", ");
+
System.out.println();
}
System.out.println();
@@ -223,9 +213,8 @@ public final class Whirlpool extends BaseHash
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
- {
- System.out.print("0x" + Util.toString(T2[i * 4 + j]) + ", ");
- }
+ System.out.print("0x" + Util.toString(T2[i * 4 + j]) + ", ");
+
System.out.println();
}
System.out.println();
@@ -233,9 +222,8 @@ public final class Whirlpool extends BaseHash
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
- {
- System.out.print("0x" + Util.toString(T3[i * 4 + j]) + ", ");
- }
+ System.out.print("0x" + Util.toString(T3[i * 4 + j]) + ", ");
+
System.out.println();
}
System.out.println();
@@ -243,9 +231,8 @@ public final class Whirlpool extends BaseHash
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
- {
- System.out.print("0x" + Util.toString(T4[i * 4 + j]) + ", ");
- }
+ System.out.print("0x" + Util.toString(T4[i * 4 + j]) + ", ");
+
System.out.println();
}
System.out.println();
@@ -253,9 +240,8 @@ public final class Whirlpool extends BaseHash
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
- {
- System.out.print("0x" + Util.toString(T5[i * 4 + j]) + ", ");
- }
+ System.out.print("0x" + Util.toString(T5[i * 4 + j]) + ", ");
+
System.out.println();
}
System.out.println();
@@ -263,9 +249,8 @@ public final class Whirlpool extends BaseHash
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
- {
- System.out.print("0x" + Util.toString(T5[i * 4 + j]) + ", ");
- }
+ System.out.print("0x" + Util.toString(T5[i * 4 + j]) + ", ");
+
System.out.println();
}
System.out.println();
@@ -273,17 +258,15 @@ public final class Whirlpool extends BaseHash
for (i = 0; i < 64; i++)
{
for (j = 0; j < 4; j++)
- {
- System.out.print("0x" + Util.toString(T5[i * 4 + j]) + ", ");
- }
+ System.out.print("0x" + Util.toString(T5[i * 4 + j]) + ", ");
+
System.out.println();
}
System.out.println();
System.out.println("rc[]:");
for (i = 0; i < R; i++)
- {
- System.out.println("0x" + Util.toString(rc[i]));
- }
+ System.out.println("0x" + Util.toString(rc[i]));
+
System.out.println();
System.out.println();
@@ -340,38 +323,70 @@ public final class Whirlpool extends BaseHash
protected void transform(byte[] in, int offset)
{
// apply mu to the input
- n0 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
- | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
- | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
- | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
- n1 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
- | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
- | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
- | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
- n2 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
- | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
- | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
- | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
- n3 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
- | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
- | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
- | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
- n4 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
- | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
- | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
- | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
- n5 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
- | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
- | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
- | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
- n6 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
- | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
- | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
- | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
- n7 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48
- | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32
- | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16
- | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);
+ n0 = (in[offset++] & 0xFFL) << 56
+ | (in[offset++] & 0xFFL) << 48
+ | (in[offset++] & 0xFFL) << 40
+ | (in[offset++] & 0xFFL) << 32
+ | (in[offset++] & 0xFFL) << 24
+ | (in[offset++] & 0xFFL) << 16
+ | (in[offset++] & 0xFFL) << 8
+ | (in[offset++] & 0xFFL);
+ n1 = (in[offset++] & 0xFFL) << 56
+ | (in[offset++] & 0xFFL) << 48
+ | (in[offset++] & 0xFFL) << 40
+ | (in[offset++] & 0xFFL) << 32
+ | (in[offset++] & 0xFFL) << 24
+ | (in[offset++] & 0xFFL) << 16
+ | (in[offset++] & 0xFFL) << 8
+ | (in[offset++] & 0xFFL);
+ n2 = (in[offset++] & 0xFFL) << 56
+ | (in[offset++] & 0xFFL) << 48
+ | (in[offset++] & 0xFFL) << 40
+ | (in[offset++] & 0xFFL) << 32
+ | (in[offset++] & 0xFFL) << 24
+ | (in[offset++] & 0xFFL) << 16
+ | (in[offset++] & 0xFFL) << 8
+ | (in[offset++] & 0xFFL);
+ n3 = (in[offset++] & 0xFFL) << 56
+ | (in[offset++] & 0xFFL) << 48
+ | (in[offset++] & 0xFFL) << 40
+ | (in[offset++] & 0xFFL) << 32
+ | (in[offset++] & 0xFFL) << 24
+ | (in[offset++] & 0xFFL) << 16
+ | (in[offset++] & 0xFFL) << 8
+ | (in[offset++] & 0xFFL);
+ n4 = (in[offset++] & 0xFFL) << 56
+ | (in[offset++] & 0xFFL) << 48
+ | (in[offset++] & 0xFFL) << 40
+ | (in[offset++] & 0xFFL) << 32
+ | (in[offset++] & 0xFFL) << 24
+ | (in[offset++] & 0xFFL) << 16
+ | (in[offset++] & 0xFFL) << 8
+ | (in[offset++] & 0xFFL);
+ n5 = (in[offset++] & 0xFFL) << 56
+ | (in[offset++] & 0xFFL) << 48
+ | (in[offset++] & 0xFFL) << 40
+ | (in[offset++] & 0xFFL) << 32
+ | (in[offset++] & 0xFFL) << 24
+ | (in[offset++] & 0xFFL) << 16
+ | (in[offset++] & 0xFFL) << 8
+ | (in[offset++] & 0xFFL);
+ n6 = (in[offset++] & 0xFFL) << 56
+ | (in[offset++] & 0xFFL) << 48
+ | (in[offset++] & 0xFFL) << 40
+ | (in[offset++] & 0xFFL) << 32
+ | (in[offset++] & 0xFFL) << 24
+ | (in[offset++] & 0xFFL) << 16
+ | (in[offset++] & 0xFFL) << 8
+ | (in[offset++] & 0xFFL);
+ n7 = (in[offset++] & 0xFFL) << 56
+ | (in[offset++] & 0xFFL) << 48
+ | (in[offset++] & 0xFFL) << 40
+ | (in[offset++] & 0xFFL) << 32
+ | (in[offset++] & 0xFFL) << 24
+ | (in[offset++] & 0xFFL) << 16
+ | (in[offset++] & 0xFFL) << 8
+ | (in[offset++] & 0xFFL);
// transform K into the key schedule Kr; 0 <= r <= R
k00 = H0;
@@ -399,62 +414,70 @@ public final class Whirlpool extends BaseHash
{
// 1. compute intermediate round key schedule by applying ro[rc]
// to the previous round key schedule --rc being the round constant
- Kr0 = T0[(int) ((k00 >> 56) & 0xFFL)] ^ T1[(int) ((k07 >> 48) & 0xFFL)]
- ^ T2[(int) ((k06 >> 40) & 0xFFL)]
- ^ T3[(int) ((k05 >> 32) & 0xFFL)]
- ^ T4[(int) ((k04 >> 24) & 0xFFL)]
- ^ T5[(int) ((k03 >> 16) & 0xFFL)]
- ^ T6[(int) ((k02 >> 8) & 0xFFL)] ^ T7[(int) (k01 & 0xFFL)]
- ^ rc[r];
-
- Kr1 = T0[(int) ((k01 >> 56) & 0xFFL)] ^ T1[(int) ((k00 >> 48) & 0xFFL)]
- ^ T2[(int) ((k07 >> 40) & 0xFFL)]
- ^ T3[(int) ((k06 >> 32) & 0xFFL)]
- ^ T4[(int) ((k05 >> 24) & 0xFFL)]
- ^ T5[(int) ((k04 >> 16) & 0xFFL)]
- ^ T6[(int) ((k03 >> 8) & 0xFFL)] ^ T7[(int) (k02 & 0xFFL)];
-
- Kr2 = T0[(int) ((k02 >> 56) & 0xFFL)] ^ T1[(int) ((k01 >> 48) & 0xFFL)]
- ^ T2[(int) ((k00 >> 40) & 0xFFL)]
- ^ T3[(int) ((k07 >> 32) & 0xFFL)]
- ^ T4[(int) ((k06 >> 24) & 0xFFL)]
- ^ T5[(int) ((k05 >> 16) & 0xFFL)]
- ^ T6[(int) ((k04 >> 8) & 0xFFL)] ^ T7[(int) (k03 & 0xFFL)];
-
- Kr3 = T0[(int) ((k03 >> 56) & 0xFFL)] ^ T1[(int) ((k02 >> 48) & 0xFFL)]
- ^ T2[(int) ((k01 >> 40) & 0xFFL)]
- ^ T3[(int) ((k00 >> 32) & 0xFFL)]
- ^ T4[(int) ((k07 >> 24) & 0xFFL)]
- ^ T5[(int) ((k06 >> 16) & 0xFFL)]
- ^ T6[(int) ((k05 >> 8) & 0xFFL)] ^ T7[(int) (k04 & 0xFFL)];
-
- Kr4 = T0[(int) ((k04 >> 56) & 0xFFL)] ^ T1[(int) ((k03 >> 48) & 0xFFL)]
- ^ T2[(int) ((k02 >> 40) & 0xFFL)]
- ^ T3[(int) ((k01 >> 32) & 0xFFL)]
- ^ T4[(int) ((k00 >> 24) & 0xFFL)]
- ^ T5[(int) ((k07 >> 16) & 0xFFL)]
- ^ T6[(int) ((k06 >> 8) & 0xFFL)] ^ T7[(int) (k05 & 0xFFL)];
-
- Kr5 = T0[(int) ((k05 >> 56) & 0xFFL)] ^ T1[(int) ((k04 >> 48) & 0xFFL)]
- ^ T2[(int) ((k03 >> 40) & 0xFFL)]
- ^ T3[(int) ((k02 >> 32) & 0xFFL)]
- ^ T4[(int) ((k01 >> 24) & 0xFFL)]
- ^ T5[(int) ((k00 >> 16) & 0xFFL)]
- ^ T6[(int) ((k07 >> 8) & 0xFFL)] ^ T7[(int) (k06 & 0xFFL)];
-
- Kr6 = T0[(int) ((k06 >> 56) & 0xFFL)] ^ T1[(int) ((k05 >> 48) & 0xFFL)]
- ^ T2[(int) ((k04 >> 40) & 0xFFL)]
- ^ T3[(int) ((k03 >> 32) & 0xFFL)]
- ^ T4[(int) ((k02 >> 24) & 0xFFL)]
- ^ T5[(int) ((k01 >> 16) & 0xFFL)]
- ^ T6[(int) ((k00 >> 8) & 0xFFL)] ^ T7[(int) (k07 & 0xFFL)];
-
- Kr7 = T0[(int) ((k07 >> 56) & 0xFFL)] ^ T1[(int) ((k06 >> 48) & 0xFFL)]
- ^ T2[(int) ((k05 >> 40) & 0xFFL)]
- ^ T3[(int) ((k04 >> 32) & 0xFFL)]
- ^ T4[(int) ((k03 >> 24) & 0xFFL)]
- ^ T5[(int) ((k02 >> 16) & 0xFFL)]
- ^ T6[(int) ((k01 >> 8) & 0xFFL)] ^ T7[(int) (k00 & 0xFFL)];
+ Kr0 = T0[(int)((k00 >> 56) & 0xFFL)]
+ ^ T1[(int)((k07 >> 48) & 0xFFL)]
+ ^ T2[(int)((k06 >> 40) & 0xFFL)]
+ ^ T3[(int)((k05 >> 32) & 0xFFL)]
+ ^ T4[(int)((k04 >> 24) & 0xFFL)]
+ ^ T5[(int)((k03 >> 16) & 0xFFL)]
+ ^ T6[(int)((k02 >> 8) & 0xFFL)]
+ ^ T7[(int)( k01 & 0xFFL)] ^ rc[r];
+ Kr1 = T0[(int)((k01 >> 56) & 0xFFL)]
+ ^ T1[(int)((k00 >> 48) & 0xFFL)]
+ ^ T2[(int)((k07 >> 40) & 0xFFL)]
+ ^ T3[(int)((k06 >> 32) & 0xFFL)]
+ ^ T4[(int)((k05 >> 24) & 0xFFL)]
+ ^ T5[(int)((k04 >> 16) & 0xFFL)]
+ ^ T6[(int)((k03 >> 8) & 0xFFL)]
+ ^ T7[(int)( k02 & 0xFFL)];
+ Kr2 = T0[(int)((k02 >> 56) & 0xFFL)]
+ ^ T1[(int)((k01 >> 48) & 0xFFL)]
+ ^ T2[(int)((k00 >> 40) & 0xFFL)]
+ ^ T3[(int)((k07 >> 32) & 0xFFL)]
+ ^ T4[(int)((k06 >> 24) & 0xFFL)]
+ ^ T5[(int)((k05 >> 16) & 0xFFL)]
+ ^ T6[(int)((k04 >> 8) & 0xFFL)]
+ ^ T7[(int)( k03 & 0xFFL)];
+ Kr3 = T0[(int)((k03 >> 56) & 0xFFL)]
+ ^ T1[(int)((k02 >> 48) & 0xFFL)]
+ ^ T2[(int)((k01 >> 40) & 0xFFL)]
+ ^ T3[(int)((k00 >> 32) & 0xFFL)]
+ ^ T4[(int)((k07 >> 24) & 0xFFL)]
+ ^ T5[(int)((k06 >> 16) & 0xFFL)]
+ ^ T6[(int)((k05 >> 8) & 0xFFL)]
+ ^ T7[(int)( k04 & 0xFFL)];
+ Kr4 = T0[(int)((k04 >> 56) & 0xFFL)]
+ ^ T1[(int)((k03 >> 48) & 0xFFL)]
+ ^ T2[(int)((k02 >> 40) & 0xFFL)]
+ ^ T3[(int)((k01 >> 32) & 0xFFL)]
+ ^ T4[(int)((k00 >> 24) & 0xFFL)]
+ ^ T5[(int)((k07 >> 16) & 0xFFL)]
+ ^ T6[(int)((k06 >> 8) & 0xFFL)]
+ ^ T7[(int)( k05 & 0xFFL)];
+ Kr5 = T0[(int)((k05 >> 56) & 0xFFL)]
+ ^ T1[(int)((k04 >> 48) & 0xFFL)]
+ ^ T2[(int)((k03 >> 40) & 0xFFL)]
+ ^ T3[(int)((k02 >> 32) & 0xFFL)]
+ ^ T4[(int)((k01 >> 24) & 0xFFL)]
+ ^ T5[(int)((k00 >> 16) & 0xFFL)]
+ ^ T6[(int)((k07 >> 8) & 0xFFL)]
+ ^ T7[(int)( k06 & 0xFFL)];
+ Kr6 = T0[(int)((k06 >> 56) & 0xFFL)]
+ ^ T1[(int)((k05 >> 48) & 0xFFL)]
+ ^ T2[(int)((k04 >> 40) & 0xFFL)]
+ ^ T3[(int)((k03 >> 32) & 0xFFL)]
+ ^ T4[(int)((k02 >> 24) & 0xFFL)]
+ ^ T5[(int)((k01 >> 16) & 0xFFL)]
+ ^ T6[(int)((k00 >> 8) & 0xFFL)]
+ ^ T7[(int)( k07 & 0xFFL)];
+ Kr7 = T0[(int)((k07 >> 56) & 0xFFL)]
+ ^ T1[(int)((k06 >> 48) & 0xFFL)]
+ ^ T2[(int)((k05 >> 40) & 0xFFL)]
+ ^ T3[(int)((k04 >> 32) & 0xFFL)]
+ ^ T4[(int)((k03 >> 24) & 0xFFL)]
+ ^ T5[(int)((k02 >> 16) & 0xFFL)]
+ ^ T6[(int)((k01 >> 8) & 0xFFL)]
+ ^ T7[(int)( k00 & 0xFFL)];
k00 = Kr0;
k01 = Kr1;
@@ -466,54 +489,70 @@ public final class Whirlpool extends BaseHash
k07 = Kr7;
// 2. incrementally compute the cipher output
- w0 = T0[(int) ((nn0 >> 56) & 0xFFL)] ^ T1[(int) ((nn7 >> 48) & 0xFFL)]
- ^ T2[(int) ((nn6 >> 40) & 0xFFL)]
- ^ T3[(int) ((nn5 >> 32) & 0xFFL)]
- ^ T4[(int) ((nn4 >> 24) & 0xFFL)]
- ^ T5[(int) ((nn3 >> 16) & 0xFFL)] ^ T6[(int) ((nn2 >> 8) & 0xFFL)]
- ^ T7[(int) (nn1 & 0xFFL)] ^ Kr0;
- w1 = T0[(int) ((nn1 >> 56) & 0xFFL)] ^ T1[(int) ((nn0 >> 48) & 0xFFL)]
- ^ T2[(int) ((nn7 >> 40) & 0xFFL)]
- ^ T3[(int) ((nn6 >> 32) & 0xFFL)]
- ^ T4[(int) ((nn5 >> 24) & 0xFFL)]
- ^ T5[(int) ((nn4 >> 16) & 0xFFL)] ^ T6[(int) ((nn3 >> 8) & 0xFFL)]
- ^ T7[(int) (nn2 & 0xFFL)] ^ Kr1;
- w2 = T0[(int) ((nn2 >> 56) & 0xFFL)] ^ T1[(int) ((nn1 >> 48) & 0xFFL)]
- ^ T2[(int) ((nn0 >> 40) & 0xFFL)]
- ^ T3[(int) ((nn7 >> 32) & 0xFFL)]
- ^ T4[(int) ((nn6 >> 24) & 0xFFL)]
- ^ T5[(int) ((nn5 >> 16) & 0xFFL)] ^ T6[(int) ((nn4 >> 8) & 0xFFL)]
- ^ T7[(int) (nn3 & 0xFFL)] ^ Kr2;
- w3 = T0[(int) ((nn3 >> 56) & 0xFFL)] ^ T1[(int) ((nn2 >> 48) & 0xFFL)]
- ^ T2[(int) ((nn1 >> 40) & 0xFFL)]
- ^ T3[(int) ((nn0 >> 32) & 0xFFL)]
- ^ T4[(int) ((nn7 >> 24) & 0xFFL)]
- ^ T5[(int) ((nn6 >> 16) & 0xFFL)] ^ T6[(int) ((nn5 >> 8) & 0xFFL)]
- ^ T7[(int) (nn4 & 0xFFL)] ^ Kr3;
- w4 = T0[(int) ((nn4 >> 56) & 0xFFL)] ^ T1[(int) ((nn3 >> 48) & 0xFFL)]
- ^ T2[(int) ((nn2 >> 40) & 0xFFL)]
- ^ T3[(int) ((nn1 >> 32) & 0xFFL)]
- ^ T4[(int) ((nn0 >> 24) & 0xFFL)]
- ^ T5[(int) ((nn7 >> 16) & 0xFFL)] ^ T6[(int) ((nn6 >> 8) & 0xFFL)]
- ^ T7[(int) (nn5 & 0xFFL)] ^ Kr4;
- w5 = T0[(int) ((nn5 >> 56) & 0xFFL)] ^ T1[(int) ((nn4 >> 48) & 0xFFL)]
- ^ T2[(int) ((nn3 >> 40) & 0xFFL)]
- ^ T3[(int) ((nn2 >> 32) & 0xFFL)]
- ^ T4[(int) ((nn1 >> 24) & 0xFFL)]
- ^ T5[(int) ((nn0 >> 16) & 0xFFL)] ^ T6[(int) ((nn7 >> 8) & 0xFFL)]
- ^ T7[(int) (nn6 & 0xFFL)] ^ Kr5;
- w6 = T0[(int) ((nn6 >> 56) & 0xFFL)] ^ T1[(int) ((nn5 >> 48) & 0xFFL)]
- ^ T2[(int) ((nn4 >> 40) & 0xFFL)]
- ^ T3[(int) ((nn3 >> 32) & 0xFFL)]
- ^ T4[(int) ((nn2 >> 24) & 0xFFL)]
- ^ T5[(int) ((nn1 >> 16) & 0xFFL)] ^ T6[(int) ((nn0 >> 8) & 0xFFL)]
- ^ T7[(int) (nn7 & 0xFFL)] ^ Kr6;
- w7 = T0[(int) ((nn7 >> 56) & 0xFFL)] ^ T1[(int) ((nn6 >> 48) & 0xFFL)]
- ^ T2[(int) ((nn5 >> 40) & 0xFFL)]
- ^ T3[(int) ((nn4 >> 32) & 0xFFL)]
- ^ T4[(int) ((nn3 >> 24) & 0xFFL)]
- ^ T5[(int) ((nn2 >> 16) & 0xFFL)] ^ T6[(int) ((nn1 >> 8) & 0xFFL)]
- ^ T7[(int) (nn0 & 0xFFL)] ^ Kr7;
+ w0 = T0[(int)((nn0 >> 56) & 0xFFL)]
+ ^ T1[(int)((nn7 >> 48) & 0xFFL)]
+ ^ T2[(int)((nn6 >> 40) & 0xFFL)]
+ ^ T3[(int)((nn5 >> 32) & 0xFFL)]
+ ^ T4[(int)((nn4 >> 24) & 0xFFL)]
+ ^ T5[(int)((nn3 >> 16) & 0xFFL)]
+ ^ T6[(int)((nn2 >> 8) & 0xFFL)]
+ ^ T7[(int)( nn1 & 0xFFL)] ^ Kr0;
+ w1 = T0[(int)((nn1 >> 56) & 0xFFL)]
+ ^ T1[(int)((nn0 >> 48) & 0xFFL)]
+ ^ T2[(int)((nn7 >> 40) & 0xFFL)]
+ ^ T3[(int)((nn6 >> 32) & 0xFFL)]
+ ^ T4[(int)((nn5 >> 24) & 0xFFL)]
+ ^ T5[(int)((nn4 >> 16) & 0xFFL)]
+ ^ T6[(int)((nn3 >> 8) & 0xFFL)]
+ ^ T7[(int)( nn2 & 0xFFL)] ^ Kr1;
+ w2 = T0[(int)((nn2 >> 56) & 0xFFL)]
+ ^ T1[(int)((nn1 >> 48) & 0xFFL)]
+ ^ T2[(int)((nn0 >> 40) & 0xFFL)]
+ ^ T3[(int)((nn7 >> 32) & 0xFFL)]
+ ^ T4[(int)((nn6 >> 24) & 0xFFL)]
+ ^ T5[(int)((nn5 >> 16) & 0xFFL)]
+ ^ T6[(int)((nn4 >> 8) & 0xFFL)]
+ ^ T7[(int)( nn3 & 0xFFL)] ^ Kr2;
+ w3 = T0[(int)((nn3 >> 56) & 0xFFL)]
+ ^ T1[(int)((nn2 >> 48) & 0xFFL)]
+ ^ T2[(int)((nn1 >> 40) & 0xFFL)]
+ ^ T3[(int)((nn0 >> 32) & 0xFFL)]
+ ^ T4[(int)((nn7 >> 24) & 0xFFL)]
+ ^ T5[(int)((nn6 >> 16) & 0xFFL)]
+ ^ T6[(int)((nn5 >> 8) & 0xFFL)]
+ ^ T7[(int)( nn4 & 0xFFL)] ^ Kr3;
+ w4 = T0[(int)((nn4 >> 56) & 0xFFL)]
+ ^ T1[(int)((nn3 >> 48) & 0xFFL)]
+ ^ T2[(int)((nn2 >> 40) & 0xFFL)]
+ ^ T3[(int)((nn1 >> 32) & 0xFFL)]
+ ^ T4[(int)((nn0 >> 24) & 0xFFL)]
+ ^ T5[(int)((nn7 >> 16) & 0xFFL)]
+ ^ T6[(int)((nn6 >> 8) & 0xFFL)]
+ ^ T7[(int)( nn5 & 0xFFL)] ^ Kr4;
+ w5 = T0[(int)((nn5 >> 56) & 0xFFL)]
+ ^ T1[(int)((nn4 >> 48) & 0xFFL)]
+ ^ T2[(int)((nn3 >> 40) & 0xFFL)]
+ ^ T3[(int)((nn2 >> 32) & 0xFFL)]
+ ^ T4[(int)((nn1 >> 24) & 0xFFL)]
+ ^ T5[(int)((nn0 >> 16) & 0xFFL)]
+ ^ T6[(int)((nn7 >> 8) & 0xFFL)]
+ ^ T7[(int)( nn6 & 0xFFL)] ^ Kr5;
+ w6 = T0[(int)((nn6 >> 56) & 0xFFL)]
+ ^ T1[(int)((nn5 >> 48) & 0xFFL)]
+ ^ T2[(int)((nn4 >> 40) & 0xFFL)]
+ ^ T3[(int)((nn3 >> 32) & 0xFFL)]
+ ^ T4[(int)((nn2 >> 24) & 0xFFL)]
+ ^ T5[(int)((nn1 >> 16) & 0xFFL)]
+ ^ T6[(int)((nn0 >> 8) & 0xFFL)]
+ ^ T7[(int)( nn7 & 0xFFL)] ^ Kr6;
+ w7 = T0[(int)((nn7 >> 56) & 0xFFL)]
+ ^ T1[(int)((nn6 >> 48) & 0xFFL)]
+ ^ T2[(int)((nn5 >> 40) & 0xFFL)]
+ ^ T3[(int)((nn4 >> 32) & 0xFFL)]
+ ^ T4[(int)((nn3 >> 24) & 0xFFL)]
+ ^ T5[(int)((nn2 >> 16) & 0xFFL)]
+ ^ T6[(int)((nn1 >> 8) & 0xFFL)]
+ ^ T7[(int)( nn0 & 0xFFL)] ^ Kr7;
nn0 = w0;
nn1 = w1;
@@ -547,7 +586,7 @@ public final class Whirlpool extends BaseHash
// are 33 (1 for the 1-bit followed by the 0-bits and the encoding of
// the count framed in a 256-bit block). our formula is then:
// count + 33 + padding = 0 (mod BLOCK_SIZE)
- int n = (int) ((count + 33) % BLOCK_SIZE);
+ int n = (int)((count + 33) % BLOCK_SIZE);
int padding = n == 0 ? 33 : BLOCK_SIZE - n + 33;
byte[] result = new byte[padding];
@@ -558,14 +597,14 @@ public final class Whirlpool extends BaseHash
// save (right justified) the number of bits hashed
long bits = count * 8;
int i = padding - 8;
- result[i++] = (byte) (bits >>> 56);
- result[i++] = (byte) (bits >>> 48);
- result[i++] = (byte) (bits >>> 40);
- result[i++] = (byte) (bits >>> 32);
- result[i++] = (byte) (bits >>> 24);
- result[i++] = (byte) (bits >>> 16);
- result[i++] = (byte) (bits >>> 8);
- result[i] = (byte) bits;
+ result[i++] = (byte)(bits >>> 56);
+ result[i++] = (byte)(bits >>> 48);
+ result[i++] = (byte)(bits >>> 40);
+ result[i++] = (byte)(bits >>> 32);
+ result[i++] = (byte)(bits >>> 24);
+ result[i++] = (byte)(bits >>> 16);
+ result[i++] = (byte)(bits >>> 8);
+ result[i ] = (byte) bits;
return result;
}
@@ -573,38 +612,24 @@ public final class Whirlpool extends BaseHash
protected byte[] getResult()
{
// apply inverse mu to the context
- byte[] result = new byte[] { (byte) (H0 >>> 56), (byte) (H0 >>> 48),
- (byte) (H0 >>> 40), (byte) (H0 >>> 32),
- (byte) (H0 >>> 24), (byte) (H0 >>> 16),
- (byte) (H0 >>> 8), (byte) H0,
- (byte) (H1 >>> 56), (byte) (H1 >>> 48),
- (byte) (H1 >>> 40), (byte) (H1 >>> 32),
- (byte) (H1 >>> 24), (byte) (H1 >>> 16),
- (byte) (H1 >>> 8), (byte) H1,
- (byte) (H2 >>> 56), (byte) (H2 >>> 48),
- (byte) (H2 >>> 40), (byte) (H2 >>> 32),
- (byte) (H2 >>> 24), (byte) (H2 >>> 16),
- (byte) (H2 >>> 8), (byte) H2,
- (byte) (H3 >>> 56), (byte) (H3 >>> 48),
- (byte) (H3 >>> 40), (byte) (H3 >>> 32),
- (byte) (H3 >>> 24), (byte) (H3 >>> 16),
- (byte) (H3 >>> 8), (byte) H3,
- (byte) (H4 >>> 56), (byte) (H4 >>> 48),
- (byte) (H4 >>> 40), (byte) (H4 >>> 32),
- (byte) (H4 >>> 24), (byte) (H4 >>> 16),
- (byte) (H4 >>> 8), (byte) H4,
- (byte) (H5 >>> 56), (byte) (H5 >>> 48),
- (byte) (H5 >>> 40), (byte) (H5 >>> 32),
- (byte) (H5 >>> 24), (byte) (H5 >>> 16),
- (byte) (H5 >>> 8), (byte) H5,
- (byte) (H6 >>> 56), (byte) (H6 >>> 48),
- (byte) (H6 >>> 40), (byte) (H6 >>> 32),
- (byte) (H6 >>> 24), (byte) (H6 >>> 16),
- (byte) (H6 >>> 8), (byte) H6,
- (byte) (H7 >>> 56), (byte) (H7 >>> 48),
- (byte) (H7 >>> 40), (byte) (H7 >>> 32),
- (byte) (H7 >>> 24), (byte) (H7 >>> 16),
- (byte) (H7 >>> 8), (byte) H7 };
+ byte[] result = new byte[] {
+ (byte)(H0 >>> 56), (byte)(H0 >>> 48), (byte)(H0 >>> 40), (byte)(H0 >>> 32),
+ (byte)(H0 >>> 24), (byte)(H0 >>> 16), (byte)(H0 >>> 8), (byte) H0,
+ (byte)(H1 >>> 56), (byte)(H1 >>> 48), (byte)(H1 >>> 40), (byte)(H1 >>> 32),
+ (byte)(H1 >>> 24), (byte)(H1 >>> 16), (byte)(H1 >>> 8), (byte) H1,
+ (byte)(H2 >>> 56), (byte)(H2 >>> 48), (byte)(H2 >>> 40), (byte)(H2 >>> 32),
+ (byte)(H2 >>> 24), (byte)(H2 >>> 16), (byte)(H2 >>> 8), (byte) H2,
+ (byte)(H3 >>> 56), (byte)(H3 >>> 48), (byte)(H3 >>> 40), (byte)(H3 >>> 32),
+ (byte)(H3 >>> 24), (byte)(H3 >>> 16), (byte)(H3 >>> 8), (byte) H3,
+ (byte)(H4 >>> 56), (byte)(H4 >>> 48), (byte)(H4 >>> 40), (byte)(H4 >>> 32),
+ (byte)(H4 >>> 24), (byte)(H4 >>> 16), (byte)(H4 >>> 8), (byte) H4,
+ (byte)(H5 >>> 56), (byte)(H5 >>> 48), (byte)(H5 >>> 40), (byte)(H5 >>> 32),
+ (byte)(H5 >>> 24), (byte)(H5 >>> 16), (byte)(H5 >>> 8), (byte) H5,
+ (byte)(H6 >>> 56), (byte)(H6 >>> 48), (byte)(H6 >>> 40), (byte)(H6 >>> 32),
+ (byte)(H6 >>> 24), (byte)(H6 >>> 16), (byte)(H6 >>> 8), (byte) H6,
+ (byte)(H7 >>> 56), (byte)(H7 >>> 48), (byte)(H7 >>> 40), (byte)(H7 >>> 32),
+ (byte)(H7 >>> 24), (byte)(H7 >>> 16), (byte)(H7 >>> 8), (byte) H7
+ };
return result;
}
@@ -617,10 +642,8 @@ public final class Whirlpool extends BaseHash
public boolean selfTest()
{
if (valid == null)
- {
- valid = new Boolean(
- DIGEST0.equals(Util.toString(new Whirlpool().digest())));
- }
+ valid = Boolean.valueOf(DIGEST0.equals(Util.toString(new Whirlpool().digest())));
+
return valid.booleanValue();
}
}
diff --git a/gnu/java/security/jce/hash/HavalSpi.java b/gnu/java/security/jce/hash/HavalSpi.java
index e127779ef..05595edea 100644
--- a/gnu/java/security/jce/hash/HavalSpi.java
+++ b/gnu/java/security/jce/hash/HavalSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the <code>HAVAL</code> <i>Service Provider Interface</i>
* (<b>SPI</b>) Adapter.<p>
- *
- * @version Revision: $
*/
public class HavalSpi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/MD2Spi.java b/gnu/java/security/jce/hash/MD2Spi.java
index 5b6b0e1e1..001cbaf3c 100644
--- a/gnu/java/security/jce/hash/MD2Spi.java
+++ b/gnu/java/security/jce/hash/MD2Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* <p>The implementation of the MD2 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
- *
- * @version $Revision: 1.1 $
*/
public class MD2Spi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/MD4Spi.java b/gnu/java/security/jce/hash/MD4Spi.java
index 8be449934..41fef87bf 100644
--- a/gnu/java/security/jce/hash/MD4Spi.java
+++ b/gnu/java/security/jce/hash/MD4Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* <p>The implementation of the MD4 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
- *
- * @version $Revision: 1.1 $
*/
public class MD4Spi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/MD5Spi.java b/gnu/java/security/jce/hash/MD5Spi.java
index 92fb6ab38..aa1a8844e 100644
--- a/gnu/java/security/jce/hash/MD5Spi.java
+++ b/gnu/java/security/jce/hash/MD5Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the MD5 <i>Service Provider Interface</i> (<b>SPI</b>)
* adapter.<p>
- *
- * @version $Revision: 1.1 $
*/
public class MD5Spi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/MessageDigestAdapter.java b/gnu/java/security/jce/hash/MessageDigestAdapter.java
index 9b8a73d55..e30beca3d 100644
--- a/gnu/java/security/jce/hash/MessageDigestAdapter.java
+++ b/gnu/java/security/jce/hash/MessageDigestAdapter.java
@@ -59,8 +59,6 @@ import java.security.MessageDigestSpi;
*
* All the implementations which subclass this object, and which are serviced by
* the GNU Crypto provider implement the {@link java.lang.Cloneable} interface.<p>
- *
- * @version $Revision: 1.1 $
*/
class MessageDigestAdapter extends MessageDigestSpi implements Cloneable
{
diff --git a/gnu/java/security/jce/hash/RipeMD128Spi.java b/gnu/java/security/jce/hash/RipeMD128Spi.java
index b8e90d4bf..404214d91 100644
--- a/gnu/java/security/jce/hash/RipeMD128Spi.java
+++ b/gnu/java/security/jce/hash/RipeMD128Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the RIPEMD-128 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.<p>
- *
- * @version $Revision: 1.1 $
*/
public class RipeMD128Spi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/RipeMD160Spi.java b/gnu/java/security/jce/hash/RipeMD160Spi.java
index 49615e2fc..841f46b3b 100644
--- a/gnu/java/security/jce/hash/RipeMD160Spi.java
+++ b/gnu/java/security/jce/hash/RipeMD160Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the RIPEMD-160 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.<p>
- *
- * @version $Revision: 1.1 $
*/
public class RipeMD160Spi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/Sha160Spi.java b/gnu/java/security/jce/hash/Sha160Spi.java
index a9b72634d..419884382 100644
--- a/gnu/java/security/jce/hash/Sha160Spi.java
+++ b/gnu/java/security/jce/hash/Sha160Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the SHA-1 (160-bit) <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.<p>
- *
- * @version $Revision: 1.1 $
*/
public class Sha160Spi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/Sha256Spi.java b/gnu/java/security/jce/hash/Sha256Spi.java
index 9eeaebdea..f07e18941 100644
--- a/gnu/java/security/jce/hash/Sha256Spi.java
+++ b/gnu/java/security/jce/hash/Sha256Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* <p>The implementation of the SHA-2-1 (256-bit) <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
- *
- * @version $Revision: 1.1 $
*/
public class Sha256Spi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/Sha384Spi.java b/gnu/java/security/jce/hash/Sha384Spi.java
index 96e1e6eb0..fc17077e8 100644
--- a/gnu/java/security/jce/hash/Sha384Spi.java
+++ b/gnu/java/security/jce/hash/Sha384Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* <p>The implementation of the SHA-2-2 (384-bit) <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
- *
- * @version $Revision: 1.1 $
*/
public class Sha384Spi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/Sha512Spi.java b/gnu/java/security/jce/hash/Sha512Spi.java
index 75c617046..0b4c3d62c 100644
--- a/gnu/java/security/jce/hash/Sha512Spi.java
+++ b/gnu/java/security/jce/hash/Sha512Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* <p>The implementation of the SHA-2-3 (512-bit) <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
- *
- * @version $Revision: 1.1 $
*/
public class Sha512Spi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/TigerSpi.java b/gnu/java/security/jce/hash/TigerSpi.java
index b355d78d0..599437410 100644
--- a/gnu/java/security/jce/hash/TigerSpi.java
+++ b/gnu/java/security/jce/hash/TigerSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* <p>The implementation of the Tiger <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
- *
- * @version $Revision: 1.1 $
*/
public class TigerSpi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/hash/WhirlpoolSpi.java b/gnu/java/security/jce/hash/WhirlpoolSpi.java
index e42e74ddb..d1864bc7c 100644
--- a/gnu/java/security/jce/hash/WhirlpoolSpi.java
+++ b/gnu/java/security/jce/hash/WhirlpoolSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Whirlpool <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.<p>
- *
- * @version $Revision: 1.1 $
*/
public class WhirlpoolSpi extends MessageDigestAdapter
{
diff --git a/gnu/java/security/jce/prng/SecureRandomAdapter.java b/gnu/java/security/jce/prng/SecureRandomAdapter.java
index e7cb72091..70d30f153 100644
--- a/gnu/java/security/jce/prng/SecureRandomAdapter.java
+++ b/gnu/java/security/jce/prng/SecureRandomAdapter.java
@@ -42,7 +42,7 @@ import gnu.java.security.prng.LimitReachedException;
import gnu.java.security.prng.MDGenerator;
import java.security.SecureRandomSpi;
-import java.util.HashMap;
+import java.util.Collections;
/**
* <p>The implementation of a generic {@link java.security.SecureRandom} adapter
@@ -80,6 +80,7 @@ abstract class SecureRandomAdapter extends SecureRandomSpi
super();
this.mdName = mdName;
+ adaptee.init (Collections.singletonMap (MDGenerator.MD_NAME, mdName));
}
// Class methods
@@ -118,9 +119,6 @@ abstract class SecureRandomAdapter extends SecureRandomSpi
public void engineSetSeed(byte[] seed)
{
- HashMap attributes = new HashMap();
- attributes.put(MDGenerator.MD_NAME, mdName);
- attributes.put(MDGenerator.SEEED, seed);
- adaptee.init(attributes);
+ adaptee.addRandomBytes (seed);
}
}
diff --git a/gnu/java/security/jce/sig/DSSKeyPairGeneratorSpi.java b/gnu/java/security/jce/sig/DSSKeyPairGeneratorSpi.java
index ef3a6637e..44503b26b 100644
--- a/gnu/java/security/jce/sig/DSSKeyPairGeneratorSpi.java
+++ b/gnu/java/security/jce/sig/DSSKeyPairGeneratorSpi.java
@@ -57,8 +57,6 @@ import java.util.HashMap;
* In case the client does not explicitly initialize the KeyPairGenerator (via
* a call to an <code>initialize()</code> method), the GNU Crypto provider
* uses a default <i>modulus</i> size (keysize) of 1024 bits.<p>
- *
- * @version $Revision: 1.1.2.3 $
*/
public class DSSKeyPairGeneratorSpi extends KeyPairGeneratorAdapter implements
DSAKeyPairGenerator
diff --git a/gnu/java/security/jce/sig/DSSRawSignatureSpi.java b/gnu/java/security/jce/sig/DSSRawSignatureSpi.java
index 16e4ddd4e..a63c51afa 100644
--- a/gnu/java/security/jce/sig/DSSRawSignatureSpi.java
+++ b/gnu/java/security/jce/sig/DSSRawSignatureSpi.java
@@ -45,8 +45,6 @@ import gnu.java.security.sig.dss.DSSSignatureRawCodec;
* The implementation of <i>Service Provider Interface</i> (<b>SPI</b>) adapter
* for the DSS (Digital Signature Standard) signature scheme, encoded and/or
* decoded in RAW format.<p>
- *
- * @version $Revision: 1.1 $
*/
public class DSSRawSignatureSpi extends SignatureAdapter
{
diff --git a/gnu/java/security/jce/sig/KeyPairGeneratorAdapter.java b/gnu/java/security/jce/sig/KeyPairGeneratorAdapter.java
index 765036cdb..edf19f627 100644
--- a/gnu/java/security/jce/sig/KeyPairGeneratorAdapter.java
+++ b/gnu/java/security/jce/sig/KeyPairGeneratorAdapter.java
@@ -63,8 +63,6 @@ import java.security.spec.AlgorithmParameterSpec;
* supplies (and document) default values to be used. For example, the GNU
* Crypto provider uses a default <i>modulus</i> size (keysize) of 1024 bits for
* the DSS (Digital Signature Standard) a.k.a <i>DSA</i>.<p>
- *
- * @version $Revision: 1.1.2.3 $
*/
public abstract class KeyPairGeneratorAdapter extends KeyPairGenerator
{
diff --git a/gnu/java/security/jce/sig/RSAKeyFactory.java b/gnu/java/security/jce/sig/RSAKeyFactory.java
index fecf54cb8..674e2afb6 100644
--- a/gnu/java/security/jce/sig/RSAKeyFactory.java
+++ b/gnu/java/security/jce/sig/RSAKeyFactory.java
@@ -84,7 +84,7 @@ public class RSAKeyFactory
PublicKey result;
try
{
- result = new RSAKeyPairX509Codec().decodePublicKey(encoded);
+ return new RSAKeyPairX509Codec().decodePublicKey(encoded);
}
catch (RuntimeException x)
{
@@ -131,7 +131,7 @@ public class RSAKeyFactory
PrivateKey result;
try
{
- result = new RSAKeyPairPKCS8Codec().decodePrivateKey(encoded);
+ return new RSAKeyPairPKCS8Codec().decodePrivateKey(encoded);
}
catch (RuntimeException x)
{
diff --git a/gnu/java/security/jce/sig/RSAPSSRawSignatureSpi.java b/gnu/java/security/jce/sig/RSAPSSRawSignatureSpi.java
index e44b8adf1..f3548d884 100644
--- a/gnu/java/security/jce/sig/RSAPSSRawSignatureSpi.java
+++ b/gnu/java/security/jce/sig/RSAPSSRawSignatureSpi.java
@@ -44,8 +44,6 @@ import gnu.java.security.sig.rsa.RSAPSSSignatureRawCodec;
/**
* The implementation of <i>Service Provider Interface</i> (<b>SPI</b>) adapter
* for the RSA-PSS signature scheme, encoded and/or decoded in RAW format.<p>
- *
- * @version $Revision: 1.1 $
*/
public class RSAPSSRawSignatureSpi extends SignatureAdapter
{
diff --git a/gnu/java/security/jce/sig/SignatureAdapter.java b/gnu/java/security/jce/sig/SignatureAdapter.java
index 2250f7819..4dcbe78e5 100644
--- a/gnu/java/security/jce/sig/SignatureAdapter.java
+++ b/gnu/java/security/jce/sig/SignatureAdapter.java
@@ -69,8 +69,6 @@ import java.util.logging.Logger;
*
* All the implementations which subclass this object, and which are serviced by
* the GNU Crypto provider implement the {@link java.lang.Cloneable} interface.<p>
- *
- * @version $Revision: 1.1.2.1 $
*/
class SignatureAdapter extends SignatureSpi implements Cloneable
{
diff --git a/gnu/java/security/key/IKeyPairCodec.java b/gnu/java/security/key/IKeyPairCodec.java
index afbffe87e..965a317d4 100644
--- a/gnu/java/security/key/IKeyPairCodec.java
+++ b/gnu/java/security/key/IKeyPairCodec.java
@@ -48,8 +48,6 @@ import java.security.PublicKey;
* cryptographic asymmetric keypairs. Codecs are useful for (a) externalising
* public and private keys for storage and on-the-wire transmission, as well as
* (b) re-creating their internal Java representation from external sources.</p>
- *
- * @version $Revision: 1.1.2.2 $
*/
public interface IKeyPairCodec
{
diff --git a/gnu/java/security/key/IKeyPairGenerator.java b/gnu/java/security/key/IKeyPairGenerator.java
index 219863d33..2e0b29928 100644
--- a/gnu/java/security/key/IKeyPairGenerator.java
+++ b/gnu/java/security/key/IKeyPairGenerator.java
@@ -43,8 +43,6 @@ import java.util.Map;
/**
* The visible methods of every asymmetric keypair generator.<p>
- *
- * @version $Revision: 1.1 $
*/
public interface IKeyPairGenerator
{
diff --git a/gnu/java/security/key/KeyPairGeneratorFactory.java b/gnu/java/security/key/KeyPairGeneratorFactory.java
index edcc186e2..8c2f348c9 100644
--- a/gnu/java/security/key/KeyPairGeneratorFactory.java
+++ b/gnu/java/security/key/KeyPairGeneratorFactory.java
@@ -49,8 +49,6 @@ import java.util.Set;
/**
* <p>A Factory to instantiate asymmetric keypair generators.</p>
- *
- * @version $Revision: 1.1 $
*/
public class KeyPairGeneratorFactory
{
@@ -87,7 +85,7 @@ public class KeyPairGeneratorFactory
name = name.trim();
IKeyPairGenerator result = null;
if (name.equalsIgnoreCase(Registry.DSA_KPG)
- || name.equals(Registry.DSS_KPG))
+ || name.equalsIgnoreCase(Registry.DSS_KPG))
{
result = new DSSKeyPairGenerator();
}
@@ -118,6 +116,7 @@ public class KeyPairGeneratorFactory
{
HashSet hs = new HashSet();
hs.add(Registry.DSS_KPG);
+ hs.add(Registry.DSA_KPG);
hs.add(Registry.RSA_KPG);
hs.add(Registry.DH_KPG);
hs.add(Registry.SRP_KPG);
@@ -135,11 +134,9 @@ public class KeyPairGeneratorFactory
}
catch (Exception x)
{
- IllegalArgumentException iae =
- new IllegalArgumentException ("strong crypto key pair generator not available: "
- + clazz);
- iae.initCause (x);
- throw iae;
+ throw new IllegalArgumentException(
+ "strong crypto key pair generator not available: " + clazz,
+ x);
}
}
diff --git a/gnu/java/security/key/dss/DSSKey.java b/gnu/java/security/key/dss/DSSKey.java
index a23377601..40aaea893 100644
--- a/gnu/java/security/key/dss/DSSKey.java
+++ b/gnu/java/security/key/dss/DSSKey.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.security.key.dss;
+import gnu.classpath.SystemProperties;
import gnu.java.security.Registry;
import gnu.java.security.util.FormatUtil;
@@ -59,7 +60,6 @@ import java.security.spec.DSAParameterSpec;
* the relevant <code>getEncoded()</code> methods of each of the private and
* public keys.</p>
*
- * @version $Revision: 1.1.2.3 $
* @see DSSPrivateKey#getEncoded
* @see DSSPublicKey#getEncoded
*/
@@ -95,6 +95,9 @@ public abstract class DSSKey implements Key, DSAKey
*/
protected final int defaultFormat;
+ /** String representation of this key. Cached for speed. */
+ private transient String str;
+
// Constructor(s)
// -------------------------------------------------------------------------
@@ -176,6 +179,22 @@ public abstract class DSSKey implements Key, DSAKey
&& g.equals(that.getParams().getG());
}
+ public String toString()
+ {
+ if (str == null)
+ {
+ String ls = SystemProperties.getProperty("line.separator");
+ str = new StringBuilder().append(ls)
+ .append("defaultFormat=").append(defaultFormat).append(",").append(ls)
+ .append("p=0x").append(p.toString(16)).append(",").append(ls)
+ .append("q=0x").append(q.toString(16)).append(",").append(ls)
+ .append("g=0x").append(g.toString(16))
+ .toString();
+ }
+
+ return str;
+ }
+
// abstract methods to be implemented by subclasses ------------------------
public abstract byte[] getEncoded(int format);
diff --git a/gnu/java/security/key/dss/DSSKeyPairPKCS8Codec.java b/gnu/java/security/key/dss/DSSKeyPairPKCS8Codec.java
index 30e30bd14..3a115b963 100644
--- a/gnu/java/security/key/dss/DSSKeyPairPKCS8Codec.java
+++ b/gnu/java/security/key/dss/DSSKeyPairPKCS8Codec.java
@@ -55,6 +55,7 @@ import java.security.InvalidParameterException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.ArrayList;
+import java.util.logging.Logger;
/**
* An implementation of an {@link IKeyPairCodec} that knows how to encode /
@@ -65,6 +66,7 @@ import java.util.ArrayList;
public class DSSKeyPairPKCS8Codec
implements IKeyPairCodec
{
+ private static final Logger log = Logger.getLogger(DSSKeyPairPKCS8Codec.class.getName());
private static final OID DSA_ALG_OID = new OID(Registry.DSA_OID_STRING);
// implicit 0-arguments constructor
@@ -137,7 +139,9 @@ public class DSSKeyPairPKCS8Codec
DERValue derAlgorithmID = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
algorithmID);
- DERValue derPrivateKey = new DERValue(DER.OCTET_STRING, Util.trim(x));
+ // The OCTET STRING is the DER encoding of an INTEGER.
+ DERValue derX = new DERValue(DER.INTEGER, x);
+ DERValue derPrivateKey = new DERValue(DER.OCTET_STRING, derX.getEncoded());
ArrayList pki = new ArrayList(3);
pki.add(derVersion);
@@ -180,6 +184,8 @@ public class DSSKeyPairPKCS8Codec
*/
public PrivateKey decodePrivateKey(byte[] input)
{
+ log.entering("DSSKeyPairPKCS8Codec", "decodePrivateKey");
+
if (input == null)
throw new InvalidParameterException("Input bytes MUST NOT be null");
@@ -220,8 +226,13 @@ public class DSSKeyPairPKCS8Codec
g = (BigInteger) val.getValue();
val = der.read();
+ log.finest("val = " + val);
byte[] xBytes = (byte[]) val.getValue();
- x = new BigInteger(1, xBytes);
+ log.finest(Util.dumpString(xBytes, "xBytes: "));
+ DERReader der2 = new DERReader(xBytes);
+ val = der2.read();
+ DerUtil.checkIsBigInteger(val, "Wrong X field");
+ x = (BigInteger) val.getValue();
}
catch (IOException e)
{
@@ -230,6 +241,7 @@ public class DSSKeyPairPKCS8Codec
throw y;
}
+ log.exiting("DSSKeyPairPKCS8Codec", "decodePrivateKey");
return new DSSPrivateKey(Registry.PKCS8_ENCODING_ID, p, q, g, x);
}
}
diff --git a/gnu/java/security/key/dss/DSSKeyPairRawCodec.java b/gnu/java/security/key/dss/DSSKeyPairRawCodec.java
index 86e5b0bef..7c5491d6f 100644
--- a/gnu/java/security/key/dss/DSSKeyPairRawCodec.java
+++ b/gnu/java/security/key/dss/DSSKeyPairRawCodec.java
@@ -49,8 +49,6 @@ import java.security.PublicKey;
/**
* <p>An object that implements the {@link IKeyPairCodec} operations for the
* <i>Raw</i> format to use with DSS keypairs.</p>
- *
- * @version $Revision: 1.1 $
*/
public class DSSKeyPairRawCodec implements IKeyPairCodec
{
diff --git a/gnu/java/security/key/dss/DSSPrivateKey.java b/gnu/java/security/key/dss/DSSPrivateKey.java
index 0b4e7e5e0..fe59cb6d7 100644
--- a/gnu/java/security/key/dss/DSSPrivateKey.java
+++ b/gnu/java/security/key/dss/DSSPrivateKey.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.security.key.dss;
+import gnu.classpath.SystemProperties;
import gnu.java.security.Registry;
import gnu.java.security.key.IKeyPairCodec;
@@ -48,21 +49,24 @@ import java.security.interfaces.DSAPrivateKey;
/**
* <p>An object that embodies a DSS (Digital Signature Standard) private key.</p>
*
- * @version $Revision: 1.1.2.2 $
* @see #getEncoded
*/
public class DSSPrivateKey extends DSSKey implements PrivateKey, DSAPrivateKey
{
-
// Constants and variables
// -------------------------------------------------------------------------
+ private static final boolean DEBUG = false;
+
/**
* <p>A randomly or pseudorandomly generated integer with <code>0 &lt; x &lt;
* q</code>.</p>
*/
private final BigInteger x;
+ /** String representation of this key. Cached for speed. */
+ private transient String str;
+
// Constructor(s)
// -------------------------------------------------------------------------
@@ -198,4 +202,18 @@ public class DSSPrivateKey extends DSSKey implements PrivateKey, DSAPrivateKey
DSAPrivateKey that = (DSAPrivateKey) obj;
return super.equals(that) && x.equals(that.getX());
}
+
+ public String toString()
+ {
+ if (str == null)
+ {
+ String ls = SystemProperties.getProperty("line.separator");
+ str = new StringBuilder(this.getClass().getName()).append("(")
+ .append(super.toString()).append(",").append(ls)
+ .append("x=0x").append(DEBUG ? x.toString(16) : "**...*").append(ls)
+ .append(")").toString();
+ }
+
+ return str;
+ }
}
diff --git a/gnu/java/security/key/dss/DSSPublicKey.java b/gnu/java/security/key/dss/DSSPublicKey.java
index 1890dddb8..522921313 100644
--- a/gnu/java/security/key/dss/DSSPublicKey.java
+++ b/gnu/java/security/key/dss/DSSPublicKey.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.security.key.dss;
+import gnu.classpath.SystemProperties;
import gnu.java.security.Registry;
import gnu.java.security.key.IKeyPairCodec;
@@ -48,12 +49,10 @@ import java.security.interfaces.DSAPublicKey;
/**
* <p>An object that embodies a DSS (Digital Signature Standard) public key.</p>
*
- * @version $Revision: 1.1.2.2 $
* @see #getEncoded
*/
public class DSSPublicKey extends DSSKey implements PublicKey, DSAPublicKey
{
-
// Constants and variables
// -------------------------------------------------------------------------
@@ -63,6 +62,9 @@ public class DSSPublicKey extends DSSKey implements PublicKey, DSAPublicKey
*/
private final BigInteger y;
+ /** String representation of this key. Cached for speed. */
+ private transient String str;
+
// Constructor(s)
// -------------------------------------------------------------------------
@@ -198,4 +200,18 @@ public class DSSPublicKey extends DSSKey implements PublicKey, DSAPublicKey
DSAPublicKey that = (DSAPublicKey) obj;
return super.equals(that) && y.equals(that.getY());
}
+
+ public String toString()
+ {
+ if (str == null)
+ {
+ String ls = SystemProperties.getProperty("line.separator");
+ str = new StringBuilder(this.getClass().getName()).append("(")
+ .append(super.toString()).append(",").append(ls)
+ .append("y=0x").append(y.toString(16)).append(ls)
+ .append(")").toString();
+ }
+
+ return str;
+ }
}
diff --git a/gnu/java/security/key/dss/FIPS186.java b/gnu/java/security/key/dss/FIPS186.java
index e5f0795f8..5984bcc93 100644
--- a/gnu/java/security/key/dss/FIPS186.java
+++ b/gnu/java/security/key/dss/FIPS186.java
@@ -53,8 +53,6 @@ import java.security.SecureRandom;
* <a href="http://www.itl.nist.gov/fipspubs/fip186.htm">Digital Signature
* Standard (DSS)</a>, Federal Information Processing Standards Publication 186.
* National Institute of Standards and Technology.
- *
- * @version $Revision: 1.1.2.3 $
*/
public class FIPS186
{
diff --git a/gnu/java/security/key/rsa/GnuRSAKey.java b/gnu/java/security/key/rsa/GnuRSAKey.java
index 6e98db354..3009dd71f 100644
--- a/gnu/java/security/key/rsa/GnuRSAKey.java
+++ b/gnu/java/security/key/rsa/GnuRSAKey.java
@@ -38,8 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.rsa;
+import gnu.classpath.SystemProperties;
import gnu.java.security.Registry;
-import gnu.java.security.key.IKeyPairCodec;
import gnu.java.security.util.FormatUtil;
import java.math.BigInteger;
@@ -48,8 +48,6 @@ import java.security.interfaces.RSAKey;
/**
* <p>A base asbtract class for both public and private RSA keys.</p>
- *
- * @version $Revision: 1.1.2.3 $
*/
public abstract class GnuRSAKey implements Key, RSAKey
{
@@ -69,6 +67,9 @@ public abstract class GnuRSAKey implements Key, RSAKey
*/
protected final int defaultFormat;
+ /** String representation of this key. Cached for speed. */
+ private transient String str;
+
// Constructor(s)
// -------------------------------------------------------------------------
@@ -113,7 +114,7 @@ public abstract class GnuRSAKey implements Key, RSAKey
/** @deprecated see getEncoded(int). */
public byte[] getEncoded()
{
- return getEncoded(IKeyPairCodec.RAW_FORMAT);
+ return getEncoded(defaultFormat);
}
public String getFormat()
@@ -175,6 +176,20 @@ public abstract class GnuRSAKey implements Key, RSAKey
return n.equals(that.getModulus());
}
+ public String toString()
+ {
+ if (str == null)
+ {
+ String ls = SystemProperties.getProperty("line.separator");
+ str = new StringBuilder().append(ls)
+ .append("defaultFormat=").append(defaultFormat).append(",").append(ls)
+ .append("n=0x").append(n.toString(16)).append(",").append(ls)
+ .append("e=0x").append(e.toString(16))
+ .toString();
+ }
+ return str;
+ }
+
// abstract methods to be implemented by subclasses ------------------------
public abstract byte[] getEncoded(int format);
diff --git a/gnu/java/security/key/rsa/GnuRSAPrivateKey.java b/gnu/java/security/key/rsa/GnuRSAPrivateKey.java
index c1e0fe9bc..920534487 100644
--- a/gnu/java/security/key/rsa/GnuRSAPrivateKey.java
+++ b/gnu/java/security/key/rsa/GnuRSAPrivateKey.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.security.key.rsa;
+import gnu.classpath.SystemProperties;
import gnu.java.security.Registry;
import gnu.java.security.key.IKeyPairCodec;
@@ -56,16 +57,15 @@ import java.security.interfaces.RSAPrivateKey;
* Primitive specification and supporting documentation.<br>
* Jakob Jonsson and Burt Kaliski.</li>
* </ol>
- *
- * @version $Revision: 1.1.2.2 $
*/
public class GnuRSAPrivateKey extends GnuRSAKey implements PrivateKey,
RSAPrivateCrtKey
{
-
// Constants and variables
// -------------------------------------------------------------------------
+ private static final boolean DEBUG = false;
+
/** The first prime divisor of the modulus. */
private final BigInteger p;
@@ -86,6 +86,9 @@ public class GnuRSAPrivateKey extends GnuRSAKey implements PrivateKey,
/** The CRT (Chinese Remainder Theorem) coefficient. */
private final BigInteger qInv;
+ /** String representation of this key. Cached for speed. */
+ private transient String str;
+
// Constructor(s)
// -------------------------------------------------------------------------
@@ -296,4 +299,22 @@ public class GnuRSAPrivateKey extends GnuRSAKey implements PrivateKey,
}
return false;
}
+
+ public String toString()
+ {
+ if (str == null)
+ {
+ String ls = SystemProperties.getProperty("line.separator");
+ str = new StringBuilder(this.getClass().getName()).append("(")
+ .append(super.toString()).append(",").append(ls)
+ .append("d=0x").append(DEBUG ? d.toString(16) : "**...*").append(ls)
+ .append("p=0x").append(DEBUG ? p.toString(16) : "**...*").append(ls)
+ .append("q=0x").append(DEBUG ? q.toString(16) : "**...*").append(ls)
+ .append("dP=0x").append(DEBUG ? dP.toString(16) : "**...*").append(ls)
+ .append("dQ=0x").append(DEBUG ? dQ.toString(16) : "**...*").append(ls)
+ .append("qInv=0x").append(DEBUG ? qInv.toString(16) : "**...*").append(ls)
+ .append(")").toString();
+ }
+ return str;
+ }
}
diff --git a/gnu/java/security/key/rsa/GnuRSAPublicKey.java b/gnu/java/security/key/rsa/GnuRSAPublicKey.java
index ad48300bb..8badede14 100644
--- a/gnu/java/security/key/rsa/GnuRSAPublicKey.java
+++ b/gnu/java/security/key/rsa/GnuRSAPublicKey.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.security.key.rsa;
+import gnu.classpath.SystemProperties;
import gnu.java.security.Registry;
import gnu.java.security.key.IKeyPairCodec;
@@ -55,16 +56,16 @@ import java.security.interfaces.RSAPublicKey;
* Primitive specification and supporting documentation.<br>
* Jakob Jonsson and Burt Kaliski.</li>
* </ol>
- *
- * @version $Revision: 1.1.2.2 $
*/
public class GnuRSAPublicKey extends GnuRSAKey implements PublicKey,
RSAPublicKey
{
-
// Constants and variables
// -------------------------------------------------------------------------
+ /** String representation of this key. Cached for speed. */
+ private transient String str;
+
// Constructor(s)
// -------------------------------------------------------------------------
@@ -182,4 +183,16 @@ public class GnuRSAPublicKey extends GnuRSAKey implements PublicKey,
return super.equals(that)
&& getPublicExponent().equals(that.getPublicExponent());
}
+
+ public String toString()
+ {
+ if (str == null)
+ {
+ String ls = SystemProperties.getProperty("line.separator");
+ str = new StringBuilder(this.getClass().getName()).append("(")
+ .append(super.toString()).append(",").append(ls)
+ .append(")").toString();
+ }
+ return str;
+ }
}
diff --git a/gnu/java/security/key/rsa/RSAKeyPairGenerator.java b/gnu/java/security/key/rsa/RSAKeyPairGenerator.java
index 9c7338f66..39063381f 100644
--- a/gnu/java/security/key/rsa/RSAKeyPairGenerator.java
+++ b/gnu/java/security/key/rsa/RSAKeyPairGenerator.java
@@ -50,6 +50,7 @@ import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.RSAKeyGenParameterSpec;
import java.util.Map;
+import java.util.logging.Logger;
/**
* <p>A key-pair generator for asymetric keys to use in conjunction with the RSA
@@ -68,10 +69,11 @@ import java.util.Map;
*/
public class RSAKeyPairGenerator implements IKeyPairGenerator
{
-
// Constants and variables
// -------------------------------------------------------------------------
+ private static final Logger log = Logger.getLogger(RSAKeyPairGenerator.class.getName());
+
/** The BigInteger constant 1. */
private static final BigInteger ONE = BigInteger.ONE;
@@ -150,6 +152,8 @@ public class RSAKeyPairGenerator implements IKeyPairGenerator
*/
public void setup(Map attributes)
{
+ log.entering(this.getClass().getName(), "setup", attributes);
+
// do we have a SecureRandom, or should we use our own?
rnd = (SecureRandom) attributes.get(SOURCE_OF_RANDOMNESS);
@@ -177,6 +181,8 @@ public class RSAKeyPairGenerator implements IKeyPairGenerator
Integer formatID = (Integer) attributes.get(PREFERRED_ENCODING_FORMAT);
preferredFormat = formatID == null ? DEFAULT_ENCODING_FORMAT
: formatID.intValue();
+
+ log.exiting(this.getClass().getName(), "setup");
}
/**
@@ -187,6 +193,8 @@ public class RSAKeyPairGenerator implements IKeyPairGenerator
*/
public KeyPair generate()
{
+ log.entering(this.getClass().getName(), "generate");
+
BigInteger p, q, n, d;
// 1. Generate a prime p in the interval [2**(M-1), 2**M - 1], where
@@ -234,7 +242,9 @@ public class RSAKeyPairGenerator implements IKeyPairGenerator
PublicKey pubK = new GnuRSAPublicKey(preferredFormat, n, e);
PrivateKey secK = new GnuRSAPrivateKey(preferredFormat, p, q, e, d);
- return new KeyPair(pubK, secK);
+ KeyPair result = new KeyPair(pubK, secK);
+ log.exiting(this.getClass().getName(), "generate", result);
+ return result;
}
// helper methods ----------------------------------------------------------
diff --git a/gnu/java/security/key/rsa/RSAKeyPairPKCS8Codec.java b/gnu/java/security/key/rsa/RSAKeyPairPKCS8Codec.java
index a7f65b610..0b9809032 100644
--- a/gnu/java/security/key/rsa/RSAKeyPairPKCS8Codec.java
+++ b/gnu/java/security/key/rsa/RSAKeyPairPKCS8Codec.java
@@ -45,6 +45,7 @@ import java.security.InvalidParameterException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.ArrayList;
+import java.util.logging.Logger;
import gnu.java.security.OID;
import gnu.java.security.Registry;
@@ -62,6 +63,7 @@ import gnu.java.security.util.DerUtil;
public class RSAKeyPairPKCS8Codec
implements IKeyPairCodec
{
+ private static final Logger log = Logger.getLogger(RSAKeyPairPKCS8Codec.class.getName());
private static final OID RSA_ALG_OID = new OID(Registry.RSA_OID_STRING);
// implicit 0-arguments constructor
@@ -120,6 +122,8 @@ public class RSAKeyPairPKCS8Codec
*/
public byte[] encodePrivateKey(PrivateKey key)
{
+ log.entering(this.getClass().getName(), "encodePrivateKey()", key);
+
if (! (key instanceof GnuRSAPrivateKey))
throw new InvalidParameterException("Wrong key type");
@@ -187,6 +191,7 @@ public class RSAKeyPairPKCS8Codec
throw y;
}
+ log.exiting(this.getClass().getName(), "encodePrivateKey()", result);
return result;
}
@@ -208,6 +213,8 @@ public class RSAKeyPairPKCS8Codec
*/
public PrivateKey decodePrivateKey(byte[] input)
{
+ log.entering(this.getClass().getName(), "decodePrivateKey()", input);
+
if (input == null)
throw new InvalidParameterException("Input bytes MUST NOT be null");
@@ -278,7 +285,9 @@ public class RSAKeyPairPKCS8Codec
throw y;
}
- return new GnuRSAPrivateKey(Registry.PKCS8_ENCODING_ID, n, e, d, p, q,
- dP, dQ, qInv);
+ PrivateKey result = new GnuRSAPrivateKey(Registry.PKCS8_ENCODING_ID, n, e,
+ d, p, q, dP, dQ, qInv);
+ log.exiting(this.getClass().getName(), "decodePrivateKey()", result);
+ return result;
}
}
diff --git a/gnu/java/security/key/rsa/RSAKeyPairX509Codec.java b/gnu/java/security/key/rsa/RSAKeyPairX509Codec.java
index 1c362784b..882d9c7b2 100644
--- a/gnu/java/security/key/rsa/RSAKeyPairX509Codec.java
+++ b/gnu/java/security/key/rsa/RSAKeyPairX509Codec.java
@@ -128,8 +128,9 @@ public class RSAKeyPairX509Codec
DERValue derN = new DERValue(DER.INTEGER, n);
DERValue derE = new DERValue(DER.INTEGER, e);
- ArrayList algorithmID = new ArrayList(1);
+ ArrayList algorithmID = new ArrayList(2);
algorithmID.add(derOID);
+ algorithmID.add(new DERValue(DER.NULL, null));
DERValue derAlgorithmID = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
algorithmID);
diff --git a/gnu/java/security/pkcs/PKCS7Data.java b/gnu/java/security/pkcs/PKCS7Data.java
new file mode 100644
index 000000000..3d3052b96
--- /dev/null
+++ b/gnu/java/security/pkcs/PKCS7Data.java
@@ -0,0 +1,69 @@
+/* PKCS7Data.java -- Reader/writer for PKCS#7 Data objects
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.security.pkcs;
+
+import gnu.java.security.OID;
+
+/**
+ * A read/write helper class for PKCS#7 Data ASN.1 structures.
+ */
+public class PKCS7Data
+{
+ public static final OID PKCS7_DATA = new OID("1.2.840.113549.1.7.1");
+
+ private byte[] content;
+
+ /**
+ * Constructs a new instance of <code>PKCS7Data</code> with the possibly
+ * null (implicetly referenced) content data.
+ *
+ * @param data the raw bytes of the data to use in a PKCS#7 framework.
+ */
+ public PKCS7Data(byte[] data)
+ {
+ super();
+
+ this.content = data;
+ }
+
+ public byte[] getEncoded()
+ {
+ return content;
+ }
+}
diff --git a/gnu/java/security/pkcs/PKCS7SignedData.java b/gnu/java/security/pkcs/PKCS7SignedData.java
index ba5efc722..0781f4ba9 100644
--- a/gnu/java/security/pkcs/PKCS7SignedData.java
+++ b/gnu/java/security/pkcs/PKCS7SignedData.java
@@ -1,5 +1,5 @@
-/* PKCS7SignedData.java -- reader for PKCS#7 signedData objects
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+/* PKCS7SignedData.java -- reader/writer for PKCS#7 signedData objects
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -42,19 +42,26 @@ import gnu.java.security.ber.BER;
import gnu.java.security.ber.BEREncodingException;
import gnu.java.security.ber.BERReader;
import gnu.java.security.ber.BERValue;
+import gnu.java.security.der.DER;
import gnu.java.security.der.DERValue;
+import gnu.java.security.der.DERWriter;
+import gnu.java.security.util.Util;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import java.math.BigInteger;
import java.security.cert.CRL;
import java.security.cert.CRLException;
import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
+import java.security.cert.X509CRL;
import java.util.ArrayList;
import java.util.Collections;
@@ -63,6 +70,7 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
+import java.util.logging.Logger;
/**
* The SignedData object in PKCS #7. This is a read-only implementation of
@@ -72,8 +80,8 @@ import java.util.Set;
*/
public class PKCS7SignedData
{
+ private static final Logger log = Logger.getLogger(PKCS7SignedData.class.getName());
- public static final OID PKCS7_DATA = new OID("1.2.840.113549.1.7.1");
public static final OID PKCS7_SIGNED_DATA = new OID("1.2.840.113549.1.7.2");
private BigInteger version;
@@ -84,13 +92,6 @@ public class PKCS7SignedData
private CRL[] crls;
private Set signerInfos;
- private static final boolean DEBUG = false;
- private static void debug(String msg)
- {
- System.err.print("PKCS7SignedData >> ");
- System.err.println(msg);
- }
-
public PKCS7SignedData(InputStream in)
throws CRLException, CertificateException, IOException
{
@@ -103,14 +104,12 @@ public class PKCS7SignedData
*
* <pre>
* SignedData ::= SEQUENCE {
- * version Version,
- * digestAlgorithms DigestAlgorithmIdentifiers,
- * contentInfo ContentInfo,
- * certificates
- * [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
- * crls
- * [1] IMPLICIT CertificateRevocationLists OPTIONAL,
- * signerInfos SignerInfos }
+ * version Version, -- always 1 for PKCS7 v1.5
+ * digestAlgorithms DigestAlgorithmIdentifiers,
+ * contentInfo ContentInfo,
+ * certificates [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
+ * crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
+ * signerInfos SignerInfos }
*
* Version ::= INTEGER
*
@@ -119,8 +118,8 @@ public class PKCS7SignedData
* DigestAlgorithmIdentifier ::= AlgorithmIdentifier
*
* ContentInfo ::= SEQUENCE {
- * contentType ContentType,
- * content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
+ * contentType ContentType,
+ * content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
*
* ContentType ::= OBJECT IDENTIFIER
*
@@ -128,7 +127,7 @@ public class PKCS7SignedData
* SET OF ExtendedCertificatesAndCertificate
*
* ExtendedCertificatesAndCertificate ::= CHOICE {
- * certificate Certificate, -- from X.509
+ * certificate Certificate, -- from X.509
* extendedCertificate [0] IMPLICIT ExtendedCertificate }
*
* CertificateRevocationLists ::= SET OF CertificateRevocationList
@@ -137,15 +136,13 @@ public class PKCS7SignedData
* SignerInfos ::= SET OF SignerInfo
*
* SignerInfo ::= SEQUENCE {
- * version Version,
- * issuerAndSerialNumber IssuerAndSerialNumber,
- * digestAlgorithm DigestAlgorithmIdentifier,
- * authenticatedAttributes
- * [0] IMPLICIT Attributes OPTIONAL,
- * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
- * encryptedDigest EncryptedDigest,
- * unauthenticatedAttributes
- * [1] IMPLICIT Attributes OPTIONAL }
+ * version Version, -- always 1 for PKCS7 v1.5
+ * issuerAndSerialNumber IssuerAndSerialNumber,
+ * digestAlgorithm DigestAlgorithmIdentifier,
+ * authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
+ * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
+ * encryptedDigest EncryptedDigest,
+ * unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL }
*
* EncryptedDigest ::= OCTET STRING
* </pre>
@@ -177,23 +174,21 @@ public class PKCS7SignedData
if (!val.isConstructed())
throw new BEREncodingException("malformed SignedData");
- if (DEBUG)
- debug("SignedData: " + val);
+ log.finest("SignedData: " + val);
val = ber.read();
if (val.getTag() != BER.INTEGER)
throw new BEREncodingException("expecting Version");
version = (BigInteger) val.getValue();
- if (DEBUG)
- debug(" Version: " + version);
+ log.finest(" Version: " + version);
digestAlgorithms = new HashSet();
val = ber.read();
if (!val.isConstructed())
throw new BEREncodingException("malformed DigestAlgorithmIdentifiers");
- if (DEBUG)
- debug(" DigestAlgorithmIdentifiers: " + val);
+
+ log.finest(" DigestAlgorithmIdentifiers: " + val);
int count = 0;
DERValue val2 = ber.read();
while (val2 != BER.END_OF_SEQUENCE &&
@@ -201,14 +196,14 @@ public class PKCS7SignedData
{
if (!val2.isConstructed())
throw new BEREncodingException("malformed AlgorithmIdentifier");
- if (DEBUG)
- debug(" AlgorithmIdentifier: " + val2);
+
+ log.finest(" AlgorithmIdentifier: " + val2);
count += val2.getEncodedLength();
val2 = ber.read();
if (val2.getTag() != BER.OBJECT_IDENTIFIER)
throw new BEREncodingException("malformed AlgorithmIdentifier");
- if (DEBUG)
- debug(" ID: " + val2.getValue());
+
+ log.finest(" digestAlgorithmIdentifiers OID: " + val2.getValue());
List algId = new ArrayList(2);
algId.add(val2.getValue());
val2 = ber.read();
@@ -219,29 +214,33 @@ public class PKCS7SignedData
algId.add(null);
else
algId.add(val2.getEncoded());
- if (DEBUG)
- debug(" params: " + new BigInteger(1, val2.getEncoded()).toString(16));
+
if (val2.isConstructed())
ber.skip(val2.getLength());
+
if (BERValue.isIndefinite(val))
val2 = ber.read();
}
else
algId.add(null);
+
+ log.finest(" digestAlgorithmIdentifiers params: ");
+ log.finest(Util.dumpString((byte[]) algId.get(1),
+ " digestAlgorithmIdentifiers params: "));
digestAlgorithms.add(algId);
}
val = ber.read();
if (!val.isConstructed())
throw new BEREncodingException("malformed ContentInfo");
- if (DEBUG)
- debug(" ContentInfo: " + val);
+
+ log.finest(" ContentInfo: " + val);
val2 = ber.read();
if (val2.getTag() != BER.OBJECT_IDENTIFIER)
throw new BEREncodingException("malformed ContentType");
+
contentType = (OID) val2.getValue();
- if (DEBUG)
- debug(" ContentType: " + contentType);
+ log.finest(" ContentType OID: " + contentType);
if (BERValue.isIndefinite(val)
|| (val.getLength() > 0 && val.getLength() > val2.getEncodedLength()))
{
@@ -251,18 +250,19 @@ public class PKCS7SignedData
content = val2.getEncoded();
if (BERValue.isIndefinite(val))
val2 = ber.read();
- if (DEBUG)
- debug(" Content: " + new BigInteger(1, content).toString(16));
}
}
+ log.finest(" Content: ");
+ log.finest(Util.dumpString(content, " Content: "));
+
val = ber.read();
if (val.getTag() == 0)
{
if (!val.isConstructed())
throw new BEREncodingException("malformed ExtendedCertificatesAndCertificates");
- if (DEBUG)
- debug(" ExtendedCertificatesAndCertificates: " + val);
+
+ log.finest(" ExtendedCertificatesAndCertificates: " + val);
count = 0;
val2 = ber.read();
List certs = new LinkedList();
@@ -271,8 +271,7 @@ public class PKCS7SignedData
{
Certificate cert =
x509.generateCertificate(new ByteArrayInputStream(val2.getEncoded()));
- if (DEBUG)
- debug(" Certificate: " + cert);
+ log.finest(" Certificate: " + cert);
certs.add(cert);
count += val2.getEncodedLength();
ber.skip(val2.getLength());
@@ -287,8 +286,8 @@ public class PKCS7SignedData
{
if (!val.isConstructed())
throw new BEREncodingException("malformed CertificateRevocationLists");
- if (DEBUG)
- debug(" CertificateRevocationLists: " + val);
+
+ log.finest(" CertificateRevocationLists: " + val);
count = 0;
val2 = ber.read();
List crls = new LinkedList();
@@ -296,8 +295,7 @@ public class PKCS7SignedData
(val.getLength() > 0 && val.getLength() > count))
{
CRL crl = x509.generateCRL(new ByteArrayInputStream(val2.getEncoded()));
- if (DEBUG)
- debug (" CRL: " + crl);
+ log.finest(" CRL: " + crl);
crls.add(crl);
count += val2.getEncodedLength();
ber.skip(val2.getLength());
@@ -312,8 +310,7 @@ public class PKCS7SignedData
if (!val.isConstructed())
throw new BEREncodingException("malformed SignerInfos");
- if (DEBUG)
- debug(" SignerInfos: " + val);
+ log.finest(" SignerInfos: " + val);
// FIXME read this more carefully.
// Since we are just reading a file (probably) we just read until we
@@ -327,6 +324,39 @@ public class PKCS7SignedData
}
}
+ /**
+ * Constructs a new instance of <code>PKCS7SignedData</code> given a
+ * designated set of fields.
+ *
+ * @param digestAlgorithms the collection of DigestAlgorithm elements. Each
+ * DigestAlgorithm is a {@link List} of two elements, the first is an
+ * OID while the second is dependent on the value of the OID element.
+ * @param data an instance of a PKCS#7 (non-signed) data. In its simplest form
+ * such an ASN.1 structure would consist of just the OID of a
+ * non-signed PKCS#7 Data.
+ * @param certificates the array of Certificates used to authenticate the
+ * enclosed (or referenced, in case the content is null) data.
+ * @param crls the array of certificate-revocation lists of the used
+ * certificates.
+ * @param signerInfos a set of {@link SignerInfo} elements, one per signer of
+ * the data referenced by this <code>PKCS7SignedData</code>
+ * instance.
+ */
+ public PKCS7SignedData(Set digestAlgorithms, PKCS7Data data,
+ Certificate[] certificates, X509CRL[] crls,
+ Set signerInfos)
+ {
+ super();
+
+ this.version = BigInteger.ONE;
+ this.digestAlgorithms = digestAlgorithms;
+ this.contentType = PKCS7_SIGNED_DATA;
+ this.content = data == null ? null : data.getEncoded();
+ this.certificates = certificates;
+ this.crls = crls;
+ this.signerInfos = signerInfos;
+ }
+
public BigInteger getVersion()
{
return version;
@@ -361,4 +391,89 @@ public class PKCS7SignedData
copy.add(it.next());
return Collections.unmodifiableSet(copy);
}
+
+ /**
+ * Writes to the designated output stream the DER encoding of the current
+ * contents of this instance.
+ *
+ * @param out the destination output stream.
+ * @throws IOException if an I/O related exception occurs during the process.
+ * @throws CRLException if an exception occurs while encoding the certificate
+ * revocation lists associated with this instance.
+ * @throws CertificateEncodingException if an exception occurs while encoding
+ * the certificate chains associated with this instance.
+ */
+ public void encode(OutputStream out) throws IOException, CRLException,
+ CertificateEncodingException
+ {
+ DERValue derVersion = new DERValue(DER.INTEGER, version);
+
+ DERValue derDigestAlgorithms = new DERValue(DER.CONSTRUCTED | DER.SET,
+ digestAlgorithms);
+
+ DERValue derContentType = new DERValue(DER.OBJECT_IDENTIFIER,
+ PKCS7Data.PKCS7_DATA);
+ ArrayList contentInfo = new ArrayList(2);
+ contentInfo.add(derContentType);
+ if (content == null)
+ contentInfo.add(new DERValue(DER.NULL, null));
+ else
+ contentInfo.add(content);
+
+ DERValue derContentInfo = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ contentInfo);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
+ for (int i = 0; i < certificates.length; i++)
+ baos.write(certificates[i].getEncoded());
+
+ baos.flush();
+ byte[] b = baos.toByteArray();
+ DERValue derExtendedCertificatesAndCertificates =
+ new DERValue(DER.CONSTRUCTED | DER.CONTEXT | 0, b.length, b, null);
+
+ DERValue derCertificateRevocationLists = null;
+ if (crls != null && crls.length > 0)
+ {
+ baos.reset();
+ for (int i = 0; i < crls.length; i++)
+ baos.write(((X509CRL) crls[i]).getEncoded());
+
+ baos.flush();
+ byte[] b2 = baos.toByteArray();
+ derCertificateRevocationLists =
+ new DERValue(DER.CONSTRUCTED | DER.CONTEXT | 1, b2.length, b2, null);
+ }
+
+ baos.reset();
+ for (Iterator it = signerInfos.iterator(); it.hasNext();)
+ {
+ SignerInfo signerInfo = (SignerInfo) it.next();
+ signerInfo.encode(baos);
+ }
+ baos.flush();
+ byte[] b3 = baos.toByteArray();
+ DERValue derSignerInfos = new DERValue(DER.CONSTRUCTED | DER.SET,
+ b3.length, b3, null);
+
+ ArrayList signedData = new ArrayList(6);
+ signedData.add(derVersion);
+ signedData.add(derDigestAlgorithms);
+ signedData.add(derContentInfo);
+ signedData.add(derExtendedCertificatesAndCertificates);
+ if (derCertificateRevocationLists != null)
+ signedData.add(derCertificateRevocationLists);
+
+ signedData.add(derSignerInfos);
+ DERValue derSignedData = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ signedData);
+ // now the outer contents
+ ArrayList outer = new ArrayList(3);
+ outer.add(new DERValue(DER.OBJECT_IDENTIFIER, PKCS7_SIGNED_DATA));
+ outer.add(new DERValue(DER.CONTEXT | 0, null));
+ outer.add(derSignedData);
+ DERValue derOuter = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, outer);
+
+ DERWriter.write(out, derOuter);
+ }
}
diff --git a/gnu/java/security/pkcs/SignerInfo.java b/gnu/java/security/pkcs/SignerInfo.java
index c976799bb..7b38bfefd 100644
--- a/gnu/java/security/pkcs/SignerInfo.java
+++ b/gnu/java/security/pkcs/SignerInfo.java
@@ -42,16 +42,25 @@ import gnu.java.security.ber.BER;
import gnu.java.security.ber.BEREncodingException;
import gnu.java.security.ber.BERReader;
import gnu.java.security.ber.BERValue;
+import gnu.java.security.der.DER;
import gnu.java.security.der.DERValue;
+import gnu.java.security.der.DERWriter;
+import gnu.java.security.util.Util;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.OutputStream;
import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.logging.Logger;
import javax.security.auth.x500.X500Principal;
public class SignerInfo
{
+ private static final Logger log = Logger.getLogger(SignerInfo.class.getName());
+
private final BigInteger version;
private final BigInteger serialNumber;
private final X500Principal issuer;
@@ -63,67 +72,80 @@ public class SignerInfo
private final byte[] encryptedDigest;
private final byte[] unauthenticatedAttributes;
- private static final boolean DEBUG = false;
- private static void debug(String msg)
- {
- System.err.print("SignerInfo >> ");
- System.err.println(msg);
- }
-
/**
* Parse a SignerInfo object.
+ * <p>
+ * A SignerInfo is a structure with the following ASN.1 syntax:
+ * <pre>
+ * SignerInfo ::= SEQUENCE {
+ * version Version, -- always 1 for PKCS7 v1.5
+ * issuerAndSerialNumber IssuerAndSerialNumber, -- an INTEGER
+ * digestAlgorithm DigestAlgorithmIdentifier,
+ * authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
+ * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
+ * encryptedDigest EncryptedDigest,
+ * unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL }
+ *
+ * IssuerAndSerialNumber ::= SEQUENCE {
+ * issuer Name,
+ * serialNumber CertificateSerialNumber
+ * }
+ *
+ * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
+ *
+ * DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
+ *
+ * EncryptedDigest ::= OCTET STRING
+ * </pre>
*/
public SignerInfo(BERReader ber) throws IOException
{
DERValue val = ber.read();
- if (DEBUG)
- debug("SignerInfo: " + val);
+ log.finest("SignerInfo: " + val);
if (!val.isConstructed())
throw new BEREncodingException("malformed SignerInfo");
val = ber.read();
if (val.getTag() != BER.INTEGER)
throw new BEREncodingException("malformed Version");
- version = (BigInteger) val.getValue();
- if (DEBUG)
- debug(" Version: " + version);
+ version = (BigInteger) val.getValue();
+ log.finest(" Version: " + version);
val = ber.read();
if (!val.isConstructed())
throw new BEREncodingException("malformed IssuerAndSerialNumber");
- if (DEBUG)
- debug(" IssuerAndSerialNumber: " + val);
+ log.finest(" IssuerAndSerialNumber: " + val);
val = ber.read();
if (!val.isConstructed())
throw new BEREncodingException("malformed Issuer");
+
issuer = new X500Principal(val.getEncoded());
ber.skip(val.getLength());
- if (DEBUG)
- debug(" Issuer: " + issuer);
+ log.finest(" Issuer: " + issuer);
val = ber.read();
if (val.getTag() != BER.INTEGER)
throw new BEREncodingException("malformed SerialNumber");
+
serialNumber = (BigInteger) val.getValue();
- if (DEBUG)
- debug(" SerialNumber: " + serialNumber);
+ log.finest(" SerialNumber: " + serialNumber);
val = ber.read();
if (!val.isConstructed())
throw new BEREncodingException("malformed DigestAlgorithmIdentifier");
- if (DEBUG)
- debug(" DigestAlgorithmIdentifier: " + val);
+
+ log.finest(" DigestAlgorithmIdentifier: " + val);
int count = 0;
DERValue val2 = ber.read();
if (val2.getTag() != BER.OBJECT_IDENTIFIER)
throw new BEREncodingException("malformed AlgorithmIdentifier");
+
digestAlgorithmId = (OID) val2.getValue();
- if (DEBUG)
- debug(" OID: " + digestAlgorithmId);
+ log.finest(" digestAlgorithm OID: " + digestAlgorithmId);
if (BERValue.isIndefinite(val))
{
@@ -147,9 +169,10 @@ public class SignerInfo
}
else
digestAlgorithmParams = null;
- if(DEBUG)
- debug(" params: " + (digestAlgorithmParams == null ? null
- : new BigInteger(digestAlgorithmParams).toString(16)));
+
+ log.finest(" digestAlgorithm params: ");
+ log.finest(Util.dumpString(digestAlgorithmParams,
+ " digestAlgorithm params: "));
val = ber.read();
if (val.getTag() == 0)
@@ -158,24 +181,27 @@ public class SignerInfo
val = ber.read();
if (val.isConstructed())
ber.skip(val.getLength());
- if (DEBUG)
- debug(" AuthenticatedAttributes: " + val);
+
val = ber.read();
}
else
authenticatedAttributes = null;
+ log.finest(" AuthenticatedAttributes: ");
+ log.finest(Util.dumpString(authenticatedAttributes,
+ " AuthenticatedAttributes: "));
+
if (!val.isConstructed())
throw new BEREncodingException("malformed DigestEncryptionAlgorithmIdentifier");
- if (DEBUG)
- debug(" DigestEncryptionAlgorithmIdentifier: " + val);
+
+ log.finest(" DigestEncryptionAlgorithmIdentifier: " + val);
count = 0;
val2 = ber.read();
if (val2.getTag() != BER.OBJECT_IDENTIFIER)
throw new BEREncodingException("malformed AlgorithmIdentifier");
+
digestEncryptionAlgorithmId = (OID) val2.getValue();
- if (DEBUG)
- debug(" OID: " + digestEncryptionAlgorithmId);
+ log.finest(" digestEncryptionAlgorithm OID: " + digestEncryptionAlgorithmId);
if (BERValue.isIndefinite(val))
{
@@ -199,26 +225,74 @@ public class SignerInfo
}
else
digestEncryptionAlgorithmParams = null;
- if(DEBUG)
- debug(" params: " + (digestEncryptionAlgorithmParams == null ? null
- : new BigInteger(digestEncryptionAlgorithmParams).toString(16)));
+
+ log.finest(" digestEncryptionAlgorithm params: ");
+ log.finest(Util.dumpString(digestEncryptionAlgorithmParams,
+ " digestEncryptionAlgorithm params: "));
val = ber.read();
if (val.getTag() != BER.OCTET_STRING)
throw new BEREncodingException("malformed EncryptedDigest");
+
encryptedDigest = (byte[]) val.getValue();
- if (DEBUG)
- debug(" EncryptedDigest: " + new BigInteger(1, encryptedDigest).toString(16));
+ log.finest(" EncryptedDigest: ");
+ log.finest(Util.dumpString(encryptedDigest, " EncryptedDigest: "));
if (ber.peek() == 1)
unauthenticatedAttributes = ber.read().getEncoded();
else
unauthenticatedAttributes = null;
+ log.finest(" UnauthenticatedAttributes: ");
+ log.finest(Util.dumpString(unauthenticatedAttributes,
+ " UnauthenticatedAttributes: "));
+
if (ber.peek() == 0)
ber.read();
}
+ /**
+ * Constructs a new instance of <code>SignerInfo</code> given a designated
+ * set of fields.
+ *
+ * @param issuer the X.500 Principal name of the signer referenced by this
+ * instance.
+ * @param serialNumber the serial number of the certificate being used. Both
+ * this and the previous arguments are gleaned from the signer's
+ * certificate.
+ * @param digestAlgorithmOID the OID of the digest algorithm. When
+ * constructing the DigestAlgorithmIdentifier with this OID, the
+ * parameters part will be NULL.
+ * @param authenticatedAttributes the encoding of the set of authenticated
+ * attributes to use.
+ * @param digestEncryptionAlgorithmOID the OID of the digest encryption
+ * algorithm. When constructing the
+ * DigestEncryptionAlgorithmIdentifier with this OID, the parameters
+ * part will be NULL.
+ * @param encryptedDigest the encrypted hash generated with this signer's
+ * private key.
+ * @param unauthenticatedAttributes the encoding of the set of
+ * unauthencticated attributes.
+ */
+ public SignerInfo(X500Principal issuer, BigInteger serialNumber,
+ OID digestAlgorithmOID, byte[] authenticatedAttributes,
+ OID digestEncryptionAlgorithmOID,
+ byte[] encryptedDigest, byte[] unauthenticatedAttributes)
+ {
+ super();
+
+ this.version = BigInteger.ONE;
+ this.issuer = issuer;
+ this.serialNumber = serialNumber;
+ this.digestAlgorithmId = digestAlgorithmOID;
+ this.digestAlgorithmParams = null;
+ this.authenticatedAttributes = authenticatedAttributes;
+ this.digestEncryptionAlgorithmId = digestEncryptionAlgorithmOID;
+ this.digestEncryptionAlgorithmParams = null;
+ this.encryptedDigest = encryptedDigest;
+ this.unauthenticatedAttributes = unauthenticatedAttributes;
+ }
+
public BigInteger getVersion()
{
return version;
@@ -276,4 +350,65 @@ public class SignerInfo
? (byte[]) unauthenticatedAttributes.clone()
: null);
}
+
+ /**
+ * Writes to the designated output stream the DER encoding of the current
+ * contents of this instance.
+ *
+ * @param out the destination output stream.
+ * @throws IOException if an I/O related exception occurs during the process.
+ */
+ public void encode(OutputStream out) throws IOException
+ {
+ DERValue derVersion = new DERValue(DER.INTEGER, version);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
+ baos.write(issuer.getEncoded());
+ DERValue derSerialNumber = new DERValue(DER.INTEGER, serialNumber);
+ DERWriter.write(baos, derSerialNumber);
+ baos.flush();
+ byte[] b = baos.toByteArray();
+ DERValue derIssuerAndSerialNumber =
+ new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, b.length, b, null);
+
+ DERValue derDigestAlgorithmOID = new DERValue(DER.OBJECT_IDENTIFIER,
+ digestAlgorithmId);
+ ArrayList digestAlgorithmIdentifier = new ArrayList(1);
+ digestAlgorithmIdentifier.add(derDigestAlgorithmOID);
+ DERValue derDigestAlgorithmIdentifier =
+ new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, digestAlgorithmIdentifier);
+
+ DERValue derAuthenticatedAttributes;
+ if (authenticatedAttributes == null)
+ derAuthenticatedAttributes = new DERValue(DER.NULL, null);
+ else
+ derAuthenticatedAttributes = new DERValue(DER.CONSTRUCTED | DER.SET,
+ authenticatedAttributes);
+
+ DERValue derDigestEncryptionAlgorithmOID =
+ new DERValue(DER.OBJECT_IDENTIFIER, digestEncryptionAlgorithmId);
+ ArrayList digestEncryptionAlgorithmIdentifier = new ArrayList(1);
+ digestEncryptionAlgorithmIdentifier.add(derDigestEncryptionAlgorithmOID);
+ DERValue derDigestEncryptionAlgorithmIdentifier =
+ new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, digestEncryptionAlgorithmIdentifier);
+
+ DERValue derEncryptedDigest = new DERValue(DER.OCTET_STRING, encryptedDigest);
+
+ DERValue derUnauthenticatedAttributes;
+ if (unauthenticatedAttributes == null)
+ derUnauthenticatedAttributes = new DERValue(DER.NULL, null);
+ else
+ derUnauthenticatedAttributes = new DERValue(DER.CONSTRUCTED | DER.SET,
+ unauthenticatedAttributes);
+
+ ArrayList signerInfo = new ArrayList(5);
+ signerInfo.add(derVersion);
+ signerInfo.add(derIssuerAndSerialNumber);
+ signerInfo.add(derDigestAlgorithmIdentifier);
+ signerInfo.add(derDigestEncryptionAlgorithmIdentifier);
+ signerInfo.add(derEncryptedDigest);
+ DERValue derSignerInfo = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ signerInfo);
+ DERWriter.write(out, derSignerInfo);
+ }
}
diff --git a/gnu/java/security/prng/MDGenerator.java b/gnu/java/security/prng/MDGenerator.java
index 255647d1c..073c559ae 100644
--- a/gnu/java/security/prng/MDGenerator.java
+++ b/gnu/java/security/prng/MDGenerator.java
@@ -122,6 +122,20 @@ public class MDGenerator extends BasePRNG implements Cloneable
md.update(buffer, 0, buffer.length);
}
+ public void addRandomByte (final byte b)
+ {
+ if (md == null)
+ throw new IllegalStateException ("not initialized");
+ md.update (b);
+ }
+
+ public void addRandomBytes (final byte[] buf, final int off, final int len)
+ {
+ if (md == null)
+ throw new IllegalStateException ("not initialized");
+ md.update (buf, off, len);
+ }
+
// Cloneable interface implementation ---------------------------------------
public Object clone() throws CloneNotSupportedException
diff --git a/gnu/java/security/provider/DSAParameterGenerator.java b/gnu/java/security/provider/DSAParameterGenerator.java
deleted file mode 100644
index ccec1136c..000000000
--- a/gnu/java/security/provider/DSAParameterGenerator.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/* DSAParameterGenerator.java --- DSA Parameter Generator Implementation
- Copyright (C) 1999 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-
-package gnu.java.security.provider;
-
-import gnu.java.security.util.Prime;
-
-import java.math.BigInteger;
-import java.security.AlgorithmParameterGeneratorSpi;
-import java.security.AlgorithmParameters;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.spec.AlgorithmParameterSpec;
-import java.security.spec.DSAParameterSpec;
-import java.security.spec.InvalidParameterSpecException;
-import java.util.Random;
-
-public class DSAParameterGenerator extends AlgorithmParameterGeneratorSpi
-{
- private int size;
- private SecureRandom random = null;
-
- public DSAParameterGenerator()
- {
- size = 1024;
- }
-
- public void engineInit(int size, SecureRandom random)
- {
- if( (size < 512) || (size > 1024) || ( (size % 64) != 0) )
- //throw new InvalidAlgorithmParameterException("Invalid Size");
- return;
- this.size = size;
- this.random = random;
- }
-
- public void engineInit(AlgorithmParameterSpec genParamSpec, SecureRandom random)
- throws InvalidAlgorithmParameterException
- {
- if( !( genParamSpec instanceof DSAParameterSpec ) )
- throw new InvalidAlgorithmParameterException("Must be DSAParameterSpec");
-
- DSAParameterSpec dsaparameterspec = (DSAParameterSpec)genParamSpec;
- int tmp = dsaparameterspec.getP().bitLength();
-
- if( (tmp < 512) || (tmp > 1024) || ( (tmp % 64) != 0) )
- throw new InvalidAlgorithmParameterException("Invalid Size");
-
- this.random = random;
- }
-
- //For more information see IEEE P1363 A.16.1 (10/05/98 Draft)
- public AlgorithmParameters engineGenerateParameters()
- {
- DSAParameterSpec dsaparameterspec;
-
- int L = size;
- BigInteger r, p, k, h, g;
-
- //q 2^159 < q < 2^160
- r = Prime.generateRandomPrime( 159, 160, BigInteger.valueOf(1));
-
- // 2^(L-1) < p < 2^L
- p = Prime.generateRandomPrime( r, BigInteger.valueOf(1), L - 1, L, BigInteger.valueOf(1));
-
- k = p.subtract( BigInteger.valueOf(1) );
- k = k.divide( r );
-
- Random rand = new Random();
- h = BigInteger.valueOf(1);
-
- for(;;) {
- h = h.add(BigInteger.valueOf( 1 ) );
-
- g = h.modPow(k, p);
-
- if( g.compareTo( BigInteger.valueOf(1) ) != 1 )
- break;
- }
-
- try {
- dsaparameterspec = new DSAParameterSpec(p, r, g);
- AlgorithmParameters ap = AlgorithmParameters.getInstance("DSA");
- ap.init( dsaparameterspec );
- return ap;
- } catch ( NoSuchAlgorithmException nsae ) {
- return null;
- } catch ( InvalidParameterSpecException ipse) {
- return null;
- }
- }
-}
diff --git a/gnu/java/security/provider/Gnu.java b/gnu/java/security/provider/Gnu.java
index 061356644..6ea96c1e4 100644
--- a/gnu/java/security/provider/Gnu.java
+++ b/gnu/java/security/provider/Gnu.java
@@ -86,6 +86,7 @@ public final class Gnu extends Provider
put("Alg.Alias.Signature.md5WithRSAEncryption", "MD5withRSA");
put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.4", "MD5withRSA");
put("Alg.Alias.Signature.1.2.840.113549.1.1.4", "MD5withRSA");
+ put("Alg.Alias.Signature.RSA", "MD5withRSA");
put("Signature.SHA160withRSA",
gnu.java.security.jce.sig.SHA160withRSA.class.getName());
diff --git a/gnu/java/security/sig/ISignature.java b/gnu/java/security/sig/ISignature.java
index 77653ee37..e77f39d2c 100644
--- a/gnu/java/security/sig/ISignature.java
+++ b/gnu/java/security/sig/ISignature.java
@@ -56,8 +56,6 @@ import java.util.Map;
* Cryptography</a>, Alfred J. Menezes, Paul C. van Oorschot and Scott A.
* Vanstone. Section 11.2.2 Digital signature schemes with appendix.</li>
* </ol>
- *
- * @version $Revision: 1.1 $
*/
public interface ISignature extends Cloneable
{
diff --git a/gnu/java/security/sig/ISignatureCodec.java b/gnu/java/security/sig/ISignatureCodec.java
index 119eca5fd..b6ab0ba9b 100644
--- a/gnu/java/security/sig/ISignatureCodec.java
+++ b/gnu/java/security/sig/ISignatureCodec.java
@@ -45,8 +45,6 @@ import gnu.java.security.Registry;
* cryptographic signatures. Codecs are useful for (a) externalising signature
* output data for storage and on-the-wire transmission, as well as (b) re-
* creating their internal Java representation from external sources.</p>
- *
- * @version $Revision: 1.1 $
*/
public interface ISignatureCodec
{
diff --git a/gnu/java/security/sig/dss/DSSSignature.java b/gnu/java/security/sig/dss/DSSSignature.java
index 6bedfaefa..370a93854 100644
--- a/gnu/java/security/sig/dss/DSSSignature.java
+++ b/gnu/java/security/sig/dss/DSSSignature.java
@@ -111,8 +111,6 @@ import java.util.Random;
* Signature Standard (DSS)</a>, Federal Information Processing Standards
* Publication 186. National Institute of Standards and Technology.</li>
* </ol>
- *
- * @version $Revision: 1.1 $
*/
public class DSSSignature extends BaseSignature
{
diff --git a/gnu/java/security/sig/dss/DSSSignatureRawCodec.java b/gnu/java/security/sig/dss/DSSSignatureRawCodec.java
index 02f6b1ddc..b0590a573 100644
--- a/gnu/java/security/sig/dss/DSSSignatureRawCodec.java
+++ b/gnu/java/security/sig/dss/DSSSignatureRawCodec.java
@@ -47,8 +47,6 @@ import java.math.BigInteger;
/**
* <p>An object that implements the {@link ISignatureCodec} operations for the
* <i>Raw</i> format to use with DSS signatures.</p>
- *
- * @version $Revision: 1.1 $
*/
public class DSSSignatureRawCodec implements ISignatureCodec
{
diff --git a/gnu/java/security/sig/rsa/EMSA_PKCS1_V1_5.java b/gnu/java/security/sig/rsa/EMSA_PKCS1_V1_5.java
index fde4fcc03..d155fc88f 100644
--- a/gnu/java/security/sig/rsa/EMSA_PKCS1_V1_5.java
+++ b/gnu/java/security/sig/rsa/EMSA_PKCS1_V1_5.java
@@ -57,8 +57,6 @@ import java.io.ByteArrayOutputStream;
* RSA Cryptography Specifications Version 2.1.<br>
* Jakob Jonsson and Burt Kaliski.</li>
* </ol>
- *
- * @version $Revision: 1.1.2.1 $
*/
public class EMSA_PKCS1_V1_5 implements Cloneable
{
diff --git a/gnu/java/security/sig/rsa/EMSA_PSS.java b/gnu/java/security/sig/rsa/EMSA_PSS.java
index d11a861b5..c1c9760ed 100644
--- a/gnu/java/security/sig/rsa/EMSA_PSS.java
+++ b/gnu/java/security/sig/rsa/EMSA_PSS.java
@@ -67,8 +67,6 @@ import java.util.Arrays;
* Primitive specification and supporting documentation.<br>
* Jakob Jonsson and Burt Kaliski.</li>
* </ol>
- *
- * @version $Revision: 1.1 $
*/
public class EMSA_PSS implements Cloneable
{
diff --git a/gnu/java/security/sig/rsa/RSAPKCS1V1_5Signature.java b/gnu/java/security/sig/rsa/RSAPKCS1V1_5Signature.java
index 46380523b..e64d30b69 100644
--- a/gnu/java/security/sig/rsa/RSAPKCS1V1_5Signature.java
+++ b/gnu/java/security/sig/rsa/RSAPKCS1V1_5Signature.java
@@ -67,8 +67,6 @@ import java.util.Arrays;
* RSA Cryptography Specifications Version 2.1.<br>
* Jakob Jonsson and Burt Kaliski.</li>
* </ol>
- *
- * @version $Revision: 1.1.2.1 $
*/
public class RSAPKCS1V1_5Signature extends BaseSignature
{
diff --git a/gnu/java/security/sig/rsa/RSAPSSSignature.java b/gnu/java/security/sig/rsa/RSAPSSSignature.java
index 2ce9fb01a..7ec62568a 100644
--- a/gnu/java/security/sig/rsa/RSAPSSSignature.java
+++ b/gnu/java/security/sig/rsa/RSAPSSSignature.java
@@ -70,8 +70,6 @@ import java.security.interfaces.RSAPublicKey;
* Primitive specification and supporting documentation.<br>
* Jakob Jonsson and Burt Kaliski.</li>
* </ol>
- *
- * @version $Revision: 1.1.2.1 $
*/
public class RSAPSSSignature extends BaseSignature
{
diff --git a/gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java b/gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java
index 64a972ca3..2be79165f 100644
--- a/gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java
+++ b/gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java
@@ -46,8 +46,6 @@ import java.io.ByteArrayOutputStream;
/**
* <p>An object that implements the {@link gnu.crypto.sig.ISignatureCodec}
* operations for the <i>Raw</i> format to use with RSA-PSS signatures.</p>
- *
- * @version $Revision: 1.1 $
*/
public class RSAPSSSignatureRawCodec implements ISignatureCodec
{
diff --git a/gnu/java/security/util/Util.java b/gnu/java/security/util/Util.java
index 53f8e3c2c..f39afb931 100644
--- a/gnu/java/security/util/Util.java
+++ b/gnu/java/security/util/Util.java
@@ -42,8 +42,6 @@ import java.math.BigInteger;
/**
* <p>A collection of utility methods used throughout this project.</p>
- *
- * @version $Revision: 1.1 $
*/
public class Util
{
diff --git a/gnu/java/security/x509/X500DistinguishedName.java b/gnu/java/security/x509/X500DistinguishedName.java
index daf746f5d..02adad7d2 100644
--- a/gnu/java/security/x509/X500DistinguishedName.java
+++ b/gnu/java/security/x509/X500DistinguishedName.java
@@ -1,5 +1,5 @@
/* X500DistinguishedName.java -- X.500 distinguished name.
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -61,7 +61,6 @@ import java.util.Set;
public class X500DistinguishedName implements Principal
{
-
// Constants and fields.
// -------------------------------------------------------------------------
@@ -221,6 +220,10 @@ public class X500DistinguishedName implements Principal
putComponent(DC, value);
else if (name.equals("uid"))
putComponent(UID, value);
+ else if (name.equals("o"))
+ putComponent(O, value);
+ else if (name.equals("ou"))
+ putComponent(OU, value);
else
putComponent(new OID(name), value);
}
@@ -328,16 +331,18 @@ public class X500DistinguishedName implements Principal
{
if (fixed && encoded != null)
return (byte[]) encoded.clone();
+
ArrayList name = new ArrayList(components.size());
for (Iterator it = components.iterator(); it.hasNext(); )
{
Map m = (Map) it.next();
if (m.isEmpty())
continue;
+
Set rdn = new HashSet();
for (Iterator it2 = m.entrySet().iterator(); it2.hasNext(); )
{
- Map.Entry e = (Map.Entry) it.next();
+ Map.Entry e = (Map.Entry) it2.next();
ArrayList atav = new ArrayList(2);
atav.add(new DERValue(DER.OBJECT_IDENTIFIER, e.getKey()));
atav.add(new DERValue(DER.UTF8_STRING, e.getValue()));
@@ -486,6 +491,9 @@ public class X500DistinguishedName implements Principal
throw new EOFException();
default:
buf.append((char) ch);
+ ch = in.read();
+ if (ch == -1)
+ return buf.toString();
}
}
}
diff --git a/gnu/java/text/StringFormatBuffer.java b/gnu/java/text/StringFormatBuffer.java
index 5772186b4..19b621ce4 100644
--- a/gnu/java/text/StringFormatBuffer.java
+++ b/gnu/java/text/StringFormatBuffer.java
@@ -118,4 +118,10 @@ public class StringFormatBuffer implements FormatBuffer
{
return buffer;
}
+
+ public String toString()
+ {
+ return buffer.toString();
+ }
+
}
diff --git a/gnu/java/util/jar/JarUtils.java b/gnu/java/util/jar/JarUtils.java
new file mode 100644
index 000000000..c35daec55
--- /dev/null
+++ b/gnu/java/util/jar/JarUtils.java
@@ -0,0 +1,447 @@
+/* JarUtils.java -- Utility methods for reading/writing Manifest[-like] files
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.util.jar;
+
+import gnu.classpath.SystemProperties;
+
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.jar.Attributes;
+import java.util.jar.JarException;
+import java.util.jar.Attributes.Name;
+import java.util.logging.Logger;
+
+/**
+ * Utility methods for reading and writing JAR <i>Manifest</i> and
+ * <i>Manifest-like</i> files.
+ * <p>
+ * JAR-related files that resemble <i>Manifest</i> files are Signature files
+ * (with an <code>.SF</code> extension) found in signed JARs.
+ */
+public abstract class JarUtils
+{
+ private static final Logger log = Logger.getLogger(JarUtils.class.getName());
+ public static final String META_INF = "META-INF/";
+ public static final String DSA_SUFFIX = ".DSA";
+ public static final String SF_SUFFIX = ".SF";
+ public static final String NAME = "Name";
+
+ /**
+ * The original string representation of the manifest version attribute name.
+ */
+ public static final String MANIFEST_VERSION = "Manifest-Version";
+
+ /**
+ * The original string representation of the signature version attribute
+ * name.
+ */
+ public static final String SIGNATURE_VERSION = "Signature-Version";
+
+ /** Platform-independent line-ending. */
+ public static final byte[] CRLF = new byte[] { 0x0D, 0x0A };
+ private static final String DEFAULT_MF_VERSION = "1.0";
+ private static final String DEFAULT_SF_VERSION = "1.0";
+ private static final Name CREATED_BY = new Name("Created-By");
+ private static final String CREATOR = SystemProperties.getProperty("java.version")
+ + " ("
+ + SystemProperties.getProperty("java.vendor")
+ + ")";
+
+ // default 0-arguments constructor
+
+ // Methods for reading Manifest files from InputStream ----------------------
+
+ public static void
+ readMFManifest(Attributes attr, Map entries, InputStream in)
+ throws IOException
+ {
+ BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
+ readMainSection(attr, br);
+ readIndividualSections(entries, br);
+ }
+
+ public static void
+ readSFManifest(Attributes attr, Map entries, InputStream in)
+ throws IOException
+ {
+ BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
+ String version_header = Name.SIGNATURE_VERSION.toString();
+ try
+ {
+ String version = expectHeader(version_header, br);
+ attr.putValue(SIGNATURE_VERSION, version);
+ if (! DEFAULT_SF_VERSION.equals(version))
+ log.warning("Unexpected version number: " + version
+ + ". Continue (but may fail later)");
+ }
+ catch (IOException ioe)
+ {
+ throw new JarException("Signature file MUST start with a "
+ + version_header + ": " + ioe.getMessage());
+ }
+ read_attributes(attr, br);
+
+ // read individual sections
+ String s = br.readLine();
+ while (s != null && s.length() > 0)
+ {
+ Attributes eAttr = readSectionName(s, br, entries);
+ read_attributes(eAttr, br);
+ s = br.readLine();
+ }
+ }
+
+ private static void readMainSection(Attributes attr, BufferedReader br)
+ throws IOException
+ {
+ // According to the spec we should actually call read_version_info() here.
+ read_attributes(attr, br);
+ // Explicitly set Manifest-Version attribute if not set in Main
+ // attributes of Manifest.
+ // XXX (rsn): why 0.0 and not 1.0?
+ if (attr.getValue(Name.MANIFEST_VERSION) == null)
+ attr.putValue(MANIFEST_VERSION, "0.0");
+ }
+
+ private static void readIndividualSections(Map entries, BufferedReader br)
+ throws IOException
+ {
+ String s = br.readLine();
+ while (s != null && (! s.equals("")))
+ {
+ Attributes attr = readSectionName(s, br, entries);
+ read_attributes(attr, br);
+ s = br.readLine();
+ }
+ }
+
+ /**
+ * Pedantic method that requires the next attribute in the Manifest to be the
+ * "Manifest-Version". This follows the Manifest spec closely but reject some
+ * jar Manifest files out in the wild.
+ */
+ private static void readVersionInfo(Attributes attr, BufferedReader br)
+ throws IOException
+ {
+ String version_header = Name.MANIFEST_VERSION.toString();
+ try
+ {
+ String value = expectHeader(version_header, br);
+ attr.putValue(MANIFEST_VERSION, value);
+ }
+ catch (IOException ioe)
+ {
+ throw new JarException("Manifest should start with a " + version_header
+ + ": " + ioe.getMessage());
+ }
+ }
+
+ private static String expectHeader(String header, BufferedReader br)
+ throws IOException
+ {
+ String s = br.readLine();
+ if (s == null)
+ throw new JarException("unexpected end of file");
+
+ return expectHeader(header, br, s);
+ }
+
+ private static void read_attributes(Attributes attr, BufferedReader br)
+ throws IOException
+ {
+ String s = br.readLine();
+ while (s != null && (! s.equals("")))
+ {
+ readAttribute(attr, s, br);
+ s = br.readLine();
+ }
+ }
+
+ private static void
+ readAttribute(Attributes attr, String s, BufferedReader br) throws IOException
+ {
+ try
+ {
+ int colon = s.indexOf(": ");
+ String name = s.substring(0, colon);
+ String value_start = s.substring(colon + 2);
+ String value = readHeaderValue(value_start, br);
+ attr.putValue(name, value);
+ }
+ catch (IndexOutOfBoundsException iobe)
+ {
+ throw new JarException("Manifest contains a bad header: " + s);
+ }
+ }
+
+ private static String readHeaderValue(String s, BufferedReader br)
+ throws IOException
+ {
+ boolean try_next = true;
+ while (try_next)
+ {
+ // Lets see if there is something on the next line
+ br.mark(1);
+ if (br.read() == ' ')
+ s += br.readLine();
+ else
+ {
+ br.reset();
+ try_next = false;
+ }
+ }
+ return s;
+ }
+
+ private static Attributes
+ readSectionName(String s, BufferedReader br, Map entries) throws JarException
+ {
+ try
+ {
+ String name = expectHeader(NAME, br, s);
+ Attributes attr = new Attributes();
+ entries.put(name, attr);
+ return attr;
+ }
+ catch (IOException ioe)
+ {
+ throw new JarException("Section should start with a Name header: "
+ + ioe.getMessage());
+ }
+ }
+
+ private static String expectHeader(String header, BufferedReader br, String s)
+ throws IOException
+ {
+ try
+ {
+ String name = s.substring(0, header.length() + 1);
+ if (name.equalsIgnoreCase(header + ":"))
+ {
+ String value_start = s.substring(header.length() + 2);
+ return readHeaderValue(value_start, br);
+ }
+ }
+ catch (IndexOutOfBoundsException ignored)
+ {
+ }
+ // If we arrive here, something went wrong
+ throw new JarException("unexpected '" + s + "'");
+ }
+
+ // Methods for writing Manifest files to an OutputStream --------------------
+
+ public static void
+ writeMFManifest(Attributes attr, Map entries, OutputStream stream)
+ throws IOException
+ {
+ BufferedOutputStream out = stream instanceof BufferedOutputStream
+ ? (BufferedOutputStream) stream
+ : new BufferedOutputStream(stream, 4096);
+ writeVersionInfo(attr, out);
+ Iterator i;
+ Map.Entry e;
+ for (i = attr.entrySet().iterator(); i.hasNext();)
+ {
+ e = (Map.Entry) i.next();
+ // Don't print the manifest version again
+ if (! Name.MANIFEST_VERSION.equals(e.getKey()))
+ writeAttributeEntry(e, out);
+ }
+ out.write(CRLF);
+
+ Iterator j;
+ for (i = entries.entrySet().iterator(); i.hasNext();)
+ {
+ e = (Map.Entry) i.next();
+ writeHeader(NAME, e.getKey().toString(), out);
+ Attributes eAttr = (Attributes) e.getValue();
+ for (j = eAttr.entrySet().iterator(); j.hasNext();)
+ {
+ Map.Entry e2 = (Map.Entry) j.next();
+ writeAttributeEntry(e2, out);
+ }
+ out.write(CRLF);
+ }
+
+ out.flush();
+ }
+
+ public static void
+ writeSFManifest(Attributes attr, Map entries, OutputStream stream)
+ throws IOException
+ {
+ BufferedOutputStream out = stream instanceof BufferedOutputStream
+ ? (BufferedOutputStream) stream
+ : new BufferedOutputStream(stream, 4096);
+ writeHeader(Name.SIGNATURE_VERSION.toString(), DEFAULT_SF_VERSION, out);
+ writeHeader(CREATED_BY.toString(), CREATOR, out);
+ Iterator i;
+ Map.Entry e;
+ for (i = attr.entrySet().iterator(); i.hasNext();)
+ {
+ e = (Map.Entry) i.next();
+ Name name = (Name) e.getKey();
+ if (Name.SIGNATURE_VERSION.equals(name) || CREATED_BY.equals(name))
+ continue;
+
+ writeHeader(name.toString(), (String) e.getValue(), out);
+ }
+ out.write(CRLF);
+
+ Iterator j;
+ for (i = entries.entrySet().iterator(); i.hasNext();)
+ {
+ e = (Map.Entry) i.next();
+ writeHeader(NAME, e.getKey().toString(), out);
+ Attributes eAttr = (Attributes) e.getValue();
+ for (j = eAttr.entrySet().iterator(); j.hasNext();)
+ {
+ Map.Entry e2 = (Map.Entry) j.next();
+ writeHeader(e2.getKey().toString(), (String) e2.getValue(), out);
+ }
+ out.write(CRLF);
+ }
+
+ out.flush();
+ }
+
+ private static void writeVersionInfo(Attributes attr, OutputStream out)
+ throws IOException
+ {
+ // First check if there is already a version attribute set
+ String version = attr.getValue(Name.MANIFEST_VERSION);
+ if (version == null)
+ version = DEFAULT_MF_VERSION;
+
+ writeHeader(Name.MANIFEST_VERSION.toString(), version, out);
+ }
+
+ private static void writeAttributeEntry(Map.Entry entry, OutputStream out)
+ throws IOException
+ {
+ String name = entry.getKey().toString();
+ String value = entry.getValue().toString();
+ if (name.equalsIgnoreCase(NAME))
+ throw new JarException("Attributes cannot be called 'Name'");
+
+ if (name.startsWith("From"))
+ throw new JarException("Header cannot start with the four letters 'From'"
+ + name);
+
+ writeHeader(name, value, out);
+ }
+
+ /**
+ * The basic method for writing <code>Mainfest</code> attributes. This
+ * implementation respects the rule stated in the Jar Specification concerning
+ * the maximum allowed line length; i.e.
+ *
+ * <pre>
+ * No line may be longer than 72 bytes (not characters), in its UTF8-encoded
+ * form. If a value would make the initial line longer than this, it should
+ * be continued on extra lines (each starting with a single SPACE).
+ * </pre>
+ *
+ * and
+ *
+ * <pre>
+ * Because header names cannot be continued, the maximum length of a header
+ * name is 70 bytes (there must be a colon and a SPACE after the name).
+ * </pre>
+ *
+ * @param name the name of the attribute.
+ * @param value the value of the attribute.
+ * @param out the output stream to write the attribute's name/value pair to.
+ * @throws IOException if an I/O related exception occurs during the process.
+ */
+ private static void writeHeader(String name, String value, OutputStream out)
+ throws IOException
+ {
+ String target = name + ": ";
+ byte[] b = target.getBytes("UTF-8");
+ if (b.length > 72)
+ throw new IOException("Attribute's name already longer than 70 bytes");
+
+ if (b.length == 72)
+ {
+ out.write(b);
+ out.write(CRLF);
+ target = " " + value;
+ }
+ else
+ target = target + value;
+
+ int n;
+ while (true)
+ {
+ b = target.getBytes("UTF-8");
+ if (b.length < 73)
+ {
+ out.write(b);
+ break;
+ }
+
+ // find an appropriate character position to break on
+ n = 72;
+ while (true)
+ {
+ b = target.substring(0, n).getBytes("UTF-8");
+ if (b.length < 73)
+ break;
+
+ n--;
+ if (n < 1)
+ throw new IOException("Header is unbreakable and longer than 72 bytes");
+ }
+
+ out.write(b);
+ out.write(CRLF);
+ target = " " + target.substring(n);
+ }
+
+ out.write(CRLF);
+ }
+}
diff --git a/gnu/java/util/prefs/NodeWriter.java b/gnu/java/util/prefs/NodeWriter.java
index c3cf8e818..574ddc247 100644
--- a/gnu/java/util/prefs/NodeWriter.java
+++ b/gnu/java/util/prefs/NodeWriter.java
@@ -168,7 +168,7 @@ public class NodeWriter {
} else {
bw.write("system");
}
- bw.write("\"/>");
+ bw.write("\">");
writeRootMap();
writeNode();
diff --git a/gnu/javax/crypto/assembly/Assembly.java b/gnu/javax/crypto/assembly/Assembly.java
index 1d70eff87..2d5bba364 100644
--- a/gnu/javax/crypto/assembly/Assembly.java
+++ b/gnu/javax/crypto/assembly/Assembly.java
@@ -51,7 +51,6 @@ import java.util.Map;
* of the {@link Transformer} chain of the <code>Assembly</code>.</p>
*
* @see Transformer
- * @version $Revision: 1.1 $
*/
public class Assembly
{
diff --git a/gnu/javax/crypto/assembly/Cascade.java b/gnu/javax/crypto/assembly/Cascade.java
index 20cd3de9d..678a7e730 100644
--- a/gnu/javax/crypto/assembly/Cascade.java
+++ b/gnu/javax/crypto/assembly/Cascade.java
@@ -72,8 +72,6 @@ import java.util.Set;
* CRC Press, Inc. ISBN 0-8493-8523-7, 1997<br>
* Menezes, A., van Oorschot, P. and S. Vanstone.</li>
* </ol>
- *
- * @version $Revision: 1.1 $
*/
public class Cascade
{
diff --git a/gnu/javax/crypto/assembly/CascadeStage.java b/gnu/javax/crypto/assembly/CascadeStage.java
index 71a8b178f..81629f5a8 100644
--- a/gnu/javax/crypto/assembly/CascadeStage.java
+++ b/gnu/javax/crypto/assembly/CascadeStage.java
@@ -45,8 +45,6 @@ import java.util.Set;
/**
* <p>A Cascade <i>Stage</i> in a Cascade Cipher.</p>
- *
- * @version $Revision: 1.1 $
*/
class CascadeStage extends Stage
{
diff --git a/gnu/javax/crypto/assembly/CascadeTransformer.java b/gnu/javax/crypto/assembly/CascadeTransformer.java
index 325571dcd..dbbc7cd28 100644
--- a/gnu/javax/crypto/assembly/CascadeTransformer.java
+++ b/gnu/javax/crypto/assembly/CascadeTransformer.java
@@ -44,8 +44,6 @@ import java.util.Map;
/**
* An Adapter to use any {@link Cascade} as a {@link Transformer} in an
* {@link Assembly}.
- *
- * @version $Revision: 1.1 $
*/
class CascadeTransformer extends Transformer
{
diff --git a/gnu/javax/crypto/assembly/Direction.java b/gnu/javax/crypto/assembly/Direction.java
index 2e8ef1145..58b59a630 100644
--- a/gnu/javax/crypto/assembly/Direction.java
+++ b/gnu/javax/crypto/assembly/Direction.java
@@ -49,8 +49,6 @@ package gnu.javax.crypto.assembly;
* its inverse value</li>
* <li>REVERSED: equivalent to {@link gnu.crypto.mode.IMode#DECRYPTION}.</li>
* </ol>
- *
- * @version $Revision: 1.1 $
*/
public final class Direction
{
diff --git a/gnu/javax/crypto/assembly/LoopbackTransformer.java b/gnu/javax/crypto/assembly/LoopbackTransformer.java
index 62791264f..3c0bdfab3 100644
--- a/gnu/javax/crypto/assembly/LoopbackTransformer.java
+++ b/gnu/javax/crypto/assembly/LoopbackTransformer.java
@@ -43,8 +43,6 @@ import java.util.Map;
/**
* A trivial {@link Transformer} to allow closing a chain in an {@link Assembly}.
* This class is not visible outside this package.
- *
- * @version $Revision: 1.1 $
*/
final class LoopbackTransformer extends Transformer
{
diff --git a/gnu/javax/crypto/assembly/ModeStage.java b/gnu/javax/crypto/assembly/ModeStage.java
index 1cd8fd915..1143348f6 100644
--- a/gnu/javax/crypto/assembly/ModeStage.java
+++ b/gnu/javax/crypto/assembly/ModeStage.java
@@ -53,8 +53,6 @@ import java.util.Set;
* <p>Such a stage wraps an implementation of a Block Cipher Mode of Operation
* ({@link IMode}) to allow inclusion of such an instance in a cascade of block
* ciphers.</p>
- *
- * @version $Revision: 1.1 $
*/
class ModeStage extends Stage
{
diff --git a/gnu/javax/crypto/assembly/Operation.java b/gnu/javax/crypto/assembly/Operation.java
index 2646e1f33..34cae52ea 100644
--- a/gnu/javax/crypto/assembly/Operation.java
+++ b/gnu/javax/crypto/assembly/Operation.java
@@ -51,8 +51,6 @@ package gnu.javax.crypto.assembly;
* the chain, and the resulting bytes are then processed by the current
* {@link Transformer}.</li>
* </ol>
- *
- * @version $Revision: 1.1 $
*/
public final class Operation
{
diff --git a/gnu/javax/crypto/assembly/PaddingTransformer.java b/gnu/javax/crypto/assembly/PaddingTransformer.java
index 8af46a72a..c63f92e87 100644
--- a/gnu/javax/crypto/assembly/PaddingTransformer.java
+++ b/gnu/javax/crypto/assembly/PaddingTransformer.java
@@ -50,8 +50,6 @@ import java.util.Map;
* <p>When using such a {@link Transformer}, in an {@link Assembly}, there must
* be at least one element behind this instance in the constructed chain;
* otherwise, a {@link TransformerException} is thrown at initialisation time.</p>
- *
- * @version $Revision: 1.1 $
*/
class PaddingTransformer extends Transformer
{
diff --git a/gnu/javax/crypto/assembly/Stage.java b/gnu/javax/crypto/assembly/Stage.java
index e44985534..23d50bb82 100644
--- a/gnu/javax/crypto/assembly/Stage.java
+++ b/gnu/javax/crypto/assembly/Stage.java
@@ -82,7 +82,6 @@ import java.util.Set;
*
* @see ModeStage
* @see CascadeStage
- * @version $Revision: 1.1 $
*/
public abstract class Stage
{
diff --git a/gnu/javax/crypto/assembly/Transformer.java b/gnu/javax/crypto/assembly/Transformer.java
index c62c4677f..80430dc19 100644
--- a/gnu/javax/crypto/assembly/Transformer.java
+++ b/gnu/javax/crypto/assembly/Transformer.java
@@ -77,7 +77,6 @@ import java.util.Map;
* @see CascadeTransformer
* @see PaddingTransformer
* @see DeflateTransformer
- * @version $Revision: 1.1 $
*/
public abstract class Transformer
{
diff --git a/gnu/javax/crypto/cipher/Anubis.java b/gnu/javax/crypto/cipher/Anubis.java
index 63b97ce4e..ca4e8edfe 100644
--- a/gnu/javax/crypto/cipher/Anubis.java
+++ b/gnu/javax/crypto/cipher/Anubis.java
@@ -576,7 +576,7 @@ public final class Anubis extends BaseCipher
{
result = testKat(KAT_KEY, KAT_CT);
}
- valid = new Boolean(result);
+ valid = Boolean.valueOf(result);
}
return valid.booleanValue();
}
diff --git a/gnu/javax/crypto/cipher/Blowfish.java b/gnu/javax/crypto/cipher/Blowfish.java
index 5cb958ee4..ca1fdfbd3 100644
--- a/gnu/javax/crypto/cipher/Blowfish.java
+++ b/gnu/javax/crypto/cipher/Blowfish.java
@@ -688,7 +688,7 @@ public class Blowfish extends BaseCipher
{
result = testKat(TV_KEY, TV_CT);
}
- valid = new Boolean(result);
+ valid = Boolean.valueOf(result);
}
return valid.booleanValue();
}
diff --git a/gnu/javax/crypto/cipher/Cast5.java b/gnu/javax/crypto/cipher/Cast5.java
index cbdfe61f5..a0e0c60f3 100644
--- a/gnu/javax/crypto/cipher/Cast5.java
+++ b/gnu/javax/crypto/cipher/Cast5.java
@@ -1341,7 +1341,7 @@ public class Cast5 extends BaseCipher
{
result = testKat(KAT_KEY, KAT_CT, KAT_PT);
}
- valid = new Boolean(result);
+ valid = Boolean.valueOf(result);
}
return valid.booleanValue();
}
diff --git a/gnu/javax/crypto/cipher/Khazad.java b/gnu/javax/crypto/cipher/Khazad.java
index b6c27833e..3a95874da 100644
--- a/gnu/javax/crypto/cipher/Khazad.java
+++ b/gnu/javax/crypto/cipher/Khazad.java
@@ -514,7 +514,7 @@ public final class Khazad extends BaseCipher
{
result = testKat(KAT_KEY, KAT_CT);
}
- valid = new Boolean(result);
+ valid = Boolean.valueOf(result);
}
return valid.booleanValue();
}
diff --git a/gnu/javax/crypto/cipher/Rijndael.java b/gnu/javax/crypto/cipher/Rijndael.java
index 058c8b346..bcd1872fc 100644
--- a/gnu/javax/crypto/cipher/Rijndael.java
+++ b/gnu/javax/crypto/cipher/Rijndael.java
@@ -852,7 +852,7 @@ public final class Rijndael extends BaseCipher
{
result = testKat(KAT_KEY, KAT_CT);
}
- valid = new Boolean(result);
+ valid = Boolean.valueOf(result);
}
return valid.booleanValue();
}
diff --git a/gnu/javax/crypto/cipher/Serpent.java b/gnu/javax/crypto/cipher/Serpent.java
index b323b5017..2ed1e4b55 100644
--- a/gnu/javax/crypto/cipher/Serpent.java
+++ b/gnu/javax/crypto/cipher/Serpent.java
@@ -789,7 +789,7 @@ public class Serpent extends BaseCipher
{
result = testKat(KAT_KEY, KAT_CT);
}
- valid = new Boolean(result);
+ valid = Boolean.valueOf(result);
}
return valid.booleanValue();
}
diff --git a/gnu/javax/crypto/cipher/Square.java b/gnu/javax/crypto/cipher/Square.java
index 15cb8b536..a73116eb4 100644
--- a/gnu/javax/crypto/cipher/Square.java
+++ b/gnu/javax/crypto/cipher/Square.java
@@ -59,8 +59,6 @@ import java.util.Iterator;
* <a href="mailto:lars.knudsen@esat.kuleuven.ac.be">Lars Knudsen</a> and
* <a href="mailto:vincent.rijmen@esat.kuleuven.ac.be">Vincent Rijmen</a>.</li>
* </ol>
- *
- * @version $Revision: 1.1 $
*/
public final class Square extends BaseCipher
{
@@ -513,8 +511,8 @@ public final class Square extends BaseCipher
{
result = testKat(KAT_KEY, KAT_CT);
}
- valid = new Boolean(result);
+ valid = Boolean.valueOf(result);
}
return valid.booleanValue();
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/cipher/Twofish.java b/gnu/javax/crypto/cipher/Twofish.java
index bea7f5d2c..f5565d4b4 100644
--- a/gnu/javax/crypto/cipher/Twofish.java
+++ b/gnu/javax/crypto/cipher/Twofish.java
@@ -902,7 +902,7 @@ public final class Twofish extends BaseCipher
{
result = testKat(KAT_KEY, KAT_CT);
}
- valid = new Boolean(result);
+ valid = Boolean.valueOf(result);
}
return valid.booleanValue();
}
diff --git a/gnu/javax/crypto/jce/cipher/AESSpi.java b/gnu/javax/crypto/jce/cipher/AESSpi.java
index ba7466fc3..33de68956 100644
--- a/gnu/javax/crypto/jce/cipher/AESSpi.java
+++ b/gnu/javax/crypto/jce/cipher/AESSpi.java
@@ -52,8 +52,6 @@ import java.security.spec.InvalidParameterSpecException;
/**
* The implementation of the AES <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class AESSpi extends CipherAdapter
{
@@ -101,4 +99,4 @@ public final class AESSpi extends CipherAdapter
}
engineInit(opmode, key, spec, random);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/ARCFourSpi.java b/gnu/javax/crypto/jce/cipher/ARCFourSpi.java
index 8fc1fe4cb..963fa1c00 100644
--- a/gnu/javax/crypto/jce/cipher/ARCFourSpi.java
+++ b/gnu/javax/crypto/jce/cipher/ARCFourSpi.java
@@ -64,8 +64,6 @@ import javax.crypto.ShortBufferException;
/**
* The <i>Service Provider Interface</i> (<b>SPI</b>) for the ARCFOUR
* stream cipher.
- *
- * @version $Revision: 1.1 $
*/
public class ARCFourSpi extends CipherSpi
{
@@ -205,4 +203,4 @@ public class ARCFourSpi extends CipherSpi
{
return engineUpdate(in, inOffset, length, out, outOffset);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/AnubisSpi.java b/gnu/javax/crypto/jce/cipher/AnubisSpi.java
index ac2f596c8..0fca3b491 100644
--- a/gnu/javax/crypto/jce/cipher/AnubisSpi.java
+++ b/gnu/javax/crypto/jce/cipher/AnubisSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Anubis <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class AnubisSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class AnubisSpi extends CipherAdapter
{
super(Registry.ANUBIS_CIPHER);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/BlowfishSpi.java b/gnu/javax/crypto/jce/cipher/BlowfishSpi.java
index d1a28616d..d31d7e193 100644
--- a/gnu/javax/crypto/jce/cipher/BlowfishSpi.java
+++ b/gnu/javax/crypto/jce/cipher/BlowfishSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Blowfish <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class BlowfishSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class BlowfishSpi extends CipherAdapter
{
super(Registry.BLOWFISH_CIPHER);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/CipherAdapter.java b/gnu/javax/crypto/jce/cipher/CipherAdapter.java
index 9667a67ff..5eaa31b77 100644
--- a/gnu/javax/crypto/jce/cipher/CipherAdapter.java
+++ b/gnu/javax/crypto/jce/cipher/CipherAdapter.java
@@ -82,8 +82,6 @@ import javax.crypto.spec.IvParameterSpec;
* and the initialization vector, the subclass should override those methods.
* Otherwise a subclass need only call the {@link #CipherAdapter(String)}
* constructor with the name of the cipher.</p>
- *
- * @version $Revision: 1.1 $
*/
class CipherAdapter extends CipherSpi
{
@@ -504,4 +502,4 @@ class CipherAdapter extends CipherSpi
partBlock = new byte[blockLen];
partLen = 0;
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/DESSpi.java b/gnu/javax/crypto/jce/cipher/DESSpi.java
index f3ec8220a..ff86071c4 100644
--- a/gnu/javax/crypto/jce/cipher/DESSpi.java
+++ b/gnu/javax/crypto/jce/cipher/DESSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the DES <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class DESSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class DESSpi extends CipherAdapter
{
super(Registry.DES_CIPHER);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/KhazadSpi.java b/gnu/javax/crypto/jce/cipher/KhazadSpi.java
index 7f43dd010..397c27d2e 100644
--- a/gnu/javax/crypto/jce/cipher/KhazadSpi.java
+++ b/gnu/javax/crypto/jce/cipher/KhazadSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Khazad <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class KhazadSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class KhazadSpi extends CipherAdapter
{
super(Registry.KHAZAD_CIPHER);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/NullCipherSpi.java b/gnu/javax/crypto/jce/cipher/NullCipherSpi.java
index 0876c9585..e6d78ef39 100644
--- a/gnu/javax/crypto/jce/cipher/NullCipherSpi.java
+++ b/gnu/javax/crypto/jce/cipher/NullCipherSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Null cipher <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class NullCipherSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class NullCipherSpi extends CipherAdapter
{
super(Registry.NULL_CIPHER);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/PBES2.java b/gnu/javax/crypto/jce/cipher/PBES2.java
index 28b327d83..9889ab9fc 100644
--- a/gnu/javax/crypto/jce/cipher/PBES2.java
+++ b/gnu/javax/crypto/jce/cipher/PBES2.java
@@ -56,8 +56,6 @@ import javax.crypto.spec.SecretKeySpec;
/**
* <p>.</p>
- *
- * @version $Revision: 1.1 $
*/
public abstract class PBES2 extends CipherAdapter
{
@@ -1349,4 +1347,4 @@ public abstract class PBES2 extends CipherAdapter
}
}
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/RijndaelSpi.java b/gnu/javax/crypto/jce/cipher/RijndaelSpi.java
index 1a67f934b..137db2c3f 100644
--- a/gnu/javax/crypto/jce/cipher/RijndaelSpi.java
+++ b/gnu/javax/crypto/jce/cipher/RijndaelSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Rijndael <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class RijndaelSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class RijndaelSpi extends CipherAdapter
{
super(Registry.RIJNDAEL_CIPHER, 16);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/SerpentSpi.java b/gnu/javax/crypto/jce/cipher/SerpentSpi.java
index 394a0ce0a..9df9685cc 100644
--- a/gnu/javax/crypto/jce/cipher/SerpentSpi.java
+++ b/gnu/javax/crypto/jce/cipher/SerpentSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Serpent <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class SerpentSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class SerpentSpi extends CipherAdapter
{
super(Registry.SERPENT_CIPHER);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/SquareSpi.java b/gnu/javax/crypto/jce/cipher/SquareSpi.java
index bb59cd224..96e5dee38 100644
--- a/gnu/javax/crypto/jce/cipher/SquareSpi.java
+++ b/gnu/javax/crypto/jce/cipher/SquareSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Square <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class SquareSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class SquareSpi extends CipherAdapter
{
super(Registry.SQUARE_CIPHER);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/TripleDESSpi.java b/gnu/javax/crypto/jce/cipher/TripleDESSpi.java
index cec30f653..5c58ea551 100644
--- a/gnu/javax/crypto/jce/cipher/TripleDESSpi.java
+++ b/gnu/javax/crypto/jce/cipher/TripleDESSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Triple-DES <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class TripleDESSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class TripleDESSpi extends CipherAdapter
{
super(Registry.TRIPLEDES_CIPHER);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/cipher/TwofishSpi.java b/gnu/javax/crypto/jce/cipher/TwofishSpi.java
index 34f2d95d6..31df5ea40 100644
--- a/gnu/javax/crypto/jce/cipher/TwofishSpi.java
+++ b/gnu/javax/crypto/jce/cipher/TwofishSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Twofish <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class TwofishSpi extends CipherAdapter
{
@@ -56,4 +54,4 @@ public final class TwofishSpi extends CipherAdapter
{
super(Registry.TWOFISH_CIPHER);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/keyring/GnuKeyring.java b/gnu/javax/crypto/jce/keyring/GnuKeyring.java
index d74d386b4..d2501f893 100644
--- a/gnu/javax/crypto/jce/keyring/GnuKeyring.java
+++ b/gnu/javax/crypto/jce/keyring/GnuKeyring.java
@@ -1,4 +1,4 @@
-/* GnuKeyring.java --
+/* GnuKeyring.java -- KeyStore adapter for a pair of private and public Keyrings
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is a part of GNU Classpath.
@@ -38,376 +38,412 @@ exception statement from your version. */
package gnu.javax.crypto.jce.keyring;
+import gnu.java.security.Registry;
+import gnu.javax.crypto.keyring.GnuPrivateKeyring;
+import gnu.javax.crypto.keyring.GnuPublicKeyring;
+import gnu.javax.crypto.keyring.IKeyring;
+import gnu.javax.crypto.keyring.IPrivateKeyring;
+import gnu.javax.crypto.keyring.IPublicKeyring;
+import gnu.javax.crypto.keyring.MalformedKeyringException;
+import gnu.javax.crypto.keyring.PrimitiveEntry;
+
import java.io.BufferedInputStream;
-import java.io.InputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
-
import java.security.Key;
-import java.security.KeyStoreSpi;
import java.security.KeyStoreException;
+import java.security.KeyStoreSpi;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-
-import java.util.Arrays;
+import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.logging.Logger;
import javax.crypto.SecretKey;
-import gnu.java.security.Registry;
-import gnu.javax.crypto.keyring.IKeyring;
-import gnu.javax.crypto.keyring.IPrivateKeyring;
-import gnu.javax.crypto.keyring.IPublicKeyring;
-import gnu.javax.crypto.keyring.GnuPrivateKeyring;
-import gnu.javax.crypto.keyring.GnuPublicKeyring;
-import gnu.javax.crypto.keyring.MalformedKeyringException;
-import gnu.javax.crypto.keyring.PrimitiveEntry;
-
-public class GnuKeyring extends KeyStoreSpi
+/**
+ * An <i>Adapter</i> over a pair of one private, and one public keyrings to
+ * emulate the keystore operations.
+ */
+public class GnuKeyring
+ extends KeyStoreSpi
{
+ private static final Logger log = Logger.getLogger(GnuKeyring.class.getName());
+ private static final String NOT_LOADED = "not loaded";
- // Constants and fields.
- // ------------------------------------------------------------------------
-
+ /** TRUE if the keystore is loaded; FALSE otherwise. */
private boolean loaded;
+ /** our underlying private keyring. */
+ private IPrivateKeyring privateKR;
+ /** our underlying public keyring. */
+ private IPublicKeyring publicKR;
- private IKeyring keyring;
-
- // Constructor.
- // ------------------------------------------------------------------------
-
- public GnuKeyring()
- {
- }
-
- // Instance methods.
- // ------------------------------------------------------------------------
+ // default 0-arguments constructor
public Enumeration engineAliases()
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return new Enumeration()
+ ensureLoaded();
+ Enumeration result;
+ if (privateKR == null)
+ result = Collections.enumeration(Collections.EMPTY_SET);
+ else
{
- public boolean hasMoreElements()
- {
- return false;
- }
-
- public Object nextElement()
- {
- throw new NoSuchElementException();
- }
- };
- }
- return keyring.aliases();
+ Set aliases = new HashSet();
+ for (Enumeration e = privateKR.aliases(); e.hasMoreElements();)
+ {
+ String alias = (String) e.nextElement();
+ if (alias != null)
+ aliases.add(alias);
+ }
+
+ for (Enumeration e = publicKR.aliases(); e.hasMoreElements();)
+ {
+ String alias = (String) e.nextElement();
+ if (alias != null)
+ aliases.add(alias);
+ }
+
+ result = Collections.enumeration(aliases);
+ }
+
+ return result;
}
public boolean engineContainsAlias(String alias)
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return false;
- }
- return keyring.containsAlias(alias);
+ log.entering(this.getClass().getName(), "engineContainsAlias", alias);
+
+ ensureLoaded();
+ boolean inPrivateKR = privateKR.containsAlias(alias);
+ log.finest("inPrivateKR=" + inPrivateKR);
+ boolean inPublicKR = publicKR.containsAlias(alias);
+ log.finest("inPublicKR=" + inPublicKR);
+ boolean result = inPrivateKR || inPublicKR;
+
+ log.exiting(this.getClass().getName(), "engineContainsAlias",
+ Boolean.valueOf(result));
+ return result;
}
public void engineDeleteEntry(String alias)
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring != null)
- {
- keyring.remove(alias);
- }
+ log.entering(this.getClass().getName(), "engineDeleteEntry", alias);
+
+ ensureLoaded();
+ if (privateKR.containsAlias(alias))
+ privateKR.remove(alias);
+ else if (publicKR.containsAlias(alias))
+ publicKR.remove(alias);
+ else
+ log.finer("Unknwon alias: " + alias);
+
+ log.exiting(this.getClass().getName(), "engineDeleteEntry");
}
public Certificate engineGetCertificate(String alias)
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return null;
- }
- if (!(keyring instanceof IPublicKeyring))
- {
- throw new IllegalStateException("not a public keyring");
- }
- return ((IPublicKeyring) keyring).getCertificate(alias);
+ log.entering(this.getClass().getName(), "engineGetCertificate", alias);
+
+ ensureLoaded();
+ Certificate result = publicKR.getCertificate(alias);
+
+ log.exiting(this.getClass().getName(), "engineGetCertificate", result);
+ return result;
}
public String engineGetCertificateAlias(Certificate cert)
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return null;
- }
- if (!(keyring instanceof IPublicKeyring))
- {
- throw new IllegalStateException("not a public keyring");
- }
- Enumeration aliases = keyring.aliases();
- while (aliases.hasMoreElements())
+ log.entering(this.getClass().getName(), "engineGetCertificateAlias", cert);
+
+ ensureLoaded();
+ String result = null;
+ for (Enumeration aliases = publicKR.aliases(); aliases.hasMoreElements();)
{
String alias = (String) aliases.nextElement();
- Certificate cert2 = ((IPublicKeyring) keyring).getCertificate(alias);
+ Certificate cert2 = publicKR.getCertificate(alias);
if (cert.equals(cert2))
{
- return alias;
+ result = alias;
+ break;
}
}
- return null;
+
+ log.exiting(this.getClass().getName(), "engineGetCertificateAlias", result);
+ return result;
}
public void engineSetCertificateEntry(String alias, Certificate cert)
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- keyring = new GnuPublicKeyring("HMAC-SHA-1", 20);
- }
- if (!(keyring instanceof IPublicKeyring))
- {
- throw new IllegalStateException("not a public keyring");
- }
- ((IPublicKeyring) keyring).putCertificate(alias, cert);
+ log.entering(this.getClass().getName(), "engineSetCertificateEntry",
+ new Object[] { alias, cert });
+
+ ensureLoaded();
+ publicKR.putCertificate(alias, cert);
+
+ log.exiting(this.getClass().getName(), "engineSetCertificateEntry");
}
public Certificate[] engineGetCertificateChain(String alias)
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return null;
- }
- if (!(keyring instanceof IPrivateKeyring))
- {
- throw new IllegalStateException("not a private keyring");
- }
- return ((IPrivateKeyring) keyring).getCertPath(alias);
+ log.entering(this.getClass().getName(), "engineGetCertificateChain", alias);
+
+ ensureLoaded();
+ Certificate[] result = privateKR.getCertPath(alias);
+
+ log.exiting(this.getClass().getName(), "engineGetCertificateChain", result);
+ return result;
}
public Date engineGetCreationDate(String alias)
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return null;
- }
- List entries = keyring.get(alias);
- if (entries.size() == 0)
- {
- return null;
- }
- for (Iterator it = entries.iterator(); it.hasNext();)
- {
- Object o = it.next();
- if (o instanceof PrimitiveEntry)
- {
- return ((PrimitiveEntry) o).getCreationDate();
- }
- }
- return null;
+ log.entering(this.getClass().getName(), "engineGetCreationDate", alias);
+
+ ensureLoaded();
+ Date result = getCreationDate(alias, privateKR);
+ if (result == null)
+ result = getCreationDate(alias, publicKR);
+
+ log.exiting(this.getClass().getName(), "engineGetCreationDate", result);
+ return result;
}
public Key engineGetKey(String alias, char[] password)
throws UnrecoverableKeyException
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return null;
- }
- if (!(keyring instanceof IPrivateKeyring))
- {
- throw new IllegalStateException("not a private keyring");
- }
+ log.entering(this.getClass().getName(), "engineGetKey",
+ String.valueOf(password));
+
+ ensureLoaded();
+ Key result = null;
if (password == null)
{
- if (((IPrivateKeyring) keyring).containsPublicKey(alias))
- {
- return ((IPrivateKeyring) keyring).getPublicKey(alias);
- }
- }
- if (((IPrivateKeyring) keyring).containsPrivateKey(alias))
- {
- return ((IPrivateKeyring) keyring).getPrivateKey(alias, password);
+ if (privateKR.containsPublicKey(alias))
+ result = privateKR.getPublicKey(alias);
}
- return null;
+ else if (privateKR.containsPrivateKey(alias))
+ result = privateKR.getPrivateKey(alias, password);
+
+ log.exiting(this.getClass().getName(), "engineGetKey", result);
+ return result;
}
public void engineSetKeyEntry(String alias, Key key, char[] password,
- Certificate[] chain) throws KeyStoreException
+ Certificate[] chain)
+ throws KeyStoreException
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- keyring = new GnuPrivateKeyring("HMAC-SHA-1", 20, "AES", "OFB", 16);
- }
- if (!(keyring instanceof IPrivateKeyring))
- {
- throw new IllegalStateException("not a private keyring");
- }
+ log.entering(this.getClass().getName(), "engineSetKeyEntry",
+ new Object[] { alias, key, password, chain });
+ ensureLoaded();
if (key instanceof PublicKey)
+ privateKR.putPublicKey(alias, (PublicKey) key);
+ else
{
- ((IPrivateKeyring) keyring).putPublicKey(alias, (PublicKey) key);
- return;
+ if (! (key instanceof PrivateKey) && ! (key instanceof SecretKey))
+ throw new KeyStoreException("cannot store keys of type "
+ + key.getClass().getName());
+ privateKR.putCertPath(alias, chain);
+ log.finest("About to put private key in keyring...");
+ privateKR.putPrivateKey(alias, key, password);
}
- if (!(key instanceof PrivateKey) && !(key instanceof SecretKey))
- {
- throw new KeyStoreException("cannot store keys of type "
- + key.getClass().getName());
- }
- try
- {
- CertificateFactory fact = CertificateFactory.getInstance("X.509");
- ((IPrivateKeyring) keyring).putCertPath(alias, chain);
- }
- catch (CertificateException ce)
- {
- throw new KeyStoreException(ce.toString());
- }
- ((IPrivateKeyring) keyring).putPrivateKey(alias, key, password);
+
+ log.exiting(this.getClass().getName(), "engineSetKeyEntry");
}
public void engineSetKeyEntry(String alias, byte[] key, Certificate[] chain)
throws KeyStoreException
{
- throw new KeyStoreException("method not supported");
+ KeyStoreException x = new KeyStoreException("method not supported");
+ log.throwing(this.getClass().getName(), "engineSetKeyEntry(3)", x);
+ throw x;
}
public boolean engineIsCertificateEntry(String alias)
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return false;
- }
- if (!(keyring instanceof IPublicKeyring))
- {
- return false;
- }
- return ((IPublicKeyring) keyring).containsCertificate(alias);
+ log.entering(this.getClass().getName(), "engineIsCertificateEntry", alias);
+
+ ensureLoaded();
+ boolean result = publicKR.containsCertificate(alias);
+
+ log.exiting(this.getClass().getName(), "engineIsCertificateEntry",
+ Boolean.valueOf(result));
+ return result;
}
public boolean engineIsKeyEntry(String alias)
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return false;
- }
- if (!(keyring instanceof IPrivateKeyring))
- {
- return false;
- }
- return ((IPrivateKeyring) keyring).containsPublicKey(alias)
- || ((IPrivateKeyring) keyring).containsPrivateKey(alias);
+ log.entering(this.getClass().getName(), "engineIsKeyEntry", alias);
+
+ ensureLoaded();
+ boolean result = privateKR.containsPublicKey(alias)
+ || privateKR.containsPrivateKey(alias);
+
+ log.exiting(this.getClass().getName(), "engineIsKeyEntry",
+ Boolean.valueOf(result));
+ return result;
}
public void engineLoad(InputStream in, char[] password) throws IOException
{
+ log.entering(this.getClass().getName(), "engineLoad", String.valueOf(password));
if (in != null)
{
- if (!in.markSupported())
- {
- in = new BufferedInputStream(in);
- }
- in.mark(5);
- for (int i = 0; i < 4; i++)
- if (in.read() != Registry.GKR_MAGIC[i])
- throw new MalformedKeyringException("incorrect magic");
- int usage = in.read();
- in.reset();
- HashMap attr = new HashMap();
- attr.put(IKeyring.KEYRING_DATA_IN, in);
- attr.put(IKeyring.KEYRING_PASSWORD, password);
- switch (usage)
- {
- case GnuPublicKeyring.USAGE:
- keyring = new GnuPublicKeyring();
- break;
- case GnuPrivateKeyring.USAGE:
- keyring = new GnuPrivateKeyring();
- break;
- default:
- throw new MalformedKeyringException("unsupported ring usage: "
- + Integer.toBinaryString(usage));
- }
- keyring.load(attr);
+ if (! in.markSupported())
+ in = new BufferedInputStream(in);
+
+ loadPrivateKeyring(in, password);
+ loadPublicKeyring(in, password);
}
+ else
+ createNewKeyrings();
+
loaded = true;
+
+ log.exiting(this.getClass().getName(), "engineLoad");
}
public void engineStore(OutputStream out, char[] password) throws IOException
{
- if (!loaded || keyring == null)
- {
- throw new IllegalStateException ("not loaded");
- }
+ log.entering(this.getClass().getName(), "engineStore", String.valueOf(password));
+
+ ensureLoaded();
HashMap attr = new HashMap();
attr.put(IKeyring.KEYRING_DATA_OUT, out);
attr.put(IKeyring.KEYRING_PASSWORD, password);
- keyring.store(attr);
+
+ privateKR.store(attr);
+ publicKR.store(attr);
+
+ log.exiting(this.getClass().getName(), "engineStore");
}
public int engineSize()
{
- if (!loaded)
- {
- throw new IllegalStateException ("not loaded");
- }
- if (keyring == null)
- {
- return 0;
- }
- return keyring.size();
+ ensureLoaded();
+ return privateKR.size() + publicKR.size();
+ }
+
+ /**
+ * Ensure that the underlying keyring pair is loaded. Throw an exception if it
+ * isn't; otherwise returns silently.
+ *
+ * @throws IllegalStateException if the keyring is not loaded.
+ */
+ private void ensureLoaded()
+ {
+ if (! loaded)
+ throw new IllegalStateException(NOT_LOADED);
+ }
+
+ /**
+ * Load the private keyring from the designated input stream.
+ *
+ * @param in the input stream to process.
+ * @param password the password protecting the keyring.
+ * @throws MalformedKeyringException if the keyring is not a private one.
+ * @throws IOException if an I/O related exception occurs during the process.
+ */
+ private void loadPrivateKeyring(InputStream in, char[] password)
+ throws MalformedKeyringException, IOException
+ {
+ log.entering(this.getClass().getName(), "loadPrivateKeyring");
+
+ in.mark(5);
+ for (int i = 0; i < 4; i++)
+ if (in.read() != Registry.GKR_MAGIC[i])
+ throw new MalformedKeyringException("incorrect magic");
+
+ int usage = in.read();
+ in.reset();
+ if (usage != GnuPrivateKeyring.USAGE)
+ throw new MalformedKeyringException("Was expecting a private keyring but got a wrong USAGE: "
+ + Integer.toBinaryString(usage));
+ HashMap attr = new HashMap();
+ attr.put(IKeyring.KEYRING_DATA_IN, in);
+ attr.put(IKeyring.KEYRING_PASSWORD, password);
+ privateKR = new GnuPrivateKeyring();
+ privateKR.load(attr);
+
+ log.exiting(this.getClass().getName(), "loadPrivateKeyring");
+ }
+
+ /**
+ * Load the public keyring from the designated input stream.
+ *
+ * @param in the input stream to process.
+ * @param password the password protecting the keyring.
+ * @throws MalformedKeyringException if the keyring is not a public one.
+ * @throws IOException if an I/O related exception occurs during the process.
+ */
+ private void loadPublicKeyring(InputStream in, char[] password)
+ throws MalformedKeyringException, IOException
+ {
+ log.entering(this.getClass().getName(), "loadPublicKeyring");
+
+ in.mark(5);
+ for (int i = 0; i < 4; i++)
+ if (in.read() != Registry.GKR_MAGIC[i])
+ throw new MalformedKeyringException("incorrect magic");
+
+ int usage = in.read();
+ in.reset();
+ if (usage != GnuPublicKeyring.USAGE)
+ throw new MalformedKeyringException("Was expecting a public keyring but got a wrong USAGE: "
+ + Integer.toBinaryString(usage));
+ HashMap attr = new HashMap();
+ attr.put(IKeyring.KEYRING_DATA_IN, in);
+ attr.put(IKeyring.KEYRING_PASSWORD, password);
+ publicKR = new GnuPublicKeyring();
+ publicKR.load(attr);
+
+ log.exiting(this.getClass().getName(), "loadPublicKeyring");
+ }
+
+ /**
+ * Return the creation date of a named alias in a designated keyring.
+ *
+ * @param alias the alias to look for.
+ * @param keyring the keyring to search.
+ * @return the creattion date of the entry named <code>alias</code>. Return
+ * <code>null</code> if <code>alias</code> was not found in
+ * <code>keyring</code>.
+ */
+ private Date getCreationDate(String alias, IKeyring keyring)
+ {
+ log.entering(this.getClass().getName(), "getCreationDate",
+ new Object[] { alias, keyring });
+
+ Date result = null;
+ if (keyring != null)
+ for (Iterator it = keyring.get(alias).iterator(); it.hasNext();)
+ {
+ Object o = it.next();
+ if (o instanceof PrimitiveEntry)
+ {
+ result = ((PrimitiveEntry) o).getCreationDate();
+ break;
+ }
+ }
+
+ log.exiting(this.getClass().getName(), "getCreationDate", result);
+ return result;
+ }
+
+ /** Create empty keyrings. */
+ private void createNewKeyrings()
+ {
+ log.entering(this.getClass().getName(), "createNewKeyrings");
+
+ privateKR = new GnuPrivateKeyring("HMAC-SHA-1", 20, "AES", "OFB", 16);
+ publicKR = new GnuPublicKeyring("HMAC-SHA-1", 20);
+
+ log.exiting(this.getClass().getName(), "createNewKeyrings");
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacMD2Spi.java b/gnu/javax/crypto/jce/mac/HMacMD2Spi.java
index 935f5e5a3..dd489639f 100644
--- a/gnu/javax/crypto/jce/mac/HMacMD2Spi.java
+++ b/gnu/javax/crypto/jce/mac/HMacMD2Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the HMAC-MD2 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class HMacMD2Spi extends MacAdapter
{
@@ -56,4 +54,4 @@ public final class HMacMD2Spi extends MacAdapter
{
super(Registry.HMAC_NAME_PREFIX + Registry.MD2_HASH);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacMD4Spi.java b/gnu/javax/crypto/jce/mac/HMacMD4Spi.java
index 49507a6dd..6fadf0262 100644
--- a/gnu/javax/crypto/jce/mac/HMacMD4Spi.java
+++ b/gnu/javax/crypto/jce/mac/HMacMD4Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the HMAC-MD4 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class HMacMD4Spi extends MacAdapter
{
@@ -56,4 +54,4 @@ public final class HMacMD4Spi extends MacAdapter
{
super(Registry.HMAC_NAME_PREFIX + Registry.MD4_HASH);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacMD5Spi.java b/gnu/javax/crypto/jce/mac/HMacMD5Spi.java
index 3bc0fea6b..2ef43974f 100644
--- a/gnu/javax/crypto/jce/mac/HMacMD5Spi.java
+++ b/gnu/javax/crypto/jce/mac/HMacMD5Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the HMAC-MD5 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class HMacMD5Spi extends MacAdapter
{
@@ -56,4 +54,4 @@ public final class HMacMD5Spi extends MacAdapter
{
super(Registry.HMAC_NAME_PREFIX + Registry.MD5_HASH);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacRipeMD128Spi.java b/gnu/javax/crypto/jce/mac/HMacRipeMD128Spi.java
index 6a57e6c9d..ad7a2340e 100644
--- a/gnu/javax/crypto/jce/mac/HMacRipeMD128Spi.java
+++ b/gnu/javax/crypto/jce/mac/HMacRipeMD128Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the HMAC-RIPEMD-128 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class HMacRipeMD128Spi extends MacAdapter
{
@@ -56,4 +54,4 @@ public final class HMacRipeMD128Spi extends MacAdapter
{
super(Registry.HMAC_NAME_PREFIX + Registry.RIPEMD128_HASH);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacRipeMD160Spi.java b/gnu/javax/crypto/jce/mac/HMacRipeMD160Spi.java
index a47e1a5c7..c14e3b3bf 100644
--- a/gnu/javax/crypto/jce/mac/HMacRipeMD160Spi.java
+++ b/gnu/javax/crypto/jce/mac/HMacRipeMD160Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the HMAC-RIPEMD-160 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class HMacRipeMD160Spi extends MacAdapter
{
@@ -56,4 +54,4 @@ public final class HMacRipeMD160Spi extends MacAdapter
{
super(Registry.HMAC_NAME_PREFIX + Registry.RIPEMD160_HASH);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacSHA160Spi.java b/gnu/javax/crypto/jce/mac/HMacSHA160Spi.java
index e251dc373..f102c9ebc 100644
--- a/gnu/javax/crypto/jce/mac/HMacSHA160Spi.java
+++ b/gnu/javax/crypto/jce/mac/HMacSHA160Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the HMAC-SHA-160 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class HMacSHA160Spi extends MacAdapter
{
@@ -56,4 +54,4 @@ public final class HMacSHA160Spi extends MacAdapter
{
super(Registry.HMAC_NAME_PREFIX + Registry.SHA160_HASH);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacSHA256Spi.java b/gnu/javax/crypto/jce/mac/HMacSHA256Spi.java
index 7caa26041..cadad1cf5 100644
--- a/gnu/javax/crypto/jce/mac/HMacSHA256Spi.java
+++ b/gnu/javax/crypto/jce/mac/HMacSHA256Spi.java
@@ -42,8 +42,6 @@ import gnu.java.security.Registry;
/**
* <p>The implementation of the HMAC-SHA-256 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
- *
- * @version $Revision: 1.1 $
*/
public final class HMacSHA256Spi extends MacAdapter
{
@@ -64,4 +62,4 @@ public final class HMacSHA256Spi extends MacAdapter
// Instance methods
// -------------------------------------------------------------------------
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacSHA384Spi.java b/gnu/javax/crypto/jce/mac/HMacSHA384Spi.java
index d3e454b54..69ef38e50 100644
--- a/gnu/javax/crypto/jce/mac/HMacSHA384Spi.java
+++ b/gnu/javax/crypto/jce/mac/HMacSHA384Spi.java
@@ -42,8 +42,6 @@ import gnu.java.security.Registry;
/**
* <p>The implementation of the HMAC-SHA-384 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
- *
- * @version $Revision: 1.1 $
*/
public class HMacSHA384Spi extends MacAdapter
{
@@ -64,4 +62,4 @@ public class HMacSHA384Spi extends MacAdapter
// Instance methods
// -------------------------------------------------------------------------
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacSHA512Spi.java b/gnu/javax/crypto/jce/mac/HMacSHA512Spi.java
index f02267c84..abceb4a92 100644
--- a/gnu/javax/crypto/jce/mac/HMacSHA512Spi.java
+++ b/gnu/javax/crypto/jce/mac/HMacSHA512Spi.java
@@ -42,8 +42,6 @@ import gnu.java.security.Registry;
/**
* <p>The implementation of the HMAC-SHA-512 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.</p>
- *
- * @version $Revision: 1.1 $
*/
public class HMacSHA512Spi extends MacAdapter
{
@@ -64,4 +62,4 @@ public class HMacSHA512Spi extends MacAdapter
// Instance methods
// -------------------------------------------------------------------------
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacTigerSpi.java b/gnu/javax/crypto/jce/mac/HMacTigerSpi.java
index e4eb26ca9..511993ea4 100644
--- a/gnu/javax/crypto/jce/mac/HMacTigerSpi.java
+++ b/gnu/javax/crypto/jce/mac/HMacTigerSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the Tiger <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class HMacTigerSpi extends MacAdapter
{
@@ -56,4 +54,4 @@ public final class HMacTigerSpi extends MacAdapter
{
super(Registry.HMAC_NAME_PREFIX + Registry.TIGER_HASH);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/HMacWhirlpoolSpi.java b/gnu/javax/crypto/jce/mac/HMacWhirlpoolSpi.java
index 8e2ef6d2f..706e0cd5a 100644
--- a/gnu/javax/crypto/jce/mac/HMacWhirlpoolSpi.java
+++ b/gnu/javax/crypto/jce/mac/HMacWhirlpoolSpi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the HMAC-Whirlpool <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class HMacWhirlpoolSpi extends MacAdapter
{
@@ -56,4 +54,4 @@ public final class HMacWhirlpoolSpi extends MacAdapter
{
super(Registry.HMAC_NAME_PREFIX + Registry.WHIRLPOOL_HASH);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/MacAdapter.java b/gnu/javax/crypto/jce/mac/MacAdapter.java
index c323413a4..dc019ca20 100644
--- a/gnu/javax/crypto/jce/mac/MacAdapter.java
+++ b/gnu/javax/crypto/jce/mac/MacAdapter.java
@@ -57,8 +57,6 @@ import javax.crypto.MacSpi;
* the {@link javax.crypto.Mac} class, which provides the functionality of a
* message authentication code algorithm, such as the <i>Hashed Message
* Authentication Code</i> (<b>HMAC</b>) algorithms.</p>
- *
- * @version $Revision: 1.2 $
*/
class MacAdapter extends MacSpi implements Cloneable
{
@@ -153,4 +151,4 @@ class MacAdapter extends MacSpi implements Cloneable
{
mac.update(in, off, len);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/TMMH16Spi.java b/gnu/javax/crypto/jce/mac/TMMH16Spi.java
index 0a4222237..1734e1e69 100644
--- a/gnu/javax/crypto/jce/mac/TMMH16Spi.java
+++ b/gnu/javax/crypto/jce/mac/TMMH16Spi.java
@@ -50,8 +50,6 @@ import java.security.spec.AlgorithmParameterSpec;
/**
* The implementation of the TMMH16 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class TMMH16Spi extends MacAdapter
{
@@ -88,4 +86,4 @@ public final class TMMH16Spi extends MacAdapter
throw new InvalidAlgorithmParameterException(iae.getMessage());
}
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/UHash32Spi.java b/gnu/javax/crypto/jce/mac/UHash32Spi.java
index a24b8e59c..af678c0fa 100644
--- a/gnu/javax/crypto/jce/mac/UHash32Spi.java
+++ b/gnu/javax/crypto/jce/mac/UHash32Spi.java
@@ -43,8 +43,6 @@ import gnu.java.security.Registry;
/**
* The implementation of the UHash-32 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class UHash32Spi extends MacAdapter
{
@@ -56,4 +54,4 @@ public final class UHash32Spi extends MacAdapter
{
super(Registry.UHASH32);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/mac/UMac32Spi.java b/gnu/javax/crypto/jce/mac/UMac32Spi.java
index 52c58f36f..4e90468b1 100644
--- a/gnu/javax/crypto/jce/mac/UMac32Spi.java
+++ b/gnu/javax/crypto/jce/mac/UMac32Spi.java
@@ -50,8 +50,6 @@ import java.security.spec.AlgorithmParameterSpec;
/**
* The implementation of the UMAC-32 <i>Service Provider Interface</i>
* (<b>SPI</b>) adapter.
- *
- * @version $Revision: 1.1 $
*/
public final class UMac32Spi extends MacAdapter
{
@@ -88,4 +86,4 @@ public final class UMac32Spi extends MacAdapter
throw new InvalidAlgorithmParameterException(iae.getMessage());
}
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/jce/sig/DHKeyPairGeneratorSpi.java b/gnu/javax/crypto/jce/sig/DHKeyPairGeneratorSpi.java
index 5b3badc8d..0d09d5cef 100644
--- a/gnu/javax/crypto/jce/sig/DHKeyPairGeneratorSpi.java
+++ b/gnu/javax/crypto/jce/sig/DHKeyPairGeneratorSpi.java
@@ -44,6 +44,7 @@ import java.security.spec.AlgorithmParameterSpec;
import java.util.HashMap;
import javax.crypto.spec.DHGenParameterSpec;
+import javax.crypto.spec.DHParameterSpec;
import gnu.java.security.Registry;
import gnu.java.security.jce.sig.KeyPairGeneratorAdapter;
@@ -75,7 +76,8 @@ public class DHKeyPairGeneratorSpi
HashMap attributes = new HashMap();
if (params != null)
{
- if (! (params instanceof DHGenParameterSpec))
+ if (! (params instanceof DHGenParameterSpec) &&
+ ! (params instanceof DHParameterSpec))
throw new InvalidAlgorithmParameterException("params");
attributes.put(GnuDHKeyPairGenerator.DH_PARAMETERS, params);
diff --git a/gnu/javax/crypto/key/dh/DiffieHellmanSender.java b/gnu/javax/crypto/key/dh/DiffieHellmanSender.java
index 6b9cf70b6..0be82bfb4 100644
--- a/gnu/javax/crypto/key/dh/DiffieHellmanSender.java
+++ b/gnu/javax/crypto/key/dh/DiffieHellmanSender.java
@@ -55,7 +55,6 @@ import javax.crypto.interfaces.DHPrivateKey;
* Diffie-Hellman key agreement exchange (A in [HAC]).</p>
*
* @see DiffieHellmanKeyAgreement
- * @version $Revision: 1.1 $
*/
public class DiffieHellmanSender extends DiffieHellmanKeyAgreement
{
diff --git a/gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java b/gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java
index eafc8d01c..5626a2979 100644
--- a/gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java
+++ b/gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java
@@ -187,9 +187,19 @@ public class GnuDHKeyPairGenerator implements IKeyPairGenerator
}
else if (params instanceof DHParameterSpec)
{
+ // FIXME: I'm not sure this is correct. It seems to behave the
+ // same way as Sun's RI, but I don't know if this behavior is
+ // documented anywhere.
DHParameterSpec jceSpec = (DHParameterSpec) params;
- l = jceSpec.getP().bitLength();
+ p = jceSpec.getP();
+ g = jceSpec.getG();
+ l = p.bitLength();
m = jceSpec.getL();
+
+ // If no exponent size was given, generate an exponent as
+ // large as the prime.
+ if (m == 0)
+ m = l;
}
else
{
@@ -242,7 +252,12 @@ public class GnuDHKeyPairGenerator implements IKeyPairGenerator
}
// generate a private number x of length m such as: 1 < x < q - 1
- BigInteger q_minus_1 = q.subtract(BigInteger.ONE);
+ BigInteger q_minus_1 = null;
+ if (q != null)
+ q_minus_1 = q.subtract(BigInteger.ONE);
+
+ // We already check if m is modulo 8 in `setup.' This could just
+ // be m >>> 3.
byte[] mag = new byte[(m + 7) / 8];
BigInteger x;
while (true)
@@ -250,7 +265,7 @@ public class GnuDHKeyPairGenerator implements IKeyPairGenerator
nextRandomBytes(mag);
x = new BigInteger(1, mag);
if (x.bitLength() == m && x.compareTo(BigInteger.ONE) > 0
- && x.compareTo(q_minus_1) < 0)
+ && (q_minus_1 == null || x.compareTo(q_minus_1) < 0))
{
break;
}
diff --git a/gnu/javax/crypto/key/srp6/SRP6TLSServer.java b/gnu/javax/crypto/key/srp6/SRP6TLSServer.java
index 23e444077..ecbe36f62 100644
--- a/gnu/javax/crypto/key/srp6/SRP6TLSServer.java
+++ b/gnu/javax/crypto/key/srp6/SRP6TLSServer.java
@@ -61,8 +61,6 @@ import java.util.Map;
* SRP for TLS Authentication</a>. The only difference between it and the SASL
* variant is that the shared secret is the entity <code>S</code> and not
* <code>H(S)</code>.</p>
- *
- * @version $Revision: 1.1 $
*/
public class SRP6TLSServer extends SRP6KeyAgreement
{
diff --git a/gnu/javax/crypto/keyring/GnuPrivateKeyring.java b/gnu/javax/crypto/keyring/GnuPrivateKeyring.java
index d49bd0963..c1fe30e67 100644
--- a/gnu/javax/crypto/keyring/GnuPrivateKeyring.java
+++ b/gnu/javax/crypto/keyring/GnuPrivateKeyring.java
@@ -42,8 +42,8 @@ import gnu.java.security.Registry;
import java.io.DataInputStream;
import java.io.DataOutputStream;
-import java.io.InputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.security.PublicKey;
@@ -51,17 +51,18 @@ import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.util.Date;
import java.util.Iterator;
-import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* <p>.</p>
*/
public class GnuPrivateKeyring extends BaseKeyring implements IPrivateKeyring
{
-
// Constants and variables
// -------------------------------------------------------------------------
+ private static final Logger log = Logger.getLogger(GnuPrivateKeyring.class.getName());
public static final int USAGE = Registry.GKR_PRIVATE_KEYS
| Registry.GKR_PUBLIC_CREDENTIALS;
@@ -104,225 +105,277 @@ public class GnuPrivateKeyring extends BaseKeyring implements IPrivateKeyring
public boolean containsPrivateKey(String alias)
{
- if (!containsAlias(alias))
- {
- return false;
- }
- List l = get(alias);
- for (Iterator it = l.iterator(); it.hasNext();)
- {
+ log.entering(this.getClass().getName(), "containsPrivateKey", alias);
+
+ boolean result = false;
+ if (containsAlias(alias))
+ for (Iterator it = get(alias).iterator(); it.hasNext();)
if (it.next() instanceof PasswordAuthenticatedEntry)
{
- return true;
+ result = true;
+ break;
}
- }
- return false;
+
+ log.exiting(this.getClass().getName(), "containsPrivateKey",
+ Boolean.valueOf(result));
+ return result;
}
public Key getPrivateKey(String alias, char[] password)
throws UnrecoverableKeyException
{
- if (!containsAlias(alias))
- {
- return null;
- }
- List l = get(alias);
- PasswordAuthenticatedEntry e1 = null;
- PasswordEncryptedEntry e2 = null;
- for (Iterator it = l.iterator(); it.hasNext();)
- {
- Entry e = (Entry) it.next();
- if (e instanceof PasswordAuthenticatedEntry)
- {
- e1 = (PasswordAuthenticatedEntry) e;
- break;
- }
- }
- if (e1 == null)
- {
- return null;
- }
- try
- {
- e1.verify(password);
- }
- catch (Exception e)
- {
- throw new UnrecoverableKeyException("authentication failed");
- }
- for (Iterator it = e1.getEntries().iterator(); it.hasNext();)
+ log.entering(this.getClass().getName(), "getPrivateKey",
+ new Object[] { alias, String.valueOf(password) });
+
+ Key result = null;
+ if (containsAlias(alias))
{
- Entry e = (Entry) it.next();
- if (e instanceof PasswordEncryptedEntry)
+ PasswordAuthenticatedEntry e1 = null;
+ PasswordEncryptedEntry e2 = null;
+ for (Iterator it = get(alias).iterator(); it.hasNext();)
{
- e2 = (PasswordEncryptedEntry) e;
- break;
+ Entry e = (Entry) it.next();
+ if (e instanceof PasswordAuthenticatedEntry)
+ {
+ e1 = (PasswordAuthenticatedEntry) e;
+ break;
+ }
}
- }
- if (e2 == null)
- {
- return null;
- }
- try
- {
- e2.decrypt(password);
- }
- catch (Exception e)
- {
- throw new UnrecoverableKeyException("decryption failed");
- }
- for (Iterator it = e2.get(alias).iterator(); it.hasNext();)
- {
- Entry e = (Entry) it.next();
- if (e instanceof PrivateKeyEntry)
+
+ if (e1 != null)
{
- return ((PrivateKeyEntry) e).getKey();
+ try
+ {
+ e1.verify(password);
+ }
+ catch (Exception e)
+ {
+ throw new UnrecoverableKeyException("authentication failed");
+ }
+
+ for (Iterator it = e1.getEntries().iterator(); it.hasNext();)
+ {
+ Entry e = (Entry) it.next();
+ if (e instanceof PasswordEncryptedEntry)
+ {
+ e2 = (PasswordEncryptedEntry) e;
+ break;
+ }
+ }
+
+ if (e2 != null)
+ {
+ try
+ {
+ e2.decrypt(password);
+ }
+ catch (Exception e)
+ {
+ throw new UnrecoverableKeyException("decryption failed");
+ }
+
+ for (Iterator it = e2.get(alias).iterator(); it.hasNext();)
+ {
+ Entry e = (Entry) it.next();
+ if (e instanceof PrivateKeyEntry)
+ {
+ result = ((PrivateKeyEntry) e).getKey();
+ break;
+ }
+ }
+ }
}
}
- return null;
+
+ log.exiting(this.getClass().getName(), "getPrivateKey", result);
+ return result;
}
public void putPrivateKey(String alias, Key key, char[] password)
{
- if (containsPrivateKey(alias))
- {
- return;
- }
- alias = fixAlias(alias);
- Properties p = new Properties();
- p.put("alias", alias);
- PrivateKeyEntry pke = new PrivateKeyEntry(key, new Date(), p);
- PasswordEncryptedEntry enc = new PasswordEncryptedEntry(cipher, mode,
- keylen,
- new Properties());
- PasswordAuthenticatedEntry auth = new PasswordAuthenticatedEntry(
- mac,
- maclen,
- new Properties());
- enc.add(pke);
- auth.add(enc);
- try
- {
- enc.encode(null, password);
- auth.encode(null, password);
- }
- catch (IOException ioe)
+ log.entering(this.getClass().getName(), "putPrivateKey",
+ new Object[] { alias, key, String.valueOf(password) });
+
+ if (! containsPrivateKey(alias))
{
- throw new IllegalArgumentException(ioe.toString());
+ alias = fixAlias(alias);
+ Properties p = new Properties();
+ p.put("alias", alias);
+ PrivateKeyEntry pke = new PrivateKeyEntry(key, new Date(), p);
+ PasswordEncryptedEntry enc;
+ enc = new PasswordEncryptedEntry(cipher, mode, keylen, new Properties());
+ enc.add(pke);
+
+ PasswordAuthenticatedEntry auth;
+ auth = new PasswordAuthenticatedEntry(mac, maclen, new Properties());
+ auth.add(enc);
+
+ log.finest("About to encrypt the key...");
+ try
+ {
+ enc.encode(null, password);
+ }
+ catch (IOException x)
+ {
+ log.log(Level.FINER, "Exception while encrypting the key. "
+ + "Rethrow as IllegalArgumentException", x);
+ throw new IllegalArgumentException(x.toString());
+ }
+
+ log.finest("About to authenticate the encrypted key...");
+ try
+ {
+ auth.encode(null, password);
+ }
+ catch (IOException x)
+ {
+ log.log(Level.FINER, "Exception while authenticating the encrypted "
+ + "key. Rethrow as IllegalArgumentException", x);
+ throw new IllegalArgumentException(x.toString());
+ }
+
+ keyring.add(auth);
}
- keyring.add(auth);
+ else
+ log.finer("Keyring already contains alias: " + alias);
+
+ log.exiting(this.getClass().getName(), "putPrivateKey");
}
public boolean containsPublicKey(String alias)
{
- if (!containsAlias(alias))
- {
- return false;
- }
- List l = get(alias);
- for (Iterator it = l.iterator(); it.hasNext();)
- {
+ log.entering(this.getClass().getName(), "containsPublicKey", alias);
+
+ boolean result = false;
+ if (containsAlias(alias))
+ for (Iterator it = get(alias).iterator(); it.hasNext();)
if (it.next() instanceof PublicKeyEntry)
{
- return true;
+ result = true;
+ break;
}
- }
- return false;
+
+ log.exiting(this.getClass().getName(), "containsPublicKey",
+ Boolean.valueOf(result));
+ return result;
}
public PublicKey getPublicKey(String alias)
{
- if (!containsAlias(alias))
- {
- return null;
- }
- List l = get(alias);
- for (Iterator it = l.iterator(); it.hasNext();)
- {
- Entry e = (Entry) it.next();
- if (e instanceof PublicKeyEntry)
- {
- return ((PublicKeyEntry) e).getKey();
- }
- }
- return null;
+ log.entering(this.getClass().getName(), "getPublicKey", alias);
+
+ PublicKey result = null;
+ if (containsAlias(alias))
+ for (Iterator it = get(alias).iterator(); it.hasNext();)
+ {
+ Entry e = (Entry) it.next();
+ if (e instanceof PublicKeyEntry)
+ {
+ result = ((PublicKeyEntry) e).getKey();
+ break;
+ }
+ }
+
+ log.exiting(this.getClass().getName(), "getPublicKey", result);
+ return result;
}
public void putPublicKey(String alias, PublicKey key)
{
- if (containsPublicKey(alias))
+ log.entering(this.getClass().getName(), "putPublicKey",
+ new Object[] { alias, key });
+
+ if (! containsPublicKey(alias))
{
- return;
+ Properties p = new Properties();
+ p.put("alias", fixAlias(alias));
+ add(new PublicKeyEntry(key, new Date(), p));
}
- Properties p = new Properties();
- p.put("alias", fixAlias(alias));
- add(new PublicKeyEntry(key, new Date(), p));
+ else
+ log.finer("Keyring already contains alias: " + alias);
+
+ log.exiting(this.getClass().getName(), "putPublicKey");
}
public boolean containsCertPath(String alias)
{
- if (!containsAlias(alias))
- {
- return false;
- }
- List l = get(alias);
- for (Iterator it = l.iterator(); it.hasNext();)
- {
+ log.entering(this.getClass().getName(), "containsCertPath", alias);
+
+ boolean result = false;
+ if (containsAlias(alias))
+ for (Iterator it = get(alias).iterator(); it.hasNext();)
if (it.next() instanceof CertPathEntry)
{
- return true;
+ result = true;
+ break;
}
- }
- return false;
+
+ log.exiting(this.getClass().getName(), "containsCertPath",
+ Boolean.valueOf(result));
+ return result;
}
public Certificate[] getCertPath(String alias)
{
- if (!containsAlias(alias))
- {
- return null;
- }
- List l = get(alias);
- for (Iterator it = l.iterator(); it.hasNext();)
- {
- Entry e = (Entry) it.next();
- if (e instanceof CertPathEntry)
- {
- return ((CertPathEntry) e).getCertPath();
- }
- }
- return null;
+ log.entering(this.getClass().getName(), "getCertPath", alias);
+
+ Certificate[] result = null;
+ if (containsAlias(alias))
+ for (Iterator it = get(alias).iterator(); it.hasNext();)
+ {
+ Entry e = (Entry) it.next();
+ if (e instanceof CertPathEntry)
+ {
+ result = ((CertPathEntry) e).getCertPath();
+ break;
+ }
+ }
+
+ log.exiting(this.getClass().getName(), "getCertPath", result);
+ return result;
}
public void putCertPath(String alias, Certificate[] path)
{
- if (containsCertPath(alias))
+ log.entering(this.getClass().getName(), "putCertPath",
+ new Object[] { alias, path });
+
+ if (! containsCertPath(alias))
{
- return;
+ Properties p = new Properties();
+ p.put("alias", fixAlias(alias));
+ add(new CertPathEntry(path, new Date(), p));
}
- Properties p = new Properties();
- p.put("alias", fixAlias(alias));
- add(new CertPathEntry(path, new Date(), p));
+ else
+ log.finer("Keyring already contains alias: " + alias);
+
+ log.exiting(this.getClass().getName(), "putCertPath");
}
protected void load(InputStream in, char[] password) throws IOException
{
+ log.entering(this.getClass().getName(), "load",
+ new Object[] { in, String.valueOf(password) });
+
if (in.read() != USAGE)
- {
- throw new MalformedKeyringException("incompatible keyring usage");
- }
+ throw new MalformedKeyringException("incompatible keyring usage");
+
if (in.read() != PasswordAuthenticatedEntry.TYPE)
- {
- throw new MalformedKeyringException(
- "expecting password-authenticated entry tag");
- }
- keyring = PasswordAuthenticatedEntry.decode(new DataInputStream(in),
- password);
+ throw new MalformedKeyringException("expecting password-authenticated entry tag");
+
+ keyring = PasswordAuthenticatedEntry.decode(new DataInputStream(in), password);
+
+ log.exiting(this.getClass().getName(), "load");
}
protected void store(OutputStream out, char[] password) throws IOException
{
+ log.entering(this.getClass().getName(), "store",
+ new Object[] { out, String.valueOf(password) });
+
out.write(USAGE);
keyring.encode(new DataOutputStream(out), password);
+
+ log.exiting(this.getClass().getName(), "store");
}
}
diff --git a/gnu/javax/crypto/keyring/GnuPublicKeyring.java b/gnu/javax/crypto/keyring/GnuPublicKeyring.java
index 318eb036f..490eb4458 100644
--- a/gnu/javax/crypto/keyring/GnuPublicKeyring.java
+++ b/gnu/javax/crypto/keyring/GnuPublicKeyring.java
@@ -38,26 +38,24 @@ exception statement from your version. */
package gnu.javax.crypto.keyring;
+import gnu.java.security.Registry;
+
import java.io.DataInputStream;
import java.io.DataOutputStream;
-import java.io.InputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
-
+import java.security.cert.Certificate;
import java.util.Date;
import java.util.Iterator;
-import java.util.List;
-
-import java.security.cert.Certificate;
-
-import gnu.java.security.Registry;
+import java.util.logging.Logger;
public class GnuPublicKeyring extends BaseKeyring implements IPublicKeyring
{
-
// Fields.
// ------------------------------------------------------------------------
+ private static final Logger log = Logger.getLogger(GnuPublicKeyring.class.getName());
public static final int USAGE = Registry.GKR_CERTIFICATES;
// Constructors.
@@ -79,68 +77,84 @@ public class GnuPublicKeyring extends BaseKeyring implements IPublicKeyring
public boolean containsCertificate(String alias)
{
- if (!containsAlias(alias))
- {
- return false;
- }
- List l = get(alias);
- for (Iterator it = l.iterator(); it.hasNext();)
- {
+ log.entering(this.getClass().getName(), "containsCertificate", alias);
+
+ boolean result = false;
+ if (containsAlias(alias))
+ for (Iterator it = get(alias).iterator(); it.hasNext();)
if (it.next() instanceof CertificateEntry)
{
- return true;
+ result = true;
+ break;
}
- }
- return false;
+
+ log.exiting(this.getClass().getName(), "containsCertificate",
+ Boolean.valueOf(result));
+ return result;
}
public Certificate getCertificate(String alias)
{
- if (!containsAlias(alias))
- {
- return null;
- }
- List l = get(alias);
- for (Iterator it = l.iterator(); it.hasNext();)
- {
- Entry e = (Entry) it.next();
- if (e instanceof CertificateEntry)
- {
- return ((CertificateEntry) e).getCertificate();
- }
- }
- return null;
+ log.entering(this.getClass().getName(), "getCertificate", alias);
+
+ Certificate result = null;
+ if (containsAlias(alias))
+ for (Iterator it = get(alias).iterator(); it.hasNext();)
+ {
+ Entry e = (Entry) it.next();
+ if (e instanceof CertificateEntry)
+ {
+ result = ((CertificateEntry) e).getCertificate();
+ break;
+ }
+ }
+
+ log.exiting(this.getClass().getName(), "getCertificate", result);
+ return result;
}
public void putCertificate(String alias, Certificate cert)
{
- if (containsCertificate(alias))
+ log.entering(this.getClass().getName(), "putCertificate",
+ new Object[] { alias, cert });
+
+ if (! containsCertificate(alias))
{
- return;
+ Properties p = new Properties();
+ p.put("alias", fixAlias(alias));
+ add(new CertificateEntry(cert, new Date(), p));
}
- Properties p = new Properties();
- p.put("alias", fixAlias(alias));
- add(new CertificateEntry(cert, new Date(), p));
+ else
+ log.finer("Keyring already contains alias: " + alias);
+
+ log.exiting(this.getClass().getName(), "putCertificate");
}
protected void load(InputStream in, char[] password) throws IOException
{
+ log.entering(this.getClass().getName(), "load",
+ new Object[] { in, String.valueOf(password) });
+
if (in.read() != USAGE)
- {
- throw new MalformedKeyringException("incompatible keyring usage");
- }
+ throw new MalformedKeyringException("incompatible keyring usage");
+
if (in.read() != PasswordAuthenticatedEntry.TYPE)
- {
- throw new MalformedKeyringException(
- "expecting password-authenticated entry tag");
- }
- keyring = PasswordAuthenticatedEntry.decode(new DataInputStream(in),
- password);
+ throw new MalformedKeyringException("expecting password-authenticated entry tag");
+
+ DataInputStream dis = new DataInputStream(in);
+ keyring = PasswordAuthenticatedEntry.decode(dis, password);
+
+ log.exiting(this.getClass().getName(), "load");
}
protected void store(OutputStream out, char[] password) throws IOException
{
+ log.entering(this.getClass().getName(), "store",
+ new Object[] { out, String.valueOf(password) });
+
out.write(USAGE);
keyring.encode(new DataOutputStream(out), password);
+
+ log.exiting(this.getClass().getName(), "store");
}
}
diff --git a/gnu/javax/crypto/keyring/PasswordAuthenticatedEntry.java b/gnu/javax/crypto/keyring/PasswordAuthenticatedEntry.java
index 2e3a0d145..4e7e49a0b 100644
--- a/gnu/javax/crypto/keyring/PasswordAuthenticatedEntry.java
+++ b/gnu/javax/crypto/keyring/PasswordAuthenticatedEntry.java
@@ -41,6 +41,7 @@ package gnu.javax.crypto.keyring;
import gnu.java.security.Registry;
import gnu.java.security.prng.IRandom;
import gnu.java.security.prng.LimitReachedException;
+import gnu.java.security.util.PRNG;
import gnu.java.security.util.Util;
import gnu.javax.crypto.mac.IMac;
import gnu.javax.crypto.mac.MacFactory;
@@ -55,10 +56,10 @@ import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.security.InvalidKeyException;
-import java.security.SecureRandom;
import java.util.Arrays;
-import java.util.Iterator;
import java.util.HashMap;
+import java.util.Iterator;
+import java.util.logging.Logger;
/**
* <p>An entry authenticated with a password-based MAC.</p>
@@ -66,10 +67,10 @@ import java.util.HashMap;
public final class PasswordAuthenticatedEntry extends MaskableEnvelopeEntry
implements PasswordProtectedEntry, Registry
{
-
// Constants and variables
// -------------------------------------------------------------------------
+ private static final Logger log = Logger.getLogger(PasswordAuthenticatedEntry.class.getName());
public static final int TYPE = 3;
// Constructor(s)
@@ -145,54 +146,63 @@ public final class PasswordAuthenticatedEntry extends MaskableEnvelopeEntry
public void verify(char[] password)
{
- if (!isMasked() || payload == null)
- {
- return;
- }
- IMac m = null;
- try
- {
- m = getMac(password);
- }
- catch (Exception x)
- {
- throw new IllegalArgumentException(x.toString());
- }
+ log.entering(this.getClass().getName(), "verify", String.valueOf(password));
+ long tt = - System.currentTimeMillis();
- m.update(payload, 0, payload.length - m.macSize());
- byte[] macValue = new byte[m.macSize()];
- System.arraycopy(payload, payload.length - macValue.length, macValue, 0,
- macValue.length);
- if (!Arrays.equals(macValue, m.digest()))
- {
- throw new IllegalArgumentException("MAC verification failed");
- }
- try
- {
- DataInputStream in = new DataInputStream(
- new ByteArrayInputStream(
- payload,
- 0,
- payload.length
- - m.macSize()));
- decodeEnvelope(in);
- }
- catch (IOException ioe)
+ if (isMasked() && payload != null)
{
- throw new IllegalArgumentException("malformed keyring fragment");
+ IMac m = null;
+ try
+ {
+ m = getMac(password);
+ }
+ catch (Exception x)
+ {
+ throw new IllegalArgumentException(x.toString(), x);
+ }
+
+ int limit = payload.length - m.macSize();
+ m.update(payload, 0, limit);
+ byte[] macValue = new byte[m.macSize()];
+ System.arraycopy(payload, payload.length - macValue.length, macValue, 0,
+ macValue.length);
+ if (! Arrays.equals(macValue, m.digest()))
+ throw new IllegalArgumentException("MAC verification failed");
+
+ ByteArrayInputStream bais;
+ try
+ {
+ bais = new ByteArrayInputStream(payload, 0, limit);
+ DataInputStream in = new DataInputStream(bais);
+ decodeEnvelope(in);
+ }
+ catch (IOException ioe)
+ {
+ throw new IllegalArgumentException("malformed keyring fragment");
+ }
+ setMasked(false);
+ payload = null;
}
- setMasked(false);
- payload = null;
+
+ tt += System.currentTimeMillis();
+ log.finer("Verified in " + tt + "ms.");
+ log.exiting(this.getClass().getName(), "verify");
}
public void authenticate(char[] password) throws IOException
{
+ log.entering(this.getClass().getName(), "authenticate",
+ String.valueOf(password));
+ long tt = - System.currentTimeMillis();
+ long t1 = - System.currentTimeMillis();
+
if (isMasked())
- {
- throw new IllegalStateException("entry is masked");
- }
+ throw new IllegalStateException("entry is masked");
+
byte[] salt = new byte[8];
- new SecureRandom ().nextBytes (salt);
+ PRNG.getInstance().nextBytes(salt);
+ t1 += System.currentTimeMillis();
+ log.finer("-- Generated salt in " + t1 + "ms.");
properties.put("salt", Util.toString(salt));
IMac m = getMac(password);
ByteArrayOutputStream bout = new ByteArrayOutputStream(1024);
@@ -201,10 +211,18 @@ public final class PasswordAuthenticatedEntry extends MaskableEnvelopeEntry
for (Iterator it = entries.iterator(); it.hasNext();)
{
Entry entry = (Entry) it.next();
+ log.finer("-- About to authenticate one " + entry);
+ t1 = - System.currentTimeMillis();
entry.encode(out2);
+ t1 += System.currentTimeMillis();
+ log.finer("-- Authenticated an Entry in " + t1 + "ms.");
}
bout.write(m.digest());
payload = bout.toByteArray();
+
+ tt += System.currentTimeMillis();
+ log.finer("Authenticated in " + tt + "ms.");
+ log.exiting(this.getClass().getName(), "authenticate");
}
public void encode(DataOutputStream out, char[] password) throws IOException
diff --git a/gnu/javax/crypto/keyring/PasswordEncryptedEntry.java b/gnu/javax/crypto/keyring/PasswordEncryptedEntry.java
index 26b4032bd..d67ef0e0a 100644
--- a/gnu/javax/crypto/keyring/PasswordEncryptedEntry.java
+++ b/gnu/javax/crypto/keyring/PasswordEncryptedEntry.java
@@ -41,8 +41,8 @@ package gnu.javax.crypto.keyring;
import gnu.java.security.Registry;
import gnu.java.security.prng.IRandom;
import gnu.java.security.prng.LimitReachedException;
+import gnu.java.security.util.PRNG;
import gnu.java.security.util.Util;
-
import gnu.javax.crypto.cipher.CipherFactory;
import gnu.javax.crypto.cipher.IBlockCipher;
import gnu.javax.crypto.mode.IMode;
@@ -58,16 +58,10 @@ import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
-
import java.security.InvalidKeyException;
-import java.security.SecureRandom;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
import java.util.HashMap;
-import java.util.List;
+import java.util.Iterator;
+import java.util.logging.Logger;
/**
* An envelope that is encrypted with a password-derived key.
@@ -75,10 +69,10 @@ import java.util.List;
public class PasswordEncryptedEntry extends MaskableEnvelopeEntry implements
PasswordProtectedEntry, Registry
{
-
// Constants and fields.
// ------------------------------------------------------------------------
+ private static final Logger log = Logger.getLogger(PasswordEncryptedEntry.class.getName());
public static final int TYPE = 1;
// Constructors.
@@ -138,10 +132,12 @@ public class PasswordEncryptedEntry extends MaskableEnvelopeEntry implements
public void decrypt(char[] password) throws IllegalArgumentException,
WrongPaddingException
{
+ log.entering(this.getClass().getName(), "decrypt", String.valueOf(password));
+ long tt = - System.currentTimeMillis();
+
if (!isMasked() || payload == null)
- {
- return;
- }
+ return;
+
IMode mode = getMode(password, IMode.DECRYPTION);
IPad padding = PadFactory.getInstance("PKCS7");
padding.init(mode.currentBlockSize());
@@ -153,12 +149,9 @@ public class PasswordEncryptedEntry extends MaskableEnvelopeEntry implements
count += mode.currentBlockSize();
}
int padlen = padding.unpad(buf, 0, buf.length);
- DataInputStream in = new DataInputStream(
- new ByteArrayInputStream(
- buf,
- 0,
- buf.length
- - padlen));
+ ByteArrayInputStream baos = new ByteArrayInputStream(buf, 0,
+ buf.length - padlen);
+ DataInputStream in = new DataInputStream(baos);
try
{
decodeEnvelope(in);
@@ -169,12 +162,22 @@ public class PasswordEncryptedEntry extends MaskableEnvelopeEntry implements
}
setMasked(false);
payload = null;
+
+ tt += System.currentTimeMillis();
+ log.finer("Decrypted in " + tt + "ms.");
+ log.exiting(this.getClass().getName(), "decrypt");
}
public void encrypt(char[] password) throws IOException
{
+ log.entering(this.getClass().getName(), "encrypt", String.valueOf(password));
+ long tt = - System.currentTimeMillis();
+ long t1 = - System.currentTimeMillis();
+
byte[] salt = new byte[8];
- new SecureRandom ().nextBytes (salt);
+ PRNG.getInstance().nextBytes(salt);
+ t1 += System.currentTimeMillis();
+ log.finer("-- Generated salt in " + t1 + "ms.");
properties.put("salt", Util.toString(salt));
IMode mode = getMode(password, IMode.ENCRYPTION);
IPad pad = PadFactory.getInstance("PKCS7");
@@ -184,7 +187,11 @@ public class PasswordEncryptedEntry extends MaskableEnvelopeEntry implements
for (Iterator it = entries.iterator(); it.hasNext();)
{
Entry entry = (Entry) it.next();
+ log.finer("-- About to encode one " + entry);
+ t1 = - System.currentTimeMillis();
entry.encode(out2);
+ t1 += System.currentTimeMillis();
+ log.finer("-- Encoded an Entry in " + t1 + "ms.");
}
byte[] plaintext = bout.toByteArray();
byte[] padding = pad.pad(plaintext, 0, plaintext.length);
@@ -200,6 +207,10 @@ public class PasswordEncryptedEntry extends MaskableEnvelopeEntry implements
count += mode.currentBlockSize();
}
mode.update(lastBlock, 0, payload, count);
+
+ tt += System.currentTimeMillis();
+ log.finer("Encrypted in " + tt + "ms.");
+ log.exiting(this.getClass().getName(), "encrypt");
}
public void encode(DataOutputStream out, char[] password) throws IOException
diff --git a/gnu/javax/crypto/keyring/PrimitiveEntry.java b/gnu/javax/crypto/keyring/PrimitiveEntry.java
index 4c9ff0ff1..f5e63e996 100644
--- a/gnu/javax/crypto/keyring/PrimitiveEntry.java
+++ b/gnu/javax/crypto/keyring/PrimitiveEntry.java
@@ -69,10 +69,9 @@ public abstract class PrimitiveEntry extends Entry
if (!this.properties.containsKey("alias")
|| this.properties.get("alias").length() == 0)
{
- throw new IllegalArgumentException(
- "primitive entries MUST have an alias");
+ throw new IllegalArgumentException("primitive entries MUST have an alias");
}
- this.properties.put("creation-date", String.valueOf(creationDate.getTime()));
+ this.properties.put("creation-date", String.valueOf(this.creationDate.getTime()));
}
protected PrimitiveEntry(int type)
diff --git a/gnu/javax/crypto/keyring/PrivateKeyEntry.java b/gnu/javax/crypto/keyring/PrivateKeyEntry.java
index 306349915..882495633 100644
--- a/gnu/javax/crypto/keyring/PrivateKeyEntry.java
+++ b/gnu/javax/crypto/keyring/PrivateKeyEntry.java
@@ -57,8 +57,6 @@ import java.util.Date;
/**
* <p>An immutable class representing a private or secret key entry.</p>
- *
- * @version $Revision: 1.1 $
*/
public final class PrivateKeyEntry extends PrimitiveEntry
{
diff --git a/gnu/javax/crypto/mac/UMac32.java b/gnu/javax/crypto/mac/UMac32.java
index d20d4f4a9..013888856 100644
--- a/gnu/javax/crypto/mac/UMac32.java
+++ b/gnu/javax/crypto/mac/UMac32.java
@@ -419,7 +419,7 @@ public class UMac32 extends BaseMac
mac.update(data, 0, 128);
byte[] result = mac.digest();
// System.out.println("UMAC test vector: "+Util.toString(result));
- valid = new Boolean(TV1.equals(Util.toString(result)));
+ valid = Boolean.valueOf(TV1.equals(Util.toString(result)));
}
return valid.booleanValue();
}
diff --git a/gnu/javax/crypto/mode/IAuthenticatedMode.java b/gnu/javax/crypto/mode/IAuthenticatedMode.java
index d89c0016d..989e3edbc 100644
--- a/gnu/javax/crypto/mode/IAuthenticatedMode.java
+++ b/gnu/javax/crypto/mode/IAuthenticatedMode.java
@@ -50,11 +50,9 @@ import gnu.javax.crypto.mac.IMac;
* is done via the {@link IMac#digest()} method, and header updating
* (if supported by the mode) is done via the {@link
* IMac#update(byte[],int,int)} method.
- *
- * @version $Revision: 1.1 $
*/
public interface IAuthenticatedMode extends IMode, IMac
{
// Trivial conjunction of IMode and IMac.
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/pad/PadFactory.java b/gnu/javax/crypto/pad/PadFactory.java
index e122719b6..913d69dcb 100644
--- a/gnu/javax/crypto/pad/PadFactory.java
+++ b/gnu/javax/crypto/pad/PadFactory.java
@@ -84,7 +84,7 @@ public class PadFactory implements Registry
if (pad.endsWith("padding"))
pad = pad.substring(0, pad.length() - "padding".length());
IPad result = null;
- if (pad.equals(PKCS7_PAD))
+ if (pad.equals(PKCS7_PAD) || pad.equals(PKCS5_PAD))
{
result = new PKCS7();
}
@@ -122,6 +122,7 @@ public class PadFactory implements Registry
public static final Set getNames()
{
HashSet hs = new HashSet();
+ hs.add(PKCS5_PAD);
hs.add(PKCS7_PAD);
hs.add(TBC_PAD);
hs.add(EME_PKCS1_V1_5_PAD);
@@ -133,4 +134,4 @@ public class PadFactory implements Registry
// Instance methods
// -------------------------------------------------------------------------
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/pad/WrongPaddingException.java b/gnu/javax/crypto/pad/WrongPaddingException.java
index cc74dfb26..e477cf303 100644
--- a/gnu/javax/crypto/pad/WrongPaddingException.java
+++ b/gnu/javax/crypto/pad/WrongPaddingException.java
@@ -41,8 +41,6 @@ package gnu.javax.crypto.pad;
/**
* <p>A checked exception that indicates that a padding algorithm did not find the
* expected padding bytes when unpadding some data.</p>
- *
- * @version $Revision: 1.1 $
*/
public class WrongPaddingException extends Exception
{
@@ -60,4 +58,4 @@ public class WrongPaddingException extends Exception
// Instant methods
// -------------------------------------------------------------------------
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/prng/CSPRNG.java b/gnu/javax/crypto/prng/CSPRNG.java
index 197009232..6585dcb90 100644
--- a/gnu/javax/crypto/prng/CSPRNG.java
+++ b/gnu/javax/crypto/prng/CSPRNG.java
@@ -364,7 +364,7 @@ public class CSPRNG extends BasePRNG
{
CSPRNG instance = new CSPRNG();
HashMap attrib = new HashMap();
- attrib.put(BLOCKING, new Boolean(getProperty(BLOCK)));
+ attrib.put(BLOCKING, Boolean.valueOf(getProperty(BLOCK)));
String s = null;
// Get each file source "gnu.crypto.csprng.file.N".
diff --git a/gnu/javax/crypto/prng/Fortuna.java b/gnu/javax/crypto/prng/Fortuna.java
index 6453a9d02..69ce860f4 100644
--- a/gnu/javax/crypto/prng/Fortuna.java
+++ b/gnu/javax/crypto/prng/Fortuna.java
@@ -142,6 +142,14 @@ public class Fortuna extends BasePRNG implements Serializable,
pool = 0;
pool0Count = 0;
generator.init(attributes);
+ try
+ {
+ fillBlock ();
+ }
+ catch (LimitReachedException shouldNotHappen)
+ {
+ throw new RuntimeException (shouldNotHappen);
+ }
}
public void fillBlock() throws LimitReachedException
@@ -324,6 +332,7 @@ public class Fortuna extends BasePRNG implements Serializable,
byte[] seed = (byte[]) attributes.get(SEED);
if (seed != null)
addRandomBytes(seed);
+ fillBlock ();
}
/**
diff --git a/gnu/javax/crypto/prng/ICMGenerator.java b/gnu/javax/crypto/prng/ICMGenerator.java
index 0de38e256..7d4f4c9a3 100644
--- a/gnu/javax/crypto/prng/ICMGenerator.java
+++ b/gnu/javax/crypto/prng/ICMGenerator.java
@@ -98,8 +98,6 @@ import java.util.Map;
* <li><a href="http://www.ietf.org/internet-drafts/draft-mcgrew-saag-icm-00.txt">
* Integer Counter Mode</a>, David A. McGrew.</li>
* </ol>
- *
- * @version $Revision: 1.1 $
*/
public class ICMGenerator extends BasePRNG implements Cloneable
{
@@ -376,4 +374,4 @@ public class ICMGenerator extends BasePRNG implements Cloneable
cipher.encryptBlock(buffer, 0, buffer, 0);
blockNdx = blockNdx.add(BigInteger.ONE); // increment blockNdx
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/prng/IPBE.java b/gnu/javax/crypto/prng/IPBE.java
index 531e7ead8..66921d635 100644
--- a/gnu/javax/crypto/prng/IPBE.java
+++ b/gnu/javax/crypto/prng/IPBE.java
@@ -39,31 +39,43 @@ exception statement from your version. */
package gnu.javax.crypto.prng;
/**
- * <p>Trivial interface to group Password-based encryption property names.</p>
- *
- * @version $Revision: 1.1 $
+ * Trivial interface to group Password-based encryption property names and
+ * constants.
*/
public interface IPBE
{
-
- // Constants
- // -------------------------------------------------------------------------
-
/**
* Property name for the iteration count in a PBE algorithm. The property
* associated with this is expected to be an {@link Integer}.
*/
- public static final String ITERATION_COUNT = "gnu.crypto.pbe.iteration.count";
+ String ITERATION_COUNT = "gnu.crypto.pbe.iteration.count";
/**
* Property name for the password in a PBE algorithm. The property associated
* with this is expected to be a char array.
*/
- public static final String PASSWORD = "gnu.crypto.pbe.password";
+ String PASSWORD = "gnu.crypto.pbe.password";
+
+ /**
+ * Property name for the password character encoding in a PBE algorithm. The
+ * property associated with this is expected to be a String denoting a valid
+ * character-encoding name. If this property is not set, and a password is
+ * used, then {@link #DEFAULT_PASSWORD_ENCODING} will be used when converting
+ * the password character(s) to bytes.
+ */
+ String PASSWORD_ENCODING = "gnu.crypto.pbe.password.encoding";
/**
* Property name for the salt in a PBE algorithm. The property associated
* with this is expected to be a byte array.
*/
- public static final String SALT = "gnu.crypto.pbe.salt";
-} \ No newline at end of file
+ String SALT = "gnu.crypto.pbe.salt";
+
+ /**
+ * The default character set encoding name to be used if (a) a password is
+ * to be used as the source for a PBE-based Key Derivation Function (KDF) and
+ * (b) no character set encoding name was specified among the attributes used
+ * to initialize the instance.
+ */
+ String DEFAULT_PASSWORD_ENCODING = "UTF-8";
+}
diff --git a/gnu/javax/crypto/prng/PBKDF2.java b/gnu/javax/crypto/prng/PBKDF2.java
index 5146bd4b9..d39cd0a65 100644
--- a/gnu/javax/crypto/prng/PBKDF2.java
+++ b/gnu/javax/crypto/prng/PBKDF2.java
@@ -62,8 +62,6 @@ import java.util.Map;
* <li>B. Kaliski, <a href="http://www.ietf.org/rfc/rfc2898.txt">RFC 2898:
* Password-Based Cryptography Specification, Version 2.0</a></li>
* </ol>
- *
- * @version $Revision: 1.1 $
*/
public class PBKDF2 extends BasePRNG implements Cloneable
{
@@ -129,23 +127,34 @@ public class PBKDF2 extends BasePRNG implements Cloneable
salt = s;
}
+ byte[] macKeyMaterial;
char[] password = (char[]) attributes.get(IPBE.PASSWORD);
if (password != null)
{
+ String encoding = (String) attributes.get(IPBE.PASSWORD_ENCODING);
+ if (encoding == null || encoding.trim().length() == 0)
+ encoding = IPBE.DEFAULT_PASSWORD_ENCODING;
+ else
+ encoding = encoding.trim();
+
try
{
- macAttrib.put(IMac.MAC_KEY_MATERIAL,
- new String(password).getBytes("UTF-8"));
+ macKeyMaterial = new String(password).getBytes(encoding);
}
catch (UnsupportedEncodingException uee)
{
- throw new Error(uee.getMessage());
+ throw new IllegalArgumentException("Unknown or unsupported encoding: "
+ + encoding, uee);
}
}
+ else
+ macKeyMaterial = (byte[]) attributes.get(IMac.MAC_KEY_MATERIAL);
+
+ if (macKeyMaterial != null)
+ macAttrib.put(IMac.MAC_KEY_MATERIAL, macKeyMaterial);
else if (!initialised)
- {
- throw new IllegalArgumentException("no password specified");
- } // otherwise re-use previous password.
+ throw new IllegalArgumentException("Neither password nor key-material were specified");
+ // otherwise re-use previous password/key-material
try
{
@@ -213,4 +222,4 @@ public class PBKDF2 extends BasePRNG implements Cloneable
}
}
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/sasl/ConfidentialityException.java b/gnu/javax/crypto/sasl/ConfidentialityException.java
index 561827d8d..adfc06593 100644
--- a/gnu/javax/crypto/sasl/ConfidentialityException.java
+++ b/gnu/javax/crypto/sasl/ConfidentialityException.java
@@ -44,8 +44,6 @@ import javax.security.sasl.SaslException;
* Used by mechanisms that offer a security services layer, this checked
* exception is thrown to indicate that a violation has occured during the
* processing of a <i>confidentiality</i> protection filter.
- *
- * @version $Revision: 1.1 $
*/
public class ConfidentialityException extends SaslException
{
@@ -81,4 +79,4 @@ public class ConfidentialityException extends SaslException
{
super(s, x);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/sasl/IllegalMechanismStateException.java b/gnu/javax/crypto/sasl/IllegalMechanismStateException.java
index 94d9269a1..b46ad98e3 100644
--- a/gnu/javax/crypto/sasl/IllegalMechanismStateException.java
+++ b/gnu/javax/crypto/sasl/IllegalMechanismStateException.java
@@ -46,8 +46,6 @@ import javax.security.sasl.AuthenticationException;
* that mechanism was not completed yet, or that an operation that should be
* invoked on incomplete mechanisms was invoked but the authentication phase of
* that mechanism was already completed.
- *
- * @version $Revision: 1.1 $
*/
public class IllegalMechanismStateException extends AuthenticationException
{
@@ -83,4 +81,4 @@ public class IllegalMechanismStateException extends AuthenticationException
{
super(detail, ex);
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/sasl/srp/IALG.java b/gnu/javax/crypto/sasl/srp/IALG.java
index cfaf22b1e..51492f977 100644
--- a/gnu/javax/crypto/sasl/srp/IALG.java
+++ b/gnu/javax/crypto/sasl/srp/IALG.java
@@ -50,8 +50,6 @@ import javax.security.sasl.SaslException;
/**
* <p>A Factory class that returns IALG (Integrity Algorithm) instances that
* operate as described in the draft-burdis-cat-sasl-srp-04 and later.</p>
- *
- * @version $Revision: 1.1 $
*/
public final class IALG implements Cloneable
{
@@ -156,4 +154,4 @@ public final class IALG implements Cloneable
{
return hmac.macSize();
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/crypto/sasl/srp/SRPServer.java b/gnu/javax/crypto/sasl/srp/SRPServer.java
index 82f57de4a..672660b26 100644
--- a/gnu/javax/crypto/sasl/srp/SRPServer.java
+++ b/gnu/javax/crypto/sasl/srp/SRPServer.java
@@ -72,8 +72,6 @@ import javax.security.sasl.SaslServer;
/**
* <p>The SASL-SRP server-side mechanism.</p>
- *
- * @version $Revision: 1.1.2.3 $
*/
public class SRPServer extends ServerMechanism implements SaslServer
{
@@ -1153,4 +1151,4 @@ public class SRPServer extends ServerMechanism implements SaslServer
return prng;
}
-} \ No newline at end of file
+}
diff --git a/gnu/javax/imageio/bmp/BMPDecoder.java b/gnu/javax/imageio/bmp/BMPDecoder.java
index c4a582bfa..df53f2e3d 100644
--- a/gnu/javax/imageio/bmp/BMPDecoder.java
+++ b/gnu/javax/imageio/bmp/BMPDecoder.java
@@ -41,7 +41,6 @@ import java.io.IOException;
import javax.imageio.stream.ImageInputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
-import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.BufferedImage;
diff --git a/gnu/javax/imageio/bmp/BMPEncoder.java b/gnu/javax/imageio/bmp/BMPEncoder.java
new file mode 100644
index 000000000..fc8dcf00f
--- /dev/null
+++ b/gnu/javax/imageio/bmp/BMPEncoder.java
@@ -0,0 +1,119 @@
+/* BMPEncoder.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.io.IOException;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageOutputStream;
+
+public abstract class BMPEncoder
+{
+
+ /**
+ * Constructs a new BMPEncoder.
+ */
+ public BMPEncoder()
+ {
+ // Nothing to do here.
+ }
+
+ /**
+ * Determines the coding type of the bitmap and returns the corresponding
+ * encoder.
+ *
+ * @param fh - the file header
+ * @param ih - the info header
+ * @return the appropriate encoder
+ */
+ public static BMPEncoder getEncoder(BMPFileHeader fh, BMPInfoHeader ih)
+ {
+ switch (ih.getCompression())
+ {
+ case BMPInfoHeader.BI_RGB:
+ switch (ih.getBitCount())
+ {
+ case 32:
+ return new EncodeRGB32(fh, ih);
+
+ case 24:
+ return new EncodeRGB24(fh, ih);
+
+ case 16:
+ return new EncodeRGB16(fh, ih);
+
+ case 8:
+ return new EncodeRGB8(fh, ih);
+
+ case 4:
+ return new EncodeRGB4(fh, ih);
+
+ case 1:
+ return new EncodeRGB1(fh, ih);
+
+ default:
+ return null;
+ }
+ case BMPInfoHeader.BI_RLE4:
+ return new EncodeRLE4(fh, ih);
+
+ case BMPInfoHeader.BI_RLE8:
+ return new EncodeRLE8(fh, ih);
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * The image encoder.
+ *
+ * @param o - the image output stream
+ * @param streamMetadata - metadata associated with this stream, or
+ * null
+ * @param image - an IIOImage containing image data, metadata and
+ * thumbnails to be written
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ */
+ public abstract void encode(ImageOutputStream o, IIOMetadata streamMetadata,
+ IIOImage image, ImageWriteParam param)
+ throws IOException;
+}
diff --git a/gnu/javax/imageio/bmp/BMPFileHeader.java b/gnu/javax/imageio/bmp/BMPFileHeader.java
index 246e0eacf..4ba32d3c3 100644
--- a/gnu/javax/imageio/bmp/BMPFileHeader.java
+++ b/gnu/javax/imageio/bmp/BMPFileHeader.java
@@ -37,27 +37,32 @@ exception statement from your version. */
package gnu.javax.imageio.bmp;
+import java.awt.image.RenderedImage;
import java.io.IOException;
-import javax.imageio.stream.ImageInputStream;
-import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import javax.imageio.IIOImage;
+import javax.imageio.stream.ImageInputStream;
+import javax.imageio.stream.ImageOutputStream;
+
public class BMPFileHeader {
/** Header signature, always 'BM' */
private final static short bfType = 0x424d;
/** Bitmap file size, in bytes. */
- private long bfSize;
+ protected long bfSize;
/** Offset from the beginning of the file to the bitmap data */
- private long bfOffBits;
+ protected long bfOffBits;
/** BITMAPFILEHEADER is 14 bytes */
public static final int SIZE = 14;
-
+ private static final int BITMAPINFOHEADER_SIZE = 40;
+
/**
* Creates the header from an input stream, which is not closed.
+ *
* @throws IOException if an I/O error occured.
* @throws BMPException if the header was invalid
*/
@@ -82,17 +87,37 @@ public class BMPFileHeader {
bfOffBits = ((long)buf.getInt(10) & (0xFFFFFFFF));
}
+
+ /**
+ * Creates the header from an output stream, which is not closed.
+ *
+ * @param out - the image output stream
+ * @param im - the image
+ * @throws IOException if an I/O error occured.
+ */
+ public BMPFileHeader(ImageOutputStream out, IIOImage im) throws IOException
+ {
+ RenderedImage img = im.getRenderedImage();
+ int w = img.getWidth();
+ int h = img.getHeight();
+
+ bfOffBits = SIZE + BITMAPINFOHEADER_SIZE;
+ bfSize = ((w * h) * 3) + ((4 - ((w * 3) % 4)) * h) + bfOffBits;
+
+ write(out);
+ }
/**
* Writes the header to an output stream, which is not closed or flushed.
+ *
* @throws IOException if an I/O error occured.
*/
- public void write(OutputStream out) throws IOException {
+ public void write(ImageOutputStream out) throws IOException {
ByteBuffer buf = ByteBuffer.allocate(SIZE);
buf.putShort(0, bfType); // ID
buf.putInt(2, (int)(bfSize & (0xFFFFFFFF))); // size
buf.putInt(6, 0); // 4 reserved bytes set to zero
- buf.putInt(2, (int)(bfOffBits & (0xFFFFFFFF))); // size
+ buf.putInt(7, (int)(bfOffBits & (0xFFFFFFFF))); // size
out.write(buf.array());
}
diff --git a/gnu/javax/imageio/bmp/BMPImageReader.java b/gnu/javax/imageio/bmp/BMPImageReader.java
index 3341d4b4a..f1359da6a 100644
--- a/gnu/javax/imageio/bmp/BMPImageReader.java
+++ b/gnu/javax/imageio/bmp/BMPImageReader.java
@@ -145,8 +145,6 @@ public class BMPImageReader extends ImageReader {
readHeaders();
return decoder.decode((ImageInputStream)input);
}
-
-
}
diff --git a/gnu/javax/imageio/bmp/BMPImageReaderSpi.java b/gnu/javax/imageio/bmp/BMPImageReaderSpi.java
index b175c7d07..cf8547c71 100644
--- a/gnu/javax/imageio/bmp/BMPImageReaderSpi.java
+++ b/gnu/javax/imageio/bmp/BMPImageReaderSpi.java
@@ -54,9 +54,8 @@ public class BMPImageReaderSpi extends ImageReaderSpi {
static final String[] MIMETypes = {
"image/bmp",
"image/x-windows-bmp"};
-
- static final String[] writerSpiNames = null;
- //{"com.mycompany.imageio.MyFormatImageWriterSpi" };
+ static final String[] writerSpiNames =
+ { "gnu.javax.imageio.bmp.BMPImageWriterSpi" };
static final boolean supportsStandardStreamMetadataFormat = false;
static final String nativeStreamMetadataFormatName = null;
@@ -73,7 +72,7 @@ public class BMPImageReaderSpi extends ImageReaderSpi {
super(vendorName, version,
names, suffixes, MIMETypes,
readerClassName,
- STANDARD_INPUT_TYPE, // Accept ImageImageInputStreams
+ STANDARD_INPUT_TYPE, // Accept ImageInputStreams
writerSpiNames,
supportsStandardStreamMetadataFormat,
nativeStreamMetadataFormatName,
@@ -115,9 +114,3 @@ public class BMPImageReaderSpi extends ImageReaderSpi {
return new BMPImageReader(this);
}
}
-
-
-
-
-
-
diff --git a/gnu/javax/imageio/bmp/BMPImageWriter.java b/gnu/javax/imageio/bmp/BMPImageWriter.java
new file mode 100644
index 000000000..08b5041c9
--- /dev/null
+++ b/gnu/javax/imageio/bmp/BMPImageWriter.java
@@ -0,0 +1,196 @@
+/* BMPImageWriter.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.io.IOException;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageTypeSpecifier;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.spi.ImageWriterSpi;
+import javax.imageio.stream.ImageOutputStream;
+
+public class BMPImageWriter
+ extends ImageWriter
+{
+ protected BMPEncoder encoder;
+ protected BMPFileHeader fileHeader;
+ protected BMPInfoHeader infoHeader;
+
+ /**
+ * Construct an bmp image writer.
+ *
+ * @param originatingProvider - the provider that is constructing this image
+ * writer, or null
+ */
+ protected BMPImageWriter(ImageWriterSpi originatingProvider)
+ {
+ super(originatingProvider);
+ encoder = null;
+ fileHeader = null;
+ infoHeader = null;
+ }
+
+ /**
+ * Convert IIOMetadata from an input reader format, returning an IIOMetadata
+ * suitable for use by an image writer. The ImageTypeSpecifier specifies the
+ * destination image type. An optional ImageWriteParam argument is available
+ * in case the image writing parameters affect the metadata conversion.
+ *
+ * @param inData - the metadata coming from an image reader
+ * @param imageType - the output image type of the writer
+ * @param param - the image writing parameters or null
+ * @return the converted metadata that should be used by the image writer, or
+ * null if this ImageTranscoder has no knowledge of the input metadata
+ * @exception IllegalArgumentException if either inData or imageType is null
+ */
+ public IIOMetadata convertImageMetadata(IIOMetadata inData,
+ ImageTypeSpecifier imageType,
+ ImageWriteParam param)
+ {
+ // FIXME: Support metadata.
+ if (inData == null || imageType == null)
+ throw new IllegalArgumentException("IIOMetadata and ImageTypeSpecifier cannot be null.");
+ return null;
+ }
+
+ /**
+ * Convert IIOMetadata from an input stream format, returning an
+ * IIOMetadata suitable for use by an image writer.
+ *
+ * An optional ImageWriteParam argument is available in case the
+ * image writing parameters affect the metadata conversion.
+ *
+ * @param inData - the metadata coming from an input image stream
+ * @param param - the image writing parameters or null
+ * @return the converted metadata that should be used by the image
+ * writer, or null if this ImageTranscoder has no knowledge of the
+ * input metadata
+ *
+ * @exception IllegalArgumentException if inData is null
+ */
+ public IIOMetadata convertStreamMetadata (IIOMetadata inData,
+ ImageWriteParam param)
+ {
+ // FIXME: Support metadata.
+ if (inData == null)
+ throw new IllegalArgumentException("IIOMetadata cannot be null.");
+ return null;
+ }
+
+ /**
+ * Get a metadata object appropriate for encoding an image specified
+ * by the given image type specifier and optional image write
+ * parameters.
+ *
+ * @param imageType - an image type specifier
+ * @param param - image writing parameters, or null
+ * @return a metadata object appropriate for encoding an image of
+ * the given type with the given parameters
+ */
+ public IIOMetadata getDefaultImageMetadata (ImageTypeSpecifier imageType, ImageWriteParam param)
+ {
+ // FIXME: Support metadata.
+ return null;
+ }
+
+ /**
+ * Get a metadata object appropriate for encoding the default image
+ * type handled by this writer, optionally considering image write
+ * parameters.
+ *
+ * @param param - image writing parameters, or null
+ * @return a metadata object appropriate for encoding an image of
+ * the default type with the given parameters
+ */
+ public IIOMetadata getDefaultStreamMetadata (ImageWriteParam param)
+ {
+ // FIXME: Support metadata.
+ return null;
+ }
+
+ /**
+ * Write an image stream, including thumbnails and metadata to the
+ * output stream. The output must have been set prior to this
+ * method being called. Metadata associated with the stream may be
+ * supplied, or it can be left null. IIOImage may contain raster
+ * data if this writer supports rasters, or it will contain a
+ * rendered image. Thumbnails are resized if need be. Image
+ * writing parameters may be specified to affect writing, or may be
+ * left null.
+ *
+ * @param streamMetadata - metadata associated with this stream, or
+ * null
+ * @param image - an IIOImage containing image data, metadata and
+ * thumbnails to be written
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ * @throws BMPException if the encoder has not been initialized.
+ */
+ public void write(IIOMetadata streamMetadata, IIOImage image,
+ ImageWriteParam param) throws IOException, BMPException
+ {
+ checkStream();
+ ImageOutputStream out = (ImageOutputStream) output;
+ fileHeader = new BMPFileHeader(out, image);
+ infoHeader = new BMPInfoHeader(out, image, param);
+ encoder = BMPEncoder.getEncoder(fileHeader, infoHeader);
+
+ if (encoder != null)
+ encoder.encode(out, streamMetadata, image, param);
+ else
+ throw new BMPException("Encoder has not been initialized.");
+ out.close();
+ }
+
+ /**
+ * Checks the output stream.
+ *
+ * @throws IOException if there is an error with the output stream
+ */
+ private void checkStream() throws IOException
+ {
+ if (!(output instanceof ImageOutputStream))
+ throw new IllegalStateException("Output not an ImageOutputStream.");
+ if (output == null)
+ throw new IllegalStateException("No output stream.");
+ }
+}
diff --git a/gnu/javax/imageio/bmp/BMPImageWriterSpi.java b/gnu/javax/imageio/bmp/BMPImageWriterSpi.java
new file mode 100644
index 000000000..b2a4273c9
--- /dev/null
+++ b/gnu/javax/imageio/bmp/BMPImageWriterSpi.java
@@ -0,0 +1,148 @@
+/* BMPImageWriterSpi.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.util.Locale;
+
+import javax.imageio.ImageTypeSpecifier;
+import javax.imageio.ImageWriter;
+import javax.imageio.spi.ImageWriterSpi;
+
+public class BMPImageWriterSpi
+ extends ImageWriterSpi
+{
+
+ static final String vendorName = "GNU";
+ static final String version = "0.1";
+ static final String writerClassName = "gnu.javax.imageio.bmp.BMPImageWriter";
+ static final String[] names = { "Microsoft Windows BMP" };
+ static final String[] suffixes = { ".bmp", ".bm" };
+ static final String[] MIMETypes = { "image/bmp", "image/x-windows-bmp" };
+ static final String[] readerSpiNames = { "gnu.javax.imageio.bmp.BMPImageReaderSpi" };
+
+ static final boolean supportsStandardStreamMetadataFormat = false;
+ static final String nativeStreamMetadataFormatName = null;
+ static final String nativeStreamMetadataFormatClassName = null;
+ static final String[] extraStreamMetadataFormatNames = null;
+ static final String[] extraStreamMetadataFormatClassNames = null;
+ static final boolean supportsStandardImageMetadataFormat = false;
+ static final String nativeImageMetadataFormatName = null;
+ static final String nativeImageMetadataFormatClassName = null;
+ static final String[] extraImageMetadataFormatNames = null;
+ static final String[] extraImageMetadataFormatClassNames = null;
+
+ private BMPImageWriter writerInstance;
+
+ public BMPImageWriterSpi()
+ {
+ super(vendorName, version, names, suffixes, MIMETypes, writerClassName,
+ STANDARD_OUTPUT_TYPE, readerSpiNames, supportsStandardStreamMetadataFormat,
+ nativeStreamMetadataFormatName, nativeStreamMetadataFormatClassName,
+ extraStreamMetadataFormatNames, extraStreamMetadataFormatClassNames,
+ supportsStandardImageMetadataFormat, nativeImageMetadataFormatName,
+ nativeImageMetadataFormatClassName, extraImageMetadataFormatNames,
+ extraImageMetadataFormatClassNames);
+ }
+
+ /**
+ * Returns true if the image can be encoded.
+ *
+ * @param type - the image type specifier.
+ * @return true if image can be encoded, otherwise false.
+ */
+ public boolean canEncodeImage(ImageTypeSpecifier type)
+ {
+ if (type == null)
+ return false;
+
+ BMPInfoHeader ih = writerInstance.infoHeader;
+ if (ih != null)
+ {
+ int compressionType = ih.getCompression();
+ int bytes = type.getColorModel().getPixelSize();
+ if ((compressionType == BMPInfoHeader.BI_RLE4 && (bytes != 4 || bytes != 8))
+ || (compressionType == BMPInfoHeader.BI_RGB && ((bytes != 1
+ || bytes != 4
+ || bytes != 8
+ || bytes != 16
+ || bytes != 24
+ || bytes != 32))))
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Creates an instance of ImageWriter using the given extension.
+ *
+ * @param extension - the provider that is constructing this image writer, or
+ * null
+ */
+ public ImageWriter createWriterInstance(Object extension)
+ {
+ if (extension != null && extension instanceof ImageWriterSpi)
+ writerInstance = new BMPImageWriter((ImageWriterSpi) extension);
+ else
+ writerInstance = new BMPImageWriter(this);
+ return writerInstance;
+ }
+
+ /**
+ * Gets the instance of ImageWriter, if already created.
+ */
+ public BMPImageWriter getWriterInstance()
+ {
+ if (writerInstance != null)
+ return writerInstance;
+ return (BMPImageWriter) createWriterInstance(null);
+ }
+
+ /**
+ * Returns a short description of this service provider that can be
+ * presented to a human user.
+ *
+ * @param locale - the locale for which the description string should
+ * be localized.
+ */
+ public String getDescription(Locale locale)
+ {
+ return "Microsoft BMP v3";
+ }
+
+}
diff --git a/gnu/javax/imageio/bmp/BMPInfoHeader.java b/gnu/javax/imageio/bmp/BMPInfoHeader.java
index edcb4e644..a9f1ffda7 100644
--- a/gnu/javax/imageio/bmp/BMPInfoHeader.java
+++ b/gnu/javax/imageio/bmp/BMPInfoHeader.java
@@ -37,49 +37,55 @@ exception statement from your version. */
package gnu.javax.imageio.bmp;
+import java.awt.Dimension;
+import java.awt.image.ColorModel;
+import java.awt.image.RenderedImage;
import java.io.IOException;
-import javax.imageio.stream.ImageInputStream;
-import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
-import java.awt.Dimension;
-public class BMPInfoHeader {
- /** Size of the bitmap info header*/
- private int biSize;
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.stream.ImageInputStream;
+import javax.imageio.stream.ImageOutputStream;
+
+public class BMPInfoHeader
+{
+ /** Size of the bitmap info header */
+ protected int biSize;
- /** Pixel width of the bitmap */
- private int biWidth;
+ /** Pixel width of the bitmap */
+ protected int biWidth;
- /** Pixel height of the bitmap */
- private int biHeight;
+ /** Pixel height of the bitmap */
+ protected int biHeight;
- /** Number of bitplanes = 1 */
- private short biPlanes;
+ /** Number of bitplanes = 1 */
+ protected short biPlanes;
- /** Number of bpp = 1,4,8,24 */
- private short biBitCount;
+ /** Number of bpp = 1,4,8,24 */
+ protected short biBitCount;
- /** Compression type, RGB8, RLE8, RLE4, BITFIELDS */
- private int biCompression;
+ /** Compression type, RGB8, RLE8, RLE4, BITFIELDS */
+ protected int biCompression;
- /** Byte size of the uncompressed bitmap, can be 0. */
- private int biSizeImage;
+ /** Byte size of the uncompressed bitmap, can be 0. */
+ protected int biSizeImage;
- /** X resolution, dots per meter */
- private int biXPelsPerMeter;
+ /** X resolution, dots per meter */
+ protected int biXPelsPerMeter;
- /** Y resolution, dots per meter */
- private int biYPelsPerMeter;
+ /** Y resolution, dots per meter */
+ protected int biYPelsPerMeter;
- /** Number of colors used (palette only, can be 0 for all) */
- private int biClrUsed;
+ /** Number of colors used (palette only, can be 0 for all) */
+ protected int biClrUsed;
- /** Number of 'important' colors, 0 for all */
- private int biClrImportant;
+ /** Number of 'important' colors, 0 for all */
+ protected int biClrImportant;
- /** BITMAPINFOHEADER is 40 bytes */
- public static final int SIZE = 40;
+ /** BITMAPINFOHEADER is 40 bytes */
+ public static final int SIZE = 40;
/**
* Compression types
@@ -91,111 +97,221 @@ public class BMPInfoHeader {
/**
* Creates the header from an input stream, which is not closed.
+ *
+ * @param in - the image input stream
* @throws IOException if an I/O error occured.
* @throws BMPException if the header was invalid
*/
- public BMPInfoHeader(ImageInputStream in) throws IOException, BMPException {
- byte[] data = new byte[SIZE];
-
- if (in.read(data) != SIZE)
- throw new IOException("Couldn't read header.");
- ByteBuffer buf = ByteBuffer.wrap(data);
- buf.order(ByteOrder.LITTLE_ENDIAN);
-
- int n;
- if((n=buf.getInt()) != SIZE)
- throw new BMPException("Invalid BITMAPINFOHEADER size: "+n);
-
- biWidth = buf.getInt();
- biHeight = buf.getInt();
- biPlanes = buf.getShort();
- setBitCount(buf.getShort());
- setCompression(buf.getInt());
- biSizeImage = buf.getInt();
- biXPelsPerMeter = buf.getInt();
- biYPelsPerMeter = buf.getInt();
- biClrUsed = buf.getInt();
- biClrImportant = buf.getInt();
- }
-
- public void setBitCount(short bitcount) throws BMPException {
- switch(bitcount){
- case 1:
- case 4:
- case 8:
- case 16:
- case 24:
- case 32:
- biBitCount = bitcount;
- break;
-
- default:
- throw new BMPException("Invalid number of bits per pixel: "+
- bitcount);
- }
- }
-
- public short getBitCount() { return biBitCount; }
-
- public void setCompression(int compression) throws BMPException {
- switch(compression){
- case BI_RLE8:
- if(getBitCount() != 8)
- throw new BMPException("Invalid number of bits per pixel.");
- biCompression = compression;
- break;
- case BI_RLE4:
- if(getBitCount() != 4)
- throw new BMPException("Invalid number of bits per pixel.");
- biCompression = compression;
- break;
-
- case BI_RGB:
- case BI_BITFIELDS:
- biCompression = compression;
- break;
-
- default:
- throw new BMPException("Unknown bitmap compression type.");
- }
- }
-
- public int getNumberOfPaletteEntries(){
- if(biClrUsed == 0)
- switch(biBitCount){
- case 1:
- return 2;
- case 4:
- return 16;
- case 8:
- return 256;
-
- default: // should not happen
- return 0;
- }
-
- return biClrUsed;
- }
-
- public int getCompression(){
- return biCompression;
- }
-
- public Dimension getSize(){
- return new Dimension(biWidth, biHeight);
- }
-
- public int getWidth(){
- return biWidth;
- }
-
- public int getHeight(){
- return biHeight;
- }
-
- public void setSize(Dimension d){
- biWidth = (int)d.getWidth();
- biHeight = (int)d.getHeight();
- }
-
+ public BMPInfoHeader(ImageInputStream in) throws IOException, BMPException
+ {
+ byte[] data = new byte[SIZE];
+
+ if (in.read(data) != SIZE)
+ throw new IOException("Couldn't read header.");
+ ByteBuffer buf = ByteBuffer.wrap(data);
+ buf.order(ByteOrder.LITTLE_ENDIAN);
+
+ int n;
+ if ((n = buf.getInt()) != SIZE)
+ throw new BMPException("Invalid BITMAPINFOHEADER size: " + n);
+
+ biWidth = buf.getInt();
+ biHeight = buf.getInt();
+ biPlanes = buf.getShort();
+ setBitCount(buf.getShort());
+ setCompression(buf.getInt());
+ biSizeImage = buf.getInt();
+ biXPelsPerMeter = buf.getInt();
+ biYPelsPerMeter = buf.getInt();
+ biClrUsed = buf.getInt();
+ biClrImportant = buf.getInt();
+ }
+
+ /**
+ * Creates the info header from an output stream, which is not closed.
+ *
+ * @param out - the image output stream
+ * @param im - the image
+ * @param param - the image write param.
+ * @throws IOException if an I/O error occured.
+ */
+ public BMPInfoHeader(ImageOutputStream out, IIOImage im, ImageWriteParam param) throws IOException
+ {
+ RenderedImage img = im.getRenderedImage();
+ ColorModel cMod = img.getColorModel();
+
+ biSize = SIZE;
+ biWidth = img.getWidth();
+ biHeight = img.getHeight();
+ biPlanes = 1;
+
+ if (param != null && param.canWriteCompressed())
+ {
+ String compType = param.getCompressionType();
+ if (compType.equals("BI_RLE8"))
+ {
+ biCompression = BI_RLE8;
+ biBitCount = 8;
+ }
+ else if (compType.equals("BI_RLE4"))
+ {
+ biCompression = BI_RLE4;
+ biBitCount = 4;
+ }
+ else
+ {
+ biCompression = BI_RGB;
+ biBitCount = (short) cMod.getPixelSize();
+ }
+ }
+ else
+ {
+ biBitCount = (short) cMod.getPixelSize();
+ biCompression = BI_RGB;
+ }
+
+ biXPelsPerMeter = 0x0;
+ biYPelsPerMeter = 0x0;
+ biClrUsed = 0;
+ biClrImportant = 0;
+ biSizeImage = ((biWidth * biHeight) * 3)
+ + ((4 - ((biWidth * 3) % 4)) * biHeight);
+ out.write(intToDWord(biSize));
+ out.write(intToDWord(biWidth));
+ out.write(intToDWord(biHeight));
+ out.write(intToWord(biPlanes));
+ out.write(intToWord(biBitCount));
+ out.write(intToDWord(biCompression));
+ out.write(intToDWord(biSizeImage));
+ out.write(intToDWord(biXPelsPerMeter));
+ out.write(intToDWord(biYPelsPerMeter));
+ out.write(intToDWord(biClrUsed));
+ out.write(intToDWord(biClrImportant));
+ }
+
+ /**
+ * Converts an int to a word, where the return value is stored in a
+ * 2-byte array.
+ *
+ * @param val - the value to convert
+ * @return the array
+ */
+ private byte[] intToWord(int val)
+ {
+ byte b[] = new byte[2];
+ b[0] = (byte) (val & 0x00FF);
+ b[1] = (byte) ((val >> 8) & 0x00FF);
+ return b;
+ }
+
+ /**
+ * Converts an int to a double word, where the return value is
+ * stored in a 4-byte array.
+ *
+ * @param val - the value to convert
+ * @return the array
+ */
+ private byte[] intToDWord(int val)
+ {
+ byte b[] = new byte[4];
+ b[0] = (byte) (val & 0x00FF);
+ b[1] = (byte) ((val >> 8) & 0x000000FF);
+ b[2] = (byte) ((val >> 16) & 0x000000FF);
+ b[3] = (byte) ((val >> 24) & 0x000000FF);
+ return b;
+ }
+
+
+ public void setBitCount(short bitcount) throws BMPException
+ {
+ switch (bitcount)
+ {
+ case 1:
+ case 4:
+ case 8:
+ case 16:
+ case 24:
+ case 32:
+ biBitCount = bitcount;
+ break;
+
+ default:
+ throw new BMPException("Invalid number of bits per pixel: " + bitcount);
+ }
+ }
+
+ public short getBitCount()
+ {
+ return biBitCount;
+ }
+
+ public void setCompression(int compression) throws BMPException
+ {
+ switch (compression)
+ {
+ case BI_RLE8:
+ if (getBitCount() != 8)
+ throw new BMPException("Invalid number of bits per pixel.");
+ biCompression = compression;
+ break;
+ case BI_RLE4:
+ if (getBitCount() != 4)
+ throw new BMPException("Invalid number of bits per pixel.");
+ biCompression = compression;
+ break;
+
+ case BI_RGB:
+ case BI_BITFIELDS:
+ biCompression = compression;
+ break;
+
+ default:
+ throw new BMPException("Unknown bitmap compression type.");
+ }
+ }
+
+ public int getNumberOfPaletteEntries()
+ {
+ if (biClrUsed == 0)
+ switch (biBitCount)
+ {
+ case 1:
+ return 2;
+ case 4:
+ return 16;
+ case 8:
+ return 256;
+
+ default: // should not happen
+ return 0;
+ }
+
+ return biClrUsed;
+ }
+
+ public int getCompression()
+ {
+ return biCompression;
+ }
+
+ public Dimension getSize()
+ {
+ return new Dimension(biWidth, biHeight);
+ }
+
+ public int getWidth()
+ {
+ return biWidth;
+ }
+
+ public int getHeight()
+ {
+ return biHeight;
+ }
+
+ public void setSize(Dimension d)
+ {
+ biWidth = (int) d.getWidth();
+ biHeight = (int) d.getHeight();
+ }
}
diff --git a/gnu/javax/imageio/bmp/DecodeBF32.java b/gnu/javax/imageio/bmp/DecodeBF32.java
index ee64f4b0e..47ce8cc76 100644
--- a/gnu/javax/imageio/bmp/DecodeBF32.java
+++ b/gnu/javax/imageio/bmp/DecodeBF32.java
@@ -39,8 +39,6 @@ package gnu.javax.imageio.bmp;
import java.io.IOException;
import javax.imageio.stream.ImageInputStream;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DirectColorModel;
diff --git a/gnu/javax/imageio/bmp/DecodeRGB24.java b/gnu/javax/imageio/bmp/DecodeRGB24.java
index 2a910cb30..2b7f99be1 100644
--- a/gnu/javax/imageio/bmp/DecodeRGB24.java
+++ b/gnu/javax/imageio/bmp/DecodeRGB24.java
@@ -50,7 +50,7 @@ public class DecodeRGB24 extends BMPDecoder {
public BufferedImage decode(ImageInputStream in) throws IOException, BMPException {
skipToImage(in);
-
+
Dimension d = infoHeader.getSize();
int h = (int)d.getHeight();
int w = (int)d.getWidth();
diff --git a/gnu/javax/imageio/bmp/EncodeRGB1.java b/gnu/javax/imageio/bmp/EncodeRGB1.java
new file mode 100644
index 000000000..293aba810
--- /dev/null
+++ b/gnu/javax/imageio/bmp/EncodeRGB1.java
@@ -0,0 +1,128 @@
+/* EncodeRGB1.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.PixelGrabber;
+import java.io.IOException;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageOutputStream;
+
+public class EncodeRGB1
+ extends BMPEncoder
+{
+ protected BMPInfoHeader infoHeader;
+ protected BMPFileHeader fileHeader;
+ protected long offset;
+
+ /**
+ * Constructs an instance of this class.
+ *
+ * @param fh - the file header to use.
+ * @param ih - the info header to use.
+ */
+ public EncodeRGB1(BMPFileHeader fh, BMPInfoHeader ih)
+ {
+ super();
+ fileHeader = fh;
+ infoHeader = ih;
+ offset = BMPFileHeader.SIZE + BMPInfoHeader.SIZE;
+ }
+
+ /**
+ * The image encoder.
+ *
+ * @param o - the image output stream
+ * @param streamMetadata - metadata associated with this stream, or
+ * null
+ * @param image - an IIOImage containing image data.
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ */
+ public void encode(ImageOutputStream o, IIOMetadata streamMetadata,
+ IIOImage image, ImageWriteParam param) throws IOException
+ {
+ int size;
+ int value;
+ int j;
+ int rowCount;
+ int rowIndex;
+ int lastRowIndex;
+ int[] bitmap;
+ byte rgb[] = new byte[1];
+ size = (infoHeader.biWidth * infoHeader.biHeight) - 1;
+ rowCount = 1;
+ rowIndex = size - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ try
+ {
+ bitmap = new int[infoHeader.biWidth * infoHeader.biHeight];
+ PixelGrabber pg = new PixelGrabber((BufferedImage) image.getRenderedImage(),
+ 0, 0, infoHeader.biWidth,
+ infoHeader.biHeight, bitmap, 0,
+ infoHeader.biWidth);
+ pg.grabPixels();
+
+ for (j = 0; j < size; j++)
+ {
+ value = bitmap[rowIndex];
+
+ rgb[0] = (byte) (value & 0xFF);
+
+ o.write(rgb);
+ if (rowCount == infoHeader.biWidth)
+ {
+ rowCount = 1;
+ rowIndex = lastRowIndex - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ }
+ else
+ rowCount++;
+ rowIndex++;
+ }
+ }
+ catch (Exception wb)
+ {
+ wb.printStackTrace();
+ }
+ }
+}
diff --git a/gnu/javax/imageio/bmp/EncodeRGB16.java b/gnu/javax/imageio/bmp/EncodeRGB16.java
new file mode 100644
index 000000000..3e9912855
--- /dev/null
+++ b/gnu/javax/imageio/bmp/EncodeRGB16.java
@@ -0,0 +1,129 @@
+/* EncodeRGB16.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.PixelGrabber;
+import java.io.IOException;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageOutputStream;
+
+public class EncodeRGB16
+ extends BMPEncoder
+{
+ protected BMPInfoHeader infoHeader;
+ protected BMPFileHeader fileHeader;
+ protected long offset;
+
+ /**
+ * Constructs an instance of this class.
+ *
+ * @param fh - the file header to use.
+ * @param ih - the info header to use.
+ */
+ public EncodeRGB16(BMPFileHeader fh, BMPInfoHeader ih)
+ {
+ super();
+ fileHeader = fh;
+ infoHeader = ih;
+ offset = BMPFileHeader.SIZE + BMPInfoHeader.SIZE;
+ }
+
+ /**
+ * The image encoder.
+ *
+ * @param o - the image output stream
+ * @param streamMetadata - metadata associated with this stream, or
+ * null
+ * @param image - an IIOImage containing image data.
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ */
+ public void encode(ImageOutputStream o, IIOMetadata streamMetadata,
+ IIOImage image, ImageWriteParam param) throws IOException
+ {
+ int size;
+ int value;
+ int j;
+ int rowCount;
+ int rowIndex;
+ int lastRowIndex;
+ int[] bitmap;
+ byte rgb[] = new byte[2];
+ size = (infoHeader.biWidth * infoHeader.biHeight) - 1;
+ rowCount = 1;
+ rowIndex = size - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ try
+ {
+ bitmap = new int[infoHeader.biWidth * infoHeader.biHeight];
+ PixelGrabber pg = new PixelGrabber((BufferedImage) image.getRenderedImage(),
+ 0, 0, infoHeader.biWidth,
+ infoHeader.biHeight, bitmap, 0,
+ infoHeader.biWidth);
+ pg.grabPixels();
+
+ for (j = 0; j < size; j++)
+ {
+ value = bitmap[rowIndex];
+
+ rgb[0] = (byte) (value & 0xFF);
+ rgb[1] = (byte) (value >> 8 & 0xFF);
+
+ o.write(rgb);
+ if (rowCount == infoHeader.biWidth)
+ {
+ rowCount = 1;
+ rowIndex = lastRowIndex - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ }
+ else
+ rowCount++;
+ rowIndex++;
+ }
+ }
+ catch (Exception wb)
+ {
+ wb.printStackTrace();
+ }
+ }
+}
diff --git a/gnu/javax/imageio/bmp/EncodeRGB24.java b/gnu/javax/imageio/bmp/EncodeRGB24.java
new file mode 100644
index 000000000..10c1abee8
--- /dev/null
+++ b/gnu/javax/imageio/bmp/EncodeRGB24.java
@@ -0,0 +1,129 @@
+/* EncodeRGB24.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.PixelGrabber;
+import java.io.IOException;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageOutputStream;
+
+public class EncodeRGB24
+ extends BMPEncoder
+{
+ protected BMPInfoHeader infoHeader;
+ protected BMPFileHeader fileHeader;
+ protected long offset;
+
+ /**
+ * Constructs an instance of this class.
+ *
+ * @param fh - the file header to use.
+ * @param ih - the info header to use.
+ */
+ public EncodeRGB24(BMPFileHeader fh, BMPInfoHeader ih)
+ {
+ super();
+ fileHeader = fh;
+ infoHeader = ih;
+ offset = BMPFileHeader.SIZE + BMPInfoHeader.SIZE;
+ }
+
+ /**
+ * The image encoder.
+ *
+ * @param o - the image output stream
+ * @param streamMetadata - metadata associated with this stream, or
+ * null
+ * @param image - an IIOImage containing image data.
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ */
+ public void encode(ImageOutputStream o, IIOMetadata streamMetadata,
+ IIOImage image, ImageWriteParam param) throws IOException
+ {
+ int size;
+ int value;
+ int j;
+ int rowCount;
+ int rowIndex;
+ int lastRowIndex;
+ int[] bitmap;
+ byte rgb[] = new byte[3];
+ size = (infoHeader.biWidth * infoHeader.biHeight) - 1;
+ rowCount = 1;
+ rowIndex = size - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ try
+ {
+ bitmap = new int[infoHeader.biWidth * infoHeader.biHeight];
+ PixelGrabber pg = new PixelGrabber((BufferedImage) image.getRenderedImage(),
+ 0, 0, infoHeader.biWidth,
+ infoHeader.biHeight, bitmap, 0,
+ infoHeader.biWidth);
+ pg.grabPixels();
+
+ for (j = 0; j < size; j++)
+ {
+ value = bitmap[rowIndex];
+
+ rgb[0] = (byte) (value & 0xFF);
+ rgb[1] = (byte) ((value >> 8) & 0xFF);
+ rgb[2] = (byte) ((value >> 16) & 0xFF);
+ o.write(rgb);
+ if (rowCount == infoHeader.biWidth)
+ {
+ rowCount = 1;
+ rowIndex = lastRowIndex - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ }
+ else
+ rowCount++;
+ rowIndex++;
+ }
+ }
+ catch (Exception wb)
+ {
+ wb.printStackTrace();
+ }
+ }
+}
diff --git a/gnu/javax/imageio/bmp/EncodeRGB32.java b/gnu/javax/imageio/bmp/EncodeRGB32.java
new file mode 100644
index 000000000..d653bbf9f
--- /dev/null
+++ b/gnu/javax/imageio/bmp/EncodeRGB32.java
@@ -0,0 +1,130 @@
+/* EncodeRGB32.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.awt.Dimension;
+import java.awt.image.BufferedImage;
+import java.awt.image.PixelGrabber;
+import java.io.IOException;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageOutputStream;
+
+public class EncodeRGB32
+ extends BMPEncoder
+{
+ protected BMPInfoHeader infoHeader;
+ protected BMPFileHeader fileHeader;
+ protected long offset;
+
+ /**
+ * Constructs an instance of this class.
+ *
+ * @param fh - the file header to use.
+ * @param ih - the info header to use.
+ */
+ public EncodeRGB32(BMPFileHeader fh, BMPInfoHeader ih)
+ {
+ super();
+ fileHeader = fh;
+ infoHeader = ih;
+ offset = BMPFileHeader.SIZE + BMPInfoHeader.SIZE;
+ }
+
+ /**
+ * The image encoder.
+ *
+ * @param o - the image output stream
+ * @param streamMetadata - metadata associated with this stream, or null
+ * @param image - an IIOImage containing image data.
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ */
+ public void encode(ImageOutputStream o, IIOMetadata streamMetadata,
+ IIOImage image, ImageWriteParam param) throws IOException
+ {
+ int size;
+ int value;
+ int j;
+ int rowCount;
+ int rowIndex;
+ int lastRowIndex;
+ int[] bitmap;
+ byte rgb[] = new byte[4];
+ size = (infoHeader.biWidth * infoHeader.biHeight) - 1;
+ rowCount = 1;
+ rowIndex = size - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ try
+ {
+ bitmap = new int[infoHeader.biWidth * infoHeader.biHeight];
+ PixelGrabber pg = new PixelGrabber((BufferedImage) image.getRenderedImage(),
+ 0, 0, infoHeader.biWidth,
+ infoHeader.biHeight, bitmap, 0,
+ infoHeader.biWidth);
+ pg.grabPixels();
+
+ for (j = 0; j < size; j++)
+ {
+ value = bitmap[rowIndex];
+
+ rgb[0] = (byte) (value & 0xFF);
+ rgb[1] = (byte) ((value >> 8) & 0xFF);
+ rgb[2] = (byte) ((value >> 16) & 0xFF);
+ rgb[3] = (byte) ((value >> 24) & 0xFF);
+ o.write(rgb);
+ if (rowCount == infoHeader.biWidth)
+ {
+ rowCount = 1;
+ rowIndex = lastRowIndex - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ }
+ else
+ rowCount++;
+ rowIndex++;
+ }
+ }
+ catch (Exception wb)
+ {
+ wb.printStackTrace();
+ }
+ }
+}
diff --git a/gnu/javax/imageio/bmp/EncodeRGB4.java b/gnu/javax/imageio/bmp/EncodeRGB4.java
new file mode 100644
index 000000000..f1903541f
--- /dev/null
+++ b/gnu/javax/imageio/bmp/EncodeRGB4.java
@@ -0,0 +1,128 @@
+/* EncodeRGB4.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.PixelGrabber;
+import java.io.IOException;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageOutputStream;
+
+public class EncodeRGB4
+ extends BMPEncoder
+{
+ protected BMPInfoHeader infoHeader;
+ protected BMPFileHeader fileHeader;
+ protected long offset;
+
+ /**
+ * Constructs an instance of this class.
+ *
+ * @param fh - the file header to use.
+ * @param ih - the info header to use.
+ */
+ public EncodeRGB4(BMPFileHeader fh, BMPInfoHeader ih)
+ {
+ super();
+ fileHeader = fh;
+ infoHeader = ih;
+ offset = BMPFileHeader.SIZE + BMPInfoHeader.SIZE;
+ }
+
+ /**
+ * The image encoder.
+ *
+ * @param o - the image output stream
+ * @param streamMetadata - metadata associated with this stream, or
+ * null
+ * @param image - an IIOImage containing image data.
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ */
+ public void encode(ImageOutputStream o, IIOMetadata streamMetadata,
+ IIOImage image, ImageWriteParam param) throws IOException
+ {
+ int size;
+ int value;
+ int j;
+ int rowCount;
+ int rowIndex;
+ int lastRowIndex;
+ int[] bitmap;
+ byte rgb[] = new byte[1];
+ size = (infoHeader.biWidth * infoHeader.biHeight) - 1;
+ rowCount = 1;
+ rowIndex = size - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ try
+ {
+ bitmap = new int[infoHeader.biWidth * infoHeader.biHeight];
+ PixelGrabber pg = new PixelGrabber((BufferedImage) image.getRenderedImage(),
+ 0, 0, infoHeader.biWidth,
+ infoHeader.biHeight, bitmap, 0,
+ infoHeader.biWidth);
+ pg.grabPixels();
+
+ for (j = 0; j < size; j++)
+ {
+ value = bitmap[rowIndex];
+
+ rgb[0] = (byte) (value & 0xFF);
+
+ o.write(rgb);
+ if (rowCount == infoHeader.biWidth)
+ {
+ rowCount = 1;
+ rowIndex = lastRowIndex - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ }
+ else
+ rowCount++;
+ rowIndex++;
+ }
+ }
+ catch (Exception wb)
+ {
+ wb.printStackTrace();
+ }
+ }
+}
diff --git a/gnu/javax/imageio/bmp/EncodeRGB8.java b/gnu/javax/imageio/bmp/EncodeRGB8.java
new file mode 100644
index 000000000..dd7387a9a
--- /dev/null
+++ b/gnu/javax/imageio/bmp/EncodeRGB8.java
@@ -0,0 +1,127 @@
+/* EncodeRGB8.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.PixelGrabber;
+import java.io.IOException;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageOutputStream;
+
+public class EncodeRGB8
+ extends BMPEncoder
+{
+ protected BMPInfoHeader infoHeader;
+ protected BMPFileHeader fileHeader;
+ protected long offset;
+
+ /**
+ * Constructs an instance of this class.
+ *
+ * @param fh - the file header to use.
+ * @param ih - the info header to use.
+ */
+ public EncodeRGB8(BMPFileHeader fh, BMPInfoHeader ih)
+ {
+ super();
+ fileHeader = fh;
+ infoHeader = ih;
+ offset = BMPFileHeader.SIZE + BMPInfoHeader.SIZE;
+ }
+
+ /**
+ * The image encoder.
+ *
+ * @param o - the image output stream
+ * @param streamMetadata - metadata associated with this stream, or
+ * null
+ * @param image - an IIOImage containing image data.
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ */
+ public void encode(ImageOutputStream o, IIOMetadata streamMetadata,
+ IIOImage image, ImageWriteParam param) throws IOException
+ {
+ int size;
+ int value;
+ int j;
+ int rowCount;
+ int rowIndex;
+ int lastRowIndex;
+ int[] bitmap;
+ byte rgb[] = new byte[1];
+ size = (infoHeader.biWidth * infoHeader.biHeight) - 1;
+ rowCount = 1;
+ rowIndex = size - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ try
+ {
+ bitmap = new int[infoHeader.biWidth * infoHeader.biHeight];
+ PixelGrabber pg = new PixelGrabber((BufferedImage) image.getRenderedImage(),
+ 0, 0, infoHeader.biWidth,
+ infoHeader.biHeight, bitmap, 0,
+ infoHeader.biWidth);
+ pg.grabPixels();
+
+ for (j = 0; j < size; j++)
+ {
+ value = bitmap[rowIndex];
+
+ rgb[0] = (byte) (value & 0xFF);
+ o.write(rgb);
+ if (rowCount == infoHeader.biWidth)
+ {
+ rowCount = 1;
+ rowIndex = lastRowIndex - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ }
+ else
+ rowCount++;
+ rowIndex++;
+ }
+ }
+ catch (Exception wb)
+ {
+ wb.printStackTrace();
+ }
+ }
+}
diff --git a/gnu/javax/imageio/bmp/EncodeRLE4.java b/gnu/javax/imageio/bmp/EncodeRLE4.java
new file mode 100644
index 000000000..3674c4d78
--- /dev/null
+++ b/gnu/javax/imageio/bmp/EncodeRLE4.java
@@ -0,0 +1,269 @@
+/* EncodeRLE4.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.PixelGrabber;
+import java.io.IOException;
+import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageOutputStream;
+
+public class EncodeRLE4
+ extends BMPEncoder
+{
+ protected BMPInfoHeader infoHeader;
+ protected BMPFileHeader fileHeader;
+ protected long offset;
+
+ /**
+ * RLE control codes
+ */
+ private static final byte ESCAPE = (byte)0;
+ private static final byte EOL = (byte)0; // end of line
+ private static final byte EOB = (byte)1; // end of bitmap
+ private static final byte DELTA = (byte)2; // delta
+
+ /**
+ * Constructs an instance of this class.
+ *
+ * @param fh - the file header to use.
+ * @param ih - the info header to use.
+ */
+ public EncodeRLE4(BMPFileHeader fh, BMPInfoHeader ih)
+ {
+ super();
+ fileHeader = fh;
+ infoHeader = ih;
+ offset = BMPFileHeader.SIZE + BMPInfoHeader.SIZE;
+ }
+
+ /**
+ * The image encoder.
+ *
+ * @param o - the image output stream
+ * @param streamMetadata - metadata associated with this stream, or
+ * null
+ * @param image - an IIOImage containing image data.
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ */
+ public void encode(ImageOutputStream o, IIOMetadata streamMetadata,
+ IIOImage image, ImageWriteParam param) throws IOException
+ {
+ int size;
+ int value;
+ int j;
+ int rowCount;
+ int rowIndex;
+ int lastRowIndex;
+ int[] bitmap;
+ size = (infoHeader.biWidth * infoHeader.biHeight) - 1;
+ rowCount = 1;
+ rowIndex = size - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ try
+ {
+ bitmap = new int[infoHeader.biWidth * infoHeader.biHeight];
+ PixelGrabber pg = new PixelGrabber((BufferedImage) image.getRenderedImage(),
+ 0, 0, infoHeader.biWidth,
+ infoHeader.biHeight, bitmap, 0,
+ infoHeader.biWidth);
+ pg.grabPixels();
+
+ for (j = 0; j < size; j++)
+ {
+ value = bitmap[rowIndex];
+ buf.put((byte) (value & 0xFF));
+
+ if (rowCount == infoHeader.biWidth)
+ {
+ rowCount = 1;
+ rowIndex = lastRowIndex - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ }
+ else
+ rowCount++;
+ rowIndex++;
+ }
+
+ buf.flip();
+ o.write(uncompress(infoHeader.biWidth, infoHeader.biHeight, buf));
+ }
+ catch (Exception wb)
+ {
+ wb.printStackTrace();
+ }
+ }
+
+ /**
+ * Uncompresses the image stored in the buffer.
+ *
+ * @param w - the width of the image
+ * @param h - the height of the image
+ * @param buf - the ByteBuffer containing the pixel values.
+ * @return byte array containing the uncompressed image
+ * @throws IOException if an error is encountered while reading
+ * buffer.
+ */
+ private byte[] uncompress(int w, int h, ByteBuffer buf)
+ throws IOException
+ {
+ byte[] cmd = new byte[2];
+ byte[] data = new byte[w * h >> 1];
+ int offIn = 0;
+ int x = 0, y = 0;
+
+ w += (w & 1);
+ w = w >> 1;
+
+ try
+ {
+ while (((x >> 1) + y * w) < w * h)
+ {
+ try
+ {
+ buf.get(cmd);
+ }
+ catch (BufferUnderflowException e)
+ {
+ throw new IOException("Error reading compressed data.");
+ }
+
+ if (cmd[0] == ESCAPE)
+ {
+ switch (cmd[1])
+ {
+ case EOB:
+ return data;
+ case EOL:
+ x = 0;
+ y++;
+ break;
+ case DELTA:
+ try
+ {
+ buf.get(cmd);
+ }
+ catch (BufferUnderflowException e)
+ {
+ throw new IOException("Error reading compressed data.");
+ }
+
+ int dx = cmd[0] & (0xFF);
+ int dy = cmd[1] & (0xFF);
+ x += dx;
+ y += dy;
+ break;
+
+ default:
+ int length = cmd[1] & (0xFF);
+
+ int bytesize = length;
+ bytesize += (bytesize & 1);
+ bytesize >>= 1;
+ bytesize += (bytesize & 1);
+
+ byte[] run = new byte[bytesize];
+ try
+ {
+ buf.get(run);
+ }
+ catch (BufferUnderflowException e)
+ {
+ throw new IOException("Error reading compressed data.");
+ }
+
+ if ((x & 1) == 0)
+ {
+ length += (length & 1);
+ length >>= 1;
+ System.arraycopy(run, 0, data,
+ ((x >> 1) + w * (h - y - 1)), length);
+ }
+ else
+ {
+ for (int i = 0; i < length; i++)
+ {
+ if ((i & 1) == 0)
+ data[((x + i) >> 1) + w * (h - y - 1)] |= ((run[i >> 1] & 0xF0) >> 4);
+ else
+ data[((x + i) >> 1) + w * (h - y - 1)] |= ((run[i >> 1] & 0x0F) << 4);
+ }
+ }
+ x += cmd[1] & (0xFF);
+ break;
+ }
+ }
+ else
+ {
+ int length = cmd[0] & (0xFF);
+ if ((x & 1) == 0)
+ {
+ length += (length & 1);
+ length >>= 1;
+ for (int i = 0; i < length; i++)
+ data[(h - y - 1) * w + i + (x >> 1)] = cmd[1];
+ }
+ else
+ {
+ for (int i = 0; i < length; i++)
+ {
+ if ((i & 1) == 0)
+ data[((x + i) >> 1) + w * (h - y - 1)] |= ((cmd[1] & 0xF0) >> 4);
+ else
+ data[((x + i) >> 1) + w * (h - y - 1)] |= ((cmd[1] & 0x0F) << 4);
+ }
+ }
+ x += cmd[0] & (0xFF);
+ }
+ }
+ return data;
+ }
+ catch (ArrayIndexOutOfBoundsException e)
+ {
+ throw new BMPException("Invalid RLE data.");
+ }
+ }
+}
diff --git a/gnu/javax/imageio/bmp/EncodeRLE8.java b/gnu/javax/imageio/bmp/EncodeRLE8.java
new file mode 100644
index 000000000..dbbaeb269
--- /dev/null
+++ b/gnu/javax/imageio/bmp/EncodeRLE8.java
@@ -0,0 +1,234 @@
+/* EncodeRGB32.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.bmp;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.PixelGrabber;
+import java.io.IOException;
+import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageOutputStream;
+
+public class EncodeRLE8
+ extends BMPEncoder
+{
+ protected BMPInfoHeader infoHeader;
+ protected BMPFileHeader fileHeader;
+ protected long offset;
+
+ /**
+ * RLE control codes
+ */
+ private static final byte ESCAPE = (byte)0;
+ private static final byte EOL = (byte)0; // end of line
+ private static final byte EOB = (byte)1; // end of bitmap
+ private static final byte DELTA = (byte)2; // delta
+
+ /**
+ * Constructs an instance of this class.
+ *
+ * @param fh - the file header to use.
+ * @param ih - the info header to use.
+ */
+ public EncodeRLE8(BMPFileHeader fh, BMPInfoHeader ih)
+ {
+ super();
+ fileHeader = fh;
+ infoHeader = ih;
+ offset = BMPFileHeader.SIZE + BMPInfoHeader.SIZE;
+ }
+
+ /**
+ * The image encoder.
+ *
+ * @param o - the image output stream
+ * @param streamMetadata - metadata associated with this stream, or
+ * null
+ * @param image - an IIOImage containing image data.
+ * @param param - image writing parameters, or null
+ * @exception IOException if a write error occurs
+ */
+ public void encode(ImageOutputStream o, IIOMetadata streamMetadata,
+ IIOImage image, ImageWriteParam param) throws IOException
+ {
+ int size;
+ int value;
+ int j;
+ int rowCount;
+ int rowIndex;
+ int lastRowIndex;
+ int[] bitmap;
+ size = (infoHeader.biWidth * infoHeader.biHeight) - 1;
+ rowCount = 1;
+ rowIndex = size - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ try
+ {
+ bitmap = new int[infoHeader.biWidth * infoHeader.biHeight];
+ PixelGrabber pg = new PixelGrabber((BufferedImage) image.getRenderedImage(),
+ 0, 0, infoHeader.biWidth,
+ infoHeader.biHeight, bitmap, 0,
+ infoHeader.biWidth);
+ pg.grabPixels();
+
+ for (j = 0; j < size; j++)
+ {
+ value = bitmap[rowIndex];
+ buf.put((byte) (value & 0xFF));
+
+ if (rowCount == infoHeader.biWidth)
+ {
+ rowCount = 1;
+ rowIndex = lastRowIndex - infoHeader.biWidth;
+ lastRowIndex = rowIndex;
+ }
+ else
+ rowCount++;
+ rowIndex++;
+ }
+
+ buf.flip();
+ o.write(uncompress(infoHeader.biWidth, infoHeader.biHeight, buf));
+ }
+ catch (Exception wb)
+ {
+ wb.printStackTrace();
+ }
+ }
+
+
+ /**
+ * Uncompresses the image stored in the buffer.
+ *
+ * @param w - the width of the image
+ * @param h - the height of the image
+ * @param buf - the ByteBuffer containing the pixel values.
+ * @return byte array containing the uncompressed image
+ * @throws IOException if an error is encountered while reading
+ * buffer.
+ */
+ private byte[] uncompress(int w, int h, ByteBuffer buf) throws IOException
+ {
+ byte[] cmd = new byte[2];
+ byte[] data = new byte[w * h];
+ int offIn = 0;
+ int x = 0, y = 0;
+
+ try
+ {
+ while ((x + y * w) < w * h)
+ {
+ try
+ {
+ buf.get(cmd);
+ }
+ catch (BufferUnderflowException e)
+ {
+ throw new IOException("Error reading compressed data.");
+ }
+
+ if (cmd[0] == ESCAPE)
+ {
+ switch (cmd[1])
+ {
+ case EOB:
+ return data;
+ case EOL:
+ x = 0;
+ y++;
+ break;
+ case DELTA:
+ try
+ {
+ buf.get(cmd);
+ }
+ catch (BufferUnderflowException e)
+ {
+ throw new IOException("Error reading compressed data.");
+ }
+
+ int dx = cmd[0] & (0xFF);
+ int dy = cmd[1] & (0xFF);
+ x += dx;
+ y += dy;
+ break;
+
+ default:
+ int length = cmd[1] & (0xFF);
+ int copylength = length;
+
+ length += (length & 1);
+
+ byte[] run = new byte[length];
+
+ try
+ {
+ buf.get(run);
+ }
+ catch (BufferUnderflowException e)
+ {
+ throw new IOException("Error reading compressed data.");
+ }
+
+ System.arraycopy(run, 0, data, (x + w * (h - y - 1)),
+ copylength);
+ x += copylength;
+ break;
+ }
+ }
+ else
+ {
+ int length = cmd[0] & (0xFF);
+ for (int i = 0; i < length; i++)
+ data[(h - y - 1) * w + x++] = cmd[1];
+ }
+ }
+ return data;
+ }
+ catch (ArrayIndexOutOfBoundsException e)
+ {
+ throw new BMPException("Invalid RLE data.");
+ }
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/DCT.java b/gnu/javax/imageio/jpeg/DCT.java
new file mode 100644
index 000000000..2be4f5a4c
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/DCT.java
@@ -0,0 +1,348 @@
+/* DCT.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+// TODO: Clear copyright of this file.
+/**
+ * Discrete Cosine Transformations.
+ */
+public class DCT
+{
+
+ /**
+ * Cosine matrix
+ */
+ public double c[][] = new double[8][8];
+
+ /**
+ * Transformed cosine matrix
+ */
+ public double cT[][] = new double[8][8];
+
+ public DCT()
+ {
+ initMatrix();
+ }
+
+ /**
+ * Figure A.3.3 IDCT, Cu Cv on A-5 of the ISO DIS 10918-1. Requirements and
+ * Guidelines.
+ *
+ * @param u
+ * @return
+ */
+ public static double C(int u)
+ {
+ return ((u == 0) ? (double) 1 / (double) Math.sqrt((double) 2)
+ : (double) 1);
+ }
+
+ /**
+ * Initialize matrix values for the fast_idct function
+ */
+ private void initMatrix()
+ {
+ for (int j = 0; j < 8; j++)
+ {
+ double nn = (double) (8);
+ c[0][j] = 1.0 / Math.sqrt(nn);
+ cT[j][0] = c[0][j];
+ }
+ for (int i = 1; i < 8; i++)
+ {
+ for (int j = 0; j < 8; j++)
+ {
+ double jj = (double) j;
+ double ii = (double) i;
+ c[i][j] =
+ Math.sqrt(2.0 / 8.0)
+ * Math.cos(((2.0 * jj + 1.0) * ii * Math.PI) / (2.0 * 8.0));
+ cT[j][i] = c[i][j];
+ }
+ }
+ }
+
+ /**
+ * slow_idct - Figure A.3.3 IDCT (informative) on A-5 of the ISO DIS
+ * 10918-1. Requirements and Guidelines. This is a slow IDCT, there are
+ * better algorithms to use, it's fairly expensive with processor speed.
+ *
+ * @param matrix
+ * @return
+ */
+ public static double[][] slow_idct(double[][] matrix)
+ {
+ double[][] output = new double[matrix.length][matrix.length];
+ for (int y = 0; y < 8; y++)
+ {
+ for (int x = 0; x < 8; x++)
+ {
+ double val = 0;
+ for (double v = 0; v < 8; v++)
+ {
+ double innerloop = 0;
+ for (double u = 0; u < 8; u++)
+ innerloop += (DCT.C((int) u) / (double) 2)
+ * matrix[(int) v][(int) u]
+ * Math.cos((2 * x + 1) * u * Math.PI / (double) 16)
+ * Math.cos((2 * y + 1) * v * Math.PI / (double) 16);
+ val += (DCT.C((int) v) / (double) 2) * innerloop;
+ }
+ output[y][x] = (val + 128);
+ }
+ }
+ return (output);
+ }
+
+ public static float[][] slow_fdct(float[][] value)
+ {
+ float[][] buffer = new float[8][8];
+
+ for (int u = 0; u < 8; u++)
+ {
+ for (int v = 0; v < 8; v++)
+ {
+ buffer[u][v] =
+ (float) (1 / 4) * (float) C((int) u) * (float) C((int) v);
+ float innerval = 0;
+ for (int x = 0; x < 8; x++)
+ {
+ for (int y = 0; y < 8; y++)
+ {
+ innerval += value[y][x]
+ * Math.cos(((2 * x + 1) * u * Math.PI) / 16)
+ * Math.cos(((2 * y + 1) * v * Math.PI) / 16);
+ }
+ }
+ buffer[u][v] *= innerval;
+ }
+ }
+ return (buffer);
+ }
+
+ public float[][] fast_fdct(float[][] input)
+ {
+ float output[][] = new float[8][8];
+ double temp[][] = new double[8][8];
+ double temp1;
+ int i;
+ int j;
+ int k;
+
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ temp[i][j] = 0.0;
+ for (k = 0; k < 8; k++)
+ {
+ temp[i][j] += (((int) (input[i][k]) - 128) * cT[k][j]);
+ }
+ }
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ temp1 = 0.0;
+
+ for (k = 0; k < 8; k++)
+ {
+ temp1 += (c[i][k] * temp[k][j]);
+ }
+
+ output[i][j] = (int) Math.round(temp1) * 8;
+ }
+ }
+
+ return output;
+ }
+
+ /**
+ * fast_idct - Figure A.3.3 IDCT (informative) on A-5 of the ISO DIS
+ * 10918-1. Requires and Guidelines. This is a fast IDCT, it much more
+ * effecient and only inaccurate at about 1/1000th of a percent of values
+ * analyzed. Cannot be static because initMatrix must run before any
+ * fast_idct values can be computed.
+ *
+ * @param input
+ * @return
+ */
+ public double[][] fast_idct(double[][] input)
+ {
+ double output[][] = new double[8][8];
+ double temp[][] = new double[8][8];
+ double temp1;
+ int i, j, k;
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ temp[i][j] = 0.0;
+ for (k = 0; k < 8; k++)
+ {
+ temp[i][j] += input[i][k] * c[k][j];
+ }
+ }
+ }
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ temp1 = 0.0;
+ for (k = 0; k < 8; k++)
+ temp1 += cT[i][k] * temp[k][j];
+ temp1 += 128.0;
+ if (temp1 < 0)
+ output[i][j] = 0;
+ else if (temp1 > 255)
+ output[i][j] = 255;
+ else
+ output[i][j] = (int) Math.round(temp1);
+ }
+ }
+ return output;
+ }
+
+ public double[][] idj_fast_fdct(float input[][])
+ {
+ double output[][] = new double[8][8];
+ double tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+ double tmp10, tmp11, tmp12, tmp13;
+ double z1, z2, z3, z4, z5, z11, z13;
+ int i;
+ int j;
+
+ // Subtracts 128 from the input values
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ output[i][j] = ((double) input[i][j] - (double) 128.0);
+ // input[i][j] -= 128;
+
+ }
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ tmp0 = output[i][0] + output[i][7];
+ tmp7 = output[i][0] - output[i][7];
+ tmp1 = output[i][1] + output[i][6];
+ tmp6 = output[i][1] - output[i][6];
+ tmp2 = output[i][2] + output[i][5];
+ tmp5 = output[i][2] - output[i][5];
+ tmp3 = output[i][3] + output[i][4];
+ tmp4 = output[i][3] - output[i][4];
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ output[i][0] = tmp10 + tmp11;
+ output[i][4] = tmp10 - tmp11;
+
+ z1 = (tmp12 + tmp13) * (double) 0.707106781;
+ output[i][2] = tmp13 + z1;
+ output[i][6] = tmp13 - z1;
+
+ tmp10 = tmp4 + tmp5;
+ tmp11 = tmp5 + tmp6;
+ tmp12 = tmp6 + tmp7;
+
+ z5 = (tmp10 - tmp12) * (double) 0.382683433;
+ z2 = ((double) 0.541196100) * tmp10 + z5;
+ z4 = ((double) 1.306562965) * tmp12 + z5;
+ z3 = tmp11 * ((double) 0.707106781);
+
+ z11 = tmp7 + z3;
+ z13 = tmp7 - z3;
+
+ output[i][5] = z13 + z2;
+ output[i][3] = z13 - z2;
+ output[i][1] = z11 + z4;
+ output[i][7] = z11 - z4;
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ tmp0 = output[0][i] + output[7][i];
+ tmp7 = output[0][i] - output[7][i];
+ tmp1 = output[1][i] + output[6][i];
+ tmp6 = output[1][i] - output[6][i];
+ tmp2 = output[2][i] + output[5][i];
+ tmp5 = output[2][i] - output[5][i];
+ tmp3 = output[3][i] + output[4][i];
+ tmp4 = output[3][i] - output[4][i];
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ output[0][i] = tmp10 + tmp11;
+ output[4][i] = tmp10 - tmp11;
+
+ z1 = (tmp12 + tmp13) * (double) 0.707106781;
+ output[2][i] = tmp13 + z1;
+ output[6][i] = tmp13 - z1;
+
+ tmp10 = tmp4 + tmp5;
+ tmp11 = tmp5 + tmp6;
+ tmp12 = tmp6 + tmp7;
+
+ z5 = (tmp10 - tmp12) * (double) 0.382683433;
+ z2 = ((double) 0.541196100) * tmp10 + z5;
+ z4 = ((double) 1.306562965) * tmp12 + z5;
+ z3 = tmp11 * ((double) 0.707106781);
+
+ z11 = tmp7 + z3;
+ z13 = tmp7 - z3;
+
+ output[5][i] = z13 + z2;
+ output[3][i] = z13 - z2;
+ output[1][i] = z11 + z4;
+ output[7][i] = z11 - z4;
+ }
+
+ return output;
+ }
+
+}
diff --git a/gnu/javax/imageio/jpeg/HuffmanTable.java b/gnu/javax/imageio/jpeg/HuffmanTable.java
new file mode 100644
index 000000000..78f3c1c4f
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/HuffmanTable.java
@@ -0,0 +1,207 @@
+/* HuffmanTable.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+import java.io.IOException;
+
+import javax.imageio.plugins.jpeg.JPEGHuffmanTable;
+
+
+/**
+ * This Object construct a JPEGHuffmanTable which can be used to encode/decode
+ * a scan from a JPEG codec stream. The table must be initalized with either a
+ * BITS byte amount and a Huffman Table Value for decoding or a Huffman Size
+ * and Huffman Code table for encoding.
+ */
+public class HuffmanTable
+{
+ public final static int HUFFMAN_MAX_TABLES = 4;
+
+ private short[] huffcode = new short[256];
+ private short[] huffsize = new short[256];
+ private short[] EHUFCO;
+ private short[] EHUFSI;
+ private short[] valptr = new short[16];
+ private short[] mincode = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1,-1,-1};
+ private short[] maxcode = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1};
+ private short[] huffval;
+ private short[] bits;
+
+ static byte JPEG_DC_TABLE = 0;
+ static byte JPEG_AC_TABLE = 1;
+
+ private short lastk = 0;
+
+ public HuffmanTable(JPEGHuffmanTable table)
+ {
+ huffcode = table.getValues();
+ bits = table.getLengths();
+ }
+
+ /**
+ * Generated from FIGURE C.1 - Generation of table of Huffman code sizes on
+ * ISO DIS 10918-1. Requirements and Guidelines
+ */
+ private void generateSizeTable()
+ {
+ short index=0;
+ for(short i=0; i < bits.length ; i++)
+ {
+ for(short j=0; j < bits[i] ; j++)
+ {
+ huffsize[index] = (short) (i+1);
+ index++;
+ }
+ }
+ lastk = index;
+ }
+
+ /**
+ * Generated from FIGURE C.2 - Generation of table of Huffman codes on
+ * ISO DIS 10918-1. Requirements and Guidelines
+ */
+ private void generateCodeTable()
+ {
+ short k=0;
+ short si = huffsize[0];
+ short code = 0;
+ for(short i=0; i < huffsize.length ; i++)
+ {
+ while(huffsize[k]==si)
+ {
+ huffcode[k] = code;
+ code++;
+ k++;
+ }
+ code <<= 1;
+ si++;
+ }
+ }
+
+ /**
+ * Generated from FIGURE F.15 - Generation of decode table generation on
+ * ISO DIS 10918-1. Requirements and Guidelines
+ */
+ private void generateDecoderTables()
+ {
+ short bitcount = 0;
+ for(int i=0; i < 16 ; i++)
+ {
+ if(bits[i]!=0)
+ valptr[i] = bitcount;
+ for(int j=0 ; j < bits[i] ; j++)
+ {
+ if(huffcode[j+bitcount] < mincode[i] || mincode[i] == -1)
+ mincode[i] = huffcode[j+bitcount];
+
+ if(huffcode[j+bitcount] > maxcode[i])
+ maxcode[i] = huffcode[j+bitcount];
+ }
+ if(mincode[i]!=-1)
+ valptr[i] = (short) (valptr[i] - mincode[i]);
+ bitcount += bits[i];
+ }
+ }
+
+ /**
+ * Generated from FIGURE C.3 - Generation of Order Codes and tables EHUFCO
+ * and EHUFSI from the ISO DIS 10918-1. Requirements and Guidelines
+ */
+ public void orderCodes(boolean isDC)
+ {
+ EHUFCO = new short[isDC ? 15 : 255];
+ EHUFSI = new short[isDC ? 15 : 255];
+
+ for (int p=0; p < lastk ; p++)
+ {
+ int i = huffval[p];
+ if(i < 0 || i > EHUFCO.length || EHUFSI[i]!=0)
+ System.err.println("Error, bad huffman table.");
+ EHUFCO[i] = huffcode[p];
+ EHUFSI[i] = huffsize[p];
+ }
+ }
+
+ /**
+ * Generated from FIGURE F.12 - Extending the sign bit of a decoded value in on
+ * ISO DIS 10918-1. Requirements and Guidelines<p>
+ *
+ * @param diff TODO
+ * @param t TODO
+ * @return TODO
+ */
+ public static int extend(int diff, int t)
+ {
+ int Vt = (int)Math.pow(2,(t-1));
+ if(diff<Vt)
+ {
+ Vt=(-1 << t)+1;
+ diff=diff+Vt;
+ }
+ return diff;
+ }
+
+ /**
+ * Generated from FIGURE F.16 - Procedure for DECODE on
+ * ISO DIS 10918-1. Requirements and Guidelines<p>
+ *
+ * This function takes in a dynamic amount of bits and using the Huffman
+ * table returns information on how many bits must be read in to a byte in
+ * order to reconstruct said byte.
+ *
+ * @param JPEGStream the bits of the data stream.
+ */
+ public int decode(JPEGImageInputStream JPEGStream)
+ throws IOException, JPEGException
+ {
+ int i=0;
+ short code = (short) JPEGStream.readBits(1);
+ while(code > maxcode[i])
+ {
+ i++;
+ code <<= 1;
+ code |= JPEGStream.readBits(1);
+ }
+ int val = huffval[code+(valptr[i])];
+ if(val < 0)
+ val = 256 + val;
+ return val;
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGComponent.java b/gnu/javax/imageio/jpeg/JPEGComponent.java
new file mode 100644
index 000000000..d5799fd41
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGComponent.java
@@ -0,0 +1,351 @@
+/* JPEGComponent.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+import java.util.ArrayList;
+import java.io.IOException;
+import java.awt.image.WritableRaster;
+
+import javax.imageio.plugins.jpeg.JPEGHuffmanTable;
+
+/**
+ * This class holds the methods to decode and write a component information to
+ * a raster.
+ */
+public class JPEGComponent
+{
+ public byte factorH, factorV, component_id, quant_id;
+ public int width = 0, height = 0, maxV = 0, maxH = 0;
+ public HuffmanTable ACTable;
+ public HuffmanTable DCTable;
+ public int[] quantizationTable;
+ public double previousDC = 0;
+ ArrayList data = new ArrayList();
+
+ /**
+ * Initializes the component
+ *
+ * @param id
+ * @param factorHorizontal
+ * @param factorVertical
+ * @param quantizationID
+ */
+ public JPEGComponent(byte id, byte factorHorizontal, byte factorVertical,
+ byte quantizationID)
+ {
+ component_id = id;
+ factorH = factorHorizontal;
+ factorV = factorVertical;
+ quant_id = quantizationID;
+ }
+
+ /**
+ * If a restart marker is found with too little of an MCU count (i.e. our
+ * Restart Interval is 63 and we have 61 we copy the last MCU until it's
+ * full)
+ *
+ * @param index
+ * @param length
+ */
+ public void padMCU(int index, int length)
+ {
+ double[] src = (double[]) data.get(index - 1);
+ for (int i = 0; i < length; i++)
+ data.add(index, src);
+ }
+
+ /**
+ * Reset the interval by setting the previous DC value
+ */
+ public void resetInterval()
+ {
+ previousDC = 0;
+ }
+
+ /**
+ * Run the Quantization backward method on all of the block data.
+ */
+ public void quantitizeData()
+ {
+ for (int i = 0; i < data.size(); i++)
+ {
+ double[] mydata = (double[]) data.get(i);
+ for (int j = 0; j < mydata.length; j++)
+ mydata[j] *= quantizationTable[j];
+ }
+ }
+
+ public void setDCTable(JPEGHuffmanTable table)
+ {
+ DCTable = new HuffmanTable(table);
+ }
+
+ public void setACTable(JPEGHuffmanTable table)
+ {
+ ACTable = new HuffmanTable(table);
+ }
+
+ /**
+ * Run the Inverse DCT method on all of the block data
+ */
+ public void idctData(DCT myDCT)
+ {
+ for (int i = 0; i < data.size(); i++)
+ data.add(i,myDCT.fast_idct(ZigZag.decode8x8_map((double[]) data.remove(i))));
+ }
+
+ /**
+ * This scales up the component size based on the factor size. This
+ * calculates everyting up automatically so it's simply ran at the end of
+ * the frame to normalize the size of all of the components.
+ */
+ public void scaleByFactors()
+ {
+ int factorUpVertical = maxV / factorV;
+ int factorUpHorizontal = maxH / factorH;
+
+ if (factorUpVertical > 1)
+ {
+ for (int i = 0; i < data.size(); i++)
+ {
+ double[][] src = (double[][]) data.remove(i);
+ double[][] dest =
+ new double[src.length * factorUpVertical][src[0].length];
+ for (int j = 0; j < src.length; j++)
+ {
+ for (int u = 0; u < factorUpVertical; u++)
+ {
+ dest[j * factorUpVertical + u] = src[j];
+ }
+ }
+ data.add(i, dest);
+ }
+ }
+
+ if (factorUpHorizontal > 1)
+ {
+ for (int i = 0; i < data.size(); i++)
+ {
+ double[][] src = (double[][]) data.remove(i);
+ double[][] dest =
+ new double[src.length][src[0].length * factorUpHorizontal];
+ for (int j = 0; j < src.length; j++)
+ {
+ for (int u = 0; u < src[0].length; u++)
+ {
+ for (int v = 0; v < factorUpHorizontal; v++)
+ dest[j][u * factorUpHorizontal + v] = src[j][u];
+ }
+ }
+ data.add(i, dest);
+ }
+ }
+ }
+
+ /**
+ * This write the block of data to the raster throwing out anything that
+ * spills over the raster width or height.
+ *
+ * @param raster
+ * @param data
+ * @param compIndex
+ * @param x
+ * @param y
+ */
+ public void writeBlock(WritableRaster raster, double[][] data,
+ int compIndex, int x, int y)
+ {
+ for (int yIndex = 0; yIndex < data.length; yIndex++)
+ {
+ for (int xIndex = 0; xIndex < data[yIndex].length; xIndex++)
+ {
+ // The if statement is needed because blocks can spill over the
+ // frame width because they are padded to make sure we keep the
+ // height of the block the same as the width of the block
+ if (x + xIndex < raster.getWidth()
+ && y + yIndex < raster.getHeight())
+ raster.setSample(x + xIndex, y + yIndex, compIndex,
+ data[yIndex][xIndex]);
+ }
+ }
+ }
+
+ /**
+ * This writes data to a raster block, so really it's reading not writing
+ * but it writes the data to the raster block by factor size in a zig zag
+ * fashion. This has the helper function writeBlock which does the actual
+ * writing.
+ *
+ * @param raster
+ * @param componentIndex
+ */
+ public void writeData(WritableRaster raster, int componentIndex)
+ {
+ int x = 0, y = 0, lastblockheight = 0, incrementblock = 0;
+
+ // Keep looping through all of the blocks until there are no more.
+ while(data.size() > 0)
+ {
+ int blockwidth = 0;
+ int blockheight = 0;
+
+ if (x >= raster.getWidth())
+ {
+ x = 0;
+ y += incrementblock;
+ }
+
+ // Loop through the horizontal component blocks of the MCU first
+ // then for each horizontal line write out all of the vertical
+ // components
+ for (int factorVIndex = 0; factorVIndex < factorV; factorVIndex++)
+ {
+ blockwidth = 0;
+
+ for (int factorHIndex = 0; factorHIndex < factorH; factorHIndex++)
+ {
+ // Captures the width of this block so we can increment the
+ // X coordinate
+ double[][] blockdata = (double[][]) data.remove(0);
+
+ // Writes the data at the specific X and Y coordinate of
+ // this component
+ writeBlock(raster, blockdata, componentIndex, x, y);
+ blockwidth += blockdata[0].length;
+ x += blockdata[0].length;
+ blockheight = blockdata.length;
+ }
+ y += blockheight;
+ x -= blockwidth;
+ lastblockheight += blockheight;
+ }
+ y -= lastblockheight;
+ incrementblock = lastblockheight;
+ lastblockheight = 0;
+ x += blockwidth;
+ }
+ }
+
+ /**
+ * Set the quantization table for this component.
+ *
+ * @param quanttable
+ */
+ public void setQuantizationTable(int[] quanttable)
+ {
+ quantizationTable = quanttable;
+ }
+
+ /**
+ * Read in a partial MCU for this component
+ *
+ * @param stream TODO
+ * @throws JPEGException TODO
+ * @throws IOException TODO
+ */
+ public void readComponentMCU(JPEGImageInputStream stream)
+ throws JPEGException, IOException
+ {
+ for (int i = 0; i < factorH * factorV; i++)
+ {
+ double dc = decode_dc_coefficient(stream);
+ double[] datablock = decode_ac_coefficients(stream);
+ datablock[0] = dc;
+ data.add(datablock);
+ }
+ }
+
+ /**
+ * Generated from text on F-22, F.2.2.1 - Huffman decoding of DC
+ * coefficients on ISO DIS 10918-1. Requirements and Guidelines.
+ *
+ * @param JPEGStream TODO
+ *
+ * @return TODO
+ * @throws JPEGException TODO
+ * @throws IOException TODO
+ */
+ public double decode_dc_coefficient(JPEGImageInputStream JPEGStream)
+ throws JPEGException, IOException
+ {
+ int t = DCTable.decode(JPEGStream);
+ double diff = JPEGStream.readBits(t);
+ diff = HuffmanTable.extend((int) diff, t);
+ diff = (previousDC + diff);
+ previousDC = diff;
+ return diff;
+ }
+
+ /**
+ * Generated from text on F-23, F.13 - Huffman decoded of AC coefficients
+ * on ISO DIS 10918-1. Requirements and Guidelines.
+ *
+ * @param JPEGStream TODO
+ * @return TODO
+ *
+ * @throws JPEGException TODO
+ * @throws IOException TODO
+ */
+ public double[] decode_ac_coefficients(JPEGImageInputStream JPEGStream)
+ throws JPEGException, IOException
+ {
+ double[] zz = new double[64];
+
+ for (int k = 1; k < 64; k++)
+ {
+ int s = ACTable.decode(JPEGStream);
+ int r = s >> 4;
+ s &= 15;
+
+ if (s != 0)
+ {
+ k += r;
+ r = (int) JPEGStream.readBits(s);
+ s = (int) HuffmanTable.extend(r, s);
+ zz[k] = s;
+ }
+ else
+ {
+ if (r != 15)
+ return (zz);
+ k += 15;
+ }
+ }
+ return zz;
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGDecoder.java b/gnu/javax/imageio/jpeg/JPEGDecoder.java
new file mode 100644
index 000000000..3610ebe87
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGDecoder.java
@@ -0,0 +1,630 @@
+/* JPEGDecoder.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+import java.io.IOException;
+import java.nio.ByteOrder;
+
+import javax.imageio.*;
+import javax.imageio.plugins.jpeg.JPEGHuffmanTable;
+import javax.imageio.plugins.jpeg.JPEGQTable;
+import javax.imageio.spi.*;
+import javax.imageio.metadata.*;
+import javax.imageio.stream.ImageInputStream;
+
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.awt.Point;
+import java.awt.Transparency;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
+
+public class JPEGDecoder
+{
+ byte majorVersion;
+ byte minorVersion;
+ byte units;
+ short Xdensity;
+ short Ydensity;
+ byte Xthumbnail;
+ byte Ythumbnail;
+ byte[] thumbnail;
+ BufferedImage image;
+ int width;
+ int height;
+
+ byte marker;
+
+ /**
+ * This decoder expects JFIF 1.02 encoding.
+ */
+ public static final byte MAJOR_VERSION = (byte) 1;
+ public static final byte MINOR_VERSION = (byte) 2;
+
+ /**
+ * The length of the JFIF field not including thumbnail data.
+ */
+ public static final short JFIF_FIXED_LENGTH = 16;
+
+ /**
+ * The length of the JFIF extension field not including extension
+ * data.
+ */
+ public static final short JFXX_FIXED_LENGTH = 8;
+
+ private JPEGImageInputStream jpegStream;
+
+ ArrayList jpegFrames = new ArrayList();
+
+ JPEGHuffmanTable[] dcTables = new JPEGHuffmanTable[4];
+ JPEGHuffmanTable[] acTables = new JPEGHuffmanTable[4];
+ JPEGQTable[] qTables = new JPEGQTable[4];
+
+ public int getHeight()
+ {
+ return height;
+ }
+
+ public int getWidth()
+ {
+ return width;
+ }
+ public JPEGDecoder(ImageInputStream in)
+ throws IOException, JPEGException
+ {
+ jpegStream = new JPEGImageInputStream(in);
+ jpegStream.setByteOrder(ByteOrder.LITTLE_ENDIAN);
+
+ if (jpegStream.findNextMarker() != JPEGMarker.SOI)
+ throw new JPEGException("Failed to find SOI marker.");
+
+ if (jpegStream.findNextMarker() != JPEGMarker.APP0)
+ throw new JPEGException("Failed to find APP0 marker.");
+
+ int length = jpegStream.readShort();
+ if (!(length >= JFIF_FIXED_LENGTH))
+ throw new JPEGException("Failed to find JFIF field.");
+
+ byte[] identifier = new byte[5];
+ jpegStream.read(identifier);
+ if (identifier[0] != JPEGMarker.JFIF_J
+ || identifier[1] != JPEGMarker.JFIF_F
+ || identifier[2] != JPEGMarker.JFIF_I
+ || identifier[3] != JPEGMarker.JFIF_F
+ || identifier[4] != JPEGMarker.X00)
+ throw new JPEGException("Failed to read JFIF identifier.");
+
+ majorVersion = jpegStream.readByte();
+ minorVersion = jpegStream.readByte();
+ if (majorVersion != MAJOR_VERSION
+ || (majorVersion == MAJOR_VERSION
+ && minorVersion < MINOR_VERSION))
+ throw new JPEGException("Unsupported JFIF version.");
+
+ units = jpegStream.readByte();
+ if (units > (byte) 2)
+ throw new JPEGException("Units field is out of range.");
+
+ Xdensity = jpegStream.readShort();
+ Ydensity = jpegStream.readShort();
+ Xthumbnail = jpegStream.readByte();
+ Ythumbnail = jpegStream.readByte();
+
+ // 3 * for RGB data
+ int thumbnailLength = 3 * Xthumbnail * Ythumbnail;
+ if (length > JFIF_FIXED_LENGTH
+ && thumbnailLength != length - JFIF_FIXED_LENGTH)
+ throw new JPEGException("Invalid length, Xthumbnail"
+ + " or Ythumbnail field.");
+
+ if (thumbnailLength > 0)
+ {
+ thumbnail = new byte[thumbnailLength];
+ if (jpegStream.read(thumbnail) != thumbnailLength)
+ throw new IOException("Failed to read thumbnail.");
+ }
+ }
+
+ public void decode()
+ throws IOException
+ {
+ System.out.println ("DECODE!!!");
+ // The frames in this jpeg are loaded into a list. There is
+ // usually just one frame except in heirarchial progression where
+ // there are multiple frames.
+ JPEGFrame frame = null;
+
+ // The restart interval defines how many MCU's we should have
+ // between the 8-modulo restart marker. The restart markers allow
+ // us to tell whether or not our decoding process is working
+ // correctly, also if there is corruption in the image we can
+ // recover with these restart intervals. (See RSTm DRI).
+ int resetInterval = 0;
+
+ // The JPEGDecoder constructor parses the JFIF field. At this
+ // point jpegStream points to the first byte after the JFIF field.
+
+ // Find the first marker after the JFIF field.
+ byte marker = jpegStream.findNextMarker();
+
+ // Check for a JFIF extension field directly following the JFIF
+ // header and advance the current marker to the next marker in the
+ // stream, if necessary.
+ decodeJFIFExtension();
+
+ // Loop through until there are no more markers to read in, at
+ // that point everything is loaded into the jpegFrames array and
+ // can be processed.
+ while (true)
+ {
+ switch (marker)
+ {
+ // APPn Application Reserved Information - Just throw this
+ // information away because we wont be using it.
+ case JPEGMarker.APP0:
+ case JPEGMarker.APP1:
+ case JPEGMarker.APP2:
+ case JPEGMarker.APP3:
+ case JPEGMarker.APP4:
+ case JPEGMarker.APP5:
+ case JPEGMarker.APP6:
+ case JPEGMarker.APP7:
+ case JPEGMarker.APP8:
+ case JPEGMarker.APP9:
+ case JPEGMarker.APP10:
+ case JPEGMarker.APP11:
+ case JPEGMarker.APP12:
+ case JPEGMarker.APP13:
+ case JPEGMarker.APP14:
+ case JPEGMarker.APP15:
+ jpegStream.skipBytes(jpegStream.readShort() - 2);
+ break;
+
+ case JPEGMarker.SOF0:
+ // SOFn Start of Frame Marker, Baseline DCT - This is the start
+ // of the frame header that defines certain variables that will
+ // be carried out through the rest of the encoding. Multiple
+ // frames are used in a heirarchiel system, however most JPEG's
+ // only contain a single frame.
+ jpegFrames.add(new JPEGFrame());
+ frame = (JPEGFrame) jpegFrames.get(jpegFrames.size() - 1);
+ // Skip the frame length.
+ jpegStream.readShort();
+ // Bits percision, either 8 or 12.
+ frame.setPrecision(jpegStream.readByte());
+ // Scan lines = to the height of the frame.
+ frame.setScanLines(jpegStream.readShort());
+ // Scan samples per line = to the width of the frame.
+ frame.setSamplesPerLine(jpegStream.readShort());
+ // Number of Color Components (or channels).
+ frame.setComponentCount(jpegStream.readByte());
+
+ // Set the color mode for this frame, so far only 2 color
+ // modes are supported.
+ if (frame.getComponentCount() == 1)
+ frame.setColorMode(JPEGFrame.JPEG_COLOR_GRAY);
+ else
+ frame.setColorMode(JPEGFrame.JPEG_COLOR_YCbCr);
+ // Add all of the necessary components to the frame.
+ for (int i = 0; i < frame.getComponentCount(); i++)
+ frame.addComponent(jpegStream.readByte(), jpegStream.readByte(),
+ jpegStream.readByte());
+ break;
+
+ case JPEGMarker.SOF2:
+ jpegFrames.add(new JPEGFrame());
+ frame = (JPEGFrame) jpegFrames.get(jpegFrames.size() - 1);
+ // Skip the frame length.
+ jpegStream.readShort();
+ // Bits percision, either 8 or 12.
+ frame.setPrecision(jpegStream.readByte());
+ // Scan lines = to the height of the frame.
+ frame.setScanLines(jpegStream.readShort());
+ // Scan samples per line = to the width of the frame.
+ frame.setSamplesPerLine(jpegStream.readShort());
+ // Number of Color Components (or channels).
+ frame.setComponentCount(jpegStream.readByte());
+
+ // Set the color mode for this frame, so far only 2 color
+ // modes are supported.
+ if (frame.getComponentCount() == 1)
+ frame.setColorMode(JPEGFrame.JPEG_COLOR_GRAY);
+ else
+ frame.setColorMode(JPEGFrame.JPEG_COLOR_YCbCr);
+
+ // Add all of the necessary components to the frame.
+ for (int i = 0; i < frame.getComponentCount(); i++)
+ frame.addComponent(jpegStream.readByte(), jpegStream.readByte(),
+ jpegStream.readByte());
+ break;
+
+ case JPEGMarker.DHT:
+ // DHT non-SOF Marker - Huffman Table is required for decoding
+ // the JPEG stream, when we receive a marker we load in first
+ // the table length (16 bits), the table class (4 bits), table
+ // identifier (4 bits), then we load in 16 bytes and each byte
+ // represents the count of bytes to load in for each of the 16
+ // bytes. We load this into an array to use later and move on 4
+ // huffman tables can only be used in an image.
+ int huffmanLength = (jpegStream.readShort() - 2);
+
+ // Keep looping until we are out of length.
+ int index = huffmanLength;
+
+ // Multiple tables may be defined within a DHT marker. This
+ // will keep reading until there are no tables left, most
+ // of the time there are just one tables.
+ while (index > 0)
+ {
+ // Read the identifier information and class
+ // information about the Huffman table, then read the
+ // 16 byte codelength in and read in the Huffman values
+ // and put it into table info.
+ byte huffmanInfo = jpegStream.readByte();
+ byte tableClass = (byte) (huffmanInfo >> 4);
+ byte huffmanIndex = (byte) (huffmanInfo & 0x0f);
+ short[] codeLength = new short[16];
+ jpegStream.readFully(codeLength, 0, codeLength.length);
+ int huffmanValueLen = 0;
+ for (int i = 0; i < 16; i++)
+ huffmanValueLen += codeLength[i];
+ index -= (huffmanValueLen + 17);
+ short[] huffmanVal = new short[huffmanValueLen];
+ for (int i = 0; i < huffmanVal.length; i++)
+ huffmanVal[i] = jpegStream.readByte();
+ // Assign DC Huffman Table.
+ if (tableClass == HuffmanTable.JPEG_DC_TABLE)
+ dcTables[(int) huffmanIndex] = new JPEGHuffmanTable(codeLength,
+ huffmanVal);
+ // Assign AC Huffman Table.
+ else if (tableClass == HuffmanTable.JPEG_AC_TABLE)
+ acTables[(int) huffmanIndex] = new JPEGHuffmanTable(codeLength,
+ huffmanVal);
+ }
+ break;
+ case JPEGMarker.DQT:
+ // DQT non-SOF Marker - This defines the quantization
+ // coeffecients, this allows us to figure out the quality of
+ // compression and unencode the data. The data is loaded and
+ // then stored in to an array.
+ short quantizationLength = (short) (jpegStream.readShort() - 2);
+ for (int j = 0; j < quantizationLength / 65; j++)
+ {
+ byte quantSpecs = jpegStream.readByte();
+ int[] quantData = new int[64];
+ if ((byte) (quantSpecs >> 4) == 0)
+ // Precision 8 bit.
+ {
+ for (int i = 0; i < 64; i++)
+ quantData[i] = jpegStream.readByte();
+
+ }
+ else if ((byte) (quantSpecs >> 4) == 1)
+ // Precision 16 bit.
+ {
+ for (int i = 0; i < 64; i++)
+ quantData[i] = jpegStream.readShort();
+ }
+ qTables[(int) (quantSpecs & 0x0f)] = new JPEGQTable (quantData);
+ }
+ break;
+ case JPEGMarker.SOS:
+ // SOS non-SOF Marker - Start Of Scan Marker, this is where the
+ // actual data is stored in a interlaced or non-interlaced with
+ // from 1-4 components of color data, if three components most
+ // likely a YCrCb model, this is a fairly complex process.
+
+ // Read in the scan length.
+ jpegStream.readShort();
+ // Number of components in the scan.
+ byte numberOfComponents = jpegStream.readByte();
+ byte[] componentSelector = new byte[numberOfComponents];
+ for (int i = 0; i < numberOfComponents; i++)
+ {
+ // Component ID, packed byte containing the Id for the
+ // AC table and DC table.
+ byte componentID = jpegStream.readByte();
+ byte tableInfo = jpegStream.readByte();
+ frame.setHuffmanTables(componentID,
+ acTables[(byte) (tableInfo >> 4)],
+ dcTables[(byte) (tableInfo & 0x0f)]);
+ componentSelector[i] = componentID;
+ }
+ byte startSpectralSelection = jpegStream.readByte();
+ byte endSpectralSelection = jpegStream.readByte();
+ byte successiveApproximation = jpegStream.readByte();
+
+ int mcuIndex = 0;
+ int mcuTotalIndex = 0;
+ // This loops through until a MarkerTagFound exception is
+ // found, if the marker tag is a RST (Restart Marker) it
+ // simply skips it and moves on this system does not handle
+ // corrupt data streams very well, it could be improved by
+ // handling misplaced restart markers.
+ while (true)
+ {
+ try
+ {
+ // Loop though capturing MCU, instruct each
+ // component to read in its necessary count, for
+ // scaling factors the components automatically
+ // read in how much they need
+ for (int compIndex = 0; compIndex < numberOfComponents; compIndex++)
+ {
+ JPEGComponent comp = (JPEGComponent) frame.components.getComponentByID(componentSelector[compIndex]);
+ comp.readComponentMCU(jpegStream);
+ }
+ mcuIndex++;
+ mcuTotalIndex++;
+ }
+ // We've found a marker, see if the marker is a restart
+ // marker or just the next marker in the stream. If
+ // it's the next marker in the stream break out of the
+ // while loop, if it's just a restart marker skip it
+ catch (JPEGMarkerFoundException bse)
+ {
+ // Handle JPEG Restart Markers, this is where the
+ // count of MCU's per interval is compared with
+ // the count actually obtained, if it's short then
+ // pad on some MCU's ONLY for components that are
+ // greater than one. Also restart the DC prediction
+ // to zero.
+ if (marker == JPEGMarker.RST0
+ || marker == JPEGMarker.RST1
+ || marker == JPEGMarker.RST2
+ || marker == JPEGMarker.RST3
+ || marker == JPEGMarker.RST4
+ || marker == JPEGMarker.RST5
+ || marker == JPEGMarker.RST6
+ || marker == JPEGMarker.RST7)
+ {
+ for (int compIndex = 0; compIndex < numberOfComponents; compIndex++)
+ {
+ JPEGComponent comp = (JPEGComponent) frame.components.getComponentByID(componentSelector[compIndex]);
+ if (compIndex > 1)
+ comp.padMCU(mcuTotalIndex, resetInterval - mcuIndex);
+ comp.resetInterval();
+ }
+ mcuTotalIndex += (resetInterval - mcuIndex);
+ mcuIndex = 0;
+ }
+ else
+ {
+ // We're at the end of our scan, exit out.
+ break;
+ }
+ }
+ }
+ break;
+ case JPEGMarker.DRI:
+ // DRI - This defines the restart interval, if we have a
+ // restart interval when we reach our restart modulo calculate
+ // whether the count of MCU's specified in the restart
+ // interval have been reached, if they havent then pad with
+ // whatever MCU was last used, this is supposed to be a form of
+ // error recovery but it turns out that some JPEG encoders
+ // purposely cause missing MCU's on repeating MCU's to compress
+ // data even more (even though it adds an extra layer of
+ // complexity.. But since when is JPEG easy?
+ jpegStream.skipBytes(2);
+ resetInterval = jpegStream.readShort();
+ break;
+ case JPEGMarker.COM:
+ // COM - This is a comment that was inserted into the JPEG, we
+ // simply skip over the comment because it's really of no
+ // importance, usually contains a verbal description of the
+ // application or author who created the JPEG.
+ jpegStream.skipBytes(jpegStream.readShort() - 2);
+ break;
+ case JPEGMarker.DNL:
+ // DNL - This sets the height of the image. This is the Define
+ // Number Lines for the image, I'm not sure exactly why we need
+ // this but, whatever we'll abide.
+ frame.setScanLines(jpegStream.readShort());
+ break;
+ case JPEGMarker.EOI:
+ // EOI - End of Image, this processes the frames and turns the
+ // frames into a buffered image.
+
+ if (jpegFrames.size() == 0)
+ {
+ return;
+ }
+ else if (jpegFrames.size() == 1)
+ {
+ // Only one frame, JPEG Non-Heirarchial Frame.
+
+ DCT myDCT = new DCT();
+ WritableRaster raster =
+ Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,
+ frame.width,
+ frame.height,
+ frame.getComponentCount(),
+ new Point(0, 0));
+
+ // Unencode the data.
+ for (int i = 0; i < frame.getComponentCount(); i++)
+ {
+ JPEGComponent comp =
+ (JPEGComponent) frame.components.get(i);
+ comp.setQuantizationTable(qTables[comp.quant_id].getTable());
+ comp.quantitizeData();
+ comp.idctData(myDCT);
+ }
+ // Scale the image and write the data to the raster.
+ for (int i = 0; i < frame.getComponentCount(); i++)
+ {
+ JPEGComponent comp = (JPEGComponent) frame.components.get(i);
+ comp.scaleByFactors();
+ comp.writeData(raster, i);
+ // Ensure garbage collection.
+ comp = null;
+ }
+ // Grayscale Color Image (1 Component).
+ if (frame.getComponentCount() == 1)
+ {
+ ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
+ ComponentColorModel ccm =
+ new ComponentColorModel(cs, false, false,
+ Transparency.OPAQUE,
+ DataBuffer.TYPE_BYTE);
+ image = new BufferedImage(ccm, raster, false,
+ new Hashtable());
+ }
+ // YCbCr Color Image (3 Components).
+ else if (frame.getComponentCount() == 3)
+ {
+ ComponentColorModel ccm =
+ new ComponentColorModel(new YCbCr_ColorSpace(), false,
+ false, Transparency.OPAQUE,
+ DataBuffer.TYPE_BYTE);
+ image = new BufferedImage(ccm, raster, false,
+ new Hashtable());
+ }
+ // Possibly CMYK or RGBA ?
+ else
+ {
+ throw new JPEGException("Unsupported Color Mode: 4 "
+ + "Component Color Mode found.");
+ }
+ height = frame.height;
+ width = frame.width;
+ }
+ else
+ {
+ //JPEG Heirarchial Frame (progressive or baseline).
+ throw new JPEGException("Unsupported Codec Type:"
+ + " Hierarchial JPEG");
+ }
+ break;
+ case JPEGMarker.SOF1:
+ // ERROR - If we encounter any of the following marker codes
+ // error out with a codec exception, progressive, heirarchial,
+ // differential, arithmetic, lossless JPEG's are not supported.
+ // This is where enhancements can be made for future versions.
+ // Thankfully 99% of all JPEG's are baseline DCT.
+ throw new JPEGException("Unsupported Codec Type: Extended "
+ + "Sequential DCT JPEG's Not-Supported");
+ //case JPEGMarker.SOF2:
+ // throw new JPEGException("Unsupported Codec Type: Progressive DCT JPEG's Not-Supported");
+ case JPEGMarker.SOF3:
+ throw new JPEGException("Unsupported Codec Type:"
+ + " Lossless (sequential)");
+ case JPEGMarker.SOF5:
+ throw new JPEGException("Unsupported Codec Type:"
+ + " Differential sequential DCT");
+ case JPEGMarker.SOF6:
+ throw new JPEGException("Unsupported Codec Type:"
+ + " Differential progressive DCT");
+ case JPEGMarker.SOF7:
+ throw new JPEGException("Unsupported Codec Type:"
+ + " Differential lossless");
+ case JPEGMarker.SOF9:
+ case JPEGMarker.SOF10:
+ case JPEGMarker.SOF11:
+ case JPEGMarker.SOF13:
+ case JPEGMarker.SOF14:
+ case JPEGMarker.SOF15:
+ throw new JPEGException("Unsupported Codec Type:"
+ + " Arithmetic Coding Frame");
+ default:
+ // Unknown marker found, ignore it.
+ }
+ marker = jpegStream.findNextMarker();
+ }
+ }
+
+ // If the current marker is APP0, tries to decode a JFIF extension
+ // and advances the current marker to the next marker in the stream.
+ private void decodeJFIFExtension() throws IOException
+ {
+ if (marker == JPEGMarker.APP0)
+ {
+ int length = jpegStream.readShort();
+
+ if (length >= JFXX_FIXED_LENGTH)
+ {
+ byte[] identifier = new byte[5];
+ jpegStream.read(identifier);
+ if (identifier[0] != JPEGMarker.JFIF_J
+ || identifier[1] != JPEGMarker.JFIF_F
+ || identifier[2] != JPEGMarker.JFIF_X
+ || identifier[3] != JPEGMarker.JFIF_X
+ || identifier[4] != JPEGMarker.X00)
+ // Not a JFXX field. Ignore it and continue.
+ jpegStream.skipBytes(length - 7);
+ else
+ {
+ byte extension_code = jpegStream.readByte();
+
+ switch (extension_code)
+ {
+ case JPEGMarker.JFXX_JPEG:
+ // FIXME: add support for JFIF Extension:
+ // Thumbnail coded using JPEG.
+ jpegStream.skipBytes(length - 8);
+ case JPEGMarker.JFXX_ONE_BPP:
+ // FIXME: add support for JFIF Extension:
+ // Thumbnail stored using 1 byte/pixel.
+ jpegStream.skipBytes(length - 8);
+ case JPEGMarker.JFXX_THREE_BPP:
+ // FIXME: add support for JFIF Extension:
+ // Thumbnail stored using 3 bytes/pixel.
+ jpegStream.skipBytes(length - 8);
+ }
+ }
+ }
+ else
+ {
+ // Unknown APP0 marker. Ignore it and continue.
+ jpegStream.skipBytes(length - 2);
+ }
+ marker = jpegStream.findNextMarker();
+ }
+ }
+
+ public BufferedImage getImage()
+ {
+ return image;
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGException.java b/gnu/javax/imageio/jpeg/JPEGException.java
new file mode 100644
index 000000000..b684069cc
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGException.java
@@ -0,0 +1,55 @@
+/* JPEGException.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+// FIXME: change to IIOException
+import java.io.IOException;
+import javax.imageio.*;
+import javax.imageio.spi.*;
+import javax.imageio.metadata.*;
+import javax.imageio.stream.ImageInputStream;
+import java.util.Iterator;
+import java.awt.image.BufferedImage;
+
+public class JPEGException extends IIOException
+{
+ public JPEGException(String message)
+ {
+ super(message);
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGFrame.java b/gnu/javax/imageio/jpeg/JPEGFrame.java
new file mode 100644
index 000000000..9b958f98f
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGFrame.java
@@ -0,0 +1,108 @@
+/* JPEGFrame.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+import javax.imageio.plugins.jpeg.JPEGHuffmanTable;
+
+public class JPEGFrame
+{
+ public final static byte JPEG_COLOR_GRAY = 1;
+ public final static byte JPEG_COLOR_RGB = 2;
+ public final static byte JPEG_COLOR_YCbCr = 3;
+ public final static byte JPEG_COLOR_CMYK = 4;
+
+ public byte precision = 8;
+ public byte colorMode = JPEGFrame.JPEG_COLOR_YCbCr;
+ public byte componentCount = 0;
+
+ public short width=0, height=0;
+
+ public JPEGScan components;
+
+ public JPEGFrame()
+ {
+ components = new JPEGScan();
+ }
+
+ public void addComponent(byte componentID, byte sampleFactors,
+ byte quantizationTableID)
+ {
+ byte sampleHorizontalFactor = (byte)(sampleFactors >> 4);
+ byte sampleVerticalFactor = (byte)(sampleFactors & 0x0f);
+ components.addComponent(componentID, sampleHorizontalFactor,
+ sampleVerticalFactor, quantizationTableID);
+ }
+
+ public void setPrecision(byte data)
+ {
+ precision = data;
+ }
+
+ public void setScanLines(short data)
+ {
+ height = data;
+ }
+
+ public void setSamplesPerLine(short data)
+ {
+ width = data;
+ }
+
+ public void setColorMode(byte data)
+ {
+ colorMode = data;
+ }
+
+ public void setComponentCount(byte data)
+ {
+ componentCount = data;
+ }
+
+ public byte getComponentCount()
+ {
+ return componentCount;
+ }
+
+ public void setHuffmanTables(byte componentID, JPEGHuffmanTable ACTable,
+ JPEGHuffmanTable DCTable)
+ {
+ JPEGComponent comp = (JPEGComponent)components.getComponentByID(componentID);
+ comp.setACTable(ACTable);
+ comp.setDCTable(DCTable);
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGImageInputStream.java b/gnu/javax/imageio/jpeg/JPEGImageInputStream.java
new file mode 100644
index 000000000..4ae909baf
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGImageInputStream.java
@@ -0,0 +1,195 @@
+/* JPEGImageInputStream.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+import java.io.EOFException;
+import java.io.IOException;
+import javax.imageio.*;
+import javax.imageio.spi.*;
+import javax.imageio.metadata.*;
+import javax.imageio.stream.ImageInputStream;
+import javax.imageio.stream.ImageInputStreamImpl;
+
+import java.util.Iterator;
+import java.awt.image.BufferedImage;
+
+public class JPEGImageInputStream
+ extends ImageInputStreamImpl
+{
+ private ImageInputStream in;
+
+ byte marker;
+
+ public JPEGImageInputStream(ImageInputStream in)
+ {
+ super();
+
+ this.in = in;
+ }
+
+ public int read()
+ throws IOException
+ {
+ setBitOffset(0);
+ return in.read();
+ }
+
+ public int read(byte[] data, int offset, int len)
+ throws IOException
+ {
+ setBitOffset(0);
+ return in.read(data, offset, len);
+ }
+
+ /**
+ * Pull a byte from the stream, this checks to see if the byte is 0xff
+ * and if the next byte isn't 0x00 (stuffed byte) it errors out. If it's
+ * 0x00 then it simply ignores the byte.
+ *
+ * @return the next byte in the buffer
+ *
+ * @throws IOException TODO
+ * @throws BitStreamException TODO
+ */
+ private byte pullByte() throws IOException, JPEGMarkerFoundException
+ {
+ byte mybyte = readByte();
+ // FIXME: handle multiple 0xff in a row
+ if(mybyte==(byte)(0xff))
+ {
+ byte secondbyte = readByte();
+ if(secondbyte != (byte)(0x00))
+ {
+ marker = secondbyte;
+ throw new JPEGMarkerFoundException();
+ }
+ }
+ return mybyte;
+ }
+
+ /**
+ * This returns the marker that was last encountered. This should only be
+ * used if removeBit() throws a MarkerTagFound exception.
+ *
+ * @return marker as byte
+ */
+ public byte getMarker()
+ {
+ return marker;
+ }
+
+ /**
+ * Removes a bit from the buffer. (Removes from the top of a queue). This
+ * also checks for markers and throws MarkerTagFound exception if it does.
+ * If MarkerTagFound is thrown you can use getMarker() method to get the
+ * marker that caused the throw.
+ *
+ * @param l specifies how many bits you want to remove and add to the
+ * integer
+ * @return the amount of bits specified by l as an integer
+ *
+ * @throws IOException TODO
+ * @throws JPEGMarkerFoundException
+ * @throws BitStreamException TODO
+ */
+ public int readBit()
+ throws IOException, JPEGMarkerFoundException
+{
+ checkClosed();
+
+ // Calc new bit offset here, readByte resets it.
+ int newOffset = (bitOffset + 1) & 0x7;
+
+ byte data = pullByte();
+
+ if (bitOffset != 0)
+ {
+ seek(getStreamPosition() - 1);
+ data = (byte) (data >> (8 - newOffset));
+ }
+
+ bitOffset = newOffset;
+ return data & 0x1;
+}
+
+
+ /**
+ * This method skips over the the data and finds the next position
+ * in the bit sequence with a X'FF' X'??' sequence. Multiple X'FF
+ * bytes in sequence are considered padding and interpreted as one
+ * X'FF byte.
+ *
+ * @return the next marker byte in the stream
+ * @throws IOException if the end of the stream is reached
+ * unexpectedly
+ */
+ public byte findNextMarker()
+ throws IOException
+ {
+ boolean marked0xff = false;
+ byte byteinfo = JPEGMarker.X00;
+
+ setBitOffset(0);
+ while (true)
+ {
+ byteinfo = readByte();
+ if (!marked0xff)
+ {
+ if (byteinfo == JPEGMarker.XFF)
+ marked0xff = true;
+ }
+ else
+ {
+ if (byteinfo == JPEGMarker.XFF)
+ // Ignore the value 0xff when it is immediately
+ // followed by another 0xff byte.
+ continue;
+ else if (byteinfo == JPEGMarker.X00)
+ // The sequence 0xff 0x00 is used to encode the
+ // actual value 0xff. So restart our search for a
+ // marker.
+ marked0xff = false;
+ else
+ // One or more 0xff values were follwed by a
+ // non-0x00, non-0xff value so return this as the
+ // marker byte.
+ return byteinfo;
+ }
+ }
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGImageReader.java b/gnu/javax/imageio/jpeg/JPEGImageReader.java
new file mode 100644
index 000000000..51bc0ce37
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGImageReader.java
@@ -0,0 +1,141 @@
+/* JPEGImageReader.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+import java.io.IOException;
+import javax.imageio.*;
+import javax.imageio.spi.*;
+import javax.imageio.metadata.*;
+import javax.imageio.stream.ImageInputStream;
+import java.util.Iterator;
+import java.awt.image.BufferedImage;
+
+public class JPEGImageReader extends ImageReader
+{
+ JPEGDecoder decoder;
+
+ protected JPEGImageReader(ImageReaderSpi originatingProvider)
+ {
+ super(originatingProvider);
+ System.out.println("JPEGIMAGEREADER!!!");
+ }
+
+ // Abstract ImageReader methods.
+ public int getHeight(int imageIndex)
+ throws IOException
+ {
+ checkIndex(imageIndex);
+ decodeStream();
+ return decoder.getHeight();
+ }
+
+ public IIOMetadata getImageMetadata(int imageIndex)
+ throws IOException
+ {
+ // FIXME: handle metadata
+ checkIndex(imageIndex);
+ return null;
+ }
+
+ public Iterator getImageTypes(int imageIndex)
+ throws IOException
+ {
+ return null;
+ }
+
+ public int getNumImages(boolean allowSearch)
+ throws IOException
+ {
+ return 1;
+ }
+
+ public IIOMetadata getStreamMetadata()
+ throws IOException
+ {
+ // FIXME: handle metadata
+ return null;
+ }
+
+ public int getWidth(int imageIndex)
+ throws IOException
+ {
+ checkIndex(imageIndex);
+ decodeStream();
+ return decoder.getWidth();
+ }
+
+ public BufferedImage read(int imageIndex, ImageReadParam param)
+ throws IOException
+ {
+ checkIndex(imageIndex);
+ decodeStream();
+ return decoder.getImage();
+ }
+
+ // private helper methods
+ private void checkIndex(int imageIndex)
+ throws IndexOutOfBoundsException
+ {
+ if (imageIndex != 0)
+ throw new IndexOutOfBoundsException();
+ }
+
+ private void checkStream() throws IOException
+ {
+ if (!(input instanceof ImageInputStream))
+ throw new IllegalStateException("Input not an ImageInputStream.");
+ if(input == null)
+ throw new IllegalStateException("No input stream.");
+ }
+
+ private void decodeStream()
+ throws IOException, IIOException
+ {
+ System.out.println("DECONDING 1");
+ if (decoder != null)
+ return;
+
+ System.out.println("DECONDING 2");
+ checkStream();
+
+ System.out.println("DECONDING 3");
+ decoder = new JPEGDecoder((ImageInputStream)input);
+ System.out.println("DECONDING 4");
+ decoder.decode();
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGImageReaderSpi.java b/gnu/javax/imageio/jpeg/JPEGImageReaderSpi.java
new file mode 100644
index 000000000..c1e9adf60
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGImageReaderSpi.java
@@ -0,0 +1,137 @@
+/* JPEGImageReaderSpi.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+import java.io.IOException;
+import java.util.Locale;
+import javax.imageio.ImageReader;
+import javax.imageio.spi.ImageReaderSpi;
+import javax.imageio.spi.IIORegistry;
+import javax.imageio.stream.ImageInputStream;
+
+public class JPEGImageReaderSpi extends ImageReaderSpi
+{
+ static final String vendorName = "GNU";
+ static final String version = "0.1";
+ static final String readerClassName =
+ "gnu.javax.imageio.jpeg.JPEGImageReader";
+ static final String[] names = { "JPEG" };
+ static final String[] suffixes = { ".jpeg", ".jpg", ".jpe" };
+ static final String[] MIMETypes = { "image/jpeg" };
+ static final String[] writerSpiNames =
+ { "gnu.javax.imageio.jpeg.JPEGImageWriterSpi" };
+
+ static final boolean supportsStandardStreamMetadataFormat = false;
+ static final String nativeStreamMetadataFormatName = null;
+ static final String nativeStreamMetadataFormatClassName = null;
+ static final String[] extraStreamMetadataFormatNames = null;
+ static final String[] extraStreamMetadataFormatClassNames = null;
+ static final boolean supportsStandardImageMetadataFormat = false;
+ static final String nativeImageMetadataFormatName = null;
+ static final String nativeImageMetadataFormatClassName = null;
+ static final String[] extraImageMetadataFormatNames = null;
+ static final String[] extraImageMetadataFormatClassNames = null;
+
+ private static JPEGImageReaderSpi readerSpi;
+
+ public JPEGImageReaderSpi()
+ {
+ super(vendorName, version,
+ names, suffixes, MIMETypes,
+ readerClassName,
+ STANDARD_INPUT_TYPE, // Accept ImageInputStreams
+ writerSpiNames,
+ supportsStandardStreamMetadataFormat,
+ nativeStreamMetadataFormatName,
+ nativeStreamMetadataFormatClassName,
+ extraStreamMetadataFormatNames,
+ extraStreamMetadataFormatClassNames,
+ supportsStandardImageMetadataFormat,
+ nativeImageMetadataFormatName,
+ nativeImageMetadataFormatClassName,
+ extraImageMetadataFormatNames,
+ extraImageMetadataFormatClassNames);
+ System.out.println ("JPEGImageReaderSPI!!!");
+ }
+
+ public String getDescription(Locale locale)
+ {
+ return "JPEG ISO 10918-1, JFIF V1.02";
+ }
+
+ public boolean canDecodeInput(Object input)
+ throws IOException
+ {
+ if (!(input instanceof ImageInputStream))
+ return false;
+
+ ImageInputStream in = (ImageInputStream) input;
+ boolean retval;
+
+ in.mark();
+ try
+ {
+ new JPEGDecoder(in);
+ retval = true;
+ }
+ catch(JPEGException e)
+ {
+ retval = false;
+ }
+ in.reset();
+
+ return retval;
+ }
+
+ public ImageReader createReaderInstance(Object extension)
+ {
+ return new JPEGImageReader(this);
+ }
+
+ public static void registerSpis(IIORegistry reg)
+ {
+ reg.registerServiceProvider(getReaderSpi(), ImageReaderSpi.class);
+ }
+
+ public static synchronized JPEGImageReaderSpi getReaderSpi()
+ {
+ if (readerSpi == null)
+ readerSpi = new JPEGImageReaderSpi();
+ return readerSpi;
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGMarker.java b/gnu/javax/imageio/jpeg/JPEGMarker.java
new file mode 100644
index 000000000..c80a0ca78
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGMarker.java
@@ -0,0 +1,205 @@
+/* JPEGMarker.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+public class JPEGMarker
+{
+ /**
+ * JFIF identifiers.
+ */
+ public final static byte JFIF_J = (byte) 0x4a;
+ public final static byte JFIF_F = (byte) 0x46;
+ public final static byte JFIF_I = (byte) 0x49;
+ public final static byte JFIF_X = (byte) 0x46;
+
+ /**
+ * JFIF extension codes.
+ */
+ public final static byte JFXX_JPEG = (byte) 0x10;
+ public final static byte JFXX_ONE_BPP = (byte) 0x11;
+ public final static byte JFXX_THREE_BPP = (byte) 0x13;
+
+ /**
+ * Marker prefix byte.
+ */
+ public final static byte XFF = (byte) 0xff;
+
+ /**
+ * Marker byte that represents a literal 0xff.
+ */
+ public final static byte X00 = (byte) 0x00;
+
+ /**
+ * Application Reserved Keyword.
+ */
+ public final static byte APP0 = (byte) 0xe0;
+
+ public final static byte APP1 = (byte) 0xe1;
+ public final static byte APP2 = (byte) 0xe2;
+ public final static byte APP3 = (byte) 0xe3;
+ public final static byte APP4 = (byte) 0xe4;
+ public final static byte APP5 = (byte) 0xe5;
+ public final static byte APP6 = (byte) 0xe6;
+ public final static byte APP7 = (byte) 0xe7;
+ public final static byte APP8 = (byte) 0xe8;
+ public final static byte APP9 = (byte) 0xe9;
+ public final static byte APP10 = (byte) 0xea;
+ public final static byte APP11 = (byte) 0xeb;
+ public final static byte APP12 = (byte) 0xec;
+ public final static byte APP13 = (byte) 0xed;
+ public final static byte APP14 = (byte) 0xee;
+ public final static byte APP15 = (byte) 0xef;
+
+ /**
+ * Modulo Restart Interval.
+ */
+ public final static byte RST0 = (byte) 0xd0;
+
+ public final static byte RST1 = (byte) 0xd1;
+ public final static byte RST2 = (byte) 0xd2;
+ public final static byte RST3 = (byte) 0xd3;
+ public final static byte RST4 = (byte) 0xd4;
+ public final static byte RST5 = (byte) 0xd5;
+ public final static byte RST6 = (byte) 0xd6;
+ public final static byte RST7 = (byte) 0xd7;
+
+ /**
+ * Nondifferential Huffman-coding frame (baseline dct).
+ */
+ public final static byte SOF0 = (byte) 0xc0;
+
+ /**
+ * Nondifferential Huffman-coding frame (extended dct).
+ */
+ public final static byte SOF1 = (byte) 0xc1;
+
+ /**
+ * Nondifferential Huffman-coding frame (progressive dct).
+ */
+ public final static byte SOF2 = (byte) 0xc2;
+
+ /**
+ * Nondifferential Huffman-coding frame Lossless (Sequential).
+ */
+ public final static byte SOF3 = (byte) 0xc3;
+
+ /**
+ * Differential Huffman-coding frame Sequential DCT.
+ */
+ public final static byte SOF5 = (byte) 0xc5;
+
+ /**
+ * Differential Huffman-coding frame Progressive DCT.
+ */
+ public final static byte SOF6 = (byte) 0xc6;
+
+ /**
+ * Differential Huffman-coding frame lossless.
+ */
+ public final static byte SOF7 = (byte) 0xc7;
+
+ /**
+ * Nondifferential Arithmetic-coding frame (extended dct).
+ */
+ public final static byte SOF9 = (byte) 0xc9;
+
+ /**
+ * Nondifferential Arithmetic-coding frame (progressive dct).
+ */
+ public final static byte SOF10 = (byte) 0xca;
+
+ /**
+ * Nondifferential Arithmetic-coding frame (lossless).
+ */
+ public final static byte SOF11 = (byte) 0xcb;
+
+ /**
+ * Differential Arithmetic-coding frame (sequential dct).
+ */
+ public final static byte SOF13 = (byte) 0xcd;
+
+ /**
+ * Differential Arithmetic-coding frame (progressive dct).
+ */
+ public final static byte SOF14 = (byte) 0xce;
+
+ /**
+ * Differential Arithmetic-coding frame (lossless).
+ */
+ public final static byte SOF15 = (byte) 0xcf;
+
+ /**
+ * Huffman Table.
+ */
+ public final static byte DHT = (byte) 0xc4;
+
+ /**
+ * Quantization Table.
+ */
+ public final static byte DQT = (byte) 0xdb;
+
+ /**
+ * Start of Scan.
+ */
+ public final static byte SOS = (byte) 0xda;
+
+ /**
+ * Defined Restart Interval.
+ */
+ public final static byte DRI = (byte) 0xdd;
+
+ /**
+ * Comment in JPEG.
+ */
+ public final static byte COM = (byte) 0xfe;
+
+ /**
+ * Start of Image.
+ */
+ public final static byte SOI = (byte) 0xd8;
+
+ /**
+ * End of Image.
+ */
+ public final static byte EOI = (byte) 0xd9;
+
+ /**
+ * Define Number of Lines.
+ */
+ public final static byte DNL = (byte) 0xdc;
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGMarkerFoundException.java b/gnu/javax/imageio/jpeg/JPEGMarkerFoundException.java
new file mode 100644
index 000000000..2e72d495b
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGMarkerFoundException.java
@@ -0,0 +1,50 @@
+/* JPEGMarkerFoundException.java -- FIXME: briefly describe file purpose
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.imageio.jpeg;
+
+import java.io.IOException;
+
+public class JPEGMarkerFoundException
+ extends IOException
+{
+ public JPEGMarkerFoundException()
+ {
+ super("");
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/JPEGScan.java b/gnu/javax/imageio/jpeg/JPEGScan.java
new file mode 100644
index 000000000..e07251021
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/JPEGScan.java
@@ -0,0 +1,151 @@
+/* JPEGScan.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+import java.util.ArrayList;
+
+public class JPEGScan
+{
+ private int maxHeight = 0, maxWidth = 0, maxV = 0, maxH = 0;
+ private int numOfComponents = 0, numOfComponentBlocks = 0;
+ private ArrayList components = new ArrayList();
+
+ public JPEGScan()
+ {
+ // Nothing to do here.
+ }
+
+ public JPEGScan(int h, int w)
+ {
+ maxHeight=h;
+ maxWidth=w;
+ }
+
+ private void recalculateDimensions()
+ {
+ JPEGComponent comp;
+
+ // Compute the maximum H, maximum V factors defined in Annex A of the ISO
+ // DIS 10918-1.
+ for(int i=0; i < components.size() ; i++)
+ {
+ comp = (JPEGComponent)components.get(i);
+ if(comp.factorH > maxH)
+ maxH=comp.factorH;
+ if(comp.factorV > maxV)
+ maxV=comp.factorV;
+ }
+
+ for(int i=0; i < components.size() ; i++)
+ {
+ comp = (JPEGComponent)components.get(i);
+ comp.maxH = maxH;
+ comp.maxV = maxV;
+ }
+
+ }
+
+ public void addComponent(byte id, byte factorHorizontal, byte factorVertical,
+ byte quantizationID)
+ {
+ JPEGComponent component = new JPEGComponent(id, factorHorizontal, factorVertical, quantizationID);
+ components.add((Object)component);
+ recalculateDimensions();
+ numOfComponents++;
+ numOfComponentBlocks += factorHorizontal*factorVertical;
+ }
+
+ public JPEGComponent getComponentByID(byte id)
+ {
+ JPEGComponent comp = (JPEGComponent)components.get(0);
+ for(int i=0; i < components.size() ; i++)
+ {
+ comp=(JPEGComponent)components.get(i);
+ if(comp.component_id==id)
+ break;
+ }
+ return(comp);
+ }
+
+ public JPEGComponent get(int id)
+ {
+ return((JPEGComponent)components.get(id));
+ }
+
+ public int getX(byte id)
+ {
+ JPEGComponent comp = getComponentByID(id);
+ return(comp.width);
+ }
+
+ public int getY(byte id)
+ {
+ JPEGComponent comp = getComponentByID(id);
+ return(comp.height);
+ }
+
+ public int getMaxV()
+ {
+ return(maxV);
+ }
+
+ public int getMaxH()
+ {
+ return(maxH);
+ }
+
+ public void setWidth(int w)
+ {
+ maxWidth=w;
+ }
+
+ public void setHeight(int h)
+ {
+ maxHeight=h;
+ }
+
+ public int size()
+ {
+ return(numOfComponents);
+ }
+
+ public int sizeComponentBlocks()
+ {
+ return(numOfComponentBlocks);
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/YCbCr_ColorSpace.java b/gnu/javax/imageio/jpeg/YCbCr_ColorSpace.java
new file mode 100644
index 000000000..9ac2ccaab
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/YCbCr_ColorSpace.java
@@ -0,0 +1,122 @@
+/* YCbCr_ColorSpace.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+import java.awt.color.ColorSpace;
+
+/**
+ * <p>Title: Symphony Image Object</p>
+ * <p>Description: Creates and manages image formats</p>
+ * <p>Copyright: Copyright (c) 2003</p>
+ * <p>Company: Symphony</p>
+ * @author not attributable
+ * @version 1.0
+ */
+
+public class YCbCr_ColorSpace extends ColorSpace {
+ public YCbCr_ColorSpace() {
+ super(ColorSpace.TYPE_YCbCr, 3);
+ }
+
+ public float[] fromCIEXYZ(float[] data) {
+ return(new float[data.length]);
+ }
+
+ public float[] toCIEXYZ(float[] data) {
+ return(new float[data.length]);
+ }
+
+ public float[] fromRGB(float[] data) {
+ return(new float[data.length]);
+ }
+
+ /* YCbCr to RGB range 0 to 1 */
+ public float[] toRGB(float[] data) {
+ float[] dest = new float[3];
+
+ data[0] *= 255;
+ data[1] *= 255;
+ data[2] *= 255;
+
+ dest[0] = (float)data[0] + (float)1.402*((float)data[2]-(float)128);
+ dest[1] = (float)data[0] - (float)0.34414*((float)data[1]-(float)128) - (float)0.71414*((float)data[2]-(float)128);
+ dest[2] = (float)data[0] + (float)1.772*((float)data[1]-(float)128);
+
+ dest[0] /= 255;
+ dest[1] /= 255;
+ dest[2] /= 255;
+
+ //dest[0] = ((float)1.164*((float)data[0]*(float)255 - (float)16) + (float)1.596*((float)data[2]*(float)255 - (float)128))/(float)255;
+ //dest[1] = ((float)1.164*((float)data[0]*(float)255 - (float)16) - (float)0.813*((float)data[2]*(float)255 - (float)128) - (float)0.392*(data[1]*255 - 128))/(float)255;
+ //dest[2] = ((float)1.164*((float)data[0]*(float)255 - (float)16) + (float)2.017*((float)data[1]*(float)255 - (float)128))/(float)255;
+
+ //System.err.println("toRGB values received: 0: "+data[0]+" 1: "+data[1]+" 2: "+data[2]+" sent: 0: "+dest[0]+" 1: "+dest[1]+" 2: "+dest[2]);
+ if(dest[0] < (float)0)
+ dest[0] = 0;
+ if(dest[1] < (float)0)
+ dest[1] = 0;
+ if(dest[2] < (float)0)
+ dest[2] = 0;
+
+ if(dest[0] > (float)1)
+ dest[0] = 1;
+ if(dest[1] > (float)1)
+ dest[1] = 1;
+ if(dest[2] > (float)1)
+ dest[2] = 1;
+
+
+ return(dest);
+ }
+
+ /* RGB to YCbCr range 0-255 */
+ public static float[] toYCbCr(float[] data) {
+ float[] dest = new float[3];
+ //dest[0] = (float)0.257*data[0] + (float)0.504*data[1] + (float)0.098*data[2] + 16;
+ //dest[1] = (float)-0.148*data[0] - (float)0.291*data[1] + (float)0.439*data[2] + 128;
+ //dest[2] = (float)0.439*data[0] - (float)0.368*data[1] - (float)0.071*data[2] + 128;
+
+ dest[0] = (float)((0.299 * (float)data[0] + 0.587 * (float)data[1] + 0.114 * (float)data[2]));
+ dest[1] = 128 + (float)((-0.16874 * (float)data[0] - 0.33126 * (float)data[1] + 0.5 * (float)data[2]));
+ dest[2] = 128 + (float)((0.5 * (float)data[0] - 0.41869 * (float)data[1] - 0.08131 * (float)data[2]));
+
+
+ return(dest);
+
+ }
+}
diff --git a/gnu/javax/imageio/jpeg/ZigZag.java b/gnu/javax/imageio/jpeg/ZigZag.java
new file mode 100644
index 000000000..dcee7989c
--- /dev/null
+++ b/gnu/javax/imageio/jpeg/ZigZag.java
@@ -0,0 +1,521 @@
+/* ZigZag.java --
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.javax.imageio.jpeg;
+
+// TODO: Clear copyright of this file.
+/**
+ * This class implements the Zig Zag Algorithm on any array with
+ * the same amount of rows and columns. It takes a matrix and in turn builds an
+ * encoded byte array (or double array) from it. The adverse is also true, this
+ * will take a byte or double array and build a matrix based on the zig zag
+ * algorithm.
+ * <p>This is used exclusively in the JPEG DCT encoding.</p>
+ */
+public class ZigZag
+{
+ public final static boolean ZIGZAG_FORWARD = true;
+ public final static boolean ZIGZAG_BACKWARD = false;
+ public final static int ZIGZAG_8X8_MAP[] =
+ {
+ 0, 1, 8, 16, 9, 2, 3, 10,
+ 17, 24, 32, 25, 18, 11, 4, 5,
+ 12, 19, 26, 33, 40, 48, 41, 34,
+ 27, 20, 13, 6, 7, 14, 21, 28,
+ 35, 42, 49, 56, 57, 50, 43, 36,
+ 29, 22, 15, 23, 30, 37, 44, 51,
+ 58, 59, 52, 45, 38, 31, 39, 46,
+ 53, 60, 61, 54, 47, 55, 62, 63
+ };
+
+ /**
+ * Encodes a matrix of equal width and height to a byte array.
+ *
+ * @param matrix
+ *
+ * @return
+ */
+ public static byte[] encode(byte[][] matrix)
+ {
+ byte[] buffer = new byte[matrix.length ^ 2];
+ boolean direction = ZigZag.ZIGZAG_FORWARD;
+ int x = 0, y = 0, index = 0;
+ for (int zigIndex = 0; zigIndex < (matrix.length * 2 - 1);
+ zigIndex++, direction = !direction)
+ {
+ if (direction == ZigZag.ZIGZAG_FORWARD)
+ {
+ while (x >= 0 && y != matrix.length)
+ {
+ if (x == matrix.length)
+ {
+ x--;
+ y++;
+ }
+ buffer[index] = matrix[x][y];
+ y++;
+ x--;
+ index++;
+ }
+ x++;
+ }
+ else
+ {
+ while (y >= 0 && x != matrix.length)
+ {
+ if (y == matrix.length)
+ {
+ y--;
+ x++;
+ }
+ buffer[index] = matrix[x][y];
+ y--;
+ x++;
+ index++;
+ }
+ y++;
+ }
+ }
+ return (buffer);
+ }
+
+ /**
+ * Encodes a matrix of equal width and height to a double array
+ *
+ * @param matrix
+ *
+ * @return
+ */
+ public static double[] encode(double[][] matrix)
+ {
+ double[] buffer = new double[matrix.length * matrix.length];
+ boolean direction = ZigZag.ZIGZAG_FORWARD;
+ int x = 0, y = 0, index = 0;
+ for (int zigIndex = 0; zigIndex < (matrix.length * 2 - 1);
+ zigIndex++, direction = !direction)
+ {
+ if (direction == ZigZag.ZIGZAG_FORWARD)
+ {
+ while (x >= 0 && y != matrix.length)
+ {
+ if (x == matrix.length)
+ {
+ x--;
+ y++;
+ }
+ buffer[index] = matrix[x][y];
+ y++;
+ x--;
+ index++;
+ }
+ x++;
+ }
+ else
+ {
+ while (y >= 0 && x != matrix.length)
+ {
+ if (y == matrix.length)
+ {
+ y--;
+ x++;
+ }
+ buffer[index] = matrix[x][y];
+ y--;
+ x++;
+ index++;
+ }
+ y++;
+ }
+ }
+ return (buffer);
+ }
+
+ /**
+ * Encodes a matrix of equal width and height to a float array
+ *
+ * @param matrix
+ *
+ * @return
+ */
+ public static float[] encode(float[][] matrix)
+ {
+ float[] buffer = new float[matrix.length * matrix.length];
+ boolean direction = ZigZag.ZIGZAG_FORWARD;
+ int x = 0, y = 0, index = 0;
+ for (int zigIndex = 0; zigIndex < (matrix.length * 2 - 1);
+ zigIndex++, direction = !direction)
+ {
+ if (direction == ZigZag.ZIGZAG_FORWARD)
+ {
+ while (x >= 0 && y != matrix.length)
+ {
+ if (x == matrix.length)
+ {
+ x--;
+ y++;
+ }
+ buffer[index] = matrix[x][y];
+ y++;
+ x--;
+ index++;
+ }
+ x++;
+ }
+ else
+ {
+ while (y >= 0 && x != matrix.length)
+ {
+ if (y == matrix.length)
+ {
+ y--;
+ x++;
+ }
+ buffer[index] = matrix[x][y];
+ y--;
+ x++;
+ index++;
+ }
+ y++;
+ }
+ }
+ return (buffer);
+ }
+
+ /**
+ * Encodes a matrix of equal width and height to a float array
+ *
+ * @param matrix
+ *
+ * @return
+ */
+ public static short[] encode(short[][] matrix)
+ {
+ short[] buffer = new short[matrix.length * matrix.length];
+ boolean direction = ZigZag.ZIGZAG_FORWARD;
+ int x = 0, y = 0, index = 0;
+ for (int zigIndex = 0; zigIndex < (matrix.length * 2 - 1);
+ zigIndex++, direction = !direction)
+ {
+ if (direction == ZigZag.ZIGZAG_FORWARD)
+ {
+ while (x >= 0 && y != matrix.length)
+ {
+ if (x == matrix.length)
+ {
+ x--;
+ y++;
+ }
+ buffer[index] = matrix[x][y];
+ y++;
+ x--;
+ index++;
+ }
+ x++;
+ }
+ else
+ {
+ while (y >= 0 && x != matrix.length)
+ {
+ if (y == matrix.length)
+ {
+ y--;
+ x++;
+ }
+ buffer[index] = matrix[x][y];
+ y--;
+ x++;
+ index++;
+ }
+ y++;
+ }
+ }
+ return (buffer);
+ }
+
+ /**
+ * Convert a double array into a matrix with the same amount of columns and
+ * rows with length sqrt(double array length)
+ *
+ * @param data
+ *
+ * @return
+ */
+ public static double[][] decode(double[] data)
+ {
+ return decode(data, (int) Math.sqrt(data.length),
+ (int) Math.sqrt(data.length));
+ }
+
+ /**
+ * Convert a byte array into a matrix with the same amount of columns and
+ * rows with length sqrt(double array length)
+ *
+ * @param data
+ *
+ * @return
+ */
+ public static byte[][] decode(byte[] data)
+ {
+ return decode(data, (int) Math.sqrt(data.length),
+ (int) Math.sqrt(data.length));
+ }
+
+ public static int[][] decode(int[] data)
+ {
+ return decode(data, (int) Math.sqrt(data.length),
+ (int) Math.sqrt(data.length));
+ }
+
+ public static byte[][] decode(byte[] data, int width, int height)
+ {
+ byte[][] buffer = new byte[height][width];
+
+ for (int v = 0; v < height; v++)
+ for (int z = 0; z < width; z++)
+ buffer[v][z] = 11;
+
+ boolean dir = ZigZag.ZIGZAG_FORWARD;
+ int xindex = 0, yindex = 0, dataindex = 0;
+
+ while (xindex < width && yindex < height && dataindex < data.length)
+ {
+ buffer[yindex][xindex] = data[dataindex];
+ dataindex++;
+
+ if (dir == ZigZag.ZIGZAG_FORWARD)
+ {
+ if (yindex == 0 || xindex == (width - 1))
+ {
+ dir = ZigZag.ZIGZAG_BACKWARD;
+ if (xindex == (width - 1))
+ yindex++;
+ else
+ xindex++;
+ }
+ else
+ {
+ yindex--;
+ xindex++;
+ }
+ }
+ else
+ { /* Backwards */
+ if (xindex == 0 || yindex == (height - 1))
+ {
+ dir = ZigZag.ZIGZAG_FORWARD;
+ if (yindex == (height - 1))
+ xindex++;
+ else
+ yindex++;
+ }
+ else
+ {
+ yindex++;
+ xindex--;
+ }
+ }
+ }
+ return (buffer);
+ }
+
+ public static double[][] decode(double[] data, int width, int height)
+ {
+ double[][] buffer = new double[height][width];
+
+ for (int v = 0; v < height; v++)
+ for (int z = 0; z < width; z++)
+ buffer[v][z] = 11;
+
+ boolean dir = ZigZag.ZIGZAG_FORWARD;
+ int xindex = 0, yindex = 0, dataindex = 0;
+
+ while (xindex < width && yindex < height && dataindex < data.length)
+ {
+ buffer[yindex][xindex] = data[dataindex];
+ dataindex++;
+ System.err.println("Setting " + dataindex + " to row: " + yindex
+ + " column: " + xindex + " yourval:"
+ + (yindex*8+xindex));
+ if (dir == ZigZag.ZIGZAG_FORWARD)
+ {
+ if (yindex == 0 || xindex == (width - 1))
+ {
+ dir = ZigZag.ZIGZAG_BACKWARD;
+ if (xindex == (width - 1))
+ yindex++;
+ else
+ xindex++;
+ }
+ else
+ {
+ yindex--;
+ xindex++;
+ }
+ }
+ else
+ { /* Backwards */
+ if (xindex == 0 || yindex == (height - 1))
+ {
+ dir = ZigZag.ZIGZAG_FORWARD;
+ if (yindex == (height - 1))
+ xindex++;
+ else
+ yindex++;
+ }
+ else
+ {
+ yindex++;
+ xindex--;
+ }
+ }
+ }
+ return (buffer);
+ }
+
+ public static float[][] decode(float[] data, int width, int height)
+ {
+ float[][] buffer = new float[height][width];
+
+ for (int v = 0; v < height; v++)
+ for (int z = 0; z < width; z++)
+ buffer[v][z] = 11;
+
+ boolean dir = ZigZag.ZIGZAG_FORWARD;
+ int xindex = 0, yindex = 0, dataindex = 0;
+
+ while (xindex < width && yindex < height && dataindex < data.length)
+ {
+ buffer[yindex][xindex] = data[dataindex];
+ dataindex++;
+
+ if (dir == ZigZag.ZIGZAG_FORWARD)
+ {
+ if (yindex == 0 || xindex == (width - 1))
+ {
+ dir = ZigZag.ZIGZAG_BACKWARD;
+ if (xindex == (width - 1))
+ yindex++;
+ else
+ xindex++;
+ }
+ else
+ {
+ yindex--;
+ xindex++;
+ }
+ }
+ else
+ { /* Backwards */
+ if (xindex == 0 || yindex == (height - 1))
+ {
+ dir = ZigZag.ZIGZAG_FORWARD;
+ if (yindex == (height - 1))
+ xindex++;
+ else
+ yindex++;
+ }
+ else
+ {
+ yindex++;
+ xindex--;
+ }
+ }
+ }
+ return (buffer);
+ }
+
+ public static int[][] decode(int[] data, int width, int height)
+ {
+ int[][] buffer = new int[height][width];
+
+ for (int v = 0; v < height; v++)
+ for (int z = 0; z < width; z++)
+ buffer[v][z] = 11;
+
+ boolean dir = ZigZag.ZIGZAG_FORWARD;
+ int xindex = 0, yindex = 0, dataindex = 0;
+
+ while (xindex < width && yindex < height && dataindex < data.length)
+ {
+ buffer[yindex][xindex] = data[dataindex];
+ dataindex++;
+
+ if (dir == ZigZag.ZIGZAG_FORWARD)
+ {
+ if (yindex == 0 || xindex == (width - 1))
+ {
+ dir = ZigZag.ZIGZAG_BACKWARD;
+ if (xindex == (width - 1))
+ yindex++;
+ else
+ xindex++;
+ }
+ else
+ {
+ yindex--;
+ xindex++;
+ }
+ }
+ else
+ { /* Backwards */
+ if (xindex == 0 || yindex == (height - 1))
+ {
+ dir = ZigZag.ZIGZAG_FORWARD;
+ if (yindex == (height - 1))
+ xindex++;
+ else
+ yindex++;
+ }
+ else
+ {
+ yindex++;
+ xindex--;
+ }
+ }
+ }
+ return (buffer);
+ }
+
+ public static double[][] decode8x8_map(double input[])
+ {
+ double[][] output = new double[8][8];
+ for(int i=0; i < 64 ; i++)
+ output[ZIGZAG_8X8_MAP[i]/8][ZIGZAG_8X8_MAP[i]%8] = input[i];
+ return (output);
+ }
+
+}
diff --git a/gnu/javax/security/auth/callback/ConsoleCallbackHandler.java b/gnu/javax/security/auth/callback/ConsoleCallbackHandler.java
index 4ce22cb30..052b6c43d 100644
--- a/gnu/javax/security/auth/callback/ConsoleCallbackHandler.java
+++ b/gnu/javax/security/auth/callback/ConsoleCallbackHandler.java
@@ -157,7 +157,8 @@ public class ConsoleCallbackHandler extends AbstractCallbackHandler
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
if (c.getPrompt() != null)
- out.println(c.getPrompt());
+ out.print(c.getPrompt());
+
String[] choices = null;
int[] values = null;
switch (c.getOptionType())
@@ -175,6 +176,7 @@ public class ConsoleCallbackHandler extends AbstractCallbackHandler
ConfirmationCallback.OK, ConfirmationCallback.CANCEL
};
break;
+
case ConfirmationCallback.YES_NO_CANCEL_OPTION:
out.print(messages.getString("callback.yesNoCancel"));
choices = new String[] {
@@ -191,19 +193,26 @@ public class ConsoleCallbackHandler extends AbstractCallbackHandler
ConfirmationCallback.NO, ConfirmationCallback.CANCEL
};
break;
+
case ConfirmationCallback.YES_NO_OPTION:
out.print(messages.getString("callback.yesNo"));
- choices = new String[] {
- messages.getString("callback.yes"),
- messages.getString("callback.no"),
- messages.getString("callback.shortYes"),
- messages.getString("callback.shortNo")
- };
- values = new int[] {
- ConfirmationCallback.YES, ConfirmationCallback.NO,
- ConfirmationCallback.YES, ConfirmationCallback.NO
- };
+ choices = new String[] { messages.getString("callback.yes"),
+ messages.getString("callback.no"),
+ messages.getString("callback.shortYes"),
+ messages.getString("callback.shortNo") };
+ values = new int[] { ConfirmationCallback.YES,
+ ConfirmationCallback.NO,
+ ConfirmationCallback.YES,
+ ConfirmationCallback.NO };
+ int defaultOption = c.getDefaultOption();
+ if (defaultOption > -1 && defaultOption < choices.length)
+ {
+ out.print("[");
+ out.print(choices[defaultOption]);
+ out.print("] ");
+ }
break;
+
case ConfirmationCallback.UNSPECIFIED_OPTION:
choices = c.getOptions();
values = new int[choices.length];
@@ -220,6 +229,7 @@ public class ConsoleCallbackHandler extends AbstractCallbackHandler
out.print(choices[c.getDefaultOption()]);
out.print("] ");
break;
+
default:
throw new IllegalArgumentException();
}
@@ -242,7 +252,7 @@ public class ConsoleCallbackHandler extends AbstractCallbackHandler
protected void handleLanguage(LanguageCallback c) throws IOException
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- out.println(messages.getString("callback.language"));
+ out.print(messages.getString("callback.language"));
String reply = null;
reply = in.readLine();
if (reply == null)
diff --git a/gnu/javax/swing/plaf/metal/CustomizableTheme.java b/gnu/javax/swing/plaf/metal/CustomizableTheme.java
new file mode 100644
index 000000000..7dbf6e12a
--- /dev/null
+++ b/gnu/javax/swing/plaf/metal/CustomizableTheme.java
@@ -0,0 +1,218 @@
+/* CustomizableTheme.java -- A customizable metal theme
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.plaf.metal;
+
+import java.awt.Color;
+
+import javax.swing.plaf.ColorUIResource;
+import javax.swing.plaf.metal.DefaultMetalTheme;
+
+/**
+ * A Metal theme that can be customized by setting the primary and secondary
+ * colors.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class CustomizableTheme
+ extends DefaultMetalTheme
+ implements Cloneable
+{
+
+ /**
+ * The primary1 color.
+ */
+ private ColorUIResource primary1;
+
+ /**
+ * The primary2 color.
+ */
+ private ColorUIResource primary2;
+
+ /**
+ * The primary3 color.
+ */
+ private ColorUIResource primary3;
+
+ /**
+ * The secondary1 color.
+ */
+ private ColorUIResource secondary1;
+
+ /**
+ * The secondary2 color.
+ */
+ private ColorUIResource secondary2;
+
+ /**
+ * The secondary3 color.
+ */
+ private ColorUIResource secondary3;
+
+ /**
+ * Sets the primary1 color of the theme.
+ *
+ * @param c the primary1 color to set
+ */
+ public void setPrimary1(Color c)
+ {
+ primary1 = new ColorUIResource(c);
+ }
+
+ /**
+ * Returns the primary1 color of this theme.
+ *
+ * @return the primary1 color of this theme
+ */
+ public ColorUIResource getPrimary1()
+ {
+ return primary1 == null ? super.getPrimary1() : primary1;
+ }
+
+
+ /**
+ * Sets the primary2 color of the theme.
+ *
+ * @param c the primary2 color to set
+ */
+ public void setPrimary2(Color c)
+ {
+ primary2 = new ColorUIResource(c);
+ }
+
+ /**
+ * Returns the primary2 color of this theme.
+ *
+ * @return the primary2 color of this theme
+ */
+ public ColorUIResource getPrimary2()
+ {
+ return primary2 == null ? super.getPrimary2() : primary2;
+ }
+
+ /**
+ * Sets the primary3 color of the theme.
+ *
+ * @param c the primary3 color to set
+ */
+ public void setPrimary3(Color c)
+ {
+ primary3 = new ColorUIResource(c);
+ }
+
+ /**
+ * Returns the primary3 color of this theme.
+ *
+ * @return the primary3 color of this theme
+ */
+ public ColorUIResource getPrimary3()
+ {
+ return primary3 == null ? super.getPrimary3() : primary3;
+ }
+
+ /**
+ * Sets the secondary1 color of the theme.
+ *
+ * @param c the secondary1 color to set
+ */
+ public void setSecondary1(Color c)
+ {
+ secondary1 = new ColorUIResource(c);
+ }
+
+ /**
+ * Returns the secondary1 color of this theme.
+ *
+ * @return the secondary1 color of this theme
+ */
+ public ColorUIResource getSecondary1()
+ {
+ return secondary1 == null ? super.getSecondary1() : secondary1;
+ }
+
+ /**
+ * Sets the secondary2 color of the theme.
+ *
+ * @param c the secondary2 color to set
+ */
+ public void setSecondary2(Color c)
+ {
+ secondary2 = new ColorUIResource(c);
+ }
+
+ /**
+ * Returns the secondary2 color of this theme.
+ *
+ * @return the secondary2 color of this theme
+ */
+ public ColorUIResource getSecondary2()
+ {
+ return secondary2 == null ? super.getSecondary2() : secondary2;
+ }
+
+ /**
+ * Sets the secondary3 color of the theme.
+ *
+ * @param c the secondary3 color to set
+ */
+ public void setSecondary3(Color c)
+ {
+ secondary3 = new ColorUIResource(c);
+ }
+
+ /**
+ * Returns the secondary3 color of this theme.
+ *
+ * @return the secondary3 color of this theme
+ */
+ public ColorUIResource getSecondary3()
+ {
+ return secondary3 == null ? super.getSecondary3() : secondary3;
+ }
+
+ /**
+ * Returns a clone of this theme.
+ *
+ * @return a clone of this theme
+ */
+ public Object clone()
+ throws CloneNotSupportedException
+ {
+ return super.clone();
+ }
+}
diff --git a/gnu/javax/swing/text/html/parser/support/Parser.java b/gnu/javax/swing/text/html/parser/support/Parser.java
index cef94942e..92f9b27c5 100644
--- a/gnu/javax/swing/text/html/parser/support/Parser.java
+++ b/gnu/javax/swing/text/html/parser/support/Parser.java
@@ -934,7 +934,7 @@ public class Parser
optional(WS);
attributeReading:
- while (getTokenAhead().kind == NUMTOKEN)
+ while (getTokenAhead().kind == NUMTOKEN)
{
name = getNextToken();
optional(WS);
@@ -949,46 +949,90 @@ public class Parser
switch (next.kind)
{
- case QUOT :
-
- // read "quoted" attribute.
- buffer.setLength(0);
- readTillTokenE(QUOT);
- attrValue = buffer.toString();
- break;
-
- case AP :
-
- // read 'quoted' attribute.
- buffer.setLength(0);
- readTillTokenE(AP);
- attrValue = buffer.toString();
- break;
-
- // read unquoted attribute.
- case NUMTOKEN :
- value = next;
- optional(WS);
-
- // Check maybe the opening quote is missing.
- next = getTokenAhead();
- if (bQUOTING.get(next.kind))
- {
- hTag = next;
- error("The value without opening quote is closed with '" +
- next.getImage() + "'"
- );
- }
+ case QUOT:
+
+ // read "quoted" attribute.
+ buffer.setLength(0);
+ readTillTokenE(QUOT);
+ attrValue = buffer.toString();
+ break;
+
+ case AP:
+
+ // read 'quoted' attribute.
+ buffer.setLength(0);
+ readTillTokenE(AP);
+ attrValue = buffer.toString();
+ break;
+
+ // read unquoted attribute.
+ case NUMTOKEN:
+ value = next;
+ optional(WS);
+
+ // Check maybe the opening quote is missing.
+ next = getTokenAhead();
+ if (bQUOTING.get(next.kind))
+ {
+ hTag = next;
+ error("The value without opening quote is closed with '"
+ + next.getImage() + "'");
+ attrValue = value.getImage();
+ }
+ else if (next.kind == SLASH)
+ // The slash in this context is treated as the ordinary
+ // character, not as a token. The slash may be part of
+ // the unquoted URL.
+ {
+ StringBuffer image = new StringBuffer(value.getImage());
+ while (next.kind == NUMTOKEN || next.kind == SLASH)
+ {
+ image.append(getNextToken().getImage());
+ next = getTokenAhead();
+ }
+ attrValue = image.toString();
+ }
+ else
attrValue = value.getImage();
- break;
-
- default :
- break attributeReading;
+ break;
+
+ case SLASH:
+ value = next;
+ optional(WS);
+
+ // Check maybe the opening quote is missing.
+ next = getTokenAhead();
+ if (bQUOTING.get(next.kind))
+ {
+ hTag = next;
+ error("The value without opening quote is closed with '"
+ + next.getImage() + "'");
+ attrValue = value.getImage();
+ }
+ else if (next.kind == NUMTOKEN || next.kind == SLASH)
+ // The slash in this context is treated as the ordinary
+ // character, not as a token. The slash may be part of
+ // the unquoted URL.
+ {
+ StringBuffer image = new StringBuffer(value.getImage());
+ while (next.kind == NUMTOKEN || next.kind == SLASH)
+ {
+ image.append(getNextToken().getImage());
+ next = getTokenAhead();
+ }
+ attrValue = image.toString();
+ }
+ else
+ attrValue = value.getImage();
+ break;
+ default:
+ break attributeReading;
}
attributes.addAttribute(name.getImage(), attrValue);
optional(WS);
}
- else // The '=' is missing: attribute without value.
+ else
+ // The '=' is missing: attribute without value.
{
noValueAttribute(element, name.getImage());
}
@@ -996,9 +1040,8 @@ public class Parser
}
/**
- * Return string, corresponding the given named entity.
- * The name is passed with the preceeding &, but without
- * the ending semicolon.
+ * Return string, corresponding the given named entity. The name is passed
+ * with the preceeding &, but without the ending semicolon.
*/
protected String resolveNamedEntity(final String a_tag)
{
diff --git a/gnu/javax/swing/tree/GnuPath.java b/gnu/javax/swing/tree/GnuPath.java
new file mode 100644
index 000000000..dd576e8d3
--- /dev/null
+++ b/gnu/javax/swing/tree/GnuPath.java
@@ -0,0 +1,65 @@
+/* GnuPath.java -- The extended version of TreePath
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.tree;
+
+import javax.swing.tree.TreePath;
+
+/**
+ * The tree path with additional data. Needed for the optimized tree drawing.
+ * Returned by layout caches.
+ *
+ * @author Audrius Meskauskas
+ */
+public class GnuPath extends TreePath
+{
+ /**
+ * The flag, marking the last visible child.
+ */
+ public boolean isLastChild;
+
+ /**
+ * Create a new path, specifying flag if this path is the path to the
+ * last visible child (needed for optimized tree drawing).
+ */
+ public GnuPath(Object[] path, boolean lastChild)
+ {
+ super(path);
+ isLastChild = lastChild;
+ }
+}
diff --git a/gnu/regexp/CharIndexed.java b/gnu/regexp/CharIndexed.java
index df1d8930c..8aedc49f6 100644
--- a/gnu/regexp/CharIndexed.java
+++ b/gnu/regexp/CharIndexed.java
@@ -93,4 +93,24 @@ public interface CharIndexed {
* Returns the effective length of this CharIndexed
*/
int length();
+
+ /**
+ * Sets the REMatch last found on this input.
+ */
+ void setLastMatch(REMatch match);
+
+ /**
+ * Returns the REMatch last found on this input.
+ */
+ REMatch getLastMatch();
+
+ /**
+ * Returns the anchor.
+ */
+ int getAnchor();
+
+ /**
+ * Sets the anchor.
+ */
+ void setAnchor(int anchor);
}
diff --git a/gnu/regexp/CharIndexedCharArray.java b/gnu/regexp/CharIndexedCharArray.java
index 1388d4729..96a609beb 100644
--- a/gnu/regexp/CharIndexedCharArray.java
+++ b/gnu/regexp/CharIndexedCharArray.java
@@ -1,5 +1,5 @@
/* gnu/regexp/CharIndexedCharArray.java
- Copyright (C) 1998-2001, 2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -36,36 +36,11 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.regexp;
-import java.io.Serializable;
+import java.nio.CharBuffer;
-class CharIndexedCharArray implements CharIndexed, Serializable {
- private char[] s;
- private int anchor;
+class CharIndexedCharArray extends CharIndexedCharSequence {
CharIndexedCharArray(char[] str, int index) {
- s = str;
- anchor = index;
- }
-
- public char charAt(int index) {
- int pos = anchor + index;
- return ((pos < s.length) && (pos >= 0)) ? s[pos] : OUT_OF_BOUNDS;
- }
-
- public boolean isValid() {
- return (anchor < s.length);
- }
-
- public boolean move(int index) {
- return ((anchor += index) < s.length);
- }
-
- public CharIndexed lookBehind(int index, int length) {
- if (length > (anchor + index)) length = anchor + index;
- return new CharIndexedCharArray(s, anchor + index - length);
- }
-
- public int length() {
- return s.length - anchor;
+ super(CharBuffer.wrap(str), index);
}
}
diff --git a/gnu/regexp/CharIndexedCharSequence.java b/gnu/regexp/CharIndexedCharSequence.java
new file mode 100644
index 000000000..5bbe4abfe
--- /dev/null
+++ b/gnu/regexp/CharIndexedCharSequence.java
@@ -0,0 +1,82 @@
+/* gnu/regexp/CharIndexedCharSequence.java
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.regexp;
+import java.io.Serializable;
+
+class CharIndexedCharSequence implements CharIndexed, Serializable {
+ private CharSequence s;
+ private int anchor;
+ private int len;
+
+ CharIndexedCharSequence(CharSequence s, int index) {
+ this.s = s;
+ len = s.length();
+ anchor = index;
+ }
+
+ public char charAt(int index) {
+ int pos = anchor + index;
+ return ((pos < len) && (pos >= 0)) ? s.charAt(pos) : OUT_OF_BOUNDS;
+ }
+
+ public boolean isValid() {
+ return (anchor < len);
+ }
+
+ public boolean move(int index) {
+ return ((anchor += index) < len);
+ }
+
+ public CharIndexed lookBehind(int index, int length) {
+ if (length > (anchor + index)) length = anchor + index;
+ return new CharIndexedCharSequence(s, anchor + index - length);
+ }
+
+ public int length() {
+ return len - anchor;
+ }
+
+ private REMatch lastMatch;
+ public void setLastMatch(REMatch match) {
+ lastMatch = (REMatch)match.clone();
+ lastMatch.anchor = anchor;
+ }
+ public REMatch getLastMatch() { return lastMatch; }
+ public int getAnchor() { return anchor; }
+ public void setAnchor(int anchor) { this.anchor = anchor; }
+}
diff --git a/gnu/regexp/CharIndexedInputStream.java b/gnu/regexp/CharIndexedInputStream.java
index d5225a793..290a94e7f 100644
--- a/gnu/regexp/CharIndexedInputStream.java
+++ b/gnu/regexp/CharIndexedInputStream.java
@@ -155,5 +155,27 @@ class CharIndexedInputStream implements CharIndexed {
throw new UnsupportedOperationException(
"difficult to tell the length for an input stream");
}
+
+ public void setLastMatch(REMatch match) {
+ throw new UnsupportedOperationException(
+ "difficult to support setLastMatch for an input stream");
+ }
+
+ public REMatch getLastMatch() {
+ throw new UnsupportedOperationException(
+ "difficult to support getLastMatch for an input stream");
+ }
+
+ public int getAnchor() {
+ throw new UnsupportedOperationException(
+ "difficult to support getAnchor for an input stream");
+ }
+
+ public void setAnchor(int anchor) {
+ throw new UnsupportedOperationException(
+ "difficult to support setAnchor for an input stream");
+ }
+
+
}
diff --git a/gnu/regexp/CharIndexedString.java b/gnu/regexp/CharIndexedString.java
index fe4fa8f76..24982659b 100644
--- a/gnu/regexp/CharIndexedString.java
+++ b/gnu/regexp/CharIndexedString.java
@@ -1,5 +1,5 @@
/* gnu/regexp/CharIndexedString.java
- Copyright (C) 1998-2001, 2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -36,38 +36,9 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.regexp;
-import java.io.Serializable;
-class CharIndexedString implements CharIndexed, Serializable {
- private String s;
- private int anchor;
- private int len;
-
+class CharIndexedString extends CharIndexedCharSequence {
CharIndexedString(String str, int index) {
- s = str;
- len = s.length();
- anchor = index;
- }
-
- public char charAt(int index) {
- int pos = anchor + index;
- return ((pos < len) && (pos >= 0)) ? s.charAt(pos) : OUT_OF_BOUNDS;
- }
-
- public boolean isValid() {
- return (anchor < len);
- }
-
- public boolean move(int index) {
- return ((anchor += index) < len);
- }
-
- public CharIndexed lookBehind(int index, int length) {
- if (length > (anchor + index)) length = anchor + index;
- return new CharIndexedString(s, anchor + index - length);
- }
-
- public int length() {
- return len - anchor;
+ super(str, index);
}
}
diff --git a/gnu/regexp/CharIndexedStringBuffer.java b/gnu/regexp/CharIndexedStringBuffer.java
index 9c9118dfe..d6b03bba5 100644
--- a/gnu/regexp/CharIndexedStringBuffer.java
+++ b/gnu/regexp/CharIndexedStringBuffer.java
@@ -1,5 +1,5 @@
/* gnu/regexp/CharIndexedStringBuffer.java
- Copyright (C) 1998-2001, 2004, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -36,36 +36,10 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.regexp;
-import java.io.Serializable;
-class CharIndexedStringBuffer implements CharIndexed, Serializable {
- private StringBuffer s;
- private int anchor;
+class CharIndexedStringBuffer extends CharIndexedCharSequence {
CharIndexedStringBuffer(StringBuffer str, int index) {
- s = str;
- anchor = index;
+ super(str, index);
}
-
- public char charAt(int index) {
- int pos = anchor + index;
- return ((pos < s.length()) && (pos >= 0)) ? s.charAt(pos) : OUT_OF_BOUNDS;
- }
-
- public boolean isValid() {
- return (anchor < s.length());
- }
-
- public boolean move(int index) {
- return ((anchor += index) < s.length());
- }
-
- public CharIndexed lookBehind(int index, int length) {
- if (length > (anchor + index)) length = anchor + index;
- return new CharIndexedStringBuffer(s, anchor + index - length);
- }
-
- public int length() {
- return s.length() - anchor;
- }
}
diff --git a/gnu/regexp/RE.java b/gnu/regexp/RE.java
index 8dba406ae..e0665f097 100644
--- a/gnu/regexp/RE.java
+++ b/gnu/regexp/RE.java
@@ -79,13 +79,18 @@ import java.util.Vector;
* <P>
*
* These methods all have similar argument lists. The input can be a
- * String, a character array, a StringBuffer, or an
+ * CharIndexed, String, a character array, a StringBuffer, or an
* InputStream of some sort. Note that when using an
* InputStream, the stream read position cannot be guaranteed after
* attempting a match (this is not a bug, but a consequence of the way
* regular expressions work). Using an REMatchEnumeration can
* eliminate most positioning problems.
*
+ * Although the input object can be of various types, it is recommended
+ * that it should be a CharIndexed because {@link CharIndexed#getLastMatch()}
+ * can show the last match found on this input, which helps the expression
+ * \G work as the end of the previous match.
+ *
* <P>
*
* The optional index argument specifies the offset from the beginning
@@ -236,6 +241,17 @@ public class RE extends REToken {
*/
public static final int REG_REPLACE_USE_BACKSLASHESCAPE = 0x0200;
+ /**
+ * Compilation flag. Allow whitespace and comments in pattern.
+ * This is equivalent to the "/x" operator in Perl.
+ */
+ public static final int REG_X_COMMENTS = 0x0400;
+
+ /**
+ * Compilation flag. If set, REG_ICASE is effective only for US-ASCII.
+ */
+ public static final int REG_ICASE_USASCII = 0x0800;
+
/** Returns a string representing the version of the gnu.regexp package. */
public static final String version() {
return VERSION;
@@ -335,6 +351,7 @@ public class RE extends REToken {
// Precalculate these so we don't pay for the math every time we
// need to access them.
boolean insens = ((cflags & REG_ICASE) > 0);
+ boolean insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
// Parse pattern into tokens. Does anyone know if it's more efficient
// to use char[] than a String.charAt()? I'm assuming so.
@@ -373,6 +390,31 @@ public class RE extends REToken {
if (quot)
unit.bk = false;
+ if (((cflags & REG_X_COMMENTS) > 0) && (!unit.bk) && (!quot)) {
+ if (Character.isWhitespace(unit.ch)) {
+ continue;
+ }
+ if (unit.ch == '#') {
+ for (int i = index; i < pLength; i++) {
+ if (pattern[i] == '\n') {
+ index = i + 1;
+ continue;
+ }
+ else if (pattern[i] == '\r') {
+ if (i + 1 < pLength && pattern[i + 1] == '\n') {
+ index = i + 2;
+ }
+ else {
+ index = i + 1;
+ }
+ continue;
+ }
+ }
+ index = pLength;
+ continue;
+ }
+ }
+
// ALTERNATION OPERATOR
// \| or | (if RE_NO_BK_VBAR) or newline (if RE_NEWLINE_ALT)
// not available if RE_LIMITED_OPS is set
@@ -421,6 +463,7 @@ public class RE extends REToken {
else {
addToken(currentToken);
currentToken = new RETokenChar(subIndex,unit.ch,insens);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
}
@@ -496,8 +539,8 @@ public class RE extends REToken {
case 'd':
case 'm':
case 's':
- // case 'u': not supported
- // case 'x': not supported
+ case 'u':
+ case 'x':
case '-':
if (!syntax.get(RESyntax.RE_EMBEDDED_FLAGS)) break;
// Set or reset syntax flags.
@@ -536,8 +579,20 @@ public class RE extends REToken {
newCflags |= REG_DOT_NEWLINE;
flagIndex++;
break;
- // case 'u': not supported
- // case 'x': not supported
+ case 'u':
+ if (negate)
+ newCflags |= REG_ICASE_USASCII;
+ else
+ newCflags &= ~REG_ICASE_USASCII;
+ flagIndex++;
+ break;
+ case 'x':
+ if (negate)
+ newCflags &= ~REG_X_COMMENTS;
+ else
+ newCflags |= REG_X_COMMENTS;
+ flagIndex++;
+ break;
case '-':
negate = true;
flagIndex++;
@@ -554,6 +609,7 @@ public class RE extends REToken {
syntax = newSyntax;
cflags = newCflags;
insens = ((cflags & REG_ICASE) > 0);
+ insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
// This can be treated as though it were a comment.
comment = true;
index = flagIndex - 1;
@@ -566,6 +622,7 @@ public class RE extends REToken {
syntax = newSyntax;
cflags = newCflags;
insens = ((cflags & REG_ICASE) > 0);
+ insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
index = flagIndex -1;
// Fall through to the next case.
}
@@ -674,6 +731,7 @@ public class RE extends REToken {
syntax = savedSyntax;
cflags = savedCflags;
insens = ((cflags & REG_ICASE) > 0);
+ insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
flagsSaved = false;
}
} // not a comment
@@ -786,6 +844,7 @@ public class RE extends REToken {
index = index - 2 + ce.len;
addToken(currentToken);
currentToken = new RETokenChar(subIndex,ce.ch,insens);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
// BACKREFERENCE OPERATOR
@@ -813,6 +872,7 @@ public class RE extends REToken {
int num = parseInt(pattern, numBegin, numEnd-numBegin, 10);
currentToken = new RETokenBackRef(subIndex,num,insens);
+ if (insensUSASCII) currentToken.unicodeAware = false;
index = numEnd;
}
@@ -861,6 +921,7 @@ public class RE extends REToken {
else if (unit.bk && (unit.ch == 'd') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
addToken(currentToken);
currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.DIGIT,insens,false);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
// NON-DIGIT OPERATOR
@@ -869,6 +930,7 @@ public class RE extends REToken {
else if (unit.bk && (unit.ch == 'D') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
addToken(currentToken);
currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.DIGIT,insens,true);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
// NEWLINE ESCAPE
@@ -893,6 +955,7 @@ public class RE extends REToken {
else if (unit.bk && (unit.ch == 's') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
addToken(currentToken);
currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.SPACE,insens,false);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
// NON-WHITESPACE OPERATOR
@@ -901,6 +964,7 @@ public class RE extends REToken {
else if (unit.bk && (unit.ch == 'S') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
addToken(currentToken);
currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.SPACE,insens,true);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
// TAB ESCAPE
@@ -917,6 +981,7 @@ public class RE extends REToken {
else if (unit.bk && (unit.ch == 'w') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
addToken(currentToken);
currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.ALNUM,insens,false);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
// NON-ALPHANUMERIC OPERATOR
@@ -925,12 +990,19 @@ public class RE extends REToken {
else if (unit.bk && (unit.ch == 'W') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
addToken(currentToken);
currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.ALNUM,insens,true);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
// END OF STRING OPERATOR
- // \Z
+ // \Z, \z
- else if (unit.bk && (unit.ch == 'Z') && syntax.get(RESyntax.RE_STRING_ANCHORS)) {
+ // FIXME: \Z and \z are different in that if the input string
+ // ends with a line terminator, \Z matches the position before
+ // the final terminator. This special behavior of \Z is yet
+ // to be implemented.
+
+ else if (unit.bk && (unit.ch == 'Z' || unit.ch == 'z') &&
+ syntax.get(RESyntax.RE_STRING_ANCHORS)) {
addToken(currentToken);
currentToken = new RETokenEnd(subIndex,null);
}
@@ -946,6 +1018,7 @@ public class RE extends REToken {
index = index - 2 + ce.len;
addToken(currentToken);
currentToken = new RETokenChar(subIndex,ce.ch,insens);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
// NAMED PROPERTY
@@ -959,6 +1032,16 @@ public class RE extends REToken {
index = index - 2 + np.len;
addToken(currentToken);
currentToken = getRETokenNamedProperty(subIndex,np,insens,index);
+ if (insensUSASCII) currentToken.unicodeAware = false;
+ }
+
+ // END OF PREVIOUS MATCH
+ // \G
+
+ else if (unit.bk && (unit.ch == 'G') &&
+ syntax.get(RESyntax.RE_STRING_ANCHORS)) {
+ addToken(currentToken);
+ currentToken = new RETokenEndOfPreviousMatch(subIndex);
}
// NON-SPECIAL CHARACTER (or escape to make literal)
@@ -967,6 +1050,7 @@ public class RE extends REToken {
else { // not a special character
addToken(currentToken);
currentToken = new RETokenChar(subIndex,unit.ch,insens);
+ if (insensUSASCII) currentToken.unicodeAware = false;
}
} // end while
@@ -1007,6 +1091,7 @@ public class RE extends REToken {
throws REException {
boolean insens = ((cflags & REG_ICASE) > 0);
+ boolean insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
Vector options = new Vector();
Vector addition = new Vector();
boolean additionAndAppeared = false;
@@ -1036,7 +1121,9 @@ public class RE extends REToken {
if ((ch == '-') && (lastCharIsSet)) {
if (index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
if ((ch = pattern[index]) == ']') {
- options.addElement(new RETokenChar(subIndex,lastChar,insens));
+ RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
+ if (insensUSASCII) t.unicodeAware = false;
+ options.addElement(t);
lastChar = '-';
} else {
if ((ch == '\\') && syntax.get(RESyntax.RE_BACKSLASH_ESCAPE_IN_LISTS)) {
@@ -1046,7 +1133,9 @@ public class RE extends REToken {
ch = ce.ch;
index = index + ce.len - 1;
}
- options.addElement(new RETokenRange(subIndex,lastChar,ch,insens));
+ RETokenRange t = new RETokenRange(subIndex,lastChar,ch,insens);
+ if (insensUSASCII) t.unicodeAware = false;
+ options.addElement(t);
lastChar = 0; lastCharIsSet = false;
index++;
}
@@ -1089,12 +1178,20 @@ public class RE extends REToken {
asciiEsc = ce.ch; asciiEscIsSet = true;
index = index - 1 + ce.len - 1;
}
- if (lastCharIsSet) options.addElement(new RETokenChar(subIndex,lastChar,insens));
+ if (lastCharIsSet) {
+ RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
+ if (insensUSASCII) t.unicodeAware = false;
+ options.addElement(t);
+ }
if (posixID != -1) {
- options.addElement(new RETokenPOSIX(subIndex,posixID,insens,negate));
+ RETokenPOSIX t = new RETokenPOSIX(subIndex,posixID,insens,negate);
+ if (insensUSASCII) t.unicodeAware = false;
+ options.addElement(t);
} else if (np != null) {
- options.addElement(getRETokenNamedProperty(subIndex,np,insens,index));
+ RETokenNamedProperty t = getRETokenNamedProperty(subIndex,np,insens,index);
+ if (insensUSASCII) t.unicodeAware = false;
+ options.addElement(t);
} else if (asciiEscIsSet) {
lastChar = asciiEsc; lastCharIsSet = true;
} else {
@@ -1105,8 +1202,11 @@ public class RE extends REToken {
StringBuffer posixSet = new StringBuffer();
index = getPosixSet(pattern,index+1,posixSet);
int posixId = RETokenPOSIX.intValue(posixSet.toString());
- if (posixId != -1)
- options.addElement(new RETokenPOSIX(subIndex,posixId,insens,false));
+ if (posixId != -1) {
+ RETokenPOSIX t = new RETokenPOSIX(subIndex,posixId,insens,false);
+ if (insensUSASCII) t.unicodeAware = false;
+ options.addElement(t);
+ }
} else if ((ch == '[') && (syntax.get(RESyntax.RE_NESTED_CHARCLASS))) {
ParseCharClassResult result = parseCharClass(
subIndex, pattern, index, pLength, cflags, syntax, 0);
@@ -1159,14 +1259,22 @@ public class RE extends REToken {
result.index: result.index - 1);
}
} else {
- if (lastCharIsSet) options.addElement(new RETokenChar(subIndex,lastChar,insens));
+ if (lastCharIsSet) {
+ RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
+ if (insensUSASCII) t.unicodeAware = false;
+ options.addElement(t);
+ }
lastChar = ch; lastCharIsSet = true;
}
if (index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
} // while in list
// Out of list, index is one past ']'
- if (lastCharIsSet) options.addElement(new RETokenChar(subIndex,lastChar,insens));
+ if (lastCharIsSet) {
+ RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
+ if (insensUSASCII) t.unicodeAware = false;
+ options.addElement(t);
+ }
ParseCharClassResult result = new ParseCharClassResult();
// Create a new RETokenOneOf
@@ -1514,7 +1622,7 @@ public class RE extends REToken {
}
// Note the start of this subexpression
- mymatch.start[subIndex] = mymatch.index;
+ mymatch.start1[subIndex] = mymatch.index;
return firstToken.match(input, mymatch);
}
@@ -1524,8 +1632,6 @@ public class RE extends REToken {
mymatch.backtrackStack = new BacktrackStack();
boolean b = match(input, mymatch);
if (b) {
- // mymatch.backtrackStack.push(new REMatch.Backtrack(
- // this, input, mymatch, null));
return mymatch;
}
return null;
@@ -1614,6 +1720,7 @@ public class RE extends REToken {
*/
best.end[0] = best.index;
best.finish(input);
+ input.setLastMatch(best);
return best;
}
}
@@ -1965,10 +2072,23 @@ public class RE extends REToken {
}
// Cast input appropriately or throw exception
- private static CharIndexed makeCharIndexed(Object input, int index) {
- // We could let a String fall through to final input, but since
- // it's the most likely input type, we check it first.
- if (input instanceof String)
+ // This method was originally a private method, but has been made
+ // public because java.util.regex.Matcher uses this.
+ public static CharIndexed makeCharIndexed(Object input, int index) {
+ // The case where input is already a CharIndexed is supposed
+ // be the most likely because this is the case with
+ // java.util.regex.Matcher.
+ // We could let a String or a CharSequence fall through
+ // to final input, but since it'a very likely input type,
+ // we check it first.
+ if (input instanceof CharIndexed) {
+ CharIndexed ci = (CharIndexed) input;
+ ci.setAnchor(index);
+ return ci;
+ }
+ else if (input instanceof CharSequence)
+ return new CharIndexedCharSequence((CharSequence) input,index);
+ else if (input instanceof String)
return new CharIndexedString((String) input,index);
else if (input instanceof char[])
return new CharIndexedCharArray((char[]) input,index);
@@ -1976,8 +2096,6 @@ public class RE extends REToken {
return new CharIndexedStringBuffer((StringBuffer) input,index);
else if (input instanceof InputStream)
return new CharIndexedInputStream((InputStream) input,index);
- else if (input instanceof CharIndexed)
- return (CharIndexed) input; // do we lose index info?
else
return new CharIndexedString(input.toString(), index);
}
diff --git a/gnu/regexp/REMatch.java b/gnu/regexp/REMatch.java
index aac845204..140a9c43e 100644
--- a/gnu/regexp/REMatch.java
+++ b/gnu/regexp/REMatch.java
@@ -49,6 +49,7 @@ import java.io.Serializable;
*/
public final class REMatch implements Serializable, Cloneable {
private String matchedText;
+ private CharIndexed matchedCharIndexed;
// These variables are package scope for fast access within the engine
int eflags; // execution flags this match was made using
@@ -64,8 +65,17 @@ public final class REMatch implements Serializable, Cloneable {
// Package scope; used by RE.
int index; // used while matching to mark current match position in input
+ // start1[i] is set when the i-th subexp starts. And start1[i] is copied
+ // to start[i] when the i-th subexp ends. So start[i] keeps the previously
+ // assigned value while the i-th subexp is being processed. This makes
+ // backreference to the i-th subexp within the i-th subexp possible.
int[] start; // start positions (relative to offset) for each (sub)exp.
+ int[] start1; // start positions (relative to offset) for each (sub)exp.
int[] end; // end positions for the same
+ // start[i] == -1 or end[i] == -1 means that the start/end position is void.
+ // start[i] == p or end[i] == p where p < 0 and p != -1 means that
+ // the actual start/end position is (p+1). Start/end positions may
+ // become negative when the subexpression is in a RETokenLookBehind.
boolean empty; // empty string matched. This flag is used only within
// RETokenRepeated.
@@ -76,6 +86,7 @@ public final class REMatch implements Serializable, Cloneable {
REMatch copy = (REMatch) super.clone();
copy.start = (int[]) start.clone();
+ copy.start1 = (int[]) start1.clone();
copy.end = (int[]) end.clone();
return copy;
@@ -86,6 +97,7 @@ public final class REMatch implements Serializable, Cloneable {
void assignFrom(REMatch other) {
start = other.start;
+ start1 = other.start1;
end = other.end;
index = other.index;
backtrackStack = other.backtrackStack;
@@ -93,6 +105,7 @@ public final class REMatch implements Serializable, Cloneable {
REMatch(int subs, int anchor, int eflags) {
start = new int[subs+1];
+ start1 = new int[subs+1];
end = new int[subs+1];
this.anchor = anchor;
this.eflags = eflags;
@@ -106,6 +119,7 @@ public final class REMatch implements Serializable, Cloneable {
for (i = 0; i < end[0]; i++)
sb.append(text.charAt(i));
matchedText = sb.toString();
+ matchedCharIndexed = text;
for (i = 0; i < start.length; i++) {
// If any subexpressions didn't terminate, they don't count
// TODO check if this code ever gets hit
@@ -122,7 +136,7 @@ public final class REMatch implements Serializable, Cloneable {
offset = index;
this.index = 0;
for (int i = 0; i < start.length; i++) {
- start[i] = end[i] = -1;
+ start[i] = start1[i] = end[i] = -1;
}
backtrackStack = null;
}
@@ -181,7 +195,19 @@ public final class REMatch implements Serializable, Cloneable {
if ((sub >= start.length) || sub < 0)
throw new IndexOutOfBoundsException("No group " + sub);
if (start[sub] == -1) return null;
- return (matchedText.substring(start[sub],end[sub]));
+ if (start[sub] >= 0 && end[sub] <= matchedText.length())
+ return (matchedText.substring(start[sub],end[sub]));
+ else {
+ // This case occurs with RETokenLookAhead or RETokenLookBehind.
+ StringBuffer sb = new StringBuffer();
+ int s = start[sub];
+ int e = end[sub];
+ if (s < 0) s += 1;
+ if (e < 0) e += 1;
+ for (int i = start[0] + s; i < start[0] + e; i++)
+ sb.append(matchedCharIndexed.charAt(i));
+ return sb.toString();
+ }
}
/**
@@ -195,7 +221,8 @@ public final class REMatch implements Serializable, Cloneable {
public int getSubStartIndex(int sub) {
if (sub >= start.length) return -1;
int x = start[sub];
- return (x == -1) ? x : offset + x;
+ return (x == -1) ? x :
+ (x >= 0) ? offset + x : offset + x + 1;
}
/**
@@ -209,7 +236,8 @@ public final class REMatch implements Serializable, Cloneable {
public int getStartIndex(int sub) {
if (sub >= start.length) return -1;
int x = start[sub];
- return (x == -1) ? x : offset + x;
+ return (x == -1) ? x :
+ (x >= 0) ? offset + x : offset + x + 1;
}
/**
@@ -223,7 +251,8 @@ public final class REMatch implements Serializable, Cloneable {
public int getSubEndIndex(int sub) {
if (sub >= start.length) return -1;
int x = end[sub];
- return (x == -1) ? x : offset + x;
+ return (x == -1) ? x :
+ (x >= 0) ? offset + x : offset + x + 1;
}
/**
@@ -236,7 +265,8 @@ public final class REMatch implements Serializable, Cloneable {
public int getEndIndex(int sub) {
if (sub >= start.length) return -1;
int x = end[sub];
- return (x == -1) ? x : offset + x;
+ return (x == -1) ? x :
+ (x >= 0) ? offset + x : offset + x + 1;
}
/**
diff --git a/gnu/regexp/REToken.java b/gnu/regexp/REToken.java
index 87780bc7a..f2abc029f 100644
--- a/gnu/regexp/REToken.java
+++ b/gnu/regexp/REToken.java
@@ -43,6 +43,7 @@ abstract class REToken implements Serializable, Cloneable {
protected REToken next = null;
protected REToken uncle = null;
protected int subIndex;
+ protected boolean unicodeAware = true;
public Object clone() {
try {
@@ -157,4 +158,32 @@ abstract class REToken implements Serializable, Cloneable {
return os.toString();
}
+ /**
+ * Converts the character argument to lowercase.
+ * @param ch the character to be converted.
+ * @param unicodeAware If true, use java.lang.Character#toLowerCase;
+ * otherwise, only US-ASCII charactes can be converted.
+ * @return the lowercase equivalent of the character, if any;
+ * otherwise, the character itself.
+ */
+ public static char toLowerCase(char ch, boolean unicodeAware) {
+ if (unicodeAware) return Character.toLowerCase(ch);
+ if (ch >= 'A' && ch <= 'Z') return (char)(ch + 'a' - 'A');
+ return ch;
+ }
+
+ /**
+ * Converts the character argument to uppercase.
+ * @param ch the character to be converted.
+ * @param unicodeAware If true, use java.lang.Character#toUpperCase;
+ * otherwise, only US-ASCII charactes can be converted.
+ * @return the uppercase equivalent of the character, if any;
+ * otherwise, the character itself.
+ */
+ public static char toUpperCase(char ch, boolean unicodeAware) {
+ if (unicodeAware) return Character.toUpperCase(ch);
+ if (ch >= 'a' && ch <= 'z') return (char)(ch + 'A' - 'a');
+ return ch;
+ }
+
}
diff --git a/gnu/regexp/RETokenBackRef.java b/gnu/regexp/RETokenBackRef.java
index 5dc630fdb..25ef9522e 100644
--- a/gnu/regexp/RETokenBackRef.java
+++ b/gnu/regexp/RETokenBackRef.java
@@ -57,13 +57,15 @@ final class RETokenBackRef extends REToken {
b = mymatch.start[num];
e = mymatch.end[num];
if ((b==-1)||(e==-1)) return null; // this shouldn't happen, but...
+ if (b < 0) b += 1;
+ if (e < 0) e += 1;
for (int i=b; i<e; i++) {
char c1 = input.charAt(mymatch.index+i-b);
char c2 = input.charAt(i);
if (c1 != c2) {
if (insens) {
- if (c1 != Character.toLowerCase(c2) &&
- c1 != Character.toUpperCase(c2)) {
+ if (c1 != toLowerCase(c2, unicodeAware) &&
+ c1 != toUpperCase(c2, unicodeAware)) {
return null;
}
}
diff --git a/gnu/regexp/RETokenChar.java b/gnu/regexp/RETokenChar.java
index 1b29727f3..1b3a74855 100644
--- a/gnu/regexp/RETokenChar.java
+++ b/gnu/regexp/RETokenChar.java
@@ -44,8 +44,9 @@ final class RETokenChar extends REToken {
RETokenChar(int subIndex, char c, boolean ins) {
super(subIndex);
+ insens = ins;
ch = new char [1];
- ch[0] = (insens = ins) ? Character.toLowerCase(c) : c;
+ ch[0] = c;
}
int getMinimumLength() {
@@ -70,13 +71,21 @@ final class RETokenChar extends REToken {
char c;
for (int i=0; i<z; i++) {
c = input.charAt(index+i);
- if (( (insens) ? Character.toLowerCase(c) : c ) != ch[i]) {
+ if (! charEquals(c, ch[i])) {
return false;
}
}
return true;
}
+ private boolean charEquals(char c1, char c2) {
+ if (c1 == c2) return true;
+ if (! insens) return false;
+ if (toLowerCase(c1, unicodeAware) == c2) return true;
+ if (toUpperCase(c1, unicodeAware) == c2) return true;
+ return false;
+ }
+
boolean returnsFixedLengthMatches() { return true; }
int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
diff --git a/gnu/regexp/RETokenEndOfPreviousMatch.java b/gnu/regexp/RETokenEndOfPreviousMatch.java
new file mode 100644
index 000000000..167d10b5f
--- /dev/null
+++ b/gnu/regexp/RETokenEndOfPreviousMatch.java
@@ -0,0 +1,72 @@
+/* gnu/regexp/RETokenEndOfPreviousMatch.java
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.regexp;
+
+class RETokenEndOfPreviousMatch extends RETokenStart {
+
+ RETokenEndOfPreviousMatch(int subIndex) {
+ super(subIndex, null);
+ }
+
+ int getMaximumLength() {
+ return 0;
+ }
+
+ REMatch matchThis(CharIndexed input, REMatch mymatch) {
+ REMatch lastMatch = input.getLastMatch();
+ if (lastMatch == null) return super.matchThis(input, mymatch);
+ if (input.getAnchor()+mymatch.index ==
+ lastMatch.anchor+lastMatch.index) {
+ return mymatch;
+ }
+ else {
+ return null;
+ }
+ }
+
+ boolean returnsFixedLengthmatches() { return true; }
+
+ int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
+ if (matchThis(input, mymatch) != null) return max;
+ else return 0;
+ }
+
+ void dump(StringBuffer os) {
+ os.append("\\G");
+ }
+}
diff --git a/gnu/regexp/RETokenEndSub.java b/gnu/regexp/RETokenEndSub.java
index 6421c7f74..fca01c7f3 100644
--- a/gnu/regexp/RETokenEndSub.java
+++ b/gnu/regexp/RETokenEndSub.java
@@ -47,11 +47,13 @@ final class RETokenEndSub extends REToken {
}
REMatch matchThis(CharIndexed input, REMatch mymatch) {
+ mymatch.start[subIndex] = mymatch.start1[subIndex];
mymatch.end[subIndex] = mymatch.index;
return mymatch;
}
REMatch findMatch(CharIndexed input, REMatch mymatch) {
+ mymatch.start[subIndex] = mymatch.start1[subIndex];
mymatch.end[subIndex] = mymatch.index;
return super.findMatch(input, mymatch);
}
diff --git a/gnu/regexp/RETokenLookAhead.java b/gnu/regexp/RETokenLookAhead.java
index a191dde75..009872c2f 100644
--- a/gnu/regexp/RETokenLookAhead.java
+++ b/gnu/regexp/RETokenLookAhead.java
@@ -61,7 +61,8 @@ final class RETokenLookAhead extends REToken
REMatch trymatch = (REMatch)mymatch.clone();
if (re.match(input, trymatch)) {
if (negative) return null;
- return mymatch;
+ trymatch.index = mymatch.index;
+ return trymatch;
}
else {
if (negative) return mymatch;
diff --git a/gnu/regexp/RETokenLookBehind.java b/gnu/regexp/RETokenLookBehind.java
index 30338b3b2..8311d1a7a 100644
--- a/gnu/regexp/RETokenLookBehind.java
+++ b/gnu/regexp/RETokenLookBehind.java
@@ -62,14 +62,26 @@ final class RETokenLookBehind extends REToken
REMatch trymatch = (REMatch)mymatch.clone();
REMatch trymatch1 = (REMatch)mymatch.clone();
REMatch newMatch = null;
- int curIndex = trymatch.index + behind.length() - input.length();
+ int diff = behind.length() - input.length();
+ int curIndex = trymatch.index + diff;
trymatch.index = 0;
+ trymatch.offset = 0;
RETokenMatchHereOnly stopper = new RETokenMatchHereOnly(curIndex);
REToken re1 = (REToken) re.clone();
re1.chain(stopper);
if (re1.match(behind, trymatch)) {
if (negative) return null;
- return mymatch;
+ for (int i = 0; i < trymatch.start.length; i++) {
+ if (trymatch.start[i] != -1 && trymatch.end[i] != -1) {
+ trymatch.start[i] -= diff;
+ if (trymatch.start[i] < 0) trymatch.start[i] -= 1;
+ trymatch.end[i] -= diff;
+ if (trymatch.end[i] < 0) trymatch.end[i] -= 1;
+ }
+ }
+ trymatch.index = mymatch.index;
+ trymatch.offset = mymatch.offset;
+ return trymatch;
}
else {
if (negative) return mymatch;
diff --git a/gnu/regexp/RETokenNamedProperty.java b/gnu/regexp/RETokenNamedProperty.java
index e9ae00428..6147e87dc 100644
--- a/gnu/regexp/RETokenNamedProperty.java
+++ b/gnu/regexp/RETokenNamedProperty.java
@@ -122,8 +122,8 @@ final class RETokenNamedProperty extends REToken {
boolean retval = handler.includes(ch);
if (insens) {
retval = retval ||
- handler.includes(Character.toUpperCase(ch)) ||
- handler.includes(Character.toLowerCase(ch));
+ handler.includes(toUpperCase(ch, unicodeAware)) ||
+ handler.includes(toLowerCase(ch, unicodeAware));
}
if (negate) retval = !retval;
diff --git a/gnu/regexp/RETokenRange.java b/gnu/regexp/RETokenRange.java
index 94a775dc0..9d3da324e 100644
--- a/gnu/regexp/RETokenRange.java
+++ b/gnu/regexp/RETokenRange.java
@@ -69,10 +69,10 @@ final class RETokenRange extends REToken {
if (c == CharIndexed.OUT_OF_BOUNDS) return false;
boolean matches = (c >= lo) && (c <= hi);
if (! matches && insens) {
- char c1 = Character.toLowerCase(c);
+ char c1 = toLowerCase(c, unicodeAware);
matches = (c1 >= lo) && (c1 <= hi);
if (!matches) {
- c1 = Character.toUpperCase(c);
+ c1 = toUpperCase(c, unicodeAware);
matches = (c1 >= lo) && (c1 <= hi);
}
}
diff --git a/gnu/xml/dom/DomDocument.java b/gnu/xml/dom/DomDocument.java
index 900d03ac3..5d06a428b 100644
--- a/gnu/xml/dom/DomDocument.java
+++ b/gnu/xml/dom/DomDocument.java
@@ -150,6 +150,14 @@ public class DomDocument
}
/**
+ * Sets whether to check for document characters.
+ */
+ public void setCheckingCharacters(boolean flag)
+ {
+ checkingCharacters = flag;
+ }
+
+ /**
* <b>DOM L1</b>
* Returns the constant "#document".
*/
@@ -235,6 +243,18 @@ public class DomDocument
if (current.getNodeType() == ELEMENT_NODE)
{
DomElement element = (DomElement) current;
+ if (element.userIdAttrs != null)
+ {
+ for (Iterator i = element.userIdAttrs.iterator();
+ i.hasNext(); )
+ {
+ Node idAttr = (Node) i.next();
+ if (id.equals(idAttr.getNodeValue()))
+ {
+ return element;
+ }
+ }
+ }
if (doctype != null)
{
DTDElementTypeInfo info =
@@ -244,18 +264,6 @@ public class DomDocument
{
return element;
}
- else if (element.userIdAttrs != null)
- {
- for (Iterator i = element.userIdAttrs.iterator();
- i.hasNext(); )
- {
- Node idAttr = (Node) i.next();
- if (id.equals(idAttr.getNodeValue()))
- {
- return element;
- }
- }
- }
}
// xml:id
String xmlId = element.getAttribute("xml:id");
@@ -535,11 +543,9 @@ public class DomDocument
int index = name.indexOf(':');
if (index != -1)
{
- if (index == 0 || index == (len - 1) ||
- name.lastIndexOf(':') != index)
+ if (index == 0 || index == (len - 1) || name.lastIndexOf(':') != index)
{
- throw new DomDOMException(DOMException.NAMESPACE_ERR,
- name, null, 0);
+ throw new DomDOMException(DOMException.NAMESPACE_ERR, name, null, 0);
}
}
}
diff --git a/gnu/xml/dom/DomNode.java b/gnu/xml/dom/DomNode.java
index 93f7c6f64..c06a4c1f1 100644
--- a/gnu/xml/dom/DomNode.java
+++ b/gnu/xml/dom/DomNode.java
@@ -1120,7 +1120,6 @@ public abstract class DomNode
node.appendChild(newChild);
}
}
-
if (nodeType == ENTITY_REFERENCE_NODE)
{
node.makeReadonly();
@@ -1556,23 +1555,30 @@ public abstract class DomNode
ancestorLen = ancestors.length;
}
- // XXX autogrow ancestors ... based on statistics
-
// Climb to the top of this subtree and handle capture, letting
// each node (from the top down) capture until one stops it or
// until we get to this one.
-
- for (index = 0, current = parent;
- current != null && index < ancestorLen;
- index++, current = current.parent)
+ current = parent;
+ if (current.depth >= ANCESTORS_INIT)
{
+ DomNode[] newants = new DomNode[current.depth + 1];
+ System.arraycopy(ancestors, 0, newants, 0, ancestors.length);
+ ancestors = newants;
+ ancestorLen = ancestors.length;
+ }
+ for (index = 0; index < ancestorLen; index++)
+ {
+ if (current == null || current.depth == 0)
+ break;
+
if (current.nListeners != 0)
{
haveAncestorRegistrations = true;
}
ancestors [index] = current;
+ current = current.parent;
}
- if (current != null)
+ if (current.depth > 0)
{
throw new RuntimeException("dispatchEvent capture stack size");
}
diff --git a/gnu/xml/dom/DomNodeIterator.java b/gnu/xml/dom/DomNodeIterator.java
index 6079f7a12..8001556e5 100644
--- a/gnu/xml/dom/DomNodeIterator.java
+++ b/gnu/xml/dom/DomNodeIterator.java
@@ -137,9 +137,10 @@ public class DomNodeIterator
{
ret = current.getNextSibling();
}
+ current = (ret == null) ? current : ret;
}
while (!accept(ret));
- current = (ret == null) ? current : ret;
+
return ret;
}
diff --git a/gnu/xml/dom/html2/DomHTMLAppletElement.java b/gnu/xml/dom/html2/DomHTMLAppletElement.java
index 8ec4d3c83..918cf0d92 100644
--- a/gnu/xml/dom/html2/DomHTMLAppletElement.java
+++ b/gnu/xml/dom/html2/DomHTMLAppletElement.java
@@ -65,6 +65,26 @@ public class DomHTMLAppletElement
setHTMLAttribute("align", align);
}
+ public String getCls()
+ {
+ return getHTMLAttribute("class");
+ }
+
+ public void setCls(String cls)
+ {
+ setHTMLAttribute("class", cls);
+ }
+
+ public String getSrc()
+ {
+ return getHTMLAttribute("src");
+ }
+
+ public void setSrc(String src)
+ {
+ setHTMLAttribute("src", src);
+ }
+
public String getAlt()
{
return getHTMLAttribute("alt");
@@ -164,6 +184,5 @@ public class DomHTMLAppletElement
{
setHTMLAttribute("width", width);
}
-
}
diff --git a/gnu/xml/dom/html2/DomHTMLDocument.java b/gnu/xml/dom/html2/DomHTMLDocument.java
index 10ee9e747..d45c1b223 100644
--- a/gnu/xml/dom/html2/DomHTMLDocument.java
+++ b/gnu/xml/dom/html2/DomHTMLDocument.java
@@ -87,6 +87,7 @@ public class DomHTMLDocument
map.put("dir", DomHTMLDirectoryElement.class);
map.put("div", DomHTMLDivElement.class);
map.put("dlist", DomHTMLDListElement.class);
+ map.put("embed", DomHTMLEmbedElement.class);
map.put("fieldset", DomHTMLFieldSetElement.class);
map.put("font", DomHTMLFontElement.class);
map.put("form", DomHTMLFormElement.class);
@@ -311,6 +312,7 @@ public class DomHTMLDocument
public HTMLCollection getApplets()
{
DomHTMLCollection ret = new DomHTMLCollection(this, this);
+ ret.addNodeName("embed");
ret.addNodeName("object");
ret.addNodeName("applet");
ret.evaluate();
diff --git a/gnu/xml/dom/html2/DomHTMLEmbedElement.java b/gnu/xml/dom/html2/DomHTMLEmbedElement.java
new file mode 100644
index 000000000..1ae081c28
--- /dev/null
+++ b/gnu/xml/dom/html2/DomHTMLEmbedElement.java
@@ -0,0 +1,129 @@
+/* DomHTMLEmbedElement.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.xml.dom.html2;
+
+public class DomHTMLEmbedElement
+ extends DomHTMLAppletElement
+{
+ protected DomHTMLEmbedElement(DomHTMLDocument owner, String namespaceURI,
+ String name)
+ {
+ super(owner, namespaceURI, name);
+ }
+
+ public String getJavaObject()
+ {
+ return getHTMLAttribute("java_object");
+ }
+
+ public void setJavaObject(String object)
+ {
+ setHTMLAttribute("java_object", object);
+ }
+
+ public String getJavaCodeBase()
+ {
+ return getHTMLAttribute("java_codebase");
+ }
+
+ public void setJavaCodeBase(String codeBase)
+ {
+ setHTMLAttribute("java_codebase", codeBase);
+ }
+
+ public String getJavaArchive()
+ {
+ return getHTMLAttribute("java_archive");
+ }
+
+ public void setJavaArchive(String archive)
+ {
+ setHTMLAttribute("java_archive", archive);
+ }
+
+ public void setJavaCode(String code)
+ {
+ setHTMLAttribute("java_code", code);
+ }
+
+ public String getJavaCode()
+ {
+ return getHTMLAttribute("java_code");
+ }
+
+ public void setJavaType(String type)
+ {
+ setHTMLAttribute("java_type", type);
+ }
+
+ public String getJavaType()
+ {
+ return getHTMLAttribute("java_type");
+ }
+
+ public void setType(String type)
+ {
+ setHTMLAttribute("type", type);
+ }
+
+ public String getType()
+ {
+ return getHTMLAttribute("type");
+ }
+
+ public String getPluginsPage()
+ {
+ return getHTMLAttribute("pluginspage");
+ }
+
+ public void setPluginsPage(String pluginspage)
+ {
+ setHTMLAttribute("pluginspage", pluginspage);
+ }
+
+ public String getMayscript()
+ {
+ return getHTMLAttribute("mayscript");
+ }
+
+ public void setMayscript(String mayscript)
+ {
+ setHTMLAttribute("mayscript", mayscript);
+ }
+}
diff --git a/gnu/xml/dom/html2/DomHTMLObjectElement.java b/gnu/xml/dom/html2/DomHTMLObjectElement.java
index fdea9b153..9bb621122 100644
--- a/gnu/xml/dom/html2/DomHTMLObjectElement.java
+++ b/gnu/xml/dom/html2/DomHTMLObjectElement.java
@@ -72,6 +72,36 @@ public class DomHTMLObjectElement
setHTMLAttribute("code", code);
}
+ public String getJavaCode()
+ {
+ return getHTMLAttribute("java_code");
+ }
+
+ public void setJavaCode(String code)
+ {
+ setHTMLAttribute("java_code", code);
+ }
+
+ public String getObject()
+ {
+ return getHTMLAttribute("object");
+ }
+
+ public void setObject(String obj)
+ {
+ setHTMLAttribute("object", obj);
+ }
+
+ public String getJavaObject()
+ {
+ return getHTMLAttribute("java_object");
+ }
+
+ public void setJavaObject(String obj)
+ {
+ setHTMLAttribute("java_object", obj);
+ }
+
public String getAlign()
{
return getHTMLAttribute("align");
@@ -92,6 +122,16 @@ public class DomHTMLObjectElement
setHTMLAttribute("archive", archive);
}
+ public String getJavaArchive()
+ {
+ return getHTMLAttribute("java_archive");
+ }
+
+ public void setJavaArchive(String archive)
+ {
+ setHTMLAttribute("java_archive", archive);
+ }
+
public String getBorder()
{
return getHTMLAttribute("border");
@@ -112,6 +152,16 @@ public class DomHTMLObjectElement
setHTMLAttribute("codebase", codeBase);
}
+ public String getJavaCodeBase()
+ {
+ return getHTMLAttribute("java_codebase");
+ }
+
+ public void setJavaCodeBase(String codeBase)
+ {
+ setHTMLAttribute("java_codebase", codeBase);
+ }
+
public String getCodeType()
{
return getHTMLAttribute("codetype");
@@ -202,6 +252,16 @@ public class DomHTMLObjectElement
setHTMLAttribute("type", type);
}
+ public String getJavaType()
+ {
+ return getHTMLAttribute("java_type");
+ }
+
+ public void setJavaType(String type)
+ {
+ setHTMLAttribute("java_type", type);
+ }
+
public String getUseMap()
{
return getHTMLAttribute("usemap");
@@ -238,5 +298,24 @@ public class DomHTMLObjectElement
return null;
}
+ public void setMayscript(String may)
+ {
+ setHTMLAttribute("mayscript", may);
+ }
+
+ public String getMayscript()
+ {
+ return getHTMLAttribute("mayscript");
+ }
+
+ public void setScriptable(String scr)
+ {
+ setHTMLAttribute("scriptable", scr);
+ }
+
+ public String getScriptable()
+ {
+ return getHTMLAttribute("scriptable");
+ }
}
diff --git a/gnu/xml/dom/html2/DomHTMLParser.java b/gnu/xml/dom/html2/DomHTMLParser.java
index 7b4456225..2d329fd4c 100644
--- a/gnu/xml/dom/html2/DomHTMLParser.java
+++ b/gnu/xml/dom/html2/DomHTMLParser.java
@@ -124,9 +124,11 @@ public class DomHTMLParser
try
{
document = new DomHTMLDocument();
-
+ document.setCheckWellformedness(false);
+ document.setCheckingCharacters(false);
+
cursor = document;
-
+
parse(input);
DomHTMLDocument h = document;
@@ -224,7 +226,6 @@ public class DomHTMLParser
open.addFirst(close);
close = close.getParentNode();
}
-
if (close == null)
cursor = document;
else
@@ -235,9 +236,8 @@ public class DomHTMLParser
while (iter.hasNext())
{
Node item = (Node) iter.next();
- Node copy = item.cloneNode(true);
- cursor.appendChild(copy);
- cursor = copy;
+ cursor.appendChild(item);
+ cursor = item;
}
}
}
diff --git a/gnu/xml/stream/XMLParser.java b/gnu/xml/stream/XMLParser.java
index a8036bbd2..87096eecf 100644
--- a/gnu/xml/stream/XMLParser.java
+++ b/gnu/xml/stream/XMLParser.java
@@ -3534,7 +3534,7 @@ public class XMLParser
public static boolean isXML11Char(int c)
{
return ((c >= 0x0001 && c <= 0xD7FF) ||
- (c >= 0xE000 && c < 0xFFFD) || // NB exclude 0xfffd
+ (c >= 0xE000 && c < 0xFFFE) ||
(c >= 0x10000 && c <= 0x10FFFF));
}
@@ -4014,7 +4014,7 @@ public class XMLParser
public static boolean isChar(int c)
{
return (c >= 0x20 && c < 0xd800) ||
- (c >= 0xe00 && c < 0xfffd) || // NB exclude 0xfffd
+ (c >= 0xe00 && c < 0xfffe) ||
(c >= 0x10000 && c < 0x110000) ||
c == 0xa || c == 0x9 || c == 0xd;
}
diff --git a/gnu/xml/validation/relaxng/RELAXNGSchemaFactory.java b/gnu/xml/validation/relaxng/RELAXNGSchemaFactory.java
index e1eb758ea..890ca8eeb 100644
--- a/gnu/xml/validation/relaxng/RELAXNGSchemaFactory.java
+++ b/gnu/xml/validation/relaxng/RELAXNGSchemaFactory.java
@@ -51,6 +51,7 @@ import javax.xml.validation.SchemaFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ls.LSResourceResolver;
+import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@@ -64,6 +65,7 @@ public class RELAXNGSchemaFactory
{
LSResourceResolver resourceResolver;
+ ErrorHandler errorHandler;
public LSResourceResolver getResourceResolver()
{
@@ -73,6 +75,16 @@ public class RELAXNGSchemaFactory
public void setResourceResolver(LSResourceResolver resourceResolver)
{
this.resourceResolver = resourceResolver;
+ }
+
+ public ErrorHandler getErrorHandler()
+ {
+ return this.errorHandler;
+ }
+
+ public void setErrorHandler(ErrorHandler errorHandler)
+ {
+ this.errorHandler = errorHandler;
}
public boolean isSchemaLanguageSupported(String schemaLanguage)
diff --git a/gnu/xml/validation/xmlschema/XMLSchemaSchemaFactory.java b/gnu/xml/validation/xmlschema/XMLSchemaSchemaFactory.java
index b37ae5431..2b985a28c 100644
--- a/gnu/xml/validation/xmlschema/XMLSchemaSchemaFactory.java
+++ b/gnu/xml/validation/xmlschema/XMLSchemaSchemaFactory.java
@@ -52,6 +52,7 @@ import org.relaxng.datatype.DatatypeException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ls.LSResourceResolver;
+import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@@ -65,6 +66,7 @@ public class XMLSchemaSchemaFactory
{
LSResourceResolver resourceResolver;
+ ErrorHandler errorHandler;
public LSResourceResolver getResourceResolver()
{
@@ -75,6 +77,17 @@ public class XMLSchemaSchemaFactory
{
this.resourceResolver = resourceResolver;
}
+
+ public ErrorHandler getErrorHandler()
+ {
+ return this.errorHandler;
+ }
+
+ public void setErrorHandler(ErrorHandler errorHandler)
+ {
+ this.errorHandler = errorHandler;
+ }
+
public boolean isSchemaLanguageSupported(String schemaLanguage)
{
diff --git a/include/Makefile.am b/include/Makefile.am
index 0517e125a..5cda78e88 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -117,8 +117,9 @@ $(SOUND_H_FILES) \
$(XMLJ_H_FILES) \
$(GTKPEER_H_FILES) \
$(QTPEER_H_FILES) \
-$(top_srcdir)/include/gnu_java_net_PlainDatagramSocketImpl.h \
-$(top_srcdir)/include/gnu_java_net_PlainSocketImpl.h \
+$(top_srcdir)/include/gnu_java_net_VMPlainDatagramSocketImpl.h \
+$(top_srcdir)/include/gnu_java_net_VMPlainSocketImpl.h \
+$(top_srcdir)/include/gnu_java_net_local_LocalSocketImpl.h \
$(top_srcdir)/include/gnu_java_nio_VMPipe.h \
$(top_srcdir)/include/gnu_java_nio_VMSelector.h \
$(top_srcdir)/include/gnu_java_nio_channels_FileChannelImpl.h \
@@ -132,7 +133,7 @@ $(top_srcdir)/include/java_lang_VMFloat.h \
$(top_srcdir)/include/java_lang_VMMath.h \
$(top_srcdir)/include/java_lang_VMProcess.h \
$(top_srcdir)/include/java_lang_VMSystem.h \
-$(top_srcdir)/include/java_lang_reflect_Array.h \
+$(top_srcdir)/include/java_lang_reflect_VMArray.h \
$(top_srcdir)/include/java_net_VMInetAddress.h \
$(top_srcdir)/include/java_net_VMNetworkInterface.h \
$(top_srcdir)/include/java_nio_VMDirectByteBuffer.h \
@@ -164,10 +165,12 @@ $(top_srcdir)/include/gnu_javax_sound_midi_alsa_%.h: $(top_builddir)/$(CLASSDIR)
$(top_srcdir)/include/gnu_javax_sound_midi_dssi_%.h: $(top_builddir)/$(CLASSDIR)/gnu/javax/sound/midi/dssi/%.class
$(JAVAH) -o $@ gnu.javax.sound.midi.dssi.$*
-$(top_srcdir)/include/gnu_java_net_PlainDatagramSocketImpl.h: $(top_srcdir)/gnu/java/net/PlainDatagramSocketImpl.java
- $(JAVAH) -o $@ gnu.java.net.PlainDatagramSocketImpl
-$(top_srcdir)/include/gnu_java_net_PlainSocketImpl.h: $(top_srcdir)/gnu/java/net/PlainSocketImpl.java
- $(JAVAH) -o $@ gnu.java.net.PlainSocketImpl
+$(top_srcdir)/include/gnu_java_net_VMPlainDatagramSocketImpl.h: $(top_srcdir)/vm/reference/gnu/java/net/VMPlainDatagramSocketImpl.java
+ $(JAVAH) -o $@ gnu.java.net.VMPlainDatagramSocketImpl
+$(top_srcdir)/include/gnu_java_net_VMPlainSocketImpl.h: $(top_srcdir)/vm/reference/gnu/java/net/VMPlainSocketImpl.java
+ $(JAVAH) -o $@ gnu.java.net.VMPlainSocketImpl
+$(top_srcdir)/include/gnu_java_net_local_LocalSocketImpl.h: $(top_srcdir)/gnu/java/net/local/LocalSocketImpl.java
+ $(JAVAH) -o $@ gnu.java.net.local.LocalSocketImpl
$(top_srcdir)/include/gnu_java_nio_VMPipe.h: $(top_srcdir)/vm/reference/gnu/java/nio/VMPipe.java
$(JAVAH) -o $@ gnu.java.nio.VMPipe
$(top_srcdir)/include/gnu_java_nio_VMSelector.h: $(top_srcdir)/vm/reference/gnu/java/nio/VMSelector.java
@@ -188,8 +191,8 @@ $(top_srcdir)/include/java_lang_VMProcess.h: $(top_srcdir)/vm/reference/java/lan
$(JAVAH) -o $@ java.lang.VMProcess
$(top_srcdir)/include/java_lang_VMSystem.h: $(top_srcdir)/vm/reference/java/lang/VMSystem.java
$(JAVAH) -o $@ java.lang.VMSystem
-$(top_srcdir)/include/java_lang_reflect_Array.h: $(top_srcdir)/java/lang/reflect/Array.java
- $(JAVAH) -o $@ java.lang.reflect.Array
+$(top_srcdir)/include/java_lang_reflect_VMArray.h: $(top_srcdir)/vm/reference/java/lang/reflect/VMArray.java
+ $(JAVAH) -o $@ java.lang.reflect.VMArray
$(top_srcdir)/include/java_net_VMInetAddress.h: $(top_srcdir)/vm/reference/java/net/VMInetAddress.java
$(JAVAH) -o $@ java.net.VMInetAddress
$(top_srcdir)/include/java_net_VMNetworkInterface.h: $(top_srcdir)/vm/reference/java/net/VMNetworkInterface.java
diff --git a/include/gnu_java_awt_peer_gtk_GtkCanvasPeer.h b/include/gnu_java_awt_peer_gtk_GtkCanvasPeer.h
index e774713a7..44ab6870c 100644
--- a/include/gnu_java_awt_peer_gtk_GtkCanvasPeer.h
+++ b/include/gnu_java_awt_peer_gtk_GtkCanvasPeer.h
@@ -11,6 +11,7 @@ extern "C"
#endif
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_create (JNIEnv *env, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_realize (JNIEnv *env, jobject);
#ifdef __cplusplus
}
diff --git a/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h b/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h
index da86e23a8..207e08d05 100644
--- a/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h
+++ b/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h
@@ -18,8 +18,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetD
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions (JNIEnv *env, jobject, jintArray);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWindowGetLocationOnScreen (JNIEnv *env, jobject, jintArray);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetLocationOnScreen (JNIEnv *env, jobject, jintArray);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor (JNIEnv *env, jobject, jint);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked (JNIEnv *env, jobject, jint);
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor (JNIEnv *env, jobject, jint, jobject, jint, jint);
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked (JNIEnv *env, jobject, jint, jobject, jint, jint);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetBackground (JNIEnv *env, jobject, jint, jint, jint);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetForeground (JNIEnv *env, jobject, jint, jint, jint);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetSensitive (JNIEnv *env, jobject, jboolean);
diff --git a/include/gnu_java_net_VMPlainDatagramSocketImpl.h b/include/gnu_java_net_VMPlainDatagramSocketImpl.h
index 616c75300..2bd1f4905 100644
--- a/include/gnu_java_net_VMPlainDatagramSocketImpl.h
+++ b/include/gnu_java_net_VMPlainDatagramSocketImpl.h
@@ -1,95 +1,30 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
+
+#ifndef __gnu_java_net_VMPlainDatagramSocketImpl__
+#define __gnu_java_net_VMPlainDatagramSocketImpl__
+
#include <jni.h>
-/* Header for class gnu_java_net_VMPlainDatagramSocketImpl */
-#ifndef _Included_gnu_java_net_VMPlainDatagramSocketImpl
-#define _Included_gnu_java_net_VMPlainDatagramSocketImpl
#ifdef __cplusplus
-extern "C" {
+extern "C"
+{
#endif
+
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_bind (JNIEnv *env, jclass, jobject, jint, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_create (JNIEnv *env, jclass, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_connect (JNIEnv *env, jclass, jobject, jobject, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeSendTo (JNIEnv *env, jclass, jobject, jobject, jint, jbyteArray, jint, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeReceive (JNIEnv *env, jclass, jobject, jbyteArray, jint, jint, jbyteArray, jintArray, jintArray);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_setOption (JNIEnv *env, jclass, jobject, jint, jobject);
+JNIEXPORT jobject JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_getOption (JNIEnv *env, jclass, jobject, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_close (JNIEnv *env, jclass, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_join (JNIEnv *env, jclass, jobject, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_leave (JNIEnv *env, jclass, jobject, jobject);
#undef gnu_java_net_VMPlainDatagramSocketImpl_IP_TTL
#define gnu_java_net_VMPlainDatagramSocketImpl_IP_TTL 7777L
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: bind
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;ILjava/net/InetAddress;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_bind
- (JNIEnv *, jclass, jobject, jint, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: create
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_create
- (JNIEnv *, jclass, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: connect
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;Ljava/net/InetAddress;I)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_connect
- (JNIEnv *, jclass, jobject, jobject, jint);
-
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: nativeSendTo
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;Ljava/net/InetAddress;I[BII)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeSendTo
- (JNIEnv *, jclass, jobject, jobject, jint, jbyteArray, jint, jint);
-
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: nativeReceive
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;[BII[B[I[I)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_nativeReceive
- (JNIEnv *, jclass, jobject, jbyteArray, jint, jint, jbyteArray, jintArray, jintArray);
-
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: setOption
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;ILjava/lang/Object;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_setOption
- (JNIEnv *, jclass, jobject, jint, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: getOption
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;I)Ljava/lang/Object;
- */
-JNIEXPORT jobject JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_getOption
- (JNIEnv *, jclass, jobject, jint);
-
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: close
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_close
- (JNIEnv *, jclass, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: join
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;Ljava/net/InetAddress;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_join
- (JNIEnv *, jclass, jobject, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainDatagramSocketImpl
- * Method: leave
- * Signature: (Lgnu/java/net/PlainDatagramSocketImpl;Ljava/net/InetAddress;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainDatagramSocketImpl_leave
- (JNIEnv *, jclass, jobject, jobject);
#ifdef __cplusplus
}
#endif
-#endif
+
+#endif /* __gnu_java_net_VMPlainDatagramSocketImpl__ */
diff --git a/include/gnu_java_net_VMPlainSocketImpl.h b/include/gnu_java_net_VMPlainSocketImpl.h
index 1e22aefbd..f7616c2c3 100644
--- a/include/gnu_java_net_VMPlainSocketImpl.h
+++ b/include/gnu_java_net_VMPlainSocketImpl.h
@@ -1,117 +1,31 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
+
+#ifndef __gnu_java_net_VMPlainSocketImpl__
+#define __gnu_java_net_VMPlainSocketImpl__
+
#include <jni.h>
-/* Header for class gnu_java_net_VMPlainSocketImpl */
-#ifndef _Included_gnu_java_net_VMPlainSocketImpl
-#define _Included_gnu_java_net_VMPlainSocketImpl
#ifdef __cplusplus
-extern "C" {
+extern "C"
+{
#endif
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: setOption
- * Signature: (Lgnu/java/net/PlainSocketImpl;ILjava/lang/Object;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_setOption
- (JNIEnv *, jclass, jobject, jint, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: getOption
- * Signature: (Lgnu/java/net/PlainSocketImpl;I)Ljava/lang/Object;
- */
-JNIEXPORT jobject JNICALL Java_gnu_java_net_VMPlainSocketImpl_getOption
- (JNIEnv *, jclass, jobject, jint);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: create
- * Signature: (Lgnu/java/net/PlainSocketImpl;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_create
- (JNIEnv *, jclass, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: connect
- * Signature: (Lgnu/java/net/PlainSocketImpl;Ljava/net/InetAddress;I)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_connect
- (JNIEnv *, jclass, jobject, jobject, jint);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: bind
- * Signature: (Lgnu/java/net/PlainSocketImpl;Ljava/net/InetAddress;I)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_bind
- (JNIEnv *, jclass, jobject, jobject, jint);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: listen
- * Signature: (Lgnu/java/net/PlainSocketImpl;I)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_listen
- (JNIEnv *, jclass, jobject, jint);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: accept
- * Signature: (Lgnu/java/net/PlainSocketImpl;Ljava/net/SocketImpl;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_accept
- (JNIEnv *, jclass, jobject, jobject);
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: available
- * Signature: (Lgnu/java/net/PlainSocketImpl;)I
- */
-JNIEXPORT jint JNICALL Java_gnu_java_net_VMPlainSocketImpl_available
- (JNIEnv *, jclass, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: close
- * Signature: (Lgnu/java/net/PlainSocketImpl;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_close
- (JNIEnv *, jclass, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: read
- * Signature: (Lgnu/java/net/PlainSocketImpl;[BII)I
- */
-JNIEXPORT jint JNICALL Java_gnu_java_net_VMPlainSocketImpl_read
- (JNIEnv *, jclass, jobject, jbyteArray, jint, jint);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: write
- * Signature: (Lgnu/java/net/PlainSocketImpl;[BII)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_write
- (JNIEnv *, jclass, jobject, jbyteArray, jint, jint);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: shutdownInput
- * Signature: (Lgnu/java/net/PlainSocketImpl;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_shutdownInput
- (JNIEnv *, jclass, jobject);
-
-/*
- * Class: gnu_java_net_VMPlainSocketImpl
- * Method: shutdownOutput
- * Signature: (Lgnu/java/net/PlainSocketImpl;)V
- */
-JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_shutdownOutput
- (JNIEnv *, jclass, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_setOption (JNIEnv *env, jclass, jobject, jint, jobject);
+JNIEXPORT jobject JNICALL Java_gnu_java_net_VMPlainSocketImpl_getOption (JNIEnv *env, jclass, jobject, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_create (JNIEnv *env, jclass, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_connect (JNIEnv *env, jclass, jobject, jobject, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_bind (JNIEnv *env, jclass, jobject, jobject, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_listen (JNIEnv *env, jclass, jobject, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_accept (JNIEnv *env, jclass, jobject, jobject);
+JNIEXPORT jint JNICALL Java_gnu_java_net_VMPlainSocketImpl_available (JNIEnv *env, jclass, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_close (JNIEnv *env, jclass, jobject);
+JNIEXPORT jint JNICALL Java_gnu_java_net_VMPlainSocketImpl_read (JNIEnv *env, jclass, jobject, jbyteArray, jint, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_write (JNIEnv *env, jclass, jobject, jbyteArray, jint, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_shutdownInput (JNIEnv *env, jclass, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_VMPlainSocketImpl_shutdownOutput (JNIEnv *env, jclass, jobject);
#ifdef __cplusplus
}
#endif
-#endif
+
+#endif /* __gnu_java_net_VMPlainSocketImpl__ */
diff --git a/include/gnu_java_net_local_LocalSocketImpl.h b/include/gnu_java_net_local_LocalSocketImpl.h
new file mode 100644
index 000000000..3309053f1
--- /dev/null
+++ b/include/gnu_java_net_local_LocalSocketImpl.h
@@ -0,0 +1,31 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+
+#ifndef __gnu_java_net_local_LocalSocketImpl__
+#define __gnu_java_net_local_LocalSocketImpl__
+
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_create (JNIEnv *env, jobject, jboolean);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_listen (JNIEnv *env, jobject, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_accept (JNIEnv *env, jobject, jobject);
+JNIEXPORT jint JNICALL Java_gnu_java_net_local_LocalSocketImpl_available (JNIEnv *env, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_close (JNIEnv *env, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_sendUrgentData (JNIEnv *env, jobject, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_shutdownInput (JNIEnv *env, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_shutdownOutput (JNIEnv *env, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_unlink (JNIEnv *env, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_localBind (JNIEnv *env, jobject, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_localConnect (JNIEnv *env, jobject, jobject);
+JNIEXPORT jint JNICALL Java_gnu_java_net_local_LocalSocketImpl_read (JNIEnv *env, jobject, jbyteArray, jint, jint);
+JNIEXPORT void JNICALL Java_gnu_java_net_local_LocalSocketImpl_write (JNIEnv *env, jobject, jbyteArray, jint, jint);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gnu_java_net_local_LocalSocketImpl__ */
diff --git a/include/java_lang_VMProcess.h b/include/java_lang_VMProcess.h
index 3029f0d9c..22617816d 100644
--- a/include/java_lang_VMProcess.h
+++ b/include/java_lang_VMProcess.h
@@ -10,7 +10,7 @@ extern "C"
{
#endif
-JNIEXPORT void JNICALL Java_java_lang_VMProcess_nativeSpawn (JNIEnv *env, jobject, jobjectArray, jobjectArray, jobject);
+JNIEXPORT void JNICALL Java_java_lang_VMProcess_nativeSpawn (JNIEnv *env, jobject, jobjectArray, jobjectArray, jobject, jboolean);
JNIEXPORT jboolean JNICALL Java_java_lang_VMProcess_nativeReap (JNIEnv *env, jclass);
JNIEXPORT void JNICALL Java_java_lang_VMProcess_nativeKill (JNIEnv *env, jclass, jlong);
#undef java_lang_VMProcess_INITIAL
diff --git a/include/java_lang_VMSystem.h b/include/java_lang_VMSystem.h
index 4e085f8eb..11b89ba27 100644
--- a/include/java_lang_VMSystem.h
+++ b/include/java_lang_VMSystem.h
@@ -16,6 +16,7 @@ JNIEXPORT void JNICALL Java_java_lang_VMSystem_setIn (JNIEnv *env, jclass, jobje
JNIEXPORT void JNICALL Java_java_lang_VMSystem_setOut (JNIEnv *env, jclass, jobject);
JNIEXPORT void JNICALL Java_java_lang_VMSystem_setErr (JNIEnv *env, jclass, jobject);
JNIEXPORT jlong JNICALL Java_java_lang_VMSystem_currentTimeMillis (JNIEnv *env, jclass);
+JNIEXPORT jobject JNICALL Java_java_lang_VMSystem_environ (JNIEnv *env, jclass);
JNIEXPORT jstring JNICALL Java_java_lang_VMSystem_getenv (JNIEnv *env, jclass, jstring);
#ifdef __cplusplus
diff --git a/include/java_lang_reflect_Array.h b/include/java_lang_reflect_Array.h
deleted file mode 100644
index 4f7156f1e..000000000
--- a/include/java_lang_reflect_Array.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-#ifndef __java_lang_reflect_Array__
-#define __java_lang_reflect_Array__
-
-#include <jni.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-JNIEXPORT jobject JNICALL Java_java_lang_reflect_Array_createObjectArray (JNIEnv *env, jclass, jclass, jint);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __java_lang_reflect_Array__ */
diff --git a/include/java_lang_reflect_VMArray.h b/include/java_lang_reflect_VMArray.h
new file mode 100644
index 000000000..a92b6854c
--- /dev/null
+++ b/include/java_lang_reflect_VMArray.h
@@ -0,0 +1,19 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+
+#ifndef __java_lang_reflect_VMArray__
+#define __java_lang_reflect_VMArray__
+
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+JNIEXPORT jobject JNICALL Java_java_lang_reflect_VMArray_createObjectArray (JNIEnv *env, jclass, jclass, jint);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __java_lang_reflect_VMArray__ */
diff --git a/java/awt/AlphaComposite.java b/java/awt/AlphaComposite.java
index 435cfd054..92b9e09a6 100644
--- a/java/awt/AlphaComposite.java
+++ b/java/awt/AlphaComposite.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt;
+import gnu.java.awt.java2d.AlphaCompositeContext;
+
import java.awt.image.ColorModel;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -137,14 +139,25 @@ public final class AlphaComposite implements Composite
}
return a;
}
+
+ /**
+ * Creates a {@link CompositeContext} that can be used to perform
+ * compositing operations according to this AlphaComposite settings.
+ *
+ * @param srcColorModel the color model of the source raster
+ * @param dstColorModel the color model of the destination raster
+ * @param hints the rendering hints to use
+ *
+ * @return a {@link CompositeContext} that can be used to perform
+ * compositing operations according to this AlphaComposite settings
+ */
public CompositeContext createContext(ColorModel srcColorModel,
ColorModel dstColorModel,
RenderingHints hints)
{
- // XXX Implement. Sun uses undocumented implementation class
- // sun.java2d.SunCompositeContext.
- throw new Error("not implemented");
+ return new AlphaCompositeContext(this, srcColorModel, dstColorModel);
}
+
public float getAlpha()
{
return alpha;
diff --git a/java/awt/BasicStroke.java b/java/awt/BasicStroke.java
index 4eece75c9..bf111d080 100644
--- a/java/awt/BasicStroke.java
+++ b/java/awt/BasicStroke.java
@@ -38,6 +38,15 @@ exception statement from your version. */
package java.awt;
+import gnu.java.awt.java2d.CubicSegment;
+import gnu.java.awt.java2d.LineSegment;
+import gnu.java.awt.java2d.QuadSegment;
+import gnu.java.awt.java2d.Segment;
+
+import java.awt.geom.AffineTransform;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.PathIterator;
+import java.awt.geom.Point2D;
import java.util.Arrays;
/**
@@ -109,6 +118,8 @@ public class BasicStroke implements Stroke
/** The dash phase. */
private final float phase;
+ private Segment start, end;
+
/**
* Creates a new <code>BasicStroke</code> instance with the given attributes.
*
@@ -249,8 +260,12 @@ public class BasicStroke implements Stroke
*/
public Shape createStrokedShape(Shape s)
{
- // FIXME: Implement this
- throw new Error("not implemented");
+ PathIterator pi = s.getPathIterator( new AffineTransform() );
+
+ if( dash == null )
+ return solidStroke( pi );
+
+ return dashedStroke( pi );
}
/**
@@ -366,4 +381,355 @@ public class BasicStroke implements Stroke
return width == s.width && cap == s.cap && join == s.join
&& limit == s.limit && Arrays.equals(dash, s.dash) && phase == s.phase;
}
+
+ private Shape solidStroke(PathIterator pi)
+ {
+ double[] coords = new double[6];
+ double x, y, x0, y0;
+ boolean pathOpen = false;
+ GeneralPath output = new GeneralPath( );
+ Segment[] p;
+ x = x0 = y = y0 = 0;
+
+ while( !pi.isDone() )
+ {
+ switch( pi.currentSegment(coords) )
+ {
+ case PathIterator.SEG_MOVETO:
+ x0 = x = coords[0];
+ y0 = y = coords[1];
+ if( pathOpen )
+ {
+ capEnds();
+ convertPath(output, start);
+ start = end = null;
+ pathOpen = false;
+ }
+ break;
+
+ case PathIterator.SEG_LINETO:
+ p = (new LineSegment(x, y, coords[0], coords[1])).
+ getDisplacedSegments(width/2.0);
+ if( !pathOpen )
+ {
+ start = p[0];
+ end = p[1];
+ pathOpen = true;
+ }
+ else
+ addSegments(p);
+
+ x = coords[0];
+ y = coords[1];
+ break;
+
+ case PathIterator.SEG_QUADTO:
+ p = (new QuadSegment(x, y, coords[0], coords[1], coords[2],
+ coords[3])).getDisplacedSegments(width/2.0);
+ if( !pathOpen )
+ {
+ start = p[0];
+ end = p[1];
+ pathOpen = true;
+ }
+ else
+ addSegments(p);
+
+ x = coords[0];
+ y = coords[1];
+ break;
+
+ case PathIterator.SEG_CUBICTO:
+ p = new CubicSegment(x, y, coords[0], coords[1],
+ coords[2], coords[3],
+ coords[4], coords[5]).getDisplacedSegments(width/2.0);
+ if( !pathOpen )
+ {
+ start = p[0];
+ end = p[1];
+ pathOpen = true;
+ }
+ else
+ addSegments(p);
+
+ x = coords[0];
+ y = coords[1];
+ break;
+
+ case PathIterator.SEG_CLOSE:
+ p = (new LineSegment(x, y, x0, y0)).getDisplacedSegments(width/2.0);
+ addSegments(p);
+ convertPath(output, start);
+ convertPath(output, end);
+ start = end = null;
+ pathOpen = false;
+ break;
+ }
+ pi.next();
+ }
+
+ if( pathOpen )
+ {
+ capEnds();
+ convertPath(output, start);
+ }
+ return output;
+ }
+
+ private Shape dashedStroke(PathIterator pi)
+ {
+ GeneralPath out = new GeneralPath();
+ return out;
+ }
+
+ /**
+ * Cap the ends of the path (joining the start and end list of segments)
+ */
+ private void capEnds()
+ {
+ Segment returnPath = end.last;
+
+ end.reverseAll(); // reverse the path.
+ end = null;
+ capEnd(start, returnPath);
+ start.last = returnPath.last;
+ end = null;
+
+ capEnd(start, start);
+ }
+
+ /**
+ * Convert and add the linked list of Segments in s to a GeneralPath p.
+ */
+ private void convertPath(GeneralPath p, Segment s)
+ {
+ Segment v = s;
+ p.moveTo((float)s.P1.getX(), (float)s.P1.getY());
+
+ do
+ {
+ if(v instanceof LineSegment)
+ p.lineTo((float)v.P2.getX(), (float)v.P2.getY());
+ else if(v instanceof QuadSegment)
+ p.quadTo((float)((QuadSegment)v).cp.getX(),
+ (float)((QuadSegment)v).cp.getY(),
+ (float)v.P2.getX(),
+ (float)v.P2.getY());
+ else if(v instanceof CubicSegment)
+ p.curveTo((float)((CubicSegment)v).cp1.getX(),
+ (float)((CubicSegment)v).cp1.getY(),
+ (float)((CubicSegment)v).cp2.getX(),
+ (float)((CubicSegment)v).cp2.getY(),
+ (float)v.P2.getX(),
+ (float)v.P2.getY());
+ v = v.next;
+ } while(v != s && v != null);
+
+ p.closePath();
+ }
+
+ /**
+ * Add to segments to start and end, joining the outer pair and
+ */
+ private void addSegments(Segment[] segments)
+ {
+ double[] p0 = start.last.last();
+ double[] p1 = new double[]{start.last.P2.getX(), start.last.P2.getY()};
+ double[] p2 = new double[]{segments[0].P1.getX(), segments[0].P1.getY()};
+ double[] p3 = segments[0].first();
+ Point2D p;
+
+ double det = (p1[0] - p0[0])*(p3[1] - p2[1]) -
+ (p3[0] - p2[0])*(p1[1] - p0[1]);
+
+ if( det > 0 )
+ {
+ // start and segment[0] form the 'inner' part of a join,
+ // connect the overlapping segments
+ p = lineIntersection(p0[0],p0[1],p1[0],p1[1],p2[0],p2[1],p3[0],p3[1], false);
+ if( p == null )
+ {
+ // Dodgy.
+ start.add(new LineSegment(start.last.P2, segments[0].P1));
+ p = new Point2D.Double((segments[0].P1.getX()+ start.last.P2.getX())/2.0,
+ (segments[0].P1.getY()+ start.last.P2.getY())/2.0);
+ }
+ else
+ segments[0].P1 = start.last.P2 = p;
+
+ start.add( segments[0] );
+ joinSegments(end, segments[1], p);
+ }
+ else
+ {
+ // end and segment[1] form the 'inner' part
+ p0 = end.last.last();
+ p1 = new double[]{end.last.P2.getX(), end.last.P2.getY()};
+ p2 = new double[]{segments[1].P1.getX(), segments[1].P1.getY()};
+ p3 = segments[1].first();
+
+ p = lineIntersection(p0[0],p0[1],p1[0],p1[1],
+ p2[0],p2[1],p3[0],p3[1], false);
+ if( p == null )
+ {
+ // Dodgy.
+ end.add(new LineSegment(end.last.P2, segments[1].P1));
+ p = new Point2D.Double((segments[1].P1.getX()+ end.last.P2.getX())/2.0,
+ (segments[1].P1.getY()+ end.last.P2.getY())/2.0);
+ }
+ else
+ segments[1].P1 = end.last.P2 = p;
+
+ end.add( segments[1] );
+ joinSegments(start, segments[0], p);
+ }
+ }
+
+ /**
+ * Make a cap between a and b segments,
+ * where a-->b is the direction of iteration.
+ */
+ private void capEnd(Segment a, Segment b)
+ {
+ double[] p0, p1;
+ double dx, dy, l;
+ Point2D c1,c2;
+
+ switch( cap )
+ {
+ case CAP_BUTT:
+ a.add(new LineSegment(a.last.P2, b.P1));
+ break;
+
+ case CAP_SQUARE:
+ p0 = a.last.last();
+ p1 = new double[]{a.last.P2.getX(), a.last.P2.getY()};
+ dx = p1[0] - p0[0];
+ dy = p1[1] - p0[1];
+ l = Math.sqrt(dx * dx + dy * dy);
+ dx = 0.5*width*dx/l;
+ dy = 0.5*width*dy/l;
+ c1 = new Point2D.Double(p1[0] + dx, p1[1] + dy);
+ c2 = new Point2D.Double(b.P1.getX() + dx, b.P1.getY() + dy);
+ a.add(new LineSegment(a.last.P2, c1));
+ a.add(new LineSegment(c1, c2));
+ a.add(new LineSegment(c2, b.P1));
+ break;
+
+ case CAP_ROUND:
+ p0 = a.last.last();
+ p1 = new double[]{a.last.P2.getX(), a.last.P2.getY()};
+ dx = p1[0] - p0[0];
+ dy = p1[1] - p0[1];
+ l = Math.sqrt(dx * dx + dy * dy);
+ dx = (2.0/3.0)*width*dx/l;
+ dy = (2.0/3.0)*width*dy/l;
+ c1 = new Point2D.Double(p1[0] + dx, p1[1] + dy);
+ c2 = new Point2D.Double(b.P1.getX() + dx, b.P1.getY() + dy);
+ a.add(new CubicSegment(a.last.P2, c1, c2, b.P1));
+ break;
+ }
+ a.add(b);
+ }
+
+ /**
+ * Returns the intersection of two lines, or null if there isn't one.
+ * @param infinite - true if the lines should be regarded as infinite, false
+ * if the intersection must be within the given segments.
+ * @return a Point2D or null.
+ */
+ private Point2D lineIntersection(double X1, double Y1,
+ double X2, double Y2,
+ double X3, double Y3,
+ double X4, double Y4,
+ boolean infinite)
+ {
+ double x1 = X1;
+ double y1 = Y1;
+ double rx = X2 - x1;
+ double ry = Y2 - y1;
+
+ double x2 = X3;
+ double y2 = Y3;
+ double sx = X4 - x2;
+ double sy = Y4 - y2;
+
+ double determinant = sx * ry - sy * rx;
+ double nom = (sx * (y2 - y1) + sy * (x1 - x2));
+
+ // lines can be considered parallel.
+ if (Math.abs(determinant) < 1E-6)
+ return null;
+
+ nom = nom / determinant;
+
+ // check if lines are within the bounds
+ if(!infinite && (nom > 1.0 || nom < 0.0))
+ return null;
+
+ return new Point2D.Double(x1 + nom * rx, y1 + nom * ry);
+ }
+
+ /**
+ * Join a and b segments, where a-->b is the direction of iteration.
+ *
+ * insideP is the inside intersection point of the join, needed for
+ * calculating miter lengths.
+ */
+ private void joinSegments(Segment a, Segment b, Point2D insideP)
+ {
+ double[] p0, p1;
+ double dx, dy, l;
+ Point2D c1,c2;
+
+ switch( join )
+ {
+ case JOIN_MITER:
+ p0 = a.last.last();
+ p1 = new double[]{a.last.P2.getX(), a.last.P2.getY()};
+ double[] p2 = new double[]{b.P1.getX(), b.P1.getY()};
+ double[] p3 = b.first();
+ Point2D p = lineIntersection(p0[0],p0[1],p1[0],p1[1],p2[0],p2[1],p3[0],p3[1], true);
+ if( p == null || insideP == null )
+ a.add(new LineSegment(a.last.P2, b.P1));
+ else if((p.distance(insideP)/width) < limit)
+ {
+ a.add(new LineSegment(a.last.P2, p));
+ a.add(new LineSegment(p, b.P1));
+ }
+ else
+ {
+ // outside miter limit, do a bevel join.
+ a.add(new LineSegment(a.last.P2, b.P1));
+ }
+ break;
+
+ case JOIN_ROUND:
+ p0 = a.last.last();
+ p1 = new double[]{a.last.P2.getX(), a.last.P2.getY()};
+ dx = p1[0] - p0[0];
+ dy = p1[1] - p0[1];
+ l = Math.sqrt(dx * dx + dy * dy);
+ dx = 0.5*width*dx/l;
+ dy = 0.5*width*dy/l;
+ c1 = new Point2D.Double(p1[0] + dx, p1[1] + dy);
+
+ p0 = new double[]{b.P1.getX(), b.P1.getY()};
+ p1 = b.first();
+
+ dx = p0[0] - p1[0]; // backwards direction.
+ dy = p0[1] - p1[1];
+ l = Math.sqrt(dx * dx + dy * dy);
+ dx = 0.5*width*dx/l;
+ dy = 0.5*width*dy/l;
+ c2 = new Point2D.Double(p0[0] + dx, p0[1] + dy);
+ a.add(new CubicSegment(a.last.P2, c1, c2, b.P1));
+ break;
+
+ case JOIN_BEVEL:
+ a.add(new LineSegment(a.last.P2, b.P1));
+ break;
+ }
+ a.add(b);
+ }
}
diff --git a/java/awt/Choice.java b/java/awt/Choice.java
index 2e55d19b2..90a8d3141 100644
--- a/java/awt/Choice.java
+++ b/java/awt/Choice.java
@@ -556,6 +556,17 @@ processEvent(AWTEvent event)
super.processEvent(event);
}
+void
+dispatchEventImpl(AWTEvent e)
+{
+ if (e.id <= ItemEvent.ITEM_LAST
+ && e.id >= ItemEvent.ITEM_FIRST
+ && (item_listeners != null || (eventMask & AWTEvent.ITEM_EVENT_MASK) != 0))
+ processEvent(e);
+ else
+ super.dispatchEventImpl(e);
+}
+
/*************************************************************************/
/**
diff --git a/java/awt/ColorPaintContext.java b/java/awt/ColorPaintContext.java
index 82a78f63f..fc7376b80 100644
--- a/java/awt/ColorPaintContext.java
+++ b/java/awt/ColorPaintContext.java
@@ -138,13 +138,13 @@ class ColorPaintContext implements PaintContext
* @param rgbPixel The RGB value of the color for this raster.
*/
ColorRaster(ColorModel cm,int x, int y, int width, int height, int rgbPixel)
- {
+ {
super(cm.createCompatibleSampleModel(width,height),new Point(x,y));
Object pixel = cm.getDataElements(rgbPixel,null);
- getSampleModel().setDataElements(0, 0,
- width, height,
- multiplyData(pixel,null,width*height),
- dataBuffer);
+ int[] pixelComps = cm.getComponents(pixel, null, 0);
+ int[] d = (int[]) multiplyData(pixelComps,null,width*height);
+ getSampleModel().setPixels(0, 0, width, height, d,
+ dataBuffer);
}
diff --git a/java/awt/Component.java b/java/awt/Component.java
index 3ec002185..dbbec8ac1 100644
--- a/java/awt/Component.java
+++ b/java/awt/Component.java
@@ -1075,8 +1075,6 @@ public abstract class Component
Component p = parent;
if (p != null)
return p.getFont();
- if (peer != null)
- return peer.getGraphics().getFont();
return null;
}
@@ -2315,6 +2313,10 @@ public abstract class Component
if (oldEvent != null)
postEvent (oldEvent);
+ // Give toolkit a chance to dispatch the event
+ // to globally registered listeners.
+ Toolkit.getDefaultToolkit().globalDispatchEvent(e);
+
// Some subclasses in the AWT package need to override this behavior,
// hence the use of dispatchEventImpl().
dispatchEventImpl(e);
@@ -3089,6 +3091,8 @@ public abstract class Component
mouseListener.mouseClicked(e);
break;
case MouseEvent.MOUSE_ENTERED:
+ if( isLightweight() )
+ setCursor( getCursor() );
mouseListener.mouseEntered(e);
break;
case MouseEvent.MOUSE_EXITED:
@@ -3101,7 +3105,6 @@ public abstract class Component
mouseListener.mouseReleased(e);
break;
}
- e.consume();
}
/**
@@ -4079,14 +4082,9 @@ public abstract class Component
*/
public Container getFocusCycleRootAncestor ()
{
- if (this instanceof Window
- && ((Container) this).isFocusCycleRoot ())
- return (Container) this;
-
Container parent = getParent ();
- while (parent != null
- && !parent.isFocusCycleRoot ())
+ while (parent != null && !parent.isFocusCycleRoot())
parent = parent.getParent ();
return parent;
@@ -4114,9 +4112,32 @@ public abstract class Component
*/
public void nextFocus ()
{
- KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager ();
+ // Find the nearest valid (== showing && focusable && enabled) focus
+ // cycle root ancestor and the focused component in it.
+ Container focusRoot = getFocusCycleRootAncestor();
+ Component focusComp = this;
+ while (focusRoot != null
+ && ! (focusRoot.isShowing() && focusRoot.isFocusable()
+ && focusRoot.isEnabled()))
+ {
+ focusComp = focusRoot;
+ focusRoot = focusComp.getFocusCycleRootAncestor();
+ }
+
+ if (focusRoot != null)
+ {
+ // First try to get the componentBefore from the policy.
+ FocusTraversalPolicy policy = focusRoot.getFocusTraversalPolicy();
+ Component nextFocus = policy.getComponentAfter(focusRoot, focusComp);
+
+ // If this fails, then ask for the defaultComponent.
+ if (nextFocus == null)
+ nextFocus = policy.getDefaultComponent(focusRoot);
- manager.focusNextComponent (this);
+ // Request focus on this component, if not null.
+ if (nextFocus != null)
+ nextFocus.requestFocus();
+ }
}
/**
@@ -4128,9 +4149,32 @@ public abstract class Component
*/
public void transferFocusBackward ()
{
- KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager ();
+ // Find the nearest valid (== showing && focusable && enabled) focus
+ // cycle root ancestor and the focused component in it.
+ Container focusRoot = getFocusCycleRootAncestor();
+ Component focusComp = this;
+ while (focusRoot != null
+ && ! (focusRoot.isShowing() && focusRoot.isFocusable()
+ && focusRoot.isEnabled()))
+ {
+ focusComp = focusRoot;
+ focusRoot = focusComp.getFocusCycleRootAncestor();
+ }
+
+ if (focusRoot != null)
+ {
+ // First try to get the componentBefore from the policy.
+ FocusTraversalPolicy policy = focusRoot.getFocusTraversalPolicy();
+ Component nextFocus = policy.getComponentBefore(focusRoot, focusComp);
+
+ // If this fails, then ask for the defaultComponent.
+ if (nextFocus == null)
+ nextFocus = policy.getDefaultComponent(focusRoot);
- manager.focusPreviousComponent (this);
+ // Request focus on this component, if not null.
+ if (nextFocus != null)
+ nextFocus.requestFocus();
+ }
}
/**
@@ -4144,9 +4188,63 @@ public abstract class Component
*/
public void transferFocusUpCycle ()
{
- KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager ();
+ // Find the nearest focus cycle root ancestor that is itself
+ // focusable, showing and enabled.
+ Container focusCycleRoot = getFocusCycleRootAncestor();
+ while (focusCycleRoot != null &&
+ ! (focusCycleRoot.isShowing() && focusCycleRoot.isFocusable()
+ && focusCycleRoot.isEnabled()))
+ {
+ focusCycleRoot = focusCycleRoot.getFocusCycleRootAncestor();
+ }
+
+ KeyboardFocusManager fm =
+ KeyboardFocusManager.getCurrentKeyboardFocusManager();
+
+ if (focusCycleRoot != null)
+ {
+ // If we found a focus cycle root, then we make this the new
+ // focused component, and make it's focus cycle root the new
+ // global focus cycle root. If the found root has no focus cycle
+ // root ancestor itself, then the component will be both the focused
+ // component and the new global focus cycle root.
+ Container focusCycleAncestor =
+ focusCycleRoot.getFocusCycleRootAncestor();
+ Container globalFocusCycleRoot;
+ if (focusCycleAncestor == null)
+ globalFocusCycleRoot = focusCycleRoot;
+ else
+ globalFocusCycleRoot = focusCycleAncestor;
+
+ fm.setGlobalCurrentFocusCycleRoot(globalFocusCycleRoot);
+ focusCycleRoot.requestFocus();
+ }
+ else
+ {
+ // If this component has no applicable focus cycle root, we try
+ // find the nearest window and set this as the new global focus cycle
+ // root and the default focus component of this window the new focused
+ // component.
+ Container cont;
+ if (this instanceof Container)
+ cont = (Container) this;
+ else
+ cont = getParent();
- manager.upFocusCycle (this);
+ while (cont != null && !(cont instanceof Window))
+ cont = cont.getParent();
+
+ if (cont != null)
+ {
+ FocusTraversalPolicy policy = cont.getFocusTraversalPolicy();
+ Component focusComp = policy.getDefaultComponent(cont);
+ if (focusComp != null)
+ {
+ fm.setGlobalCurrentFocusCycleRoot(cont);
+ focusComp.requestFocus();
+ }
+ }
+ }
}
/**
@@ -4876,7 +4974,7 @@ p * <li>the set of backward traversal keys
oldKey = Event.UP;
break;
default:
- oldKey = newKey;
+ oldKey = (int) ((KeyEvent) e).getKeyChar();
}
translated = new Event (target, when, oldID,
@@ -4922,10 +5020,6 @@ p * <li>the set of backward traversal keys
void dispatchEventImpl(AWTEvent e)
{
- // Give toolkit a chance to dispatch the event
- // to globally registered listeners.
- Toolkit.getDefaultToolkit().globalDispatchEvent(e);
-
// This boolean tells us not to process focus events when the focus
// opposite component is the same as the focus component.
boolean ignoreFocus =
@@ -4934,6 +5028,10 @@ p * <li>the set of backward traversal keys
if (eventTypeEnabled (e.id))
{
+ if (e.id != PaintEvent.PAINT && e.id != PaintEvent.UPDATE
+ && !ignoreFocus)
+ processEvent(e);
+
// the trick we use to communicate between dispatch and redispatch
// is to have KeyboardFocusManager.redispatch synchronize on the
// object itself. we then do not redispatch to KeyboardFocusManager
@@ -4954,14 +5052,11 @@ p * <li>the set of backward traversal keys
.dispatchEvent(e))
return;
case MouseEvent.MOUSE_PRESSED:
- if (isLightweight())
- requestFocus();
+ if (isLightweight() && !e.isConsumed())
+ requestFocus();
break;
}
}
- if (e.id != PaintEvent.PAINT && e.id != PaintEvent.UPDATE
- && !ignoreFocus)
- processEvent(e);
}
if (peer != null)
@@ -4978,6 +5073,15 @@ p * <li>the set of backward traversal keys
switch (type)
{
+ case HierarchyEvent.HIERARCHY_CHANGED:
+ return (hierarchyListener != null
+ || (eventMask & AWTEvent.HIERARCHY_EVENT_MASK) != 0);
+
+ case HierarchyEvent.ANCESTOR_MOVED:
+ case HierarchyEvent.ANCESTOR_RESIZED:
+ return (hierarchyBoundsListener != null
+ || (eventMask & AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK) != 0);
+
case ComponentEvent.COMPONENT_HIDDEN:
case ComponentEvent.COMPONENT_MOVED:
case ComponentEvent.COMPONENT_RESIZED:
@@ -5002,6 +5106,9 @@ p * <li>the set of backward traversal keys
case MouseEvent.MOUSE_DRAGGED:
return (mouseMotionListener != null
|| (eventMask & AWTEvent.MOUSE_MOTION_EVENT_MASK) != 0);
+ case MouseEvent.MOUSE_WHEEL:
+ return (mouseWheelListener != null
+ || (eventMask & AWTEvent.MOUSE_WHEEL_EVENT_MASK) != 0);
case FocusEvent.FOCUS_GAINED:
case FocusEvent.FOCUS_LOST:
@@ -5289,7 +5396,7 @@ p * <li>the set of backward traversal keys
*/
public String getAccessibleName()
{
- return accessibleName == null ? getName() : accessibleName;
+ return accessibleName;
}
/**
@@ -5329,8 +5436,10 @@ p * <li>the set of backward traversal keys
s.add(AccessibleState.FOCUSABLE);
if (isFocusOwner())
s.add(AccessibleState.FOCUSED);
- if (isOpaque())
- s.add(AccessibleState.OPAQUE);
+ // Note: While the java.awt.Component has an 'opaque' property, it
+ // seems that it is not added to the accessible state set here, even
+ // if this property is true. However, it is handled for
+ // javax.swing.JComponent, so we add it there.
if (Component.this.isShowing())
s.add(AccessibleState.SHOWING);
if (Component.this.isVisible())
@@ -5614,7 +5723,7 @@ p * <li>the set of backward traversal keys
*/
public Point getLocation()
{
- return Component.this.isShowing() ? Component.this.getLocation() : null;
+ return Component.this.getLocation();
}
/**
@@ -5638,7 +5747,7 @@ p * <li>the set of backward traversal keys
*/
public Rectangle getBounds()
{
- return Component.this.isShowing() ? Component.this.getBounds() : null;
+ return Component.this.getBounds();
}
/**
@@ -5661,7 +5770,7 @@ p * <li>the set of backward traversal keys
*/
public Dimension getSize()
{
- return Component.this.isShowing() ? Component.this.getSize() : null;
+ return Component.this.getSize();
}
/**
diff --git a/java/awt/Container.java b/java/awt/Container.java
index 9af058178..2419a7bd2 100644
--- a/java/awt/Container.java
+++ b/java/awt/Container.java
@@ -1465,7 +1465,7 @@ public class Container extends Component
{
Container ancestor = getFocusCycleRootAncestor ();
- if (ancestor != this)
+ if (ancestor != this && ancestor != null)
return ancestor.getFocusTraversalPolicy ();
else
{
@@ -1535,9 +1535,16 @@ public class Container extends Component
*/
public void transferFocusDownCycle ()
{
- KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager ();
-
- manager.downFocusCycle (this);
+ if (isFocusCycleRoot())
+ {
+ KeyboardFocusManager fm =
+ KeyboardFocusManager.getCurrentKeyboardFocusManager();
+ fm.setGlobalCurrentFocusCycleRoot(this);
+ FocusTraversalPolicy policy = getFocusTraversalPolicy();
+ Component defaultComponent = policy.getDefaultComponent(this);
+ if (defaultComponent != null)
+ defaultComponent.requestFocus();
+ }
}
/**
diff --git a/java/awt/DefaultKeyboardFocusManager.java b/java/awt/DefaultKeyboardFocusManager.java
index bce6352a9..a60cefd9c 100644
--- a/java/awt/DefaultKeyboardFocusManager.java
+++ b/java/awt/DefaultKeyboardFocusManager.java
@@ -478,59 +478,25 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
public void focusPreviousComponent (Component comp)
{
- Component focusComp = (comp == null) ? getGlobalFocusOwner () : comp;
- Container focusCycleRoot = focusComp.getFocusCycleRootAncestor ();
- FocusTraversalPolicy policy = focusCycleRoot.getFocusTraversalPolicy ();
-
- Component previous = policy.getComponentBefore (focusCycleRoot, focusComp);
- if (previous != null)
- previous.requestFocusInWindow ();
+ if (comp != null)
+ comp.transferFocusBackward();
}
public void focusNextComponent (Component comp)
{
- Component focusComp = (comp == null) ? getGlobalFocusOwner () : comp;
- Container focusCycleRoot = focusComp.getFocusCycleRootAncestor ();
- FocusTraversalPolicy policy = focusCycleRoot.getFocusTraversalPolicy ();
-
- Component next = policy.getComponentAfter (focusCycleRoot, focusComp);
- if (next != null)
- next.requestFocusInWindow ();
+ if (comp != null)
+ comp.transferFocus();
}
public void upFocusCycle (Component comp)
{
- Component focusComp = (comp == null) ? getGlobalFocusOwner () : comp;
- Container focusCycleRoot = focusComp.getFocusCycleRootAncestor ();
-
- if (focusCycleRoot instanceof Window)
- {
- FocusTraversalPolicy policy = focusCycleRoot.getFocusTraversalPolicy ();
- Component defaultComponent = policy.getDefaultComponent (focusCycleRoot);
- if (defaultComponent != null)
- defaultComponent.requestFocusInWindow ();
- }
- else
- {
- Container parentFocusCycleRoot = focusCycleRoot.getFocusCycleRootAncestor ();
-
- focusCycleRoot.requestFocusInWindow ();
- setGlobalCurrentFocusCycleRoot (parentFocusCycleRoot);
- }
+ if (comp != null)
+ comp.transferFocusUpCycle();
}
public void downFocusCycle (Container cont)
{
- if (cont == null)
- return;
-
- if (cont.isFocusCycleRoot (cont))
- {
- FocusTraversalPolicy policy = cont.getFocusTraversalPolicy ();
- Component defaultComponent = policy.getDefaultComponent (cont);
- if (defaultComponent != null)
- defaultComponent.requestFocusInWindow ();
- setGlobalCurrentFocusCycleRoot (cont);
- }
+ if (cont != null)
+ cont.transferFocusDownCycle();
}
} // class DefaultKeyboardFocusManager
diff --git a/java/awt/Dialog.java b/java/awt/Dialog.java
index 7e5e7215a..55c3371e6 100644
--- a/java/awt/Dialog.java
+++ b/java/awt/Dialog.java
@@ -1,39 +1,40 @@
/* Dialog.java -- An AWT dialog box
- Copyright (C) 1999, 2000, 2001, 2002, 2005 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+ Copyright (C) 1999, 2000, 2001, 2002, 2005, 2006
+ Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
package java.awt;
@@ -46,457 +47,422 @@ import javax.accessibility.AccessibleState;
import javax.accessibility.AccessibleStateSet;
/**
- * A dialog box widget class.
- *
+ * <code>Dialog</code> provides a top-level window normally used to receive
+ * user input in applications.
+ * <p>
+ * A dialog always has another top-level window as owner and is only visible
+ * if this owner is visible to the user. The default layout of dialogs is the
+ * <code>BorderLayout</code>. Dialogs can be modal (blocks user input to other
+ * components) or non-modal (user input in other components are allowed).
+ * </p>
+ *
* @author Aaron M. Renn (arenn@urbanophile.com)
* @author Tom Tromey (tromey@redhat.com)
*/
public class Dialog extends Window
{
+ // Serialization constant
+ private static final long serialVersionUID = 5920926903803293709L;
-/*
- * Static Variables
- */
-
-// Serialization constant
-private static final long serialVersionUID = 5920926903803293709L;
-
-/*************************************************************************/
-
-/*
- * Instance Variables
- */
-
-/**
- * @serial Indicates whether or not this dialog box is modal.
- */
-private boolean modal;
-
-/**
- * @serial Indicates whether or not this dialog box is resizable.
- */
-private boolean resizable = true;
-
-/**
- * @serial The title string for this dialog box, which can be
- * <code>null</code>.
- */
-private String title;
-
-/**
- * This field indicates whether the dialog is undecorated or not.
- */
-private boolean undecorated = false;
-
-/**
- * Indicates that we are blocked for modality in show
- */
-private boolean blocked = false;
-
-/**
- * Secondary EventQueue to handle AWT events while
- * we are blocked for modality in show
- */
-private EventQueue eq2 = null;
-
-/*************************************************************************/
-
-/*
- * Constructors
- */
-
-/**
- * Initializes a new instance of <code>Dialog</code> with the specified
- * parent, that is resizable and not modal, and which has no title.
- *
- * @param parent The parent frame of this dialog box.
- *
- * @exception IllegalArgumentException If the owner's GraphicsConfiguration
- * is not from a screen device, or if owner is null. This exception is always
- * thrown when GraphicsEnvironment.isHeadless() returns true.
- */
-public
-Dialog(Frame parent)
-{
- this(parent, "", false);
-}
-
-/*************************************************************************/
-
-/**
- * Initializes a new instance of <code>Dialog</code> with the specified
- * parent and modality, that is resizable and which has no title.
- *
- * @param parent The parent frame of this dialog box.
- * @param modal <code>true</code> if this dialog box is modal,
- * <code>false</code> otherwise.
- *
- * @exception IllegalArgumentException If the owner's GraphicsConfiguration
- * is not from a screen device, or if owner is null. This exception is always
- * thrown when GraphicsEnvironment.isHeadless() returns true.
- */
-public
-Dialog(Frame parent, boolean modal)
-{
- this(parent, "", modal);
-}
-
-/*************************************************************************/
-
-/**
- * Initializes a new instance of <code>Dialog</code> with the specified
- * parent, that is resizable and not modal, and which has the specified
- * title.
- *
- * @param parent The parent frame of this dialog box.
- * @param title The title string for this dialog box.
- *
- * @exception IllegalArgumentException If the owner's GraphicsConfiguration
- * is not from a screen device, or if owner is null. This exception is always
- * thrown when GraphicsEnvironment.isHeadless() returns true.
- */
-public
-Dialog(Frame parent, String title)
-{
- this(parent, title, false);
-}
-
-/*************************************************************************/
-
-/**
- * Initializes a new instance of <code>Dialog</code> with the specified,
- * parent, title, and modality, that is resizable.
- *
- * @param parent The parent frame of this dialog box.
- * @param title The title string for this dialog box.
- * @param modal <code>true</code> if this dialog box is modal,
- * <code>false</code> otherwise.
- *
- * @exception IllegalArgumentException If owner is null or
- * GraphicsEnvironment.isHeadless() returns true.
- */
-public
-Dialog(Frame parent, String title, boolean modal)
-{
- this (parent, title, modal, parent.getGraphicsConfiguration ());
-}
-
-/**
- * Initializes a new instance of <code>Dialog</code> with the specified,
- * parent, title, modality and <code>GraphicsConfiguration</code>,
- * that is resizable.
- *
- * @param parent The parent frame of this dialog box.
- * @param title The title string for this dialog box.
- * @param modal <code>true</code> if this dialog box is modal,
- * <code>false</code> otherwise.
- * @param gc The <code>GraphicsConfiguration</code> object to use.
- *
- * @exception IllegalArgumentException If owner is null, the
- * GraphicsConfiguration is not a screen device or
- * GraphicsEnvironment.isHeadless() returns true.
- *
- * @since 1.4
- */
-public
-Dialog (Frame parent, String title, boolean modal, GraphicsConfiguration gc)
-{
- super (parent, gc);
-
- // A null title is equivalent to an empty title
- this.title = (title != null) ? title : "";
- this.modal = modal;
- visible = false;
-
- setLayout(new BorderLayout());
-}
-
-/**
- * Initializes a new instance of <code>Dialog</code> with the specified,
- * parent, that is resizable.
- *
- * @exception IllegalArgumentException If parent is null. This exception is
- * always thrown when GraphicsEnvironment.isHeadless() returns true.
- *
- * @since 1.2
- */
-public
-Dialog (Dialog owner)
-{
- this (owner, "", false, owner.getGraphicsConfiguration ());
-}
-
-/**
- * Initializes a new instance of <code>Dialog</code> with the specified,
- * parent and title, that is resizable.
- *
- * @exception IllegalArgumentException If parent is null. This exception is
- * always thrown when GraphicsEnvironment.isHeadless() returns true.
- *
- * @since 1.2
- */
-public
-Dialog (Dialog owner, String title)
-{
- this (owner, title, false, owner.getGraphicsConfiguration ());
-}
-
-/**
- * Initializes a new instance of <code>Dialog</code> with the specified,
- * parent, title and modality, that is resizable.
- *
- * @exception IllegalArgumentException If parent is null. This exception is
- * always thrown when GraphicsEnvironment.isHeadless() returns true.
- *
- * @since 1.2
- */
-public
-Dialog (Dialog owner, String title, boolean modal)
-{
- this (owner, title, modal, owner.getGraphicsConfiguration ());
-}
+ /**
+ * @serial Indicates whether or not this dialog box is modal.
+ */
+ private boolean modal;
-/**
- * Initializes a new instance of <code>Dialog</code> with the specified,
- * parent, title, modality and <code>GraphicsConfiguration</code>,
- * that is resizable.
- *
- * @exception IllegalArgumentException If parent is null, the
- * GraphicsConfiguration is not a screen device or
- * GraphicsEnvironment.isHeadless() returns true.
- *
- * @since 1.4
- */
-public
-Dialog (Dialog parent, String title, boolean modal, GraphicsConfiguration gc)
-{
- super (parent, parent.getGraphicsConfiguration ());
+ /**
+ * @serial Indicates whether or not this dialog box is resizable.
+ */
+ private boolean resizable = true;
- // A null title is equivalent to an empty title
- this.title = (title != null) ? title : "";
- this.modal = modal;
- visible = false;
+ /**
+ * @serial The title string for this dialog box, which can be
+ * <code>null</code>.
+ */
+ private String title;
- setLayout (new BorderLayout ());
-}
+ /**
+ * This field indicates whether the dialog is undecorated or not.
+ */
+ private boolean undecorated = false;
-/*************************************************************************/
+ /**
+ * Indicates that we are blocked for modality in show
+ */
+ private boolean blocked = false;
-/*
- * Instance Variables
- */
+ /**
+ * Secondary EventQueue to handle AWT events while we are blocked for
+ * modality in show.
+ */
+ private EventQueue eq2 = null;
-/**
- * Returns the title of this dialog box.
- *
- * @return The title of this dialog box.
- */
-public String
-getTitle()
-{
- return(title);
-}
+ /**
+ * Initializes a new instance of <code>Dialog</code> with the specified
+ * parent, that is resizable and not modal, and which has no title.
+ *
+ * @param parent The parent frame of this dialog box.
+ * @exception IllegalArgumentException If the owner's GraphicsConfiguration
+ * is not from a screen device, or if owner is null. This exception is
+ * always thrown when GraphicsEnvironment.isHeadless() returns true.
+ */
+ public Dialog(Frame parent)
+ {
+ this(parent, "", false);
+ }
-/*************************************************************************/
+ /**
+ * Initializes a new instance of <code>Dialog</code> with the specified
+ * parent and modality, that is resizable and which has no title.
+ *
+ * @param parent The parent frame of this dialog box.
+ * @param modal <code>true</code> if this dialog box is modal,
+ * <code>false</code> otherwise.
+ *
+ * @exception IllegalArgumentException If the owner's GraphicsConfiguration
+ * is not from a screen device, or if owner is null. This exception is
+ * always thrown when GraphicsEnvironment.isHeadless() returns true.
+ */
+ public Dialog(Frame parent, boolean modal)
+ {
+ this(parent, "", modal);
+ }
-/**
- * Sets the title of this dialog box to the specified string.
- *
- * @param title The new title.
- */
-public synchronized void
-setTitle(String title)
-{
- // A null title is equivalent to an empty title
- this.title = (title != null) ? title : "";
+ /**
+ * Initializes a new instance of <code>Dialog</code> with the specified
+ * parent, that is resizable and not modal, and which has the specified
+ * title.
+ *
+ * @param parent The parent frame of this dialog box.
+ * @param title The title string for this dialog box.
+ *
+ * @exception IllegalArgumentException If the owner's GraphicsConfiguration
+ * is not from a screen device, or if owner is null. This exceptionnis
+ * always thrown when GraphicsEnvironment.isHeadless() returns true.
+ */
+ public Dialog(Frame parent, String title)
+ {
+ this(parent, title, false);
+ }
- if (peer != null)
- {
- DialogPeer d = (DialogPeer) peer;
- d.setTitle (title);
- }
-}
+ /**
+ * Initializes a new instance of <code>Dialog</code> with the specified,
+ * parent, title, and modality, that is resizable.
+ *
+ * @param parent The parent frame of this dialog box.
+ * @param title The title string for this dialog box.
+ * @param modal <code>true</code> if this dialog box is modal,
+ * <code>false</code> otherwise.
+ *
+ * @exception IllegalArgumentException If owner is null or
+ * GraphicsEnvironment.isHeadless() returns true.
+ */
+ public Dialog(Frame parent, String title, boolean modal)
+ {
+ this(parent, title, modal, parent.getGraphicsConfiguration());
+ }
-/*************************************************************************/
+ /**
+ * Initializes a new instance of <code>Dialog</code> with the specified,
+ * parent, title, modality and <code>GraphicsConfiguration</code>, that is
+ * resizable.
+ *
+ * @param parent The parent frame of this dialog box.
+ * @param title The title string for this dialog box.
+ * @param modal <code>true</code> if this dialog box is modal,
+ * <code>false</code> otherwise.
+ * @param gc The <code>GraphicsConfiguration</code> object to use. If
+ * <code>null</code> the <code>GraphicsConfiguration</code> of the target
+ * frame is used.
+ *
+ * @exception IllegalArgumentException If owner is null, the
+ * GraphicsConfiguration is not a screen device or
+ * GraphicsEnvironment.isHeadless() returns true.
+ * @since 1.4
+ */
+ public Dialog(Frame parent, String title, boolean modal,
+ GraphicsConfiguration gc)
+ {
+ super(parent, (gc == null) ? parent.getGraphicsConfiguration() : gc);
-/**
- * Tests whether or not this dialog box is modal.
- *
- * @return <code>true</code> if this dialog box is modal,
- * <code>false</code> otherwise.
- */
-public boolean
-isModal()
-{
- return(modal);
-}
+ // A null title is equivalent to an empty title
+ this.title = (title != null) ? title : "";
+ this.modal = modal;
+ visible = false;
-/*************************************************************************/
+ setLayout(new BorderLayout());
+ }
-/**
- * Changes the modality of this dialog box. This can only be done before
- * the peer is created.
- *
- * @param modal <code>true</code> to make this dialog box modal,
- * <code>false</code> to make it non-modal.
- */
-public void
-setModal(boolean modal)
-{
- this.modal = modal;
-}
+ /**
+ * Initializes a new instance of <code>Dialog</code> with the specified,
+ * parent, that is resizable.
+ *
+ * @param owner The parent frame of this dialog box.
+ *
+ * @exception IllegalArgumentException If parent is null. This exception is
+ * always thrown when GraphicsEnvironment.isHeadless() returns true.
+ *
+ * @since 1.2
+ */
+ public Dialog(Dialog owner)
+ {
+ this(owner, "", false, owner.getGraphicsConfiguration());
+ }
-/*************************************************************************/
+ /**
+ * Initializes a new instance of <code>Dialog</code> with the specified,
+ * parent and title, that is resizable.
+ *
+ * @param owner The parent frame of this dialog box.
+ * @param title The title string for this dialog box.
+ *
+ * @exception IllegalArgumentException If parent is null. This exception is
+ * always thrown when GraphicsEnvironment.isHeadless() returns
+ * true.
+ * @since 1.2
+ */
+ public Dialog(Dialog owner, String title)
+ {
+ this(owner, title, false, owner.getGraphicsConfiguration());
+ }
-/**
- * Tests whether or not this dialog box is resizable.
- *
- * @return <code>true</code> if this dialog is resizable, <code>false</code>,
- * otherwise.
- */
-public boolean
-isResizable()
-{
- return(resizable);
-}
+ /**
+ * Initializes a new instance of <code>Dialog</code> with the specified,
+ * parent, title and modality, that is resizable.
+ *
+ * @param owner The parent frame of this dialog box.
+ * @param title The title string for this dialog box.
+ * @param modal <code>true</code> if this dialog box is modal,
+ * <code>false</code> otherwise.
+ *
+ * @exception IllegalArgumentException If parent is null. This exception is
+ * always thrown when GraphicsEnvironment.isHeadless() returns true.
+ * @since 1.2
+ */
+ public Dialog(Dialog owner, String title, boolean modal)
+ {
+ this(owner, title, modal, owner.getGraphicsConfiguration());
+ }
-/*************************************************************************/
+ /**
+ * Initializes a new instance of <code>Dialog</code> with the specified,
+ * parent, title, modality and <code>GraphicsConfiguration</code>, that is
+ * resizable.
+ *
+ * @param parent The parent frame of this dialog box.
+ * @param title The title string for this dialog box.
+ * @param modal <code>true</code> if this dialog box is modal,
+ * <code>false</code> otherwise.
+ * @param gc The <code>GraphicsConfiguration</code> object to use. If
+ * <code>null</code> the <code>GraphicsConfiguration</code> of the target
+ * frame is used.
+ *
+ * @exception IllegalArgumentException If parent is null, the
+ * GraphicsConfiguration is not a screen device or
+ * GraphicsEnvironment.isHeadless() returns true.
+ *
+ * @since 1.4
+ */
+ public Dialog(Dialog parent, String title, boolean modal,
+ GraphicsConfiguration gc)
+ {
+ super(parent, (gc == null) ? parent.getGraphicsConfiguration() : gc);
-/**
- * Changes the resizability of this dialog box.
- *
- * @param resizable <code>true</code> to make this dialog resizable,
- * <code>false</code> to make it non-resizable.
- */
-public synchronized void
-setResizable(boolean resizable)
-{
- this.resizable = resizable;
- if (peer != null)
- {
- DialogPeer d = (DialogPeer) peer;
- d.setResizable (resizable);
- }
-}
+ // A null title is equivalent to an empty title
+ this.title = (title != null) ? title : "";
+ this.modal = modal;
+ visible = false;
-/*************************************************************************/
+ setLayout(new BorderLayout());
+ }
-/**
- * Creates this object's native peer.
- */
-public synchronized void
-addNotify()
-{
- if (peer == null)
- peer = getToolkit ().createDialog (this);
- super.addNotify ();
-}
+ /**
+ * Returns the title of this dialog box.
+ *
+ * @return The title of this dialog box.
+ */
+ public String getTitle()
+ {
+ return title;
+ }
-/*************************************************************************/
+ /**
+ * Sets the title of this dialog box to the specified string.
+ *
+ * @param title the new title. If <code>null</code> an empty
+ * title will be set.
+ */
+ public synchronized void setTitle(String title)
+ {
+ // A null title is equivalent to an empty title
+ this.title = (title != null) ? title : "";
+
+ if (peer != null)
+ {
+ DialogPeer d = (DialogPeer) peer;
+ d.setTitle(title);
+ }
+ }
-/**
- * Makes this dialog visible and brings it to the front.
- * If the dialog is modal and is not already visible, this call will not
- * return until the dialog is hidden by someone calling hide or dispose.
- * If this is the event dispatching thread we must ensure that another event
- * thread runs while the one which invoked this method is blocked.
- */
-public synchronized void
-show()
-{
- super.show();
-
- if (isModal())
- {
- // If already shown (and blocked) just return
- if (blocked)
- return;
-
- /* If show is called in the dispatch thread for a modal dialog it will
- block so we must run another thread so the events keep being
- dispatched.*/
- if (EventQueue.isDispatchThread ())
- {
- EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();
- eq2 = new EventQueue ();
- eq.push (eq2);
- }
-
- try
- {
- blocked = true;
- wait ();
- blocked = false;
- }
- catch (InterruptedException e)
- {
- blocked = false;
- }
-
- if (eq2 != null)
- {
- eq2.pop ();
- eq2 = null;
- }
- }
-}
+ /**
+ * Tests whether or not this dialog box is modal.
+ *
+ * @return <code>true</code> if this dialog box is modal, <code>false</code>
+ * otherwise.
+ */
+ public boolean isModal()
+ {
+ return modal;
+ }
-/*************************************************************************/
+ /**
+ * Changes the modality of this dialog box. This can only be done before the
+ * peer is created.
+ *
+ * @param modal <code>true</code> to make this dialog box modal,
+ * <code>false</code> to make it non-modal.
+ */
+ public void setModal(boolean modal)
+ {
+ this.modal = modal;
+ }
-/**
- * Hides the Dialog and then
- * causes show() to return if it is currently blocked.
- */
+ /**
+ * Tests whether or not this dialog box is resizable.
+ *
+ * @return <code>true</code> if this dialog is resizable,
+ * <code>false</code> otherwise.
+ */
+ public boolean isResizable()
+ {
+ return resizable;
+ }
-public synchronized void
-hide ()
-{
- if (blocked)
- {
- notifyAll ();
- }
+ /**
+ * Changes the resizability of this dialog box.
+ *
+ * @param resizable <code>true</code> to make this dialog resizable,
+ * <code>false</code> to make it non-resizable.
+ */
+ public synchronized void setResizable(boolean resizable)
+ {
+ this.resizable = resizable;
+ if (peer != null)
+ {
+ DialogPeer d = (DialogPeer) peer;
+ d.setResizable(resizable);
+ }
+ }
- super.hide();
-}
+ /**
+ * Creates this object's native peer.
+ */
+ public synchronized void addNotify()
+ {
+ if (peer == null)
+ peer = getToolkit().createDialog(this);
+ super.addNotify();
+ }
-/*************************************************************************/
+ /**
+ * Makes this dialog visible and brings it to the front. If the dialog is
+ * modal and is not already visible, this call will not return until the
+ * dialog is hidden by someone calling hide or dispose. If this is the event
+ * dispatching thread we must ensure that another event thread runs while the
+ * one which invoked this method is blocked.
+ *
+ * @deprecated Use {@link Component#setVisible(boolean)} instead.
+ */
+ public synchronized void show()
+ {
+ super.show();
+
+ if (isModal())
+ {
+ // If already shown (and blocked) just return
+ if (blocked)
+ return;
+
+ /*
+ * If show is called in the dispatch thread for a modal dialog it will
+ * block so we must run another thread so the events keep being
+ * dispatched.
+ */
+ if (EventQueue.isDispatchThread())
+ {
+ EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();
+ eq2 = new EventQueue();
+ eq.push(eq2);
+ }
+
+ try
+ {
+ blocked = true;
+ wait();
+ blocked = false;
+ }
+ catch (InterruptedException e)
+ {
+ blocked = false;
+ }
+
+ if (eq2 != null)
+ {
+ eq2.pop();
+ eq2 = null;
+ }
+ }
+ }
-/**
- * Disposes the Dialog and then causes show() to return
- * if it is currently blocked.
- */
+ /**
+ * Hides the Dialog and then causes show() to return if it is currently
+ * blocked.
+ *
+ * @deprecated Use {@link Component#setVisible(boolean)} instead.
+ */
+ public synchronized void hide()
+ {
+ if (blocked)
+ {
+ notifyAll();
+ }
-public synchronized void
-dispose ()
-{
- if (blocked)
- {
- notifyAll ();
- }
+ super.hide();
+ }
- super.dispose();
-}
+ /**
+ * Disposes the Dialog and then causes show() to return if it is currently
+ * blocked.
+ */
+ public synchronized void dispose()
+ {
+ if (blocked)
+ {
+ notifyAll();
+ }
-/*************************************************************************/
+ super.dispose();
+ }
-/**
- * Returns a debugging string for this component.
- *
- * @return A debugging string for this component.
- */
-protected String
-paramString()
-{
- return ("title+" + title + ",modal=" + modal +
- ",resizable=" + resizable + "," + super.paramString());
-}
+ /**
+ * Returns a debugging string for this component.
+ *
+ * @return A debugging string for this component.
+ */
+ protected String paramString()
+ {
+ return "title+" + title + ",modal=" + modal + ",resizable=" + resizable
+ + "," + super.paramString();
+ }
/**
* Returns whether this frame is undecorated or not.
*
+ * @return <code>true</code> if this dialog is undecorated,
+ * <code>false</code> otherwise.
+ *
* @since 1.4
*/
- public boolean isUndecorated ()
+ public boolean isUndecorated()
{
return undecorated;
}
@@ -505,28 +471,42 @@ paramString()
* Disables or enables decorations for this frame. This method can only be
* called while the frame is not displayable.
*
- * @exception IllegalComponentStateException If this frame is displayable.
+ * @param undecorated <code>true</code> to disable dialog decorations,
+ * <code>false</code> otherwise.
*
+ * @exception IllegalComponentStateException If this frame is displayable.
* @since 1.4
*/
- public void setUndecorated (boolean undecorated)
+ public void setUndecorated(boolean undecorated)
{
- if (isDisplayable ())
- throw new IllegalComponentStateException ();
+ if (isDisplayable())
+ throw new IllegalComponentStateException();
this.undecorated = undecorated;
}
-
- protected class AccessibleAWTDialog extends AccessibleAWTWindow
+
+ /**
+ * Accessibility support for <code>Dialog</code>.
+ */
+ protected class AccessibleAWTDialog
+ extends AccessibleAWTWindow
{
private static final long serialVersionUID = 4837230331833941201L;
+ /**
+ * Gets the role of this object.
+ * @return AccessibleRole.DIALOG
+ */
public AccessibleRole getAccessibleRole()
{
return AccessibleRole.DIALOG;
}
-
- public AccessibleStateSet getAccessibleState()
+
+ /**
+ * Gets the state set of this object.
+ * @return The current state of this dialog.
+ */
+ public AccessibleStateSet getAccessibleStateSet()
{
AccessibleStateSet states = super.getAccessibleStateSet();
if (isResizable())
@@ -536,11 +516,11 @@ paramString()
return states;
}
}
-
+
/**
- * Gets the AccessibleContext associated with this <code>Dialog</code>.
- * The context is created, if necessary.
- *
+ * Gets the AccessibleContext associated with this <code>Dialog</code>. The
+ * context is created, if necessary.
+ *
* @return the associated context
*/
public AccessibleContext getAccessibleContext()
@@ -551,5 +531,4 @@ paramString()
return accessibleContext;
}
-} // class Dialog
-
+}
diff --git a/java/awt/Frame.java b/java/awt/Frame.java
index 7003dac91..542013671 100644
--- a/java/awt/Frame.java
+++ b/java/awt/Frame.java
@@ -614,16 +614,27 @@ public class Frame extends Window implements MenuContainer
return next_frame_number++;
}
+ /**
+ * Accessibility support for <code>Frame</code>.
+ */
protected class AccessibleAWTFrame extends AccessibleAWTWindow
{
private static final long serialVersionUID = -6172960752956030250L;
+ /**
+ * Gets the role of this object.
+ * @return AccessibleRole.FRAME
+ */
public AccessibleRole getAccessibleRole()
{
return AccessibleRole.FRAME;
}
- public AccessibleStateSet getAccessibleState()
+ /**
+ * Gets the state set of this object.
+ * @return The current state of this frame.
+ */
+ public AccessibleStateSet getAccessibleStateSet()
{
AccessibleStateSet states = super.getAccessibleStateSet();
if (isResizable())
diff --git a/java/awt/GraphicsConfiguration.java b/java/awt/GraphicsConfiguration.java
index 1526ad3cf..f68a1e6ba 100644
--- a/java/awt/GraphicsConfiguration.java
+++ b/java/awt/GraphicsConfiguration.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt;
+import gnu.classpath.NotImplementedException;
+
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
@@ -216,6 +218,7 @@ public abstract class GraphicsConfiguration
* @since 1.4
*/
public BufferCapabilities getBufferCapabilities()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
@@ -227,6 +230,7 @@ public abstract class GraphicsConfiguration
* @since 1.4
*/
public ImageCapabilities getImageCapabilities()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
diff --git a/java/awt/GridBagLayout.java b/java/awt/GridBagLayout.java
index 30db2903f..f827d21ca 100644
--- a/java/awt/GridBagLayout.java
+++ b/java/awt/GridBagLayout.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt;
+import gnu.classpath.NotImplementedException;
+
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
@@ -323,6 +325,7 @@ public class GridBagLayout
* Obsolete.
*/
protected void AdjustForGravity (GridBagConstraints gbc, Rectangle rect)
+ throws NotImplementedException
{
// FIXME
throw new Error ("Not implemented");
diff --git a/java/awt/Image.java b/java/awt/Image.java
index 93c2c4790..6ade302a1 100644
--- a/java/awt/Image.java
+++ b/java/awt/Image.java
@@ -166,6 +166,8 @@ public abstract class Image
* loading will be produced according to the hints of the algorithm
* requested. If either the width or height is non-positive, it is adjusted
* to preserve the original aspect ratio.
+ * If an illegal value of <code>flags</code> is passed,
+ * the default algorithm is used.
*
* @param width the width of the scaled image
* @param height the height of the scaled image
@@ -183,18 +185,15 @@ public abstract class Image
ImageFilter filter;
switch (flags)
{
- case SCALE_DEFAULT:
- case SCALE_FAST:
- case SCALE_REPLICATE:
- filter = new ReplicateScaleFilter(width, height);
- break;
case SCALE_AREA_AVERAGING:
+ case SCALE_SMOOTH:
filter = new AreaAveragingScaleFilter(width, height);
break;
- case SCALE_SMOOTH:
- throw new Error("SCALE_SMOOTH: not implemented");
+ case SCALE_DEFAULT:
+ case SCALE_FAST:
+ case SCALE_REPLICATE:
default:
- throw new Error("Unknown flag or not implemented: " + flags);
+ filter = new ReplicateScaleFilter(width, height);
}
ImageProducer producer = new FilteredImageSource(getSource(), filter);
diff --git a/java/awt/LightweightDispatcher.java b/java/awt/LightweightDispatcher.java
index 2f254bccf..860646402 100644
--- a/java/awt/LightweightDispatcher.java
+++ b/java/awt/LightweightDispatcher.java
@@ -129,7 +129,8 @@ class LightweightDispatcher
{
Window window = (Window) ev.getSource();
Component target = window.findComponentAt(ev.getX(), ev.getY());
- if (target != null && target.isLightweight())
+ target = findTarget(target);
+ if (target == null || target.isLightweight())
{
// Dispatch additional MOUSE_EXITED and MOUSE_ENTERED if event target
// is different from the last event target.
@@ -145,13 +146,16 @@ class LightweightDispatcher
ev.getClickCount(), ev.isPopupTrigger());
lastTarget.dispatchEvent(mouseExited);
}
- Point p = AWTUtilities.convertPoint(window, ev.getX(), ev.getY(),
- target);
- MouseEvent mouseEntered =
- new MouseEvent(target, MouseEvent.MOUSE_ENTERED, ev.getWhen(),
- ev.getModifiers(), p.x, p.y, ev.getClickCount(),
- ev.isPopupTrigger());
- target.dispatchEvent(mouseEntered);
+ if (target != null)
+ {
+ Point p = AWTUtilities.convertPoint(window, ev.getX(), ev.getY(),
+ target);
+ MouseEvent mouseEntered =
+ new MouseEvent(target, MouseEvent.MOUSE_ENTERED, ev.getWhen(),
+ ev.getModifiers(), p.x, p.y, ev.getClickCount(),
+ ev.isPopupTrigger());
+ target.dispatchEvent(mouseEntered);
+ }
}
switch (ev.getID())
@@ -182,21 +186,43 @@ class LightweightDispatcher
lastTarget = target;
- Point targetCoordinates =
- AWTUtilities.convertPoint(window, ev.getX(), ev.getY(), target);
- int dx = targetCoordinates.x - ev.getX();
- int dy = targetCoordinates.y - ev.getY();
- ev.translatePoint(dx, dy);
- ev.setSource(target);
- target.dispatchEvent(ev);
-
- // We reset the event, so that the normal event dispatching is not
- // influenced by this modified event.
- ev.setSource(window);
- ev.translatePoint(-dx, -dy);
+ if (target != null)
+ {
+ Point targetCoordinates =
+ AWTUtilities.convertPoint(window, ev.getX(), ev.getY(), target);
+ int dx = targetCoordinates.x - ev.getX();
+ int dy = targetCoordinates.y - ev.getY();
+ ev.translatePoint(dx, dy);
+ ev.setSource(target);
+ target.dispatchEvent(ev);
+ // We reset the event, so that the normal event dispatching is not
+ // influenced by this modified event.
+ ev.setSource(window);
+ ev.translatePoint(-dx, -dy);
+ }
+
return true;
}
else
return false;
}
+
+ /**
+ * Finds the actual target for a mouseevent, starting at <code>c</code>.
+ * This searches upwards the component hierarchy until it finds a component
+ * that has a mouselistener attached.
+ *
+ * @param c the component to start searching from
+ *
+ * @return the actual receiver of the mouse event
+ */
+ private Component findTarget(Component c)
+ {
+ Component target = c;
+ while (target != null && target.getMouseListeners().length == 0)
+ {
+ target = target.getParent();
+ }
+ return target;
+ }
}
diff --git a/java/awt/ScrollPaneAdjustable.java b/java/awt/ScrollPaneAdjustable.java
index bec5b5106..21b58c36e 100644
--- a/java/awt/ScrollPaneAdjustable.java
+++ b/java/awt/ScrollPaneAdjustable.java
@@ -178,7 +178,16 @@ public class ScrollPaneAdjustable
public String paramString ()
{
- throw new Error ("not implemented");
+ return ("scrollpane=" + sp + ", orientation=" + orientation
+ + ", value=" + value + ", minimum=" + minimum
+ + ", maximum=" + maximum + ", visibleAmount=" + visibleAmount
+ + ", unitIncrement=" + unitIncrement
+ + ", blockIncrement=" + blockIncrement);
+ }
+
+ public String toString()
+ {
+ return getClass().getName() + "[" + paramString() + "]";
}
/**
diff --git a/java/awt/TexturePaint.java b/java/awt/TexturePaint.java
index a12e38463..57d7574c3 100644
--- a/java/awt/TexturePaint.java
+++ b/java/awt/TexturePaint.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt;
+import gnu.classpath.NotImplementedException;
+
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
@@ -65,10 +67,12 @@ public class TexturePaint implements Paint
Rectangle2D userBounds,
AffineTransform xform,
RenderingHints hints)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public int getTransparency()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
diff --git a/java/awt/Toolkit.java b/java/awt/Toolkit.java
index 03579cfe2..16f1caf85 100644
--- a/java/awt/Toolkit.java
+++ b/java/awt/Toolkit.java
@@ -1,5 +1,5 @@
/* Toolkit.java -- AWT Toolkit superclass
- Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,6 +39,7 @@ exception statement from your version. */
package java.awt;
+import gnu.classpath.SystemProperties;
import gnu.java.awt.peer.GLightweightPeer;
import java.awt.datatransfer.Clipboard;
@@ -78,10 +79,15 @@ import java.awt.peer.TextFieldPeer;
import java.awt.peer.WindowPeer;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
+import java.io.File;
+import java.io.FileInputStream;
import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Map;
import java.util.Properties;
+import java.util.StringTokenizer;
/**
* The AWT system uses a set of native peer objects to implement its
@@ -525,16 +531,27 @@ public abstract class Toolkit
{
if (toolkit != null)
return toolkit;
- String toolkit_name = System.getProperty("awt.toolkit",
- default_toolkit_name);
+ String toolkit_name = SystemProperties.getProperty("awt.toolkit",
+ default_toolkit_name);
try
{
- Class cls = Class.forName(toolkit_name);
+ ClassLoader cl;
+ cl = (ClassLoader) AccessController.doPrivileged
+ (new PrivilegedAction()
+ {
+ public Object run()
+ {
+ return ClassLoader.getSystemClassLoader();
+ }
+ });
+ Class cls = cl.loadClass(toolkit_name);
Object obj = cls.newInstance();
if (!(obj instanceof Toolkit))
throw new AWTError(toolkit_name + " is not a subclass of " +
"java.awt.Toolkit");
toolkit = (Toolkit) obj;
+
+ initAccessibility();
return toolkit;
}
catch (ThreadDeath death)
@@ -1215,4 +1232,138 @@ public abstract class Toolkit
* @since 1.3
*/
public abstract Map mapInputMethodHighlight(InputMethodHighlight highlight);
+
+ /**
+ * Initializes the accessibility framework. In particular, this loads the
+ * properties javax.accessibility.screen_magnifier_present and
+ * javax.accessibility.screen_reader_present and loads
+ * the classes specified in javax.accessibility.assistive_technologies.
+ */
+ private static void initAccessibility()
+ {
+ AccessController.doPrivileged
+ (new PrivilegedAction()
+ {
+ public Object run()
+ {
+ Properties props = new Properties();
+ String sep = File.separator;
+
+ // Try the user configuration.
+ try
+ {
+ File propsFile = new File(System.getProperty("user.home") + sep
+ + ".accessibility.properties");
+ FileInputStream in = new FileInputStream(propsFile);
+ props.load(in);
+ in.close();
+ }
+ catch (Exception ex)
+ {
+ // User configuration not present, ignore.
+ }
+
+ // Try the system configuration if there was no user configuration.
+ if (props.size() == 0)
+ {
+ try
+ {
+ File propsFile =
+ new File(System.getProperty("gnu.classpath.home.url")
+ + sep + "accessibility.properties");
+ FileInputStream in = new FileInputStream(propsFile);
+ props.load(in);
+ in.close();
+ }
+ catch (Exception ex)
+ {
+ // System configuration not present, ignore.
+ }
+ }
+
+ // Fetch the screen_magnifier_present property. Check systen properties
+ // first, then fallback to the configuration file.
+ String magPresent = SystemProperties.getProperty
+ ("javax.accessibility.screen_magnifier_present");
+ if (magPresent == null)
+ {
+ magPresent = props.getProperty("screen_magnifier_present");
+ if (magPresent != null)
+ {
+ SystemProperties.setProperty
+ ("javax.accessibility.screen_magnifier_present", magPresent);
+ }
+ }
+
+ // Fetch the screen_reader_present property. Check systen properties
+ // first, then fallback to the configuration file.
+ String readerPresent = SystemProperties.getProperty
+ ("javax.accessibility.screen_reader_present");
+ if (readerPresent == null)
+ {
+ readerPresent = props.getProperty("screen_reader_present");
+ if (readerPresent != null)
+ {
+ SystemProperties.setProperty
+ ("javax.accessibility.screen_reader_present", readerPresent);
+ }
+ }
+
+ // Fetch the list of classes to be loaded.
+ String classes = SystemProperties.getProperty
+ ("javax.accessibility.assistive_technologies");
+ if (classes == null)
+ {
+ classes = props.getProperty("assistive_technologies");
+ if (classes != null)
+ {
+ SystemProperties.setProperty
+ ("javax.accessibility.assistive_technologies", classes);
+ }
+ }
+
+ // Try to load the assisitive_technologies classes.
+ if (classes != null)
+ {
+ ClassLoader cl = ClassLoader.getSystemClassLoader();
+ StringTokenizer tokenizer = new StringTokenizer(classes, ",");
+ while (tokenizer.hasMoreTokens())
+ {
+ String className = tokenizer.nextToken();
+ try
+ {
+ Class atClass = cl.loadClass(className);
+ atClass.newInstance();
+ }
+ catch (ClassNotFoundException ex)
+ {
+ AWTError err = new AWTError("Assistive Technology class not"
+ + " found: " + className);
+ err.initCause(ex);
+ throw err;
+ }
+ catch (InstantiationException ex)
+ {
+ AWTError err =
+ new AWTError("Assistive Technology class cannot be "
+ + "instantiated: " + className);
+ err.initCause(ex);
+ throw err;
+ }
+ catch (IllegalAccessException ex)
+ {
+ AWTError err =
+ new AWTError("Assistive Technology class cannot be "
+ + "accessed: " + className);
+ err.initCause(err);
+ throw err;
+ }
+ }
+ }
+ return null;
+ }
+ });
+
+ }
+
} // class Toolkit
diff --git a/java/awt/Window.java b/java/awt/Window.java
index 71a8d388b..d9e90c0ea 100644
--- a/java/awt/Window.java
+++ b/java/awt/Window.java
@@ -1,5 +1,5 @@
/* Window.java --
- Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation
+ Copyright (C) 1999, 2000, 2002, 2003, 2004, 2006 Free Software Foundation
This file is part of GNU Classpath.
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt;
+import gnu.classpath.NotImplementedException;
+
import java.awt.event.ComponentEvent;
import java.awt.event.FocusEvent;
import java.awt.event.WindowAdapter;
@@ -620,10 +622,25 @@ public class Window extends Container implements Accessible
|| windowStateListener != null
|| (eventMask & AWTEvent.WINDOW_EVENT_MASK) != 0))
processEvent(e);
- else if (e.id == ComponentEvent.COMPONENT_RESIZED)
- validate ();
- else
- super.dispatchEventImpl(e);
+ else
+ {
+ if (peer != null && (e.id == ComponentEvent.COMPONENT_RESIZED
+ || e.id == ComponentEvent.COMPONENT_MOVED))
+ {
+ Rectangle bounds = peer.getBounds();
+ x = bounds.x;
+ y = bounds.y;
+ height = bounds.height;
+ width = bounds.width;
+
+ if (e.id == ComponentEvent.COMPONENT_RESIZED)
+ {
+ invalidate();
+ validate();
+ }
+ }
+ super.dispatchEventImpl(e);
+ }
}
/**
@@ -1032,6 +1049,7 @@ public class Window extends Container implements Accessible
* @deprecated
*/
public void applyResourceBundle(ResourceBundle rb)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
@@ -1143,6 +1161,47 @@ public class Window extends Container implements Accessible
{
this.focusableWindowState = focusableWindowState;
}
+
+ /**
+ * Check whether this Container is a focus cycle root.
+ * Returns always <code>true</code> as Windows are the
+ * root of the focus cycle.
+ *
+ * @return Always <code>true</code>.
+ *
+ * @since 1.4
+ */
+ public final boolean isFocusCycleRoot()
+ {
+ return true;
+ }
+
+ /**
+ * Set whether or not this Container is the root of a focus
+ * traversal cycle. Windows are the root of the focus cycle
+ * and therefore this method does nothing.
+ *
+ * @param focusCycleRoot ignored.
+ *
+ * @since 1.4
+ */
+ public final void setFocusCycleRoot(boolean focusCycleRoot)
+ {
+ // calls to the method are ignored
+ }
+
+ /**
+ * Returns the root container that owns the focus cycle where this
+ * component resides. Windows have no ancestors and this method
+ * returns always <code>null</code>.
+ *
+ * @return Always <code>null</code>.
+ * @since 1.4
+ */
+ public final Container getFocusCycleRootAncestor()
+ {
+ return null;
+ }
/**
* Generate a unique name for this window.
diff --git a/java/awt/datatransfer/SystemFlavorMap.java b/java/awt/datatransfer/SystemFlavorMap.java
index 7b4d2fbd3..a80665aee 100644
--- a/java/awt/datatransfer/SystemFlavorMap.java
+++ b/java/awt/datatransfer/SystemFlavorMap.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.datatransfer;
+import gnu.classpath.NotImplementedException;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -262,11 +264,13 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable
* version of the native.
*/
public List getFlavorsForNative (String nat)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
public List getNativesForFlavor (DataFlavor flav)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
diff --git a/java/awt/dnd/DragGestureRecognizer.java b/java/awt/dnd/DragGestureRecognizer.java
index 07b822e7a..37fde9178 100644
--- a/java/awt/dnd/DragGestureRecognizer.java
+++ b/java/awt/dnd/DragGestureRecognizer.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.dnd;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Point;
import java.awt.event.InputEvent;
@@ -126,6 +128,7 @@ public abstract class DragGestureRecognizer implements Serializable
}
public void resetRecognizer()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
@@ -152,6 +155,7 @@ public abstract class DragGestureRecognizer implements Serializable
}
protected void fireDragGestureRecognized(int dragAction, Point p)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
diff --git a/java/awt/dnd/DragSourceContext.java b/java/awt/dnd/DragSourceContext.java
index 2cf0d6d0b..88607b090 100644
--- a/java/awt/dnd/DragSourceContext.java
+++ b/java/awt/dnd/DragSourceContext.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.dnd;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Image;
@@ -86,6 +88,7 @@ public class DragSourceContext
DragGestureEvent trigger, Cursor cursor,
Image image, Point offset, Transferable trans,
DragSourceListener dsl)
+ throws NotImplementedException
{
if (peer == null
|| trigger == null)
@@ -130,6 +133,7 @@ public class DragSourceContext
}
public void setCursor (Cursor cursor)
+ throws NotImplementedException
{
this.cursor = cursor;
// FIXME: Check if we need to do more here
@@ -162,30 +166,37 @@ public class DragSourceContext
}
public void transferablesFlavorsChanged()
+ throws NotImplementedException
{
}
public void dragEnter(DragSourceDragEvent e)
+ throws NotImplementedException
{
}
public void dragOver(DragSourceDragEvent e)
+ throws NotImplementedException
{
}
public void dragExit(DragSourceEvent e)
+ throws NotImplementedException
{
}
public void dropActionChanged(DragSourceDragEvent e)
+ throws NotImplementedException
{
}
public void dragDropEnd(DragSourceDropEvent e)
+ throws NotImplementedException
{
}
public void dragMouseMoved(DragSourceDragEvent e)
+ throws NotImplementedException
{
}
@@ -195,6 +206,7 @@ public class DragSourceContext
}
protected void updateCurrentCursor(int dropOp, int targetAct, int status)
+ throws NotImplementedException
{
}
} // class DragSourceContext
diff --git a/java/awt/event/MouseEvent.java b/java/awt/event/MouseEvent.java
index 3e0fecacf..f2bcfbcc6 100644
--- a/java/awt/event/MouseEvent.java
+++ b/java/awt/event/MouseEvent.java
@@ -402,7 +402,11 @@ public class MouseEvent extends InputEvent
// FIXME: need a mauve test for this method
if (modifiersEx != 0)
s.append(",extModifiers=").append(getModifiersExText(modifiersEx));
- return s.append(",clickCount=").append(clickCount).toString();
+
+ s.append(",clickCount=").append(clickCount);
+ s.append(",consumed=").append(consumed);
+
+ return s.toString();
}
/**
diff --git a/java/awt/font/GlyphMetrics.java b/java/awt/font/GlyphMetrics.java
index 28b2088cf..18aaedc71 100644
--- a/java/awt/font/GlyphMetrics.java
+++ b/java/awt/font/GlyphMetrics.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.font;
+import gnu.classpath.NotImplementedException;
+
import java.awt.geom.Rectangle2D;
/**
@@ -93,11 +95,13 @@ public final class GlyphMetrics
}
public float getLSB ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public float getRSB ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
diff --git a/java/awt/font/GlyphVector.java b/java/awt/font/GlyphVector.java
index 57e2581ed..8d8a51d68 100644
--- a/java/awt/font/GlyphVector.java
+++ b/java/awt/font/GlyphVector.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.font;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.Shape;
@@ -70,12 +72,14 @@ public abstract class GlyphVector implements Cloneable
public abstract FontRenderContext getFontRenderContext ();
public int getGlyphCharIndex (int glyphIndex)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public int[] getGlyphCharIndices (int beginGlyphIndex, int numEntries,
int[] codeReturn)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
@@ -95,12 +99,14 @@ public abstract class GlyphVector implements Cloneable
public abstract Shape getGlyphOutline (int glyphIndex);
public Shape getGlyphOutline (int glyphIndex, float x, float y)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public Rectangle getGlyphPixelBounds (int index, FontRenderContext renderFRC,
float x, float y)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
@@ -116,6 +122,7 @@ public abstract class GlyphVector implements Cloneable
public abstract Shape getGlyphVisualBounds (int glyphIndex);
public int getLayoutFlags ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
@@ -130,6 +137,7 @@ public abstract class GlyphVector implements Cloneable
public Rectangle getPixelBounds (FontRenderContext renderFRC,
float x, float y)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
diff --git a/java/awt/font/GraphicAttribute.java b/java/awt/font/GraphicAttribute.java
index 79eae9955..107f16dcd 100644
--- a/java/awt/font/GraphicAttribute.java
+++ b/java/awt/font/GraphicAttribute.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.font;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
@@ -71,6 +73,7 @@ public abstract class GraphicAttribute
public abstract float getAscent ();
public Rectangle2D getBounds ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
@@ -78,6 +81,7 @@ public abstract class GraphicAttribute
public abstract float getDescent ();
public GlyphJustificationInfo getJustificationInfo ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
diff --git a/java/awt/font/ImageGraphicAttribute.java b/java/awt/font/ImageGraphicAttribute.java
index 77413f95d..c050255ee 100644
--- a/java/awt/font/ImageGraphicAttribute.java
+++ b/java/awt/font/ImageGraphicAttribute.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.font;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.Rectangle2D;
@@ -57,6 +59,7 @@ public final class ImageGraphicAttribute extends GraphicAttribute
public ImageGraphicAttribute (Image image, int alignment, float originX,
float originY)
+ throws NotImplementedException
{
super (alignment);
this.image = image;
@@ -65,6 +68,7 @@ public final class ImageGraphicAttribute extends GraphicAttribute
}
public void draw (Graphics2D graphics, float x, float y)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
@@ -78,31 +82,37 @@ public final class ImageGraphicAttribute extends GraphicAttribute
}
public boolean equals (ImageGraphicAttribute rhs)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public float getAdvance ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public float getAscent ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
- public Rectangle2D getBounds ()
+ public Rectangle2D getBounds ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public float getDescent ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public int hashCode ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
diff --git a/java/awt/font/LineBreakMeasurer.java b/java/awt/font/LineBreakMeasurer.java
index 0a6a96922..14985b44c 100644
--- a/java/awt/font/LineBreakMeasurer.java
+++ b/java/awt/font/LineBreakMeasurer.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.font;
+import gnu.classpath.NotImplementedException;
+
import java.text.AttributedCharacterIterator;
import java.text.BreakIterator;
@@ -69,6 +71,7 @@ public final class LineBreakMeasurer
public void deleteChar (AttributedCharacterIterator newParagraph,
int deletePos)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
@@ -80,28 +83,33 @@ public final class LineBreakMeasurer
public void insertChar (AttributedCharacterIterator newParagraph,
int insertPos)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public TextLayout nextLayout (float wrappingWidth)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public TextLayout nextLayout (float wrappingWidth, int offsetLimit,
boolean requireNextWord)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public int nextOffset (float wrappingWidth)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public int nextOffset (float wrappingWidth, int offsetLimit,
boolean requireNextWord)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
diff --git a/java/awt/font/NumericShaper.java b/java/awt/font/NumericShaper.java
index efbdcd49d..add1c6a44 100644
--- a/java/awt/font/NumericShaper.java
+++ b/java/awt/font/NumericShaper.java
@@ -39,99 +39,387 @@ exception statement from your version. */
package java.awt.font;
import java.io.Serializable;
+import java.lang.Character.UnicodeBlock;
/**
+ * This class handles numeric shaping. A shaper can either be contextual
+ * or not. A non-contextual shaper will always translate ASCII digits
+ * in its input into the target Unicode range. A contextual shaper will
+ * change the target Unicode range depending on the characters it has
+ * previously processed.
+ *
* @author Michael Koch
+ * @author Tom Tromey
+ *
* @since 1.4
+ * @specnote This class does not handle LIMBU or OSMANYA.
+ * @specnote The JDK does not seem to properly handle ranges without a
+ * digit zero, such as TAMIL. This implementation does.
*/
public final class NumericShaper implements Serializable
{
private static final long serialVersionUID = -8022764705923730308L;
-
+
+ /** Convenience constant representing all the valid Unicode ranges. */
public static final int ALL_RANGES = 524287;
+
+ /**
+ * Constant representing the Unicode ARABIC range. Shaping done
+ * using this range will translate to the arabic decimal characters.
+ * Use EASTERN_ARABIC if you want to shape to the eastern arabic
+ * (also known as the extended arabic) decimal characters.
+ */
public static final int ARABIC = 2;
+
+ /** Constant representing the Unicode BENGALI range. */
public static final int BENGALI = 16;
+
+ /** Constant representing the Unicode DEVANAGARI range. */
public static final int DEVANAGARI = 8;
+
+ /**
+ * Constant representing the Unicode extended arabic range.
+ * In Unicode there are two different sets of arabic digits;
+ * this selects the extended or eastern set.
+ */
public static final int EASTERN_ARABIC = 4;
+
+ /**
+ * Constant representing the Unicode ETHIOPIC range. Note that
+ * there is no digit zero in this range; an ASCII digit zero
+ * is left unchanged when shaping to this range.
+ */
public static final int ETHIOPIC = 65536;
+
+ /**
+ * Constant representing the Unicode EUROPEAN range. For
+ * contextual shaping purposes, characters in the various
+ * extended Latin character blocks are recognized as EUROPEAN.
+ */
public static final int EUROPEAN = 1;
+
+ /** Constant representing the Unicode GUJARATI range. */
public static final int GUJARATI = 64;
+
+ /** Constant representing the Unicode GURMUKHI range. */
public static final int GURMUKHI = 32;
+
+ /** Constant representing the Unicode KANNADA range. */
public static final int KANNADA = 1024;
+
+ /** Constant representing the Unicode KHMER range. */
public static final int KHMER = 131072;
+
+ /** Constant representing the Unicode LAO range. */
public static final int LAO = 8192;
+
+ /** Constant representing the Unicode MALAYALAM range. */
public static final int MALAYALAM = 2048;
+
+ /** Constant representing the Unicode MONGOLIAN range. */
public static final int MONGOLIAN = 262144;
+
+ /** Constant representing the Unicode MYANMAR range. */
public static final int MYANMAR = 32768;
+
+ /** Constant representing the Unicode ORIYA range. */
public static final int ORIYA = 128;
+
+ /**
+ * Constant representing the Unicode TAMIL range. Note that
+ * there is no digit zero in this range; an ASCII digit zero
+ * is left unchanged when shaping to this range.
+ */
public static final int TAMIL = 256;
+
+ /** Constant representing the Unicode TELUGU range. */
public static final int TELUGU = 512;
+
+ /** Constant representing the Unicode THAI range. */
public static final int THAI = 4096;
+
+ /** Constant representing the Unicode TIBETAN range. */
public static final int TIBETAN = 16384;
- private int ranges;
- private int context;
-
- private NumericShaper (int ranges, int context)
+ /**
+ * This table holds the zero digits for each language. This is hard-coded
+ * because the values will not change and the table layout is tied to the
+ * other constants in this class in any case. In the two places where a
+ * language does not have a zero digit, the character immediately preceeding
+ * the one digit is used instead. These languages are special-cased in
+ * the shaping code.
+ */
+ private static final char[] zeroDigits =
{
- this.ranges = ranges;
- this.context = context;
+ '0', // EUROPEAN
+ '\u0660', // ARABIC
+ '\u06f0', // EASTERN_ARABIC
+ '\u0966', // DEVANAGARI
+ '\u09e6', // BENGALI
+ '\u0a66', // GURMUKHI
+ '\u0ae6', // GUJARATI
+ '\u0b66', // ORIYA
+ '\u0be6', // TAMIL - special case as there is no digit zero
+ '\u0c66', // TELUGU
+ '\u0ce6', // KANNADA
+ '\u0d66', // MALAYALAM
+ '\u0e50', // THAI
+ '\u0ed0', // LAO
+ '\u0f20', // TIBETAN
+ '\u1040', // MYANMAR
+ '\u1368', // ETHIOPIC - special case as there is no digit zero
+ '\u17e0', // KHMER
+ '\u1810' // MONGOLIAN
+ };
+
+ /**
+ * The default initial context for this shaper, specified as
+ * an integer from 0 to 18.
+ */
+ private int key;
+
+ /**
+ * The target ranges handled by this shaper. If the shaper
+ * is not contextual, the high bit of this field will be set.
+ * @specnote This was discovered by reading the serialization spec
+ */
+ private int mask;
+
+ /**
+ * Create a new numeric shaper. The key given is a constant from
+ * this class, the constructor turns it into its internal form.
+ * @param key the key to use, as one of the manifest constants
+ * @param mask a mask of languages to shape for
+ */
+ private NumericShaper (int key, int mask)
+ {
+ // This internal form is a bit goofy, but it is specified by
+ // the serialization spec.
+ this.key = Integer.numberOfTrailingZeros(key);
+ this.mask = mask;
}
- public boolean equals (Object obj)
+ /**
+ * Return an integer representing all the languages for which this
+ * shaper will shape. The result is taken by "or"ing together
+ * the constants representing the various languages.
+ */
+ public int getRanges ()
{
- if (! (obj instanceof NumericShaper))
- return false;
+ return mask & ALL_RANGES;
+ }
- NumericShaper tmp = (NumericShaper) obj;
-
- return (ranges == tmp.ranges
- && context == tmp.context);
+ /**
+ * Return true if this shaper is contextual, false if it is not.
+ */
+ public boolean isContextual ()
+ {
+ return mask > 0;
}
- public static NumericShaper getContextualShaper (int ranges)
+ /**
+ * Shape the text in the given array. The starting context will
+ * be the context passed to the shaper at creation time.
+ * @param text the text to shape
+ * @param start the index of the starting character of the array
+ * @param count the number of characters in the array
+ */
+ public void shape (char[] text, int start, int count)
{
- throw new Error ("not implemented");
+ shape (text, start, count, 1 << key);
}
- public static NumericShaper getContextualShaper (int ranges,
- int defaultContext)
+ /**
+ * Given a unicode block object, return corresponding language constant.
+ * If the block is not recognized, returns zero. Note that as there
+ * is no separate ARABIC block in Character, this case must
+ * be specially handled by the caller; EASTERN_ARABIC is preferred when
+ * both are specified.
+ * @param b the unicode block to classify
+ * @return the language constant, or zero if not recognized
+ */
+ private int classify(UnicodeBlock b)
{
- throw new Error ("not implemented");
+ if (b == null)
+ return 0;
+ // ARABIC is handled by the caller; from testing we know
+ // that EASTERN_ARABIC takes precedence.
+ if (b == UnicodeBlock.ARABIC)
+ return EASTERN_ARABIC;
+ if (b == UnicodeBlock.BENGALI)
+ return BENGALI;
+ if (b == UnicodeBlock.DEVANAGARI)
+ return DEVANAGARI;
+ if (b == UnicodeBlock.ETHIOPIC)
+ return ETHIOPIC;
+ if (b == UnicodeBlock.BASIC_LATIN
+ || b == UnicodeBlock.LATIN_1_SUPPLEMENT
+ || b == UnicodeBlock.LATIN_EXTENDED_A
+ || b == UnicodeBlock.LATIN_EXTENDED_ADDITIONAL
+ || b == UnicodeBlock.LATIN_EXTENDED_B)
+ return EUROPEAN;
+ if (b == UnicodeBlock.GUJARATI)
+ return GUJARATI;
+ if (b == UnicodeBlock.GURMUKHI)
+ return GURMUKHI;
+ if (b == UnicodeBlock.KANNADA)
+ return KANNADA;
+ if (b == UnicodeBlock.KHMER)
+ return KHMER;
+ if (b == UnicodeBlock.LAO)
+ return LAO;
+ if (b == UnicodeBlock.MALAYALAM)
+ return MALAYALAM;
+ if (b == UnicodeBlock.MONGOLIAN)
+ return MONGOLIAN;
+ if (b == UnicodeBlock.MYANMAR)
+ return MYANMAR;
+ if (b == UnicodeBlock.ORIYA)
+ return ORIYA;
+ if (b == UnicodeBlock.TAMIL)
+ return TAMIL;
+ if (b == UnicodeBlock.TELUGU)
+ return TELUGU;
+ if (b == UnicodeBlock.THAI)
+ return THAI;
+ if (b == UnicodeBlock.TIBETAN)
+ return TIBETAN;
+ return 0;
}
- public int getRanges ()
+ /**
+ * Shape the given text, using the indicated initial context.
+ * If this shaper is not a contextual shaper, then the given context
+ * will be ignored.
+ * @param text the text to shape
+ * @param start the index of the first character of the text to shape
+ * @param count the number of characters to shape in the text
+ * @param context the initial context
+ * @throws IllegalArgumentException if the initial context is invalid
+ */
+ public void shape (char[] text, int start, int count, int context)
{
- return ranges;
+ int currentContext;
+ if (isContextual())
+ {
+ if (Integer.bitCount(context) != 1 || (context & ~ALL_RANGES) != 0)
+ throw new IllegalArgumentException("invalid context argument");
+ // If the indicated context is not one we are handling, reset it.
+ if ((context & mask) == 0)
+ currentContext = -1;
+ else
+ currentContext = Integer.numberOfTrailingZeros(context);
+ }
+ else
+ currentContext = key;
+
+ for (int i = 0; i < count; ++i)
+ {
+ char c = text[start + i];
+ if (c >= '0' && c <= '9')
+ {
+ if (currentContext >= 0)
+ {
+ // Shape into the current context.
+ if (c == '0'
+ && ((1 << currentContext) == TAMIL
+ || (1 << currentContext) == ETHIOPIC))
+ {
+ // No digit 0 in this context; do nothing.
+ }
+ else
+ text[start + i]
+ = (char) (zeroDigits[currentContext] + c - '0');
+ }
+ }
+ else if (isContextual())
+ {
+ // if c is in a group, set currentContext; else reset it.
+ int group = classify(UnicodeBlock.of(c));
+ // Specially handle ARABIC.
+ if (group == EASTERN_ARABIC && (mask & EASTERN_ARABIC) == 0
+ && (mask & ARABIC) != 0)
+ group = ARABIC;
+ if ((mask & group) != 0)
+ {
+ // The character was classified as being in a group
+ // we recognize, and it was selected by the shaper.
+ // So, change the context.
+ currentContext = Integer.numberOfTrailingZeros(group);
+ }
+ }
+ }
}
- public static NumericShaper getShaper (int singleRange)
+ public boolean equals (Object obj)
{
- throw new Error ("not implemented");
+ if (! (obj instanceof NumericShaper))
+ return false;
+ NumericShaper tmp = (NumericShaper) obj;
+ return key == tmp.key && mask == tmp.mask;
}
public int hashCode ()
{
- throw new Error ("not implemented");
+ return key ^ mask;
}
- public boolean isContextual ()
+ public String toString ()
{
- throw new Error ("not implemented");
+ // For debugging only.
+ return "key=" + key + "; mask=" + mask;
}
- public void shape (char[] text, int start, int count)
+ /**
+ * Return a non-contextual shaper which can shape to a single range.
+ * All ASCII digits in the input text are translated to this language.
+ * @param singleRange the target language
+ * @return a non-contextual shaper for this language
+ * @throws IllegalArgumentException if the argument does not name a
+ * single language, as specified by the constants declared in this class
+ */
+ public static NumericShaper getShaper (int singleRange)
{
- shape (text, start, count, context);
+ if (Integer.bitCount(singleRange) != 1)
+ throw new IllegalArgumentException("more than one bit set in argument");
+ if ((singleRange & ~ALL_RANGES) != 0)
+ throw new IllegalArgumentException("argument out of range");
+ return new NumericShaper(singleRange, Integer.MIN_VALUE | singleRange);
}
- public void shape (char[] text, int start, int count, int context)
+ /**
+ * Return a contextual shaper which can shape to any of the indicated
+ * languages. The default initial context for this shaper is EUROPEAN.
+ * @param ranges the ranges to shape to
+ * @return a contextual shaper which will target any of these ranges
+ * @throws IllegalArgumentException if the argument specifies an
+ * unrecognized range
+ */
+ public static NumericShaper getContextualShaper (int ranges)
{
- throw new Error ("not implemented");
+ if ((ranges & ~ALL_RANGES) != 0)
+ throw new IllegalArgumentException("argument out of range");
+ return new NumericShaper(EUROPEAN, ranges);
}
- public String toString ()
+ /**
+ * Return a contextual shaper which can shape to any of the indicated
+ * languages. The default initial context for this shaper is given as
+ * an argument.
+ * @param ranges the ranges to shape to
+ * @param defaultContext the default initial context
+ * @return a contextual shaper which will target any of these ranges
+ * @throws IllegalArgumentException if the ranges argument specifies an
+ * unrecognized range, or if the defaultContext argument does not specify
+ * a single valid range
+ */
+ public static NumericShaper getContextualShaper (int ranges,
+ int defaultContext)
{
- throw new Error ("not implemented");
+ if (Integer.bitCount(defaultContext) != 1)
+ throw new IllegalArgumentException("more than one bit set in context");
+ if ((ranges & ~ALL_RANGES) != 0 || (defaultContext & ~ALL_RANGES) != 0)
+ throw new IllegalArgumentException("argument out of range");
+ return new NumericShaper(defaultContext, ranges);
}
}
diff --git a/java/awt/font/ShapeGraphicAttribute.java b/java/awt/font/ShapeGraphicAttribute.java
index 6d64dece5..d5320854c 100644
--- a/java/awt/font/ShapeGraphicAttribute.java
+++ b/java/awt/font/ShapeGraphicAttribute.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.font;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;
@@ -58,6 +60,7 @@ public final class ShapeGraphicAttribute extends GraphicAttribute
}
public void draw (Graphics2D graphics, float x, float y)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
@@ -78,11 +81,13 @@ public final class ShapeGraphicAttribute extends GraphicAttribute
}
public float getAdvance ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public float getAscent ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
@@ -93,6 +98,7 @@ public final class ShapeGraphicAttribute extends GraphicAttribute
}
public float getDescent ()
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
diff --git a/java/awt/font/TextMeasurer.java b/java/awt/font/TextMeasurer.java
index 7fcdc87a8..18c286c57 100644
--- a/java/awt/font/TextMeasurer.java
+++ b/java/awt/font/TextMeasurer.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.awt.font;
+import gnu.classpath.NotImplementedException;
+
import java.text.AttributedCharacterIterator;
/**
@@ -70,27 +72,32 @@ public final class TextMeasurer implements Cloneable
public void deleteChar (AttributedCharacterIterator newParagraph,
int deletePos)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public float getAdvanceBetween (int start, int limit)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public TextLayout getLayout (int start, int limit)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public int getLineBreakIndex (int start, float maxAdvance)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
public void insertChar (AttributedCharacterIterator newParagraph,
int insertPos)
+ throws NotImplementedException
{
throw new Error ("not implemented");
}
diff --git a/java/awt/geom/Point2D.java b/java/awt/geom/Point2D.java
index 9f22a5a67..a2689abf8 100644
--- a/java/awt/geom/Point2D.java
+++ b/java/awt/geom/Point2D.java
@@ -1,5 +1,5 @@
/* Point2D.java -- generic point in 2-D space
- Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation
+ Copyright (C) 1999, 2000, 2002, 2004, 2006, Free Software Foundation
This file is part of GNU Classpath.
@@ -135,7 +135,7 @@ public abstract class Point2D implements Cloneable
*/
public double distanceSq(double x, double y)
{
- return distanceSq(getX(), x, getY(), y);
+ return distanceSq(getX(), getY(), x, y);
}
/**
@@ -147,7 +147,7 @@ public abstract class Point2D implements Cloneable
*/
public double distanceSq(Point2D p)
{
- return distanceSq(getX(), p.getX(), getY(), p.getY());
+ return distanceSq(getX(), getY(), p.getX(), p.getY());
}
/**
@@ -159,7 +159,7 @@ public abstract class Point2D implements Cloneable
*/
public double distance(double x, double y)
{
- return distance(getX(), x, getY(), y);
+ return distance(getX(), getY(), x, y);
}
/**
@@ -171,7 +171,7 @@ public abstract class Point2D implements Cloneable
*/
public double distance(Point2D p)
{
- return distance(getX(), p.getX(), getY(), p.getY());
+ return distance(getX(), getY(), p.getX(), p.getY());
}
/**
diff --git a/java/awt/image/AreaAveragingScaleFilter.java b/java/awt/image/AreaAveragingScaleFilter.java
index 6333ce9e7..44d5cec9d 100644
--- a/java/awt/image/AreaAveragingScaleFilter.java
+++ b/java/awt/image/AreaAveragingScaleFilter.java
@@ -1,5 +1,5 @@
/* AreaAveragingScaleFilter.java -- Java class for filtering images
- Copyright (C) 1999 Free Software Foundation, Inc.
+ Copyright (C) 1999,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,86 +45,225 @@ package java.awt.image;
* points should give the desired results although Sun does not
* specify what the exact algorithm should be.
* <br>
- * FIXME: Currently this filter does nothing and needs to be implemented.
*
* @author C. Brian Jones (cbj@gnu.org)
*/
public class AreaAveragingScaleFilter extends ReplicateScaleFilter
{
- /**
- * Construct an instance of <code>AreaAveragingScaleFilter</code> which
- * should be used in conjunction with a <code>FilteredImageSource</code>
- * object.
- *
- * @param width the width of the destination image
- * @param height the height of the destination image
- */
- public AreaAveragingScaleFilter(int width, int height) {
- super(width, height);
- }
-
- /**
- * The <code>ImageProducer</code> should call this method with a
- * bit mask of hints from any of <code>RANDOMPIXELORDER</code>,
- * <code>TOPDOWNLEFTRIGHT</code>, <code>COMPLETESCANLINES</code>,
- * <code>SINGLEPASS</code>, <code>SINGLEFRAME</code> from the
- * <code>ImageConsumer</code> interface.
- * <br>
- * FIXME - more than likely Sun's implementation desires
- * <code>TOPDOWNLEFTRIGHT</code> order and this method is overloaded here
- * in order to assure that mask is part of the hints added to
- * the consumer.
- *
- * @param flags a bit mask of hints
- * @see ImageConsumer
- */
- public void setHints(int flags)
- {
- if (consumer != null)
- consumer.setHints(flags);
- }
-
- /**
- * This function delivers a rectangle of pixels where any
- * pixel(m,n) is stored in the array as a <code>byte</code> at
- * index (n * scansize + m + offset).
- *
- * @param x the x coordinate of the rectangle
- * @param y the y coordinate of the rectangle
- * @param w the width of the rectangle
- * @param h the height of the rectangle
- * @param model the <code>ColorModel</code> used to translate the pixels
- * @param pixels the array of pixel values
- * @param offset the index of the first pixels in the <code>pixels</code> array
- * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
- */
- public void setPixels(int x, int y, int w, int h,
- ColorModel model, byte[] pixels, int offset, int scansize)
- {
- if (consumer != null)
- consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
- }
-
- /**
- * This function delivers a rectangle of pixels where any
- * pixel(m,n) is stored in the array as an <code>int</code> at
- * index (n * scansize + m + offset).
- *
- * @param x the x coordinate of the rectangle
- * @param y the y coordinate of the rectangle
- * @param w the width of the rectangle
- * @param h the height of the rectangle
- * @param model the <code>ColorModel</code> used to translate the pixels
- * @param pixels the array of pixel values
- * @param offset the index of the first pixels in the <code>pixels</code> array
- * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
- */
- public void setPixels(int x, int y, int w, int h,
- ColorModel model, int[] pixels, int offset, int scansize)
- {
- if (consumer != null)
- consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
- }
+ /**
+ * Construct an instance of <code>AreaAveragingScaleFilter</code> which
+ * should be used in conjunction with a <code>FilteredImageSource</code>
+ * object.
+ *
+ * @param width the width of the destination image
+ * @param height the height of the destination image
+ */
+ public AreaAveragingScaleFilter(int width, int height) {
+ super(width, height);
+ }
+ /**
+ * The <code>ImageProducer</code> should call this method with a
+ * bit mask of hints from any of <code>RANDOMPIXELORDER</code>,
+ * <code>TOPDOWNLEFTRIGHT</code>, <code>COMPLETESCANLINES</code>,
+ * <code>SINGLEPASS</code>, <code>SINGLEFRAME</code> from the
+ * <code>ImageConsumer</code> interface.
+ * <br>
+ * FIXME - more than likely Sun's implementation desires
+ * <code>TOPDOWNLEFTRIGHT</code> order and this method is overloaded here
+ * in order to assure that mask is part of the hints added to
+ * the consumer.
+ *
+ * @param flags a bit mask of hints
+ * @see ImageConsumer
+ */
+ public void setHints(int flags)
+ {
+ if (consumer != null)
+ consumer.setHints(flags);
+ }
+
+ /**
+ * This function delivers a rectangle of pixels where any
+ * pixel(m,n) is stored in the array as a <code>byte</code> at
+ * index (n * scansize + m + offset).
+ *
+ * @param x the x coordinate of the rectangle
+ * @param y the y coordinate of the rectangle
+ * @param w the width of the rectangle
+ * @param h the height of the rectangle
+ * @param model the <code>ColorModel</code> used to translate the pixels
+ * @param pixels the array of pixel values
+ * @param offset the index of the first pixels in the <code>pixels</code> array
+ * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+ */
+ public void setPixels(int x, int y, int w, int h,
+ ColorModel model, byte[] pixels, int offset, int scansize)
+ {
+ double rx = ((double) srcWidth) / destWidth;
+ double ry = ((double) srcHeight) / destHeight;
+
+ int destScansize = (int) Math.round(scansize / rx);
+
+ byte[] destPixels = averagePixels(x, y, w, h,
+ model, pixels, offset, scansize,
+ rx, ry, destScansize);
+
+ if (consumer != null)
+ consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
+ (int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
+ model, destPixels, 0, destScansize);
+ }
+
+ /**
+ * This function delivers a rectangle of pixels where any
+ * pixel(m,n) is stored in the array as an <code>int</code> at
+ * index (n * scansize + m + offset).
+ *
+ * @param x the x coordinate of the rectangle
+ * @param y the y coordinate of the rectangle
+ * @param w the width of the rectangle
+ * @param h the height of the rectangle
+ * @param model the <code>ColorModel</code> used to translate the pixels
+ * @param pixels the array of pixel values
+ * @param offset the index of the first pixels in the <code>pixels</code> array
+ * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+ */
+ public void setPixels(int x, int y, int w, int h,
+ ColorModel model, int[] pixels, int offset, int scansize)
+ {
+ double rx = ((double) srcWidth) / destWidth;
+ double ry = ((double) srcHeight) / destHeight;
+
+ int destScansize = (int) Math.round(scansize / rx);
+
+ int[] destPixels = averagePixels(x, y, w, h,
+ model, pixels, offset, scansize,
+ rx, ry, destScansize);
+
+ if (consumer != null)
+ consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
+ (int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
+ model, destPixels, 0, destScansize);
+ }
+
+ /**
+ * This is a really terrible implementation,
+ * since it uses the nearest-neighbor method. This filter is rarely used though.
+ *
+ * @param srcx, srcy - Source rectangle upper-left corner
+ * @param srcw, srch - Source rectangle width and height
+ * @param model - Pixel color model
+ * @param srcPixels - Source pixel data.
+ * @param srcOffset - Starting offset into the source pixel data array.
+ * @param srcScansize - Source array scanline size.
+ * @param rx,ry - Scaling factor.
+ * @param dstScansize - Destination array scanline size.
+ */
+ private byte[] averagePixels(int srcx, int srcy, int srcw, int srch,
+ ColorModel model, byte[] srcPixels,
+ int srcOffset, int srcScansize,
+ double rx, double ry, int destScansize)
+ {
+ int destW = (int) Math.ceil(srcw/rx);
+ int destH = (int) Math.ceil(srch/ry);
+ byte[] destPixels = new byte[ destW * destH ];
+ int sx, sy;
+
+ int w = (int)Math.ceil(rx);
+ int h = (int)Math.ceil(ry);
+
+ for(int x = 0; x < destW; x++)
+ for(int y = 0; y < destH; y++)
+ {
+ sx = (int) (x * rx);
+ sy = (int) (y * ry);
+
+ int r,g,b,a;
+ r = g = b = a = 0;
+
+ for(int i = 0; i < w; i++)
+ {
+ for(int j = 0; j < h; j++)
+ {
+ int idx = srcx + sx + i + (srcy + sy + j)*srcScansize;
+ r += model.getRed(srcPixels[ idx ]);
+ g += model.getGreen(srcPixels[ idx ]);
+ b += model.getBlue(srcPixels[ idx ]);
+ a += model.getAlpha(srcPixels[ idx ]);
+ }
+ }
+
+ r = r / (w * h);
+ g = g / (w * h);
+ b = b / (w * h);
+ a = a / (w * h);
+
+ // Does this really work?
+ destPixels[x + destScansize*y] = (byte)model.getDataElement
+ (new int[]{r, g, b, a}, 0);
+ }
+
+ return destPixels;
+ }
+
+ /**
+ * This is a really terrible implementation,
+ * since it uses the nearest-neighbor method. This filter is rarely used though.
+ *
+ * @param srcx, srcy - Source rectangle upper-left corner
+ * @param srcw, srch - Source rectangle width and height
+ * @param model - Pixel color model
+ * @param srcPixels - Source pixel data.
+ * @param srcOffset - Starting offset into the source pixel data array.
+ * @param srcScansize - Source array scanline size.
+ * @param rx,ry - Scaling factor.
+ * @param dstScansize - Destination array scanline size.
+ */
+ private int[] averagePixels(int srcx, int srcy, int srcw, int srch,
+ ColorModel model, int[] srcPixels,
+ int srcOffset, int srcScansize,
+ double rx, double ry, int destScansize)
+ {
+ int destW = (int) Math.ceil(srcw/rx);
+ int destH = (int) Math.ceil(srch/ry);
+ int[] destPixels = new int[ destW * destH ];
+ int sx, sy;
+
+ int w = (int)Math.ceil(rx);
+ int h = (int)Math.ceil(ry);
+
+ for(int x = 0; x < destW; x++)
+ for(int y = 0; y < destH; y++)
+ {
+ sx = (int) (x * rx);
+ sy = (int) (y * ry);
+
+ int r,g,b,a;
+ r = g = b = a = 0;
+
+ for(int i = 0; i < w; i++)
+ {
+ for(int j = 0; j < h; j++)
+ {
+ int idx = srcx + sx + i + (srcy + sy + j)*srcScansize;
+ r += model.getRed(srcPixels[ idx ]);
+ g += model.getGreen(srcPixels[ idx ]);
+ b += model.getBlue(srcPixels[ idx ]);
+ a += model.getAlpha(srcPixels[ idx ]);
+ }
+ }
+
+ r = r / (w * h);
+ g = g / (w * h);
+ b = b / (w * h);
+ a = a / (w * h);
+
+ destPixels[x + destScansize*y] = model.getDataElement
+ (new int[]{r, g, b, a}, 0);
+ }
+
+ return destPixels;
+ }
}
diff --git a/java/awt/image/ColorModel.java b/java/awt/image/ColorModel.java
index ec97416ae..40307f2b9 100644
--- a/java/awt/image/ColorModel.java
+++ b/java/awt/image/ColorModel.java
@@ -527,8 +527,8 @@ public abstract class ColorModel implements Transparency
float[] normComponents,
int normOffset)
{
- // subclasses has to implement this method.
- throw new UnsupportedOperationException();
+ int[] components = getComponents(pixel, null, 0);
+ return getNormalizedComponents(components, 0, normComponents, normOffset);
}
/**
diff --git a/java/awt/image/ComponentSampleModel.java b/java/awt/image/ComponentSampleModel.java
index 5cf06e4a1..b4e9450b0 100644
--- a/java/awt/image/ComponentSampleModel.java
+++ b/java/awt/image/ComponentSampleModel.java
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2002 Free Software Foundation
+/* Copyright (C) 2000, 2002, 2006, Free Software Foundation
This file is part of GNU Classpath.
@@ -38,6 +38,8 @@ package java.awt.image;
import gnu.java.awt.Buffers;
+import java.util.Arrays;
+
/* FIXME: This class does not yet support data type TYPE_SHORT */
/**
@@ -60,11 +62,14 @@ import gnu.java.awt.Buffers;
*/
public class ComponentSampleModel extends SampleModel
{
+ /** The offsets to the first sample for each band. */
protected int[] bandOffsets;
+
+ /** The indices of the bank used to store each band in a data buffer. */
protected int[] bankIndices;
/**
- * Number of bands in the image described.
+ * The number of bands in the image.
* @specnote This field shadows the protected numBands in SampleModel.
*/
protected int numBands;
@@ -72,42 +77,128 @@ public class ComponentSampleModel extends SampleModel
/** Used when creating data buffers. */
protected int numBanks;
+ /**
+ * The number of data elements between a sample in one row and the
+ * corresponding sample in the next row.
+ */
protected int scanlineStride;
+ /**
+ * The number of data elements between a sample for one pixel and the
+ * corresponding sample for the next pixel in the same row.
+ */
protected int pixelStride;
private boolean tightPixelPacking = false;
+ /**
+ * Creates a new sample model that assumes that all bands are stored in a
+ * single bank of the {@link DataBuffer}.
+ * <p>
+ * Note that the <code>bandOffsets</code> array is copied to internal storage
+ * to prevent subsequent changes to the array from affecting this object.
+ *
+ * @param dataType the data type (one of {@link DataBuffer#TYPE_BYTE},
+ * {@link DataBuffer#TYPE_USHORT}, {@link DataBuffer#TYPE_SHORT},
+ * {@link DataBuffer#TYPE_INT}, {@link DataBuffer#TYPE_FLOAT} or
+ * {@link DataBuffer#TYPE_DOUBLE}).
+ * @param w the width in pixels.
+ * @param h the height in pixels.
+ * @param pixelStride the number of data elements in the step from a sample
+ * in one pixel to the corresponding sample in the next pixel.
+ * @param scanlineStride the number of data elements in the step from a
+ * sample in a pixel to the corresponding sample in the pixel in the next
+ * row.
+ * @param bandOffsets the offset to the first element for each band, with
+ * the size of the array defining the number of bands (<code>null</code>
+ * not permitted).
+ *
+ * @throws IllegalArgumentException if <code>dataType</code> is not one of
+ * the specified values.
+ * @throws IllegalArgumentException if <code>w</code> is less than or equal
+ * to zero.
+ * @throws IllegalArgumentException if <code>h</code> is less than or equal
+ * to zero.
+ * @throws IllegalArgumentException if <code>w * h</code> exceeds
+ * {@link Integer#MAX_VALUE}.
+ * @throws IllegalArgumentException if <code>pixelStride</code> is negative.
+ * @throws IllegalArgumentException if <code>scanlineStride</code> is less
+ * than or equal to zero.
+ * @throws IllegalArgumentException if <code>bandOffsets</code> has zero
+ * length.
+ */
public ComponentSampleModel(int dataType,
- int w, int h,
- int pixelStride,
- int scanlineStride,
- int[] bandOffsets)
+ int w, int h,
+ int pixelStride,
+ int scanlineStride,
+ int[] bandOffsets)
{
this(dataType, w, h, pixelStride, scanlineStride,
- new int[bandOffsets.length], bandOffsets);
+ new int[bandOffsets.length], bandOffsets);
}
+ /**
+ * Creates a new sample model that assumes that all bands are stored in a
+ * single bank of the {@link DataBuffer}.
+ *
+ * @param dataType the data type (one of {@link DataBuffer#TYPE_BYTE},
+ * {@link DataBuffer#TYPE_USHORT}, {@link DataBuffer#TYPE_SHORT},
+ * {@link DataBuffer#TYPE_INT}, {@link DataBuffer#TYPE_FLOAT} or
+ * {@link DataBuffer#TYPE_DOUBLE}).
+ * @param w the width in pixels.
+ * @param h the height in pixels.
+ * @param pixelStride the number of data elements in the step from a sample
+ * in one pixel to the corresponding sample in the next pixel.
+ * @param scanlineStride the number of data elements in the step from a
+ * sample in a pixel to the corresponding sample in the pixel in the next
+ * row.
+ * @param bankIndices the index of the bank in which each band is stored
+ * (<code>null</code> not permitted). This array is copied to internal
+ * storage so that subsequent updates to the array do not affect the sample
+ * model.
+ * @param bandOffsets the offset to the first element for each band, with
+ * the size of the array defining the number of bands (<code>null</code>
+ * not permitted). This array is copied to internal storage so that
+ * subsequent updates to the array do not affect the sample model.
+ *
+ * @throws IllegalArgumentException if <code>dataType</code> is not one of
+ * the specified values.
+ * @throws IllegalArgumentException if <code>w</code> is less than or equal
+ * to zero.
+ * @throws IllegalArgumentException if <code>h</code> is less than or equal
+ * to zero.
+ * @throws IllegalArgumentException if <code>w * h</code> exceeds
+ * {@link Integer#MAX_VALUE}.
+ * @throws IllegalArgumentException if <code>pixelStride</code> is negative.
+ * @throws IllegalArgumentException if <code>scanlineStride</code> is less
+ * than or equal to zero.
+ * @throws IllegalArgumentException if <code>bandOffsets</code> has zero
+ * length.
+ */
public ComponentSampleModel(int dataType,
- int w, int h,
- int pixelStride,
- int scanlineStride,
- int[] bankIndices,
- int[] bandOffsets)
+ int w, int h,
+ int pixelStride,
+ int scanlineStride,
+ int[] bankIndices,
+ int[] bandOffsets)
{
super(dataType, w, h, bandOffsets.length);
- if ((pixelStride<0) || (scanlineStride<0) ||
- (bandOffsets.length<1) ||
- (bandOffsets.length != bankIndices.length))
+
+ // super permits DataBuffer.TYPE_UNDEFINED but this class doesn't...
+ if (dataType == DataBuffer.TYPE_UNDEFINED)
+ throw new IllegalArgumentException("Unsupported dataType.");
+
+ if ((pixelStride < 0) || (scanlineStride < 0) || (bandOffsets.length < 1)
+ || (bandOffsets.length != bankIndices.length))
throw new IllegalArgumentException();
- this.bandOffsets = bandOffsets;
- this.bankIndices = bankIndices;
+ this.bandOffsets = (int[]) bandOffsets.clone();
+ this.bankIndices = (int[]) bankIndices.clone();
this.numBands = bandOffsets.length;
this.numBanks = 0;
- for (int b=0; b<bankIndices.length; b++)
- this.numBanks = Math.max(this.numBanks, bankIndices[b]+1);
+ for (int b = 0; b < bankIndices.length; b++)
+ this.numBanks = Math.max(this.numBanks, bankIndices[b] + 1);
this.scanlineStride = scanlineStride;
this.pixelStride = pixelStride;
@@ -116,68 +207,122 @@ public class ComponentSampleModel extends SampleModel
/* FIXME: May these checks should be reserved for the
PixelInterleavedSampleModel? */
-
+
if (pixelStride == numBands)
{
- tightPixelPacking = true;
- for (int b=0; b<numBands; b++) {
- if ((bandOffsets[b] != b) || (bankIndices[b] !=0))
- {
- tightPixelPacking = false;
- break;
- }
- }
+ tightPixelPacking = true;
+ for (int b = 0; b < numBands; b++) {
+ if ((bandOffsets[b] != b) || (bankIndices[b] != 0))
+ {
+ tightPixelPacking = false;
+ break;
+ }
+ }
}
- }
-
+ }
+
+ /**
+ * Creates a new sample model that is compatible with this one, but with the
+ * specified dimensions.
+ *
+ * @param w the width (must be greater than zero).
+ * @param h the height (must be greater than zero).
+ *
+ * @return A new sample model.
+ */
public SampleModel createCompatibleSampleModel(int w, int h)
{
return new ComponentSampleModel(dataType, w, h, pixelStride,
- scanlineStride, bankIndices,
- bandOffsets);
+ scanlineStride, bankIndices,
+ bandOffsets);
}
+ /**
+ * Creates a new sample model that provides access to a subset of the bands
+ * that this sample model supports.
+ *
+ * @param bands the bands (<code>null</code> not permitted).
+ *
+ * @return The new sample model.
+ */
public SampleModel createSubsetSampleModel(int[] bands)
{
int numBands = bands.length;
int[] bankIndices = new int[numBands];
int[] bandOffsets = new int[numBands];
- for (int b=0; b<numBands; b++)
+ for (int b = 0; b < numBands; b++)
{
- bankIndices[b] = this.bankIndices[bands[b]];
- bandOffsets[b] = this.bandOffsets[bands[b]];
+ bankIndices[b] = this.bankIndices[bands[b]];
+ bandOffsets[b] = this.bandOffsets[bands[b]];
}
return new ComponentSampleModel(dataType, width, height, pixelStride,
- scanlineStride, bankIndices,
- bandOffsets);
+ scanlineStride, bankIndices,
+ bandOffsets);
}
+ /**
+ * Creates a new data buffer that is compatible with this sample model.
+ *
+ * @return The new data buffer.
+ */
public DataBuffer createDataBuffer()
{
// Maybe this value should be precalculated in the constructor?
int highestOffset = 0;
- for (int b=0; b<numBands; b++)
+ for (int b = 0; b < numBands; b++)
{
- highestOffset = Math.max(highestOffset, bandOffsets[b]);
+ highestOffset = Math.max(highestOffset, bandOffsets[b]);
}
- int size = pixelStride*(width-1) + scanlineStride*(height-1) +
- highestOffset + 1;
+ int size = pixelStride * (width - 1) + scanlineStride * (height - 1)
+ + highestOffset + 1;
return Buffers.createBuffer(getDataType(), size, numBanks);
}
+ /**
+ * Returns the offset of the sample in band 0 for the pixel at location
+ * <code>(x, y)</code>. This offset can be used to read a sample value from
+ * a {@link DataBuffer}.
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ *
+ * @return The offset.
+ *
+ * @see #getOffset(int, int, int)
+ */
public int getOffset(int x, int y)
{
return getOffset(x, y, 0);
}
+ /**
+ * Returns the offset of the sample in band <code>b</code> for the pixel at
+ * location <code>(x, y)</code>. This offset can be used to read a sample
+ * value from a {@link DataBuffer}.
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param b the band index.
+ *
+ * @return The offset.
+ */
public int getOffset(int x, int y, int b)
{
- return bandOffsets[b] + pixelStride*x + scanlineStride*y;
+ return bandOffsets[b] + pixelStride * x + scanlineStride * y;
}
+ /**
+ * Returns the size in bits for each sample (one per band). For this sample
+ * model, each band has the same sample size and this is determined by the
+ * data type for the sample model.
+ *
+ * @return The sample sizes.
+ *
+ * @see SampleModel#getDataType()
+ */
public final int[] getSampleSize()
{
int size = DataBuffer.getDataTypeSize(getDataType());
@@ -187,39 +332,101 @@ public class ComponentSampleModel extends SampleModel
return sizes;
}
+ /**
+ * Returns the size in bits for the samples in the specified band. In this
+ * class, the sample size is the same for every band and is determined from
+ * the data type for the model.
+ *
+ * @param band the band index (ignored here).
+ *
+ * @return The sample size in bits.
+ *
+ * @see SampleModel#getDataType()
+ */
public final int getSampleSize(int band)
{
return DataBuffer.getDataTypeSize(getDataType());
}
+ /**
+ * Returns the indices of the bank(s) in the {@link DataBuffer} used to
+ * store the samples for each band. The returned array is a copy, so that
+ * altering it will not impact the sample model.
+ *
+ * @return The bank indices.
+ */
public final int[] getBankIndices()
{
- return bankIndices;
+ return (int[]) bankIndices.clone();
}
+ /**
+ * Returns the offsets to the first sample in each band. The returned array
+ * is a copy, so that altering it will not impact the sample model.
+ *
+ * @return The offsets.
+ */
public final int[] getBandOffsets()
{
- return bandOffsets;
+ return (int[]) bandOffsets.clone();
}
+ /**
+ * Returns the distance (in terms of element indices) between the sample for
+ * one pixel and the corresponding sample for the equivalent pixel in the
+ * next row. This is used in the calculation of the element offset for
+ * retrieving samples from a {@link DataBuffer}.
+ *
+ * @return The distance between pixel samples in consecutive rows.
+ */
public final int getScanlineStride()
{
return scanlineStride;
}
+ /**
+ * Returns the distance (in terms of element indices) between the sample for
+ * one pixel and the corresponding sample for the next pixel in a row. This
+ * is used in the calculation of the element offset for retrieving samples
+ * from a {@link DataBuffer}.
+ *
+ * @return The distance between pixel samples in the same row.
+ */
public final int getPixelStride()
{
return pixelStride;
}
+ /**
+ * Returns the number of data elements used to store the samples for one
+ * pixel. In this model, this is the same as the number of bands.
+ *
+ * @return The number of data elements used to store the samples for one
+ * pixel.
+ */
public final int getNumDataElements()
{
return numBands;
}
+ /**
+ * Returns the samples for the pixel at location <code>(x, y)</code> in
+ * a primitive array (the array type is determined by the data type for
+ * this model). The <code>obj</code> argument provides an option to supply
+ * an existing array to hold the result, if this is <code>null</code> a new
+ * array will be allocated.
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param obj a primitive array that, if not <code>null</code>, will be
+ * used to store and return the sample values.
+ * @param data the data buffer (<code>null</code> not permitted).
+ *
+ * @return An array of sample values for the specified pixel.
+ */
public Object getDataElements(int x, int y, Object obj, DataBuffer data)
{
- int xyOffset = pixelStride*x + scanlineStride*y;
+ int xyOffset = pixelStride * x + scanlineStride * y;
int[] totalBandDataOffsets = new int[numBands];
@@ -235,124 +442,147 @@ public class ComponentSampleModel extends SampleModel
int[] bankOffsets = data.getOffsets();
- for (int b=0; b<numBands; b++)
+ for (int b = 0; b < numBands; b++)
{
- totalBandDataOffsets[b] =
- bandOffsets[b]+bankOffsets[bankIndices[b]] + xyOffset;
+ totalBandDataOffsets[b] = bandOffsets[b] + bankOffsets[bankIndices[b]]
+ + xyOffset;
}
-
+
try
{
- switch (getTransferType())
- {
- case DataBuffer.TYPE_BYTE:
- DataBufferByte inByte = (DataBufferByte) data;
- byte[] outByte = (byte[]) obj;
- if (outByte == null) outByte = new byte[numBands];
-
- for (int b=0; b<numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outByte[b] = inByte.getData(bankIndices[b])[dOffset];
- }
- return outByte;
-
- case DataBuffer.TYPE_USHORT:
- DataBufferUShort inUShort = (DataBufferUShort) data;
- short[] outUShort = (short[]) obj;
- if (outUShort == null) outUShort = new short[numBands];
-
- for (int b=0; b<numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outUShort[b] = inUShort.getData(bankIndices[b])[dOffset];
- }
- return outUShort;
-
- case DataBuffer.TYPE_SHORT:
- DataBufferShort inShort = (DataBufferShort) data;
- short[] outShort = (short[]) obj;
- if (outShort == null) outShort = new short[numBands];
-
- for (int b=0; b<numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outShort[b] = inShort.getData(bankIndices[b])[dOffset];
- }
- return outShort;
-
- case DataBuffer.TYPE_INT:
- DataBufferInt inInt = (DataBufferInt) data;
- int[] outInt = (int[]) obj;
- if (outInt == null) outInt = new int[numBands];
-
- for (int b=0; b<numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outInt[b] = inInt.getData(bankIndices[b])[dOffset];
- }
- return outInt;
-
- case DataBuffer.TYPE_FLOAT:
- DataBufferFloat inFloat = (DataBufferFloat) data;
- float[] outFloat = (float[]) obj;
- if (outFloat == null) outFloat = new float[numBands];
-
- for (int b=0; b<numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outFloat[b] = inFloat.getData(bankIndices[b])[dOffset];
- }
- return outFloat;
-
- case DataBuffer.TYPE_DOUBLE:
- DataBufferDouble inDouble = (DataBufferDouble) data;
- double[] outDouble = (double[]) obj;
- if (outDouble == null) outDouble = new double[numBands];
-
- for (int b=0; b<numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outDouble[b] = inDouble.getData(bankIndices[b])[dOffset];
- }
- return outDouble;
-
- default:
- throw new IllegalStateException("unknown transfer type " +
- getTransferType());
- }
+ switch (getTransferType())
+ {
+ case DataBuffer.TYPE_BYTE:
+ DataBufferByte inByte = (DataBufferByte) data;
+ byte[] outByte = (byte[]) obj;
+ if (outByte == null)
+ outByte = new byte[numBands];
+
+ for (int b = 0; b < numBands; b++)
+ {
+ int dOffset = totalBandDataOffsets[b];
+ outByte[b] = inByte.getData(bankIndices[b])[dOffset];
+ }
+ return outByte;
+
+ case DataBuffer.TYPE_USHORT:
+ DataBufferUShort inUShort = (DataBufferUShort) data;
+ short[] outUShort = (short[]) obj;
+ if (outUShort == null)
+ outUShort = new short[numBands];
+
+ for (int b = 0; b < numBands; b++)
+ {
+ int dOffset = totalBandDataOffsets[b];
+ outUShort[b] = inUShort.getData(bankIndices[b])[dOffset];
+ }
+ return outUShort;
+
+ case DataBuffer.TYPE_SHORT:
+ DataBufferShort inShort = (DataBufferShort) data;
+ short[] outShort = (short[]) obj;
+ if (outShort == null)
+ outShort = new short[numBands];
+
+ for (int b = 0; b < numBands; b++)
+ {
+ int dOffset = totalBandDataOffsets[b];
+ outShort[b] = inShort.getData(bankIndices[b])[dOffset];
+ }
+ return outShort;
+
+ case DataBuffer.TYPE_INT:
+ DataBufferInt inInt = (DataBufferInt) data;
+ int[] outInt = (int[]) obj;
+ if (outInt == null)
+ outInt = new int[numBands];
+
+ for (int b = 0; b < numBands; b++)
+ {
+ int dOffset = totalBandDataOffsets[b];
+ outInt[b] = inInt.getData(bankIndices[b])[dOffset];
+ }
+ return outInt;
+
+ case DataBuffer.TYPE_FLOAT:
+ DataBufferFloat inFloat = (DataBufferFloat) data;
+ float[] outFloat = (float[]) obj;
+ if (outFloat == null)
+ outFloat = new float[numBands];
+
+ for (int b = 0; b < numBands; b++)
+ {
+ int dOffset = totalBandDataOffsets[b];
+ outFloat[b] = inFloat.getData(bankIndices[b])[dOffset];
+ }
+ return outFloat;
+
+ case DataBuffer.TYPE_DOUBLE:
+ DataBufferDouble inDouble = (DataBufferDouble) data;
+ double[] outDouble = (double[]) obj;
+ if (outDouble == null)
+ outDouble = new double[numBands];
+
+ for (int b = 0; b < numBands; b++)
+ {
+ int dOffset = totalBandDataOffsets[b];
+ outDouble[b] = inDouble.getData(bankIndices[b])[dOffset];
+ }
+ return outDouble;
+
+ default:
+ throw new IllegalStateException("unknown transfer type "
+ + getTransferType());
+ }
}
catch (ArrayIndexOutOfBoundsException aioobe)
{
- String msg = "While reading data elements, " +
- "x=" + x + ", y=" + y +", " + ", xyOffset=" + xyOffset +
- ", data.getSize()=" + data.getSize() + ": " + aioobe;
- throw new ArrayIndexOutOfBoundsException(msg);
+ String msg = "While reading data elements, " +
+ "x=" + x + ", y=" + y +", " + ", xyOffset=" + xyOffset +
+ ", data.getSize()=" + data.getSize() + ": " + aioobe;
+ throw new ArrayIndexOutOfBoundsException(msg);
}
}
+ /**
+ * Returns the samples for the pixels in the region defined by
+ * <code>(x, y, w, h)</code> in a primitive array (the array type is
+ * determined by the data type for this model). The <code>obj</code>
+ * argument provides an option to supply an existing array to hold the
+ * result, if this is <code>null</code> a new array will be allocated.
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param w the width.
+ * @param h the height.
+ * @param obj a primitive array that, if not <code>null</code>, will be
+ * used to store and return the sample values.
+ * @param data the data buffer (<code>null</code> not permitted).
+ *
+ * @return An array of sample values for the specified pixels.
+ *
+ * @see #setDataElements(int, int, int, int, Object, DataBuffer)
+ */
public Object getDataElements(int x, int y, int w, int h, Object obj,
- DataBuffer data)
+ DataBuffer data)
{
if (!tightPixelPacking)
{
- return super.getDataElements(x, y, w, h, obj, data);
+ return super.getDataElements(x, y, w, h, obj, data);
}
// using get speedup
// We can copy whole rows
- int rowSize = w*numBands;
- int dataSize = rowSize*h;
+ int rowSize = w * numBands;
+ int dataSize = rowSize * h;
- DataBuffer transferBuffer =
- Buffers.createBuffer(getTransferType(), obj, dataSize);
+ DataBuffer transferBuffer = Buffers.createBuffer(getTransferType(), obj,
+ dataSize);
obj = Buffers.getData(transferBuffer);
- int inOffset =
- pixelStride*x +
- scanlineStride*y +
- data.getOffset(); // Assumes only one band is used
+ int inOffset = pixelStride * x + scanlineStride * y + data.getOffset();
+ // Assumes only one band is used
/* We don't add band offsets since we assume that bands have
offsets 0, 1, 2, ... */
@@ -360,189 +590,345 @@ public class ComponentSampleModel extends SampleModel
// See if we can copy everything in one go
if (scanlineStride == rowSize)
{
- // Collapse scan lines:
- rowSize *= h;
- // We ignore scanlineStride since it won't be of any use
- h = 1;
+ // Collapse scan lines:
+ rowSize *= h;
+ // We ignore scanlineStride since it won't be of any use
+ h = 1;
}
int outOffset = 0;
Object inArray = Buffers.getData(data);
- for (int yd = 0; yd<h; yd++)
+ for (int yd = 0; yd < h; yd++)
{
- System.arraycopy(inArray, inOffset, obj, outOffset, rowSize);
- inOffset += scanlineStride;
- outOffset += rowSize;
+ System.arraycopy(inArray, inOffset, obj, outOffset, rowSize);
+ inOffset += scanlineStride;
+ outOffset += rowSize;
}
return obj;
}
+ /**
+ * Sets the samples for the pixels in the region defined by
+ * <code>(x, y, w, h)</code> from a supplied primitive array (the array type
+ * must be consistent with the data type for this model).
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param w the width.
+ * @param h the height.
+ * @param obj a primitive array containing the sample values.
+ * @param data the data buffer (<code>null</code> not permitted).
+ *
+ * @see #getDataElements(int, int, int, int, Object, DataBuffer)
+ */
public void setDataElements(int x, int y, int w, int h,
- Object obj, DataBuffer data)
+ Object obj, DataBuffer data)
{
if (!tightPixelPacking)
{
- super.setDataElements(x, y, w, h, obj, data);
- return;
+ super.setDataElements(x, y, w, h, obj, data);
+ return;
}
// using set speedup, we can copy whole rows
- int rowSize = w*numBands;
- int dataSize = rowSize*h;
+ int rowSize = w * numBands;
+ int dataSize = rowSize * h;
- DataBuffer transferBuffer =
- Buffers.createBufferFromData(getTransferType(), obj, dataSize);
+ DataBuffer transferBuffer
+ = Buffers.createBufferFromData(getTransferType(), obj, dataSize);
int[] bankOffsets = data.getOffsets();
- int outOffset =
- pixelStride*x +
- scanlineStride*y +
- bankOffsets[0]; // same assuptions as in get...
+ int outOffset = pixelStride * x + scanlineStride * y + bankOffsets[0];
+ // same assumptions as in get...
// See if we can copy everything in one go
if (scanlineStride == rowSize)
{
- // Collapse scan lines:
- rowSize *= h;
- h = 1;
+ // Collapse scan lines:
+ rowSize *= h;
+ h = 1;
}
int inOffset = 0;
Object outArray = Buffers.getData(data);
- for (int yd = 0; yd<h; yd++)
+ for (int yd = 0; yd < h; yd++)
{
- System.arraycopy(obj, inOffset, outArray, outOffset, rowSize);
- outOffset += scanlineStride;
- inOffset += rowSize;
+ System.arraycopy(obj, inOffset, outArray, outOffset, rowSize);
+ outOffset += scanlineStride;
+ inOffset += rowSize;
}
}
+ /**
+ * Returns all the samples for the pixel at location <code>(x, y)</code>
+ * stored in the specified data buffer.
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param iArray an array that will be populated with the sample values and
+ * returned as the result. The size of this array should be equal to the
+ * number of bands in the model. If the array is <code>null</code>, a new
+ * array is created.
+ * @param data the data buffer (<code>null</code> not permitted).
+ *
+ * @return The samples for the specified pixel.
+ *
+ * @see #setPixel(int, int, int[], DataBuffer)
+ */
public int[] getPixel(int x, int y, int[] iArray, DataBuffer data)
{
- int offset = pixelStride*x + scanlineStride*y;
- if (iArray == null) iArray = new int[numBands];
- for (int b=0; b<numBands; b++)
+ int offset = pixelStride * x + scanlineStride * y;
+ if (iArray == null)
+ iArray = new int[numBands];
+ for (int b = 0; b < numBands; b++)
{
- iArray[b] = data.getElem(bankIndices[b], offset+bandOffsets[b]);
+ iArray[b] = data.getElem(bankIndices[b], offset + bandOffsets[b]);
}
return iArray;
}
+ /**
+ * Returns the samples for all the pixels in a rectangular region.
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param w the width.
+ * @param h the height.
+ * @param iArray an array that if non-<code>null</code> will be populated
+ * with the sample values and returned as the result.
+ * @param data the data buffer (<code>null</code> not permitted).
+ *
+ * @return The samples for all the pixels in the rectangle.
+ */
public int[] getPixels(int x, int y, int w, int h, int[] iArray,
- DataBuffer data)
+ DataBuffer data)
{
- int offset = pixelStride*x + scanlineStride*y;
- if (iArray == null) iArray = new int[numBands*w*h];
+ int offset = pixelStride * x + scanlineStride * y;
+ if (iArray == null)
+ iArray = new int[numBands * w * h];
int outOffset = 0;
- for (y=0; y<h; y++)
+ for (y = 0; y < h; y++)
{
- int lineOffset = offset;
- for (x=0; x<w; x++)
- {
- for (int b=0; b<numBands; b++)
- {
- iArray[outOffset++] =
- data.getElem(bankIndices[b], lineOffset+bandOffsets[b]);
- }
- lineOffset += pixelStride;
- }
- offset += scanlineStride;
+ int lineOffset = offset;
+ for (x = 0; x < w; x++)
+ {
+ for (int b = 0; b < numBands; b++)
+ {
+ iArray[outOffset++]
+ = data.getElem(bankIndices[b], lineOffset+bandOffsets[b]);
+ }
+ lineOffset += pixelStride;
+ }
+ offset += scanlineStride;
}
return iArray;
}
-
+
+ /**
+ * Returns the sample for band <code>b</code> of the pixel at
+ * <code>(x, y)</code> that is stored in the specified data buffer.
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param b the band index.
+ * @param data the data buffer (<code>null</code> not permitted).
+ *
+ * @return The sample value.
+ *
+ * @see #setSample(int, int, int, int, DataBuffer)
+ */
public int getSample(int x, int y, int b, DataBuffer data)
{
return data.getElem(bankIndices[b], getOffset(x, y, b));
}
+ /**
+ * Sets the samples for the pixel at location <code>(x, y)</code> from the
+ * supplied primitive array (the array type must be consistent with the data
+ * type for this model).
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param obj a primitive array containing the pixel's sample values.
+ * @param data the data buffer (<code>null</code> not permitted).
+ *
+ * @see #setDataElements(int, int, Object, DataBuffer)
+ */
public void setDataElements(int x, int y, Object obj, DataBuffer data)
{
- int offset = pixelStride*x + scanlineStride*y;
+ int offset = pixelStride * x + scanlineStride * y;
int[] totalBandDataOffsets = new int[numBands];
int[] bankOffsets = data.getOffsets();
- for (int b=0; b<numBands; b++)
- totalBandDataOffsets[b] =
- bandOffsets[b]+bankOffsets[bankIndices[b]] + offset;
+ for (int b = 0; b < numBands; b++)
+ totalBandDataOffsets[b] = bandOffsets[b] + bankOffsets[bankIndices[b]]
+ + offset;
switch (getTransferType())
{
case DataBuffer.TYPE_BYTE:
- {
- DataBufferByte out = (DataBufferByte) data;
- byte[] in = (byte[]) obj;
-
- for (int b=0; b<numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ {
+ DataBufferByte out = (DataBufferByte) data;
+ byte[] in = (byte[]) obj;
+
+ for (int b = 0; b < numBands; b++)
+ out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
+
+ return;
+ }
case DataBuffer.TYPE_USHORT:
- {
- DataBufferUShort out = (DataBufferUShort) data;
- short[] in = (short[]) obj;
-
- for (int b=0; b<numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ {
+ DataBufferUShort out = (DataBufferUShort) data;
+ short[] in = (short[]) obj;
+
+ for (int b = 0; b < numBands; b++)
+ out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
+
+ return;
+ }
case DataBuffer.TYPE_SHORT:
- {
- DataBufferShort out = (DataBufferShort) data;
- short[] in = (short[]) obj;
-
- for (int b=0; b<numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ {
+ DataBufferShort out = (DataBufferShort) data;
+ short[] in = (short[]) obj;
+
+ for (int b = 0; b < numBands; b++)
+ out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
+
+ return;
+ }
case DataBuffer.TYPE_INT:
- {
- DataBufferInt out = (DataBufferInt) data;
- int[] in = (int[]) obj;
-
- for (int b=0; b<numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ {
+ DataBufferInt out = (DataBufferInt) data;
+ int[] in = (int[]) obj;
+
+ for (int b = 0; b < numBands; b++)
+ out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
+
+ return;
+ }
case DataBuffer.TYPE_FLOAT:
- {
- DataBufferFloat out = (DataBufferFloat) data;
- float[] in = (float[]) obj;
-
- for (int b=0; b<numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ {
+ DataBufferFloat out = (DataBufferFloat) data;
+ float[] in = (float[]) obj;
+
+ for (int b = 0; b < numBands; b++)
+ out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
+
+ return;
+ }
case DataBuffer.TYPE_DOUBLE:
- {
- DataBufferDouble out = (DataBufferDouble) data;
- double[] in = (double[]) obj;
-
- for (int b=0; b<numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ {
+ DataBufferDouble out = (DataBufferDouble) data;
+ double[] in = (double[]) obj;
+
+ for (int b = 0; b < numBands; b++)
+ out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
+
+ return;
+ }
default:
- throw new UnsupportedOperationException("transfer type not " +
- "implemented");
+ throw new UnsupportedOperationException("transfer type not " +
+ "implemented");
}
}
+ /**
+ * Sets the sample values for the pixel at location <code>(x, y)</code>
+ * stored in the specified data buffer.
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param iArray the pixel sample values (<code>null</code> not permitted).
+ * @param data the data buffer (<code>null</code> not permitted).
+ *
+ * @see #getPixel(int, int, int[], DataBuffer)
+ */
public void setPixel(int x, int y, int[] iArray, DataBuffer data)
{
- int offset = pixelStride*x + scanlineStride*y;
- for (int b=0; b<numBands; b++)
- data.setElem(bankIndices[b], offset+bandOffsets[b], iArray[b]);
+ int offset = pixelStride * x + scanlineStride * y;
+ for (int b = 0; b < numBands; b++)
+ data.setElem(bankIndices[b], offset + bandOffsets[b], iArray[b]);
}
+ /**
+ * Sets the sample value for band <code>b</code> of the pixel at location
+ * <code>(x, y)</code> in the specified data buffer.
+ *
+ * @param x the x-coordinate.
+ * @param y the y-coordinate.
+ * @param b the band index.
+ * @param s the sample value.
+ * @param data the data buffer (<code>null</code> not permitted).
+ *
+ * @see #getSample(int, int, int, DataBuffer)
+ */
public void setSample(int x, int y, int b, int s, DataBuffer data)
{
data.setElem(bankIndices[b], getOffset(x, y, b), s);
}
+
+ /**
+ * Tests this sample model for equality with an arbitrary object. Returns
+ * <code>true</code> if and only if:
+ * <ul>
+ * <li><code>obj</code> is not <code>null</code>;</li>
+ * <li><code>obj</code> is an instance of <code>ComponentSampleModel</code>;
+ * </li>
+ * <li>both models have the same values for the <code>dataType</code>,
+ * <code>width</code>, <code>height</code>, <code>pixelStride</code>,
+ * <code>scanlineStride</code>, <code>bandOffsets</code> and
+ * <code>bankIndices</code> fields.</li>
+ * </ul>
+ *
+ * @param obj the object to test (<code>null</code> permitted).
+ *
+ * @return <code>true</code> if this sample model is equal to
+ * <code>obj</code>, and <code>false</code> otherwise.
+ */
+ public boolean equals(Object obj)
+ {
+ if (obj == null)
+ return false;
+ if (! (obj instanceof ComponentSampleModel))
+ return false;
+ ComponentSampleModel that = (ComponentSampleModel) obj;
+ if (this.dataType != that.dataType)
+ return false;
+ if (this.width != that.width)
+ return false;
+ if (this.height != that.height)
+ return false;
+ if (this.pixelStride != that.pixelStride)
+ return false;
+ if (this.scanlineStride != that.scanlineStride)
+ return false;
+ if (! Arrays.equals(this.bandOffsets, that.bandOffsets))
+ return false;
+ if (! Arrays.equals(this.bankIndices, that.bankIndices))
+ return false;
+ // couldn't find any difference, so...
+ return true;
+ }
+
+ /**
+ * Returns a hash code for this sample model.
+ *
+ * @return The hash code.
+ */
+ public int hashCode()
+ {
+ // this computation is based on the method described in Chapter 3
+ // of Joshua Bloch's Effective Java...
+ int result = 17;
+ result = 37 * result + dataType;
+ result = 37 * result + width;
+ result = 37 * result + height;
+ result = 37 * result + pixelStride;
+ result = 37 * result + scanlineStride;
+ for (int i = 0; i < bandOffsets.length; i++)
+ result = 37 * result + bandOffsets[i];
+ for (int i = 0; i < bankIndices.length; i++)
+ result = 37 * result + bankIndices[i];
+ return result;
+ }
}
diff --git a/java/awt/image/DirectColorModel.java b/java/awt/image/DirectColorModel.java
index 4f3715178..579dc97df 100644
--- a/java/awt/image/DirectColorModel.java
+++ b/java/awt/image/DirectColorModel.java
@@ -167,7 +167,7 @@ public class DirectColorModel extends PackedColorModel
private int extractAndNormalizeSample(int pixel, int component)
{
int value = extractAndScaleSample(pixel, component);
- if (hasAlpha() && isAlphaPremultiplied())
+ if (hasAlpha() && isAlphaPremultiplied() && getAlpha(pixel) != 0)
value = value*255/getAlpha(pixel);
return value;
}
diff --git a/java/awt/image/ReplicateScaleFilter.java b/java/awt/image/ReplicateScaleFilter.java
index d76f9db4b..6d5099dea 100644
--- a/java/awt/image/ReplicateScaleFilter.java
+++ b/java/awt/image/ReplicateScaleFilter.java
@@ -46,7 +46,6 @@ import java.util.Hashtable;
* exact method is not defined by Sun but some sort of fast Box filter should
* probably be correct.
* <br>
- * Currently this filter does nothing and needs to be implemented.
*
* @author C. Brian Jones (cbj@gnu.org)
*/
diff --git a/java/awt/image/SampleModel.java b/java/awt/image/SampleModel.java
index 115966222..6e3fd4069 100644
--- a/java/awt/image/SampleModel.java
+++ b/java/awt/image/SampleModel.java
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2001, 2002, 2005 Free Software Foundation
+/* Copyright (C) 2000, 2001, 2002, 2005, 2006, Free Software Foundation
This file is part of GNU Classpath.
@@ -57,15 +57,43 @@ public abstract class SampleModel
*/
protected int dataType;
+ /**
+ * Creates a new sample model with the specified attributes.
+ *
+ * @param dataType the data type (one of {@link DataBuffer#TYPE_BYTE},
+ * {@link DataBuffer#TYPE_USHORT}, {@link DataBuffer#TYPE_SHORT},
+ * {@link DataBuffer#TYPE_INT}, {@link DataBuffer#TYPE_FLOAT},
+ * {@link DataBuffer#TYPE_DOUBLE} or {@link DataBuffer#TYPE_UNDEFINED}).
+ * @param w the width in pixels (must be greater than zero).
+ * @param h the height in pixels (must be greater than zero).
+ * @param numBands the number of bands (must be greater than zero).
+ *
+ * @throws IllegalArgumentException if <code>dataType</code> is not one of
+ * the listed values.
+ * @throws IllegalArgumentException if <code>w</code> is less than or equal
+ * to zero.
+ * @throws IllegalArgumentException if <code>h</code> is less than or equal
+ * to zero.
+ * @throws IllegalArgumentException if <code>w * h</code> is greater than
+ * {@link Integer#MAX_VALUE}.
+ */
public SampleModel(int dataType, int w, int h, int numBands)
{
+ if (dataType != DataBuffer.TYPE_UNDEFINED)
+ if (dataType < DataBuffer.TYPE_BYTE || dataType > DataBuffer.TYPE_DOUBLE)
+ throw new IllegalArgumentException("Unrecognised 'dataType' argument.");
+
if ((w <= 0) || (h <= 0))
throw new IllegalArgumentException((w <= 0 ? " width<=0" : " width is ok")
- +(h <= 0 ? " height<=0" : " height is ok"));
-
- // FIXME: How can an int be greater than Integer.MAX_VALUE?
- // FIXME: How do we identify an unsupported data type?
-
+ + (h <= 0 ? " height<=0" : " height is ok"));
+
+ long area = (long) w * (long) h;
+ if (area > Integer.MAX_VALUE)
+ throw new IllegalArgumentException("w * h exceeds Integer.MAX_VALUE.");
+
+ if (numBands <= 0)
+ throw new IllegalArgumentException("Requires numBands > 0.");
+
this.dataType = dataType;
this.width = w;
this.height = h;
@@ -102,8 +130,10 @@ public abstract class SampleModel
public int[] getPixel(int x, int y, int[] iArray, DataBuffer data)
{
- if (iArray == null) iArray = new int[numBands];
- for (int b=0; b<numBands; b++) iArray[b] = getSample(x, y, b, data);
+ if (iArray == null)
+ iArray = new int[numBands];
+ for (int b = 0; b < numBands; b++)
+ iArray[b] = getSample(x, y, b, data);
return iArray;
}
@@ -121,94 +151,95 @@ public abstract class SampleModel
* DataBuffer.TYPE_USHORT, then a short[] object is returned.
*/
public abstract Object getDataElements(int x, int y, Object obj,
- DataBuffer data);
+ DataBuffer data);
public Object getDataElements(int x, int y, int w, int h, Object obj,
- DataBuffer data)
+ DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
int numDataElements = getNumDataElements();
- int dataSize = numDataElements*size;
+ int dataSize = numDataElements * size;
if (obj == null)
{
- switch (getTransferType())
- {
- case DataBuffer.TYPE_BYTE:
- obj = new byte[dataSize];
- break;
- case DataBuffer.TYPE_USHORT:
- obj = new short[dataSize];
- break;
- case DataBuffer.TYPE_INT:
- obj = new int[dataSize];
- break;
- default:
- // Seems like the only sensible thing to do.
- throw new ClassCastException();
- }
+ switch (getTransferType())
+ {
+ case DataBuffer.TYPE_BYTE:
+ obj = new byte[dataSize];
+ break;
+ case DataBuffer.TYPE_USHORT:
+ obj = new short[dataSize];
+ break;
+ case DataBuffer.TYPE_INT:
+ obj = new int[dataSize];
+ break;
+ default:
+ // Seems like the only sensible thing to do.
+ throw new ClassCastException();
+ }
}
Object pixelData = null;
int outOffset = 0;
- for (int yy = y; yy<(y+h); yy++)
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx = x; xx<(x+w); xx++)
- {
- pixelData = getDataElements(xx, yy, pixelData, data);
- System.arraycopy(pixelData, 0, obj, outOffset,
- numDataElements);
- outOffset += numDataElements;
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ pixelData = getDataElements(xx, yy, pixelData, data);
+ System.arraycopy(pixelData, 0, obj, outOffset,
+ numDataElements);
+ outOffset += numDataElements;
+ }
}
return obj;
}
public abstract void setDataElements(int x, int y, Object obj,
- DataBuffer data);
+ DataBuffer data);
public void setDataElements(int x, int y, int w, int h,
- Object obj, DataBuffer data)
+ Object obj, DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
int numDataElements = getNumDataElements();
- int dataSize = numDataElements*size;
+ int dataSize = numDataElements * size;
Object pixelData;
switch (getTransferType())
{
case DataBuffer.TYPE_BYTE:
- pixelData = new byte[numDataElements];
- break;
+ pixelData = new byte[numDataElements];
+ break;
case DataBuffer.TYPE_USHORT:
- pixelData = new short[numDataElements];
- break;
+ pixelData = new short[numDataElements];
+ break;
case DataBuffer.TYPE_INT:
- pixelData = new int[numDataElements];
- break;
+ pixelData = new int[numDataElements];
+ break;
default:
- // Seems like the only sensible thing to do.
- throw new ClassCastException();
+ // Seems like the only sensible thing to do.
+ throw new ClassCastException();
}
int inOffset = 0;
- for (int yy=y; yy<(y+h); yy++)
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- System.arraycopy(obj, inOffset, pixelData, 0,
- numDataElements);
- setDataElements(xx, yy, pixelData, data);
- inOffset += numDataElements;
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ System.arraycopy(obj, inOffset, pixelData, 0,
+ numDataElements);
+ setDataElements(xx, yy, pixelData, data);
+ inOffset += numDataElements;
+ }
}
}
public float[] getPixel(int x, int y, float[] fArray, DataBuffer data)
{
- if (fArray == null) fArray = new float[numBands];
+ if (fArray == null)
+ fArray = new float[numBands];
- for (int b=0; b<numBands; b++)
+ for (int b = 0; b < numBands; b++)
{
fArray[b] = getSampleFloat(x, y, b, data);
}
@@ -216,10 +247,11 @@ public abstract class SampleModel
}
public double[] getPixel(int x, int y, double[] dArray, DataBuffer data) {
- if (dArray == null) dArray = new double[numBands];
- for (int b=0; b<numBands; b++)
+ if (dArray == null)
+ dArray = new double[numBands];
+ for (int b = 0; b < numBands; b++)
{
- dArray[b] = getSampleDouble(x, y, b, data);
+ dArray[b] = getSampleDouble(x, y, b, data);
}
return dArray;
}
@@ -227,20 +259,21 @@ public abstract class SampleModel
/* FIXME: Should it return a banded or pixel interleaved array of
samples? (Assume interleaved.) */
public int[] getPixels(int x, int y, int w, int h, int[] iArray,
- DataBuffer data)
+ DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
int outOffset = 0;
int[] pixel = null;
- if (iArray == null) iArray = new int[w*h*numBands];
- for (int yy=y; yy<(y+h); yy++)
+ if (iArray == null)
+ iArray = new int[w * h * numBands];
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- pixel = getPixel(xx, yy, pixel, data);
- System.arraycopy(pixel, 0, iArray, outOffset, numBands);
- outOffset += numBands;
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ pixel = getPixel(xx, yy, pixel, data);
+ System.arraycopy(pixel, 0, iArray, outOffset, numBands);
+ outOffset += numBands;
+ }
}
return iArray;
}
@@ -248,20 +281,20 @@ public abstract class SampleModel
/* FIXME: Should it return a banded or pixel interleaved array of
samples? (Assume interleaved.) */
public float[] getPixels(int x, int y, int w, int h, float[] fArray,
- DataBuffer data)
+ DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
int outOffset = 0;
float[] pixel = null;
- if (fArray == null) fArray = new float[w*h*numBands];
- for (int yy=y; yy<(y+h); yy++)
+ if (fArray == null) fArray = new float[w * h * numBands];
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- pixel = getPixel(xx, yy, pixel, data);
- System.arraycopy(pixel, 0, fArray, outOffset, numBands);
- outOffset += numBands;
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ pixel = getPixel(xx, yy, pixel, data);
+ System.arraycopy(pixel, 0, fArray, outOffset, numBands);
+ outOffset += numBands;
+ }
}
return fArray;
}
@@ -269,20 +302,21 @@ public abstract class SampleModel
/* FIXME: Should it return a banded or pixel interleaved array of
samples? (Assume interleaved.) */
public double[] getPixels(int x, int y, int w, int h, double[] dArray,
- DataBuffer data)
+ DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
int outOffset = 0;
double[] pixel = null;
- if (dArray == null) dArray = new double[w*h*numBands];
- for (int yy=y; yy<(y+h); yy++)
+ if (dArray == null)
+ dArray = new double[w * h * numBands];
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- pixel = getPixel(xx, yy, pixel, data);
- System.arraycopy(pixel, 0, dArray, outOffset, numBands);
- outOffset += numBands;
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ pixel = getPixel(xx, yy, pixel, data);
+ System.arraycopy(pixel, 0, dArray, outOffset, numBands);
+ outOffset += numBands;
+ }
}
return dArray;
}
@@ -300,179 +334,185 @@ public abstract class SampleModel
}
public int[] getSamples(int x, int y, int w, int h, int b,
- int[] iArray, DataBuffer data)
+ int[] iArray, DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
int outOffset = 0;
- if (iArray == null) iArray = new int[size];
- for (int yy=y; yy<(y+h); yy++)
+ if (iArray == null)
+ iArray = new int[size];
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- iArray[outOffset++] = getSample(xx, yy, b, data);
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ iArray[outOffset++] = getSample(xx, yy, b, data);
+ }
}
return iArray;
}
public float[] getSamples(int x, int y, int w, int h, int b,
- float[] fArray, DataBuffer data)
+ float[] fArray, DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
int outOffset = 0;
- if (fArray == null) fArray = new float[size];
- for (int yy=y; yy<(y+h); yy++)
+ if (fArray == null)
+ fArray = new float[size];
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- fArray[outOffset++] = getSampleFloat(xx, yy, b, data);
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ fArray[outOffset++] = getSampleFloat(xx, yy, b, data);
+ }
}
return fArray;
}
public double[] getSamples(int x, int y, int w, int h, int b,
- double[] dArray, DataBuffer data)
+ double[] dArray, DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
int outOffset = 0;
- if (dArray == null) dArray = new double[size];
- for (int yy=y; yy<(y+h); yy++)
+ if (dArray == null)
+ dArray = new double[size];
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- dArray[outOffset++] = getSampleDouble(xx, yy, b, data);
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ dArray[outOffset++] = getSampleDouble(xx, yy, b, data);
+ }
}
return dArray;
}
public void setPixel(int x, int y, int[] iArray, DataBuffer data)
{
- for (int b=0; b<numBands; b++) setSample(x, y, b, iArray[b], data);
+ for (int b = 0; b < numBands; b++)
+ setSample(x, y, b, iArray[b], data);
}
public void setPixel(int x, int y, float[] fArray, DataBuffer data)
{
- for (int b=0; b<numBands; b++) setSample(x, y, b, fArray[b], data);
+ for (int b = 0; b < numBands; b++)
+ setSample(x, y, b, fArray[b], data);
}
public void setPixel(int x, int y, double[] dArray, DataBuffer data)
{
- for (int b=0; b<numBands; b++) setSample(x, y, b, dArray[b], data);
+ for (int b = 0; b < numBands; b++)
+ setSample(x, y, b, dArray[b], data);
}
public void setPixels(int x, int y, int w, int h, int[] iArray,
- DataBuffer data)
+ DataBuffer data)
{
int inOffset = 0;
int[] pixel = new int[numBands];
- for (int yy=y; yy<(y+h); yy++)
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- System.arraycopy(iArray, inOffset, pixel, 0, numBands);
- setPixel(xx, yy, pixel, data);
- inOffset += numBands;
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ System.arraycopy(iArray, inOffset, pixel, 0, numBands);
+ setPixel(xx, yy, pixel, data);
+ inOffset += numBands;
+ }
}
}
public void setPixels(int x, int y, int w, int h, float[] fArray,
- DataBuffer data)
+ DataBuffer data)
{
int inOffset = 0;
float[] pixel = new float[numBands];
- for (int yy=y; yy<(y+h); yy++)
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- System.arraycopy(fArray, inOffset, pixel, 0, numBands);
- setPixel(xx, yy, pixel, data);
- inOffset += numBands;
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ System.arraycopy(fArray, inOffset, pixel, 0, numBands);
+ setPixel(xx, yy, pixel, data);
+ inOffset += numBands;
+ }
}
}
public void setPixels(int x, int y, int w, int h, double[] dArray,
- DataBuffer data)
+ DataBuffer data)
{
int inOffset = 0;
double[] pixel = new double[numBands];
- for (int yy=y; yy<(y+h); yy++)
+ for (int yy = y; yy < (y + h); yy++)
{
- for (int xx=x; xx<(x+w); xx++)
- {
- System.arraycopy(dArray, inOffset, pixel, 0, numBands);
- setPixel(xx, yy, pixel, data);
- inOffset += numBands;
- }
+ for (int xx = x; xx < (x + w); xx++)
+ {
+ System.arraycopy(dArray, inOffset, pixel, 0, numBands);
+ setPixel(xx, yy, pixel, data);
+ inOffset += numBands;
+ }
}
}
public abstract void setSample(int x, int y, int b, int s,
- DataBuffer data);
+ DataBuffer data);
public void setSample(int x, int y, int b, float s,
- DataBuffer data)
+ DataBuffer data)
{
setSample(x, y, b, (int) s, data);
}
public void setSample(int x, int y, int b, double s,
- DataBuffer data)
+ DataBuffer data)
{
setSample(x, y, b, (float) s, data);
}
public void setSamples(int x, int y, int w, int h, int b,
- int[] iArray, DataBuffer data)
+ int[] iArray, DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
int inOffset = 0;
- for (int yy=y; yy<(y+h); yy++)
- for (int xx=x; xx<(x+w); xx++)
- setSample(xx, yy, b, iArray[inOffset++], data);
+ for (int yy = y; yy < (y + h); yy++)
+ for (int xx = x; xx < (x + w); xx++)
+ setSample(xx, yy, b, iArray[inOffset++], data);
}
public void setSamples(int x, int y, int w, int h, int b,
- float[] fArray, DataBuffer data)
+ float[] fArray, DataBuffer data)
{
- int size = w*h;
+ int size = w * h;
+ int inOffset = 0;
+ for (int yy = y; yy < (y + h); yy++)
+ for (int xx = x; xx < (x + w); xx++)
+ setSample(xx, yy, b, fArray[inOffset++], data);
+
+ }
+
+ public void setSamples(int x, int y, int w, int h, int b,
+ double[] dArray, DataBuffer data) {
+ int size = w * h;
int inOffset = 0;
- for (int yy=y; yy<(y+h); yy++)
- for (int xx=x; xx<(x+w); xx++)
- setSample(xx, yy, b, fArray[inOffset++], data);
-
- }
-
- public void setSamples(int x, int y, int w, int h, int b,
- double[] dArray, DataBuffer data) {
- int size = w*h;
- int inOffset = 0;
- for (int yy=y; yy<(y+h); yy++)
- for (int xx=x; xx<(x+w); xx++)
- setSample(xx, yy, b, dArray[inOffset++], data);
- }
-
- public abstract SampleModel createCompatibleSampleModel(int w, int h);
-
- /**
- * Return a SampleModel with a subset of the bands in this model.
- *
- * Selects bands.length bands from this sample model. The bands chosen
- * are specified in the indices of bands[]. This also permits permuting
- * the bands as well as taking a subset. Thus, giving an array with
- * 1, 2, 3, ..., numbands, will give an identical sample model.
- *
- * @param bands Array with band indices to include.
- * @return A new sample model
- */
- public abstract SampleModel createSubsetSampleModel(int[] bands);
-
- public abstract DataBuffer createDataBuffer();
-
- public abstract int[] getSampleSize();
-
- public abstract int getSampleSize(int band);
+ for (int yy = y; yy < (y + h); yy++)
+ for (int xx = x; xx < (x + w); xx++)
+ setSample(xx, yy, b, dArray[inOffset++], data);
+ }
+
+ public abstract SampleModel createCompatibleSampleModel(int w, int h);
+
+ /**
+ * Return a SampleModel with a subset of the bands in this model.
+ *
+ * Selects bands.length bands from this sample model. The bands chosen
+ * are specified in the indices of bands[]. This also permits permuting
+ * the bands as well as taking a subset. Thus, giving an array with
+ * 1, 2, 3, ..., numbands, will give an identical sample model.
+ *
+ * @param bands Array with band indices to include.
+ * @return A new sample model
+ */
+ public abstract SampleModel createSubsetSampleModel(int[] bands);
+
+ public abstract DataBuffer createDataBuffer();
+
+ public abstract int[] getSampleSize();
+
+ public abstract int getSampleSize(int band);
}
diff --git a/java/awt/image/renderable/RenderableImageProducer.java b/java/awt/image/renderable/RenderableImageProducer.java
index 78f3051ea..d8cca6535 100644
--- a/java/awt/image/renderable/RenderableImageProducer.java
+++ b/java/awt/image/renderable/RenderableImageProducer.java
@@ -1,5 +1,5 @@
/* RenderableImageProducer.java --
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,42 +38,129 @@ exception statement from your version. */
package java.awt.image.renderable;
+import java.awt.image.ColorModel;
+import java.awt.image.DataBuffer;
import java.awt.image.ImageConsumer;
import java.awt.image.ImageProducer;
+import java.awt.image.Raster;
+import java.awt.image.RenderedImage;
+import java.awt.image.SampleModel;
+import java.util.ArrayList;
+import java.util.Iterator;
public class RenderableImageProducer implements ImageProducer, Runnable
{
+ private RenderableImage image;
+ private RenderContext context;
+ private ArrayList consumers = new ArrayList();
+
public RenderableImageProducer(RenderableImage image, RenderContext context)
{
- throw new Error("not implemented");
+ this.image = image;
+ this.context = context;
}
public void setRenderContext(RenderContext context)
{
+ this.context = context;
}
public void addConsumer(ImageConsumer consumer)
{
+ synchronized (consumers)
+ {
+ if (! consumers.contains(consumer))
+ consumers.add(consumer);
+ }
}
public boolean isConsumer(ImageConsumer consumer)
{
- return false;
+ synchronized (consumers)
+ {
+ return consumers.contains(consumer);
+ }
}
public void removeConsumer(ImageConsumer consumer)
{
+ synchronized (consumers)
+ {
+ consumers.remove(consumer);
+ }
}
public void startProduction(ImageConsumer consumer)
{
+ addConsumer(consumer);
+ Thread t = new Thread(this, "RenderableImageProducerWorker");
+ t.start();
}
public void requestTopDownLeftRightResend(ImageConsumer consumer)
{
+ // Do nothing. The contract says we can ignore this call, so we do.
}
public void run()
{
+ // This isn't ideal but it avoids fail-fast problems.
+ // Alternatively, we could clone 'consumers' here.
+ synchronized (consumers)
+ {
+ RenderedImage newImage;
+ if (context == null)
+ newImage = image.createDefaultRendering();
+ else
+ newImage = image.createRendering(context);
+ Raster newData = newImage.getData();
+ ColorModel colorModel = newImage.getColorModel();
+ if (colorModel == null)
+ colorModel = ColorModel.getRGBdefault();
+ SampleModel sampleModel = newData.getSampleModel();
+ DataBuffer dataBuffer = newData.getDataBuffer();
+ int width = newData.getWidth();
+ int height = newData.getHeight();
+
+ // Initialize the consumers.
+ Iterator it = consumers.iterator();
+ while (it.hasNext())
+ {
+ ImageConsumer target = (ImageConsumer) it.next();
+ target.setHints(ImageConsumer.COMPLETESCANLINES
+ | ImageConsumer.SINGLEFRAME
+ | ImageConsumer.SINGLEPASS
+ | ImageConsumer.TOPDOWNLEFTRIGHT);
+ target.setDimensions(width, height);
+ }
+
+ // Work in scan-line order.
+ int[] newLine = new int[width];
+ int[] bands = new int[sampleModel.getNumBands()];
+ for (int y = 0; y < height; ++y)
+ {
+ for (int x = 0; x < width; ++x)
+ {
+ sampleModel.getPixel(x, y, bands, dataBuffer);
+ newLine[x] = colorModel.getDataElement(bands, 0);
+ }
+
+ // Tell the consumers about the new scan line.
+ it = consumers.iterator();
+ while (it.hasNext())
+ {
+ ImageConsumer target = (ImageConsumer) it.next();
+ target.setPixels(0, y, width, 1, colorModel, newLine, 0, width);
+ }
+ }
+
+ // Tell the consumers that we're done.
+ it = consumers.iterator();
+ while (it.hasNext())
+ {
+ ImageConsumer target = (ImageConsumer) it.next();
+ target.imageComplete(ImageConsumer.STATICIMAGEDONE);
+ }
+ }
}
} // class RenderableImageProducer
diff --git a/java/beans/beancontext/BeanContext.java b/java/beans/beancontext/BeanContext.java
index 3d1be7fc8..02f4a1a40 100644
--- a/java/beans/beancontext/BeanContext.java
+++ b/java/beans/beancontext/BeanContext.java
@@ -198,7 +198,7 @@ public interface BeanContext
* @return the created Bean
*
* @see java.beans.Beans#instantiate(java.lang.ClassLoader,java.lang.String)
- * @see java.beans.Beans#instantiate(java.lang.ClassLoader,java.lang.String,java.lang.BeanContext)
+ * @see java.beans.Beans#instantiate(java.lang.ClassLoader,java.lang.String,java.beans.beancontext.BeanContext)
* @exception IOException if there is an I/O problem during
* instantiation.
* @exception ClassNotFoundException if a serialized Bean's class
diff --git a/java/beans/beancontext/BeanContextMembershipEvent.java b/java/beans/beancontext/BeanContextMembershipEvent.java
index 317654266..9560889f8 100644
--- a/java/beans/beancontext/BeanContextMembershipEvent.java
+++ b/java/beans/beancontext/BeanContextMembershipEvent.java
@@ -52,7 +52,9 @@ import java.util.Iterator;
* @see java.beans.beancontext.BeanContextMembershipListener
*/
public class BeanContextMembershipEvent extends BeanContextEvent {
- /**
+ private static final long serialVersionUID = 3499346510334590959L;
+
+ /**
* The children that were added or removed.
*/
protected Collection children;
diff --git a/java/beans/beancontext/BeanContextServiceAvailableEvent.java b/java/beans/beancontext/BeanContextServiceAvailableEvent.java
index eea10f261..6dc2c38ab 100644
--- a/java/beans/beancontext/BeanContextServiceAvailableEvent.java
+++ b/java/beans/beancontext/BeanContextServiceAvailableEvent.java
@@ -49,7 +49,9 @@ import java.util.Iterator;
*/
public class BeanContextServiceAvailableEvent extends BeanContextEvent {
- /**
+ private static final long serialVersionUID = -5333985775656400778L;
+
+ /**
* The <code>Class</code> representing the service which is now
* available.
*/
diff --git a/java/beans/beancontext/BeanContextServiceRevokedEvent.java b/java/beans/beancontext/BeanContextServiceRevokedEvent.java
index dfa2b89b3..1f5ebd3cd 100644
--- a/java/beans/beancontext/BeanContextServiceRevokedEvent.java
+++ b/java/beans/beancontext/BeanContextServiceRevokedEvent.java
@@ -47,7 +47,9 @@ package java.beans.beancontext;
*/
public class BeanContextServiceRevokedEvent extends BeanContextEvent {
- /**
+ private static final long serialVersionUID = -1295543154724961754L;
+
+ /**
* The <code>Class</code> representing the service which is now
* available.
*/
diff --git a/java/beans/beancontext/BeanContextServicesSupport.java b/java/beans/beancontext/BeanContextServicesSupport.java
index 0cffbc596..4da523eeb 100644
--- a/java/beans/beancontext/BeanContextServicesSupport.java
+++ b/java/beans/beancontext/BeanContextServicesSupport.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.beans.beancontext;
+import gnu.classpath.NotImplementedException;
+
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
@@ -63,8 +65,9 @@ public class BeanContextServicesSupport
{
private static final long serialVersionUID = -3263851306889194873L;
- private BCSSChild()
+ BCSSChild(Object targetChild, Object peer)
{
+ super(targetChild, peer);
}
}
@@ -80,6 +83,7 @@ public class BeanContextServicesSupport
public Iterator getCurrentServiceSelectors (BeanContextServices bcs,
Class serviceClass)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
@@ -88,6 +92,7 @@ public class BeanContextServicesSupport
Object requestor,
Class serviceClass,
Object serviceSelector)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
@@ -95,11 +100,13 @@ public class BeanContextServicesSupport
public void releaseService (BeanContextServices bcs,
Object requestor,
Object service)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
public void serviceRevoked (BeanContextServiceRevokedEvent bcsre)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
@@ -160,105 +167,154 @@ public class BeanContextServicesSupport
public void addBeanContextServicesListener
(BeanContextServicesListener listener)
{
- if (! bcsListeners.contains(listener))
- bcsListeners.add(listener);
+ synchronized (bcsListeners)
+ {
+ if (! bcsListeners.contains(listener))
+ bcsListeners.add(listener);
+ }
}
- public boolean addService (Class serviceClass, BeanContextServiceProvider bcsp)
+ public boolean addService (Class serviceClass,
+ BeanContextServiceProvider bcsp)
{
- throw new Error ("Not implemented");
+ return addService(serviceClass, bcsp, true);
}
protected boolean addService (Class serviceClass,
BeanContextServiceProvider bcsp,
boolean fireEvent)
{
- throw new Error ("Not implemented");
+ synchronized (services)
+ {
+ if (services.containsKey(serviceClass))
+ return false;
+ services.put(serviceClass, bcsp);
+ if (bcsp instanceof Serializable)
+ ++serializable;
+ fireServiceAdded(serviceClass);
+ return true;
+ }
}
protected void bcsPreDeserializationHook (ObjectInputStream ois)
- throws ClassNotFoundException, IOException
+ throws ClassNotFoundException, IOException, NotImplementedException
{
throw new Error ("Not implemented");
}
protected void bcsPreSerializationHook (ObjectOutputStream oos)
- throws IOException
+ throws IOException, NotImplementedException
{
throw new Error ("Not implemented");
}
protected void childJustRemovedHook (Object child,
BeanContextSupport.BCSChild bcsc)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected BeanContextSupport.BCSChild createBCSChild (Object targetChild,
- Object peer)
+ Object peer)
{
- throw new Error ("Not implemented");
+ return new BCSSChild(targetChild, peer);
}
protected BeanContextServicesSupport.BCSSServiceProvider
createBCSSServiceProvider (Class sc, BeanContextServiceProvider bcsp)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected final void fireServiceAdded (BeanContextServiceAvailableEvent bcssae)
{
- throw new Error ("Not implemented");
+ synchronized (bcsListeners)
+ {
+ int size = bcsListeners.size();
+ for (int i = 0; i < size; ++i)
+ {
+ BeanContextServicesListener bcsl
+ = (BeanContextServicesListener) bcsListeners.get(i);
+ bcsl.serviceAvailable(bcssae);
+ }
+ }
}
- protected final void fireServiceAdded (Class serviceClass)
+ protected final void fireServiceAdded (Class serviceClass)
{
- throw new Error ("Not implemented");
+ fireServiceAdded(new BeanContextServiceAvailableEvent(this,
+ serviceClass));
}
protected final void fireServiceRevoked(BeanContextServiceRevokedEvent event)
{
- throw new Error ("Not implemented");
+ synchronized (bcsListeners)
+ {
+ int size = bcsListeners.size();
+ for (int i = 0; i < size; ++i)
+ {
+ BeanContextServicesListener bcsl
+ = (BeanContextServicesListener) bcsListeners.get(i);
+ bcsl.serviceRevoked(event);
+ }
+ }
}
protected final void fireServiceRevoked (Class serviceClass,
boolean revokeNow)
{
- throw new Error ("Not implemented");
+ fireServiceRevoked(new BeanContextServiceRevokedEvent(this, serviceClass,
+ revokeNow));
}
public BeanContextServices getBeanContextServicesPeer ()
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected static final BeanContextServicesListener
- getChildBeanContextServicesListener (Object child)
+ getChildBeanContextServicesListener (Object child)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
- public Iterator getCurrentServiceClasses ()
+ public Iterator getCurrentServiceClasses ()
{
- throw new Error ("Not implemented");
+ synchronized (services)
+ {
+ return services.keySet().iterator();
+ }
}
- public Iterator getCurrentServiceSelectors (Class serviceClass)
+ public Iterator getCurrentServiceSelectors (Class serviceClass)
{
- throw new Error ("Not implemented");
+ synchronized (services)
+ {
+ // FIXME: what if service does not exist? Must write a test.
+ BeanContextServiceProvider bcsp
+ = (BeanContextServiceProvider) services.get(serviceClass);
+ return bcsp.getCurrentServiceSelectors(this, serviceClass);
+ }
}
public Object getService (BeanContextChild child, Object requestor,
Class serviceClass, Object serviceSelector,
BeanContextServiceRevokedListener bcsrl)
- throws TooManyListenersException
+ throws TooManyListenersException, NotImplementedException
{
throw new Error ("Not implemented");
}
public boolean hasService (Class serviceClass)
{
- throw new Error ("Not implemented");
+ synchronized (services)
+ {
+ return services.containsKey(serviceClass);
+ }
}
public void initialize ()
@@ -269,18 +325,21 @@ public class BeanContextServicesSupport
services = new HashMap();
}
- protected void initializeBeanContextResources ()
+ protected void initializeBeanContextResources ()
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
- protected void releaseBeanContextResources ()
+ protected void releaseBeanContextResources ()
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
public void releaseService (BeanContextChild child, Object requestor,
Object service)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
@@ -288,25 +347,52 @@ public class BeanContextServicesSupport
public void removeBeanContextServicesListener
(BeanContextServicesListener listener)
{
- int index = bcsListeners.indexOf(listener);
-
- if (index > -1)
- bcsListeners.remove(index);
+ synchronized (bcsListeners)
+ {
+ int index = bcsListeners.indexOf(listener);
+ if (index > -1)
+ bcsListeners.remove(index);
+ }
}
public void revokeService (Class serviceClass, BeanContextServiceProvider bcsp,
- boolean revokeCurrentServicesNow)
+ boolean revokeCurrentServicesNow)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
- public void serviceAvailable (BeanContextServiceAvailableEvent bcssae)
- {
- throw new Error ("Not implemented");
- }
-
- public void serviceRevoked (BeanContextServiceRevokedEvent bcssre)
- {
- throw new Error ("Not implemented");
+ public void serviceAvailable (BeanContextServiceAvailableEvent bcssae)
+ {
+ synchronized (services)
+ {
+ Class klass = bcssae.getServiceClass();
+ if (services.containsKey(klass))
+ return;
+ Iterator it = bcsChildren();
+ while (it.hasNext())
+ {
+ Object obj = it.next();
+ if (obj instanceof BeanContextServices)
+ ((BeanContextServices) obj).serviceAvailable(bcssae);
+ }
+ }
+ }
+
+ public void serviceRevoked (BeanContextServiceRevokedEvent bcssre)
+ {
+ synchronized (services)
+ {
+ Class klass = bcssre.getServiceClass();
+ if (services.containsKey(klass))
+ return;
+ Iterator it = bcsChildren();
+ while (it.hasNext())
+ {
+ Object obj = it.next();
+ if (obj instanceof BeanContextServices)
+ ((BeanContextServices) obj).serviceRevoked(bcssre);
+ }
+ }
}
}
diff --git a/java/beans/beancontext/BeanContextSupport.java b/java/beans/beancontext/BeanContextSupport.java
index fe11aab87..f3d5ff609 100644
--- a/java/beans/beancontext/BeanContextSupport.java
+++ b/java/beans/beancontext/BeanContextSupport.java
@@ -38,6 +38,9 @@ exception statement from your version. */
package java.beans.beancontext;
+import gnu.classpath.NotImplementedException;
+
+import java.beans.DesignMode;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
@@ -64,15 +67,19 @@ public class BeanContextSupport extends BeanContextChildSupport
VetoableChangeListener
{
private static final long serialVersionUID = -4879613978649577204L;
-
+
+ // This won't show up in japi, but we mark it as a stub anyway,
+ // so that searches for NotImplementedException will find it.
private void readObject (ObjectInputStream s)
- throws ClassNotFoundException, IOException
+ throws ClassNotFoundException, IOException, NotImplementedException
{
throw new Error ("Not implemented");
}
+ // This won't show up in japi, but we mark it as a stub anyway,
+ // so that searches for NotImplementedException will find it.
private void writeObject (ObjectOutputStream s)
- throws ClassNotFoundException, IOException
+ throws ClassNotFoundException, IOException, NotImplementedException
{
throw new Error ("Not implemented");
}
@@ -81,25 +88,33 @@ public class BeanContextSupport extends BeanContextChildSupport
{
private static final long serialVersionUID = -5815286101609939109L;
- BCSChild()
+ private Object targetChild;
+ private Object peer;
+
+ BCSChild(Object targetChild, Object peer)
{
+ this.targetChild = targetChild;
+ this.peer = peer;
}
}
protected static final class BCSIterator implements Iterator
{
- BCSIterator()
+ private Iterator child;
+
+ BCSIterator(Iterator child)
{
+ this.child = child;
}
public boolean hasNext ()
{
- throw new Error ("Not implemented");
+ return child.hasNext();
}
public Object next ()
{
- throw new Error ("Not implemented");
+ return child.next();
}
public void remove ()
@@ -156,7 +171,9 @@ public class BeanContextSupport extends BeanContextChildSupport
public BeanContextSupport (BeanContext peer, Locale lcle, boolean dtime,
boolean visible)
{
- locale = lcle;
+ super(peer);
+
+ locale = lcle == null ? Locale.getDefault() : lcle;
designTime = dtime;
okToUseGui = visible;
@@ -168,150 +185,214 @@ public class BeanContextSupport extends BeanContextChildSupport
if (targetChild == null)
throw new IllegalArgumentException();
- if (children.containsKey(targetChild))
- return false;
-
- // FIXME: The second argument is surely wrong.
- children.put(targetChild, targetChild);
+ BCSChild child;
+ synchronized (children)
+ {
+ if (children.containsKey(targetChild)
+ || ! validatePendingAdd(targetChild))
+ return false;
+ child = createBCSChild(targetChild, beanContextChildPeer);
+ children.put(targetChild, child);
+ }
+ synchronized (targetChild)
+ {
+ childJustAddedHook(targetChild, child);
+ }
+ fireChildrenAdded(new BeanContextMembershipEvent(this,
+ new Object[] { targetChild }));
return true;
}
public boolean addAll (Collection c)
{
+ // Intentionally throws an exception.
throw new UnsupportedOperationException();
}
public void addBeanContextMembershipListener
(BeanContextMembershipListener listener)
{
- if (! bcmListeners.contains(listener))
- bcmListeners.add(listener);
+ synchronized (bcmListeners)
+ {
+ if (! bcmListeners.contains(listener))
+ bcmListeners.add(listener);
+ }
}
public boolean avoidingGui ()
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected Iterator bcsChildren ()
{
- throw new Error ("Not implemented");
+ synchronized (children)
+ {
+ return new BCSIterator(children.values().iterator());
+ }
}
protected void bcsPreDeserializationHook (ObjectInputStream ois)
- throws ClassNotFoundException, IOException
+ throws ClassNotFoundException, IOException, NotImplementedException
{
throw new Error ("Not implemented");
}
protected void bcsPreSerializationHook (ObjectOutputStream oos)
- throws IOException
+ throws IOException, NotImplementedException
{
throw new Error ("Not implemented");
}
protected void childDeserializedHook (Object child, BeanContextSupport.BCSChild bcsc)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected void childJustAddedHook (Object child, BeanContextSupport.BCSChild bcsc)
{
- throw new Error ("Not implemented");
+ // Do nothing in the base class.
}
protected void childJustRemovedHook (Object child, BeanContextSupport.BCSChild bcsc)
{
- throw new Error ("Not implemented");
+ // Do nothing in the base class.
}
protected static final boolean classEquals (Class first, Class second)
{
- throw new Error ("Not implemented");
+ // Lame function!
+ return (first == second || first.getName().equals(second.getName()));
}
public void clear ()
{
+ // This is the right thing to do.
+ // The JDK docs are really bad here.
throw new UnsupportedOperationException();
}
public boolean contains (Object o)
{
- throw new Error ("Not implemented");
+ synchronized (children)
+ {
+ return children.containsKey(o);
+ }
}
public boolean containsAll (Collection c)
{
- throw new Error ("Not implemented");
+ synchronized (children)
+ {
+ Iterator it = c.iterator();
+ while (it.hasNext())
+ if (! children.containsKey(it.next()))
+ return false;
+ }
+ return true;
}
public boolean containsKey (Object o)
{
- throw new Error ("Not implemented");
+ synchronized (children)
+ {
+ return children.containsKey(o);
+ }
}
protected final Object[] copyChildren ()
{
- throw new Error ("Not implemented");
+ synchronized (children)
+ {
+ return children.keySet().toArray();
+ }
}
protected BeanContextSupport.BCSChild createBCSChild (Object targetChild, Object peer)
{
- throw new Error ("Not implemented");
+ return new BCSChild(targetChild, peer);
}
protected final void deserialize (ObjectInputStream ois, Collection coll)
- throws ClassNotFoundException, IOException
+ throws ClassNotFoundException, IOException, NotImplementedException
{
throw new Error ("Not implemented");
}
public void dontUseGui ()
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected final void fireChildrenAdded (BeanContextMembershipEvent bcme)
{
- throw new Error ("Not implemented");
+ synchronized (bcmListeners)
+ {
+ Iterator it = bcmListeners.iterator();
+ while (it.hasNext())
+ {
+ BeanContextMembershipListener l
+ = (BeanContextMembershipListener) it.next();
+ l.childrenAdded(bcme);
+ }
+ }
}
protected final void fireChildrenRemoved (BeanContextMembershipEvent bcme)
{
- throw new Error ("Not implemented");
+ synchronized (bcmListeners)
+ {
+ Iterator it = bcmListeners.iterator();
+ while (it.hasNext())
+ {
+ BeanContextMembershipListener l
+ = (BeanContextMembershipListener) it.next();
+ l.childrenRemoved(bcme);
+ }
+ }
}
public BeanContext getBeanContextPeer ()
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected static final BeanContextChild getChildBeanContextChild (Object child)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected static final BeanContextMembershipListener getChildBeanContextMembershipListener (Object child)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected static final PropertyChangeListener getChildPropertyChangeListener (Object child)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected static final Serializable getChildSerializable (Object child)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected static final VetoableChangeListener getChildVetoableChangeListener (Object child)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
protected static final Visibility getChildVisibility (Object child)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
@@ -323,12 +404,20 @@ public class BeanContextSupport extends BeanContextChildSupport
public URL getResource (String name, BeanContextChild bcc)
{
- throw new Error ("Not implemented");
+ if (! contains(bcc))
+ throw new IllegalArgumentException("argument not a child");
+ ClassLoader loader = bcc.getClass().getClassLoader();
+ return (loader == null ? ClassLoader.getSystemResource(name)
+ : loader.getResource(name));
}
public InputStream getResourceAsStream (String name, BeanContextChild bcc)
{
- throw new Error ("Not implemented");
+ if (! contains(bcc))
+ throw new IllegalArgumentException("argument not a child");
+ ClassLoader loader = bcc.getClass().getClassLoader();
+ return (loader == null ? ClassLoader.getSystemResourceAsStream(name)
+ : loader.getResourceAsStream(name));
}
protected void initialize ()
@@ -338,48 +427,58 @@ public class BeanContextSupport extends BeanContextChildSupport
}
public Object instantiateChild (String beanName)
- throws IOException, ClassNotFoundException
+ throws IOException, ClassNotFoundException, NotImplementedException
{
throw new Error ("Not implemented");
}
public boolean isDesignTime ()
{
- throw new Error ("Not implemented");
+ return designTime;
}
public boolean isEmpty ()
{
- throw new Error ("Not implemented");
+ synchronized (children)
+ {
+ return children.isEmpty();
+ }
}
public boolean isSerializing ()
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
public Iterator iterator ()
{
- return children.keySet().iterator();
+ synchronized (children)
+ {
+ return children.keySet().iterator();
+ }
}
public boolean needsGui ()
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
public void okToUseGui ()
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
public void propertyChange (PropertyChangeEvent pce)
+ throws NotImplementedException
{
throw new Error ("Not implemented");
}
public final void readChildren (ObjectInputStream ois)
- throws IOException, ClassNotFoundException
+ throws IOException, ClassNotFoundException, NotImplementedException
{
throw new Error ("Not implemented");
}
@@ -390,6 +489,7 @@ public class BeanContextSupport extends BeanContextChildSupport
}
protected boolean remove (Object targetChild, boolean callChildSetBC)
+ throws NotImplementedException
{
if (targetChild == null)
throw new IllegalArgumentException();
@@ -399,69 +499,93 @@ public class BeanContextSupport extends BeanContextChildSupport
public boolean removeAll (Collection c)
{
+ // Intentionally throws an exception.
throw new UnsupportedOperationException();
}
public void removeBeanContextMembershipListener (BeanContextMembershipListener bcml)
{
- throw new Error ("Not implemented");
+ synchronized (bcmListeners)
+ {
+ bcmListeners.remove(bcml);
+ }
}
public boolean retainAll (Collection c)
{
+ // Intentionally throws an exception.
throw new UnsupportedOperationException();
}
protected final void serialize (ObjectOutputStream oos, Collection coll)
- throws IOException
+ throws IOException, NotImplementedException
{
throw new Error ("Not implemented");
}
public void setDesignTime (boolean dtime)
{
- throw new Error ("Not implemented");
+ boolean save = designTime;
+ designTime = dtime;
+ firePropertyChange(DesignMode.PROPERTYNAME, Boolean.valueOf(save),
+ Boolean.valueOf(dtime));
}
public void setLocale (Locale newLocale)
throws PropertyVetoException
{
- throw new Error ("Not implemented");
+ if (newLocale == null || locale == newLocale)
+ return;
+ fireVetoableChange("locale", locale, newLocale);
+ Locale oldLocale = locale;
+ locale = newLocale;
+ firePropertyChange("locale", oldLocale, newLocale);
}
public int size ()
{
- throw new Error ("Not implemented");
+ synchronized (children)
+ {
+ return children.size();
+ }
}
public Object[] toArray ()
{
- return children.keySet().toArray();
+ synchronized (children)
+ {
+ return children.keySet().toArray();
+ }
}
public Object[] toArray(Object[] array)
+ throws NotImplementedException
{
- return children.keySet().toArray(array);
+ // This implementation is incorrect, I think.
+ synchronized (children)
+ {
+ return children.keySet().toArray(array);
+ }
}
protected boolean validatePendingAdd (Object targetChild)
{
- throw new Error ("Not implemented");
+ return true;
}
protected boolean validatePendingRemove (Object targetChild)
{
- throw new Error ("Not implemented");
+ return true;
}
public void vetoableChange (PropertyChangeEvent pce)
- throws PropertyVetoException
+ throws PropertyVetoException, NotImplementedException
{
throw new Error ("Not implemented");
}
public final void writeChildren (ObjectOutputStream oos)
- throws IOException
+ throws IOException, NotImplementedException
{
throw new Error ("Not implemented");
}
diff --git a/java/io/CharArrayWriter.java b/java/io/CharArrayWriter.java
index f9b338fe0..68e693b4a 100644
--- a/java/io/CharArrayWriter.java
+++ b/java/io/CharArrayWriter.java
@@ -242,6 +242,84 @@ public class CharArrayWriter extends Writer
}
}
+ /**
+ * Appends the Unicode character, <code>c</code>, to the output stream
+ * underlying this writer. This is equivalent to <code>write(c)</code>.
+ *
+ * @param c the character to append.
+ * @return a reference to this object.
+ * @since 1.5
+ */
+ public CharArrayWriter append(char c)
+ {
+ write(c);
+ return this;
+ }
+
+ /**
+ * Appends the specified sequence of Unicode characters to the
+ * output stream underlying this writer. This is equivalent to
+ * appending the results of calling <code>toString()</code> on the
+ * character sequence. As a result, the entire sequence may not be
+ * appended, as it depends on the implementation of
+ * <code>toString()</code> provided by the
+ * <code>CharSequence</code>. For example, if the character
+ * sequence is wrapped around an input buffer, the results will
+ * depend on the current position and length of that buffer.
+ *
+ * @param cs the character sequence to append. If cs is null,
+ * then the string "null" (the string representation of null)
+ * is appended.
+ * @return a reference to this object.
+ * @since 1.5
+ */
+ public CharArrayWriter append(CharSequence cs)
+ {
+ try
+ {
+ write(cs == null ? "null" : cs.toString());
+ }
+ catch (IOException _)
+ {
+ // Can't happen.
+ }
+ return this;
+ }
+
+ /**
+ * Appends the specified subsequence of Unicode characters to the
+ * output stream underlying this writer, starting and ending at the
+ * specified positions within the sequence. The behaviour of this
+ * method matches the behaviour of writing the result of
+ * <code>append(cs.subSequence(start,end))</code> when the sequence
+ * is not null.
+ *
+ * @param cs the character sequence to append. If cs is null,
+ * then the string "null" (the string representation of null)
+ * is appended.
+ * @param start the index of the first Unicode character to use from
+ * the sequence.
+ * @param end the index of the last Unicode character to use from the
+ * sequence.
+ * @return a reference to this object.
+ * @throws IndexOutOfBoundsException if either of the indices are negative,
+ * the start index occurs after the end index, or the end index is
+ * beyond the end of the sequence.
+ * @since 1.5
+ */
+ public CharArrayWriter append(CharSequence cs, int start, int end)
+ {
+ try
+ {
+ write(cs == null ? "null" : cs.subSequence(start, end).toString());
+ }
+ catch (IOException _)
+ {
+ // Can't happen.
+ }
+ return this;
+ }
+
/**
* This private method makes the buffer bigger when we run out of room
* by allocating a larger buffer and copying the valid chars from the
diff --git a/java/io/DataOutputStream.java b/java/io/DataOutputStream.java
index 25178160d..6670c2dba 100644
--- a/java/io/DataOutputStream.java
+++ b/java/io/DataOutputStream.java
@@ -63,6 +63,11 @@ public class DataOutputStream extends FilterOutputStream implements DataOutput
protected int written;
/**
+ * Utf8 byte buffer, used by writeUTF()
+ */
+ private byte[] buf;
+
+ /**
* This method initializes an instance of <code>DataOutputStream</code> to
* write its data to the specified underlying <code>OutputStream</code>
*
@@ -373,6 +378,37 @@ public class DataOutputStream extends FilterOutputStream implements DataOutput
}
/**
+ * Calculate the length, in bytes, of a <code>String</code> in Utf8 format.
+ *
+ * @param value The <code>String</code> to measure
+ * @param start String index at which to begin count
+ * @param sum Starting Utf8 byte count
+ *
+ * @throws UTFDataFormatException if result would exceed 65535
+ */
+ private int getUTFlength(String value, int start, int sum)
+ throws IOException
+ {
+ int len = value.length();
+
+ for (int i = start; i < len && sum <= 65535; ++i)
+ {
+ char c = value.charAt(i);
+ if (c >= '\u0001' && c <= '\u007f')
+ sum += 1;
+ else if (c == '\u0000' || (c >= '\u0080' && c <= '\u07ff'))
+ sum += 2;
+ else
+ sum += 3;
+ }
+
+ if (sum > 65535)
+ throw new UTFDataFormatException ();
+
+ return sum;
+ }
+
+ /**
* This method writes a Java <code>String</code> to the stream in a modified
* UTF-8 format. First, two bytes are written to the stream indicating the
* number of bytes to follow. Note that this is the number of bytes in the
@@ -407,48 +443,47 @@ public class DataOutputStream extends FilterOutputStream implements DataOutput
public final synchronized void writeUTF(String value) throws IOException
{
int len = value.length();
- int sum = 0;
-
- for (int i = 0; i < len && sum <= 65535; ++i)
- {
- char c = value.charAt(i);
- if (c >= '\u0001' && c <= '\u007f')
- sum += 1;
- else if (c == '\u0000' || (c >= '\u0080' && c <= '\u07ff'))
- sum += 2;
- else
- sum += 3;
- }
-
- if (sum > 65535)
- throw new UTFDataFormatException ();
-
+ int i = 0;
int pos = 0;
- byte[] buf = new byte[sum];
+ boolean lengthWritten = false;
- for (int i = 0; i < len; ++i)
+ if (buf == null)
+ buf = new byte[512];
+
+ do
{
- char c = value.charAt(i);
- if (c >= '\u0001' && c <= '\u007f')
- buf[pos++] = (byte) c;
- else if (c == '\u0000' || (c >= '\u0080' && c <= '\u07ff'))
+ while (i < len && pos < buf.length - 3)
{
- buf[pos++] = (byte) (0xc0 | (0x1f & (c >> 6)));
- buf[pos++] = (byte) (0x80 | (0x3f & c));
+ char c = value.charAt(i++);
+ if (c >= '\u0001' && c <= '\u007f')
+ buf[pos++] = (byte) c;
+ else if (c == '\u0000' || (c >= '\u0080' && c <= '\u07ff'))
+ {
+ buf[pos++] = (byte) (0xc0 | (0x1f & (c >> 6)));
+ buf[pos++] = (byte) (0x80 | (0x3f & c));
+ }
+ else
+ {
+ // JSL says the first byte should be or'd with 0xc0, but
+ // that is a typo. Unicode says 0xe0, and that is what is
+ // consistent with DataInputStream.
+ buf[pos++] = (byte) (0xe0 | (0x0f & (c >> 12)));
+ buf[pos++] = (byte) (0x80 | (0x3f & (c >> 6)));
+ buf[pos++] = (byte) (0x80 | (0x3f & c));
+ }
}
- else
+ if (! lengthWritten)
{
- // JSL says the first byte should be or'd with 0xc0, but
- // that is a typo. Unicode says 0xe0, and that is what is
- // consistent with DataInputStream.
- buf[pos++] = (byte) (0xe0 | (0x0f & (c >> 12)));
- buf[pos++] = (byte) (0x80 | (0x3f & (c >> 6)));
- buf[pos++] = (byte) (0x80 | (0x3f & c));
+ if (i == len)
+ writeShort(pos);
+ else
+ writeShort(getUTFlength(value, i, pos));
+ lengthWritten = true;
}
- }
-
- writeShort (sum);
- write(buf, 0, sum);
+ write(buf, 0, pos);
+ pos = 0;
+ }
+ while (i < len);
}
} // class DataOutputStream
diff --git a/java/io/FilePermission.java b/java/io/FilePermission.java
index 31802c631..9a83efba6 100644
--- a/java/io/FilePermission.java
+++ b/java/io/FilePermission.java
@@ -1,5 +1,6 @@
/* FilePermission.java --
- Copyright (C) 1998, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2000, 2003, 2004, 2005, 2006
+ Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -44,9 +45,6 @@ public final class FilePermission extends Permission implements Serializable
{
private static final long serialVersionUID = 7930732926638008763L;
- private static final String CURRENT_DIRECTORY =
- System.getProperty("user.dir");
-
private static final String ALL_FILES = "<<ALL FILES>>";
private boolean readPerm = false;
@@ -213,10 +211,18 @@ public final class FilePermission extends Permission implements Serializable
FilePermission fp = (FilePermission) p;
String f2 = fp.getName();
- if (f1.charAt(0) != File.separatorChar)
- f1 = CURRENT_DIRECTORY + f1;
- if (f2.charAt(0) != File.separatorChar)
- f2 = CURRENT_DIRECTORY + f2;
+ if (f2.equals(ALL_FILES))
+ return false;
+
+ try
+ {
+ f1 = new File(f1).getCanonicalPath();
+ f2 = new File(f2).getCanonicalPath();
+ }
+ catch (IOException ioe)
+ {
+ return false;
+ }
String sub1;
diff --git a/java/io/InputStream.java b/java/io/InputStream.java
index e56197a83..2934f0034 100644
--- a/java/io/InputStream.java
+++ b/java/io/InputStream.java
@@ -1,5 +1,5 @@
/* InputStream.java -- Base class for input
- Copyright (C) 1998, 1999, 2001, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2001, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,7 @@ package java.io;
* @author Aaron M. Renn (arenn@urbanophile.com)
* @author Warren Levy (warrenl@cygnus.com)
*/
-public abstract class InputStream
+public abstract class InputStream implements Closeable
{
/**
* Default, no-arg, public constructor
diff --git a/java/io/ObjectOutputStream.java b/java/io/ObjectOutputStream.java
index 55a12e4ea..61f07bc7c 100644
--- a/java/io/ObjectOutputStream.java
+++ b/java/io/ObjectOutputStream.java
@@ -549,53 +549,37 @@ public class ObjectOutputStream extends OutputStream
* different protocols, specified by <code>PROTOCOL_VERSION_1</code>
* and <code>PROTOCOL_VERSION_2</code>. This implementation writes
* data using <code>PROTOCOL_VERSION_2</code> by default, as is done
- * by the JDK 1.2.
- *
- * A non-portable method, <code>setDefaultProtocolVersion (int
- * version)</code> is provided to change the default protocol
- * version.
- *
+ * since the JDK 1.2.
+ * <p>
* For an explanation of the differences between the two protocols
- * see XXX: the Java ObjectSerialization Specification.
- *
- * @exception IOException if <code>version</code> is not a valid
- * protocol
- *
- * @see #setDefaultProtocolVersion(int)
+ * see the Java Object Serialization Specification.
+ * </p>
+ *
+ * @param version the version to use.
+ *
+ * @throws IllegalArgumentException if <code>version</code> is not a valid
+ * protocol.
+ * @throws IllegalStateException if called after the first the first object
+ * was serialized.
+ * @throws IOException if an I/O error occurs.
+ *
+ * @see ObjectStreamConstants#PROTOCOL_VERSION_1
+ * @see ObjectStreamConstants#PROTOCOL_VERSION_2
+ *
+ * @since 1.2
*/
public void useProtocolVersion(int version) throws IOException
{
if (version != PROTOCOL_VERSION_1 && version != PROTOCOL_VERSION_2)
- throw new IOException("Invalid protocol version requested.");
+ throw new IllegalArgumentException("Invalid protocol version requested.");
+
+ if (nextOID != baseWireHandle)
+ throw new IllegalStateException("Protocol version cannot be changed "
+ + "after serialization started.");
protocolVersion = version;
}
-
- /**
- * <em>GNU $classpath specific</em>
- *
- * Changes the default stream protocol used by all
- * <code>ObjectOutputStream</code>s. There are currently two
- * different protocols, specified by <code>PROTOCOL_VERSION_1</code>
- * and <code>PROTOCOL_VERSION_2</code>. The default default is
- * <code>PROTOCOL_VERSION_1</code>.
- *
- * @exception IOException if <code>version</code> is not a valid
- * protocol
- *
- * @see #useProtocolVersion(int)
- */
- public static void setDefaultProtocolVersion(int version)
- throws IOException
- {
- if (version != PROTOCOL_VERSION_1 && version != PROTOCOL_VERSION_2)
- throw new IOException("Invalid protocol version requested.");
-
- defaultProtocolVersion = version;
- }
-
-
/**
* An empty hook that allows subclasses to write extra information
* about classes to the stream. This method is called the first
diff --git a/java/io/ObjectStreamConstants.java b/java/io/ObjectStreamConstants.java
index f1a4af724..04cf79bed 100644
--- a/java/io/ObjectStreamConstants.java
+++ b/java/io/ObjectStreamConstants.java
@@ -1,6 +1,6 @@
/* ObjectStreamConstants.java -- Interface containing constant values
used in reading and writing serialized objects
- Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2003, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,11 +45,29 @@ package java.io;
* <code>ObjectInputStream</code>, and <code>ObjectStreamClass</code>.
* The values for these constants are specified by the Java library
* specification.
+ *
+ * @since 1.1
*/
public interface ObjectStreamConstants
{
// FIXME: Javadoc comment these values.
+
+ /**
+ * The serialization stream protocol version 1. This version was
+ * the default serialization protocol before JDK 1.2.
+ *
+ * @see ObjectOutputStream#useProtocolVersion(int)
+ * @since 1.2
+ */
int PROTOCOL_VERSION_1 = 1;
+
+ /**
+ * The serialization stream protocol version 2. This version is
+ * used as the default serialization protocol since JDK 1.2.
+ *
+ * @see ObjectOutputStream#useProtocolVersion(int)
+ * @since 1.2
+ */
int PROTOCOL_VERSION_2 = 2;
short STREAM_MAGIC = (short)0xaced;
diff --git a/java/lang/Boolean.java b/java/lang/Boolean.java
index 902c93b31..23992525c 100644
--- a/java/lang/Boolean.java
+++ b/java/lang/Boolean.java
@@ -1,5 +1,5 @@
/* Boolean.java -- object wrapper for boolean
- Copyright (C) 1998, 2001, 2002, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2001, 2002, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,9 +47,9 @@ import java.io.Serializable;
* @author Paul Fisher
* @author Eric Blake (ebb9@email.byu.edu)
* @since 1.0
- * @status updated to 1.4
+ * @status updated to 1.5
*/
-public final class Boolean implements Serializable
+public final class Boolean implements Serializable, Comparable
{
/**
* Compatible with JDK 1.0.2+.
@@ -223,34 +223,37 @@ public final class Boolean implements Serializable
}
/**
- * If the String argument is "true", ignoring case, return true.
- * Otherwise, return false.
+ * Compares this Boolean to another.
*
- * @param b String to parse
+ * @param other the Boolean to compare this Boolean to
+ * @return 0 if both Booleans represent the same value, a positive number
+ * if this Boolean represents true and the other false, and a negative
+ * number otherwise.
* @since 1.5
*/
- public static boolean parseBoolean(String b)
+ public int compareTo(Boolean other)
{
- return "true".equalsIgnoreCase(b) ? true : false;
+ return value == other.value ? 0 : (value ? 1 : -1);
}
-
+
/**
- * Compares this Boolean to another.
- * @param b the Boolean to compare this Boolean to
- * @return 0 if both Booleans represent the same value, a positive number
- * if this Boolean represents true and b represents false, or a negative
- * number otherwise.
+ * Bridge method
+ */
+ public int compareTo(Object other)
+ {
+ return compareTo((Boolean)other);
+ }
+
+ /**
+ * If the String argument is "true", ignoring case, return true.
+ * Otherwise, return false.
+ *
+ * @param b String to parse
* @since 1.5
*/
- public int compareTo (Boolean b)
+ public static boolean parseBoolean(String b)
{
- if (b == null)
- throw new NullPointerException("argument passed to compareTo(Boolean) cannot be null");
-
- if (this.value == b.value)
- return 0;
- if (this.value == true)
- return 1;
- return -1;
+ return "true".equalsIgnoreCase(b) ? true : false;
}
+
}
diff --git a/java/lang/Class.java b/java/lang/Class.java
index c4235e680..090ac234a 100644
--- a/java/lang/Class.java
+++ b/java/lang/Class.java
@@ -1,5 +1,5 @@
/* Class.java -- Representation of a Java class.
- Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005
+ Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006
Free Software Foundation
This file is part of GNU Classpath.
@@ -39,17 +39,25 @@ exception statement from your version. */
package java.lang;
import gnu.classpath.VMStackWalker;
+import gnu.java.lang.reflect.ClassSignatureParser;
import java.io.InputStream;
import java.io.ObjectStreamClass;
import java.io.Serializable;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Array;
+import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
+import java.lang.reflect.GenericDeclaration;
+import java.lang.reflect.GenericSignatureFormatError;
import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.MalformedParameterizedTypeException;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
import java.net.URL;
import java.security.AccessController;
import java.security.AllPermission;
@@ -87,17 +95,37 @@ import java.util.HashSet;
*
* @author John Keiser
* @author Eric Blake (ebb9@email.byu.edu)
+ * @author Tom Tromey (tromey@redhat.com)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
* @author Tom Tromey (tromey@cygnus.com)
* @since 1.0
* @see ClassLoader
*/
-public final class Class implements Serializable
+public final class Class
+ implements Serializable, Type, AnnotatedElement, GenericDeclaration
{
/**
* Compatible with JDK 1.0+.
*/
private static final long serialVersionUID = 3206093459760846163L;
+ /**
+ * Flag indicating a synthetic member.
+ * Note that this duplicates a constant in Modifier.
+ */
+ private static final int SYNTHETIC = 0x1000;
+
+ /**
+ * Flag indiciating an annotation class.
+ */
+ private static final int ANNOTATION = 0x2000;
+
+ /**
+ * Flag indicating an enum constant or an enum class.
+ * Note that this duplicates a constant in Modifier.
+ */
+ private static final int ENUM = 0x4000;
+
/** The class signers. */
private Object[] signers = null;
/** The class protection domain. */
@@ -259,7 +287,7 @@ public final class Class implements Serializable
ClassLoader loader = VMClass.getClassLoader(this);
// Check if we may get the classloader
SecurityManager sm = SecurityManager.current;
- if (sm != null)
+ if (loader != null && sm != null)
{
// Get the calling classloader
ClassLoader cl = VMStackWalker.getCallingClassLoader();
@@ -631,17 +659,16 @@ public final class Class implements Serializable
public boolean equals(Object o)
{
- if(o instanceof MethodKey)
+ if (o instanceof MethodKey)
{
- MethodKey m = (MethodKey)o;
- if(m.name.equals(name) && m.params.length == params.length && m.returnType == returnType)
+ MethodKey m = (MethodKey) o;
+ if (m.name.equals(name) && m.params.length == params.length
+ && m.returnType == returnType)
{
- for(int i = 0; i < params.length; i++)
+ for (int i = 0; i < params.length; i++)
{
- if(m.params[i] != params[i])
- {
- return false;
- }
+ if (m.params[i] != params[i])
+ return false;
}
return true;
}
@@ -1252,8 +1279,60 @@ public final class Class implements Serializable
}
/**
- * Like <code>getField(String)</code> but without the security checks and returns null
- * instead of throwing NoSuchFieldException.
+ * <p>
+ * Casts this class to represent a subclass of the specified class.
+ * This method is useful for `narrowing' the type of a class so that
+ * the class object, and instances of that class, can match the contract
+ * of a more restrictive method. For example, if this class has the
+ * static type of <code>Class&lt;Object&gt;</code>, and a dynamic type of
+ * <code>Class&lt;Rectangle&gt;</code>, then, assuming <code>Shape</code> is
+ * a superclass of <code>Rectangle</code>, this method can be used on
+ * this class with the parameter, <code>Class&lt;Shape&gt;</code>, to retain
+ * the same instance but with the type
+ * <code>Class&lt;? extends Shape&gt;</code>.
+ * </p>
+ * <p>
+ * If this class can be converted to an instance which is parameterised
+ * over a subtype of the supplied type, <code>U</code>, then this method
+ * returns an appropriately cast reference to this object. Otherwise,
+ * a <code>ClassCastException</code> is thrown.
+ * </p>
+ *
+ * @param klass the class object, the parameterized type (<code>U</code>) of
+ * which should be a superclass of the parameterized type of
+ * this instance.
+ * @return a reference to this object, appropriately cast.
+ * @throws ClassCastException if this class can not be converted to one
+ * which represents a subclass of the specified
+ * type, <code>U</code>.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Should be <U> Class<? extends U> asSubClass(Class<U> klass */
+ public Class asSubclass(Class klass)
+ {
+ if (! klass.isAssignableFrom(this))
+ throw new ClassCastException();
+ return this; /* FIXME[GENERICS]: Should cast to Class<? extends U> */
+ }
+
+ /**
+ * Returns the specified object, cast to this <code>Class</code>' type.
+ *
+ * @param obj the object to cast
+ * @throws ClassCastException if obj is not an instance of this class
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Should be T cast(Object obj) */
+ public Object cast(Object obj)
+ {
+ if (obj != null && ! isInstance(obj))
+ throw new ClassCastException();
+ return obj; /* FIXME[GENERICS]: Should be cast to T */
+ }
+
+ /**
+ * Like <code>getField(String)</code> but without the security checks and
+ * returns null instead of throwing NoSuchFieldException.
*/
private Field internalGetField(String name)
{
@@ -1306,4 +1385,411 @@ public final class Class implements Serializable
sm.checkPackageAccess(pkg.getName());
}
}
+
+ /**
+ * Returns the enumeration constants of this class, or
+ * null if this class is not an <code>Enum</code>.
+ *
+ * @return an array of <code>Enum</code> constants
+ * associated with this class, or null if this
+ * class is not an <code>enum</code>.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: T[] getEnumConstants() */
+ public Object[] getEnumConstants()
+ {
+ if (isEnum())
+ {
+ try
+ {
+ return (Object[])
+ getMethod("values", new Class[0]).invoke(null, new Object[0]);
+ }
+ catch (NoSuchMethodException exception)
+ {
+ throw new Error("Enum lacks values() method");
+ }
+ catch (IllegalAccessException exception)
+ {
+ throw new Error("Unable to access Enum class");
+ }
+ catch (InvocationTargetException exception)
+ {
+ throw new
+ RuntimeException("The values method threw an exception",
+ exception);
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * Returns true if this class is an <code>Enum</code>.
+ *
+ * @return true if this is an enumeration class.
+ * @since 1.5
+ */
+ public boolean isEnum()
+ {
+ int mod = VMClass.getModifiers (this, true);
+ return (mod & ENUM) != 0;
+ }
+
+ /**
+ * Returns true if this class is a synthetic class, generated by
+ * the compiler.
+ *
+ * @return true if this is a synthetic class.
+ * @since 1.5
+ */
+ public boolean isSynthetic()
+ {
+ int mod = VMClass.getModifiers (this, true);
+ return (mod & SYNTHETIC) != 0;
+ }
+
+ /**
+ * Returns true if this class is an <code>Annotation</code>.
+ *
+ * @return true if this is an annotation class.
+ * @since 1.5
+ */
+ public boolean isAnnotation()
+ {
+ int mod = VMClass.getModifiers (this, true);
+ return (mod & ANNOTATION) != 0;
+ }
+
+ /**
+ * Returns the simple name for this class, as used in the source
+ * code. For normal classes, this is the content returned by
+ * <code>getName()</code> which follows the last ".". Anonymous
+ * classes have no name, and so the result of calling this method is
+ * "". The simple name of an array consists of the simple name of
+ * its component type, followed by "[]". Thus, an array with the
+ * component type of an anonymous class has a simple name of simply
+ * "[]".
+ *
+ * @return the simple name for this class.
+ * @since 1.5
+ */
+ public String getSimpleName()
+ {
+ return VMClass.getSimpleName(this);
+ }
+
+ /**
+ * Returns this class' annotation for the specified annotation type,
+ * or <code>null</code> if no such annotation exists.
+ *
+ * @param annotationClass the type of annotation to look for.
+ * @return this class' annotation for the specified type, or
+ * <code>null</code> if no such annotation exists.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: <T extends Annotation> T getAnnotation(Class <T>) */
+ public Annotation getAnnotation(Class annotationClass)
+ {
+ Annotation foundAnnotation = null;
+ Annotation[] annotations = getAnnotations();
+ for (int i = 0; i < annotations.length; i++)
+ if (annotations[i].annotationType() == annotationClass)
+ foundAnnotation = annotations[i];
+ return foundAnnotation;
+ }
+
+ /**
+ * Returns all annotations associated with this class. If there are
+ * no annotations associated with this class, then a zero-length array
+ * will be returned. The returned array may be modified by the client
+ * code, but this will have no effect on the annotation content of this
+ * class, and hence no effect on the return value of this method for
+ * future callers.
+ *
+ * @return this class' annotations.
+ * @since 1.5
+ */
+ public Annotation[] getAnnotations()
+ {
+ HashSet set = new HashSet();
+ set.addAll(Arrays.asList(getDeclaredAnnotations()));
+ Class[] interfaces = getInterfaces();
+ for (int i = 0; i < interfaces.length; i++)
+ set.addAll(Arrays.asList(interfaces[i].getAnnotations()));
+ Class superClass = getSuperclass();
+ if (superClass != null)
+ set.addAll(Arrays.asList(superClass.getAnnotations()));
+ return (Annotation[]) set.toArray(new Annotation[set.size()]);
+ }
+
+ /**
+ * <p>
+ * Returns the canonical name of this class, as defined by section
+ * 6.7 of the Java language specification. Each package, top-level class,
+ * top-level interface and primitive type has a canonical name. A member
+ * class has a canonical name, if its parent class has one. Likewise,
+ * an array type has a canonical name, if its component type does.
+ * Local or anonymous classes do not have canonical names.
+ * </p>
+ * <p>
+ * The canonical name for top-level classes, top-level interfaces and
+ * primitive types is always the same as the fully-qualified name.
+ * For array types, the canonical name is the canonical name of its
+ * component type with `[]' appended.
+ * </p>
+ * <p>
+ * The canonical name of a member class always refers to the place where
+ * the class was defined, and is composed of the canonical name of the
+ * defining class and the simple name of the member class, joined by `.'.
+ * For example, if a <code>Person</code> class has an inner class,
+ * <code>M</code>, then both its fully-qualified name and canonical name
+ * is <code>Person.M</code>. A subclass, <code>Staff</code>, of
+ * <code>Person</code> refers to the same inner class by the fully-qualified
+ * name of <code>Staff.M</code>, but its canonical name is still
+ * <code>Person.M</code>.
+ * </p>
+ * <p>
+ * Where no canonical name is present, <code>null</code> is returned.
+ * </p>
+ *
+ * @return the canonical name of the class, or <code>null</code> if the
+ * class doesn't have a canonical name.
+ * @since 1.5
+ */
+ public String getCanonicalName()
+ {
+ return VMClass.getCanonicalName(this);
+ }
+
+ /**
+ * Returns all annotations directly defined by this class. If there are
+ * no annotations associated with this class, then a zero-length array
+ * will be returned. The returned array may be modified by the client
+ * code, but this will have no effect on the annotation content of this
+ * class, and hence no effect on the return value of this method for
+ * future callers.
+ *
+ * @return the annotations directly defined by this class.
+ * @since 1.5
+ */
+ public Annotation[] getDeclaredAnnotations()
+ {
+ return VMClass.getDeclaredAnnotations(this);
+ }
+
+ /**
+ * Returns the class which immediately encloses this class. If this class
+ * is a top-level class, this method returns <code>null</code>.
+ *
+ * @return the immediate enclosing class, or <code>null</code> if this is
+ * a top-level class.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Should return Class<?> */
+ public Class getEnclosingClass()
+ {
+ return VMClass.getEnclosingClass(this);
+ }
+
+ /**
+ * Returns the constructor which immediately encloses this class. If
+ * this class is a top-level class, or a local or anonymous class
+ * immediately enclosed by a type definition, instance initializer
+ * or static initializer, then <code>null</code> is returned.
+ *
+ * @return the immediate enclosing constructor if this class is
+ * declared within a constructor. Otherwise, <code>null</code>
+ * is returned.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Should return Constructor<?> */
+ public Constructor getEnclosingConstructor()
+ {
+ return VMClass.getEnclosingConstructor(this);
+ }
+
+ /**
+ * Returns the method which immediately encloses this class. If
+ * this class is a top-level class, or a local or anonymous class
+ * immediately enclosed by a type definition, instance initializer
+ * or static initializer, then <code>null</code> is returned.
+ *
+ * @return the immediate enclosing method if this class is
+ * declared within a method. Otherwise, <code>null</code>
+ * is returned.
+ * @since 1.5
+ */
+ public Method getEnclosingMethod()
+ {
+ return VMClass.getEnclosingMethod(this);
+ }
+
+ /**
+ * <p>
+ * Returns an array of <code>Type</code> objects which represent the
+ * interfaces directly implemented by this class or extended by this
+ * interface.
+ * </p>
+ * <p>
+ * If one of the superinterfaces is a parameterized type, then the
+ * object returned for this interface reflects the actual type
+ * parameters used in the source code. Type parameters are created
+ * using the semantics specified by the <code>ParameterizedType</code>
+ * interface, and only if an instance has not already been created.
+ * </p>
+ * <p>
+ * The order of the interfaces in the array matches the order in which
+ * the interfaces are declared. For classes which represent an array,
+ * an array of two interfaces, <code>Cloneable</code> and
+ * <code>Serializable</code>, is always returned, with the objects in
+ * that order. A class representing a primitive type or void always
+ * returns an array of zero size.
+ * </p>
+ *
+ * @return an array of interfaces implemented or extended by this class.
+ * @throws GenericSignatureFormatError if the generic signature of one
+ * of the interfaces does not comply with that specified by the Java
+ * Virtual Machine specification, 3rd edition.
+ * @throws TypeNotPresentException if any of the superinterfaces refers
+ * to a non-existant type.
+ * @throws MalformedParameterizedTypeException if any of the interfaces
+ * refer to a parameterized type that can not be instantiated for
+ * some reason.
+ * @since 1.5
+ * @see java.lang.reflect.ParameterizedType
+ */
+ public Type[] getGenericInterfaces()
+ {
+ if (isPrimitive())
+ return new Type[0];
+
+ String sig = VMClass.getClassSignature(this);
+ if (sig == null)
+ return getInterfaces();
+
+ ClassSignatureParser p = new ClassSignatureParser(this, sig);
+ return p.getInterfaceTypes();
+ }
+
+ /**
+ * <p>
+ * Returns a <code>Type</code> object representing the direct superclass,
+ * whether class, interface, primitive type or void, of this class.
+ * If this class is an array class, then a class instance representing
+ * the <code>Object</code> class is returned. If this class is primitive,
+ * an interface, or a representation of either the <code>Object</code>
+ * class or void, then <code>null</code> is returned.
+ * </p>
+ * <p>
+ * If the superclass is a parameterized type, then the
+ * object returned for this interface reflects the actual type
+ * parameters used in the source code. Type parameters are created
+ * using the semantics specified by the <code>ParameterizedType</code>
+ * interface, and only if an instance has not already been created.
+ * </p>
+ *
+ * @return the superclass of this class.
+ * @throws GenericSignatureFormatError if the generic signature of the
+ * class does not comply with that specified by the Java
+ * Virtual Machine specification, 3rd edition.
+ * @throws TypeNotPresentException if the superclass refers
+ * to a non-existant type.
+ * @throws MalformedParameterizedTypeException if the superclass
+ * refers to a parameterized type that can not be instantiated for
+ * some reason.
+ * @since 1.5
+ * @see java.lang.reflect.ParameterizedType
+ */
+ public Type getGenericSuperclass()
+ {
+ if (isArray())
+ return Object.class;
+
+ if (isPrimitive() || isInterface() || this == Object.class)
+ return null;
+
+ String sig = VMClass.getClassSignature(this);
+ if (sig == null)
+ return getSuperclass();
+
+ ClassSignatureParser p = new ClassSignatureParser(this, sig);
+ return p.getSuperclassType();
+ }
+
+ /**
+ * Returns an array of <code>TypeVariable</code> objects that represents
+ * the type variables declared by this class, in declaration order.
+ * An array of size zero is returned if this class has no type
+ * variables.
+ *
+ * @return the type variables associated with this class.
+ * @throws GenericSignatureFormatError if the generic signature does
+ * not conform to the format specified in the Virtual Machine
+ * specification, version 3.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Should return TypeVariable<Class<T>> */
+ public TypeVariable[] getTypeParameters()
+ {
+ String sig = VMClass.getClassSignature(this);
+ if (sig == null)
+ return new TypeVariable[0];
+
+ ClassSignatureParser p = new ClassSignatureParser(this, sig);
+ return p.getTypeParameters();
+ }
+
+ /**
+ * Returns true if an annotation for the specified type is associated
+ * with this class. This is primarily a short-hand for using marker
+ * annotations.
+ *
+ * @param annotationClass the type of annotation to look for.
+ * @return true if an annotation exists for the specified type.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Should be Class<? extends Annotation> */
+ public boolean isAnnotationPresent(Class
+ annotationClass)
+ {
+ return getAnnotation(annotationClass) != null;
+ }
+
+ /**
+ * Returns true if this object represents an anonymous class.
+ *
+ * @return true if this object represents an anonymous class.
+ * @since 1.5
+ */
+ public boolean isAnonymousClass()
+ {
+ return VMClass.isAnonymousClass(this);
+ }
+
+ /**
+ * Returns true if this object represents an local class.
+ *
+ * @return true if this object represents an local class.
+ * @since 1.5
+ */
+ public boolean isLocalClass()
+ {
+ return VMClass.isLocalClass(this);
+ }
+
+ /**
+ * Returns true if this object represents an member class.
+ *
+ * @return true if this object represents an member class.
+ * @since 1.5
+ */
+ public boolean isMemberClass()
+ {
+ return VMClass.isMemberClass(this);
+ }
+
+
}
diff --git a/java/lang/ClassLoader.java b/java/lang/ClassLoader.java
index 9f586c4cf..83ef98da3 100644
--- a/java/lang/ClassLoader.java
+++ b/java/lang/ClassLoader.java
@@ -469,7 +469,8 @@ public abstract class ClassLoader
if (domain == null)
domain = StaticData.defaultProtectionDomain;
- return VMClassLoader.defineClass(this, name, data, offset, len, domain);
+ return VMClassLoader.defineClassWithTransformers(this, name, data, offset,
+ len, domain);
}
/**
@@ -628,8 +629,9 @@ public abstract class ClassLoader
* @return an enumaration of all resources found
* @throws IOException if I/O errors occur in the process
* @since 1.2
+ * @specnote this was <code>final</code> prior to 1.5
*/
- public final Enumeration getResources(String name) throws IOException
+ public Enumeration getResources(String name) throws IOException
{
Enumeration parentResources;
if (parent == null)
@@ -834,7 +836,7 @@ public abstract class ClassLoader
throw new IllegalArgumentException("Package " + name
+ " already defined");
Package p = new Package(name, specTitle, specVendor, specVersion,
- implTitle, implVendor, implVersion, sealed);
+ implTitle, implVendor, implVersion, sealed, this);
synchronized (definedPackages)
{
definedPackages.put(name, p);
diff --git a/java/lang/Enum.java b/java/lang/Enum.java
new file mode 100644
index 000000000..5344d5c72
--- /dev/null
+++ b/java/lang/Enum.java
@@ -0,0 +1,248 @@
+/* Enum.java - Base class for all enums
+ Copyright (C) 2004, 2005 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.lang;
+
+import java.io.Serializable;
+import java.lang.reflect.Field;
+
+/**
+ * This class represents a Java enumeration. All enumerations are
+ * subclasses of this class.
+ *
+ * @author Tom Tromey (tromey@redhat.com)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
+ * @since 1.5
+ */
+/* FIXME[GENERICS]: Should be Enum<T extends Enum<T>>
+ and Comparable<T> */
+public abstract class Enum
+ implements Comparable, Serializable
+{
+
+ /**
+ * For compatability with Sun's JDK
+ */
+ private static final long serialVersionUID = -4300926546619394005L;
+
+ /**
+ * The name of this enum constant.
+ */
+ String name;
+
+ /**
+ * The number of this enum constant. Each constant is given a number
+ * which matches the order in which it was declared, starting with zero.
+ */
+ int ordinal;
+
+ /**
+ * This constructor is used by the compiler to create enumeration constants.
+ *
+ * @param name the name of the enumeration constant.
+ * @param ordinal the number of the enumeration constant, based on the
+ * declaration order of the constants and starting from zero.
+ */
+ protected Enum(String name, int ordinal)
+ {
+ this.name = name;
+ this.ordinal = ordinal;
+ }
+
+ /**
+ * Returns an Enum for a enum class given a description string of
+ * the enum constant.
+ *
+ * @exception NullPointerException when etype or s are null.
+ * @exception IllegalArgumentException when there is no value s in
+ * the enum etype.
+ */
+ /* FIXME[GENERICS]: Should be <S extends Enum<S>> S valueOf(Class<S>) */
+ public static Enum valueOf(Class etype, String s)
+ {
+ if (etype == null || s == null)
+ throw new NullPointerException();
+
+ try
+ {
+ Field f = etype.getDeclaredField(s);
+ if (! f.isEnumConstant())
+ throw new IllegalArgumentException(s);
+ /* FIXME[GENERICS]: Should cast to S */
+ return (Enum) f.get(null);
+ }
+ catch (NoSuchFieldException exception)
+ {
+ throw new IllegalArgumentException(s);
+ }
+ catch (IllegalAccessException exception)
+ {
+ throw new Error("Unable to access Enum class");
+ }
+ }
+
+ /**
+ * Returns true if this enumeration is equivalent to the supplied object,
+ * <code>o</code>. Only one instance of an enumeration constant exists,
+ * so the comparison is simply done using <code>==</code>.
+ *
+ * @param o the object to compare to this.
+ * @return true if <code>this == o</code>.
+ */
+ public final boolean equals(Object o)
+ {
+ // Enum constants are singular, so we need only compare `=='.
+ return this == o;
+ }
+
+ /**
+ * Returns the hash code of this constant. This is simply the ordinal.
+ *
+ * @return the hash code of this enumeration constant.
+ */
+ public final int hashCode()
+ {
+ return ordinal;
+ }
+
+ /**
+ * Returns a textual representation of this enumeration constant.
+ * By default, this is simply the declared name of the constant, but
+ * specific enumeration types may provide an implementation more suited
+ * to the data being stored.
+ *
+ * @return a textual representation of this constant.
+ */
+ public String toString()
+ {
+ return name;
+ }
+
+ /**
+ * Returns an integer which represents the relative ordering of this
+ * enumeration constant. Enumeration constants are ordered by their
+ * ordinals, which represents their declaration order. So, comparing
+ * two identical constants yields zero, while one declared prior to
+ * this returns a positive integer and one declared after yields a
+ * negative integer.
+ *
+ * @param e the enumeration constant to compare.
+ * @return a negative integer if <code>e.ordinal < this.ordinal</code>,
+ * zero if <code>e.ordinal == this.ordinal</code> and a positive
+ * integer if <code>e.ordinal > this.ordinal</code>.
+ * @throws ClassCastException if <code>e</code> is not an enumeration
+ * constant of the same class.
+ */
+ public final int compareTo(Enum e)
+ {
+ if (getDeclaringClass() != e.getDeclaringClass())
+ throw new ClassCastException();
+ return ordinal - e.ordinal;
+ }
+
+ /**
+ * Returns an integer which represents the relative ordering of this
+ * enumeration constant. Enumeration constants are ordered by their
+ * ordinals, which represents their declaration order. So, comparing
+ * two identical constants yields zero, while one declared prior to
+ * this returns a positive integer and one declared after yields a
+ * negative integer.
+ *
+ * @param o the enumeration constant to compare.
+ * @return a negative integer if <code>e.ordinal < this.ordinal</code>,
+ * zero if <code>e.ordinal == this.ordinal</code> and a positive
+ * integer if <code>e.ordinal > this.ordinal</code>.
+ * @throws ClassCastException if <code>e</code> is not an enumeration
+ * constant of the same class.
+ */
+ /* FIXME[GENERICS]: Remove this method */
+ public final int compareTo(Object o)
+ {
+ return compareTo((Enum)o);
+ }
+
+ /**
+ * Cloning of enumeration constants is prevented, to maintain their
+ * singleton status.
+ *
+ * @return the cloned object.
+ * @throws CloneNotSupportedException as enumeration constants can't be
+ * cloned.
+ */
+ protected final Object clone() throws CloneNotSupportedException
+ {
+ throw new CloneNotSupportedException("can't clone an enum constant");
+ }
+
+ /**
+ * Returns the name of this enumeration constant.
+ *
+ * @return the name of the constant.
+ */
+ public final String name()
+ {
+ return name;
+ }
+
+ /**
+ * Returns the number of this enumeration constant, which represents
+ * the order in which it was originally declared, starting from zero.
+ *
+ * @return the number of this constant.
+ */
+ public final int ordinal()
+ {
+ return ordinal;
+ }
+
+ /**
+ * Returns the type of this enumeration constant. This is the class
+ * corresponding to the declaration of the enumeration.
+ *
+ * @return the type of this enumeration constant.
+ */
+ /* FIXME[GENERICS]: Should return Class<T> */
+ public final Class getDeclaringClass()
+ {
+ Class k = getClass();
+ // We might be in an anonymous subclass of the enum class, so go
+ // up one more level.
+ if (k.getSuperclass() != Enum.class)
+ k = k.getSuperclass();
+ return k;
+ }
+}
diff --git a/java/lang/EnumConstantNotPresentException.java b/java/lang/EnumConstantNotPresentException.java
index dbec9d658..12b30fda5 100644
--- a/java/lang/EnumConstantNotPresentException.java
+++ b/java/lang/EnumConstantNotPresentException.java
@@ -48,6 +48,8 @@ package java.lang;
*/
public class EnumConstantNotPresentException extends RuntimeException
{
+ private static final long serialVersionUID = -6046998521960521108L;
+
/**
* The enum's type. Note that the name is fixed by the
* serialization spec.
diff --git a/java/lang/Iterable.java b/java/lang/Iterable.java
new file mode 100644
index 000000000..8223bcf8c
--- /dev/null
+++ b/java/lang/Iterable.java
@@ -0,0 +1,59 @@
+/* Iterable.java -- Notes collection over which one may iterate
+ Copyright (C) 2004 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang;
+
+import java.util.Iterator;
+
+/**
+ * This interface is used to indicate that a given class can be
+ * iterated over. The compiler uses this interface to determine which
+ * classes are suitable targets of the <code>foreach</code> construct.
+ *
+ * @author Tom Tromey <tromey@redhat.com>
+ * @since 1.5
+ */
+public interface Iterable
+{
+ /**
+ * Returns an iterator for the collection.
+ *
+ * @return an iterator.
+ */
+ Iterator iterator ();
+}
diff --git a/java/lang/Package.java b/java/lang/Package.java
index 4cded0af3..38bb3240d 100644
--- a/java/lang/Package.java
+++ b/java/lang/Package.java
@@ -1,5 +1,6 @@
/* Package.java -- information about a package
- Copyright (C) 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2005, 2006
+ Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,6 +40,8 @@ package java.lang;
import gnu.classpath.VMStackWalker;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
import java.net.URL;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
@@ -70,9 +73,10 @@ import java.util.StringTokenizer;
* @see ClassLoader#definePackage(String, String, String, String, String,
* String, String, URL)
* @since 1.2
- * @status updated to 1.4
+ * @status updated to 1.5
*/
public class Package
+ implements AnnotatedElement
{
/** The name of the Package */
private final String name;
@@ -98,6 +102,20 @@ public class Package
/** If sealed the origin of the package classes, otherwise null */
private final URL sealed;
+ /** The class loader that defined this package */
+ private ClassLoader loader;
+
+ /** @deprecated Please use the other constructor that takes the class loader
+ * that defines the Package.
+ */
+ Package(String name,
+ String specTitle, String specVendor, String specVersion,
+ String implTitle, String implVendor, String implVersion, URL sealed)
+ {
+ this(name, specTitle, specVendor, specVersion, implTitle, implVendor,
+ implVersion, sealed, null);
+ }
+
/**
* A package local constructor for the Package class. All parameters except
* the <code>name</code> of the package may be <code>null</code>.
@@ -115,7 +133,8 @@ public class Package
*/
Package(String name,
String specTitle, String specVendor, String specVersion,
- String implTitle, String implVendor, String implVersion, URL sealed)
+ String implTitle, String implVendor, String implVersion, URL sealed,
+ ClassLoader loader)
{
if (name == null)
throw new IllegalArgumentException("null Package name");
@@ -128,6 +147,7 @@ public class Package
this.specVendor = specVendor;
this.specVersion = specVersion;
this.sealed = sealed;
+ this.loader = loader;
}
/**
@@ -233,7 +253,7 @@ public class Package
*
* @return true if the version is compatible, false otherwise
*
- * @Throws NumberFormatException if either version string is invalid
+ * @throws NumberFormatException if either version string is invalid
* @throws NullPointerException if either version string is null
*/
public boolean isCompatibleWith(String version)
@@ -315,4 +335,82 @@ public class Package
return ("package " + name + (specTitle == null ? "" : ", " + specTitle)
+ (specVersion == null ? "" : ", version " + specVersion));
}
+
+ /**
+ * Returns this package's annotation for the specified annotation type,
+ * or <code>null</code> if no such annotation exists.
+ *
+ * @param annotationClass the type of annotation to look for.
+ * @return this package's annotation for the specified type, or
+ * <code>null</code> if no such annotation exists.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: <T extends Annotation> T getAnnotation(Class <T>) */
+ public Annotation getAnnotation(Class annotationClass)
+ {
+ Annotation foundAnnotation = null;
+ Annotation[] annotations = getAnnotations();
+ for (int i = 0; i < annotations.length; i++)
+ if (annotations[i].annotationType() == annotationClass)
+ foundAnnotation = annotations[i];
+ return foundAnnotation;
+ }
+
+ /**
+ * Returns all annotations associated with this package. If there are
+ * no annotations associated with this package, then a zero-length array
+ * will be returned. The returned array may be modified by the client
+ * code, but this will have no effect on the annotation content of this
+ * package, and hence no effect on the return value of this method for
+ * future callers.
+ *
+ * @return this package' annotations.
+ * @since 1.5
+ */
+ public Annotation[] getAnnotations()
+ {
+ /** All a package's annotations are declared within it. */
+ return getDeclaredAnnotations();
+ }
+
+ /**
+ * Returns all annotations directly defined by this package. If there are
+ * no annotations associated with this package, then a zero-length array
+ * will be returned. The returned array may be modified by the client
+ * code, but this will have no effect on the annotation content of this
+ * package, and hence no effect on the return value of this method for
+ * future callers.
+ *
+ * @return the annotations directly defined by this package.
+ * @since 1.5
+ */
+ public Annotation[] getDeclaredAnnotations()
+ {
+ try
+ {
+ Class pkgInfo = Class.forName(name + ".package-info", false, loader);
+ return pkgInfo.getDeclaredAnnotations();
+ }
+ catch (ClassNotFoundException _)
+ {
+ return new Annotation[0];
+ }
+ }
+
+ /**
+ * Returns true if an annotation for the specified type is associated
+ * with this package. This is primarily a short-hand for using marker
+ * annotations.
+ *
+ * @param annotationClass the type of annotation to look for.
+ * @return true if an annotation exists for the specified type.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Signature is Class<? extends Annotation> */
+ public boolean isAnnotationPresent(Class
+ annotationClass)
+ {
+ return getAnnotation(annotationClass) != null;
+ }
+
} // class Package
diff --git a/java/lang/StackTraceElement.java b/java/lang/StackTraceElement.java
index cf4d1c76f..746dd63db 100644
--- a/java/lang/StackTraceElement.java
+++ b/java/lang/StackTraceElement.java
@@ -1,5 +1,5 @@
/* StackTraceElement.java -- One function call or call stack element
- Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -211,7 +211,7 @@ public final class StackTraceElement implements Serializable
}
if (methodName != null)
sb.append(methodName);
- sb.append(" (");
+ sb.append("(");
if (fileName != null)
sb.append(fileName);
else
diff --git a/java/lang/StringBuilder.java b/java/lang/StringBuilder.java
index 01a83ca70..98af48f8f 100644
--- a/java/lang/StringBuilder.java
+++ b/java/lang/StringBuilder.java
@@ -206,7 +206,7 @@ public final class StringBuilder
int max = value.length * 2 + 2;
minimumCapacity = (minimumCapacity < max ? max : minimumCapacity);
char[] nb = new char[minimumCapacity];
- System.arraycopy(value, 0, nb, 0, count);
+ VMSystem.arraycopy(value, 0, nb, 0, count);
value = nb;
}
}
@@ -285,7 +285,7 @@ public final class StringBuilder
{
if (srcOffset < 0 || srcEnd > count || srcEnd < srcOffset)
throw new StringIndexOutOfBoundsException();
- System.arraycopy(value, srcOffset, dst, dstOffset, srcEnd - srcOffset);
+ VMSystem.arraycopy(value, srcOffset, dst, dstOffset, srcEnd - srcOffset);
}
/**
@@ -355,7 +355,7 @@ public final class StringBuilder
{
int len = stringBuffer.count;
ensureCapacity(count + len);
- System.arraycopy(stringBuffer.value, 0, value, count, len);
+ VMSystem.arraycopy(stringBuffer.value, 0, value, count, len);
count += len;
}
return this;
@@ -395,7 +395,7 @@ public final class StringBuilder
if (offset < 0 || count < 0 || offset > data.length - count)
throw new StringIndexOutOfBoundsException();
ensureCapacity(this.count + count);
- System.arraycopy(data, offset, value, this.count, count);
+ VMSystem.arraycopy(data, offset, value, this.count, count);
this.count += count;
return this;
}
@@ -558,7 +558,7 @@ public final class StringBuilder
// This will unshare if required.
ensureCapacity(count);
if (count - end != 0)
- System.arraycopy(value, end, value, start, count - end);
+ VMSystem.arraycopy(value, end, value, start, count - end);
count -= end - start;
return this;
}
@@ -599,7 +599,7 @@ public final class StringBuilder
ensureCapacity(count + delta);
if (delta != 0 && end < count)
- System.arraycopy(value, end, value, end + delta, count - end);
+ VMSystem.arraycopy(value, end, value, end + delta, count - end);
str.getChars(0, len, value, start);
count += delta;
@@ -677,8 +677,8 @@ public final class StringBuilder
|| str_offset < 0 || str_offset > str.length - len)
throw new StringIndexOutOfBoundsException();
ensureCapacity(count + len);
- System.arraycopy(value, offset, value, offset + len, count - offset);
- System.arraycopy(str, str_offset, value, offset, len);
+ VMSystem.arraycopy(value, offset, value, offset + len, count - offset);
+ VMSystem.arraycopy(str, str_offset, value, offset, len);
count += len;
return this;
}
@@ -717,7 +717,7 @@ public final class StringBuilder
str = "null";
int len = str.count;
ensureCapacity(count + len);
- System.arraycopy(value, offset, value, offset + len, count - offset);
+ VMSystem.arraycopy(value, offset, value, offset + len, count - offset);
str.getChars(0, len, value, offset);
count += len;
return this;
@@ -814,7 +814,7 @@ public final class StringBuilder
if (offset < 0 || offset > count)
throw new StringIndexOutOfBoundsException(offset);
ensureCapacity(count + 1);
- System.arraycopy(value, offset, value, offset + 1, count - offset);
+ VMSystem.arraycopy(value, offset, value, offset + 1, count - offset);
value[offset] = ch;
count++;
return this;
@@ -1063,7 +1063,7 @@ public final class StringBuilder
if (count < value.length)
{
char[] newValue = new char[count];
- System.arraycopy(value, 0, newValue, 0, count);
+ VMSystem.arraycopy(value, 0, newValue, 0, count);
value = newValue;
}
}
diff --git a/java/lang/Thread.java b/java/lang/Thread.java
index 76df1037b..23620543a 100644
--- a/java/lang/Thread.java
+++ b/java/lang/Thread.java
@@ -1,5 +1,5 @@
/* Thread -- an independent thread of executable code
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation
This file is part of GNU Classpath.
@@ -81,6 +81,7 @@ import java.util.Map;
* @author Tom Tromey
* @author John Keiser
* @author Eric Blake (ebb9@email.byu.edu)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
* @see Runnable
* @see Runtime#exit(int)
* @see #run()
@@ -130,15 +131,27 @@ public class Thread implements Runnable
/** The context classloader for this Thread. */
private ClassLoader contextClassLoader;
+
+ /** This thread's ID. */
+ private final long threadId;
/** The next thread number to use. */
private static int numAnonymousThreadsCreated;
+
+ /** The next thread ID to use. */
+ private static long nextThreadId;
+
+ /** The default exception handler. */
+ private static UncaughtExceptionHandler defaultHandler;
/** Thread local storage. Package accessible for use by
* InheritableThreadLocal.
*/
WeakIdentityHashMap locals;
+ /** The uncaught exception handler. */
+ UncaughtExceptionHandler exceptionHandler;
+
/**
* Allocates a new <code>Thread</code> object. This constructor has
* the same effect as <code>Thread(null, null,</code>
@@ -342,6 +355,11 @@ public class Thread implements Runnable
this.name = name.toString();
this.runnable = target;
this.stacksize = size;
+
+ synchronized (Thread.class)
+ {
+ this.threadId = nextThreadId++;
+ }
priority = current.priority;
daemon = current.daemon;
@@ -371,6 +389,11 @@ public class Thread implements Runnable
this.priority = priority;
this.daemon = daemon;
this.contextClassLoader = ClassLoader.getSystemClassLoader();
+ synchronized (Thread.class)
+ {
+ this.threadId = nextThreadId++;
+ }
+
}
/**
@@ -434,6 +457,19 @@ public class Thread implements Runnable
/**
* Originally intended to destroy this thread, this method was never
* implemented by Sun, and is hence a no-op.
+ *
+ * @deprecated This method was originally intended to simply destroy
+ * the thread without performing any form of cleanup operation.
+ * However, it was never implemented. It is now deprecated
+ * for the same reason as <code>suspend()</code>,
+ * <code>stop()</code> and <code>resume()</code>; namely,
+ * it is prone to deadlocks. If a thread is destroyed while
+ * it still maintains a lock on a resource, then this resource
+ * will remain locked and any attempts by other threads to
+ * access the resource will result in a deadlock. Thus, even
+ * an implemented version of this method would be still be
+ * deprecated, due to its unsafe nature.
+ * @throws NoSuchMethodError as this method was never implemented.
*/
public void destroy()
{
@@ -1000,4 +1036,159 @@ public class Thread implements Runnable
}
return locals;
}
+
+ /**
+ * Assigns the given <code>UncaughtExceptionHandler</code> to this
+ * thread. This will then be called if the thread terminates due
+ * to an uncaught exception, pre-empting that of the
+ * <code>ThreadGroup</code>.
+ *
+ * @param h the handler to use for this thread.
+ * @throws SecurityException if the current thread can't modify this thread.
+ * @since 1.5
+ */
+ public void setUncaughtExceptionHandler(UncaughtExceptionHandler h)
+ {
+ SecurityManager sm = SecurityManager.current; // Be thread-safe.
+ if (sm != null)
+ sm.checkAccess(this);
+ exceptionHandler = h;
+ }
+
+ /**
+ * <p>
+ * Returns the handler used when this thread terminates due to an
+ * uncaught exception. The handler used is determined by the following:
+ * </p>
+ * <ul>
+ * <li>If this thread has its own handler, this is returned.</li>
+ * <li>If not, then the handler of the thread's <code>ThreadGroup</code>
+ * object is returned.</li>
+ * <li>If both are unavailable, then <code>null</code> is returned
+ * (which can only happen when the thread was terminated since
+ * then it won't have an associated thread group anymore).</li>
+ * </ul>
+ *
+ * @return the appropriate <code>UncaughtExceptionHandler</code> or
+ * <code>null</code> if one can't be obtained.
+ * @since 1.5
+ */
+ public UncaughtExceptionHandler getUncaughtExceptionHandler()
+ {
+ return exceptionHandler != null ? exceptionHandler : group;
+ }
+
+ /**
+ * <p>
+ * Sets the default uncaught exception handler used when one isn't
+ * provided by the thread or its associated <code>ThreadGroup</code>.
+ * This exception handler is used when the thread itself does not
+ * have an exception handler, and the thread's <code>ThreadGroup</code>
+ * does not override this default mechanism with its own. As the group
+ * calls this handler by default, this exception handler should not defer
+ * to that of the group, as it may lead to infinite recursion.
+ * </p>
+ * <p>
+ * Uncaught exception handlers are used when a thread terminates due to
+ * an uncaught exception. Replacing this handler allows default code to
+ * be put in place for all threads in order to handle this eventuality.
+ * </p>
+ *
+ * @param h the new default uncaught exception handler to use.
+ * @throws SecurityException if a security manager is present and
+ * disallows the runtime permission
+ * "setDefaultUncaughtExceptionHandler".
+ * @since 1.5
+ */
+ public static void
+ setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler h)
+ {
+ SecurityManager sm = SecurityManager.current; // Be thread-safe.
+ if (sm != null)
+ sm.checkPermission(new RuntimePermission("setDefaultUncaughtExceptionHandler"));
+ defaultHandler = h;
+ }
+
+ /**
+ * Returns the handler used by default when a thread terminates
+ * unexpectedly due to an exception, or <code>null</code> if one doesn't
+ * exist.
+ *
+ * @return the default uncaught exception handler.
+ * @since 1.5
+ */
+ public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
+ {
+ return defaultHandler;
+ }
+
+ /**
+ * Returns the unique identifier for this thread. This ID is generated
+ * on thread creation, and may be re-used on its death.
+ *
+ * @return a positive long number representing the thread's ID.
+ * @since 1.5
+ */
+ public long getId()
+ {
+ return threadId;
+ }
+
+ /**
+ * <p>
+ * This interface is used to handle uncaught exceptions
+ * which cause a <code>Thread</code> to terminate. When
+ * a thread, t, is about to terminate due to an uncaught
+ * exception, the virtual machine looks for a class which
+ * implements this interface, in order to supply it with
+ * the dying thread and its uncaught exception.
+ * </p>
+ * <p>
+ * The virtual machine makes two attempts to find an
+ * appropriate handler for the uncaught exception, in
+ * the following order:
+ * </p>
+ * <ol>
+ * <li>
+ * <code>t.getUncaughtExceptionHandler()</code> --
+ * the dying thread is queried first for a handler
+ * specific to that thread.
+ * </li>
+ * <li>
+ * <code>t.getThreadGroup()</code> --
+ * the thread group of the dying thread is used to
+ * handle the exception. If the thread group has
+ * no special requirements for handling the exception,
+ * it may simply forward it on to
+ * <code>Thread.getDefaultUncaughtExceptionHandler()</code>,
+ * the default handler, which is used as a last resort.
+ * </li>
+ * </ol>
+ * <p>
+ * The first handler found is the one used to handle
+ * the uncaught exception.
+ * </p>
+ *
+ * @author Tom Tromey <tromey@redhat.com>
+ * @author Andrew John Hughes <gnu_andrew@member.fsf.org>
+ * @since 1.5
+ * @see Thread#getUncaughtExceptionHandler()
+ * @see Thread#setUncaughtExceptionHander(java.lang.Thread.UncaughtExceptionHandler)
+ * @see Thread#getDefaultUncaughtExceptionHandler()
+ * @see
+ * Thread#setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
+ */
+ public interface UncaughtExceptionHandler
+ {
+ /**
+ * Invoked by the virtual machine with the dying thread
+ * and the uncaught exception. Any exceptions thrown
+ * by this method are simply ignored by the virtual
+ * machine.
+ *
+ * @param thr the dying thread.
+ * @param exc the uncaught exception.
+ */
+ void uncaughtException(Thread thr, Throwable exc);
+ }
}
diff --git a/java/lang/ThreadGroup.java b/java/lang/ThreadGroup.java
index 6e4c27a71..7fbef88f4 100644
--- a/java/lang/ThreadGroup.java
+++ b/java/lang/ThreadGroup.java
@@ -37,6 +37,7 @@ exception statement from your version. */
package java.lang;
+import java.lang.Thread.UncaughtExceptionHandler;
import java.util.Vector;
/**
@@ -53,7 +54,7 @@ import java.util.Vector;
* @since 1.0
* @status updated to 1.4
*/
-public class ThreadGroup
+public class ThreadGroup implements UncaughtExceptionHandler
{
/** The Initial, top-level ThreadGroup. */
static ThreadGroup root = new ThreadGroup();
@@ -545,6 +546,8 @@ public class ThreadGroup
{
if (parent != null)
parent.uncaughtException(thread, t);
+ else if (Thread.getDefaultUncaughtExceptionHandler() != null)
+ Thread.getDefaultUncaughtExceptionHandler().uncaughtException(thread, t);
else if (! (t instanceof ThreadDeath))
{
if (t == null)
diff --git a/java/lang/ThreadLocal.java b/java/lang/ThreadLocal.java
index aceb2557a..64df8c3dd 100644
--- a/java/lang/ThreadLocal.java
+++ b/java/lang/ThreadLocal.java
@@ -152,4 +152,15 @@ public class ThreadLocal
// ever modify the map.
map.put(this, value == null ? NULL : value);
}
+
+ /**
+ * Removes the value associated with the ThreadLocal object for the
+ * currently executing Thread.
+ * @since 1.5
+ */
+ public void remove()
+ {
+ Map map = Thread.getThreadLocals();
+ map.remove(this);
+ }
}
diff --git a/java/lang/TypeNotPresentException.java b/java/lang/TypeNotPresentException.java
index 3010c968b..65d98457e 100644
--- a/java/lang/TypeNotPresentException.java
+++ b/java/lang/TypeNotPresentException.java
@@ -58,7 +58,8 @@ package java.lang;
public class TypeNotPresentException
extends RuntimeException
{
-
+ private static final long serialVersionUID = -5101214195716534496L;
+
/**
* Constructs a <code>TypeNotPresentException</code> for
* the supplied type. The specified cause <code>Throwable</code>
diff --git a/java/lang/annotation/Annotation.java b/java/lang/annotation/Annotation.java
new file mode 100644
index 000000000..01e23930e
--- /dev/null
+++ b/java/lang/annotation/Annotation.java
@@ -0,0 +1,136 @@
+/* Annotation.java - Base interface for all annotations
+ Copyright (C) 2004 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package java.lang.annotation;
+
+/**
+ * This is the common interface for all annotations. Note that classes
+ * that implement this class manually are not classed as annotations, and
+ * that this interface does not define an annotation type in itself.
+ *
+ * @author Tom Tromey (tromey@redhat.com)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
+ * @since 1.5
+ */
+public interface Annotation
+{
+
+ /**
+ * Returns the type of this annotation.
+ *
+ * @return the class of which this annotation is an instance.
+ */
+ /* FIXME[GENERICS]: Should return Class<? extends Annotation> */
+ Class annotationType();
+
+ /**
+ * <p>
+ * Returns true if the supplied object is equivalent to this annotation.
+ * For this property to hold, the following must be true of <code>o</code>:
+ * </p>
+ * <ul>
+ * <li>The object is also an instance of the same annotation type.</li>
+ * <li>The members of the supplied annotation are equal to those of this
+ * annotation, according to the following:
+ * <ul>
+ * <li>If the members are <code>float</code>s, then, for floats
+ * <code>x</code> and <code>y</code>,
+ * <code>Float.valueOf(x).equals(Float.valueOf(y)</code> must return
+ * true. This differs from the usual (<code>==</code>) comparison
+ * in that <code>NaN</code> is considered equal to itself and positive
+ * and negative zero are seen as different.</li>
+ * <li>Likewise, if the members are <code>double</code>s, then, for doubles
+ * <code>x</code> and <code>y</code>,
+ * <code>Double.valueOf(x).equals(Double.valueOf(y)</code> must return
+ * true. This differs from the usual (<code>==</code>) comparison
+ * in that <code>NaN</code> is considered equal to itself and positive
+ * and negative zero are seen as different.</li>
+ * <li>Strings, classes, enumerations and annotations are considered
+ * equal according to the <code>equals()</code> implementation for these
+ * types.</li>
+ * <li>Arrays are considered equal according to <code>Arrays.equals()</code>
+ * </li>
+ * <li>Any remaining types are considered equal using <code>==</code>.</li>
+ * </li>
+ * </ul>
+ *
+ * @param o the object to compare with this annotation.
+ * @return true if the supplied object is an annotation with equivalent
+ * members.
+ */
+ boolean equals(Object o);
+
+ /**
+ * <p>
+ * Returns the hash code of the annotation. This is computed as the
+ * sum of the hash codes of the annotation's members.
+ * </p>
+ * <p>
+ * The hash code of a member of the annotation is the result of XORing
+ * the hash code of its value with the result of multiplying the hash code
+ * of its name by 127. Formally, if the value is <code>v</code> and the
+ * name is <code>n</code>, the hash code of the member is
+ * v.hashCode() XOR (127 * String.hashCode(n)). <code>v.hashCode()</code>
+ * is defined as follows:
+ * </p>
+ * <ul>
+ * <li>The hash code of a primitive value (i.e. <code>byte</code>,
+ * <code>char</code>, <code>double</code>, <code>float</code>,
+ * <code>int</code>, <code>long</code>, <code>short</code> and
+ * <code>boolean</code>) is the hash code obtained from its corresponding
+ * wrapper class using <code>valueOf(v).hashCode()</code>, where
+ * <code>v</code> is the primitive value.</li>
+ * <li>The hash code of an enumeration, string, class or other annotation
+ * is obtained using <code>v.hashCode()</code>.</li>
+ * <li>The hash code of an array is computed using
+ * <code>Arrays.hashCode(v)</code>.</li>
+ * </ul>
+ *
+ * @return the hash code of the annotation, computed as the sum of its
+ * member hashcodes.
+ */
+ int hashCode();
+
+ /**
+ * Returns a textual representation of the annotation. This is
+ * implementation-dependent, but is expected to include the classname
+ * and the names and values of each member.
+ *
+ * @return a textual representation of the annotation.
+ */
+ String toString();
+}
diff --git a/java/lang/annotation/AnnotationFormatError.java b/java/lang/annotation/AnnotationFormatError.java
index 40ce3ca10..36f600632 100644
--- a/java/lang/annotation/AnnotationFormatError.java
+++ b/java/lang/annotation/AnnotationFormatError.java
@@ -49,6 +49,7 @@ package java.lang.annotation;
*/
public class AnnotationFormatError extends Error
{
+ private static final long serialVersionUID = -4256701562333669892L;
/**
* Constructs a new <code>AnnotationFormatError</code>
diff --git a/java/lang/instrument/ClassDefinition.java b/java/lang/instrument/ClassDefinition.java
new file mode 100644
index 000000000..841597c31
--- /dev/null
+++ b/java/lang/instrument/ClassDefinition.java
@@ -0,0 +1,88 @@
+/* ClassDefinition.java -- Class that binds a class with a new class file
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.instrument;
+
+/**
+ * This class binds a class that will be redefined with a new
+ * class file.
+ *
+ * @author Nicolas Geoffray (nicolas.geoffray@menlina.com)
+ * @see Instrumentation#redefineClasses(java.lang.instrument.ClassDefinition[])
+ * @since 1.5
+ */
+public final class ClassDefinition
+{
+
+ /* The class it's related */
+ private Class theClass;
+
+ /* The new bytecode of theClass */
+ private byte[] theClassFile;
+
+ /**
+ * @param theClass the Class that will be redefined
+ * @param theClassFile the new class file
+ * @throws NullPointerException if one of the argument is null
+ */
+ /* FIXME[GENERICS]: Signature should be (Class<?>, byte[]) */
+ public ClassDefinition(Class theClass, byte[] theClassFile)
+ {
+ if (theClass == null || theClassFile == null)
+ throw new NullPointerException();
+ this.theClass = theClass;
+ this.theClassFile = theClassFile;
+ }
+
+ /**
+ * @return the Class
+ */
+ /* FIXME[GENERICS]: Should return Class<?> */
+ public Class getDefinitionClass()
+ {
+ return theClass;
+ }
+
+ /**
+ * @return the bytes
+ */
+ public byte[] getDefinitionClassFile()
+ {
+ return theClassFile;
+ }
+}
diff --git a/java/lang/instrument/ClassFileTransformer.java b/java/lang/instrument/ClassFileTransformer.java
new file mode 100644
index 000000000..68638d719
--- /dev/null
+++ b/java/lang/instrument/ClassFileTransformer.java
@@ -0,0 +1,86 @@
+/* ClassFileTransformer.java -- Implementation of this interface is used by an agent to
+ transform class files.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.instrument;
+
+import java.security.ProtectionDomain;
+
+/**
+ * This interface should be implemented by classes wishing to transform
+ * classes bytecode when defining or redefining classes.
+ *
+ * @author Nicolas Geoffray (nicolas.geoffray@menlina.com)
+ * @see Instrumentation
+ * @see Instrumentation#addTransformer(java.lang.instrument.ClassFileTransformer)
+ * @see Instrumentation#removeTransformer(java.lang.instrument.ClassFileTransformer)
+ * @since 1.5
+ */
+public interface ClassFileTransformer
+{
+
+ /**
+ * Implementation of this method transforms a class by redefining its
+ * bytecodes. Once a ClassFileTransformer object registers itself to the
+ * Instrumentation object, this method will be called each time a class is
+ * defined (<code>ClassLoader.defineClass</code>) or redefined
+ * (<code>Instrumentation.redefineClasses</code>)
+ * @param loader the loader of the class
+ * @param className the name of the class with packages separated with "/"
+ * @param classBeingRedefined the class being redefined if it's the case,
+ * null otherwise
+ * @param protectionDomain the protection domain of the class being defined or
+ * redefined
+ * @param classfileBuffer the input byte buffer in class file format
+ *
+ * @return a class file buffer or null when no transformation has been performed
+ *
+ * @throws IllegalClassFormatException if the byte buffer does not represent
+ * a well-formed class file
+ * @see Instrumentation#redefineClasses(java.lang.instrument.ClassDefinition[])
+ *
+ */
+ /* FIXME[GENERICS]: Class should be Class<?> */
+ byte[] transform(ClassLoader loader,
+ String className,
+ Class classBeingRedefined,
+ ProtectionDomain protectionDomain,
+ byte[] classfileBuffer)
+ throws IllegalClassFormatException;
+}
+
diff --git a/java/lang/instrument/IllegalClassFormatException.java b/java/lang/instrument/IllegalClassFormatException.java
new file mode 100644
index 000000000..c75bde003
--- /dev/null
+++ b/java/lang/instrument/IllegalClassFormatException.java
@@ -0,0 +1,70 @@
+/* IllegalClassFormatException.java -- thrown when an array of byte does
+ not represent a valid class file
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.instrument;
+
+/**
+ * @author Nicolas Geoffray (nicolas.geoffray@menlina.com)
+ * @since 1.5
+ */
+public class IllegalClassFormatException extends Exception
+{
+
+ /**
+ * Compatible with JDK 1.5+.
+ */
+ private static final long serialVersionUID = -3841736710924794009L;
+
+ /**
+ * Create an exception without a message.
+ */
+ public IllegalClassFormatException()
+ {
+ }
+
+ /**
+ * Create an exception with a message.
+ *
+ * @param s the message
+ */
+ public IllegalClassFormatException(String s)
+ {
+ super(s);
+ }
+}
diff --git a/java/lang/instrument/Instrumentation.java b/java/lang/instrument/Instrumentation.java
new file mode 100644
index 000000000..81aefa6d6
--- /dev/null
+++ b/java/lang/instrument/Instrumentation.java
@@ -0,0 +1,139 @@
+/* Instrumentation.java -- Implementation of this interface is used to
+ instrument Java bytecode.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.instrument;
+
+/**
+ * An Instrumentation object has transformers that will
+ * be called each time a class is defined or redefined.
+ * The object is given to a <code>premain</code> function
+ * that is called before the <code>main</code> function.
+ *
+ * @author Nicolas Geoffray (nicolas.geoffray@menlina.com)
+ * @since 1.5
+ */
+public interface Instrumentation
+{
+
+ /**
+ * Adds a <code>ClassFileTransformer</class> object
+ * to the instrumentation. Each time a class is defined
+ * or redefined, the <code>transform</code> method of the
+ * <code>transformer</code> object is called.
+ *
+ * @param transformer the transformer to add
+ * @throws NullPointerException if transformer is null
+ */
+ void addTransformer(ClassFileTransformer transformer);
+
+ /**
+ * Removes the given transformer from the set of transformers
+ * this Instrumentation object has.
+ *
+ * @param transformer the transformer to remove
+ * @return true if the transformer was found and removed, false if
+ * the transformer was not found
+ * @throws NullPointerException if transformer is null
+ */
+ boolean removeTransformer(ClassFileTransformer transformer);
+
+ /**
+ * Returns if the current JVM supports class redefinition
+ *
+ * @return true if the current JVM supports class redefinition
+ */
+ boolean isRedefineClassesSupported();
+
+ /**
+ * Redefine classes present in the definitions array, with
+ * the corresponding class files.
+ *
+ * @param definitions an array of classes to redefine
+ *
+ * @throws ClassNotFoundException if a class cannot be found
+ * @throws UnmodifiableClassException if a class cannot be modified
+ * @throws UnsupportedOperationException if the JVM does not support
+ * redefinition or the redefinition made unsupported changes
+ * @throws ClassFormatError if a class file is not valid
+ * @throws NoClassDefFoundError if a class name is not equal to the name
+ * in the class file specified
+ * @throws UnsupportedClassVersionError if the class file version numbers
+ * are unsupported
+ * @throws ClassCircularityError if circularity occured with the new
+ * classes
+ * @throws LinkageError if a linkage error occurs
+ * @throws NullPointerException if the definitions array is null, or any
+ * of its element
+ *
+ * @see #isRedefineClassesSupported()
+ * @see #addTransformer(java.lang.instrument.ClassFileTransformer)
+ * @see ClassFileTransformer
+ */
+ void redefineClasses(ClassDefinition[] definitions)
+ throws ClassNotFoundException,
+ UnmodifiableClassException;
+
+
+ /**
+ * Get all the classes loaded by the JVM.
+ *
+ * @return an array containing all the classes loaded by the JVM. The array
+ * is empty if no class is loaded.
+ */
+ Class[] getAllLoadedClasses();
+
+ /**
+ * Get all the classes loaded by a given class loader
+ *
+ * @param loader the loader
+ *
+ * @return an array containing all the classes loaded by the given loader.
+ * The array is empty if no class was loaded by the loader.
+ */
+ Class[] getInitiatedClasses(ClassLoader loader);
+
+ /**
+ * Get the size of an object. It contains the size of all fields.
+ *
+ * @param objectToSize the object
+ * @return the size of the object
+ * @throws NullPointerException if objectToSize is null.
+ */
+ long getObjectSize(Object objectToSize);
+}
diff --git a/java/lang/instrument/UnmodifiableClassException.java b/java/lang/instrument/UnmodifiableClassException.java
new file mode 100644
index 000000000..a01bd701d
--- /dev/null
+++ b/java/lang/instrument/UnmodifiableClassException.java
@@ -0,0 +1,69 @@
+/* UnmodifiableClassException.java -- thrown when attempting to redefine
+ an unmodifiable class
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.instrument;
+
+/**
+ * @author Nicolas Geoffray (nicolas.geoffray@menlina.com)
+ * @since 1.5
+ */
+public class UnmodifiableClassException extends Exception
+{
+ /**
+ * Compatible with JDK 1.5+.
+ */
+ private static final long serialVersionUID = 1716652643585309178L;
+
+ /**
+ * Create an exception without a message.
+ */
+ public UnmodifiableClassException()
+ {
+ }
+
+ /**
+ * Create an exception with a message.
+ *
+ * @param s the message
+ */
+ public UnmodifiableClassException(String s)
+ {
+ super(s);
+ }
+}
diff --git a/java/lang/reflect/AccessibleObject.java b/java/lang/reflect/AccessibleObject.java
index 24418c971..8f09eac1b 100644
--- a/java/lang/reflect/AccessibleObject.java
+++ b/java/lang/reflect/AccessibleObject.java
@@ -1,5 +1,5 @@
/* java.lang.reflect.AccessibleObject
- Copyright (C) 2001, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.lang.reflect;
+import java.lang.annotation.Annotation;
+
/**
* This class is the superclass of various reflection classes, and
* allows sufficiently trusted code to bypass normal restrictions to
@@ -53,9 +55,10 @@ package java.lang.reflect;
* @see Method
* @see ReflectPermission
* @since 1.2
- * @status updated to 1.4
+ * @status updated to 1.5
*/
public class AccessibleObject
+ implements AnnotatedElement
{
/**
* True if this object is marked accessible, which means the reflected
@@ -156,4 +159,26 @@ public class AccessibleObject
throw new SecurityException("Cannot make object accessible: " + this);
this.flag = flag;
}
+
+ /* FIXME[GENERICS]: <T extends Annotation> T getAnnotation(Class <T>) */
+ public Annotation getAnnotation(Class annotationClass)
+ {
+ throw new AssertionError("Subclass must override this method");
+ }
+
+ public Annotation[] getAnnotations()
+ {
+ return getDeclaredAnnotations();
+ }
+
+ public Annotation[] getDeclaredAnnotations()
+ {
+ throw new AssertionError("Subclass must override this method");
+ }
+
+ /* FIXME[GENERICS]: Signature is Class<? extends Annotation> */
+ public boolean isAnnotationPresent(Class annotationClass)
+ {
+ return getAnnotation(annotationClass) != null;
+ }
}
diff --git a/java/lang/reflect/AnnotatedElement.java b/java/lang/reflect/AnnotatedElement.java
new file mode 100644
index 000000000..69a64a028
--- /dev/null
+++ b/java/lang/reflect/AnnotatedElement.java
@@ -0,0 +1,117 @@
+/* AnnotatedElement.java
+ Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.reflect;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * <p>
+ * Represents an element that can be annotated. The methods of this interface
+ * provide reflection-based access to the annotations associated with a
+ * particular element, such as a class, field, method or package. Each
+ * annotation returned by these methods is both immutable and serializable.
+ * The returned arrays may be freely modified, without any effect on the
+ * arrays returned to future callers.
+ * </p>
+ * <p>
+ * If an annotation refers to a type or enumeration constant that is
+ * inaccessible, then a <code>TypeNotPresentException</code> or
+ * <code>EnumConstantNotPresentException</code> will be thrown. Likewise,
+ * invalid annotations will produce either a
+ * <code>AnnotationTypeMismatchException</code> or
+ * <code>IncompleteAnnotationException</code>.
+ * </p>
+ *
+ * @author Tom Tromey (tromey@redhat.com)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
+ * @since 1.5
+ */
+public interface AnnotatedElement
+{
+
+ /**
+ * Returns the element's annotation for the specified annotation type,
+ * or <code>null</code> if no such annotation exists.
+ *
+ * @param annotationClass the type of annotation to look for.
+ * @return this element's annotation for the specified type, or
+ * <code>null</code> if no such annotation exists.
+ * @throws NullPointerException if the annotation class is <code>null</code>.
+ */
+ /* FIXME[GENERICS]: <T extends Annotation> T getAnnotation(Class <T>) */
+ Annotation getAnnotation(Class annotationClass);
+
+ /**
+ * Returns all annotations associated with the element. If there are
+ * no annotations associated with the element, then a zero-length array
+ * will be returned. The returned array may be modified by the client
+ * code, but this will have no effect on the annotation content of the
+ * element, and hence no effect on the return value of this method for
+ * future callers.
+ *
+ * @return this element's annotations.
+ */
+ Annotation[] getAnnotations();
+
+ /**
+ * Returns all annotations directly defined by the element. If there are
+ * no annotations directly associated with the element, then a zero-length
+ * array will be returned. The returned array may be modified by the client
+ * code, but this will have no effect on the annotation content of this
+ * class, and hence no effect on the return value of this method for
+ * future callers.
+ *
+ * @return the annotations directly defined by the element.
+ * @since 1.5
+ */
+ Annotation[] getDeclaredAnnotations();
+
+ /**
+ * Returns true if an annotation for the specified type is associated
+ * with the element. This is primarily a short-hand for using marker
+ * annotations.
+ *
+ * @param annotationClass the type of annotation to look for.
+ * @return true if an annotation exists for the specified type.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Signature is Class<? extends Annotation> */
+ boolean isAnnotationPresent(Class annotationClass);
+
+}
diff --git a/java/lang/reflect/Array.java b/java/lang/reflect/Array.java
index 35c77da36..ae65ffbf2 100644
--- a/java/lang/reflect/Array.java
+++ b/java/lang/reflect/Array.java
@@ -38,8 +38,6 @@ exception statement from your version. */
package java.lang.reflect;
-import gnu.classpath.Configuration;
-
/**
* Array holds static helper functions that allow you to create and
* manipulate arrays by reflection. Operations know how to perform widening
@@ -78,13 +76,6 @@ import gnu.classpath.Configuration;
*/
public final class Array
{
- static
- {
- if (Configuration.INIT_LOAD_LIBRARY)
- {
- System.loadLibrary("javalangreflect");
- }
- }
/**
* This class is uninstantiable.
@@ -107,7 +98,7 @@ public final class Array
public static Object newInstance(Class componentType, int length)
{
if (! componentType.isPrimitive())
- return createObjectArray(componentType, length);
+ return VMArray.createObjectArray(componentType, length);
if (componentType == boolean.class)
return new boolean[length];
if (componentType == byte.class)
@@ -653,7 +644,7 @@ public final class Array
Object toAdd = createMultiArray(type, dimensions, index - 1);
Class thisType = toAdd.getClass();
Object[] retval
- = (Object[]) createObjectArray(thisType, dimensions[index]);
+ = (Object[]) VMArray.createObjectArray(thisType, dimensions[index]);
if (dimensions[index] > 0)
retval[0] = toAdd;
int i = dimensions[index];
@@ -662,14 +653,4 @@ public final class Array
return retval;
}
- /**
- * Dynamically create an array of objects.
- *
- * @param type guaranteed to be a valid object type
- * @param dim the length of the array
- * @return the new array
- * @throws NegativeArraySizeException if dim is negative
- * @throws OutOfMemoryError if memory allocation fails
- */
- private static native Object createObjectArray(Class type, int dim);
}
diff --git a/org/omg/PortableInterceptor/ObjectReferenceFactoryOperations.java b/java/lang/reflect/GenericDeclaration.java
index b5d912d12..14f5ba832 100644
--- a/org/omg/PortableInterceptor/ObjectReferenceFactoryOperations.java
+++ b/java/lang/reflect/GenericDeclaration.java
@@ -1,5 +1,5 @@
-/* ObjectReferenceFactoryOperations.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+/* GenericDeclaration.java
+ Copyright (C) 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -36,34 +36,28 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
-package org.omg.PortableInterceptor;
-
-import org.omg.CORBA.portable.ValueBase;
+package java.lang.reflect;
/**
- * Defines the operations, applicable to the ObjectReferenceFactory.
+ * Represents an entity that declares one or more type parameters.
+ * This includes classes and methods (including constructors).
*
+ * @author Tom Tromey (tromey@redhat.com)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
* @since 1.5
- *
- * @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public interface ObjectReferenceFactoryOperations
- extends ValueBase
+public interface GenericDeclaration
{
/**
- * Create an object with the given repository and object ids. This interface
- * does not specify where and how the returned object must be connected and
- * activated. The derived {@link ObjectReferenceTemplate} interface assumes
- * the the object must be connected to the POA that is specific to that
- * template (name can be obtained).
- *
- * If the object with this objectId already exists in the given context, it is
- * found and returned; the new object is <i>not</i> created.
- *
- * @param repositoryId the repository id of the object being created, defines
- * the type of the object.
+ * Returns a <code>TypeVariable</code> object for each type variable
+ * declared by this entity, in order of declaration. An empty array
+ * is returned if no type variables are declared.
*
- * @param objectId the byte array, defining the identity of the object.
+ * @return an array of <code>TypeVariable</code> objects.
+ * @throws GenericSignatureFormatError if the signature format within the
+ * class file does not conform to that specified in the 3rd edition
+ * of the Java Virtual Machine Specification.
*/
- org.omg.CORBA.Object make_object(String repositoryId, byte[] objectId);
-} \ No newline at end of file
+ /* FIXME[GENERICS]: Should be TypeVariable<?>[] */
+ TypeVariable[] getTypeParameters();
+}
diff --git a/java/lang/reflect/GenericSignatureFormatError.java b/java/lang/reflect/GenericSignatureFormatError.java
index ab6928de6..0f09522bc 100644
--- a/java/lang/reflect/GenericSignatureFormatError.java
+++ b/java/lang/reflect/GenericSignatureFormatError.java
@@ -51,6 +51,7 @@ package java.lang.reflect;
public class GenericSignatureFormatError
extends ClassFormatError
{
+ private static final long serialVersionUID = 6709919147137911034L;
/**
* Constructs a new <code>GenericSignatureFormatError</code>.
diff --git a/java/lang/reflect/MalformedParameterizedTypeException.java b/java/lang/reflect/MalformedParameterizedTypeException.java
new file mode 100644
index 000000000..50ae23000
--- /dev/null
+++ b/java/lang/reflect/MalformedParameterizedTypeException.java
@@ -0,0 +1,60 @@
+/* MalformedParameterizedTypeException.java
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.reflect;
+
+/**
+ * This exception class is thrown when one of the reflection
+ * methods encountered an invalid parameterized type within
+ * the metadata of a class. One possible reason for this
+ * exception being thrown is the specification of too few or
+ * too many type variables.
+ *
+ * @author Tom Tromey (tromey@redhat.com)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
+ * @since 1.5
+ */
+public class MalformedParameterizedTypeException
+ extends RuntimeException
+{
+ private static final long serialVersionUID = -5696557788586220964L;
+
+ public MalformedParameterizedTypeException()
+ {
+ }
+}
diff --git a/java/lang/reflect/Member.java b/java/lang/reflect/Member.java
index c39731f84..fed962cf9 100644
--- a/java/lang/reflect/Member.java
+++ b/java/lang/reflect/Member.java
@@ -97,4 +97,13 @@ public interface Member
* @see Modifier
*/
int getModifiers();
+
+ /**
+ * Return true if this member is synthetic, meaning that it was
+ * created by the compiler and does not appear in the user's
+ * source code.
+ * @return true if the member is synthetic
+ * @since 1.5
+ */
+ boolean isSynthetic();
}
diff --git a/java/lang/reflect/Modifier.java b/java/lang/reflect/Modifier.java
index efc88c941..45fc4e37e 100644
--- a/java/lang/reflect/Modifier.java
+++ b/java/lang/reflect/Modifier.java
@@ -158,6 +158,26 @@ public class Modifier
static final int ALL_FLAGS = 0xfff;
/**
+ * Flag indicating a bridge method.
+ */
+ static final int BRIDGE = 0x40;
+
+ /**
+ * Flag indicating a varargs method.
+ */
+ static final int VARARGS = 0x80;
+
+ /**
+ * Flag indicating a synthetic member.
+ */
+ static final int SYNTHETIC = 0x1000;
+
+ /**
+ * Flag indicating an enum constant or an enum class.
+ */
+ static final int ENUM = 0x4000;
+
+ /**
* Check whether the given modifier is abstract.
* @param mod the modifier.
* @return <code>true</code> if abstract, <code>false</code> otherwise.
@@ -288,7 +308,19 @@ public class Modifier
*/
public static String toString(int mod)
{
- return toString(mod, new StringBuffer()).toString();
+ return toString(mod, new StringBuilder()).toString();
+ }
+
+ /**
+ * Package helper method that can take a StringBuilder.
+ * @param mod the modifier
+ * @param r the StringBuilder to which the String representation is appended
+ * @return r, with information appended
+ */
+ static StringBuilder toString(int mod, StringBuilder r)
+ {
+ r.append(toString(mod, new StringBuffer()));
+ return r;
}
/**
diff --git a/java/lang/reflect/ParameterizedType.java b/java/lang/reflect/ParameterizedType.java
index 61081c962..7a8a7b4e7 100644
--- a/java/lang/reflect/ParameterizedType.java
+++ b/java/lang/reflect/ParameterizedType.java
@@ -63,7 +63,7 @@ package java.lang.reflect;
*
* @author Tom Tromey (tromey@redhat.com)
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
- * @see GenericTypeDeclaration
+ * @see GenericDeclaration
* @see TypeVariable
* @since 1.5
*/
diff --git a/java/lang/reflect/TypeVariable.java b/java/lang/reflect/TypeVariable.java
new file mode 100644
index 000000000..4ecc20c9d
--- /dev/null
+++ b/java/lang/reflect/TypeVariable.java
@@ -0,0 +1,99 @@
+/* TypeVariable.java
+ Copyright (C) 2004 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.reflect;
+
+/**
+ * <p>
+ * This is a common interface for all type variables provided by
+ * the Java language. Instances are created the first time a type
+ * variable is needed by one of the reflective methods declared in
+ * this package.
+ * </p>
+ * <p>
+ * Creating a type variable requires resolving the appropriate type.
+ * This may involve resolving other classes as a side effect (e.g.
+ * if the type is nested inside other classes). Creation should not
+ * involve resolving the bounds. Repeated creation has no effect; an
+ * equivalent instance is returned. Caching is not required, but all
+ * instances must be <code>equal()</code> to each other.
+ * </p>
+ *
+ * @author Tom Tromey (tromey@redhat.com)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
+ * @since 1.5
+ */
+/* FIXME[GENERICS]: Should be TypeVariable<T extends GenericDeclaration> */
+public interface TypeVariable
+ extends Type
+{
+
+ /**
+ * Returns an array of <code>Type</code> objects which represent the upper
+ * bounds of this type variable. There is always a default bound of
+ * <code>Object</code>. Any <code>ParameterizedType</code>s will be
+ * created as necessary, and other types resolved.
+ *
+ * @return an array of <code>Type</code> objects representing the upper
+ * bounds.
+ * @throws TypeNotPresentException if any of the bounds refer to a
+ * non-existant type.
+ * @throws MalformedParameterizedTypeException if the creation of a
+ * <code>ParameterizedType</code> fails.
+ */
+ Type[] getBounds();
+
+
+ /**
+ * Returns a representation of the declaration used to declare this
+ * type variable.
+ *
+ * @return the <code>GenericDeclaration</code> object for this type
+ * variable.
+ */
+ /* FIXME[GENERICS]: Should return type T */
+ GenericDeclaration getGenericDeclaration();
+
+ /**
+ * Returns the name of the type variable, as written in the source
+ * code.
+ *
+ * @return the name of the type variable.
+ */
+ String getName();
+}
diff --git a/java/net/MimeTypeMapper.java b/java/net/MimeTypeMapper.java
index 1747f4d56..8153694b4 100644
--- a/java/net/MimeTypeMapper.java
+++ b/java/net/MimeTypeMapper.java
@@ -37,7 +37,17 @@ exception statement from your version. */
package java.net;
+import gnu.classpath.SystemProperties;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.LineNumberReader;
import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
/**
@@ -56,131 +66,230 @@ class MimeTypeMapper implements FileNameMap
*/
protected static final String[][] mime_strings =
{
- { "application/mac-binhex40", "hqx" },
- { "application/mac-compactpro", "cpt" },
- { "application/msword", "doc" },
- { "application/octet-stream", "bin" },
- { "application/octet-stream", "dms" },
- { "application/octet-stream", "lha" },
- { "application/octet-stream", "lzh" },
- { "application/octet-stream", "exe" },
- { "application/octet-stream", "class" },
- { "application/oda", "oda" },
- { "application/pdf", "pdf" },
- { "application/postscript", "ai" },
- { "application/postscript", "eps" },
- { "application/postscript", "ps" },
- { "application/powerpoint", "ppt" },
- { "application/rtf", "rtf" },
- { "application/x-bcpio", "bcpio" },
- { "application/x-cdlink", "vcd" },
- { "application/x-compress", "Z" },
- { "application/x-cpio", "cpio" },
- { "application/x-csh", "csh" },
- { "application/x-director", "dcr" },
- { "application/x-director", "dir" },
- { "application/x-director", "dxr" },
- { "application/x-dvi", "dvi" },
- { "application/x-gtar", "gtar" },
- { "application/x-gzip", "gz" },
- { "application/x-hdf", "hdf" },
- { "application/x-httpd-cgi", "cgi" },
- { "application/x-koan", "skp" },
- { "application/x-koan", "skd" },
- { "application/x-koan", "skt" },
- { "application/x-koan", "skm" },
- { "application/x-latex", "latex" },
- { "application/x-mif", "mif" },
- { "application/x-netcdf", "nc" },
- { "application/x-netcdf", "cdf" },
- { "application/x-sh", "sh" },
- { "application/x-shar", "shar" },
- { "application/x-stuffit", "sit" },
- { "application/x-sv4cpio", "sv4cpio" },
- { "application/x-sv4crc", "sv4crc" },
- { "application/x-tar", "tar" },
- { "application/x-tcl", "tcl" },
- { "application/x-tex", "tex" },
- { "application/x-texinfo", "texinfo" },
- { "application/x-texinfo", "texi" },
- { "application/x-troff", "t" },
- { "application/x-troff", "tr" },
- { "application/x-troff", "roff" },
- { "application/x-troff-man", "man" },
- { "application/x-troff-me", "me" },
- { "application/x-troff-ms", "ms" },
- { "application/x-ustar", "ustar" },
- { "application/x-wais-source", "src" },
- { "application/zip", "zip" },
- { "audio/basic", "au" },
- { "audio/basic", "snd" },
- { "audio/mpeg", "mpga" },
- { "audio/mpeg", "mp2" },
- { "audio/mpeg", "mp3" },
- { "audio/x-aiff", "aif" },
- { "audio/x-aiff", "aiff" },
- { "audio/x-aiff", "aifc" },
- { "audio/x-pn-realaudio", "ram" },
- { "audio/x-pn-realaudio-plugin", "rpm" },
- { "audio/x-realaudio", "ra" },
- { "audio/x-wav", "wav" },
- { "chemical/x-pdb", "pdb" },
- { "chemical/x-pdb", "xyz" },
- { "image/gif", "gif" },
- { "image/ief", "ief" },
- { "image/jpeg", "jpeg" },
- { "image/jpeg", "jpg" },
- { "image/jpeg", "jpe" },
- { "image/png", "png" },
- { "image/tiff", "tiff" },
- { "image/tiff", "tif" },
- { "image/x-cmu-raster", "ras" },
- { "image/x-portable-anymap", "pnm" },
- { "image/x-portable-bitmap", "pbm" },
- { "image/x-portable-graymap", "pgm" },
- { "image/x-portable-pixmap", "ppm" },
- { "image/x-rgb", "rgb" },
- { "image/x-xbitmap", "xbm" },
- { "image/x-xpixmap", "xpm" },
- { "image/x-xwindowdump", "xwd" },
- { "text/html", "html" },
- { "text/html", "htm" },
- { "text/plain", "txt" },
- { "text/richtext", "rtx" },
- { "text/tab-separated-values", "tsv" },
- { "text/x-setext", "etx" },
- { "text/x-sgml", "sgml" },
- { "text/x-sgml", "sgm" },
- { "video/mpeg", "mpeg" },
- { "video/mpeg", "mpg" },
- { "video/mpeg", "mpe" },
- { "video/quicktime", "qt" },
- { "video/quicktime", "mov" },
- { "video/x-msvideo", "avi" },
- { "video/x-sgi-movie", "movie" },
- { "x-conference/x-cooltalk", "ice" },
- { "x-world/x-vrml", "wrl" },
- { "x-world/x-vrml", "vrml" }
+ { "ai", "application/postscript" }
+ , { "aif", "audio/x-aiff" }
+ , { "aifc", "audio/x-aiff" }
+ , { "aiff", "audio/x-aiff" }
+ , { "asc", "text/plain" }
+ , { "au", "audio/basic" }
+ , { "avi", "video/x-msvideo" }
+ , { "bcpio", "application/x-bcpio" }
+ , { "bin", "application/octet-stream" }
+ , { "bmp", "image/bmp" }
+ , { "bz2", "application/x-bzip2" }
+ , { "cdf", "application/x-netcdf" }
+ , { "chrt", "application/x-kchart" }
+ , { "class", "application/octet-stream" }
+ , { "cpio", "application/x-cpio" }
+ , { "cpt", "application/mac-compactpro" }
+ , { "csh", "application/x-csh" }
+ , { "css", "text/css" }
+ , { "dcr", "application/x-director" }
+ , { "dir", "application/x-director" }
+ , { "djv", "image/vnd.djvu" }
+ , { "djvu", "image/vnd.djvu" }
+ , { "dll", "application/octet-stream" }
+ , { "dms", "application/octet-stream" }
+ , { "doc", "application/msword" }
+ , { "dvi", "application/x-dvi" }
+ , { "dxr", "application/x-director" }
+ , { "eps", "application/postscript" }
+ , { "etx", "text/x-setext" }
+ , { "exe", "application/octet-stream" }
+ , { "ez", "application/andrew-inset" }
+ , { "gif", "image/gif" }
+ , { "gtar", "application/x-gtar" }
+ , { "gz", "application/x-gzip" }
+ , { "hdf", "application/x-hdf" }
+ , { "hqx", "application/mac-binhex40" }
+ , { "htm", "text/html" }
+ , { "html", "text/html" }
+ , { "ice", "x-conference/x-cooltalk" }
+ , { "ief", "image/ief" }
+ , { "iges", "model/iges" }
+ , { "igs", "model/iges" }
+ , { "img", "application/octet-stream" }
+ , { "iso", "application/octet-stream" }
+ , { "jpe", "image/jpeg" }
+ , { "jpeg", "image/jpeg" }
+ , { "jpg", "image/jpeg" }
+ , { "js", "application/x-javascript" }
+ , { "kar", "audio/midi" }
+ , { "kil", "application/x-killustrator" }
+ , { "kpr", "application/x-kpresenter" }
+ , { "kpt", "application/x-kpresenter" }
+ , { "ksp", "application/x-kspread" }
+ , { "kwd", "application/x-kword" }
+ , { "kwt", "application/x-kword" }
+ , { "latex", "application/x-latex" }
+ , { "lha", "application/octet-stream" }
+ , { "lzh", "application/octet-stream" }
+ , { "m3u", "audio/x-mpegurl" }
+ , { "man", "application/x-troff-man" }
+ , { "me", "application/x-troff-me" }
+ , { "mesh", "model/mesh" }
+ , { "mid", "audio/midi" }
+ , { "midi", "audio/midi" }
+ , { "mif", "application/vnd.mif" }
+ , { "mov", "video/quicktime" }
+ , { "movie", "video/x-sgi-movie" }
+ , { "mp2", "audio/mpeg" }
+ , { "mp3", "audio/mpeg" }
+ , { "mpe", "video/mpeg" }
+ , { "mpeg", "video/mpeg" }
+ , { "mpg", "video/mpeg" }
+ , { "mpga", "audio/mpeg" }
+ , { "ms", "application/x-troff-ms" }
+ , { "msh", "model/mesh" }
+ , { "mxu", "video/vnd.mpegurl" }
+ , { "nc", "application/x-netcdf" }
+ , { "ogg", "application/ogg" }
+ , { "pbm", "image/x-portable-bitmap" }
+ , { "pdb", "chemical/x-pdb" }
+ , { "pdf", "application/pdf" }
+ , { "pgm", "image/x-portable-graymap" }
+ , { "pgn", "application/x-chess-pgn" }
+ , { "png", "image/png" }
+ , { "pnm", "image/x-portable-anymap" }
+ , { "ppm", "image/x-portable-pixmap" }
+ , { "ppt", "application/vnd.ms-powerpoint" }
+ , { "ps", "application/postscript" }
+ , { "qt", "video/quicktime" }
+ , { "ra", "audio/x-realaudio" }
+ , { "ram", "audio/x-pn-realaudio" }
+ , { "ras", "image/x-cmu-raster" }
+ , { "rgb", "image/x-rgb" }
+ , { "rm", "audio/x-pn-realaudio" }
+ , { "roff", "application/x-troff" }
+ , { "rpm", "application/x-rpm" }
+ , { "rtf", "text/rtf" }
+ , { "rtx", "text/richtext" }
+ , { "sgm", "text/sgml" }
+ , { "sgml", "text/sgml" }
+ , { "sh", "application/x-sh" }
+ , { "shar", "application/x-shar" }
+ , { "silo", "model/mesh" }
+ , { "sit", "application/x-stuffit" }
+ , { "skd", "application/x-koan" }
+ , { "skm", "application/x-koan" }
+ , { "skp", "application/x-koan" }
+ , { "skt", "application/x-koan" }
+ , { "smi", "application/smil" }
+ , { "smil", "application/smil" }
+ , { "snd", "audio/basic" }
+ , { "so", "application/octet-stream" }
+ , { "spl", "application/x-futuresplash" }
+ , { "src", "application/x-wais-source" }
+ , { "stc", "application/vnd.sun.xml.calc.template" }
+ , { "std", "application/vnd.sun.xml.draw.template" }
+ , { "sti", "application/vnd.sun.xml.impress.template" }
+ , { "stw", "application/vnd.sun.xml.writer.template" }
+ , { "sv4cpio", "application/x-sv4cpio" }
+ , { "sv4crc", "application/x-sv4crc" }
+ , { "swf", "application/x-shockwave-flash" }
+ , { "sxc", "application/vnd.sun.xml.calc" }
+ , { "sxd", "application/vnd.sun.xml.draw" }
+ , { "sxg", "application/vnd.sun.xml.writer.global" }
+ , { "sxi", "application/vnd.sun.xml.impress" }
+ , { "sxm", "application/vnd.sun.xml.math" }
+ , { "sxw", "application/vnd.sun.xml.writer" }
+ , { "t", "application/x-troff" }
+ , { "tar", "application/x-tar" }
+ , { "tcl", "application/x-tcl" }
+ , { "tex", "application/x-tex" }
+ , { "texi", "application/x-texinfo" }
+ , { "texinfo", "application/x-texinfo" }
+ , { "tgz", "application/x-gzip" }
+ , { "tif", "image/tiff" }
+ , { "tiff", "image/tiff" }
+ , { "torrent", "application/x-bittorrent" }
+ , { "tr", "application/x-troff" }
+ , { "tsv", "text/tab-separated-values" }
+ , { "txt", "text/plain" }
+ , { "ustar", "application/x-ustar" }
+ , { "vcd", "application/x-cdlink" }
+ , { "vrml", "model/vrml" }
+ , { "wav", "audio/x-wav" }
+ , { "wbmp", "image/vnd.wap.wbmp" }
+ , { "wbxml", "application/vnd.wap.wbxml" }
+ , { "wml", "text/vnd.wap.wml" }
+ , { "wmlc", "application/vnd.wap.wmlc" }
+ , { "wmls", "text/vnd.wap.wmlscript" }
+ , { "wmlsc", "application/vnd.wap.wmlscriptc" }
+ , { "wrl", "model/vrml" }
+ , { "xbm", "image/x-xbitmap" }
+ , { "xht", "application/xhtml+xml" }
+ , { "xhtml", "application/xhtml+xml" }
+ , { "xls", "application/vnd.ms-excel" }
+ , { "xml", "text/xml" }
+ , { "xpm", "image/x-xpixmap" }
+ , { "xsl", "text/xml" }
+ , { "xwd", "image/x-xwindowdump" }
+ , { "xyz", "chemical/x-xyz" }
+ , { "zip", "application/zip" }
};
/**
* The MIME types above are put into this Hashtable for faster lookup.
*/
- private static Hashtable mime_types = new Hashtable(150);
-
- // Static initializer to load MIME types into Hashtable
- static
- {
- for (int i = 0; i < mime_strings.length; i++)
- mime_types.put(mime_strings[i][1], mime_strings[i][0]);
- }
+ private Hashtable mime_types = new Hashtable(150);
/**
* Create a new <code>MimeTypeMapper</code> object.
*/
public MimeTypeMapper()
{
- // Do nothing here.
+ for (int i = 0; i < mime_strings.length; i++)
+ mime_types.put(mime_strings[i][0], mime_strings[i][1]);
+
+ // Now read from the system mime database, if it exists. Entries found
+ // here override our internal ones.
+ try
+ {
+ // On Linux this usually means /etc/mime.types.
+ String file
+ = SystemProperties.getProperty("gnu.classpath.mime.types.file");
+ if (file != null)
+ fillFromFile(mime_types, file);
+ }
+ catch (IOException ignore)
+ {
+ }
+ }
+
+ public static void fillFromFile (Map table, String fname)
+ throws IOException
+ {
+ LineNumberReader reader =
+ new LineNumberReader (new FileReader (fname));
+
+ while (reader.ready ())
+ {
+ StringTokenizer tokenizer =
+ new StringTokenizer (reader.readLine ());
+
+ try
+ {
+ String t = tokenizer.nextToken ();
+
+ if (! t.startsWith ("#"))
+ {
+ while (true)
+ {
+ // Read the next extension
+ String e = tokenizer.nextToken ();
+ if ((e != null) && (! e.startsWith ("#")))
+ table.put (e, t);
+ else
+ break;
+ }
+ }
+ }
+ catch (NoSuchElementException ex)
+ {
+ // Do nothing.
+ }
+ }
}
/**
@@ -210,4 +319,27 @@ class MimeTypeMapper implements FileNameMap
else
return type;
}
+
+ /**
+ * Run this class as a program to create a new mime_strings table.
+ */
+ public static void main(String[] args) throws IOException
+ {
+ TreeMap map = new TreeMap();
+ // It is fine to hard-code the name here. This is only ever
+ // used by maintainers, who can hack it if they need to re-run
+ // it.
+ fillFromFile(map, "/etc/mime.types");
+ Iterator it = map.keySet().iterator();
+ boolean first = true;
+ while (it.hasNext())
+ {
+ String key = (String) it.next();
+ String value = (String) map.get(key);
+ // Put the "," first since it is easier to make correct syntax this way.
+ System.out.println(" " + (first ? " " : ", ")
+ + "{ \"" + key + "\", \"" + value + "\" }");
+ first = false;
+ }
+ }
}
diff --git a/java/net/URLClassLoader.java b/java/net/URLClassLoader.java
index ffa73dda6..8d9e5ade7 100644
--- a/java/net/URLClassLoader.java
+++ b/java/net/URLClassLoader.java
@@ -39,6 +39,8 @@ exception statement from your version. */
package java.net;
+import gnu.java.net.IndexListParser;
+
import java.io.ByteArrayOutputStream;
import java.io.EOFException;
import java.io.File;
@@ -53,6 +55,7 @@ import java.security.PermissionCollection;
import java.security.PrivilegedAction;
import java.security.SecureClassLoader;
import java.security.cert.Certificate;
+import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
@@ -315,27 +318,29 @@ public class URLClassLoader extends SecureClassLoader
jarfile =
((JarURLConnection) baseJarURL.openConnection()).getJarFile();
-
+
Manifest manifest;
Attributes attributes;
String classPathString;
- if ((manifest = jarfile.getManifest()) != null
+ this.classPath = new Vector();
+
+ ArrayList indexListHeaders = new IndexListParser(jarfile, baseJarURL, baseURL).getHeaders();
+ if (indexListHeaders.size() > 0)
+ this.classPath.addAll(indexListHeaders);
+ else if ((manifest = jarfile.getManifest()) != null
&& (attributes = manifest.getMainAttributes()) != null
&& ((classPathString
= attributes.getValue(Attributes.Name.CLASS_PATH))
!= null))
- {
- this.classPath = new Vector();
-
+ {
StringTokenizer st = new StringTokenizer(classPathString, " ");
while (st.hasMoreElements ())
{
String e = st.nextToken ();
try
{
- URL url = new URL(baseURL, e);
- this.classPath.add(url);
+ this.classPath.add(new URL(baseURL, e));
}
catch (java.net.MalformedURLException xx)
{
@@ -538,9 +543,14 @@ public class URLClassLoader extends SecureClassLoader
{
try
{
- File file = new File(dir, name).getCanonicalFile();
- if (file.exists())
- return new FileResource(this, file);
+ // Make sure that all components in name are valid by walking through
+ // them
+ File file = walkPathComponents(name);
+
+ if (file == null)
+ return null;
+
+ return new FileResource(this, file);
}
catch (IOException e)
{
@@ -548,6 +558,65 @@ public class URLClassLoader extends SecureClassLoader
}
return null;
}
+
+ /**
+ * Walk all path tokens and check them for validity. At no moment, we are
+ * allowed to reach a directory located "above" the root directory, stored
+ * in "dir" property. We are also not allowed to enter a non existing
+ * directory or a non directory component (plain file, symbolic link, ...).
+ * An empty or null path is valid. Pathnames components are separated by
+ * <code>File.separatorChar</code>
+ *
+ * @param resourceFileName the name to be checked for validity.
+ * @return the canonical file pointed by the resourceFileName or null if the
+ * walking failed
+ * @throws IOException in case of issue when creating the canonical
+ * resulting file
+ * @see File#separatorChar
+ */
+ private File walkPathComponents(String resourceFileName) throws IOException
+ {
+ StringTokenizer stringTokenizer = new StringTokenizer(resourceFileName, File.separator);
+ File currentFile = dir;
+ int tokenCount = stringTokenizer.countTokens();
+
+ for (int i = 0; i < tokenCount - 1; i++)
+ {
+ String currentToken = stringTokenizer.nextToken();
+
+ // If we are at the root directory and trying to go up, the walking is
+ // finished with an error
+ if ("..".equals(currentToken) && currentFile.equals(dir))
+ return null;
+
+ currentFile = new File(currentFile, currentToken);
+
+ // If the current file doesn't exist or is not a directory, the walking is
+ // finished with an error
+ if (! (currentFile.exists() && currentFile.isDirectory()))
+ return null;
+
+ }
+
+ // Treat the last token differently, if it exists, because it does not need
+ // to be a directory
+ if (tokenCount > 0)
+ {
+ String currentToken = stringTokenizer.nextToken();
+
+ if ("..".equals(currentToken) && currentFile.equals(dir))
+ return null;
+
+ currentFile = new File(currentFile, currentToken);
+
+ // If the current file doesn't exist, the walking is
+ // finished with an error
+ if (! currentFile.exists())
+ return null;
+ }
+
+ return currentFile.getCanonicalFile();
+ }
}
static final class FileResource extends Resource
diff --git a/java/net/URLConnection.java b/java/net/URLConnection.java
index 6730fd1d2..1f78dd8e8 100644
--- a/java/net/URLConnection.java
+++ b/java/net/URLConnection.java
@@ -38,6 +38,9 @@ exception statement from your version. */
package java.net;
+import gnu.classpath.NotImplementedException;
+import gnu.classpath.SystemProperties;
+
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -49,6 +52,7 @@ import java.util.Collections;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
+import java.util.StringTokenizer;
/**
* Written using on-line Java Platform 1.2 API Specification, as well
@@ -114,6 +118,12 @@ public abstract class URLConnection
private static boolean defaultUseCaches = true;
/**
+ * Default internal content handler factory.
+ */
+ private static ContentHandlerFactory defaultFactory
+ = new gnu.java.net.DefaultContentHandlerFactory();
+
+ /**
* This variable determines whether or not interaction is allowed with
* the user. For example, to prompt for a username and password.
*/
@@ -160,6 +170,7 @@ public abstract class URLConnection
* This is the URL associated with this connection
*/
protected URL url;
+
private static SimpleDateFormat[] dateFormats;
private static boolean dateformats_initialized;
@@ -459,10 +470,16 @@ public abstract class URLConnection
* @exception UnknownServiceException If the protocol does not support the
* content type
*/
- public Object getContent(Class[] classes) throws IOException
+ public Object getContent(Class[] classes)
+ throws IOException
{
- // FIXME: implement this
- return getContent();
+ if (! connected)
+ connect();
+ String type = getContentType();
+ ContentHandler ch = getContentHandler(type);
+ if (ch != null)
+ return ch.getContent(this, classes);
+ throw new UnknownServiceException("protocol does not support the content type");
}
/**
@@ -917,8 +934,10 @@ public abstract class URLConnection
* @exception IOException If an error occurs
*/
public static String guessContentTypeFromStream(InputStream is)
- throws IOException
+ throws IOException, NotImplementedException
{
+ // See /etc/gnome-vfs-mime-magic or /etc/mime-magic for a reasonable
+ // idea of how to handle this.
return "application/octet-stream";
}
@@ -973,44 +992,66 @@ public abstract class URLConnection
if (factory != null)
handler = factory.createContentHandler(contentType);
- // Then try our default class.
- try
- {
- String typeClass = contentType.replace('/', '.');
-
- // Deal with "Content-Type: text/html; charset=ISO-8859-1".
- int parameterBegin = typeClass.indexOf(';');
- if (parameterBegin >= 1)
- typeClass = typeClass.substring(0, parameterBegin);
+ // Now try default factory. Using this factory to instantiate built-in
+ // content handlers is preferable
+ if (handler == null)
+ handler = defaultFactory.createContentHandler(contentType);
- Class cls = Class.forName("gnu.java.net.content." + typeClass);
- Object obj = cls.newInstance();
-
- if (obj instanceof ContentHandler)
- {
- handler = (ContentHandler) obj;
- return handler;
- }
- }
- catch (ClassNotFoundException e)
- {
- // Ignore.
- }
- catch (InstantiationException e)
- {
- // Ignore.
- }
- catch (IllegalAccessException e)
+ // User-set factory has not returned a handler. Use the default search
+ // algorithm.
+ if (handler == null)
{
- // Ignore.
+ // Get the list of packages to check and append our default handler
+ // to it, along with the JDK specified default as a last resort.
+ // Except in very unusual environments the JDK specified one shouldn't
+ // ever be needed (or available).
+ String propVal = SystemProperties.getProperty("java.content.handler.pkgs");
+ propVal = (((propVal == null) ? "" : (propVal + "|"))
+ + "gnu.java.net.content|sun.net.www.content");
+
+ // Deal with "Content-Type: text/html; charset=ISO-8859-1".
+ int parameterBegin = contentType.indexOf(';');
+ if (parameterBegin >= 1)
+ contentType = contentType.substring(0, parameterBegin);
+ contentType = contentType.trim();
+
+ // Replace the '/' character in the content type with '.' and
+ // all other non-alphabetic, non-numeric characters with '_'.
+ char[] cArray = contentType.toCharArray();
+ for (int i = 0; i < cArray.length; i++)
+ {
+ if (cArray[i] == '/')
+ cArray[i] = '.';
+ else if (! ((cArray[i] >= 'A' && cArray[i] <= 'Z') ||
+ (cArray[i] >= 'a' && cArray[i] <= 'z') ||
+ (cArray[i] >= '0' && cArray[i] <= '9')))
+ cArray[i] = '_';
+ }
+ String contentClass = new String(cArray);
+
+ // See if a class of this content type exists in any of the packages.
+ StringTokenizer pkgPrefix = new StringTokenizer(propVal, "|");
+ do
+ {
+ String facName = pkgPrefix.nextToken() + "." + contentClass;
+ try
+ {
+ handler =
+ (ContentHandler) Class.forName(facName).newInstance();
+ }
+ catch (Exception e)
+ {
+ // Can't instantiate; handler still null, go on to next element.
+ }
+ } while (handler == null && pkgPrefix.hasMoreTokens());
}
return handler;
}
// We don't put these in a static initializer, because it creates problems
- // with initializer co-dependency: SimpleDateFormat's constructors eventually
- // depend on URLConnection (via the java.text.*Symbols classes).
+ // with initializer co-dependency: SimpleDateFormat's constructors
+ // eventually depend on URLConnection (via the java.text.*Symbols classes).
private static synchronized void initializeDateFormats()
{
if (dateformats_initialized)
diff --git a/java/nio/ByteBufferImpl.java b/java/nio/ByteBufferImpl.java
index 48d715200..cbe627b06 100644
--- a/java/nio/ByteBufferImpl.java
+++ b/java/nio/ByteBufferImpl.java
@@ -120,13 +120,8 @@ final class ByteBufferImpl extends ByteBuffer
int count = remaining();
shiftDown(0, pos, count);
position(count);
- limit(capacity());
- }
- else
- {
- position(limit());
- limit(capacity());
}
+ limit(capacity());
return this;
}
diff --git a/java/nio/CharBufferImpl.java b/java/nio/CharBufferImpl.java
index 33f8dab98..e6097cb75 100644
--- a/java/nio/CharBufferImpl.java
+++ b/java/nio/CharBufferImpl.java
@@ -90,15 +90,14 @@ final class CharBufferImpl extends CharBuffer
{
checkIfReadOnly();
mark = -1;
- int copied = 0;
-
- while (remaining () > 0)
+ int p = position();
+ int n = limit() - p;
+ if (n > 0)
{
- put (copied, get ());
- copied++;
+ System.arraycopy(backing_buffer, array_offset + p,
+ backing_buffer, array_offset, n);
}
-
- position (copied);
+ position(n);
limit(capacity());
return this;
}
diff --git a/java/nio/DoubleBufferImpl.java b/java/nio/DoubleBufferImpl.java
index 248ab45e7..98e8e974f 100644
--- a/java/nio/DoubleBufferImpl.java
+++ b/java/nio/DoubleBufferImpl.java
@@ -82,15 +82,14 @@ final class DoubleBufferImpl extends DoubleBuffer
{
checkIfReadOnly();
mark = -1;
- int copied = 0;
-
- while (remaining () > 0)
+ int p = position();
+ int n = limit() - p;
+ if (n > 0)
{
- put (copied, get ());
- copied++;
+ System.arraycopy(backing_buffer, array_offset + p,
+ backing_buffer, array_offset, n);
}
-
- position (copied);
+ position(n);
limit(capacity());
return this;
}
diff --git a/java/nio/FloatBufferImpl.java b/java/nio/FloatBufferImpl.java
index b4868780c..f1182ba38 100644
--- a/java/nio/FloatBufferImpl.java
+++ b/java/nio/FloatBufferImpl.java
@@ -82,15 +82,14 @@ final class FloatBufferImpl extends FloatBuffer
{
checkIfReadOnly();
mark = -1;
- int copied = 0;
-
- while (remaining () > 0)
+ int p = position();
+ int n = limit() - p;
+ if (n > 0)
{
- put (copied, get ());
- copied++;
+ System.arraycopy(backing_buffer, array_offset + p,
+ backing_buffer, array_offset, n);
}
-
- position (copied);
+ position(n);
limit(capacity());
return this;
}
diff --git a/java/nio/IntBufferImpl.java b/java/nio/IntBufferImpl.java
index 22657482b..2bd184244 100644
--- a/java/nio/IntBufferImpl.java
+++ b/java/nio/IntBufferImpl.java
@@ -82,15 +82,14 @@ final class IntBufferImpl extends IntBuffer
{
checkIfReadOnly();
mark = -1;
- int copied = 0;
-
- while (remaining () > 0)
+ int p = position();
+ int n = limit() - p;
+ if (n > 0)
{
- put (copied, get ());
- copied++;
+ System.arraycopy(backing_buffer, array_offset + p,
+ backing_buffer, array_offset, n);
}
-
- position (copied);
+ position(n);
limit(capacity());
return this;
}
diff --git a/java/nio/LongBufferImpl.java b/java/nio/LongBufferImpl.java
index 8772f618c..c04c41775 100644
--- a/java/nio/LongBufferImpl.java
+++ b/java/nio/LongBufferImpl.java
@@ -82,15 +82,14 @@ final class LongBufferImpl extends LongBuffer
{
checkIfReadOnly();
mark = -1;
- int copied = 0;
-
- while (remaining () > 0)
+ int p = position();
+ int n = limit() - p;
+ if (n > 0)
{
- put (copied, get ());
- copied++;
+ System.arraycopy(backing_buffer, array_offset + p,
+ backing_buffer, array_offset, n);
}
-
- position (copied);
+ position(n);
limit(capacity());
return this;
}
diff --git a/java/nio/ShortBufferImpl.java b/java/nio/ShortBufferImpl.java
index ee5bff2f9..50f65ecbf 100644
--- a/java/nio/ShortBufferImpl.java
+++ b/java/nio/ShortBufferImpl.java
@@ -82,15 +82,14 @@ final class ShortBufferImpl extends ShortBuffer
{
checkIfReadOnly();
mark = -1;
- int copied = 0;
-
- while (remaining () > 0)
+ int p = position();
+ int n = limit() - p;
+ if (n > 0)
{
- put (copied, get ());
- copied++;
+ System.arraycopy(backing_buffer, array_offset + p,
+ backing_buffer, array_offset, n);
}
-
- position (copied);
+ position(n);
limit(capacity());
return this;
}
diff --git a/java/nio/channels/Channels.java b/java/nio/channels/Channels.java
index cfd8605c3..382a3d705 100644
--- a/java/nio/channels/Channels.java
+++ b/java/nio/channels/Channels.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package java.nio.channels;
import gnu.java.nio.ChannelReader;
+import gnu.java.nio.ChannelWriter;
import gnu.java.nio.InputStreamChannel;
import gnu.java.nio.OutputStreamChannel;
@@ -126,8 +127,7 @@ public final class Channels
public static Writer newWriter(WritableByteChannel ch, CharsetEncoder enc,
int minBufferCap)
{
- // FIXME: implement java.nio.channels.Channel.newWriter(WritableByteChannel, CharsetEncoder, int)
- throw new Error("not implemented");
+ return new ChannelWriter(ch, enc, minBufferCap);
}
/**
diff --git a/java/rmi/activation/Activatable.java b/java/rmi/activation/Activatable.java
index 82de6ff0c..472c65c11 100644
--- a/java/rmi/activation/Activatable.java
+++ b/java/rmi/activation/Activatable.java
@@ -215,18 +215,25 @@ public abstract class Activatable
}
/**
- * Obtain the activation Id from the activation descriptor bu registering
+ * Obtain the activation Id from the activation descriptor by registering
* within the current group.
*/
- static ActivationID obtainId(ActivationDesc descriptor) throws RemoteException,
- UnknownGroupException, ActivationException
+ static ActivationID obtainId(ActivationDesc descriptor)
+ throws RemoteException, UnknownGroupException, ActivationException
{
- return ActivationGroup.currentGroupID().getSystem().registerObject(descriptor);
+ ActivationGroupID id = descriptor.getGroupID();
+ ActivationSystem system;
+
+ if (id != null)
+ system = id.getSystem();
+ else
+ system = ActivationGroup.currentGroupID().getSystem();
+ return system.registerObject(descriptor);
}
/**
- * This method registers an activatable object. The object is expected to
- * be on the anonymous port (null client and server socket factories).
+ * This method registers an activatable object. The object is expected to be
+ * on the anonymous port (null client and server socket factories).
*
* @param desc the object description.
* @return the remote stub for the activatable object (the first call on this
@@ -239,7 +246,17 @@ public abstract class Activatable
throws UnknownGroupException, ActivationException, RemoteException
{
ActivationID id = obtainId(desc);
- return id.activate(false);
+ try
+ {
+ return toStub(
+ id,
+ Thread.currentThread().getContextClassLoader().loadClass(
+ desc.getClassName()));
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new ActivationException("Class not found: "+desc.getClassName());
+ }
}
/**
@@ -449,16 +466,9 @@ public abstract class Activatable
RMIServerSocketFactory serverSocketFactory)
throws RemoteException
{
- UnicastServerRef sref = null;
- if (obj instanceof RemoteObject)
- sref = (UnicastServerRef) ((RemoteObject) obj).getRef();
-
- if (sref == null)
- sref = new ActivatableServerRef(makeId(id), id, port, serverSocketFactory);
-
- Remote stub = sref.exportObject(obj);
- // addStub(obj, stub); // need probably the stub repository elsewhere
- return stub;
+ ActivatableServerRef sref = null;
+ sref = new ActivatableServerRef(makeId(id), id, port, serverSocketFactory);
+ return sref.exportObject(obj);
}
/**
@@ -497,4 +507,25 @@ public abstract class Activatable
return id;
}
+ /**
+ * Connect the object to the UnicastServer (export), but not activate it.
+ * The object will be activated on the first call.
+ */
+ static Remote toStub(ActivationID anId, Class stubFor)
+ {
+ try
+ {
+ ActivatableServerRef asr =
+ new ActivatableServerRef(makeId(anId), anId, 0, null);
+ UnicastServer.exportActivatableObject(asr);
+ return asr.exportClass(stubFor);
+ }
+ catch (RemoteException e)
+ {
+ InternalError ierr = new InternalError(
+ "Failed to obtain activatable stub");
+ ierr.initCause(e);
+ throw ierr;
+ }
+ }
}
diff --git a/java/rmi/activation/ActivationGroup.java b/java/rmi/activation/ActivationGroup.java
index 27a0185d0..5e7bbd209 100644
--- a/java/rmi/activation/ActivationGroup.java
+++ b/java/rmi/activation/ActivationGroup.java
@@ -38,7 +38,6 @@ exception statement from your version. */
package java.rmi.activation;
-import gnu.java.rmi.activation.ActivationSystemTransient;
import gnu.java.rmi.activation.DefaultActivationGroup;
import gnu.java.rmi.activation.DefaultActivationSystem;
@@ -162,6 +161,11 @@ public abstract class ActivationGroup
long incarnation)
throws ActivationException
{
+ // If the activation system is not yet set, set it to the system.
+ // passed in the group id.
+ if (system == null)
+ system = id.system;
+
ActivationGroup group = null;
// TODO at the moment all groups are created on the current jre and the
@@ -177,9 +181,9 @@ public abstract class ActivationGroup
}
catch (ClassNotFoundException e)
{
- ActivationException acex = new ActivationException("Cannot load "
- + desc.className);
- acex.initCause(e);
+ ActivationException acex = new ActivationException(
+ "Cannot load " + desc.className);
+ acex.detail = e;
throw acex;
}
}
@@ -189,16 +193,14 @@ public abstract class ActivationGroup
try
{
Constructor constructor = groupClass.getConstructor(cConstructorTypes);
- group = (ActivationGroup) constructor.newInstance(new Object[] {
- id,
- desc.data });
+ group = (ActivationGroup) constructor.newInstance(
+ new Object[] { id, desc.data });
}
catch (Exception e)
{
ActivationException acex = new ActivationException(
- "Cannot instantiate "
- + desc.className);
- acex.initCause(e);
+ "Cannot instantiate " + desc.className);
+ acex.detail = e;
throw acex;
}
@@ -211,7 +213,7 @@ public abstract class ActivationGroup
catch (RemoteException e)
{
ActivationException acex = new ActivationException("createGroup");
- acex.initCause(e);
+ acex.detail = e;
throw acex;
}
}
@@ -227,7 +229,9 @@ public abstract class ActivationGroup
{
if (currentGroupId==null)
{
- setSystem(ActivationSystemTransient.getInstance());
+ // This will also assing the currentGroupId to the current
+ // (default) group of the default system.
+ setSystem(DefaultActivationSystem.get());
}
}
catch (ActivationException e)
@@ -237,7 +241,6 @@ public abstract class ActivationGroup
throw ierr;
}
-
return currentGroupId;
}
@@ -278,8 +281,18 @@ public abstract class ActivationGroup
}
/**
- * Get the current activation system. If the system is not set via this
- * method, the default implementatin for this virtual machine is returned.
+ * Get the current activation system. If the system is not set via
+ * {@link #setSystem} method, the default system for this virtual machine is
+ * returned. The default system is first searched by name
+ * "java.rmi.activation.ActivationSystem" on the activation registry port. The
+ * default value of the activation registry port is
+ * {@link ActivationSystem#SYSTEM_PORT}, but it can be changed by putting the
+ * system property java.rmi.activation.port. Both activation system and
+ * activation registry are provided by the RMI daemon tool, RMID, if it is
+ * running on the local host. If the RMID is not running, the internal
+ * transient activation system will be created and returned. This internal
+ * system is highly limited in in capabilities and is not intended to be used
+ * anywhere apart automated testing.
*
* @return the activation system for this virtual machine
* @throws ActivationException
@@ -287,9 +300,8 @@ public abstract class ActivationGroup
public static ActivationSystem getSystem() throws ActivationException
{
if (system == null)
- return DefaultActivationSystem.singleton;
- else
- return system;
+ system = DefaultActivationSystem.get();
+ return system;
}
/**
diff --git a/java/rmi/activation/ActivationGroupID.java b/java/rmi/activation/ActivationGroupID.java
index 941499aa8..e54b2a05d 100644
--- a/java/rmi/activation/ActivationGroupID.java
+++ b/java/rmi/activation/ActivationGroupID.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package java.rmi.activation;
import java.io.Serializable;
+import java.rmi.server.UID;
/**
* This identifier identifies the activation group inside the scope of its
@@ -58,17 +59,23 @@ public class ActivationGroupID
/**
* The associated activation system.
*/
- private ActivationSystem system;
+ final ActivationSystem system;
+
+ /**
+ * The object identifier, making the ID unique.
+ */
+ final UID uid;
/**
* Create the new activation group id in the scope of the given activation
* system
*
- * @param system the activation system
+ * @param aSystem the activation system
*/
- public ActivationGroupID(ActivationSystem system)
+ public ActivationGroupID(ActivationSystem aSystem)
{
- this.system = system;
+ system = aSystem;
+ uid = new UID();
}
/**
@@ -86,7 +93,7 @@ public class ActivationGroupID
*/
public int hashCode()
{
- return system.hashCode();
+ return uid.hashCode();
}
/**
@@ -98,10 +105,18 @@ public class ActivationGroupID
if (obj instanceof ActivationGroupID)
{
ActivationGroupID that = (ActivationGroupID) obj;
- return system.equals(that.system);
+ return uid.equals(that.uid);
}
else
return false;
}
+
+ /**
+ * Get the string representation
+ */
+ public String toString()
+ {
+ return uid.toString();
+ }
}
diff --git a/java/rmi/activation/ActivationGroup_Stub.java b/java/rmi/activation/ActivationGroup_Stub.java
index 249137b08..fb55e5fd9 100644
--- a/java/rmi/activation/ActivationGroup_Stub.java
+++ b/java/rmi/activation/ActivationGroup_Stub.java
@@ -51,7 +51,7 @@ import java.rmi.server.RemoteStub;
*
* @author Roman Kennke (kennke@aicas.com)
*/
-public class ActivationGroup_Stub extends RemoteStub
+public final class ActivationGroup_Stub extends RemoteStub
implements ActivationInstantiator, Remote
{
private static final long serialVersionUID = 2L;
diff --git a/java/rmi/activation/ActivationID.java b/java/rmi/activation/ActivationID.java
index 09ce8352c..c4bbcd285 100644
--- a/java/rmi/activation/ActivationID.java
+++ b/java/rmi/activation/ActivationID.java
@@ -141,7 +141,7 @@ public class ActivationID
if (obj instanceof ActivationID)
{
ActivationID that = (ActivationID) obj;
- return eq(uid, that.uid) && eq(activator, that.activator);
+ return eq(uid, that.uid);
}
else
return false;
@@ -159,7 +159,7 @@ public class ActivationID
ClassNotFoundException
{
uid = (UID) in.readObject();
- // TODO not complete!
+ activator = (Activator) in.readObject();
}
/**
@@ -173,7 +173,7 @@ public class ActivationID
ClassNotFoundException
{
out.writeObject(uid);
- // TODO not complete!
+ out.writeObject(activator);
};
/**
@@ -188,4 +188,12 @@ public class ActivationID
return a.equals(b);
}
+ /**
+ * Return the content based string representation.
+ */
+ public String toString()
+ {
+ return uid.toString();
+ }
+
}
diff --git a/java/rmi/activation/ActivationSystem.java b/java/rmi/activation/ActivationSystem.java
index ab56b4692..719676445 100644
--- a/java/rmi/activation/ActivationSystem.java
+++ b/java/rmi/activation/ActivationSystem.java
@@ -55,12 +55,15 @@ import java.rmi.RemoteException;
* methods in this interface throw {@link java.rmi.AccessException} if called
* from the client that is not reside on the same host as the activation system.
* </p>
+ * @see ActivationGroup#getSystem()
*/
public interface ActivationSystem
extends Remote
{
/**
- * The port, used by the activation system (1098 by default).
+ * The port, used by the activation system. The value is equal to 1098 by
+ * default, but it can be changed by putting the system property
+ * .
*/
int SYSTEM_PORT = 1098;
diff --git a/java/rmi/server/ObjID.java b/java/rmi/server/ObjID.java
index ea4c8a928..1aaa22360 100644
--- a/java/rmi/server/ObjID.java
+++ b/java/rmi/server/ObjID.java
@@ -157,7 +157,7 @@ public final class ObjID
*/
public int hashCode()
{
- return ((int) objNum);
+ return space == null ? (int) objNum : space.hashCode() ^ (int) objNum;
}
/**
@@ -165,19 +165,33 @@ public final class ObjID
*/
public boolean equals(Object obj)
{
- if (obj instanceof ObjID && this.objNum == ((ObjID) obj).objNum)
+ if (obj instanceof ObjID)
{
- return (true);
+ ObjID that = (ObjID) obj;
+ return that.objNum == objNum && eq(that.space, space);
}
- return (false);
+ else
+ return false;
}
/**
+ * Compare by .equals if both a and b are not null, compare directly if at
+ * least one of them is null.
+ */
+ static final boolean eq(Object a, Object b)
+ {
+ if (a == null || b == null)
+ return a == b;
+ else
+ return a.equals(b);
+ }
+
+ /**
* Get the string representation.
*/
public String toString()
{
- return ("[objNum: " + objNum + ", " + space + "]");
+ return (objNum + ":" + space);
}
}
diff --git a/java/rmi/server/RemoteObject.java b/java/rmi/server/RemoteObject.java
index 60e57dc24..5b926bfc3 100644
--- a/java/rmi/server/RemoteObject.java
+++ b/java/rmi/server/RemoteObject.java
@@ -39,6 +39,7 @@ package java.rmi.server;
import java.io.IOException;
import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.rmi.NoSuchObjectException;
@@ -101,6 +102,9 @@ public boolean equals(Object obj) {
return (this == obj);
}
+/**
+ * Get the string representation of this remote object.
+ */
public String toString()
{
if (ref == null)
@@ -108,55 +112,91 @@ public boolean equals(Object obj) {
return (ref.toString ());
}
- private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
+ /**
+ * Read the remote object from the input stream. Expects the class name
+ * without package first. Then the method creates and assigns the {@link #ref}
+ * an instance of this class and calls its .readExternal method. The standard
+ * packageless class names are UnicastRef, UnicastRef2, UnicastServerRef,
+ * UnicastServerRef2, ActivatableRef or ActivatableServerRef.
+ *
+ * @param in the stream to read from
+ * @throws IOException if the IO exception occurs
+ * @throws ClassNotFoundException if the class with the given name is not
+ * present in the package gnu.java.rmi.server (for the case of the
+ * GNU Classpath.
+ */
+ private void readObject(ObjectInputStream in) throws IOException,
+ ClassNotFoundException
{
String cname = in.readUTF();
- if (!cname.equals(""))
+ if (! cname.equals(""))
{
- if (cname.equals ("UnicastRef2"))
- {
- // hack for interoperating with JDK
- cname = "UnicastRef";
- in.read (); //some unknown UnicastRef2 field
- }
-
- // It would be nice to use RemoteRef.packagePrefix here, but for binary
- // compatibility with the JDK that has to contain "sun.rmi.server"...
- cname = "gnu.java.rmi.server." + cname;
- try
- {
- Class cls = Class.forName(cname);
- ref = (RemoteRef)cls.newInstance();
- }
- catch (InstantiationException e1)
- {
- throw new UnmarshalException("failed to create ref", e1);
- }
- catch (IllegalAccessException e2)
- {
- throw new UnmarshalException("failed to create ref", e2);
- }
- ref.readExternal(in);
+ if (cname.equals("UnicastRef2"))
+ {
+ // hack for interoperating with JDK
+ cname = "UnicastRef";
+ in.read(); // some unknown UnicastRef2 field
+ }
+
+ // It would be nice to use RemoteRef.packagePrefix here, but for binary
+ // compatibility with the JDK that has to contain "sun.rmi.server"...
+ cname = "gnu.java.rmi.server." + cname;
+ try
+ {
+ Class cls = Class.forName(cname);
+ ref = (RemoteRef) cls.newInstance();
+ }
+ catch (InstantiationException e1)
+ {
+ throw new UnmarshalException("failed to create ref", e1);
+ }
+ catch (IllegalAccessException e2)
+ {
+ throw new UnmarshalException("failed to create ref", e2);
+ }
+ ref.readExternal(in);
}
- else
+ else
{
- ref = (RemoteRef)in.readObject();
+ ref = (RemoteRef) in.readObject();
}
}
-private void writeObject(ObjectOutputStream out) throws IOException, ClassNotFoundException {
- if (ref == null) {
- throw new UnmarshalException("no ref to serialize");
- }
- String cname = ref.getRefClass(out);
- if (cname != null && cname.length() > 0) {
- out.writeUTF(cname);
- ref.writeExternal(out);
- }
- else {
- out.writeUTF("");
- out.writeObject(ref);
- }
-}
+ /**
+ * Write the remote object to the output stream. This method first calls
+ * {@link RemoteRef#getRefClass(ObjectOutput)} on the {@link #ref} to get the
+ * class name without package, writes this name and then calls the
+ * ref.writeObject to write the data. The standard packageless class names are
+ * UnicastRef, UnicastRef2, UnicastServerRef, UnicastServerRef2,
+ * ActivatableRef or ActivatableServerRef. The empty string with the
+ * subsequently following serialized ref instance be written if the
+ * ref.getRefClass returns null.
+ *
+ * @param out the stream to write to
+ * @throws IOException if one occurs during writing
+ * @throws ClassNotFoundException never in this implementation (specified as
+ * part of the API standard)
+ * @throws UnmarshalException if the remote reference of this remote object is
+ * null.
+ */
+ private void writeObject(ObjectOutputStream out) throws IOException,
+ ClassNotFoundException
+ {
+ if (ref == null)
+ {
+ throw new UnmarshalException("no ref to serialize");
+ }
+ String cname = ref.getRefClass(out);
+ if (cname != null && cname.length() > 0)
+ {
+ out.writeUTF(cname);
+ ref.writeExternal(out);
+ }
+ else
+ {
+ out.writeUTF("");
+ out.writeObject(ref);
+ }
+ }
}
diff --git a/java/rmi/server/RemoteObjectInvocationHandler.java b/java/rmi/server/RemoteObjectInvocationHandler.java
index afd1d5927..2c19cd5af 100644
--- a/java/rmi/server/RemoteObjectInvocationHandler.java
+++ b/java/rmi/server/RemoteObjectInvocationHandler.java
@@ -90,6 +90,11 @@ public class RemoteObjectInvocationHandler extends RemoteObject implements
static final Class[] anObjectC = new Class[] { Object.class };
/**
+ * The empty object array to replace null when no args are passed.
+ */
+ static final Object[] noArgs = new Object[0];
+
+ /**
* Construct the remote invocation handler that forwards calls to the given
* remote object.
*
@@ -143,6 +148,9 @@ public class RemoteObjectInvocationHandler extends RemoteObject implements
throw new IllegalAccessException(name + " does not implement "
+ Remote.class.getName());
}
+
+ if (parameters == null)
+ parameters = noArgs;
String name = method.getName();
switch (name.charAt(0))
@@ -172,7 +180,7 @@ public class RemoteObjectInvocationHandler extends RemoteObject implements
break;
case 't':
if (parameters.length == 0 && name.equals("toString"))
- return proxyInstance.toString();
+ return "Proxy stub:"+ref.remoteToString();
break;
default:
break;
diff --git a/java/rmi/server/UID.java b/java/rmi/server/UID.java
index 75cb9f6be..359630422 100644
--- a/java/rmi/server/UID.java
+++ b/java/rmi/server/UID.java
@@ -149,7 +149,7 @@ public final class UID
*/
public int hashCode()
{
- return (int) (unique ^ time ^ machineId);
+ return (int) (unique ^ time ^ count);
}
/**
@@ -212,9 +212,16 @@ public final class UID
/**
* Get the string representation of this UID.
+ *
+ * @return a string, uniquely identifying this id.
*/
public String toString()
{
- return ("[UID: " + unique + "," + time + "," + count + "]");
+ int max = Character.MAX_RADIX;
+ // Translate into object count, counting from 0.
+ long lc = (count + Short.MIN_VALUE) & 0xFFFF;
+ return Long.toString(time, max) + ":"
+ + Long.toString(unique, max) + ":"
+ + Long.toString(lc, max);
}
}
diff --git a/java/security/KeyStore.java b/java/security/KeyStore.java
index 696448728..8681d8265 100644
--- a/java/security/KeyStore.java
+++ b/java/security/KeyStore.java
@@ -212,7 +212,7 @@ public class KeyStore
/**
* Returns the default KeyStore type. This method looks up the
* type in &lt;JAVA_HOME&gt;/lib/security/java.security with the
- * property "keystore.type" or if that fails then "jks" .
+ * property "keystore.type" or if that fails then "gkr" .
*/
public static final String getDefaultType()
{
@@ -221,7 +221,7 @@ public class KeyStore
String tmp = Security.getProperty("keystore.type");
if (tmp == null)
- tmp = "jks";
+ tmp = "gkr";
return tmp;
}
diff --git a/java/security/SecureRandom.java b/java/security/SecureRandom.java
index 0d892253c..d403d4964 100644
--- a/java/security/SecureRandom.java
+++ b/java/security/SecureRandom.java
@@ -1,5 +1,6 @@
/* SecureRandom.java --- Secure Random class implementation
- Copyright (C) 1999, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2001, 2002, 2003, 2005, 2006
+ Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,11 +38,19 @@ exception statement from your version. */
package java.security;
+import gnu.classpath.SystemProperties;
import gnu.java.security.Engine;
+import gnu.java.security.action.GetSecurityPropertyAction;
import gnu.java.security.jce.prng.Sha160RandomSpi;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.Enumeration;
import java.util.Random;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* An interface to a cryptographically secure pseudo-random number
@@ -71,6 +80,9 @@ public class SecureRandom extends Random
int randomBytesUsed = 0;
SecureRandomSpi secureRandomSpi = null;
byte[] state = null;
+ private String algorithm;
+
+ private boolean isSeeded = false;
// Constructors.
// ------------------------------------------------------------------------
@@ -111,6 +123,7 @@ public class SecureRandom extends Random
secureRandomSpi = (SecureRandomSpi) Class.
forName(classname).newInstance();
provider = p[i];
+ algorithm = key.substring(13); // Minus SecureRandom.
return;
}
catch (ThreadDeath death)
@@ -128,6 +141,7 @@ public class SecureRandom extends Random
// Nothing found. Fall back to SHA1PRNG
secureRandomSpi = new Sha160RandomSpi();
+ algorithm = "Sha160";
}
/**
@@ -159,8 +173,18 @@ public class SecureRandom extends Random
*/
protected SecureRandom(SecureRandomSpi secureRandomSpi, Provider provider)
{
+ this(secureRandomSpi, provider, "unknown");
+ }
+
+ /**
+ * Private constructor called from the getInstance() method.
+ */
+ private SecureRandom(SecureRandomSpi secureRandomSpi, Provider provider,
+ String algorithm)
+ {
this.secureRandomSpi = secureRandomSpi;
this.provider = provider;
+ this.algorithm = algorithm;
}
// Class methods.
@@ -243,7 +267,7 @@ public class SecureRandom extends Random
{
return new SecureRandom((SecureRandomSpi)
Engine.getInstance(SECURE_RANDOM, algorithm, provider),
- provider);
+ provider, algorithm);
}
catch (java.lang.reflect.InvocationTargetException ite)
{
@@ -269,6 +293,18 @@ public class SecureRandom extends Random
}
/**
+ * Returns the algorithm name used or "unknown" when the algorithm
+ * used couldn't be determined (as when constructed by the protected
+ * 2 argument constructor).
+ *
+ * @since 1.5
+ */
+ public String getAlgorithm()
+ {
+ return algorithm;
+ }
+
+ /**
Seeds the SecureRandom. The class is re-seeded for each call and
each seed builds on the previous seed so as not to weaken security.
@@ -277,6 +313,7 @@ public class SecureRandom extends Random
public void setSeed(byte[] seed)
{
secureRandomSpi.engineSetSeed(seed);
+ isSeeded = true;
}
/**
@@ -304,6 +341,7 @@ public class SecureRandom extends Random
(byte) (0xff & seed)
};
secureRandomSpi.engineSetSeed(tmp);
+ isSeeded = true;
}
}
@@ -315,6 +353,8 @@ public class SecureRandom extends Random
*/
public void nextBytes(byte[] bytes)
{
+ if (!isSeeded)
+ setSeed(getSeed(32));
randomBytesUsed += bytes.length;
counter++;
secureRandomSpi.engineNextBytes(bytes);
@@ -360,10 +400,8 @@ public class SecureRandom extends Random
public static byte[] getSeed(int numBytes)
{
byte[] tmp = new byte[numBytes];
-
- new Random().nextBytes(tmp);
+ generateSeed(tmp);
return tmp;
- //return secureRandomSpi.engineGenerateSeed( numBytes );
}
/**
@@ -378,4 +416,64 @@ public class SecureRandom extends Random
return secureRandomSpi.engineGenerateSeed(numBytes);
}
+ // Seed methods.
+
+ private static final String SECURERANDOM_SOURCE = "securerandom.source";
+ private static final String JAVA_SECURITY_EGD = "java.security.egd";
+ private static final Logger logger = Logger.getLogger(SecureRandom.class.getName());
+
+ private static int generateSeed(byte[] buffer)
+ {
+ return generateSeed(buffer, 0, buffer.length);
+ }
+
+ private static int generateSeed(byte[] buffer, int offset, int length)
+ {
+ URL sourceUrl = null;
+ String urlStr = null;
+
+ GetSecurityPropertyAction action = new GetSecurityPropertyAction(SECURERANDOM_SOURCE);
+ try
+ {
+ urlStr = (String) AccessController.doPrivileged(action);
+ if (urlStr != null)
+ sourceUrl = new URL(urlStr);
+ }
+ catch (MalformedURLException ignored)
+ {
+ logger.log(Level.WARNING, SECURERANDOM_SOURCE + " property is malformed: {0}",
+ urlStr);
+ }
+
+ if (sourceUrl == null)
+ {
+ try
+ {
+ urlStr = SystemProperties.getProperty(JAVA_SECURITY_EGD);
+ if (urlStr != null)
+ sourceUrl = new URL(urlStr);
+ }
+ catch (MalformedURLException mue)
+ {
+ logger.log(Level.WARNING, JAVA_SECURITY_EGD + " property is malformed: {0}",
+ urlStr);
+ }
+ }
+
+ if (sourceUrl != null)
+ {
+ try
+ {
+ InputStream in = sourceUrl.openStream();
+ return in.read(buffer, offset, length);
+ }
+ catch (IOException ioe)
+ {
+ logger.log(Level.FINE, "error reading random bytes", ioe);
+ }
+ }
+
+ // If we get here, we did not get any seed from a property URL.
+ return VMSecureRandom.generateSeed(buffer, offset, length);
+ }
}
diff --git a/java/security/Security.java b/java/security/Security.java
index 4e31dab75..d99c45149 100644
--- a/java/security/Security.java
+++ b/java/security/Security.java
@@ -101,7 +101,12 @@ public final class Security
System.err.println
(" Falling back to standard GNU security provider");
}
+ // Note that this matches our classpath.security file.
providers.addElement (new gnu.java.security.provider.Gnu());
+ providers.addElement(new gnu.javax.crypto.jce.GnuCrypto());
+ providers.addElement(new gnu.javax.crypto.jce.GnuSasl());
+ providers.addElement(new gnu.javax.net.ssl.provider.Jessie());
+ providers.addElement(new gnu.javax.security.auth.callback.GnuCallbacks());
}
}
// This class can't be instantiated.
diff --git a/java/security/cert/CertPathValidatorSpi.java b/java/security/cert/CertPathValidatorSpi.java
index 8d18b49da..282b7a695 100644
--- a/java/security/cert/CertPathValidatorSpi.java
+++ b/java/security/cert/CertPathValidatorSpi.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.security.cert;
+import java.security.InvalidAlgorithmParameterException;
+
/**
* The <i>service provider interface</i> (<b>SPI</b>) for the {@link
* CertPathValidator} class. Providers implementing certificate path
@@ -75,5 +77,5 @@ public abstract class CertPathValidatorSpi
public abstract CertPathValidatorResult
engineValidate(CertPath certPath, CertPathParameters params)
throws CertPathValidatorException,
- java.security.InvalidAlgorithmParameterException;
+ InvalidAlgorithmParameterException;
}
diff --git a/java/security/cert/CertStoreSpi.java b/java/security/cert/CertStoreSpi.java
index eca0e866c..a69545f0d 100644
--- a/java/security/cert/CertStoreSpi.java
+++ b/java/security/cert/CertStoreSpi.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package java.security.cert;
+import java.security.InvalidAlgorithmParameterException;
import java.util.Collection;
/**
@@ -69,7 +70,7 @@ public abstract class CertStoreSpi
* parameters are inappropriate for this class.
*/
public CertStoreSpi(CertStoreParameters params)
- throws java.security.InvalidAlgorithmParameterException
+ throws InvalidAlgorithmParameterException
{
super();
}
diff --git a/java/security/cert/Certificate.java b/java/security/cert/Certificate.java
index f8456f97a..33a14a439 100644
--- a/java/security/cert/Certificate.java
+++ b/java/security/cert/Certificate.java
@@ -73,7 +73,7 @@ import java.security.SignatureException;
*/
public abstract class Certificate implements Serializable
{
- private static final long serialVersionUID = -6751606818319535583L;
+ private static final long serialVersionUID = -3585440601605666277L;
private String type;
diff --git a/java/security/cert/PKIXCertPathChecker.java b/java/security/cert/PKIXCertPathChecker.java
index 7a33576e1..a6eef41a2 100644
--- a/java/security/cert/PKIXCertPathChecker.java
+++ b/java/security/cert/PKIXCertPathChecker.java
@@ -46,7 +46,7 @@ import java.util.Set;
*
* <p>Concrete subclasses can be passed to the {@link
* PKIXParameters#setCertPathCheckers(java.util.List)} and {@link
- * PKIXParameters#addCertPathChecker(java.security.cert.PKIXCertPathChecker}
+ * PKIXParameters#addCertPathChecker(java.security.cert.PKIXCertPathChecker)}
* methods, which are then used to set up PKIX certificate chain
* builders or validators. These classes then call the {@link
* #check(java.security.cert.Certificate,java.util.Collection)} method
diff --git a/java/security/cert/PKIXParameters.java b/java/security/cert/PKIXParameters.java
index 4a987115a..16ef07f88 100644
--- a/java/security/cert/PKIXParameters.java
+++ b/java/security/cert/PKIXParameters.java
@@ -55,7 +55,7 @@ import java.util.Set;
* Parameters for verifying certificate paths using the PKIX
* (Public-Key Infrastructure (X.509)) algorithm.
*
- * @see CertPathBulider
+ * @see CertPathBuilder
*/
public class PKIXParameters implements CertPathParameters
{
diff --git a/java/security/cert/X509CertSelector.java b/java/security/cert/X509CertSelector.java
index e3b8c0eb2..a46d2288b 100644
--- a/java/security/cert/X509CertSelector.java
+++ b/java/security/cert/X509CertSelector.java
@@ -367,7 +367,7 @@ public class X509CertSelector implements CertSelector, Cloneable
* Sets the authority key identifier criterion, or <code>null</code> to clear
* this criterion. Note that the byte array is cloned to prevent modification.
*
- * @param subjectKeyId The subject key identifier.
+ * @param authKeyId The authority key identifier.
*/
public void setAuthorityKeyIdentifier(byte[] authKeyId)
{
diff --git a/java/sql/Array.java b/java/sql/Array.java
index 516287578..c3c42d9cb 100644
--- a/java/sql/Array.java
+++ b/java/sql/Array.java
@@ -1,5 +1,5 @@
/* Array.java -- Interface for accessing SQL array object
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -50,7 +50,7 @@ public interface Array
* Returns the name of the SQL type of the elements in this
* array. This name is database specific.
*
- * @param The name of the SQL type of the elements in this array.
+ * @return The name of the SQL type of the elements in this array.
* @exception SQLException If an error occurs.
*/
String getBaseTypeName() throws SQLException;
@@ -87,22 +87,22 @@ public interface Array
Object getArray(Map map) throws SQLException;
/**
- * Returns a portion of this array starting at <code>index</code>
+ * Returns a portion of this array starting at <code>start</code>
* into the array and continuing for <code>count</code>
* elements. Fewer than the requested number of elements will be
* returned if the array does not contain the requested number of elements.
* The object returned will be an array of Java objects of
* the appropriate types.
*
- * @param offset The offset into this array to start returning elements from.
+ * @param start The index into this array to start returning elements from.
* @param count The requested number of elements to return.
* @return The requested portion of the array.
* @exception SQLException If an error occurs.
*/
- Object getArray(long index, int count) throws SQLException;
+ Object getArray(long start, int count) throws SQLException;
/**
- * This method returns a portion of this array starting at <code>index</code>
+ * This method returns a portion of this array starting at <code>start</code>
* into the array and continuing for <code>count</code>
* elements. Fewer than the requested number of elements will be
* returned if the array does not contain the requested number of elements.
@@ -110,13 +110,13 @@ public interface Array
* <code>Map</code> will be used for overriding selected SQL type to
* Java class mappings.
*
- * @param offset The offset into this array to start returning elements from.
+ * @param start The index into this array to start returning elements from.
* @param count The requested number of elements to return.
* @param map A mapping of SQL types to Java classes.
* @return The requested portion of the array.
* @exception SQLException If an error occurs.
*/
- Object getArray(long index, int count, Map map) throws SQLException;
+ Object getArray(long start, int count, Map map) throws SQLException;
/**
* Returns the elements in the array as a <code>ResultSet</code>.
@@ -147,24 +147,24 @@ public interface Array
/**
* This method returns a portion of the array as a <code>ResultSet</code>.
- * The returned portion will start at <code>index</code> into the
+ * The returned portion will start at <code>start</code> into the
* array and up to <code>count</code> elements will be returned.
* <p>
* Each row of the result set will have two columns. The first will be
* the index into the array of that row's contents. The second will be
* the actual value of that array element.
*
- * @param offset The index into the array to start returning elements from.
- * @param length The requested number of elements to return.
+ * @param start The index into the array to start returning elements from.
+ * @param count The requested number of elements to return.
* @return The requested elements of this array as a <code>ResultSet</code>.
* @exception SQLException If an error occurs.
* @see ResultSet
*/
- ResultSet getResultSet(long index, int count) throws SQLException;
+ ResultSet getResultSet(long start, int count) throws SQLException;
/**
* This method returns a portion of the array as a <code>ResultSet</code>.
- * The returned portion will start at <code>index</code> into the
+ * The returned portion will start at <code>start</code> into the
* array and up to <code>count</code> elements will be returned.
*
* <p> Each row of the result set will have two columns. The first will be
@@ -173,13 +173,13 @@ public interface Array
* will be used to override selected default mappings of SQL types to
* Java classes.</p>
*
- * @param offset The index into the array to start returning elements from.
- * @param length The requested number of elements to return.
+ * @param start The index into the array to start returning elements from.
+ * @param count The requested number of elements to return.
* @param map A mapping of SQL types to Java classes.
* @return The requested elements of this array as a <code>ResultSet</code>.
* @exception SQLException If an error occurs.
* @see ResultSet
*/
- ResultSet getResultSet(long index, int count, Map map)
+ ResultSet getResultSet(long start, int count, Map map)
throws SQLException;
}
diff --git a/java/sql/Blob.java b/java/sql/Blob.java
index 616839d01..c662aad5f 100644
--- a/java/sql/Blob.java
+++ b/java/sql/Blob.java
@@ -1,5 +1,5 @@
/* Blob.java -- Access a SQL Binary Large OBject.
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,48 +41,51 @@ import java.io.InputStream;
import java.io.OutputStream;
/**
- * This interface specified methods for accessing a SQL BLOB (Binary
- * Large OBject) type.
- *
+ * This interface specified methods for accessing a SQL BLOB (Binary Large
+ * OBject) type.
+ *
* @author Aaron M. Renn (arenn@urbanophile.com)
* @since 1.2
*/
-public interface Blob
+public interface Blob
{
/**
- * This method returns the number of bytes in the BLOB.
- *
- * @return The number of bytes in the BLOB.
+ * This method returns the number of bytes in this <code>Blob</code>.
+ *
+ * @return The number of bytes in this <code>Blob</code>.
* @exception SQLException If an error occurs.
*/
long length() throws SQLException;
/**
- * This method returns up to the requested bytes of this BLOB as a
- * <code>byte</code> array.
- *
- * @param pos The index into the BLOB to start returning bytes from.
- * @param length The requested number of bytes to return.
- * @return The requested bytes from the BLOB.
+ * This method returns up to the requested bytes of this <code>Blob</code>
+ * as a <code>byte</code> array.
+ *
+ * @param start The index into this <code>Blob</code> to start returning
+ * bytes from.
+ * @param count The requested number of bytes to return.
+ * @return The requested bytes from this <code>Blob</code>.
* @exception SQLException If an error occurs.
*/
- byte[] getBytes(long pos, int length) throws SQLException;
+ byte[] getBytes(long start, int count) throws SQLException;
/**
- * This method returns a stream that will read the bytes of the BLOB.
- *
- * @return A stream that will read the bytes of the BLOB.
+ * This method returns a stream that will read the bytes of this
+ * <code>Blob</code>.
+ *
+ * @return A stream that will read the bytes of this <code>Blob</code>.
* @exception SQLException If an error occurs.
*/
InputStream getBinaryStream() throws SQLException;
/**
- * This method returns the index into the BLOB at which the first instance
- * of the specified bytes occur. The searching starts at the specified
- * index into the BLOB.
- *
+ * This method returns the index into this <code>Blob</code> at which the
+ * first instance of the specified bytes occur. The searching starts at the
+ * specified index into this <code>Blob</code>.
+ *
* @param pattern The byte pattern to search for.
- * @param offset The index into the BLOB to starting searching for the pattern.
+ * @param start The index into this <code>Blob</code> to start searching for
+ * the pattern.
* @return The offset at which the pattern is first found, or -1 if the
* pattern is not found.
* @exception SQLException If an error occurs.
@@ -90,14 +93,15 @@ public interface Blob
long position(byte[] pattern, long start) throws SQLException;
/**
- * This method returns the index into the BLOB at which the first instance
- * of the specified pattern occurs. The searching starts at the specified
- * index into this BLOB. The bytes in the specified <code>Blob</code> are
- * used as the search pattern.
- *
+ * This method returns the index into this <code>Blob</code> at which the
+ * first instance of the specified pattern occurs. The searching starts at the
+ * specified index into this <code>Blob</code>. The bytes in the specified
+ * <code>Blob</code> are used as the search pattern.
+ *
* @param pattern The <code>Blob</code> containing the byte pattern to
- * search for.
- * @param offset The index into the BLOB to starting searching for the pattern.
+ * search for.
+ * @param start The index into this <code>Blob</code> to start searching for
+ * the pattern.
* @return The offset at which the pattern is first found, or -1 if the
* pattern is not found.
* @exception SQLException If an error occurs.
@@ -105,27 +109,49 @@ public interface Blob
long position(Blob pattern, long start) throws SQLException;
/**
+ * Writes the specified data into this <code>Blob</code>, starting at the
+ * specified index.
+ *
+ * @param start The index at which the writing starts.
+ * @param bytes The data to write.
* @exception SQLException If an error occurs.
* @since 1.4
*/
- int setBytes(long pos, byte[] bytes) throws SQLException;
+ int setBytes(long start, byte[] bytes) throws SQLException;
/**
+ * Writes a portion of the specified data into this <code>Blob</code>,
+ * starting at the specified index.
+ *
+ * @param startWrite The index into this <code>Blob</code> at which writing
+ * starts.
+ * @param bytes The data to write a portion of.
+ * @param startRead The offset into the data where the portion to copy starts.
+ * @param count The number of bytes to write.
* @exception SQLException If an error occurs.
* @since 1.4
*/
- int setBytes(long pos, byte[] bytes, int offset, int len)
- throws SQLException;
+ int setBytes(long startWrite, byte[] bytes, int startRead, int count)
+ throws SQLException;
/**
+ * Returns a binary stream that writes into this <code>Blob</code>,
+ * starting at the specified index.
+ *
+ * @param start The index at which the writing starts.
+ * @return A binary stream to write into this <code>Blob</code>.
* @exception SQLException If an error occurs.
* @since 1.4
*/
- OutputStream setBinaryStream(long pos) throws SQLException;
+ OutputStream setBinaryStream(long start) throws SQLException;
/**
+ * Truncates this <code>Blob</code> to be at most the specified number of
+ * bytes long.
+ *
+ * @param count The length this <code>Blob</code> is truncated to.
* @exception SQLException If an error occurs.
* @since 1.4
*/
- void truncate(long len) throws SQLException;
+ void truncate(long count) throws SQLException;
}
diff --git a/java/sql/CallableStatement.java b/java/sql/CallableStatement.java
index 452294144..75eade774 100644
--- a/java/sql/CallableStatement.java
+++ b/java/sql/CallableStatement.java
@@ -1,5 +1,5 @@
/* CallableStatement.java -- A statement for calling stored procedures.
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -56,10 +56,10 @@ public interface CallableStatement extends PreparedStatement
* of the specified SQL type.
*
* @param index The index of the parameter to register as output.
- * @param type The SQL type value from <code>Types</code>.
+ * @param sqlType The SQL type value from <code>Types</code>.
* @exception SQLException If an error occurs.
*/
- void registerOutParameter(int parameterIndex, int sqlType)
+ void registerOutParameter(int index, int sqlType)
throws SQLException;
/**
@@ -67,11 +67,11 @@ public interface CallableStatement extends PreparedStatement
* of the specified SQL type and scale.
*
* @param index The index of the parameter to register as output.
- * @param type The SQL type value from <code>Types</code>.
+ * @param sqlType The SQL type value from <code>Types</code>.
* @param scale The scale of the value that will be returned.
* @exception SQLException If an error occurs.
*/
- void registerOutParameter(int parameterIndex, int sqlType, int scale)
+ void registerOutParameter(int index, int sqlType, int scale)
throws SQLException;
/**
@@ -92,7 +92,7 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>String</code>.
* @exception SQLException If an error occurs.
*/
- String getString(int parameterIndex) throws SQLException;
+ String getString(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -102,7 +102,7 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>boolean</code>.
* @exception SQLException If an error occurs.
*/
- boolean getBoolean(int parameterIndex) throws SQLException;
+ boolean getBoolean(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -112,7 +112,7 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>byte</code>.
* @exception SQLException If an error occurs.
*/
- byte getByte(int parameterIndex) throws SQLException;
+ byte getByte(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -122,7 +122,7 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>short</code>.
* @exception SQLException If an error occurs.
*/
- short getShort(int parameterIndex) throws SQLException;
+ short getShort(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -132,7 +132,7 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>int</code>.
* @exception SQLException If an error occurs.
*/
- int getInt(int parameterIndex) throws SQLException;
+ int getInt(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -142,7 +142,7 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>long</code>.
* @exception SQLException If an error occurs.
*/
- long getLong(int parameterIndex) throws SQLException;
+ long getLong(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -152,7 +152,7 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>float</code>.
* @exception SQLException If an error occurs.
*/
- float getFloat(int parameterIndex) throws SQLException;
+ float getFloat(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -162,31 +162,31 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>double</code>.
* @exception SQLException If an error occurs.
*/
- double getDouble(int parameterIndex) throws SQLException;
+ double getDouble(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
* <code>BigDecimal</code>.
*
- * @param parameterIndex The index of the parameter to return.
+ * @param index The index of the parameter to return.
* @param scale The number of digits to the right of the decimal to return.
* @return The parameter value as a <code>BigDecimal</code>.
* @exception SQLException If an error occurs.
- * @deprecated Use getBigDecimal(int parameterIndex)
- * or getBigDecimal(String parameterName) instead.
+ * @deprecated Use getBigDecimal(int index)
+ * or getBigDecimal(String name) instead.
*/
- BigDecimal getBigDecimal(int parameterIndex, int scale)
+ BigDecimal getBigDecimal(int index, int scale)
throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
* byte array.
*
- * @param parameterIndex The index of the parameter to return.
+ * @param index The index of the parameter to return.
* @return The parameter value as a byte array
* @exception SQLException If an error occurs.
*/
- byte[] getBytes(int parameterIndex) throws SQLException;
+ byte[] getBytes(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -196,7 +196,7 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>java.sql.Date</code>.
* @exception SQLException If an error occurs.
*/
- Date getDate(int parameterIndex) throws SQLException;
+ Date getDate(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -206,7 +206,7 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>java.sql.Time</code>.
* @exception SQLException If an error occurs.
*/
- Time getTime(int parameterIndex) throws SQLException;
+ Time getTime(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -216,29 +216,29 @@ public interface CallableStatement extends PreparedStatement
* @return The parameter value as a <code>java.sql.Timestamp</code>.
* @exception SQLException If an error occurs.
*/
- Timestamp getTimestamp(int parameterIndex) throws SQLException;
+ Timestamp getTimestamp(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
* <code>Object</code>.
*
- * @param parameterIndex The index of the parameter to return.
+ * @param index The index of the parameter to return.
* @return The parameter value as an <code>Object</code>.
* @exception SQLException If an error occurs.
* @since 1.2
*/
- Object getObject(int parameterIndex) throws SQLException;
+ Object getObject(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
* <code>BigDecimal</code>.
*
- * @param parameterIndex The index of the parameter to return.
+ * @param index The index of the parameter to return.
* @return The parameter value as a <code>BigDecimal</code>.
* @exception SQLException If an error occurs.
* @since 1.2
*/
- BigDecimal getBigDecimal(int parameterIndex) throws SQLException;
+ BigDecimal getBigDecimal(int index) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -289,7 +289,7 @@ public interface CallableStatement extends PreparedStatement
* This method returns the value of the specified parameter as a Java
* <code>Array</code>.
*
- * @param parameterIndex The index of the parameter to return.
+ * @param index The index of the parameter to return.
* @return The parameter value as a <code>Array</code>.
* @exception SQLException If an error occurs.
* @since 1.2
@@ -300,25 +300,25 @@ public interface CallableStatement extends PreparedStatement
* This method returns the value of the specified parameter as a Java
* <code>java.sql.Date</code>.
*
- * @param parameterIndex The index of the parameter to return.
+ * @param index The index of the parameter to return.
* @param cal The <code>Calendar</code> to use for timezone and locale.
* @return The parameter value as a <code>java.sql.Date</code>.
* @exception SQLException If an error occurs.
* @since 1.2
*/
- Date getDate(int parameterIndex, Calendar cal) throws SQLException;
+ Date getDate(int index, Calendar cal) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
* <code>java.sql.Time</code>.
*
- * @param parameterIndex The index of the parameter to return.
+ * @param index The index of the parameter to return.
* @param cal The <code>Calendar</code> to use for timezone and locale.
* @return The parameter value as a <code>java.sql.Time</code>.
* @exception SQLException If an error occurs.
* @since 1.2
*/
- Time getTime(int parameterIndex, Calendar cal) throws SQLException;
+ Time getTime(int index, Calendar cal) throws SQLException;
/**
* This method returns the value of the specified parameter as a Java
@@ -329,7 +329,7 @@ public interface CallableStatement extends PreparedStatement
* @exception SQLException If an error occurs.
* @since 1.2
*/
- Timestamp getTimestamp(int parameterIndex, Calendar cal)
+ Timestamp getTimestamp(int index, Calendar cal)
throws SQLException;
/**
@@ -337,25 +337,24 @@ public interface CallableStatement extends PreparedStatement
* of the specified SQL type.
*
* @param index The index of the parameter to register as output.
- * @param type The SQL type value from <code>Types</code>.
- * @param name The user defined data type name.
+ * @param sqlType The SQL type value from <code>Types</code>.
+ * @param typeName The user defined data type name.
* @exception SQLException If an error occurs.
* @since 1.2
*/
- void registerOutParameter(int paramIndex, int sqlType,
- String typeName)
+ void registerOutParameter(int index, int sqlType, String typeName)
throws SQLException;
/**
* This method registers the specified parameter as an output parameter
* of the specified SQL type.
*
- * @param parameterName The name of the parameter to register as output.
+ * @param name The name of the parameter to register as output.
* @param sqlType The SQL type value from <code>Types</code>.
* @exception SQLException If an error occurs.
* @since 1.4
*/
- void registerOutParameter(String parameterName, int sqlType)
+ void registerOutParameter(String name, int sqlType)
throws SQLException;
/**
@@ -363,14 +362,13 @@ public interface CallableStatement extends PreparedStatement
* of the specified SQL type. This version of registerOutParameter is used
* for NUMERIC or DECIMAL types.
*
- * @param parameterName The name of the parameter to register as output.
+ * @param name The name of the parameter to register as output.
* @param sqlType The SQL type value from <code>Types</code>.
* @param scale Number of digits to the right of the decimal point.
* @exception SQLException If an error occurs.
* @since 1.4
*/
- void registerOutParameter(String parameterName, int sqlType,
- int scale)
+ void registerOutParameter(String name, int sqlType, int scale)
throws SQLException;
@@ -380,272 +378,584 @@ public interface CallableStatement extends PreparedStatement
* for user-named or REF types. If the type of the output parameter does
* not have such a type, the typeName argument is ignored.
*
- * @param parameterName The name of the parameter to register as output.
+ * @param name The name of the parameter to register as output.
* @param sqlType The SQL type value from <code>Types</code>.
* @param typeName The SQL structured type name.
* @exception SQLException If an error occurs.
* @since 1.4
*/
- void registerOutParameter(String parameterName, int sqlType,
- String typeName)
+ void registerOutParameter(String name, int sqlType, String typeName)
throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>java.net.URL</code>.
+ *
+ * @param index The index of the parameter to return.
+ * @return The parameter value as a <code>URL</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- URL getURL(int parameterIndex) throws SQLException;
+ URL getURL(int index) throws SQLException;
/**
+ * This method sets the value of the specified parameter to the specified
+ * <code>java.net.URL</code>
+ *
+ * @param name The name of the parameter to set.
+ * @param value The value the parameter.
* @since 1.4
*/
- void setURL(String parameterName, URL val) throws SQLException;
+ void setURL(String name, URL value) throws SQLException;
/**
+ * This method populates the specified parameter with a SQL NULL value
+ * for the specified type.
+ *
+ * @param name The name of the parameter to set.
+ * @param sqlType The SQL type identifier of the parameter from
+ * <code>Types</code>
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setNull(String parameterName, int sqlType) throws SQLException;
+ void setNull(String name, int sqlType) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>boolean</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setBoolean(String parameterName, boolean x) throws SQLException;
+ void setBoolean(String name, boolean value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>byte</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setByte(String parameterName, byte x) throws SQLException;
+ void setByte(String name, byte value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>short</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setShort(String parameterName, short x) throws SQLException;
+ void setShort(String name, short value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>int</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setInt(String parameterName, int x) throws SQLException;
+ void setInt(String name, int value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>long</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setLong(String parameterName, long x) throws SQLException;
+ void setLong(String name, long value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>float</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setFloat(String parameterName, float x) throws SQLException;
+ void setFloat(String name, float value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>double</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setDouble(String parameterName, double x) throws SQLException;
+ void setDouble(String name, double value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>BigDecimal</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setBigDecimal(String parameterName, BigDecimal x)
+ void setBigDecimal(String name, BigDecimal value)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>String</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setString(String parameterName, String x) throws SQLException;
+ void setString(String name, String value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>byte</code> array value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setBytes(String parameterName, byte[] x) throws SQLException;
+ void setBytes(String name, byte[] value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>java.sql.Date</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setDate(String parameterName, Date x) throws SQLException;
+ void setDate(String name, Date value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>java.sql.Time</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setTime(String parameterName, Time x) throws SQLException;
+ void setTime(String name, Time value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>java.sql.Timestamp</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setTimestamp(String parameterName, Timestamp x)
+ void setTimestamp(String name, Timestamp value)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * ASCII <code>InputStream</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param stream The stream from which the parameter value is read.
+ * @param count The number of bytes in the stream.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setAsciiStream(String parameterName, InputStream x, int length)
+ void setAsciiStream(String name, InputStream stream, int count)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * binary <code>InputStream</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param stream The stream from which the parameter value is read.
+ * @param count The number of bytes in the stream.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setBinaryStream(String parameterName, InputStream x, int length)
+ void setBinaryStream(String name, InputStream stream, int count)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>Object</code> value. The specified SQL object type will be used.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @param sqlType The SQL type to use for the parameter, from
+ * <code>Types</code>
+ * @param scale The scale of the value, for numeric values only.
+ * @exception SQLException If an error occurs.
+ * @see Types
* @since 1.4
*/
- void setObject(String parameterName, Object x, int targetSqlType,
- int scale)
+ void setObject(String name, Object value, int sqlType, int scale)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>Object</code> value. The specified SQL object type will be used.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @param sqlType The SQL type to use for the parameter, from
+ * <code>Types</code>
+ * @exception SQLException If an error occurs.
+ * @see Types
* @since 1.4
*/
- void setObject(String parameterName, Object x, int targetSqlType)
+ void setObject(String name, Object value, int sqlType)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>Object</code> value. The default object type to SQL type mapping
+ * will be used.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setObject(String parameterName, Object x) throws SQLException;
+ void setObject(String name, Object value) throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * character <code>Reader</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param reader The reader from which the parameter value is read.
+ * @param count The number of characters in the stream.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setCharacterStream(String parameterName, Reader reader,
- int length)
+ void setCharacterStream(String name, Reader reader, int count)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>java.sql.Date</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @param cal The <code>Calendar</code> to use for timezone and locale.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setDate(String parameterName, Date x, Calendar cal)
+ void setDate(String name, Date value, Calendar cal)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>java.sql.Time</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @param cal The <code>Calendar</code> to use for timezone and locale.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setTime(String parameterName, Time x, Calendar cal)
+ void setTime(String name, Time value, Calendar cal)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>java.sql.Timestamp</code> value.
+ *
+ * @param name The name of the parameter value to set.
+ * @param value The value of the parameter.
+ * @param cal The <code>Calendar</code> to use for timezone and locale.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setTimestamp(String parameterName, Timestamp x, Calendar cal)
+ void setTimestamp(String name, Timestamp value, Calendar cal)
throws SQLException;
/**
+ * This method populates the specified parameter with a SQL NULL value
+ * for the specified type.
+ *
+ * @param name The name of the parameter to set.
+ * @param sqlType The SQL type identifier of the parameter from
+ * <code>Types</code>
+ * @param typeName The name of the data type, for user defined types.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setNull(String parameterName, int sqlType, String typeName)
+ void setNull(String name, int sqlType, String typeName)
throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>String</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>String</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- String getString(String parameterName) throws SQLException;
+ String getString(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>boolean</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>boolean</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- boolean getBoolean(String parameterName) throws SQLException;
+ boolean getBoolean(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>byte</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>byte</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- byte getByte(String parameterName) throws SQLException;
+ byte getByte(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>short</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>short</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- short getShort(String parameterName) throws SQLException;
+ short getShort(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>int</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>int</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- int getInt(String parameterName) throws SQLException;
+ int getInt(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>long</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>long</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- long getLong(String parameterName) throws SQLException;
+ long getLong(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>float</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>float</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- float getFloat(String parameterName) throws SQLException;
+ float getFloat(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>double</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>double</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- double getDouble(String parameterName) throws SQLException;
+ double getDouble(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>byte</code> array.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>byte[]</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- byte[] getBytes(String parameterName) throws SQLException;
+ byte[] getBytes(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>java.sql.Date</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>java.sql.Date</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Date getDate(String parameterName) throws SQLException;
+ Date getDate(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>java.sql.Time</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>java.sql.Time</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Time getTime(String parameterName) throws SQLException;
+ Time getTime(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>java.sql.Timestamp</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>java.sql.Timestamp</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Timestamp getTimestamp(String parameterName) throws SQLException;
+ Timestamp getTimestamp(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>Object</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>Object</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Object getObject(String parameterName) throws SQLException;
+ Object getObject(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>BigDecimal</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>BigDecimal</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- BigDecimal getBigDecimal(String parameterName) throws SQLException;
+ BigDecimal getBigDecimal(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>Object</code> using the specified mapping for conversion from
+ * SQL to Java types.
+ *
+ * @param name The name of the parameter to return.
+ * @param map The mapping to use for conversion from SQL to Java types.
+ * @return The parameter value as an <code>Object</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Object getObject(String parameterName, Map map) throws SQLException;
+ Object getObject(String name, Map map) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>Ref</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>Ref</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Ref getRef(String parameterName) throws SQLException;
+ Ref getRef(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>Blob</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>Blob</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Blob getBlob(String parameterName) throws SQLException;
+ Blob getBlob(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>Clob</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>Clob</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Clob getClob(String parameterName) throws SQLException;
+ Clob getClob(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>Array</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>Array</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Array getArray(String parameterName) throws SQLException;
+ Array getArray(String name) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>java.sql.Date</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @param cal The <code>Calendar</code> to use for timezone and locale.
+ * @return The parameter value as a <code>java.sql.Date</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Date getDate(String parameterName, Calendar cal) throws SQLException;
+ Date getDate(String name, Calendar cal) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>java.sql.Time</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @param cal The <code>Calendar</code> to use for timezone and locale.
+ * @return The parameter value as a <code>java.sql.Time</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Time getTime(String parameterName, Calendar cal) throws SQLException;
+ Time getTime(String name, Calendar cal) throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>java.sql.Timestamp</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @param cal The <code>Calendar</code> to use for timezone and locale.
+ * @return The parameter value as a <code>java.sql.Timestamp</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Timestamp getTimestamp(String parameterName, Calendar cal)
+ Timestamp getTimestamp(String name, Calendar cal)
throws SQLException;
/**
+ * This method returns the value of the specified parameter as a Java
+ * <code>java.net.URL</code>.
+ *
+ * @param name The name of the parameter to return.
+ * @return The parameter value as a <code>java.net.URL</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- URL getURL(String parameterName) throws SQLException;
+ URL getURL(String name) throws SQLException;
}
diff --git a/java/sql/Clob.java b/java/sql/Clob.java
index 8789da596..53bf6393c 100644
--- a/java/sql/Clob.java
+++ b/java/sql/Clob.java
@@ -1,5 +1,5 @@
/* Clob.java -- Access Character Large OBjects
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -35,6 +35,7 @@ this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
+
package java.sql;
import java.io.InputStream;
@@ -43,110 +44,144 @@ import java.io.Reader;
import java.io.Writer;
/**
- * This interface contains methods for accessing a SQL CLOB (Character
- * Large OBject) type.
- *
+ * This interface contains methods for accessing a SQL CLOB (Character Large
+ * OBject) type.
+ *
* @author Aaron M. Renn (arenn@urbanophile.com)
*/
-public interface Clob
+public interface Clob
{
- /**
- * This method returns the number of characters in the CLOB.
- *
- * @return The number of characters in the CLOB.
- * @exception SQLException If an error occurs.
- * @since 1.2
- */
+ /**
+ * This method returns the number of characters in this <code>Clob</code>.
+ *
+ * @return The number of characters in this <code>Clob</code>.
+ * @exception SQLException If an error occurs.
+ * @since 1.2
+ */
long length() throws SQLException;
/**
- * This method returns the specified portion of the CLOB as a
- * <code>String</code>.
- *
- * @param offset The index into the CLOB (index values start at 1) to
- * start returning characters from.
- * @param length The requested number of characters to return.
- * @return The requested CLOB section, as a <code>String</code>.
+ * This method returns the specified portion of this <code>Clob</code> as a
+ * <code>String</code>.
+ *
+ * @param start The index into this <code>Clob</code> (index values
+ * start at 1) to start returning characters from.
+ * @param count The requested number of characters to return.
+ * @return The requested <code>Clob</code> section, as a <code>String</code>.
* @exception SQLException If an error occurs.
* @since 1.2
*/
- String getSubString(long pos, int length) throws SQLException;
+ String getSubString(long start, int count) throws SQLException;
/**
- * This method returns a character stream that reads the contents of the
- * CLOB.
- *
- * @return A character stream to read the CLOB's contents.
+ * This method returns a character stream that reads the contents of this
+ * <code>Clob</code>.
+ *
+ * @return A character stream to read this <code>Clob</code>'s contents.
* @exception SQLException If an error occurs.
* @since 1.2
*/
Reader getCharacterStream() throws SQLException;
/**
- * This method returns a byte stream that reads the contents of the
- * CLOB as a series of ASCII bytes.
- *
- * @return A stream to read the CLOB's contents.
+ * This method returns a byte stream that reads the contents of this
+ * <code>Clob</code> as a series of ASCII bytes.
+ *
+ * @return A stream to read this <code>Clob</code>'s contents.
* @exception SQLException If an error occurs.
* @since 1.2
*/
InputStream getAsciiStream() throws SQLException;
/**
- * This method returns the index into the CLOB of the first occurrence of
- * the specified character pattern (supplied by the caller as a
- * <code>String</code>). The search begins at the specified index.
- *
- * @param searchstr The character pattern to search for, passed as a
- * <code>String</code>.
- * @param start. The index into the CLOB to start search (indexes start
- * at 1).
- * @return The index at which the pattern was found (indexes start at 1),
- * or -1 if the pattern was not found.
+ * This method returns the index into this <code>Clob</code> of the first
+ * occurrence of the specified character pattern (supplied by the caller as a
+ * <code>String</code>). The search begins at the specified index.
+ *
+ * @param pattern The character pattern to search for, passed as a
+ * <code>String</code>.
+ * @param start The index into this <code>Clob</code> to start searching
+ * (indices start at 1).
+ * @return The index at which the pattern was found (indices start at 1), or
+ * -1 if the pattern was not found.
* @exception SQLException If an error occurs.
* @since 1.2
*/
- long position(String searchstr, long start) throws SQLException;
+ long position(String pattern, long start) throws SQLException;
/**
- * This method returns the index into the CLOB of the first occurrence of
- * the specified character pattern (supplied by the caller as a
- * <code>Clob</code>). The search begins at the specified index.
- *
- * @param searchstr The character pattern to search for, passed as a
- * <code>Clob</code>.
- * @param start. The index into the CLOB to start search (indexes start
- * at 1).
- * @return The index at which the pattern was found (indexes start at 1),
- * or -1 if the pattern was not found.
+ * This method returns the index into this <code>Clob</code> of the first
+ * occurrence of the specified character pattern (supplied by the caller as a
+ * <code>Clob</code>). The search begins at the specified index.
+ *
+ * @param pattern The character pattern to search for, passed as a
+ * <code>Clob</code>.
+ * @param start The index into this <code>Clob</code> to start searching
+ * (indices start at 1).
+ * @return The index at which the pattern was found (indices start at 1), or
+ * -1 if the pattern was not found.
* @exception SQLException If an error occurs.
* @since 1.2
*/
- long position(Clob searchstr, long start) throws SQLException;
+ long position(Clob pattern, long start) throws SQLException;
/**
+ * Writes the specified string into this <code>Clob</code>, starting at the
+ * specified index.
+ *
+ * @param start The index at which the writing starts.
+ * @param value The string to write.
+ * @return The number of characters written.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- int setString(long pos, String str) throws SQLException;
+ int setString(long start, String value) throws SQLException;
/**
+ * Writes the specified portion of a string into this <code>Clob</code>,
+ * starting at the specified index.
+ *
+ * @param startWrite The index at which the writing starts.
+ * @param value The string to write a portion of.
+ * @param startRead The offset into the string where the portion to copy
+ * starts.
+ * @param count The number of characters to write.
+ * @return The number of characters written.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- int setString(long pos, String str, int offset, int len)
- throws SQLException;
+ int setString(long startWrite, String value, int startRead, int count)
+ throws SQLException;
/**
+ * Returns an ASCII text stream that writes into this <code>Clob</code>,
+ * starting at the specified index.
+ *
+ * @param start The index at which the writing starts.
+ * @return An ASCII text stream to write into this <code>Clob</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- OutputStream setAsciiStream(long pos) throws SQLException;
+ OutputStream setAsciiStream(long start) throws SQLException;
/**
+ * Returns a character stream that writes into this <code>Clob</code>,
+ * starting at the specified index.
+ *
+ * @param start The index at which the writing starts.
+ * @return A character stream to write into this <code>Clob</code>.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- Writer setCharacterStream(long pos) throws SQLException;
+ Writer setCharacterStream(long start) throws SQLException;
/**
+ * Truncates this <code>Clob</code> to be at most the specified number of
+ * characters long.
+ *
+ * @param count The length this <code>Clob</code> is truncated to.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void truncate(long len) throws SQLException;
+ void truncate(long count) throws SQLException;
}
diff --git a/java/sql/Connection.java b/java/sql/Connection.java
index 48ec12dd0..d827e75b0 100644
--- a/java/sql/Connection.java
+++ b/java/sql/Connection.java
@@ -1,5 +1,5 @@
/* Connection.java -- Manage a database connection.
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -61,7 +61,7 @@ public interface Connection
int TRANSACTION_READ_UNCOMMITTED = 1;
/**
- * This transaction isolation leve indicates that only committed data from
+ * This transaction isolation level indicates that only committed data from
* other transactions will be read. If a transaction reads a row, then
* another transaction commits a change to that row, the first transaction
* would retrieve the changed row on subsequent reads of the same row.
@@ -101,8 +101,8 @@ public interface Connection
* SQL string. This method is designed for use with parameterized
* statements. The default result set type and concurrency will be used.
*
- * @param The SQL statement to use in creating this
- * <code>PreparedStatement</code>.
+ * @param sql The SQL statement to use in creating this
+ * <code>PreparedStatement</code>.
* @return A new <code>PreparedStatement</code>.
* @exception SQLException If an error occurs.
* @see PreparedStatement
@@ -115,8 +115,8 @@ public interface Connection
* stored procedures. The default result set type and concurrency
* will be used.
*
- * @param The SQL statement to use in creating this
- * <code>CallableStatement</code>.
+ * @param sql The SQL statement to use in creating this
+ * <code>CallableStatement</code>.
* @return A new <code>CallableStatement</code>.
* @exception SQLException If an error occurs.
* @see CallableStatement
@@ -127,7 +127,7 @@ public interface Connection
* This method converts the specified generic SQL statement into the
* native grammer of the database this object is connected to.
*
- * @param The JDBC generic SQL statement.
+ * @param sql The JDBC generic SQL statement.
* @return The native SQL statement.
* @exception SQLException If an error occurs.
*/
@@ -139,10 +139,10 @@ public interface Connection
* transaction must be explicitly committed or rolled back.
*
* @param autoCommit <code>true</code> to enable auto commit mode,
- * <code>false</code> to disable it.
+ * <code>false</code> to disable it.
* @exception SQLException If an error occurs.
- * @see commit
- * @see rollback
+ * @see #commit()
+ * @see #rollback()
*/
void setAutoCommit(boolean autoCommit) throws SQLException;
@@ -152,12 +152,10 @@ public interface Connection
* Otherwise a transaction must be explicitly committed or rolled back.
*
* @return <code>true</code> if auto commit mode is enabled,
- * <code>false</code> otherwise.
- *
+ * <code>false</code> otherwise.
* @exception SQLException If an error occurs.
- *
- * @see commit
- * @see rollback
+ * @see #commit()
+ * @see #rollback()
*/
boolean getAutoCommit() throws SQLException;
@@ -207,7 +205,7 @@ public interface Connection
* a transaction is in progress.
*
* @param readOnly <code>true</code> if this connection is read only,
- * <code>false</code> otherwise.
+ * <code>false</code> otherwise.
* @exception SQLException If an error occurs.
*/
void setReadOnly(boolean readOnly) throws SQLException;
@@ -235,8 +233,8 @@ public interface Connection
* This method returns the name of the catalog in use by this connection,
* if any.
*
- * @return The name of the catalog, or <code>null</code> if one does not
- * exist or catalogs are not supported by this database.
+ * @return The name of the catalog, or <code>null</code> if none
+ * exists or catalogs are not supported by this database.
* @exception SQLException If an error occurs.
*/
String getCatalog() throws SQLException;
@@ -283,8 +281,8 @@ public interface Connection
* <code>ResultSet</code> class.
*
* @param resultSetType The type of result set to use for this statement.
- * @param resultSetConcurrency. The type of concurrency to be used in
- * the result set for this statement.
+ * @param resultSetConcurrency The type of concurrency to be used in
+ * the result set for this statement.
* @return A new <code>Statement</code> object.
* @exception SQLException If an error occurs.
* @see Statement
@@ -300,11 +298,11 @@ public interface Connection
* Valid values for these parameters are specified in the
* <code>ResultSet</code> class.
*
- * @param The SQL statement to use in creating this
- * <code>PreparedStatement</code>.
+ * @param sql The SQL statement to use in creating this
+ * <code>PreparedStatement</code>.
* @param resultSetType The type of result set to use for this statement.
- * @param resultSetConcurrency. The type of concurrency to be used in
- * the result set for this statement.
+ * @param resultSetConcurrency The type of concurrency to be used in
+ * the result set for this statement.
* @return A new <code>PreparedStatement</code>.
* @exception SQLException If an error occurs.
* @see PreparedStatement
@@ -320,11 +318,11 @@ public interface Connection
* will be used. Valid values for these parameters are specified in the
* <code>ResultSet</code> class.
*
- * @param The SQL statement to use in creating this
- * <code>PreparedStatement</code>.
+ * @param sql The SQL statement to use in creating this
+ * <code>PreparedStatement</code>.
* @param resultSetType The type of result set to use for this statement.
- * @param resultSetConcurrency. The type of concurrency to be used in
- * the result set for this statement.
+ * @param resultSetConcurrency The type of concurrency to be used in
+ * the result set for this statement.
* @return A new <code>CallableStatement</code>.
* @exception SQLException If an error occurs.
* @see CallableStatement
@@ -353,48 +351,130 @@ public interface Connection
void setTypeMap(Map map) throws SQLException;
/**
+ * Sets the default holdability of <code>ResultSet</code>S that are created
+ * from <code>Statement</code>S using this <code>Connection</code>.
+ *
+ * @param holdability The default holdability value to set, this must be one
+ * of <code>ResultSet.HOLD_CURSORS_OVER_COMMIT</code> or
+ * <code>ResultSet.CLOSE_CURSORS_AT_COMMIT</code>.
+ * @exception SQLException If an error occurs.
+ * @see ResultSet
* @since 1.4
*/
void setHoldability(int holdability) throws SQLException;
/**
+ * Gets the default holdability of <code>ResultSet</code>S that are created
+ * from <code>Statement</code>S using this <code>Connection</code>.
+ *
+ * @return The current default holdability value, this must be one of
+ * <code>ResultSet.HOLD_CURSORS_OVER_COMMIT</code> or
+ * <code>ResultSet.CLOSE_CURSORS_AT_COMMIT</code>.
+ * @exception SQLException If an error occurs.
+ * @see ResultSet
* @since 1.4
*/
int getHoldability() throws SQLException;
/**
+ * Creates a new unnamed savepoint for this <code>Connection</code>
+ *
+ * @return The <code>Savepoint</code> object representing the savepoint.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
Savepoint setSavepoint() throws SQLException;
/**
+ * Creates a new savepoint with the specifiend name for this
+ * <code>Connection</code>.
+ *
+ * @param name The name of the savepoint.
+ * @return The <code>Savepoint</code> object representing the savepoint.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
Savepoint setSavepoint(String name) throws SQLException;
/**
+ * Undoes all changes made after the specified savepoint was set.
+ *
+ * @param savepoint The safepoint to roll back to.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
void rollback(Savepoint savepoint) throws SQLException;
/**
+ * Removes the specified savepoint from this <code>Connection</code>.
+ * Refering to a savepoint after it was removed is an error and will throw an
+ * SQLException.
+ *
+ * @param savepoint The savepoint to release.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
void releaseSavepoint(Savepoint savepoint) throws SQLException;
/**
+ * This method creates a new SQL statement with the specified type,
+ * concurrency and holdability, instead of using the defaults. Valid values
+ * for these parameters are specified in the <code>ResultSet</code> class.
+ *
+ * @param resultSetType The type of result set to use for this statement.
+ * @param resultSetConcurrency The type of concurrency to be used in
+ * the result set for this statement.
+ * @param resultSetHoldability The type of holdability to be usd in the
+ * result set for this statement.
+ * @return A new <code>Statement</code>
+ * @exception SQLException If an error occurs.
+ * @see ResultSet
* @since 1.4
*/
Statement createStatement(int resultSetType, int
resultSetConcurrency, int resultSetHoldability) throws SQLException;
/**
+ * This method creates a new <code>PreparedStatement</code> for the specified
+ * SQL string. This method is designed for use with parameterized
+ * statements. The specified result set type, concurrency and holdability
+ * will be used. Valid values for these parameters are specified in the
+ * <code>ResultSet</code> class.
+ *
+ * @param sql The SQL statement to use in creating this
+ * <code>PreparedStatement</code>.
+ * @param resultSetType The type of result set to use for this statement.
+ * @param resultSetConcurrency The type of concurrency to be used in
+ * the result set for this statement.
+ * @param resultSetHoldability The type of holdability to be usd in the
+ * result set for this statement.
+ * @return A new <code>PreparedStatement</code>.
+ * @exception SQLException If an error occurs.
+ * @see PreparedStatement
+ * @see ResultSet
* @since 1.4
*/
PreparedStatement prepareStatement(String sql, int resultSetType, int
resultSetConcurrency, int resultSetHoldability) throws SQLException;
/**
+ * This method creates a new <code>CallableStatement</code> for the
+ * specified SQL string. Thie method is designed to be used with
+ * stored procedures. The specified result set type, concurrency and
+ * holdability will be used. Valid values for these parameters are specified
+ * in the <code>ResultSet</code> class.
+ *
+ * @param sql The SQL statement to use in creating this
+ * <code>PreparedStatement</code>.
+ * @param resultSetType The type of result set to use for this statement.
+ * @param resultSetConcurrency The type of concurrency to be used in
+ * the result set for this statement.
+ * @param resultSetHoldability The type of holdability to be used in the
+ * result set for this statement.
+ * @return A new <code>CallableStatement</code>.
+ * @exception SQLException If an error occurs.
+ * @see CallableStatement
+ * @see ResultSet
* @since 1.4
*/
CallableStatement prepareCall(String sql, int resultSetType, int
diff --git a/java/sql/DatabaseMetaData.java b/java/sql/DatabaseMetaData.java
index d34c4e2f9..48c2d9afc 100644
--- a/java/sql/DatabaseMetaData.java
+++ b/java/sql/DatabaseMetaData.java
@@ -1,5 +1,5 @@
/* DatabaseMetaData.java -- Information about the database itself.
- Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -256,10 +256,19 @@ public interface DatabaseMetaData
*/
short tableIndexOther = 3;
+ /**
+ * A NULL value is not allowed for this attribute.
+ */
short attributeNoNulls = 0;
+ /**
+ * A NULL value is allowed for this attribute.
+ */
short attributeNullable = 1;
+ /**
+ * It is unknown whether or not NULL values are allowed for this attribute.
+ */
short attributeNullableUnknown = 2;
int sqlStateXOpen = 1;
@@ -1395,12 +1404,12 @@ public interface DatabaseMetaData
* or "" to return procedures from all catalogs.
* @param schemaPattern A schema pattern for the schemas to return stored
* procedures from, or "" to return procedures from all schemas.
- * @param namePattern The pattern of procedures names to return.
+ * @param procedurePattern The pattern of procedure names to return.
* @returns A <code>ResultSet</code> with all the requested procedures.
* @exception SQLException If an error occurs.
*/
ResultSet getProcedures(String catalog, String schemaPattern, String
- procedureNamePattern) throws SQLException;
+ procedurePattern) throws SQLException;
/**
* This method returns a list of the parameter and result columns for
@@ -1436,13 +1445,13 @@ public interface DatabaseMetaData
* or "" to return procedures from all catalogs.
* @param schemaPattern A schema pattern for the schemas to return stored
* procedures from, or "" to return procedures from all schemas.
- * @param namePattern The pattern of procedures names to return.
+ * @param procedurePattern The pattern of procedures names to return.
* @param columnPattern The pattern of column names to return.
* @returns A <code>ResultSet</code> with all the requested procedures.
* @exception SQLException If an error occurs.
*/
ResultSet getProcedureColumns(String catalog, String schemaPattern,
- String procedureNamePattern, String columnNamePattern) throws
+ String procedurePattern, String columnPattern) throws
SQLException;
/**
@@ -1462,13 +1471,13 @@ public interface DatabaseMetaData
* or "" to return tables from all catalogs.
* @param schemaPattern A schema pattern for the schemas to return tables
* from, or "" to return tables from all schemas.
- * @param namePattern The pattern of table names to return.
+ * @param tablePattern The pattern of table names to return.
* @param types The list of table types to include; null returns all types.
* @returns A <code>ResultSet</code> with all the requested tables.
* @exception SQLException If an error occurs.
*/
ResultSet getTables(String catalog, String schemaPattern, String
- tableNamePattern, String[] types) throws SQLException;
+ tablePattern, String[] types) throws SQLException;
/**
* This method returns the list of database schemas as a
@@ -1536,13 +1545,13 @@ public interface DatabaseMetaData
* or "" to return tables from all catalogs.
* @param schemaPattern A schema pattern for the schemas to return
* tables from, or "" to return tables from all schemas.
- * @param namePattern The pattern of tables names to return.
+ * @param tablePattern The pattern of table names to return.
* @param columnPattern The pattern of column names to return.
* @returns A <code>ResultSet</code> with all the requested tables.
* @exception SQLException If an error occurs.
*/
ResultSet getColumns(String catalog, String schemaPattern, String
- tableNamePattern, String columnNamePattern) throws SQLException;
+ tablePattern, String columnPattern) throws SQLException;
/**
* This method returns the access rights that have been granted to the
@@ -1568,13 +1577,13 @@ public interface DatabaseMetaData
* to return information from all catalogs.
* @param schema The schema to retrieve information from, or the empty string
* to return entities not associated with a schema.
- * @param table The table name to return information for.
+ * @param tableName The table name to return information for.
* @param columnPattern A pattern of column names to return information for.
* @return A <code>ResultSet</code> with all the requested privileges.
* @exception SQLException If an error occurs.
*/
ResultSet getColumnPrivileges(String catalog, String schema, String
- table, String columnNamePattern) throws SQLException;
+ tableName, String columnPattern) throws SQLException;
/**
* This method returns the access rights that have been granted to the
@@ -1597,7 +1606,7 @@ public interface DatabaseMetaData
* @param catalog The catalog to retrieve information from, or the empty string
* to return entities not associated with a catalog, or <code>null</code>
* to return information from all catalogs.
- * @param schema The schema to retrieve information from, or the empty string
+ * @param schemaPattern The schema to retrieve information from, or the empty string
* to return entities not associated with a schema.
* @param tablePattern The table name pattern of tables to return
* information for.
@@ -1605,7 +1614,7 @@ public interface DatabaseMetaData
* @exception SQLException If an error occurs.
*/
ResultSet getTablePrivileges(String catalog, String schemaPattern,
- String tableNamePattern) throws SQLException;
+ String tablePattern) throws SQLException;
/**
* This method returns the best set of columns for uniquely identifying
@@ -1634,8 +1643,7 @@ public interface DatabaseMetaData
* to return information from all catalogs.
* @param schema The schema to retrieve information from, or the empty string
* to return entities not associated with a schema.
- * @param table The table name to return information for.
- * @param columnPattern A pattern of column names to return information for.
+ * @param tableName The table name to return information for.
* @param scope One of the best row id scope constants from this class.
* @param nullable <code>true</code> to include columns that are nullable,
* <code>false</code> otherwise.
@@ -1643,7 +1651,7 @@ public interface DatabaseMetaData
* @exception SQLException If an error occurs.
*/
ResultSet getBestRowIdentifier(String catalog, String schema,
- String table, int scope, boolean nullable) throws SQLException;
+ String tableName, int scope, boolean nullable) throws SQLException;
/**
* This method returns the set of columns that are automatically updated
@@ -1670,13 +1678,12 @@ public interface DatabaseMetaData
* to return information from all catalogs.
* @param schema The schema to retrieve information from, or the empty string
* to return entities not associated with a schema.
- * @param table The table name to return information for.
- * @param columnPattern A pattern of column names to return information for.
+ * @param tableName The table name to return information for
* @return A <code>ResultSet</code> with the version columns.
* @exception SQLException If an error occurs.
*/
ResultSet getVersionColumns(String catalog, String schema,
- String table) throws SQLException;
+ String tableName) throws SQLException;
/**
* This method returns a list of a table's primary key columns. These
@@ -1696,12 +1703,11 @@ public interface DatabaseMetaData
* to return information from all catalogs.
* @param schema The schema to retrieve information from, or the empty string
* to return entities not associated with a schema.
- * @param table The table name to return information for.
- * @param columnPattern A pattern of column names to return information for.
+ * @param tableName The table name to return information for.
* @return A <code>ResultSet</code> with the primary key columns.
* @exception SQLException If an error occurs.
*/
- ResultSet getPrimaryKeys(String catalog, String schema, String table)
+ ResultSet getPrimaryKeys(String catalog, String schema, String tableName)
throws SQLException;
/**
@@ -1740,14 +1746,12 @@ public interface DatabaseMetaData
* to return information from all catalogs.
* @param schema The schema to retrieve information from, or the empty string
* to return entities not associated with a schema.
- * @param table The table name to return information for.
- *
+ * @param tableName The table name to return information for.
* @return A <code>ResultSet</code> with the foreign key columns.
- *
* @exception SQLException If an error occurs.
*/
ResultSet getImportedKeys(String catalog, String schema,
- String table) throws SQLException;
+ String tableName) throws SQLException;
/**
* This method returns a list of the table's which use this table's
@@ -1786,12 +1790,12 @@ public interface DatabaseMetaData
* to return information from all catalogs.
* @param schema The schema to retrieve information from, or the empty string
* to return entities not associated with a schema.
- * @param table The table name to return information for.
+ * @param tableName The table name to return information for.
* @return A <code>ResultSet</code> with the requested information
* @exception SQLException If an error occurs.
*/
ResultSet getExportedKeys(String catalog, String schema,
- String table) throws SQLException;
+ String tableName) throws SQLException;
/**
* This method returns a description of how one table imports another
@@ -1825,26 +1829,30 @@ public interface DatabaseMetaData
* <code>importedKeyNotDeferrable</code>).</li>
* </ol>
*
- * @param primCatalog The catalog to retrieve information from, or the empty string
- * to return entities not associated with a catalog, or <code>null</code>
- * to return information from all catalogs, on the exporting side.
- * @param primSchema The schema to retrieve information from, or the empty string
- * to return entities not associated with a schema, on the exporting side.
- * @param primTable The table name to return information for, on the exporting
- * side.
- * @param forCatalog The catalog to retrieve information from, or the empty string
- * to return entities not associated with a catalog, or <code>null</code>
- * to return information from all catalogs, on the importing side.
- * @param forSchema The schema to retrieve information from, or the empty string
- * to return entities not associated with a schema on the importing side.
- * @param forTable The table name to return information for on the importing
- * side.
+ * @param primaryCatalog The catalog to retrieve information from, or the
+ * empty string to return entities not associated with a catalog, or
+ * <code>null</code> to return information from all catalogs, on the
+ * exporting side.
+ * @param primarySchema The schema to retrieve information from, or the empty
+ * string to return entities not associated with a schema, on the
+ * exporting side.
+ * @param primaryTableName The table name to return information for, on the
+ * exporting side.
+ * @param foreignCatalog The catalog to retrieve information from, or the
+ * empty string to return entities not associated with a catalog,
+ * or <code>null</code> to return information from all catalogs, on
+ * the importing side.
+ * @param foreignSchema The schema to retrieve information from, or the
+ * empty string to return entities not associated with a schema on
+ * the importing side.
+ * @param foreignTableName The table name to return information for on the
+ * importing side.
* @return A <code>ResultSet</code> with the requested information
* @exception SQLException If an error occurs.
*/
ResultSet getCrossReference(String primaryCatalog, String
- primarySchema, String primaryTable, String foreignCatalog, String
- foreignSchema, String foreignTable) throws SQLException;
+ primarySchema, String primaryTableName, String foreignCatalog, String
+ foreignSchema, String foreignTableName) throws SQLException;
/**
* This method returns a list of the SQL types supported by this
@@ -1921,15 +1929,15 @@ public interface DatabaseMetaData
* <code>null</code> to return information from all catalogs.
* @param schema The schema to retrieve information from, or the empty string
* to return entities not associated with a schema.
- * @param table The table name to return information for.
+ * @param tableName The table name to return information for.
* @param unique <code>true</code> to return only unique indexes,
* <code>false</code> otherwise.
- * @param approx <code>true</code> if data values can be approximations,
+ * @param approximate <code>true</code> if data values can be approximations,
* <code>false</code> otherwise.
* @return A <code>ResultSet</code> with the requested index information
* @exception SQLException If an error occurs.
*/
- ResultSet getIndexInfo(String catalog, String schema, String table,
+ ResultSet getIndexInfo(String catalog, String schema, String tableName,
boolean unique, boolean approximate) throws SQLException;
/**
@@ -1954,8 +1962,8 @@ public interface DatabaseMetaData
*
* @param type The desired result type, which is one of the constants
* defined in <code>ResultSet</code>.
- * @param concur The desired concurrency type, which is one of the constants
- * defined in <code>ResultSet</code>.
+ * @param concurrency The desired concurrency type, which is one of the
+ * constants defined in <code>ResultSet</code>.
* @return <code>true</code> if the result set type is supported,
* <code>false</code> otherwise.
* @exception SQLException If an error occurs.
@@ -2108,8 +2116,8 @@ public interface DatabaseMetaData
* @param catalog The catalog to retrieve information from, or the empty string
* to return entities not associated with a catalog, or <code>null</code>
* to return information from all catalogs.
- * @param schema The schema to retrieve information from, or the empty string
- * to return entities not associated with a schema.
+ * @param schemaPattern The schema to retrieve information from, or the
+ * empty string to return entities not associated with a schema.
* @param typePattern The type name pattern to match.
* @param types The type identifier patterns (from <code>Types</code>) to
* match.
@@ -2117,7 +2125,7 @@ public interface DatabaseMetaData
* @exception SQLException If an error occurs.
*/
ResultSet getUDTs(String catalog, String schemaPattern, String
- typeNamePattern, int[] types) throws SQLException;
+ typePattern, int[] types) throws SQLException;
/**
* This method returns the <code>Connection</code> object that was used
@@ -2129,16 +2137,33 @@ public interface DatabaseMetaData
Connection getConnection() throws SQLException;
/**
+ * This method tests whether the databse supports savepoints.
+ *
+ * @return <code>true</code> if the database supports savepoints,
+ * <code>false</code> if it does not.
+ * @exception SQLException If an error occurs.
+ * @see Savepoint
* @since 1.4
*/
boolean supportsSavepoints() throws SQLException;
/**
+ * This method tests whether the database supports named parameters.
+ *
+ * @return <code>true</code> if the database supports named parameters,
+ * <code>false</code> if it does not.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
boolean supportsNamedParameters() throws SQLException;
/**
+ * This method tests whether the database supports returning multiple
+ * <code>ResultSet</code>S from a <code>CallableStatement</code> at once.
+ *
+ * @return <code>true</code> if the database supports returnig multiple
+ * results at once, <code>false</code> if it does not.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
boolean supportsMultipleOpenResults() throws SQLException;
@@ -2152,47 +2177,78 @@ public interface DatabaseMetaData
* @since 1.4
*/
ResultSet getSuperTypes(String catalog, String schemaPattern,
- String typeNamePattern) throws SQLException;
+ String typePattern) throws SQLException;
/**
* @since 1.4
*/
ResultSet getSuperTables(String catalog, String schemaPattern,
- String tableNamePattern) throws SQLException;
+ String tablePattern) throws SQLException;
/**
* @since 1.4
*/
ResultSet getAttributes(String catalog, String schemaPattern, String
- typeNamePattern, String attributeNamePattern) throws SQLException;
+ typePattern, String attributePattern) throws SQLException;
/**
+ * This method tests if the database supports the specified holdability type.
+ * Valid values for this parameter are specified in the
+ * <code>ResultSet</code> class.
+ *
+ * @param holdability The holdability type to test.
+ * @return <code>true</code> if the database supports the holdability type,
+ * <code>false</code> if it does not.
+ * @exception SQLException If an error occurs.
+ * @see ResultSet
* @since 1.4
*/
boolean supportsResultSetHoldability(int holdability)
throws SQLException;
/**
+ * This method returns the default holdability type of <code>ResultSet</code>S
+ * retrieved from this database. The possible values are specified in the
+ * <code>ResultSet</code> class.
+ *
+ * @return The default holdability type.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
int getResultSetHoldability() throws SQLException;
/**
+ * This method returns the major version number of the database.
+ *
+ * @return The major version number of the database.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
int getDatabaseMajorVersion() throws SQLException;
/**
+ * This method returns the minor version number of the database.
+ *
+ * @return The minor version number of the database.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
int getDatabaseMinorVersion() throws SQLException;
/**
+ * This method returns the major version number of the JDBC driver.
+ *
+ * @return The major version number of the JDBC driver.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
int getJDBCMajorVersion() throws SQLException;
/**
+ * This method returns the minor version number of the JDBC driver.
+ *
+ * @return The minor version number of the database.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
int getJDBCMinorVersion() throws SQLException;
diff --git a/java/sql/Date.java b/java/sql/Date.java
index d429cc826..f4c330709 100644
--- a/java/sql/Date.java
+++ b/java/sql/Date.java
@@ -1,5 +1,5 @@
/* Date.java -- Wrapper around java.util.Date
- Copyright (C) 1999, 2000, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2003, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -72,10 +72,10 @@ public class Date extends java.util.Date
/**
* This method initializes a new instance of this class with the
- * specified time value representing the number of seconds since
+ * specified time value representing the number of milliseconds since
* Jan 1, 1970 at 12:00 midnight GMT.
*
- * @param time The time value to intialize this date to.
+ * @param date The time value to intialize this date to.
*/
public Date(long date)
{
diff --git a/java/sql/Driver.java b/java/sql/Driver.java
index 10f83ef2f..277dd1713 100644
--- a/java/sql/Driver.java
+++ b/java/sql/Driver.java
@@ -1,5 +1,5 @@
/* Driver.java -- A JDBC driver
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -68,7 +68,7 @@ public interface Driver
* connection, or <code>null</code> if the URL is not understood.
* @exception SQLException If an error occurs.
*/
- Connection connect(String url, Properties info) throws SQLException;
+ Connection connect(String url, Properties properties) throws SQLException;
/**
* This method tests whether or not the driver believes it can connect to
@@ -76,7 +76,7 @@ public interface Driver
* understands and accepts the URL. It should not necessarily attempt to
* probe the database for a connection.
*
- * @param The database URL string.
+ * @param url The database URL string.
* @return <code>true</code> if the drivers can connect to the database,
* <code>false</code> otherwise.
* @exception SQLException If an error occurs.
diff --git a/java/sql/DriverManager.java b/java/sql/DriverManager.java
index 9e252abcc..94f743b92 100644
--- a/java/sql/DriverManager.java
+++ b/java/sql/DriverManager.java
@@ -1,5 +1,6 @@
/* DriverManager.java -- Manage JDBC drivers
- Copyright (C) 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2003, 2004, 2006
+ Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -292,11 +293,11 @@ public class DriverManager
* This method set the login timeout used by JDBC drivers. This is a
* system-wide parameter that applies to all drivers.
*
- * @param login_timeout The new login timeout value.
+ * @param seconds The new login timeout value.
*/
public static void setLoginTimeout(int seconds)
{
- DriverManager.login_timeout = login_timeout;
+ DriverManager.login_timeout = seconds;
}
/**
@@ -312,20 +313,18 @@ public class DriverManager
/**
* This method sets the log stream in use by JDBC.
*
- * @param log_stream The log stream in use by JDBC.
- *
+ * @param stream The log stream in use by JDBC.
* @deprecated Use <code>setLogWriter</code> instead.
*/
- public static void setLogStream(PrintStream out)
+ public static void setLogStream(PrintStream stream)
{
- DriverManager.log_stream = log_stream;
+ DriverManager.log_stream = stream;
}
/**
* This method returns the log stream in use by JDBC.
*
* @return The log stream in use by JDBC.
- *
* @deprecated Use <code>getLogWriter()</code> instead.
*/
public static PrintStream getLogStream()
@@ -336,7 +335,7 @@ public class DriverManager
/**
* This method prints the specified line to the log stream.
*
- * @param str The string to write to the log stream.
+ * @param message The string to write to the log stream.
*/
public static void println(String message)
{
diff --git a/java/sql/PreparedStatement.java b/java/sql/PreparedStatement.java
index 3aedbc593..ca7eb2c5d 100644
--- a/java/sql/PreparedStatement.java
+++ b/java/sql/PreparedStatement.java
@@ -1,5 +1,5 @@
/* PreparedStatement.java -- Interface for pre-compiled statements.
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,6 +48,8 @@ import java.util.Calendar;
* statements. This provides greater efficiency when calling the same
* statement multiple times. Parameters are allowed in a statement,
* providings for maximum reusability.
+ *
+ * <p> Note that in this class parameter indices start at 1, not 0.</p>
*
* @author Aaron M. Renn (arenn@urbanophile.com)
*/
@@ -76,11 +78,12 @@ public interface PreparedStatement extends Statement
* for the specified type.
*
* @param index The index of the parameter to set.
- * @param type The SQL type identifier of the parameter from <code>Types</code>
+ * @param sqlType The SQL type identifier of the parameter from
+ * <code>Types</code>
*
* @exception SQLException If an error occurs.
*/
- void setNull(int parameterIndex, int sqlType) throws SQLException;
+ void setNull(int index, int sqlType) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -90,7 +93,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setBoolean(int parameterIndex, boolean x) throws SQLException;
+ void setBoolean(int index, boolean value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -100,7 +103,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setByte(int parameterIndex, byte x) throws SQLException;
+ void setByte(int index, byte value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -110,7 +113,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setShort(int parameterIndex, short x) throws SQLException;
+ void setShort(int index, short value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -120,7 +123,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setInt(int parameterIndex, int x) throws SQLException;
+ void setInt(int index, int value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -130,7 +133,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setLong(int parameterIndex, long x) throws SQLException;
+ void setLong(int index, long value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -140,7 +143,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setFloat(int parameterIndex, float x) throws SQLException;
+ void setFloat(int index, float value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -150,7 +153,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setDouble(int parameterIndex, double x) throws SQLException;
+ void setDouble(int index, double value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -160,7 +163,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setBigDecimal(int parameterIndex, BigDecimal x) throws
+ void setBigDecimal(int index, BigDecimal value) throws
SQLException;
/**
@@ -171,7 +174,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setString(int parameterIndex, String x) throws SQLException;
+ void setString(int index, String value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -181,7 +184,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setBytes(int parameterIndex, byte[] x) throws SQLException;
+ void setBytes(int index, byte[] value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -191,7 +194,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setDate(int parameterIndex, Date x) throws SQLException;
+ void setDate(int index, Date value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -201,7 +204,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setTime(int parameterIndex, Time x) throws SQLException;
+ void setTime(int index, Time value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -211,7 +214,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setTimestamp(int parameterIndex, Timestamp x)
+ void setTimestamp(int index, Timestamp value)
throws SQLException;
/**
@@ -219,11 +222,11 @@ public interface PreparedStatement extends Statement
* ASCII <code>InputStream</code> value.
*
* @param index The index of the parameter value to set.
- * @param value The value of the parameter.
- * @param length The number of bytes in the stream.
+ * @param stream The stream from which the parameter value is read.
+ * @param count The number of bytes in the stream.
* @exception SQLException If an error occurs.
*/
- void setAsciiStream(int parameterIndex, InputStream x, int length)
+ void setAsciiStream(int index, InputStream stream, int count)
throws SQLException;
/**
@@ -231,12 +234,12 @@ public interface PreparedStatement extends Statement
* Unicode UTF-8 <code>InputStream</code> value.
*
* @param index The index of the parameter value to set.
- * @param value The value of the parameter.
- * @param length The number of bytes in the stream.
+ * @param stream The stream from which the parameter value is read.
+ * @param count The number of bytes in the stream.
* @exception SQLException If an error occurs.
* @deprecated
*/
- void setUnicodeStream(int parameterIndex, InputStream x, int length)
+ void setUnicodeStream(int index, InputStream stream, int count)
throws SQLException;
/**
@@ -244,11 +247,11 @@ public interface PreparedStatement extends Statement
* binary <code>InputStream</code> value.
*
* @param index The index of the parameter value to set.
- * @param value The value of the parameter.
- * @param length The number of bytes in the stream.
+ * @param stream The stream from which the parameter value is read.
+ * @param count The number of bytes in the stream.
* @exception SQLException If an error occurs.
*/
- void setBinaryStream(int parameterIndex, InputStream x, int length)
+ void setBinaryStream(int index, InputStream stream, int count)
throws SQLException;
/**
@@ -265,13 +268,14 @@ public interface PreparedStatement extends Statement
*
* @param index The index of the parameter value to set.
* @param value The value of the parameter.
- * @param type The SQL type to use for the parameter, from <code>Types</code>
+ * @param sqlType The SQL type to use for the parameter, from
+ * <code>Types</code>
* @param scale The scale of the value, for numeric values only.
* @exception SQLException If an error occurs.
* @see Types
*/
- void setObject(int parameterIndex, Object x, int targetSqlType,
- int scale) throws SQLException;
+ void setObject(int index, Object value, int sqlType, int scale)
+ throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -279,11 +283,12 @@ public interface PreparedStatement extends Statement
*
* @param index The index of the parameter value to set.
* @param value The value of the parameter.
- * @param type The SQL type to use for the parameter, from <code>Types</code>
+ * @param sqlType The SQL type to use for the parameter, from
+ * <code>Types</code>
* @exception SQLException If an error occurs.
* @see Types
*/
- void setObject(int parameterIndex, Object x, int targetSqlType)
+ void setObject(int index, Object value, int sqlType)
throws SQLException;
/**
@@ -295,7 +300,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setObject(int parameterIndex, Object x) throws SQLException;
+ void setObject(int index, Object value) throws SQLException;
/**
* This method executes a prepared SQL query.
@@ -319,12 +324,12 @@ public interface PreparedStatement extends Statement
* character <code>Reader</code> value.
*
* @param index The index of the parameter value to set.
- * @param value The value of the parameter.
- * @param length The number of bytes in the stream.
+ * @param reader The reader from which the parameter value is read.
+ * @param count The number of characters in the stream.
* @exception SQLException If an error occurs.
*/
- void setCharacterStream(int parameterIndex, Reader reader,
- int length) throws SQLException;
+ void setCharacterStream(int index, Reader reader, int count)
+ throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -332,10 +337,10 @@ public interface PreparedStatement extends Statement
* will be used.
*
* @param index The index of the parameter value to set.
- * @param value The value of the parameter.
+ * @param value The <code>Ref</code> used to set the value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setRef(int i, Ref x) throws SQLException;
+ void setRef(int index, Ref value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -343,10 +348,11 @@ public interface PreparedStatement extends Statement
* will be used.
*
* @param index The index of the parameter value to set.
- * @param value The value of the parameter.
+ * @param value The <code>Blob</code> used to set the
+ * value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setBlob(int i, Blob x) throws SQLException;
+ void setBlob(int index, Blob value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -354,10 +360,11 @@ public interface PreparedStatement extends Statement
* will be used.
*
* @param index The index of the parameter value to set.
- * @param value The value of the parameter.
+ * @param value The <code>Clob</code> used to set the
+ * value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setClob(int i, Clob x) throws SQLException;
+ void setClob(int index, Clob value) throws SQLException;
/**
* This method sets the specified parameter from the given Java
@@ -368,7 +375,7 @@ public interface PreparedStatement extends Statement
* @param value The value of the parameter.
* @exception SQLException If an error occurs.
*/
- void setArray(int i, Array x) throws SQLException;
+ void setArray(int index, Array value) throws SQLException;
/**
* This method returns meta data for the result set from this statement.
@@ -384,10 +391,10 @@ public interface PreparedStatement extends Statement
*
* @param index The index of the parameter value to set.
* @param value The value of the parameter.
- * @param calendar The <code>Calendar</code> to use for timezone and locale.
+ * @param cal The <code>Calendar</code> to use for timezone and locale.
* @exception SQLException If an error occurs.
*/
- void setDate(int parameterIndex, Date x, Calendar cal)
+ void setDate(int index, Date value, Calendar cal)
throws SQLException;
/**
@@ -396,10 +403,10 @@ public interface PreparedStatement extends Statement
*
* @param index The index of the parameter value to set.
* @param value The value of the parameter.
- * @param calendar The <code>Calendar</code> to use for timezone and locale.
+ * @param cal The <code>Calendar</code> to use for timezone and locale.
* @exception SQLException If an error occurs.
*/
- void setTime(int parameterIndex, Time x, Calendar cal)
+ void setTime(int index, Time value, Calendar cal)
throws SQLException;
/**
@@ -408,10 +415,10 @@ public interface PreparedStatement extends Statement
*
* @param index The index of the parameter value to set.
* @param value The value of the parameter.
- * @param calendar The <code>Calendar</code> to use for timezone and locale.
+ * @param cal The <code>Calendar</code> to use for timezone and locale.
* @exception SQLException If an error occurs.
*/
- void setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
+ void setTimestamp(int index, Timestamp value, Calendar cal)
throws SQLException;
/**
@@ -419,19 +426,32 @@ public interface PreparedStatement extends Statement
* for the specified type.
*
* @param index The index of the parameter to set.
- * @param type The SQL type identifier of the parameter from <code>Types</code>
- * @param name The name of the data type, for user defined types.
+ * @param sqlType The SQL type identifier of the parameter from
+ * <code>Types</code>
+ * @param typeName The name of the data type, for user defined types.
* @exception SQLException If an error occurs.
*/
- void setNull(int paramIndex, int sqlType, String typeName)
+ void setNull(int index, int sqlType, String typeName)
throws SQLException;
/**
+ * This method sets the specified parameter from the given Java
+ * <code>java.net.URL</code> value.
+ *
+ * @param index The index of the parameter to set.
+ * @param value The value of the parameter.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void setURL(int parameterIndex, URL x) throws SQLException;
+ void setURL(int index, URL value) throws SQLException;
/**
+ * Returns information about the parameters set on this
+ * <code>PreparedStatement</code> (see {@link ParameterMetaData} for a
+ * detailed description of the provided information).
+ *
+ * @return Meta data for the parameters of this statement.
+ * @see ParameterMetaData
* @since 1.4
*/
ParameterMetaData getParameterMetaData() throws SQLException;
diff --git a/java/sql/ResultSet.java b/java/sql/ResultSet.java
index 97f2897d4..79cba63d4 100644
--- a/java/sql/ResultSet.java
+++ b/java/sql/ResultSet.java
@@ -1,5 +1,5 @@
/* ResultSet.java -- A SQL statement result set.
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -138,7 +138,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>String</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>String</code>.
* @exception SQLException If an error occurs.
*/
@@ -148,7 +148,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>boolean</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>boolean</code>.
* @exception SQLException If an error occurs.
*/
@@ -158,7 +158,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>byte</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>byte</code>.
* @exception SQLException If an error occurs.
*/
@@ -168,7 +168,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>short</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>short</code>.
* @exception SQLException If an error occurs.
*/
@@ -178,7 +178,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>int</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>int</code>.
* @exception SQLException If an error occurs.
*/
@@ -188,7 +188,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>long</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>long</code>.
* @exception SQLException If an error occurs.
*/
@@ -198,7 +198,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>float</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>float</code>.
* @exception SQLException If an error occurs.
*/
@@ -208,7 +208,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>double</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>double</code>.
* @exception SQLException If an error occurs.
*/
@@ -218,7 +218,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>BigDecimal</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @param scale The number of digits to the right of the decimal to return.
* @return The column value as a <code>BigDecimal</code>.
* @exception SQLException If an error occurs.
@@ -231,7 +231,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* byte array.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a byte array
* @exception SQLException If an error occurs.
*/
@@ -241,7 +241,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>java.sql.Date</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>java.sql.Date</code>.
* @exception SQLException If an error occurs.
*/
@@ -251,7 +251,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>java.sql.Time</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>java.sql.Time</code>.
* @exception SQLException If an error occurs.
*/
@@ -261,7 +261,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>java.sql.Timestamp</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>java.sql.Timestamp</code>.
* @exception SQLException If an error occurs.
*/
@@ -274,7 +274,7 @@ public interface ResultSet
* calling <code>next()</code> or <code>close()</code> on this result set
* will close this stream as well.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as an ASCII <code>InputStream</code>.
* @exception SQLException If an error occurs.
*/
@@ -287,7 +287,7 @@ public interface ResultSet
* calling <code>next()</code> or <code>close()</code> on this result set
* will close this stream as well.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a Unicode UTF-8 <code>InputStream</code>.
* @exception SQLException If an error occurs.
* @deprecated Use getCharacterStream instead.
@@ -301,7 +301,7 @@ public interface ResultSet
* calling <code>next()</code> or <code>close()</code> on this result set
* will close this stream as well.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a raw byte <code>InputStream</code>.
* @exception SQLException If an error occurs.
*/
@@ -311,7 +311,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>String</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>String</code>.
* @exception SQLException If an error occurs.
*/
@@ -321,7 +321,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>boolean</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>boolean</code>.
* @exception SQLException If an error occurs.
*/
@@ -331,7 +331,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>byte</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>byte</code>.
* @exception SQLException If an error occurs.
*/
@@ -341,7 +341,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>short</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>short</code>.
* @exception SQLException If an error occurs.
*/
@@ -351,7 +351,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>int</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>int</code>.
* @exception SQLException If an error occurs.
*/
@@ -361,7 +361,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>long</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>long</code>.
* @exception SQLException If an error occurs.
*/
@@ -371,7 +371,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>float</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>float</code>.
* @exception SQLException If an error occurs.
*/
@@ -381,7 +381,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>double</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>double</code>.
* @exception SQLException If an error occurs.
*/
@@ -391,7 +391,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>BigDecimal</code>.
*
- * @param index The index of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>BigDecimal</code>.
* @exception SQLException If an error occurs.
* @deprecated
@@ -403,7 +403,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* byte array.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a byte array
* @exception SQLException If an error occurs.
*/
@@ -413,7 +413,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>java.sql.Date</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>java.sql.Date</code>.
* @exception SQLException If an error occurs.
*/
@@ -423,7 +423,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>java.sql.Time</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>java.sql.Time</code>.
* @exception SQLException If an error occurs.
*/
@@ -433,7 +433,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>java.sql.Timestamp</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>java.sql.Timestamp</code>.
* @exception SQLException If an error occurs.
*/
@@ -446,7 +446,7 @@ public interface ResultSet
* calling <code>next()</code> or <code>close()</code> on this result set
* will close this stream as well.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as an ASCII <code>InputStream</code>.
* @exception SQLException If an error occurs.
*/
@@ -459,7 +459,7 @@ public interface ResultSet
* calling <code>next()</code> or <code>close()</code> on this result set
* will close this stream as well.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a Unicode UTF-8 <code>InputStream</code>.
* @exception SQLException If an error occurs.
* @deprecated Use getCharacterStream instead.
@@ -473,7 +473,7 @@ public interface ResultSet
* calling <code>next()</code> or <code>close()</code> on this result set
* will close this stream as well.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a raw byte <code>InputStream</code>.
* @exception SQLException If an error occurs.
*/
@@ -518,7 +518,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>Object</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as an <code>Object</code>.
* @exception SQLException If an error occurs.
*/
@@ -528,7 +528,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>Object</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as an <code>Object</code>.
* @exception SQLException If an error occurs.
*/
@@ -537,7 +537,7 @@ public interface ResultSet
/**
* This method returns the column index of the specified named column.
*
- * @param column The name of the column.
+ * @param columnName The name of the column.
* @return The index of the column.
* @exception SQLException If an error occurs.
*/
@@ -550,7 +550,7 @@ public interface ResultSet
* calling <code>next()</code> or <code>close()</code> on this result set
* will close this stream as well.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as an character <code>Reader</code>.
* @exception SQLException If an error occurs.
*/
@@ -563,7 +563,7 @@ public interface ResultSet
* calling <code>next()</code> or <code>close()</code> on this result set
* will close this stream as well.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as an character <code>Reader</code>.
* @exception SQLException If an error occurs.
*/
@@ -573,7 +573,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>BigDecimal</code>.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return The column value as a <code>BigDecimal</code>.
* @exception SQLException If an error occurs.
*/
@@ -583,7 +583,7 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>BigDecimal</code>.
*
- * @param column The name of the column to return.
+ * @param columnName The name of the column to return.
* @return The column value as a <code>BigDecimal</code>.
* @exception SQLException If an error occurs.
*/
@@ -692,7 +692,7 @@ public interface ResultSet
* This method moves the result set position relative to the current row.
* The offset can be positive or negative.
*
- * @param row The relative row position to move to.
+ * @param rows The number of row positions to move.
* @return <code>true</code> if the current position was changed,
* <code>false</code> otherwise.
* @exception SQLException If an error occurs.
@@ -713,7 +713,9 @@ public interface ResultSet
* This method provides a hint to the driver about which direction the
* result set will be processed in.
*
- * @param direction The direction in which rows will be processed. (Values?)
+ * @param direction The direction in which rows will be processed. The
+ * allowed values are the <code>FETCH_*</code> constants
+ * defined in this interface.
* @exception SQLException If an error occurs.
*/
void setFetchDirection(int direction) throws SQLException;
@@ -746,7 +748,7 @@ public interface ResultSet
/**
* This method returns the result set type of this result set. This will
- * be one of the TYPE_* constants defined in this interface.
+ * be one of the <code>TYPE_*</code> constants defined in this interface.
*
* @return The result set type.
* @exception SQLException If an error occurs.
@@ -755,7 +757,7 @@ public interface ResultSet
/**
* This method returns the concurrency type of this result set. This will
- * be one of the CONCUR_* constants defined in this interface.
+ * be one of the <code>CONCUR_*</code> constants defined in this interface.
*
* @return The result set concurrency type.
* @exception SQLException If an error occurs.
@@ -800,7 +802,7 @@ public interface ResultSet
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @return index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @exception SQLException If an error occurs.
*/
void updateNull(int columnIndex) throws SQLException;
@@ -810,88 +812,88 @@ public interface ResultSet
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateBoolean(int columnIndex, boolean x) throws SQLException;
+ void updateBoolean(int columnIndex, boolean value) throws SQLException;
/**
* This method updates the specified column to have a byte value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateByte(int columnIndex, byte x) throws SQLException;
+ void updateByte(int columnIndex, byte value) throws SQLException;
/**
* This method updates the specified column to have a short value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateShort(int columnIndex, short x) throws SQLException;
+ void updateShort(int columnIndex, short value) throws SQLException;
/**
* This method updates the specified column to have an int value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateInt(int columnIndex, int x) throws SQLException;
+ void updateInt(int columnIndex, int value) throws SQLException;
/**
* This method updates the specified column to have a long value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateLong(int columnIndex, long x) throws SQLException;
+ void updateLong(int columnIndex, long value) throws SQLException;
/**
* This method updates the specified column to have a float value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateFloat(int columnIndex, float x) throws SQLException;
+ void updateFloat(int columnIndex, float value) throws SQLException;
/**
* This method updates the specified column to have a double value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateDouble(int columnIndex, double x) throws SQLException;
+ void updateDouble(int columnIndex, double value) throws SQLException;
/**
* This method updates the specified column to have a BigDecimal value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateBigDecimal(int columnIndex, BigDecimal x)
+ void updateBigDecimal(int columnIndex, BigDecimal value)
throws SQLException;
/**
@@ -899,55 +901,55 @@ public interface ResultSet
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateString(int columnIndex, String x) throws SQLException;
+ void updateString(int columnIndex, String value) throws SQLException;
/**
* This method updates the specified column to have a byte array value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateBytes(int columnIndex, byte[] x) throws SQLException;
+ void updateBytes(int columnIndex, byte[] value) throws SQLException;
/**
* This method updates the specified column to have a java.sql.Date value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateDate(int columnIndex, Date x) throws SQLException;
+ void updateDate(int columnIndex, Date value) throws SQLException;
/**
* This method updates the specified column to have a java.sql.Time value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateTime(int columnIndex, Time x) throws SQLException;
+ void updateTime(int columnIndex, Time value) throws SQLException;
/**
* This method updates the specified column to have a java.sql.Timestamp value.
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateTimestamp(int columnIndex, Timestamp x)
+ void updateTimestamp(int columnIndex, Timestamp value)
throws SQLException;
/**
@@ -955,12 +957,12 @@ public interface ResultSet
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
- * @param value The new value of the column.
- * @param length The length of the stream.
+ * @param columnIndex The index of the column to update.
+ * @param stream The stream from which the column value is updated.
+ * @param count The length of the stream.
* @exception SQLException If an error occurs.
*/
- void updateAsciiStream(int columnIndex, InputStream x, int length)
+ void updateAsciiStream(int columnIndex, InputStream stream, int count)
throws SQLException;
/**
@@ -968,12 +970,12 @@ public interface ResultSet
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
- * @param value The new value of the column.
- * @param length The length of the stream.
+ * @param columnIndex The index of the column to update.
+ * @param stream The stream from which the column value is updated.
+ * @param count The length of the stream.
* @exception SQLException If an error occurs.
*/
- void updateBinaryStream(int columnIndex, InputStream x, int length)
+ void updateBinaryStream(int columnIndex, InputStream stream, int count)
throws SQLException;
/**
@@ -981,12 +983,12 @@ public interface ResultSet
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
- * @param value The new value of the column.
- * @param length The length of the stream.
+ * @param columnIndex The index of the column to update.
+ * @param reader The reader from which the column value is updated.
+ * @param count The length of the stream.
* @exception SQLException If an error occurs.
*/
- void updateCharacterStream(int columnIndex, Reader x, int length)
+ void updateCharacterStream(int columnIndex, Reader reader, int count)
throws SQLException;
/**
@@ -994,12 +996,13 @@ public interface ResultSet
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
- *
+ * @param scale The scale of the object in question, which is used only
+ * for numeric type objects.
* @exception SQLException If an error occurs.
*/
- void updateObject(int columnIndex, Object x, int scale)
+ void updateObject(int columnIndex, Object value, int scale)
throws SQLException;
/**
@@ -1007,20 +1010,18 @@ public interface ResultSet
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param index The index of the column to update.
+ * @param columnIndex The index of the column to update.
* @param value The new value of the column.
- * @param scale The scale of the object in question, which is used only
- * for numeric type objects.
* @exception SQLException If an error occurs.
*/
- void updateObject(int columnIndex, Object x) throws SQLException;
+ void updateObject(int columnIndex, Object value) throws SQLException;
/**
* This method updates the specified column to have a NULL value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @return name The name of the column to update.
+ * @param columnName The name of the column to update.
* @exception SQLException If an error occurs.
*/
void updateNull(String columnName) throws SQLException;
@@ -1030,88 +1031,88 @@ public interface ResultSet
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateBoolean(String columnName, boolean x) throws SQLException;
+ void updateBoolean(String columnName, boolean value) throws SQLException;
/**
* This method updates the specified column to have a byte value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateByte(String columnName, byte x) throws SQLException;
+ void updateByte(String columnName, byte value) throws SQLException;
/**
* This method updates the specified column to have a short value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateShort(String columnName, short x) throws SQLException;
+ void updateShort(String columnName, short value) throws SQLException;
/**
* This method updates the specified column to have an int value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateInt(String columnName, int x) throws SQLException;
+ void updateInt(String columnName, int value) throws SQLException;
/**
* This method updates the specified column to have a long value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateLong(String columnName, long x) throws SQLException;
+ void updateLong(String columnName, long value) throws SQLException;
/**
* This method updates the specified column to have a float value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateFloat(String columnName, float x) throws SQLException;
+ void updateFloat(String columnName, float value) throws SQLException;
/**
* This method updates the specified column to have a double value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateDouble(String columnName, double x) throws SQLException;
+ void updateDouble(String columnName, double value) throws SQLException;
/**
* This method updates the specified column to have a BigDecimal value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateBigDecimal(String columnName, BigDecimal x)
+ void updateBigDecimal(String columnName, BigDecimal value)
throws SQLException;
/**
@@ -1119,55 +1120,55 @@ public interface ResultSet
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateString(String columnName, String x) throws SQLException;
+ void updateString(String columnName, String value) throws SQLException;
/**
* This method updates the specified column to have a byte array value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateBytes(String columnName, byte[] x) throws SQLException;
+ void updateBytes(String columnName, byte[] value) throws SQLException;
/**
* This method updates the specified column to have a java.sql.Date value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateDate(String columnName, Date x) throws SQLException;
+ void updateDate(String columnName, Date value) throws SQLException;
/**
* This method updates the specified column to have a java.sql.Time value. This
* does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateTime(String columnName, Time x) throws SQLException;
+ void updateTime(String columnName, Time value) throws SQLException;
/**
* This method updates the specified column to have a java.sql.Timestamp value.
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
* @exception SQLException If an error occurs.
*/
- void updateTimestamp(String columnName, Timestamp x)
+ void updateTimestamp(String columnName, Timestamp value)
throws SQLException;
/**
@@ -1175,12 +1176,12 @@ public interface ResultSet
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
- * @param value The new value of the column.
- * @param length The length of the stream.
+ * @param columnName The name of the column to update.
+ * @param stream The stream from which the column value is updated.
+ * @param count The length of the stream.
* @exception SQLException If an error occurs.
*/
- void updateAsciiStream(String columnName, InputStream x, int length)
+ void updateAsciiStream(String columnName, InputStream stream, int count)
throws SQLException;
/**
@@ -1188,12 +1189,12 @@ public interface ResultSet
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
- * @param value The new value of the column.
- * @param length The length of the stream.
+ * @param columnName The name of the column to update.
+ * @param stream The stream from which the column value is updated.
+ * @param count The length of the stream.
* @exception SQLException If an error occurs.
*/
- void updateBinaryStream(String columnName, InputStream x, int length)
+ void updateBinaryStream(String columnName, InputStream stream, int count)
throws SQLException;
/**
@@ -1201,25 +1202,26 @@ public interface ResultSet
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
- * @param value The new value of the column.
- * @param length The length of the stream.
- *
+ * @param columnName The name of the column to update.
+ * @param reader The reader from which the column value is updated.
+ * @param count The length of the stream.
* @exception SQLException If an error occurs.
*/
- void updateCharacterStream(String columnName, Reader reader,
- int length) throws SQLException;
+ void updateCharacterStream(String columnName, Reader reader, int count)
+ throws SQLException;
/**
* This method updates the specified column to have an Object value.
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
+ * @param scale The scale of the object in question, which is used only
+ * for numeric type objects.
* @exception SQLException If an error occurs.
*/
- void updateObject(String columnName, Object x, int scale)
+ void updateObject(String columnName, Object value, int scale)
throws SQLException;
/**
@@ -1227,13 +1229,11 @@ public interface ResultSet
* This does not update the actual database. <code>updateRow</code> must be
* called in order to do that.
*
- * @param name The name of the column to update.
+ * @param columnName The name of the column to update.
* @param value The new value of the column.
- * @param scale The scale of the object in question, which is used only
- * for numeric type objects.
* @exception SQLException If an error occurs.
*/
- void updateObject(String columnName, Object x) throws SQLException;
+ void updateObject(String columnName, Object value) throws SQLException;
/**
* This method inserts the current row into the database. The result set
@@ -1304,97 +1304,97 @@ public interface ResultSet
* This method returns the value of the specified column as a Java
* <code>Object</code> using the specified SQL type to Java type map.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @param map The SQL type to Java type map to use.
* @return The value of the column as an <code>Object</code>.
* @exception SQLException If an error occurs.
*/
- Object getObject(int i, Map map) throws SQLException;
+ Object getObject(int columnIndex, Map map) throws SQLException;
/**
* This method returns a <code>Ref</code> for the specified column which
* represents the structured type for the column.
*
- * @param index The index of the column to return.
+ * @param columnIndex The index of the column to return.
* @return A <code>Ref</code> object for the column
* @exception SQLException If an error occurs.
*/
- Ref getRef(int i) throws SQLException;
+ Ref getRef(int columnIndex) throws SQLException;
/**
* This method returns the specified column value as a BLOB.
*
- * @param index The index of the column value to return.
+ * @param columnIndex The index of the column value to return.
* @return The value of the column as a BLOB.
* @exception SQLException If an error occurs.
*/
- Blob getBlob(int i) throws SQLException;
+ Blob getBlob(int columnIndex) throws SQLException;
/**
* This method returns the specified column value as a CLOB.
*
- * @param index The index of the column value to return.
+ * @param columnIndex The index of the column value to return.
* @return The value of the column as a CLOB.
* @exception SQLException If an error occurs.
*/
- Clob getClob(int i) throws SQLException;
+ Clob getClob(int columnIndex) throws SQLException;
/**
* This method returns the specified column value as an <code>Array</code>.
*
- * @param index The index of the column value to return.
+ * @param columnIndex The index of the column value to return.
* @return The value of the column as an <code>Array</code>.
* @exception SQLException If an error occurs.
*/
- Array getArray(int i) throws SQLException;
+ Array getArray(int columnIndex) throws SQLException;
/**
* This method returns the value of the specified column as a Java
* <code>Object</code> using the specified SQL type to Java type map.
*
- * @param name The name of the column to return.
+ * @param columnName The name of the column to return.
* @param map The SQL type to Java type map to use.
* @return The value of the column as an <code>Object</code>.
* @exception SQLException If an error occurs.
*/
- Object getObject(String colName, Map map) throws SQLException;
+ Object getObject(String columnName, Map map) throws SQLException;
/**
* This method returns a <code>Ref</code> for the specified column which
* represents the structured type for the column.
*
- * @param index The index of the column to return.
+ * @param columnName The name of the column to return.
* @return A <code>Ref</code> object for the column
* @exception SQLException If an error occurs.
*/
- Ref getRef(String colName) throws SQLException;
+ Ref getRef(String columnName) throws SQLException;
/**
* This method returns the specified column value as a BLOB.
*
- * @param name The name of the column value to return.
+ * @param columnName The name of the column value to return.
* @return The value of the column as a BLOB.
* @exception SQLException If an error occurs.
*/
- Blob getBlob(String colName) throws SQLException;
+ Blob getBlob(String columnName) throws SQLException;
/**
* This method returns the specified column value as a CLOB.
*
- * @param name The name of the column value to return.
+ * @param columnName The name of the column value to return.
* @return The value of the column as a CLOB.
* @exception SQLException If an error occurs.
*/
- Clob getClob(String colName) throws SQLException;
+ Clob getClob(String columnName) throws SQLException;
/**
* This method returns the specified column value as an <code>Array</code>.
*
- * @param name The name of the column value to return.
+ * @param columnName The name of the column value to return.
* @return The value of the column as an <code>Array</code>.
* @exception SQLException If an error occurs.
*/
- Array getArray(String colName) throws SQLException;
+ Array getArray(String columnName) throws SQLException;
/**
* This method returns the specified column value as a
@@ -1402,7 +1402,7 @@ public interface ResultSet
* to generate a value for the date if the database does not support
* timezones.
*
- * @param index The index of the column value to return.
+ * @param columnIndex The index of the column value to return.
* @param cal The <code>Calendar</code> to use for calculating timezones.
* @return The value of the column as a <code>java.sql.Date</code>.
* @exception SQLException If an error occurs.
@@ -1415,7 +1415,7 @@ public interface ResultSet
* to generate a value for the date if the database does not support
* timezones.
*
- * @param name The name of the column value to return.
+ * @param columnName The name of the column value to return.
* @param cal The <code>Calendar</code> to use for calculating timezones.
* @return The value of the column as a <code>java.sql.Date</code>.
* @exception SQLException If an error occurs.
@@ -1428,7 +1428,7 @@ public interface ResultSet
* to generate a value for the time if the database does not support
* timezones.
*
- * @param index The index of the column value to return.
+ * @param columnIndex The index of the column value to return.
* @param cal The <code>Calendar</code> to use for calculating timezones.
* @return The value of the column as a <code>java.sql.Time</code>.
* @exception SQLException If an error occurs.
@@ -1441,7 +1441,7 @@ public interface ResultSet
* to generate a value for the time if the database does not support
* timezones.
*
- * @param name The name of the column value to return.
+ * @param columnName The name of the column value to return.
* @param cal The <code>Calendar</code> to use for calculating timezones.
* @return The value of the column as a <code>java.sql.Time</code>.
* @exception SQLException If an error occurs.
@@ -1454,7 +1454,7 @@ public interface ResultSet
* to generate a value for the timestamp if the database does not support
* timezones.
*
- * @param index The index of the column value to return.
+ * @param columnIndex The index of the column value to return.
* @param cal The <code>Calendar</code> to use for calculating timezones.
* @return The value of the column as a <code>java.sql.Timestamp</code>.
* @exception SQLException If an error occurs.
@@ -1468,7 +1468,7 @@ public interface ResultSet
* to generate a value for the timestamp if the database does not support
* timezones.
*
- * @param name The name of the column value to return.
+ * @param columnName The name of the column value to return.
* @param cal The <code>Calendar</code> to use for calculating timezones.
*
* @return The value of the column as a <code>java.sql.Timestamp</code>.
@@ -1479,52 +1479,132 @@ public interface ResultSet
throws SQLException;
/**
+ * This method returns the specified column value as a
+ * <code>java.net.URL</code>.
+ *
+ * @param columnIndex The index of the column value to return.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
URL getURL(int columnIndex) throws SQLException;
/**
+ * This method returns the specified column value as a
+ * <code>java.net.URL</code>.
+ *
+ * @param columnName The name of the column value to return.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
URL getURL(String columnName) throws SQLException;
/**
+ * This method updates the specified column to have a
+ * <code>java.sql.Ref</code> value.
+ * This does not update the actual database. <code>updateRow</code> must be
+ * called in order to do that.
+ *
+ * @parm columnIndex The index of the column value to update.
+ * @parm value The <code>java.sql.Ref</code> used to set the new value
+ * of the column.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void updateRef(int columnIndex, Ref x) throws SQLException;
+ void updateRef(int columnIndex, Ref value) throws SQLException;
/**
+ * This method updates the specified column to have a
+ * <code>java.sql.Ref</code> value.
+ * This does not update the actual database. <code>updateRow</code> must be
+ * called in order to do that.
+ *
+ * @parm columnName The name of the column value to update.
+ * @parm value The <code>java.sql.Ref</code> used to set the new value
+ * of the column.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void updateRef(String columnName, Ref x) throws SQLException;
+ void updateRef(String columnName, Ref value) throws SQLException;
/**
+ * This method updates the specified column to have a
+ * <code>java.sql.Blob</code> value.
+ * This does not update the actual database. <code>updateRow</code> must be
+ * called in order to do that.
+ *
+ * @parm columnIndex The index of the column value to update.
+ * @parm value The <code>java.sql.Blob</code> used to set the new value
+ * of the column.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void updateBlob(int columnIndex, Blob x) throws SQLException;
+ void updateBlob(int columnIndex, Blob value) throws SQLException;
/**
+ * This method updates the specified column to have a
+ * <code>java.sql.Blob</code> value.
+ * This does not update the actual database. <code>updateRow</code> must be
+ * called in order to do that.
+ *
+ * @parm columnName The name of the column value to update.
+ * @parm value The <code>java.sql.Blob</code> used to set the new value
+ * of the column.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void updateBlob(String columnName, Blob x) throws SQLException;
+ void updateBlob(String columnName, Blob value) throws SQLException;
/**
+ * This method updates the specified column to have a
+ * <code>java.sql.Clob</code> value.
+ * This does not update the actual database. <code>updateRow</code> must be
+ * called in order to do that.
+ *
+ * @parm columnIndex The index of the column value to update.
+ * @parm value The <code>java.sql.Clob</code> used to set the new value
+ * of the column.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void updateClob(int columnIndex, Clob x) throws SQLException;
+ void updateClob(int columnIndex, Clob value) throws SQLException;
/**
+ * This method updates the specified column to have a
+ * <code>java.sql.Clob</code> value.
+ * This does not update the actual database. <code>updateRow</code> must be
+ * called in order to do that.
+ *
+ * @parm columnName The name of the column value to update.
+ * @parm value The <code>java.sql.Clob</code> used to set the new value
+ * of the column.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void updateClob(String columnName, Clob x) throws SQLException;
+ void updateClob(String columnName, Clob value) throws SQLException;
/**
+ * This method updates the specified column to have a
+ * <code>java.sqlArray</code> value.
+ * This does not update the actual database. <code>updateRow</code> must be
+ * called in order to do that.
+ *
+ * @parm columnIndex The index of the column value to update.
+ * @parm value The new value of the column.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void updateArray(int columnIndex, Array x) throws SQLException;
+ void updateArray(int columnIndex, Array value) throws SQLException;
/**
+ * This method updates the specified column to have a
+ * <code>java.sqlArray</code> value.
+ * This does not update the actual database. <code>updateRow</code> must be
+ * called in order to do that.
+ *
+ * @parm columnName The name of the column value to update.
+ * @parm value The new value of the column.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void updateArray(String columnName, Array x) throws SQLException;
+ void updateArray(String columnName, Array value) throws SQLException;
}
diff --git a/java/sql/ResultSetMetaData.java b/java/sql/ResultSetMetaData.java
index 0086677ee..5a62c549e 100644
--- a/java/sql/ResultSetMetaData.java
+++ b/java/sql/ResultSetMetaData.java
@@ -1,5 +1,5 @@
/* ResultSetMetaData.java -- Returns information about the ResultSet
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,8 +41,8 @@ package java.sql;
/**
* This interface provides a mechanism for obtaining information about
* the columns that are present in a <code>ResultSet</code>.
- * <p>
- * Note that in this class column indexes start at 1, not 0.
+ *
+ * <p> Note that in this class column indices start at 1, not 0.</p>
*
* @author Aaron M. Renn (arenn@urbanophile.com)
*/
@@ -75,207 +75,207 @@ public interface ResultSetMetaData
* This method test whether or not the column is an auto-increment column.
* Auto-increment columns are read-only.
*
- * @param index The index of the column to test.
+ * @param columnIndex The index of the column to test.
* @return <code>true</code> if the column is auto-increment, <code>false</code>
* otherwise.
* @exception SQLException If an error occurs.
*/
- boolean isAutoIncrement(int column) throws SQLException;
+ boolean isAutoIncrement(int columnIndex) throws SQLException;
/**
* This method tests whether or not a column is case sensitive in its values.
*
- * @param index The index of the column to test.
+ * @param columnIndex The index of the column to test.
* @return <code>true</code> if the column value is case sensitive,
* <code>false</code> otherwise.
* @exception SQLException If an error occurs.
*/
- boolean isCaseSensitive(int column) throws SQLException;
+ boolean isCaseSensitive(int columnIndex) throws SQLException;
/**
* This method tests whether not the specified column can be used in
* a WHERE clause.
*
- * @param index The index of the column to test.
+ * @param columnIndex The index of the column to test.
* @return <code>true</code> if the column may be used in a WHERE clause,
* <code>false</code> otherwise.
* @exception SQLException If an error occurs.
*/
- boolean isSearchable(int column) throws SQLException;
+ boolean isSearchable(int columnIndex) throws SQLException;
/**
* This method tests whether or not the column stores a monetary value.
*
- * @param index The index of the column to test.
+ * @param columnIndex The index of the column to test.
* @return <code>true</code> if the column contains a monetary value,
* <code>false</code> otherwise.
* @exception SQLException If an error occurs.
*/
- boolean isCurrency(int column) throws SQLException;
+ boolean isCurrency(int columnIndex) throws SQLException;
/**
* This method returns a value indicating whether or not the specified
* column may contain a NULL value.
*
- * @param index The index of the column to test.
+ * @param columnIndex The index of the column to test.
* @return A constant indicating whether or not the column can contain NULL,
* which will be one of <code>columnNoNulls</code>,
* <code>columnNullable</code>, or <code>columnNullableUnknown</code>.
* @exception SQLException If an error occurs.
*/
- int isNullable(int column) throws SQLException;
+ int isNullable(int columnIndex) throws SQLException;
/**
* This method tests whether or not the value of the specified column
* is signed or unsigned.
*
- * @param index The index of the column to test.
+ * @param columnIndex The index of the column to test.
* @return <code>true</code> if the column value is signed, <code>false</code>
* otherwise.
* @exception SQLException If an error occurs.
*/
- boolean isSigned(int column) throws SQLException;
+ boolean isSigned(int columnIndex) throws SQLException;
/**
* This method returns the maximum number of characters that can be used
* to display a value in this column.
*
- * @param index The index of the column to check.
+ * @param columnIndex The index of the column to check.
* @return The maximum number of characters that can be used to display a
* value for this column.
* @exception SQLException If an error occurs.
*/
- int getColumnDisplaySize(int column) throws SQLException;
+ int getColumnDisplaySize(int columnIndex) throws SQLException;
/**
* This method returns a string that should be used as a caption for this
* column for user display purposes.
*
- * @param index The index of the column to check.
+ * @param columnIndex The index of the column to check.
* @return A display string for the column.
* @exception SQLException If an error occurs.
*/
- String getColumnLabel(int column) throws SQLException;
+ String getColumnLabel(int columnIndex) throws SQLException;
/**
* This method returns the name of the specified column.
*
- * @param index The index of the column to return the name of.
+ * @param columnIndex The index of the column to return the name of.
* @return The name of the column.
* @exception SQLException If an error occurs.
*/
- String getColumnName(int column) throws SQLException;
+ String getColumnName(int columnIndex) throws SQLException;
/**
* This method returns the name of the schema that contains the specified
* column.
*
- * @param index The index of the column to check the schema name for.
+ * @param columnIndex The index of the column to check the schema name for.
* @return The name of the schema that contains the column.
* @exception SQLException If an error occurs.
*/
- String getSchemaName(int column) throws SQLException;
+ String getSchemaName(int columnIndex) throws SQLException;
/**
* This method returns the precision of the specified column, which is the
* number of decimal digits it contains.
*
- * @param index The index of the column to check the precision on.
+ * @param columnIndex The index of the column to check the precision on.
* @return The precision of the specified column.
* @exception SQLException If an error occurs.
*/
- int getPrecision(int column) throws SQLException;
+ int getPrecision(int columnIndex) throws SQLException;
/**
* This method returns the scale of the specified column, which is the
* number of digits to the right of the decimal point.
*
- * @param index The index column to check the scale of.
+ * @param columnIndex The index column to check the scale of.
* @return The scale of the column.
* @exception SQLException If an error occurs.
*/
- int getScale(int column) throws SQLException;
+ int getScale(int columnIndex) throws SQLException;
/**
* This method returns the name of the table containing the specified
* column.
*
- * @param index The index of the column to check the table name for.
+ * @param columnIndex The index of the column to check the table name for.
* @return The name of the table containing the column.
* @exception SQLException If an error occurs.
*/
- String getTableName(int column) throws SQLException;
+ String getTableName(int columnIndex) throws SQLException;
/**
* This method returns the name of the catalog containing the specified
* column.
*
- * @param index The index of the column to check the catalog name for.
+ * @param columnIndex The index of the column to check the catalog name for.
* @return The name of the catalog containing the column.
* @exception SQLException If an error occurs.
*/
- String getCatalogName(int column) throws SQLException;
+ String getCatalogName(int columnIndex) throws SQLException;
/**
* This method returns the SQL type of the specified column. This will
* be one of the constants from <code>Types</code>.
*
- * @param index The index of the column to check the SQL type of.
+ * @param columnIndex The index of the column to check the SQL type of.
* @return The SQL type for this column.
* @exception SQLException If an error occurs.
* @see Types
*/
- int getColumnType(int column) throws SQLException;
+ int getColumnType(int columnIndex) throws SQLException;
/**
* This method returns the name of the SQL type for this column.
*
- * @param index The index of the column to check the SQL type name for.
+ * @param columnIndex The index of the column to check the SQL type name for.
* @return The name of the SQL type for this column.
* @exception SQLException If an error occurs.
*/
- String getColumnTypeName(int column) throws SQLException;
+ String getColumnTypeName(int columnIndex) throws SQLException;
/**
* This method tests whether or not the specified column is read only.
*
- * @param index The index of the column to check.
+ * @param columnIndex The index of the column to check.
* @return <code>true</code> if the column is read only, <code>false</code>
* otherwise.
* @exception SQLException If an error occurs.
*/
- boolean isReadOnly(int column) throws SQLException;
+ boolean isReadOnly(int columnIndex) throws SQLException;
/**
* This method tests whether or not the column may be writable. This
* does not guarantee that a write will be successful.
*
- * @param index The index of the column to check for writability.
+ * @param columnIndex The index of the column to check for writability.
* @return <code>true</code> if the column may be writable,
* <code>false</code> otherwise.
* @exception SQLException If an error occurs.
*/
- boolean isWritable(int column) throws SQLException;
+ boolean isWritable(int columnIndex) throws SQLException;
/**
* This method tests whether or not the column is writable. This
* does guarantee that a write will be successful.
*
- * @param index The index of the column to check for writability.
+ * @param columnIndex The index of the column to check for writability.
* @return <code>true</code> if the column is writable,
* <code>false</code> otherwise.
* @exception SQLException If an error occurs.
*/
- boolean isDefinitelyWritable(int column) throws SQLException;
+ boolean isDefinitelyWritable(int columnIndex) throws SQLException;
/**
* This method returns the name of the Java class which will be used to
* create objects representing the data in this column.
*
- * @param index The index of the column to check.
+ * @param columnIndex The index of the column to check.
* @return The name of the Java class that will be used for values in
* this column.
* @exception SQLException If an error occurs.
*/
- String getColumnClassName(int column) throws SQLException;
+ String getColumnClassName(int columnIndex) throws SQLException;
}
diff --git a/java/sql/SQLData.java b/java/sql/SQLData.java
index 2ba1fb18d..cf006e15a 100644
--- a/java/sql/SQLData.java
+++ b/java/sql/SQLData.java
@@ -1,5 +1,5 @@
/* SQLData.java -- Custom mapping for a user defined datatype
- Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -57,7 +57,7 @@ public interface SQLData
* This method populates the data in the object from the specified stream.
*
* @param stream The stream to read the data from.
- * @param name The data type name of the data on the stream.
+ * @param typeName The data type name of the data on the stream.
* @exception SQLException If an error occurs.
*/
void readSQL(SQLInput stream, String typeName) throws SQLException;
diff --git a/java/sql/SQLOutput.java b/java/sql/SQLOutput.java
index 8e6c88f8c..e210258fa 100644
--- a/java/sql/SQLOutput.java
+++ b/java/sql/SQLOutput.java
@@ -1,5 +1,5 @@
/* SQLOutput.java -- Write SQL values to a stream
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -59,7 +59,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeString(String x) throws SQLException;
+ void writeString(String value) throws SQLException;
/**
* This method writes the specified Java <code>boolean</code>
@@ -68,7 +68,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeBoolean(boolean x) throws SQLException;
+ void writeBoolean(boolean value) throws SQLException;
/**
* This method writes the specified Java <code>byte</code>
@@ -77,7 +77,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeByte(byte x) throws SQLException;
+ void writeByte(byte value) throws SQLException;
/**
* This method writes the specified Java <code>short</code>
@@ -86,7 +86,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeShort(short x) throws SQLException;
+ void writeShort(short value) throws SQLException;
/**
* This method writes the specified Java <code>int</code>
@@ -95,7 +95,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeInt(int x) throws SQLException;
+ void writeInt(int value) throws SQLException;
/**
* This method writes the specified Java <code>long</code>
@@ -104,7 +104,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeLong(long x) throws SQLException;
+ void writeLong(long value) throws SQLException;
/**
* This method writes the specified Java <code>float</code>
@@ -113,7 +113,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeFloat(float x) throws SQLException;
+ void writeFloat(float value) throws SQLException;
/**
* This method writes the specified Java <code>double</code>
@@ -122,7 +122,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeDouble(double x) throws SQLException;
+ void writeDouble(double value) throws SQLException;
/**
* This method writes the specified Java <code>BigDecimal</code>
@@ -131,7 +131,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeBigDecimal(BigDecimal x) throws SQLException;
+ void writeBigDecimal(BigDecimal value) throws SQLException;
/**
* This method writes the specified Java <code>byte</code> array
@@ -140,7 +140,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeBytes(byte[] x) throws SQLException;
+ void writeBytes(byte[] value) throws SQLException;
/**
* This method writes the specified Java <code>java.sql.Date</code>
@@ -149,7 +149,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeDate(Date x) throws SQLException;
+ void writeDate(Date value) throws SQLException;
/**
* This method writes the specified Java <code>java.sql.Time</code>
@@ -158,7 +158,7 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeTime(Time x) throws SQLException;
+ void writeTime(Time value) throws SQLException;
/**
* This method writes the specified Java <code>java.sql.Timestamp</code>
@@ -167,34 +167,34 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeTimestamp(Timestamp x) throws SQLException;
+ void writeTimestamp(Timestamp value) throws SQLException;
/**
* This method writes the specified Java character stream
* to the SQL stream.
*
- * @param value The value to write to the stream.
+ * @param stream The stream that holds the character data to write.
* @exception SQLException If an error occurs.
*/
- void writeCharacterStream(Reader x) throws SQLException;
+ void writeCharacterStream(Reader stream) throws SQLException;
/**
* This method writes the specified ASCII text stream
* to the SQL stream.
*
- * @param value The value to write to the stream.
+ * @param stream The stream that holds the ASCII data to write.
* @exception SQLException If an error occurs.
*/
- void writeAsciiStream(InputStream x) throws SQLException;
+ void writeAsciiStream(InputStream stream) throws SQLException;
/**
* This method writes the specified uninterpreted binary byte stream
* to the SQL stream.
*
- * @param value The value to write to the stream.
+ * @param stream The stream that holds the binary data to write.
* @exception SQLException If an error occurs.
*/
- void writeBinaryStream(InputStream x) throws SQLException;
+ void writeBinaryStream(InputStream stream) throws SQLException;
/**
* This method writes the specified Java <code>SQLData</code> object
@@ -203,43 +203,48 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeObject(SQLData x) throws SQLException;
+ void writeObject(SQLData value) throws SQLException;
/**
* This method writes the specified Java SQL <code>Ref</code> object
* to the SQL stream.
*
- * @param value The value to write to the stream.
+ * @param value The <code>Ref</code> object to write to the stream.
* @exception SQLException If an error occurs.
+ * @see Ref
*/
- void writeRef(Ref x) throws SQLException;
+ void writeRef(Ref value) throws SQLException;
+
/**
* This method writes the specified Java SQL <code>Blob</code> object
* to the SQL stream.
*
- * @param value The value to write to the stream.
+ * @param value The <code>Blob</code> object to write to the stream.
* @exception SQLException If an error occurs.
+ * @see Blob
*/
- void writeBlob(Blob x) throws SQLException;
+ void writeBlob(Blob value) throws SQLException;
/**
* This method writes the specified Java SQL <code>Clob</code> object
* to the SQL stream.
*
- * @param value The value to write to the stream.
+ * @param value The <code>Clob</code> object to write to the stream.
* @exception SQLException If an error occurs.
+ * @see Clob
*/
- void writeClob(Clob x) throws SQLException;
+ void writeClob(Clob value) throws SQLException;
/**
* This method writes the specified Java SQL <code>Struct</code> object
* to the SQL stream.
*
- * @param value The value to write to the stream.
+ * @param value The <code>Struct</code> object to write to the stream.
* @exception SQLException If an error occurs.
+ * @see Struct
*/
- void writeStruct(Struct x) throws SQLException;
+ void writeStruct(Struct value) throws SQLException;
/**
* This method writes the specified Java SQL <code>Array</code> object
@@ -248,10 +253,15 @@ public interface SQLOutput
* @param value The value to write to the stream.
* @exception SQLException If an error occurs.
*/
- void writeArray(Array x) throws SQLException;
+ void writeArray(Array value) throws SQLException;
/**
+ * This method writes the specified <code>java.net.URL</code> object to the
+ * SQL stream.
+ *
+ * @param value The value to write to the stream.
+ * @exception SQLException If an error occurs.
* @since 1.4
*/
- void writeURL(URL x) throws SQLException;
+ void writeURL(URL value) throws SQLException;
}
diff --git a/java/sql/SQLWarning.java b/java/sql/SQLWarning.java
index 841d137e1..d9c7e354e 100644
--- a/java/sql/SQLWarning.java
+++ b/java/sql/SQLWarning.java
@@ -1,5 +1,5 @@
/* SQLWarning.java -- Database access warnings.
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -56,9 +56,9 @@ public class SQLWarning extends SQLException
* @param SQLState A string containing the SQL state of the error.
* @param vendorCode The vendor error code associated with this error.
*/
- public SQLWarning(String reason, String SQLState, int vendorCode)
+ public SQLWarning(String message, String SQLState, int vendorCode)
{
- super(reason, SQLState, vendorCode);
+ super(message, SQLState, vendorCode);
}
/**
diff --git a/java/sql/Statement.java b/java/sql/Statement.java
index 42e8e8e88..195600eaa 100644
--- a/java/sql/Statement.java
+++ b/java/sql/Statement.java
@@ -1,5 +1,5 @@
/* Statement.java -- Interface for executing SQL statements.
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -91,10 +91,10 @@ public interface Statement
/**
* This method sets the limit for the maximum length of any column in bytes.
*
- * @param maxsize The new maximum length of any column in bytes.
+ * @param maxSize The new maximum length of any column in bytes.
* @exception SQLException If an error occurs.
*/
- void setMaxFieldSize(int max) throws SQLException;
+ void setMaxFieldSize(int maxSize) throws SQLException;
/**
* This method returns the maximum possible number of rows in a result set.
@@ -108,20 +108,20 @@ public interface Statement
* This method sets the maximum number of rows that can be present in a
* result set.
*
- * @param maxrows The maximum possible number of rows in a result set.
+ * @param maxRows The maximum possible number of rows in a result set.
* @exception SQLException If an error occurs.
*/
- void setMaxRows(int max) throws SQLException;
+ void setMaxRows(int maxRows) throws SQLException;
/**
* This method sets the local escape processing mode on or off. The
* default value is on.
*
* @param escape <code>true</code> to enable local escape processing,
- * <code>false</code> to disable it.
+ * <code>false</code> to disable it.
* @exception SQLException If an error occurs.
*/
- void setEscapeProcessing(boolean enable) throws SQLException;
+ void setEscapeProcessing(boolean escape) throws SQLException;
/**
* The method returns the number of seconds a statement may be in process
@@ -136,7 +136,7 @@ public interface Statement
* This method sets the number of seconds a statement may be in process
* before timing out. A value of 0 means there is no timeout.
*
- * @param timeout The new SQL statement timeout value.
+ * @param seconds The new SQL statement timeout value.
* @exception SQLException If an error occurs.
*/
void setQueryTimeout(int seconds) throws SQLException;
@@ -192,7 +192,10 @@ public interface Statement
* @return The result set of the query, or <code>null</code> if there was
* no result set (for example, if the statement was an UPDATE).
* @exception SQLException If an error occurs.
- * @see execute
+ * @see #execute(String)
+ * @see #execute(String, int)
+ * @see #execute(String, int[])
+ * @see #execute(String, String[])
*/
ResultSet getResultSet() throws SQLException;
@@ -203,7 +206,10 @@ public interface Statement
* @return The update count of the query, or -1 if there was no update
* count (for example, if the statement was a SELECT).
* @exception SQLException If an error occurs.
- * @see execute
+ * @see #execute(String)
+ * @see #execute(String, int)
+ * @see #execute(String, int[])
+ * @see #execute(String, String[])
*/
int getUpdateCount() throws SQLException;
@@ -215,7 +221,10 @@ public interface Statement
* <code>false</code> otherwise (for example, the next result is an
* update count).
* @exception SQLException If an error occurs.
- * @see execute
+ * @see #execute(String)
+ * @see #execute(String, int)
+ * @see #execute(String, int[])
+ * @see #execute(String, String[])
*/
boolean getMoreResults() throws SQLException;
@@ -241,11 +250,11 @@ public interface Statement
* This method informs the driver how many rows it should fetch from the
* database at a time.
*
- * @param numrows The number of rows the driver should fetch at a time
- * to populate the result set.
+ * @param numRows The number of rows the driver should fetch at a time
+ * to populate the result set.
* @exception SQLException If an error occurs.
*/
- void setFetchSize(int rows) throws SQLException;
+ void setFetchSize(int numRows) throws SQLException;
/**
* This method returns the number of rows the driver believes should be
diff --git a/java/sql/Time.java b/java/sql/Time.java
index 57551528b..2d1a433fa 100644
--- a/java/sql/Time.java
+++ b/java/sql/Time.java
@@ -1,5 +1,6 @@
/* Time.java -- Wrapper around java.util.Date
- Copyright (C) 1999, 2000, 2002, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2003, 2005, 2006
+ Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -177,10 +178,10 @@ public class Time extends java.util.Date
/**
* This method initializes a new instance of this class with the
- * specified time value representing the number of seconds since
+ * specified time value representing the number of milliseconds since
* Jan 1, 1970 at 12:00 midnight GMT.
*
- * @param time The time value to intialize this <code>Time</code> to.
+ * @param date The time value to intialize this <code>Time</code> to.
*/
public Time(long date)
{
diff --git a/java/sql/Timestamp.java b/java/sql/Timestamp.java
index f3459b22f..66a57641a 100644
--- a/java/sql/Timestamp.java
+++ b/java/sql/Timestamp.java
@@ -1,5 +1,5 @@
/* Time.java -- Wrapper around java.util.Date
- Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2003, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -143,7 +143,7 @@ public class Timestamp extends java.util.Date
* specified time value representing the number of milliseconds since
* Jan 1, 1970 at 12:00 midnight GMT.
*
- * @param time The time value to intialize this <code>Time</code> to.
+ * @param date The time value to intialize this <code>Time</code> to.
*/
public Timestamp(long date)
{
@@ -279,12 +279,13 @@ public class Timestamp extends java.util.Date
}
/**
- * Compare two Timestamp
- * @param when the other Timestamp.
- * @return 0, if the date represented
- * by obj is exactly the same as the time represented by this
- * object, a negative if this Timestamp is before the other Timestamp, and
- * a positive value otherwise.
+ * Compares this <code>Timestamp</code> to another one.
+ *
+ * @param ts The other Timestamp.
+ * @return <code>0</code>, if both <code>Timestamp</code>'s represent exactly
+ * the same date, a negative value if this <code>Timestamp</code> is
+ * before the specified <code>Timestamp</code> and a positive value
+ * otherwise.
* @since 1.2
*/
public int compareTo(Timestamp ts)
@@ -297,15 +298,18 @@ public class Timestamp extends java.util.Date
}
/**
- * Compares this Timestamp to another. This behaves like
+ * Compares this <code>Timestamp</code> to another one. This behaves like
* <code>compareTo(Timestamp)</code>, but it may throw a
- * <code>ClassCastException</code>
- * @param obj the other Timestamp.
- * @return 0, if the Timestamp represented
- * by obj is exactly the same as the time represented by this
- * object, a negative if this Timestamp is before the other Timestamp, and
- * a positive value otherwise.
+ * <code>ClassCastException</code>, if the specified object is not of type
+ * <code>Timestamp</code>.
+ *
+ * @param obj The object to compare with.
+ * @return <code>0</code>, if both <code>Timestamp</code>'s represent exactly
+ * the same date, a negative value if this <code>Timestamp</code> is
+ * before the specified <code>Timestamp</code> and a positive value
+ * otherwise.
* @exception ClassCastException if obj is not of type Timestamp.
+ * @see #compareTo(Timestamp)
* @since 1.2
*/
public int compareTo(Object obj)
diff --git a/java/text/Bidi.java b/java/text/Bidi.java
index 0a4d471c7..437436045 100644
--- a/java/text/Bidi.java
+++ b/java/text/Bidi.java
@@ -1,5 +1,5 @@
/* Bidi.java -- Bidirectional Algorithm implementation
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,18 +38,939 @@ exception statement from your version. */
package java.text;
+import java.awt.font.NumericShaper;
+import java.awt.font.TextAttribute;
+import java.util.ArrayList;
+
+
/**
* Bidirectional Algorithm implementation.
*
- * TODO/FIXME Only one method <code>requiresBidi</code> is implemented
- * for now by using <code>Character</code>. The full algorithm is <a
- * href="http://www.unicode.org/unicode/reports/tr9/">Unicode Standard
- * Annex #9: The Bidirectional Algorithm</a>. A full implementation is
- * <a href="http://fribidi.org/">GNU FriBidi</a>.
+ * The full algorithm is
+ * <a href="http://www.unicode.org/unicode/reports/tr9/">Unicode Standard
+ * Annex #9: The Bidirectional Algorithm</a>.
+ *
+ * @since 1.4
*/
public final class Bidi
{
/**
+ * This indicates that a strongly directional character in the text should
+ * set the initial direction, but if no such character is found, then the
+ * initial direction will be left-to-right.
+ */
+ public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = -2;
+
+ /**
+ * This indicates that a strongly directional character in the text should
+ * set the initial direction, but if no such character is found, then the
+ * initial direction will be right-to-left.
+ */
+ public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = -1;
+
+ /**
+ * This indicates that the initial direction should be left-to-right.
+ */
+ public static final int DIRECTION_LEFT_TO_RIGHT = 0;
+
+ /**
+ * This indicates that the initial direction should be right-to-left.
+ */
+ public static final int DIRECTION_RIGHT_TO_LEFT = 1;
+
+ // Flags used when computing the result.
+ private static final int LTOR = 1 << DIRECTION_LEFT_TO_RIGHT;
+ private static final int RTOL = 1 << DIRECTION_RIGHT_TO_LEFT;
+
+ // The text we are examining, and the starting offset.
+ // If we had a better way to handle createLineBidi, we wouldn't
+ // need this at all -- which for the String case would be an
+ // efficiency win.
+ private char[] text;
+ private int textOffset;
+ // The embeddings corresponding to the text, and the starting offset.
+ private byte[] embeddings;
+ private int embeddingOffset;
+ // The length of the text (and embeddings) to use.
+ private int length;
+ // The flags.
+ private int flags;
+
+ // All instance fields following this point are initialized
+ // during analysis. Fields before this must be set by the constructor.
+
+ // The initial embedding level.
+ private int baseEmbedding;
+ // The type of each character in the text.
+ private byte[] types;
+ // The levels we compute.
+ private byte[] levels;
+
+ // A list of indices where a formatting code was found. These
+ // are indicies into the original text -- not into the text after
+ // the codes have been removed.
+ private ArrayList formatterIndices;
+
+ // Indices of the starts of runs in the text.
+ private int[] runs;
+
+ // A convenience field where we keep track of what kinds of runs
+ // we've seen.
+ private int resultFlags;
+
+ /**
+ * Create a new Bidi object given an attributed character iterator.
+ * This constructor will examine various attributes of the text:
+ * <ul>
+ * <li> {@link TextAttribute#RUN_DIRECTION} is used to determine the
+ * paragraph's base embedding level. This constructor will recognize
+ * either {@link TextAttribute#RUN_DIRECTION_LTR} or
+ * {@link TextAttribute#RUN_DIRECTION_RTL}. If neither is given,
+ * {@link #DIRECTION_DEFAULT_LEFT_TO_RIGHT} is assumed.
+ * </li>
+ *
+ * <li> If {@link TextAttribute#NUMERIC_SHAPING} is seen, then numeric
+ * shaping will be done before the Bidi algorithm is run.
+ * </li>
+ *
+ * <li> If {@link TextAttribute#BIDI_EMBEDDING} is seen on a given
+ * character, then the value of this attribute will be used as an
+ * embedding level override.
+ * </li>
+ * </ul>
+ * @param iter the attributed character iterator to use
+ */
+ public Bidi(AttributedCharacterIterator iter)
+ {
+ // If set, this attribute should be set on all characters.
+ // We don't check this (should we?) but we do assume that we
+ // can simply examine the first character.
+ Object val = iter.getAttribute(TextAttribute.RUN_DIRECTION);
+ if (val == TextAttribute.RUN_DIRECTION_LTR)
+ this.flags = DIRECTION_LEFT_TO_RIGHT;
+ else if (val == TextAttribute.RUN_DIRECTION_RTL)
+ this.flags = DIRECTION_RIGHT_TO_LEFT;
+ else
+ this.flags = DIRECTION_DEFAULT_LEFT_TO_RIGHT;
+
+ // Likewise this attribute should be specified on the whole text.
+ // We read it here and then, if it is set, we apply the numeric shaper
+ // to the text before processing it.
+ NumericShaper shaper = null;
+ val = iter.getAttribute(TextAttribute.NUMERIC_SHAPING);
+ if (val instanceof NumericShaper)
+ shaper = (NumericShaper) val;
+
+ char[] text = new char[iter.getEndIndex() - iter.getBeginIndex()];
+ this.embeddings = new byte[this.text.length];
+ this.embeddingOffset = 0;
+ this.length = text.length;
+ for (int i = 0; i < this.text.length; ++i)
+ {
+ this.text[i] = iter.current();
+
+ val = iter.getAttribute(TextAttribute.BIDI_EMBEDDING);
+ if (val instanceof Integer)
+ {
+ int ival = ((Integer) val).intValue();
+ byte bval;
+ if (ival < -62 || ival > 62)
+ bval = 0;
+ else
+ bval = (byte) ival;
+ this.embeddings[i] = bval;
+ }
+ }
+
+ // Invoke the numeric shaper, if specified.
+ if (shaper != null)
+ shaper.shape(this.text, 0, this.length);
+
+ runBidi();
+ }
+
+ /**
+ * Create a new Bidi object with the indicated text and, possibly, explicit
+ * embedding settings.
+ *
+ * If the embeddings array is null, it is ignored. Otherwise it is taken to
+ * be explicit embedding settings corresponding to the text. Positive values
+ * from 1 to 61 are embedding levels, and negative values from -1 to -61 are
+ * embedding overrides. (FIXME: not at all clear what this really means.)
+ *
+ * @param text the text to use
+ * @param offset the offset of the first character of the text
+ * @param embeddings the explicit embeddings, or null if there are none
+ * @param embedOffset the offset of the first embedding value to use
+ * @param length the length of both the text and the embeddings
+ * @param flags a flag indicating the base embedding direction
+ */
+ public Bidi(char[] text, int offset, byte[] embeddings, int embedOffset,
+ int length, int flags)
+ {
+ if (flags != DIRECTION_DEFAULT_LEFT_TO_RIGHT
+ && flags != DIRECTION_DEFAULT_RIGHT_TO_LEFT
+ && flags != DIRECTION_LEFT_TO_RIGHT
+ && flags != DIRECTION_RIGHT_TO_LEFT)
+ throw new IllegalArgumentException("unrecognized 'flags' argument: "
+ + flags);
+ this.text = text;
+ this.textOffset = offset;
+ this.embeddings = embeddings;
+ this.embeddingOffset = embedOffset;
+ this.length = length;
+ this.flags = flags;
+
+ runBidi();
+ }
+
+ /**
+ * Create a new Bidi object using the contents of the given String
+ * as the text.
+ * @param text the text to use
+ * @param flags a flag indicating the base embedding direction
+ */
+ public Bidi(String text, int flags)
+ {
+ if (flags != DIRECTION_DEFAULT_LEFT_TO_RIGHT
+ && flags != DIRECTION_DEFAULT_RIGHT_TO_LEFT
+ && flags != DIRECTION_LEFT_TO_RIGHT
+ && flags != DIRECTION_RIGHT_TO_LEFT)
+ throw new IllegalArgumentException("unrecognized 'flags' argument: "
+ + flags);
+
+ // This is inefficient, but it isn't clear whether it matters.
+ // If it does we can change our implementation a bit to allow either
+ // a String or a char[].
+ this.text = text.toCharArray();
+ this.textOffset = 0;
+ this.embeddings = null;
+ this.embeddingOffset = 0;
+ this.length = text.length();
+ this.flags = flags;
+
+ runBidi();
+ }
+
+ /**
+ * Implementation function which computes the initial type of
+ * each character in the input.
+ */
+ private void computeTypes()
+ {
+ types = new byte[length];
+ for (int i = 0; i < length; ++i)
+ types[i] = Character.getDirectionality(text[textOffset + i]);
+ }
+
+ /**
+ * An internal function which implements rules P2 and P3.
+ * This computes the base embedding level.
+ * @return the paragraph's base embedding level
+ */
+ private int computeParagraphEmbeddingLevel()
+ {
+ // First check to see if the user supplied a directionality override.
+ if (flags == DIRECTION_LEFT_TO_RIGHT
+ || flags == DIRECTION_RIGHT_TO_LEFT)
+ return flags;
+
+ // This implements rules P2 and P3.
+ // (Note that we don't need P1, as the user supplies
+ // a paragraph.)
+ for (int i = 0; i < length; ++i)
+ {
+ int dir = types[i];
+ if (dir == Character.DIRECTIONALITY_LEFT_TO_RIGHT)
+ return DIRECTION_LEFT_TO_RIGHT;
+ if (dir == Character.DIRECTIONALITY_RIGHT_TO_LEFT
+ || dir == Character.DIRECTIONALITY_RIGHT_TO_LEFT)
+ return DIRECTION_RIGHT_TO_LEFT;
+ }
+ return (flags == DIRECTION_DEFAULT_LEFT_TO_RIGHT
+ ? DIRECTION_LEFT_TO_RIGHT
+ : DIRECTION_RIGHT_TO_LEFT);
+ }
+
+ /**
+ * An internal function which implements rules X1 through X9.
+ * This computes the initial levels for the text, handling
+ * explicit overrides and embeddings.
+ */
+ private void computeExplicitLevels()
+ {
+ levels = new byte[length];
+ byte currentEmbedding = (byte) baseEmbedding;
+ // The directional override is a Character directionality
+ // constant. -1 means there is no override.
+ byte directionalOverride = -1;
+ // The stack of pushed embeddings, and the stack pointer.
+ // Note that because the direction is inherent in the depth,
+ // and because we have a bit left over in a byte, we can encode
+ // the override, if any, directly in this value on the stack.
+ final int MAX_DEPTH = 62;
+ byte[] embeddingStack = new byte[MAX_DEPTH];
+ int sp = 0;
+
+ for (int i = 0; i < length; ++i)
+ {
+ // If we see an explicit embedding, we use that, even if
+ // the current character is itself a directional override.
+ if (embeddings != null && embeddings[embeddingOffset + i] != 0)
+ {
+ // It isn't at all clear what we're supposed to do here.
+ // What does a negative value really mean?
+ // Should we push on the embedding stack here?
+ currentEmbedding = embeddings[embeddingOffset + i];
+ if (currentEmbedding < 0)
+ {
+ currentEmbedding = (byte) -currentEmbedding;
+ directionalOverride
+ = (((currentEmbedding % 2) == 0)
+ ? Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ : Character.DIRECTIONALITY_RIGHT_TO_LEFT);
+ }
+ else
+ directionalOverride = -1;
+ continue;
+ }
+ // No explicit embedding.
+ boolean isLtoR = false;
+ boolean isSpecial = true;
+ switch (types[i])
+ {
+ case Character.DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING:
+ case Character.DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE:
+ isLtoR = true;
+ // Fall through.
+ case Character.DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING:
+ case Character.DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE:
+ {
+ byte newEmbedding;
+ if (isLtoR)
+ {
+ // Least greater even.
+ newEmbedding = (byte) ((currentEmbedding & ~1) + 2);
+ }
+ else
+ {
+ // Least greater odd.
+ newEmbedding = (byte) ((currentEmbedding + 1) | 1);
+ }
+ // FIXME: we don't properly handle invalid pushes.
+ if (newEmbedding < MAX_DEPTH)
+ {
+ // The new level is valid. Push the old value.
+ // See above for a comment on the encoding here.
+ if (directionalOverride != -1)
+ currentEmbedding |= Byte.MIN_VALUE;
+ embeddingStack[sp++] = currentEmbedding;
+ currentEmbedding = newEmbedding;
+ if (types[i] == Character.DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE)
+ directionalOverride = Character.DIRECTIONALITY_LEFT_TO_RIGHT;
+ else if (types[i] == Character.DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE)
+ directionalOverride = Character.DIRECTIONALITY_RIGHT_TO_LEFT;
+ else
+ directionalOverride = -1;
+ }
+ }
+ break;
+ case Character.DIRECTIONALITY_POP_DIRECTIONAL_FORMAT:
+ {
+ // FIXME: we don't properly handle a pop with a corresponding
+ // invalid push.
+ if (sp == 0)
+ {
+ // We saw a pop without a push. Just ignore it.
+ break;
+ }
+ byte newEmbedding = embeddingStack[--sp];
+ currentEmbedding = (byte) (newEmbedding & 0x7f);
+ if (newEmbedding < 0)
+ directionalOverride
+ = (((newEmbedding & 1) == 0)
+ ? Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ : Character.DIRECTIONALITY_RIGHT_TO_LEFT);
+ else
+ directionalOverride = -1;
+ }
+ break;
+ default:
+ isSpecial = false;
+ break;
+ }
+ levels[i] = currentEmbedding;
+ if (isSpecial)
+ {
+ // Mark this character for removal.
+ if (formatterIndices == null)
+ formatterIndices = new ArrayList();
+ formatterIndices.add(Integer.valueOf(i));
+ }
+ else if (directionalOverride != -1)
+ types[i] = directionalOverride;
+ }
+
+ // Remove the formatting codes and update both the arrays
+ // and 'length'. It would be more efficient not to remove
+ // these codes, but it is also more complicated. Also, the
+ // Unicode algorithm reference does not properly describe
+ // how this is to be done -- from what I can tell, their suggestions
+ // in this area will not yield the correct results.
+ if (formatterIndices == null)
+ return;
+ int output = 0, input = 0;
+ final int size = formatterIndices.size();
+ for (int i = 0; i <= size; ++i)
+ {
+ int nextFmt;
+ if (i == size)
+ nextFmt = length;
+ else
+ nextFmt = ((Integer) formatterIndices.get(i)).intValue();
+ // Non-formatter codes are from 'input' to 'nextFmt'.
+ int len = nextFmt - input;
+ System.arraycopy(levels, input, levels, output, len);
+ System.arraycopy(types, input, types, output, len);
+ output += len;
+ input = nextFmt + 1;
+ }
+ length -= formatterIndices.size();
+ }
+
+ /**
+ * An internal function to compute the boundaries of runs
+ * in the text. It isn't strictly necessary to do this, but
+ * it lets us write some following passes in a less complicated
+ * way. Also it lets us efficiently implement some of the public
+ * methods. A run is simply a sequence of characters at the
+ * same level.
+ */
+ private void computeRuns()
+ {
+ int runCount = 0;
+ int currentEmbedding = baseEmbedding;
+ for (int i = 0; i < length; ++i)
+ {
+ if (levels[i] != currentEmbedding)
+ {
+ currentEmbedding = levels[i];
+ ++runCount;
+ }
+ }
+
+ // This may be called multiple times. If so, and if
+ // the number of runs has not changed, then don't bother
+ // allocating a new array.
+ if (runs == null || runs.length != runCount + 1)
+ runs = new int[runCount + 1];
+ int where = 0;
+ int lastRunStart = 0;
+ currentEmbedding = baseEmbedding;
+ for (int i = 0; i < length; ++i)
+ {
+ if (levels[i] != currentEmbedding)
+ {
+ runs[where++] = lastRunStart;
+ lastRunStart = i;
+ currentEmbedding = levels[i];
+ }
+ }
+ runs[where++] = lastRunStart;
+ }
+
+ /**
+ * An internal method to resolve weak types. This implements
+ * rules W1 through W7.
+ */
+ private void resolveWeakTypes()
+ {
+ final int runCount = getRunCount();
+
+ int previousLevel = baseEmbedding;
+ for (int run = 0; run < runCount; ++run)
+ {
+ int start = getRunStart(run);
+ int end = getRunLimit(run);
+ int level = getRunLevel(run);
+
+ // These are the names used in the Bidi algorithm.
+ byte sor = (((Math.max(previousLevel, level) % 2) == 0)
+ ? Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ : Character.DIRECTIONALITY_RIGHT_TO_LEFT);
+ int nextLevel;
+ if (run == runCount - 1)
+ nextLevel = baseEmbedding;
+ else
+ nextLevel = getRunLevel(run + 1);
+ byte eor = (((Math.max(level, nextLevel) % 2) == 0)
+ ? Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ : Character.DIRECTIONALITY_RIGHT_TO_LEFT);
+
+ byte prevType = sor;
+ byte prevStrongType = sor;
+ for (int i = start; i < end; ++i)
+ {
+ final byte nextType = (i == end - 1) ? eor : types[i + 1];
+
+ // Rule W1: change NSM to the prevailing direction.
+ if (types[i] == Character.DIRECTIONALITY_NONSPACING_MARK)
+ types[i] = prevType;
+ else
+ prevType = types[i];
+
+ // Rule W2: change EN to AN in some cases.
+ if (types[i] == Character.DIRECTIONALITY_EUROPEAN_NUMBER)
+ {
+ if (prevStrongType == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC)
+ types[i] = Character.DIRECTIONALITY_ARABIC_NUMBER;
+ }
+ else if (types[i] == Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ || types[i] == Character.DIRECTIONALITY_RIGHT_TO_LEFT
+ || types[i] == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC)
+ prevStrongType = types[i];
+
+ // Rule W3: change AL to R.
+ if (types[i] == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC)
+ types[i] = Character.DIRECTIONALITY_RIGHT_TO_LEFT;
+
+ // Rule W4: handle separators between two numbers.
+ if (prevType == Character.DIRECTIONALITY_EUROPEAN_NUMBER
+ && nextType == Character.DIRECTIONALITY_EUROPEAN_NUMBER)
+ {
+ if (types[i] == Character.DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR
+ || types[i] == Character.DIRECTIONALITY_COMMON_NUMBER_SEPARATOR)
+ types[i] = nextType;
+ }
+ else if (prevType == Character.DIRECTIONALITY_ARABIC_NUMBER
+ && nextType == Character.DIRECTIONALITY_ARABIC_NUMBER
+ && types[i] == Character.DIRECTIONALITY_COMMON_NUMBER_SEPARATOR)
+ types[i] = nextType;
+
+ // Rule W5: change a sequence of european terminators to
+ // european numbers, if they are adjacent to european numbers.
+ // We also include BN characters in this.
+ if (types[i] == Character.DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR
+ || types[i] == Character.DIRECTIONALITY_BOUNDARY_NEUTRAL)
+ {
+ if (prevType == Character.DIRECTIONALITY_EUROPEAN_NUMBER)
+ types[i] = prevType;
+ else
+ {
+ // Look ahead to see if there is an EN terminating this
+ // sequence of ETs.
+ int j = i + 1;
+ while (j < end
+ && (types[j] == Character.DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR
+ || types[j] == Character.DIRECTIONALITY_BOUNDARY_NEUTRAL))
+ ++j;
+ if (j < end
+ && types[j] == Character.DIRECTIONALITY_EUROPEAN_NUMBER)
+ {
+ // Change them all to EN now.
+ for (int k = i; k < j; ++k)
+ types[k] = Character.DIRECTIONALITY_EUROPEAN_NUMBER;
+ }
+ }
+ }
+
+ // Rule W6: separators and terminators change to ON.
+ // Again we include BN.
+ if (types[i] == Character.DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR
+ || types[i] == Character.DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR
+ || types[i] == Character.DIRECTIONALITY_COMMON_NUMBER_SEPARATOR
+ || types[i] == Character.DIRECTIONALITY_BOUNDARY_NEUTRAL)
+ types[i] = Character.DIRECTIONALITY_OTHER_NEUTRALS;
+
+ // Rule W7: change european number types.
+ if (prevStrongType == Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ && types[i] == Character.DIRECTIONALITY_EUROPEAN_NUMBER)
+ types[i] = prevStrongType;
+ }
+
+ previousLevel = level;
+ }
+ }
+
+ /**
+ * An internal method to resolve neutral types. This implements
+ * rules N1 and N2.
+ */
+ private void resolveNeutralTypes()
+ {
+ // This implements rules N1 and N2.
+ final int runCount = getRunCount();
+
+ int previousLevel = baseEmbedding;
+ for (int run = 0; run < runCount; ++run)
+ {
+ int start = getRunStart(run);
+ int end = getRunLimit(run);
+ int level = getRunLevel(run);
+
+ byte embeddingDirection
+ = (((level % 2) == 0) ? Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ : Character.DIRECTIONALITY_RIGHT_TO_LEFT);
+ // These are the names used in the Bidi algorithm.
+ byte sor = (((Math.max(previousLevel, level) % 2) == 0)
+ ? Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ : Character.DIRECTIONALITY_RIGHT_TO_LEFT);
+ int nextLevel;
+ if (run == runCount - 1)
+ nextLevel = baseEmbedding;
+ else
+ nextLevel = getRunLevel(run + 1);
+ byte eor = (((Math.max(level, nextLevel) % 2) == 0)
+ ? Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ : Character.DIRECTIONALITY_RIGHT_TO_LEFT);
+
+ byte prevStrong = sor;
+ int neutralStart = -1;
+ for (int i = start; i <= end; ++i)
+ {
+ byte newStrong = -1;
+ byte thisType = i == end ? eor : types[i];
+ switch (thisType)
+ {
+ case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
+ newStrong = Character.DIRECTIONALITY_LEFT_TO_RIGHT;
+ break;
+ case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
+ case Character.DIRECTIONALITY_ARABIC_NUMBER:
+ case Character.DIRECTIONALITY_EUROPEAN_NUMBER:
+ newStrong = Character.DIRECTIONALITY_RIGHT_TO_LEFT;
+ break;
+ case Character.DIRECTIONALITY_BOUNDARY_NEUTRAL:
+ case Character.DIRECTIONALITY_OTHER_NEUTRALS:
+ case Character.DIRECTIONALITY_SEGMENT_SEPARATOR:
+ case Character.DIRECTIONALITY_PARAGRAPH_SEPARATOR:
+ if (neutralStart == -1)
+ neutralStart = i;
+ break;
+ }
+ // If we see a strong character, update all the neutrals.
+ if (newStrong != -1)
+ {
+ if (neutralStart != -1)
+ {
+ byte override = (prevStrong == newStrong
+ ? prevStrong
+ : embeddingDirection);
+ for (int j = neutralStart; j < i; ++j)
+ types[i] = override;
+ }
+ prevStrong = newStrong;
+ neutralStart = -1;
+ }
+ }
+
+ previousLevel = level;
+ }
+ }
+
+ /**
+ * An internal method to resolve implicit levels.
+ * This implements rules I1 and I2.
+ */
+ private void resolveImplicitLevels()
+ {
+ // This implements rules I1 and I2.
+ for (int i = 0; i < length; ++i)
+ {
+ if ((levels[i] & 1) == 0)
+ {
+ if (types[i] == Character.DIRECTIONALITY_RIGHT_TO_LEFT)
+ ++levels[i];
+ else if (types[i] == Character.DIRECTIONALITY_ARABIC_NUMBER
+ || types[i] == Character.DIRECTIONALITY_EUROPEAN_NUMBER)
+ levels[i] += 2;
+ }
+ else
+ {
+ if (types[i] == Character.DIRECTIONALITY_LEFT_TO_RIGHT
+ || types[i] == Character.DIRECTIONALITY_ARABIC_NUMBER
+ || types[i] == Character.DIRECTIONALITY_EUROPEAN_NUMBER)
+ ++levels[i];
+ }
+
+ // Update the result flags.
+ resultFlags |= 1 << (levels[i] & 1);
+ }
+ // One final update of the result flags, using the base level.
+ resultFlags |= 1 << baseEmbedding;
+ }
+
+ /**
+ * This reinserts the formatting codes that we removed early on.
+ * Actually it does not insert formatting codes per se, but rather
+ * simply inserts new levels at the appropriate locations in the
+ * 'levels' array.
+ */
+ private void reinsertFormattingCodes()
+ {
+ if (formatterIndices == null)
+ return;
+ int input = length;
+ int output = levels.length;
+ // Process from the end as we are copying the array over itself here.
+ for (int index = formatterIndices.size() - 1; index >= 0; --index)
+ {
+ int nextFmt = ((Integer) formatterIndices.get(index)).intValue();
+
+ // nextFmt points to a location in the original array. So,
+ // nextFmt+1 is the target of our copying. output is the location
+ // to which we last copied, thus we can derive the length of the
+ // copy from it.
+ int len = output - nextFmt - 1;
+ output = nextFmt;
+ input -= len;
+ // Note that we no longer need 'types' at this point, so we
+ // only edit 'levels'.
+ if (nextFmt + 1 < levels.length)
+ System.arraycopy(levels, input, levels, nextFmt + 1, len);
+
+ // Now set the level at the reinsertion point.
+ int rightLevel;
+ if (output == levels.length - 1)
+ rightLevel = baseEmbedding;
+ else
+ rightLevel = levels[output + 1];
+ int leftLevel;
+ if (input == 0)
+ leftLevel = baseEmbedding;
+ else
+ leftLevel = levels[input];
+ levels[output] = (byte) Math.max(leftLevel, rightLevel);
+ }
+ length = levels.length;
+ }
+
+ /**
+ * This is the main internal entry point. After a constructor
+ * has initialized the appropriate local state, it will call
+ * this method to do all the work.
+ */
+ private void runBidi()
+ {
+ computeTypes();
+ baseEmbedding = computeParagraphEmbeddingLevel();
+ computeExplicitLevels();
+ computeRuns();
+ resolveWeakTypes();
+ resolveNeutralTypes();
+ resolveImplicitLevels();
+ // We're done with the types. Let the GC clean up.
+ types = null;
+ reinsertFormattingCodes();
+ // After resolving the implicit levels, the number
+ // of runs may have changed.
+ computeRuns();
+ }
+
+ /**
+ * Return true if the paragraph base embedding is left-to-right,
+ * false otherwise.
+ */
+ public boolean baseIsLeftToRight()
+ {
+ return baseEmbedding == DIRECTION_LEFT_TO_RIGHT;
+ }
+
+ /**
+ * Create a new Bidi object for a single line of text, taken
+ * from the text used when creating the current Bidi object.
+ * @param start the index of the first character of the line
+ * @param end the index of the final character of the line
+ * @return a new Bidi object for the indicated line of text
+ */
+ public Bidi createLineBidi(int start, int end)
+ {
+ // This isn't the most efficient implementation possible.
+ // This probably does not matter, so we choose simplicity instead.
+ int level = getLevelAt(start);
+ int flag = (((level % 2) == 0)
+ ? DIRECTION_LEFT_TO_RIGHT
+ : DIRECTION_RIGHT_TO_LEFT);
+ return new Bidi(text, textOffset + start,
+ embeddings, embeddingOffset + start,
+ end - start, flag);
+ }
+
+ /**
+ * Return the base embedding level of the paragraph.
+ */
+ public int getBaseLevel()
+ {
+ return baseEmbedding;
+ }
+
+ /**
+ * Return the length of the paragraph, in characters.
+ */
+ public int getLength()
+ {
+ return length;
+ }
+
+ /**
+ * Return the level at the indicated character. If the
+ * supplied index is less than zero or greater than the length
+ * of the text, then the paragraph's base embedding level will
+ * be returned.
+ * @param offset the character to examine
+ * @return the level of that character
+ */
+ public int getLevelAt(int offset)
+ {
+ if (offset < 0 || offset >= length)
+ return getBaseLevel();
+ return levels[offset];
+ }
+
+ /**
+ * Return the number of runs in the result. A run is
+ * a sequence of characters at the same embedding level.
+ */
+ public int getRunCount()
+ {
+ return runs.length;
+ }
+
+ /**
+ * Return the level of the indicated run.
+ * @param which the run to examine
+ * @return the level of that run
+ */
+ public int getRunLevel(int which)
+ {
+ return levels[runs[which]];
+ }
+
+ /**
+ * Return the index of the character just following the end
+ * of the indicated run.
+ * @param which the run to examine
+ * @return the index of the character after the final character
+ * of the run
+ */
+ public int getRunLimit(int which)
+ {
+ if (which == runs.length - 1)
+ return length;
+ return runs[which + 1];
+ }
+
+ /**
+ * Return the index of the first character in the indicated run.
+ * @param which the run to examine
+ * @return the index of the first character of the run
+ */
+ public int getRunStart(int which)
+ {
+ return runs[which];
+ }
+
+ /**
+ * Return true if the text is entirely left-to-right, and the
+ * base embedding is also left-to-right.
+ */
+ public boolean isLeftToRight()
+ {
+ return resultFlags == LTOR;
+ }
+
+ /**
+ * Return true if the text consists of mixed left-to-right and
+ * right-to-left runs, or if the text consists of one kind of run
+ * which differs from the base embedding direction.
+ */
+ public boolean isMixed()
+ {
+ return resultFlags == (LTOR | RTOL);
+ }
+
+ /**
+ * Return true if the text is entirely right-to-left, and the
+ * base embedding is also right-to-left.
+ */
+ public boolean isRightToLeft()
+ {
+ return resultFlags == RTOL;
+ }
+
+ /**
+ * Return a String describing the internal state of this object.
+ * This is only useful for debugging.
+ */
+ public String toString()
+ {
+ return "Bidi Bidi Bidi I like you, Buck!";
+ }
+
+ /**
+ * Reorder objects according to the levels passed in. This implements
+ * reordering as defined by the Unicode bidirectional layout specification.
+ * The levels are integers from 0 to 62; even numbers represent left-to-right
+ * runs, and odd numbers represent right-to-left runs.
+ *
+ * @param levels the levels associated with each object
+ * @param levelOffset the index of the first level to use
+ * @param objs the objects to reorder according to the levels
+ * @param objOffset the index of the first object to use
+ * @param count the number of objects (and levels) to manipulate
+ */
+ public static void reorderVisually(byte[] levels, int levelOffset,
+ Object[] objs, int objOffset, int count)
+ {
+ // We need a copy of the 'levels' array, as we are going to modify it.
+ // This is unfortunate but difficult to avoid.
+ byte[] levelCopy = new byte[count];
+ // Do this explicitly so we can also find the maximum depth at the
+ // same time.
+ int max = 0;
+ int lowestOdd = 63;
+ for (int i = 0; i < count; ++i)
+ {
+ levelCopy[i] = levels[levelOffset + i];
+ max = Math.max(levelCopy[i], max);
+ if (levelCopy[i] % 2 != 0)
+ lowestOdd = Math.min(lowestOdd, levelCopy[i]);
+ }
+
+ // Reverse the runs starting with the deepest.
+ for (int depth = max; depth >= lowestOdd; --depth)
+ {
+ int start = 0;
+ while (start < count)
+ {
+ // Find the start of a run >= DEPTH.
+ while (start < count && levelCopy[start] < depth)
+ ++start;
+ if (start == count)
+ break;
+ // Find the end of the run.
+ int end = start + 1;
+ while (end < count && levelCopy[end] >= depth)
+ ++end;
+
+ // Reverse this run.
+ for (int i = 0; i < (end - start) / 2; ++i)
+ {
+ byte tmpb = levelCopy[end - i - 1];
+ levelCopy[end - i - 1] = levelCopy[start + i];
+ levelCopy[start + i] = tmpb;
+ Object tmpo = objs[objOffset + end - i - 1];
+ objs[objOffset + end - i - 1] = objs[objOffset + start + i];
+ objs[objOffset + start + i] = tmpo;
+ }
+
+ // Handle the next run.
+ start = end + 1;
+ }
+ }
+ }
+
+ /**
* Returns false if all characters in the text between start and end
* are all left-to-right text. This implementation is just calls
* <code>Character.getDirectionality(char)</code> on all characters
diff --git a/java/text/Collator.java b/java/text/Collator.java
index 7dea83f0a..08739163a 100644
--- a/java/text/Collator.java
+++ b/java/text/Collator.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.text;
+import gnu.java.locale.LocaleHelper;
+
import java.util.Comparator;
import java.util.Locale;
import java.util.MissingResourceException;
@@ -68,10 +70,6 @@ import java.util.ResourceBundle;
* @author Aaron M. Renn (arenn@urbanophile.com)
* @date March 18, 1999
*/
-/* Written using "Java Class Libraries", 2nd edition, plus online
- * API docs for JDK 1.2 from http://www.javasoft.com.
- * Status: Mostly complete, but parts stubbed out. Look for FIXME.
- */
public abstract class Collator implements Comparator, Cloneable
{
/**
@@ -244,10 +242,7 @@ public abstract class Collator implements Comparator, Cloneable
*/
public static synchronized Locale[] getAvailableLocales ()
{
- // FIXME
- Locale[] l = new Locale[1];
- l[0] = Locale.US;
- return l;
+ return LocaleHelper.getCollatorLocales();
}
/**
@@ -292,7 +287,7 @@ public abstract class Collator implements Comparator, Cloneable
* specified locale. If no <code>Collator</code> exists for the desired
* locale, a <code>Collator</code> for the default locale will be returned.
*
- * @param loc The desired localed to load a <code>Collator</code> for.
+ * @param loc The desired locale to load a <code>Collator</code> for.
*
* @return A <code>Collator</code> for the requested locale
*/
diff --git a/java/text/DecimalFormat.java b/java/text/DecimalFormat.java
index a9ec7767f..f64249b67 100644
--- a/java/text/DecimalFormat.java
+++ b/java/text/DecimalFormat.java
@@ -542,9 +542,9 @@ public class DecimalFormat extends NumberFormat
// Compute exponent.
long exponent = 0;
double baseNumber;
- if (useExponentialNotation)
+ if (useExponentialNotation && number > 0)
{
- exponent = (long) Math.floor (Math.log(number) / Math.log(10));
+ exponent = (long) Math.floor (Math.log10(number));
exponent = exponent - (exponent % exponentRound);
if (minimumIntegerDigits > 0)
exponent -= minimumIntegerDigits - 1;
@@ -654,7 +654,7 @@ public class DecimalFormat extends NumberFormat
index = dest.length();
dest.setDefaultAttribute(NumberFormat.Field.EXPONENT);
String exponentString = Long.toString ((long) exponent);
-
+
for (count = 0; count < minExponentDigits-exponentString.length();
count++)
dest.append((char) symbols.getZeroDigit());
diff --git a/java/text/RuleBasedCollator.java b/java/text/RuleBasedCollator.java
index 5756e9aa7..4bffcaf29 100644
--- a/java/text/RuleBasedCollator.java
+++ b/java/text/RuleBasedCollator.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package java.text;
+import gnu.classpath.NotImplementedException;
+
import java.util.ArrayList;
import java.util.HashMap;
@@ -921,6 +923,7 @@ element_loop:
* @return A <code>CollationElementIterator</code> for the specified <code>String</code>.
*/
public CollationElementIterator getCollationElementIterator(CharacterIterator source)
+ throws NotImplementedException // Because decomposeCharacter does not work
{
StringBuffer expand = new StringBuffer("");
diff --git a/java/text/SimpleDateFormat.java b/java/text/SimpleDateFormat.java
index c0c4cf68c..2825c7bed 100644
--- a/java/text/SimpleDateFormat.java
+++ b/java/text/SimpleDateFormat.java
@@ -307,7 +307,7 @@ public class SimpleDateFormat extends DateFormat
// Not a valid letter
throw new IllegalArgumentException("Invalid letter "
+ thisChar +
- "encountered at character "
+ " encountered at character "
+ i + ".");
}
else if (thisChar == '\'')
@@ -805,7 +805,8 @@ public class SimpleDateFormat extends DateFormat
buffer.setDefaultAttribute(DateFormat.Field.RFC822_TIME_ZONE);
int pureMinutes = (calendar.get(Calendar.ZONE_OFFSET) +
calendar.get(Calendar.DST_OFFSET)) / (1000 * 60);
- String sign = (pureMinutes < 0) ? "-" : "+";
+ String sign = (pureMinutes < 0) ? "-" : "+";
+ pureMinutes = Math.abs(pureMinutes);
int hours = pureMinutes / 60;
int minutes = pureMinutes % 60;
buffer.append(sign);
diff --git a/java/util/AbstractList.java b/java/util/AbstractList.java
index 8a9b6f10d..114712eee 100644
--- a/java/util/AbstractList.java
+++ b/java/util/AbstractList.java
@@ -327,12 +327,9 @@ while (i.hasNext())
*
* @return True if the end of the list has not yet been
* reached.
- * @throws ConcurrentModificationException if the
- * list has been modified elsewhere.
*/
public boolean hasNext()
{
- checkMod();
return pos < size;
}
@@ -461,12 +458,9 @@ while (i.hasNext())
*
* @return True if the end of the list has not yet been
* reached.
- * @throws ConcurrentModificationException if the
- * list has been modified elsewhere.
*/
public boolean hasNext()
{
- checkMod();
return position < size;
}
@@ -476,12 +470,9 @@ while (i.hasNext())
*
* @return True if objects exist prior to the current
* position of the iterator.
- * @throws ConcurrentModificationException if the
- * list has been modified elsewhere.
*/
public boolean hasPrevious()
{
- checkMod();
return position > 0;
}
@@ -526,12 +517,9 @@ while (i.hasNext())
* list, which will be retrieved by <code>next()</code>
*
* @return The index of the next element.
- * @throws ConcurrentModificationException if the list
- * has been modified elsewhere.
*/
public int nextIndex()
{
- checkMod();
return position;
}
@@ -540,12 +528,9 @@ while (i.hasNext())
* list, which will be retrieved by <code>previous()</code>
*
* @return The index of the previous element.
- * @throws ConcurrentModificationException if the list
- * has been modified elsewhere.
*/
public int previousIndex()
{
- checkMod();
return position - 1;
}
@@ -1030,12 +1015,9 @@ while (i.hasNext())
*
* @return True if the end of the list has not yet been
* reached.
- * @throws ConcurrentModificationException if the
- * list has been modified elsewhere.
*/
public boolean hasNext()
{
- checkMod();
return position < size;
}
@@ -1045,12 +1027,9 @@ while (i.hasNext())
*
* @return True if objects exist prior to the current
* position of the iterator.
- * @throws ConcurrentModificationException if the
- * list has been modified elsewhere.
*/
public boolean hasPrevious()
{
- checkMod();
return position > 0;
}
@@ -1093,8 +1072,6 @@ while (i.hasNext())
* list, which will be retrieved by <code>next()</code>
*
* @return The index of the next element.
- * @throws ConcurrentModificationException if the
- * list has been modified elsewhere.
*/
public int nextIndex()
{
@@ -1106,8 +1083,6 @@ while (i.hasNext())
* list, which will be retrieved by <code>previous()</code>
*
* @return The index of the previous element.
- * @throws ConcurrentModificationException if the
- * list has been modified elsewhere.
*/
public int previousIndex()
{
diff --git a/java/util/Arrays.java b/java/util/Arrays.java
index b28c156b4..29134467b 100644
--- a/java/util/Arrays.java
+++ b/java/util/Arrays.java
@@ -2352,185 +2352,556 @@ public class Arrays
return new Arrays.ArrayList(a);
}
+ /**
+ * Returns the hashcode of an array of long numbers. If two arrays
+ * are equal, according to <code>equals()</code>, they should have the
+ * same hashcode. The hashcode returned by the method is equal to that
+ * obtained by the corresponding <code>List</code> object. This has the same
+ * data, but represents longs in their wrapper class, <code>Long</code>.
+ * For <code>null</code>, 0 is returned.
+ *
+ * @param v an array of long numbers for which the hash code should be
+ * computed.
+ * @return the hash code of the array, or 0 if null was given.
+ * @since 1.5
+ */
+ public static int hashCode(long[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ {
+ int elt = (int) (v[i] ^ (v[i] >>> 32));
+ result = 31 * result + elt;
+ }
+ return result;
+ }
+
+ /**
+ * Returns the hashcode of an array of integer numbers. If two arrays
+ * are equal, according to <code>equals()</code>, they should have the
+ * same hashcode. The hashcode returned by the method is equal to that
+ * obtained by the corresponding <code>List</code> object. This has the same
+ * data, but represents ints in their wrapper class, <code>Integer</code>.
+ * For <code>null</code>, 0 is returned.
+ *
+ * @param v an array of integer numbers for which the hash code should be
+ * computed.
+ * @return the hash code of the array, or 0 if null was given.
+ * @since 1.5
+ */
+ public static int hashCode(int[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ result = 31 * result + v[i];
+ return result;
+ }
+
+ /**
+ * Returns the hashcode of an array of short numbers. If two arrays
+ * are equal, according to <code>equals()</code>, they should have the
+ * same hashcode. The hashcode returned by the method is equal to that
+ * obtained by the corresponding <code>List</code> object. This has the same
+ * data, but represents shorts in their wrapper class, <code>Short</code>.
+ * For <code>null</code>, 0 is returned.
+ *
+ * @param v an array of short numbers for which the hash code should be
+ * computed.
+ * @return the hash code of the array, or 0 if null was given.
+ * @since 1.5
+ */
+ public static int hashCode(short[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ result = 31 * result + v[i];
+ return result;
+ }
+
+ /**
+ * Returns the hashcode of an array of characters. If two arrays
+ * are equal, according to <code>equals()</code>, they should have the
+ * same hashcode. The hashcode returned by the method is equal to that
+ * obtained by the corresponding <code>List</code> object. This has the same
+ * data, but represents chars in their wrapper class, <code>Character</code>.
+ * For <code>null</code>, 0 is returned.
+ *
+ * @param v an array of characters for which the hash code should be
+ * computed.
+ * @return the hash code of the array, or 0 if null was given.
+ * @since 1.5
+ */
+ public static int hashCode(char[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ result = 31 * result + v[i];
+ return result;
+ }
+
+ /**
+ * Returns the hashcode of an array of bytes. If two arrays
+ * are equal, according to <code>equals()</code>, they should have the
+ * same hashcode. The hashcode returned by the method is equal to that
+ * obtained by the corresponding <code>List</code> object. This has the same
+ * data, but represents bytes in their wrapper class, <code>Byte</code>.
+ * For <code>null</code>, 0 is returned.
+ *
+ * @param v an array of bytes for which the hash code should be
+ * computed.
+ * @return the hash code of the array, or 0 if null was given.
+ * @since 1.5
+ */
+ public static int hashCode(byte[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ result = 31 * result + v[i];
+ return result;
+ }
+
+ /**
+ * Returns the hashcode of an array of booleans. If two arrays
+ * are equal, according to <code>equals()</code>, they should have the
+ * same hashcode. The hashcode returned by the method is equal to that
+ * obtained by the corresponding <code>List</code> object. This has the same
+ * data, but represents booleans in their wrapper class,
+ * <code>Boolean</code>. For <code>null</code>, 0 is returned.
+ *
+ * @param v an array of booleans for which the hash code should be
+ * computed.
+ * @return the hash code of the array, or 0 if null was given.
+ * @since 1.5
+ */
+ public static int hashCode(boolean[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ result = 31 * result + (v[i] ? 1231 : 1237);
+ return result;
+ }
+
+ /**
+ * Returns the hashcode of an array of floats. If two arrays
+ * are equal, according to <code>equals()</code>, they should have the
+ * same hashcode. The hashcode returned by the method is equal to that
+ * obtained by the corresponding <code>List</code> object. This has the same
+ * data, but represents floats in their wrapper class, <code>Float</code>.
+ * For <code>null</code>, 0 is returned.
+ *
+ * @param v an array of floats for which the hash code should be
+ * computed.
+ * @return the hash code of the array, or 0 if null was given.
+ * @since 1.5
+ */
+ public static int hashCode(float[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ result = 31 * result + Float.floatToIntBits(v[i]);
+ return result;
+ }
+
+ /**
+ * Returns the hashcode of an array of doubles. If two arrays
+ * are equal, according to <code>equals()</code>, they should have the
+ * same hashcode. The hashcode returned by the method is equal to that
+ * obtained by the corresponding <code>List</code> object. This has the same
+ * data, but represents doubles in their wrapper class, <code>Double</code>.
+ * For <code>null</code>, 0 is returned.
+ *
+ * @param v an array of doubles for which the hash code should be
+ * computed.
+ * @return the hash code of the array, or 0 if null was given.
+ * @since 1.5
+ */
+ public static int hashCode(double[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ {
+ long l = Double.doubleToLongBits(v[i]);
+ int elt = (int) (l ^ (l >>> 32));
+ result = 31 * result + elt;
+ }
+ return result;
+ }
+
+ /**
+ * Returns the hashcode of an array of integer numbers. If two arrays
+ * are equal, according to <code>equals()</code>, they should have the
+ * same hashcode. The hashcode returned by the method is equal to that
+ * obtained by the corresponding <code>List</code> object. This has the same
+ * data, but represents ints in their wrapper class, <code>Integer</code>.
+ * For <code>null</code>, 0 is returned.
+ *
+ * @param v an array of integer numbers for which the hash code should be
+ * computed.
+ * @return the hash code of the array, or 0 if null was given.
+ * @since 1.5
+ */
+ public static int hashCode(Object[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ {
+ int elt = v[i] == null ? 0 : v[i].hashCode();
+ result = 31 * result + elt;
+ }
+ return result;
+ }
+
+ /** @since 1.5 */
+ public static int deepHashCode(Object[] v)
+ {
+ if (v == null)
+ return 0;
+ int result = 1;
+ for (int i = 0; i < v.length; ++i)
+ {
+ int elt;
+ if (v[i] == null)
+ elt = 0;
+ else if (v[i] instanceof boolean[])
+ elt = hashCode((boolean[]) v[i]);
+ else if (v[i] instanceof byte[])
+ elt = hashCode((byte[]) v[i]);
+ else if (v[i] instanceof char[])
+ elt = hashCode((char[]) v[i]);
+ else if (v[i] instanceof short[])
+ elt = hashCode((short[]) v[i]);
+ else if (v[i] instanceof int[])
+ elt = hashCode((int[]) v[i]);
+ else if (v[i] instanceof long[])
+ elt = hashCode((long[]) v[i]);
+ else if (v[i] instanceof float[])
+ elt = hashCode((float[]) v[i]);
+ else if (v[i] instanceof double[])
+ elt = hashCode((double[]) v[i]);
+ else if (v[i] instanceof Object[])
+ elt = hashCode((Object[]) v[i]);
+ else
+ elt = v[i].hashCode();
+ result = 31 * result + elt;
+ }
+ return result;
+ }
+
+ /** @since 1.5 */
+ public static boolean deepEquals(Object[] v1, Object[] v2)
+ {
+ if (v1 == null)
+ return v2 == null;
+ if (v2 == null || v1.length != v2.length)
+ return false;
+
+ for (int i = 0; i < v1.length; ++i)
+ {
+ Object e1 = v1[i];
+ Object e2 = v2[i];
+
+ if (e1 == e2)
+ continue;
+ if (e1 == null || e2 == null)
+ return false;
+
+ boolean check;
+ if (e1 instanceof boolean[] && e2 instanceof boolean[])
+ check = equals((boolean[]) e1, (boolean[]) e2);
+ else if (e1 instanceof byte[] && e2 instanceof byte[])
+ check = equals((byte[]) e1, (byte[]) e2);
+ else if (e1 instanceof char[] && e2 instanceof char[])
+ check = equals((char[]) e1, (char[]) e2);
+ else if (e1 instanceof short[] && e2 instanceof short[])
+ check = equals((short[]) e1, (short[]) e2);
+ else if (e1 instanceof int[] && e2 instanceof int[])
+ check = equals((int[]) e1, (int[]) e2);
+ else if (e1 instanceof long[] && e2 instanceof long[])
+ check = equals((long[]) e1, (long[]) e2);
+ else if (e1 instanceof float[] && e2 instanceof float[])
+ check = equals((float[]) e1, (float[]) e2);
+ else if (e1 instanceof double[] && e2 instanceof double[])
+ check = equals((double[]) e1, (double[]) e2);
+ else if (e1 instanceof Object[] && e2 instanceof Object[])
+ check = equals((Object[]) e1, (Object[]) e2);
+ else
+ check = e1.equals(e2);
+ if (! check)
+ return false;
+ }
+
+ return true;
+ }
+
/**
* Returns a String representation of the argument array. Returns "null"
* if <code>a</code> is null.
- * @param a the array to represent
+ * @param v the array to represent
* @return a String representing this array
* @since 1.5
*/
- public static String toString (long[] a)
+ public static String toString(boolean[] v)
{
- if (a == null)
+ if (v == null)
return "null";
- if (a.length == 0)
- return "[]";
- String result = "[";
- for (int i = 0; i < a.length - 1; i++)
- result += String.valueOf(a[i]) + ", ";
- result += String.valueOf(a[a.length - 1]) + "]";
- return result;
- }
-
+ StringBuilder b = new StringBuilder("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ b.append(v[i]);
+ }
+ b.append("]");
+ return b.toString();
+ }
+
/**
* Returns a String representation of the argument array. Returns "null"
* if <code>a</code> is null.
- * @param a the array to represent
+ * @param v the array to represent
* @return a String representing this array
* @since 1.5
*/
- public static String toString (int[] a)
+ public static String toString(byte[] v)
{
- if (a == null)
+ if (v == null)
return "null";
- if (a.length == 0)
- return "[]";
- String result = "[";
- for (int i = 0; i < a.length - 1; i++)
- result += String.valueOf(a[i]) + ", ";
- result += String.valueOf(a[a.length - 1]) + "]";
- return result;
- }
-
+ StringBuilder b = new StringBuilder("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ b.append(v[i]);
+ }
+ b.append("]");
+ return b.toString();
+ }
+
/**
* Returns a String representation of the argument array. Returns "null"
* if <code>a</code> is null.
- * @param a the array to represent
+ * @param v the array to represent
* @return a String representing this array
* @since 1.5
*/
- public static String toString (short[] a)
+ public static String toString(char[] v)
{
- if (a == null)
+ if (v == null)
return "null";
- if (a.length == 0)
- return "[]";
- String result = "[";
- for (int i = 0; i < a.length - 1; i++)
- result += String.valueOf(a[i]) + ", ";
- result += String.valueOf(a[a.length - 1]) + "]";
- return result;
- }
+ StringBuilder b = new StringBuilder("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ b.append(v[i]);
+ }
+ b.append("]");
+ return b.toString();
+ }
/**
* Returns a String representation of the argument array. Returns "null"
* if <code>a</code> is null.
- * @param a the array to represent
+ * @param v the array to represent
* @return a String representing this array
* @since 1.5
*/
- public static String toString (char[] a)
+ public static String toString(short[] v)
{
- if (a == null)
+ if (v == null)
return "null";
- if (a.length == 0)
- return "[]";
- String result = "[";
- for (int i = 0; i < a.length - 1; i++)
- result += String.valueOf(a[i]) + ", ";
- result += String.valueOf(a[a.length - 1]) + "]";
- return result;
- }
+ StringBuilder b = new StringBuilder("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ b.append(v[i]);
+ }
+ b.append("]");
+ return b.toString();
+ }
/**
* Returns a String representation of the argument array. Returns "null"
* if <code>a</code> is null.
- * @param a the array to represent
+ * @param v the array to represent
* @return a String representing this array
* @since 1.5
*/
- public static String toString (byte[] a)
+ public static String toString(int[] v)
{
- if (a == null)
+ if (v == null)
return "null";
- if (a.length == 0)
- return "[]";
- String result = "[";
- for (int i = 0; i < a.length - 1; i++)
- result += String.valueOf(a[i]) + ", ";
- result += String.valueOf(a[a.length - 1]) + "]";
- return result;
- }
+ StringBuilder b = new StringBuilder("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ b.append(v[i]);
+ }
+ b.append("]");
+ return b.toString();
+ }
/**
* Returns a String representation of the argument array. Returns "null"
* if <code>a</code> is null.
- * @param a the array to represent
+ * @param v the array to represent
* @return a String representing this array
* @since 1.5
*/
- public static String toString (boolean[] a)
+ public static String toString(long[] v)
{
- if (a == null)
+ if (v == null)
return "null";
- if (a.length == 0)
- return "[]";
- String result = "[";
- for (int i = 0; i < a.length - 1; i++)
- result += String.valueOf(a[i]) + ", ";
- result += String.valueOf(a[a.length - 1]) + "]";
- return result;
- }
+ StringBuilder b = new StringBuilder("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ b.append(v[i]);
+ }
+ b.append("]");
+ return b.toString();
+ }
/**
* Returns a String representation of the argument array. Returns "null"
* if <code>a</code> is null.
- * @param a the array to represent
+ * @param v the array to represent
* @return a String representing this array
* @since 1.5
*/
- public static String toString (float[] a)
+ public static String toString(float[] v)
{
- if (a == null)
+ if (v == null)
return "null";
- if (a.length == 0)
- return "[]";
- String result = "[";
- for (int i = 0; i < a.length - 1; i++)
- result += String.valueOf(a[i]) + ", ";
- result += String.valueOf(a[a.length - 1]) + "]";
- return result;
- }
-
+ StringBuilder b = new StringBuilder("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ b.append(v[i]);
+ }
+ b.append("]");
+ return b.toString();
+ }
+
/**
* Returns a String representation of the argument array. Returns "null"
* if <code>a</code> is null.
- * @param a the array to represent
+ * @param v the array to represent
* @return a String representing this array
* @since 1.5
*/
- public static String toString (double[] a)
+ public static String toString(double[] v)
{
- if (a == null)
+ if (v == null)
return "null";
- if (a.length == 0)
- return "[]";
- String result = "[";
- for (int i = 0; i < a.length - 1; i++)
- result += String.valueOf(a[i]) + ", ";
- result += String.valueOf(a[a.length - 1]) + "]";
- return result;
- }
+ StringBuilder b = new StringBuilder("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ b.append(v[i]);
+ }
+ b.append("]");
+ return b.toString();
+ }
/**
* Returns a String representation of the argument array. Returns "null"
* if <code>a</code> is null.
- * @param a the array to represent
+ * @param v the array to represent
* @return a String representing this array
* @since 1.5
*/
- public static String toString (Object[] a)
+ public static String toString(Object[] v)
{
- if (a == null)
+ if (v == null)
return "null";
- if (a.length == 0)
- return "[]";
- String result = "[";
- for (int i = 0; i < a.length - 1; i++)
- result += String.valueOf(a[i]) + ", ";
- result += String.valueOf(a[a.length - 1]) + "]";
- return result;
- }
+ StringBuilder b = new StringBuilder("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ b.append(v[i]);
+ }
+ b.append("]");
+ return b.toString();
+ }
+
+ private static void deepToString(Object[] v, StringBuilder b, HashSet seen)
+ {
+ b.append("[");
+ for (int i = 0; i < v.length; ++i)
+ {
+ if (i > 0)
+ b.append(", ");
+ Object elt = v[i];
+ if (elt == null)
+ b.append("null");
+ else if (elt instanceof boolean[])
+ b.append(toString((boolean[]) elt));
+ else if (elt instanceof byte[])
+ b.append(toString((byte[]) elt));
+ else if (elt instanceof char[])
+ b.append(toString((char[]) elt));
+ else if (elt instanceof short[])
+ b.append(toString((short[]) elt));
+ else if (elt instanceof int[])
+ b.append(toString((int[]) elt));
+ else if (elt instanceof long[])
+ b.append(toString((long[]) elt));
+ else if (elt instanceof float[])
+ b.append(toString((float[]) elt));
+ else if (elt instanceof double[])
+ b.append(toString((double[]) elt));
+ else if (elt instanceof Object[])
+ {
+ Object[] os = (Object[]) elt;
+ if (seen.contains(os))
+ b.append("[...]");
+ else
+ {
+ seen.add(os);
+ deepToString(os, b, seen);
+ }
+ }
+ else
+ b.append(elt);
+ }
+ b.append("]");
+ }
+
+ /** @since 1.5 */
+ public static String deepToString(Object[] v)
+ {
+ if (v == null)
+ return "null";
+ HashSet seen = new HashSet();
+ StringBuilder b = new StringBuilder();
+ deepToString(v, b, seen);
+ return b.toString();
+ }
/**
* Inner class used by {@link #asList(Object[])} to provide a list interface
diff --git a/java/util/BitSet.java b/java/util/BitSet.java
index ce88794f5..f1b5aaa06 100644
--- a/java/util/BitSet.java
+++ b/java/util/BitSet.java
@@ -365,7 +365,7 @@ public class BitSet implements Cloneable, Serializable
throw new IndexOutOfBoundsException();
BitSet bs = new BitSet(to - from);
int lo_offset = from >>> 6;
- if (lo_offset >= bits.length)
+ if (lo_offset >= bits.length || to == from)
return bs;
int lo_bit = from & LONG_MASK;
diff --git a/java/util/Calendar.java b/java/util/Calendar.java
index f94bed40d..d4bbcd08e 100644
--- a/java/util/Calendar.java
+++ b/java/util/Calendar.java
@@ -877,6 +877,7 @@ public abstract class Calendar implements Serializable, Cloneable
1, 1970, JANUARY, 1, 1, 1, 1, THURSDAY, 1, AM, 0, 0, 0,
0, 0, zone.getRawOffset(), 0
};
+ complete();
isTimeSet = false;
areFieldsSet = false;
isSet[field] = false;
@@ -1037,6 +1038,8 @@ public abstract class Calendar implements Serializable, Cloneable
public void setTimeZone(TimeZone zone)
{
this.zone = zone;
+ computeTime();
+ computeFields();
}
/**
diff --git a/java/util/Collection.java b/java/util/Collection.java
index 29e1b3786..f7db708c1 100644
--- a/java/util/Collection.java
+++ b/java/util/Collection.java
@@ -81,9 +81,9 @@ package java.util;
* @see Arrays
* @see AbstractCollection
* @since 1.2
- * @status updated to 1.4
+ * @status updated to 1.5 (minus generics)
*/
-public interface Collection
+public interface Collection extends Iterable
{
/**
* Add an element to this collection.
diff --git a/java/util/Collections.java b/java/util/Collections.java
index dc37bad8a..101a61838 100644
--- a/java/util/Collections.java
+++ b/java/util/Collections.java
@@ -1,5 +1,5 @@
/* Collections.java -- Utility class with methods to operate on collections
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -4817,6 +4817,87 @@ public class Collections
private static final class UnmodifiableEntrySet extends UnmodifiableSet
implements Serializable
{
+ // Unmodifiable implementation of Map.Entry used as return value for
+ // UnmodifiableEntrySet accessors (iterator, toArray, toArray(Object[]))
+ private static final class UnmodifiableMapEntry
+ implements Map.Entry
+ {
+ private final Entry e;
+
+ private UnmodifiableMapEntry(Entry e)
+ {
+ super();
+ this.e = e;
+ }
+
+ /**
+ * Returns <code>true</code> if the object, o, is also a map entry
+ * with an identical key and value.
+ *
+ * @param o the object to compare.
+ * @return <code>true</code> if o is an equivalent map entry.
+ */
+ public boolean equals(Object o)
+ {
+ return e.equals(o);
+ }
+
+ /**
+ * Returns the key of this map entry.
+ *
+ * @return the key.
+ */
+ public Object getKey()
+ {
+ return e.getKey();
+ }
+
+ /**
+ * Returns the value of this map entry.
+ *
+ * @return the value.
+ */
+ public Object getValue()
+ {
+ return e.getValue();
+ }
+
+ /**
+ * Computes the hash code of this map entry. The computation is
+ * described in the <code>Map</code> interface documentation.
+ *
+ * @return the hash code of this entry.
+ * @see Map#hashCode()
+ */
+ public int hashCode()
+ {
+ return e.hashCode();
+ }
+
+ /**
+ * Blocks the alteration of the value of this map entry. This method
+ * never returns, throwing an exception instead.
+ *
+ * @param value The new value.
+ * @throws UnsupportedOperationException as an unmodifiable map entry
+ * does not support the <code>setValue()</code> operation.
+ */
+ public Object setValue(Object value)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Returns a textual representation of the map entry.
+ *
+ * @return The map entry as a <code>String</code>.
+ */
+ public String toString()
+ {
+ return e.toString();
+ }
+ }
+
/**
* Compatible with JDK 1.4.
*/
@@ -4846,80 +4927,45 @@ public class Collections
public Object next()
{
final Map.Entry e = (Map.Entry) super.next();
- return new Map.Entry()
- {
- /**
- * Returns <code>true</code> if the object, o, is also a map entry with an
- * identical key and value.
- *
- * @param o the object to compare.
- * @return <code>true</code> if o is an equivalent map entry.
- */
- public boolean equals(Object o)
- {
- return e.equals(o);
- }
-
- /**
- * Returns the key of this map entry.
- *
- * @return the key.
- */
- public Object getKey()
- {
- return e.getKey();
- }
+ return new UnmodifiableMapEntry(e);
+ }
+ };
+ }
- /**
- * Returns the value of this map entry.
- *
- * @return the value.
- */
- public Object getValue()
- {
- return e.getValue();
- }
+ // The array returned is an array of UnmodifiableMapEntry instead of
+ // Map.Entry
+ public Object[] toArray()
+ {
+ Object[] mapEntryResult = super.toArray();
+ UnmodifiableMapEntry result[] = null;
- /**
- * Computes the hash code of this map entry.
- * The computation is described in the <code>Map</code>
- * interface documentation.
- *
- * @return the hash code of this entry.
- * @see Map#hashCode()
- */
- public int hashCode()
+ if (mapEntryResult != null)
+ {
+ result = new UnmodifiableMapEntry[mapEntryResult.length];
+ for (int i = 0; i < mapEntryResult.length; i++)
{
- return e.hashCode();
+ result[i] = new UnmodifiableMapEntry((Entry) mapEntryResult[i]);
}
+ }
+ return result;
+ }
- /**
- * Blocks the alteration of the value of this map entry.
- * This method never returns, throwing an exception instead.
- *
- * @param value The new value.
- * @throws UnsupportedOperationException as an unmodifiable
- * map entry does not support the <code>setValue()</code>
- * operation.
- */
- public Object setValue(Object value)
- {
- throw new UnsupportedOperationException();
- }
+ // The array returned is an array of UnmodifiableMapEntry instead of
+ // Map.Entry
+ public Object[] toArray(Object[] array)
+ {
+ super.toArray(array);
- /**
- * Returns a textual representation of the map entry.
- *
- * @return The map entry as a <code>String</code>.
- */
- public String toString()
+ if (array != null)
+ {
+ for (int i = 0; i < array.length; i++)
{
- return e.toString();
+ array[i] = new UnmodifiableMapEntry((Entry) array[i]);
}
- };
}
- };
+ return array;
}
+
} // class UnmodifiableEntrySet
/**
diff --git a/java/util/GregorianCalendar.java b/java/util/GregorianCalendar.java
index 89b7c4dbd..5ce053a37 100644
--- a/java/util/GregorianCalendar.java
+++ b/java/util/GregorianCalendar.java
@@ -588,7 +588,7 @@ public class GregorianCalendar extends Calendar
day = offs + 7 * (fields[WEEK_OF_MONTH] - 1);
offs = fields[DAY_OF_WEEK] - getFirstDayOfWeek();
- if (offs <= 0)
+ if (offs < 0)
offs += 7;
day += offs;
}
diff --git a/java/util/HashMap.java b/java/util/HashMap.java
index 7176db0d5..a734af484 100644
--- a/java/util/HashMap.java
+++ b/java/util/HashMap.java
@@ -849,12 +849,9 @@ public class HashMap extends AbstractMap
/**
* Returns true if the Iterator has more elements.
* @return true if there are more elements
- * @throws ConcurrentModificationException if the HashMap was modified
*/
public boolean hasNext()
{
- if (knownMod != modCount)
- throw new ConcurrentModificationException();
return count > 0;
}
diff --git a/java/util/Hashtable.java b/java/util/Hashtable.java
index 76b0d5c15..4c00d18a8 100644
--- a/java/util/Hashtable.java
+++ b/java/util/Hashtable.java
@@ -1017,12 +1017,9 @@ public class Hashtable extends Dictionary
/**
* Returns true if the Iterator has more elements.
* @return true if there are more elements
- * @throws ConcurrentModificationException if the hashtable was modified
*/
public boolean hasNext()
{
- if (knownMod != modCount)
- throw new ConcurrentModificationException();
return count > 0;
}
diff --git a/java/util/IdentityHashMap.java b/java/util/IdentityHashMap.java
index 6369fac69..89ef03415 100644
--- a/java/util/IdentityHashMap.java
+++ b/java/util/IdentityHashMap.java
@@ -705,12 +705,9 @@ public class IdentityHashMap extends AbstractMap
/**
* Returns true if the Iterator has more elements.
* @return true if there are more elements
- * @throws ConcurrentModificationException if the Map was modified
*/
public boolean hasNext()
{
- if (knownMod != modCount)
- throw new ConcurrentModificationException();
return count > 0;
}
diff --git a/java/util/InvalidPropertiesFormatException.java b/java/util/InvalidPropertiesFormatException.java
index 6540c2313..aaa6c4eb4 100644
--- a/java/util/InvalidPropertiesFormatException.java
+++ b/java/util/InvalidPropertiesFormatException.java
@@ -39,11 +39,16 @@ exception statement from your version. */
package java.util;
import java.io.IOException;
+import java.io.NotSerializableException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
-// FIXME: serialization methods should throw NotSerializableException
/** @since 1.5 */
public class InvalidPropertiesFormatException extends IOException
{
+ // This class won't serialize, but we have a UID to placate the compiler.
+ private static final long serialVersionUID = 7763056076009360219L;
+
public InvalidPropertiesFormatException(String message)
{
super(message);
@@ -54,4 +59,14 @@ public class InvalidPropertiesFormatException extends IOException
super();
initCause(cause);
}
+
+ private void writeObject(ObjectOutputStream out) throws IOException
+ {
+ throw new NotSerializableException("objects of this type are not serializable");
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException
+ {
+ throw new NotSerializableException("objects of this type are not serializable");
+ }
}
diff --git a/java/util/LinkedHashMap.java b/java/util/LinkedHashMap.java
index 8e895a9e0..2b002b272 100644
--- a/java/util/LinkedHashMap.java
+++ b/java/util/LinkedHashMap.java
@@ -452,12 +452,9 @@ public class LinkedHashMap extends HashMap
* Returns true if the Iterator has more elements.
*
* @return true if there are more elements
- * @throws ConcurrentModificationException if the HashMap was modified
*/
public boolean hasNext()
{
- if (knownMod != modCount)
- throw new ConcurrentModificationException();
return current != null;
}
diff --git a/java/util/LinkedList.java b/java/util/LinkedList.java
index 2a35425fa..e77ae536b 100644
--- a/java/util/LinkedList.java
+++ b/java/util/LinkedList.java
@@ -804,11 +804,9 @@ public class LinkedList extends AbstractSequentialList
* Returns the index of the next element.
*
* @return the next index
- * @throws ConcurrentModificationException if the list was modified
*/
public int nextIndex()
{
- checkMod();
return position;
}
@@ -816,11 +814,9 @@ public class LinkedList extends AbstractSequentialList
* Returns the index of the previous element.
*
* @return the previous index
- * @throws ConcurrentModificationException if the list was modified
*/
public int previousIndex()
{
- checkMod();
return position - 1;
}
@@ -828,11 +824,9 @@ public class LinkedList extends AbstractSequentialList
* Returns true if more elements exist via next.
*
* @return true if next will succeed
- * @throws ConcurrentModificationException if the list was modified
*/
public boolean hasNext()
{
- checkMod();
return (next != null);
}
@@ -840,11 +834,9 @@ public class LinkedList extends AbstractSequentialList
* Returns true if more elements exist via previous.
*
* @return true if previous will succeed
- * @throws ConcurrentModificationException if the list was modified
*/
public boolean hasPrevious()
{
- checkMod();
return (previous != null);
}
diff --git a/java/util/Locale.java b/java/util/Locale.java
index 9e7bbfea2..d2aead43c 100644
--- a/java/util/Locale.java
+++ b/java/util/Locale.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package java.util;
import gnu.classpath.SystemProperties;
+import gnu.java.locale.LocaleHelper;
import java.io.IOException;
import java.io.ObjectInputStream;
@@ -65,11 +66,12 @@ import java.io.Serializable;
* be separated by an underscore (U+005F).
*
* <p>The default locale is determined by the values of the system properties
- * user.language, user.region, and user.variant, defaulting to "en". Note that
- * the locale does NOT contain the conversion and formatting capabilities (for
- * that, use ResourceBundle and java.text). Rather, it is an immutable tag
- * object for identifying a given locale, which is referenced by these other
- * classes when they must make locale-dependent decisions.
+ * user.language, user.country (or user.region), and user.variant, defaulting
+ * to "en_US". Note that the locale does NOT contain the conversion and
+ * formatting capabilities (for that, use ResourceBundle and java.text).
+ * Rather, it is an immutable tag object for identifying a given locale, which
+ * is referenced by these other classes when they must make locale-dependent
+ * decisions.
*
* @see ResourceBundle
* @see java.text.Format
@@ -209,10 +211,18 @@ public final class Locale implements Serializable, Cloneable
* null. Note the logic in the main constructor, to detect when
* bootstrapping has completed.
*/
- private static Locale defaultLocale =
- getLocale(SystemProperties.getProperty("user.language", "en"),
- SystemProperties.getProperty("user.region", ""),
- SystemProperties.getProperty("user.variant", ""));
+ private static Locale defaultLocale;
+
+ static {
+ String language = SystemProperties.getProperty("user.language", "en");
+ String country = SystemProperties.getProperty("user.country", "US");
+ String region = SystemProperties.getProperty("user.region", null);
+ String variant = SystemProperties.getProperty("user.variant", "");
+
+ defaultLocale = getLocale(language,
+ (region != null) ? region : country,
+ variant);
+ }
/**
* Array storing all the available two-letter ISO639 languages.
@@ -236,38 +246,38 @@ public final class Locale implements Serializable, Cloneable
}
/**
- * Retrieves the locale with the specified language and region
+ * Retrieves the locale with the specified language and country
* from the cache.
*
* @param language the language of the locale to retrieve.
- * @param region the region of the locale to retrieve.
+ * @param country the country of the locale to retrieve.
* @return the locale.
*/
- private static Locale getLocale(String language, String region)
+ private static Locale getLocale(String language, String country)
{
- return getLocale(language, region, "");
+ return getLocale(language, country, "");
}
/**
- * Retrieves the locale with the specified language, region
+ * Retrieves the locale with the specified language, country
* and variant from the cache.
*
* @param language the language of the locale to retrieve.
- * @param region the region of the locale to retrieve.
+ * @param country the country of the locale to retrieve.
* @param variant the variant of the locale to retrieve.
* @return the locale.
*/
- private static Locale getLocale(String language, String region, String variant)
+ private static Locale getLocale(String language, String country, String variant)
{
if (localeMap == null)
localeMap = new HashMap(256);
- String name = language + "_" + region + "_" + variant;
+ String name = language + "_" + country + "_" + variant;
Locale locale = (Locale) localeMap.get(name);
if (locale == null)
{
- locale = new Locale(language, region, variant);
+ locale = new Locale(language, country, variant);
localeMap.put(name, locale);
}
@@ -384,33 +394,33 @@ public final class Locale implements Serializable, Cloneable
{
if (availableLocales == null)
{
- String[] localeNames = LocaleData.localeNames;
- availableLocales = new Locale[localeNames.length];
+ int len = LocaleHelper.getLocaleCount();
+ availableLocales = new Locale[len];
- for (int i = 0; i < localeNames.length; i++)
+ for (int i = 0; i < len; i++)
{
String language;
- String region = "";
+ String country = "";
String variant = "";
- String name = localeNames[i];
+ String name = LocaleHelper.getLocaleName(i);
language = name.substring(0, 2);
if (name.length() > 2)
- region = name.substring(3);
+ country = name.substring(3);
- int index = region.indexOf("_");
+ int index = country.indexOf("_");
if (index > 0)
{
- variant = region.substring(index + 1);
- region = region.substring(0, index - 1);
+ variant = country.substring(index + 1);
+ country = country.substring(0, index - 1);
}
- availableLocales[i] = getLocale(language, region, variant);
+ availableLocales[i] = getLocale(language, country, variant);
}
}
- return availableLocales;
+ return (Locale[]) availableLocales.clone();
}
/**
@@ -426,7 +436,7 @@ public final class Locale implements Serializable, Cloneable
countryCache = getISOStrings("territories");
}
- return countryCache;
+ return (String[]) countryCache.clone();
}
/**
@@ -441,7 +451,7 @@ public final class Locale implements Serializable, Cloneable
{
languageCache = getISOStrings("languages");
}
- return languageCache;
+ return (String[]) languageCache.clone();
}
/**
diff --git a/java/util/SimpleTimeZone.java b/java/util/SimpleTimeZone.java
index 0bda44c33..72d61ff19 100644
--- a/java/util/SimpleTimeZone.java
+++ b/java/util/SimpleTimeZone.java
@@ -333,8 +333,6 @@ public class SimpleTimeZone extends TimeZone
setStartRule(startMonth, startDayOfWeekInMonth, startDayOfWeek, startTime);
setEndRule(endMonth, endDayOfWeekInMonth, endDayOfWeek, endTime);
- if (startMonth == endMonth)
- throw new IllegalArgumentException("startMonth and endMonth must be different");
this.startYear = 0;
}
@@ -393,8 +391,6 @@ public class SimpleTimeZone extends TimeZone
setStartRule(startMonth, startDayOfWeekInMonth, startDayOfWeek, startTime);
setEndRule(endMonth, endDayOfWeekInMonth, endDayOfWeek, endTime);
- if (startMonth == endMonth)
- throw new IllegalArgumentException("startMonth and endMonth must be different");
this.startYear = 0;
this.dstSavings = dstSavings;
@@ -413,67 +409,66 @@ public class SimpleTimeZone extends TimeZone
}
/**
- * Checks if the month, day, dayOfWeek arguments are in range and
+ * Checks if the values are in range and
* returns the mode of the rule.
* @param month the month parameter as in the constructor
- * @param day the day parameter as in the constructor
- * @param dayOfWeek the day of week parameter as in the constructor
* @return the mode of this rule see startMode.
* @exception IllegalArgumentException if parameters are out of range.
* @see #SimpleTimeZone(int, String, int, int, int, int, int, int, int, int)
* @see #startMode
*/
- private int checkRule(int month, int day, int dayOfWeek)
+ private int checkRule(int month)
{
- if (month < 0 || month > 11)
- throw new IllegalArgumentException("month out of range");
-
- int daysInMonth = getDaysInMonth(month, 1);
- if (dayOfWeek == 0)
- {
- if (day <= 0 || day > daysInMonth)
- throw new IllegalArgumentException("day out of range");
- return DOM_MODE;
- }
- else if (dayOfWeek > 0)
- {
- if (Math.abs(day) > (daysInMonth + 6) / 7)
- throw new IllegalArgumentException("dayOfWeekInMonth out of range");
- if (dayOfWeek > Calendar.SATURDAY)
- throw new IllegalArgumentException("dayOfWeek out of range");
- return DOW_IN_MONTH_MODE;
- }
- else
+ if (startDay != 0)
{
- if (day == 0 || Math.abs(day) > daysInMonth)
- throw new IllegalArgumentException("day out of range");
- if (dayOfWeek < -Calendar.SATURDAY)
- throw new IllegalArgumentException("dayOfWeek out of range");
- if (day < 0)
- return DOW_LE_DOM_MODE;
- else
- return DOW_GE_DOM_MODE;
+ if (startMonth < 0 || startMonth > 11)
+ throw new IllegalArgumentException("month out of range");
+
+ if (startDayOfWeek == 0)
+ startMode = DOM_MODE;
+ else
+ {
+ if (startDayOfWeek > 0)
+ startMode = DOW_IN_MONTH_MODE;
+ else
+ {
+ startDayOfWeek = -startDayOfWeek;
+ if (startDay < 0)
+ {
+ startDay = - startDay;
+ startMode = DOW_LE_DOM_MODE;
+ }
+ else
+ startMode = DOW_GE_DOM_MODE;
+ }
+
+ if (startDayOfWeek > Calendar.SATURDAY)
+ throw new IllegalArgumentException("day of week out of range");
+ }
+
+ if (startMode != DOW_IN_MONTH_MODE
+ && (startDay <= 0 || startDay > getDaysInMonth(month, 1)))
+ throw new IllegalArgumentException("day out of range");
}
+ return startMode;
}
/**
- * Sets the daylight savings start rule. You must also set the
- * end rule with <code>setEndRule</code> or the result of
- * getOffset is undefined. For the parameters see the ten-argument
- * constructor above.
- *
- * @param month The month where daylight savings start, zero
- * based. You should use the constants in Calendar.
+ * Sets the daylight savings start rule. You must also set the end rule with
+ * <code>setEndRule</code> or the result of getOffset is undefined. For the
+ * parameters see the ten-argument constructor above.
+ *
+ * @param month The month where daylight savings start, zero based. You should
+ * use the constants in Calendar.
* @param day A day of month or day of week in month.
* @param dayOfWeek The day of week where daylight savings start.
- * @param time The time in milliseconds standard time where daylight
- * savings start.
+ * @param time The time in milliseconds standard time where daylight savings
+ * start.
* @exception IllegalArgumentException if parameters are out of range.
* @see SimpleTimeZone
*/
public void setStartRule(int month, int day, int dayOfWeek, int time)
{
- this.startMode = checkRule(month, day, dayOfWeek);
this.startMonth = month;
this.startDay = day;
this.startDayOfWeek = Math.abs(dayOfWeek);
@@ -483,6 +478,7 @@ public class SimpleTimeZone extends TimeZone
// Convert from UTC to STANDARD
this.startTime = time + this.rawOffset;
useDaylight = true;
+ this.startMode = checkRule(month);
}
/**
@@ -517,9 +513,6 @@ public class SimpleTimeZone extends TimeZone
// or before mode.
this.startDay = after ? Math.abs(day) : -Math.abs(day);
this.startDayOfWeek = after ? Math.abs(dayOfWeek) : -Math.abs(dayOfWeek);
- this.startMode = (dayOfWeek != 0)
- ? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
- : checkRule(month, day, dayOfWeek);
this.startDay = Math.abs(this.startDay);
this.startDayOfWeek = Math.abs(this.startDayOfWeek);
@@ -531,6 +524,9 @@ public class SimpleTimeZone extends TimeZone
// Convert from UTC to STANDARD
this.startTime = time + this.rawOffset;
useDaylight = true;
+ this.startMode = (dayOfWeek != 0)
+ ? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
+ : checkRule(month);
}
/**
@@ -566,7 +562,6 @@ public class SimpleTimeZone extends TimeZone
*/
public void setEndRule(int month, int day, int dayOfWeek, int time)
{
- this.endMode = checkRule(month, day, dayOfWeek);
this.endMonth = month;
this.endDay = day;
this.endDayOfWeek = Math.abs(dayOfWeek);
@@ -579,6 +574,7 @@ public class SimpleTimeZone extends TimeZone
// Convert from UTC to DST
this.endTime = time + this.rawOffset + this.dstSavings;
useDaylight = true;
+ this.endMode = checkRule(month);
}
/**
@@ -611,9 +607,6 @@ public class SimpleTimeZone extends TimeZone
// or before mode.
this.endDay = after ? Math.abs(day) : -Math.abs(day);
this.endDayOfWeek = after ? Math.abs(dayOfWeek) : -Math.abs(dayOfWeek);
- this.endMode = (dayOfWeek != 0)
- ? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
- : checkRule(month, day, dayOfWeek);
this.endDay = Math.abs(this.endDay);
this.endDayOfWeek = Math.abs(endDayOfWeek);
@@ -628,6 +621,9 @@ public class SimpleTimeZone extends TimeZone
// Convert from UTC to DST
this.endTime = time + this.rawOffset + this.dstSavings;
useDaylight = true;
+ this.endMode = (dayOfWeek != 0)
+ ? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
+ : checkRule(month);
}
/**
diff --git a/java/util/TreeMap.java b/java/util/TreeMap.java
index a00f257aa..60d0a4d50 100644
--- a/java/util/TreeMap.java
+++ b/java/util/TreeMap.java
@@ -1434,12 +1434,9 @@ public class TreeMap extends AbstractMap
/**
* Returns true if the Iterator has more elements.
* @return true if there are more elements
- * @throws ConcurrentModificationException if the TreeMap was modified
*/
public boolean hasNext()
{
- if (knownMod != modCount)
- throw new ConcurrentModificationException();
return next != max;
}
diff --git a/java/util/WeakHashMap.java b/java/util/WeakHashMap.java
index 2ed982ac3..ef2444c04 100644
--- a/java/util/WeakHashMap.java
+++ b/java/util/WeakHashMap.java
@@ -292,12 +292,9 @@ public class WeakHashMap extends AbstractMap implements Map
/**
* Checks if there are more entries.
* @return true, iff there are more elements.
- * @throws ConcurrentModificationException if the hash map was
- * modified.
*/
public boolean hasNext()
{
- checkMod();
return nextEntry != null;
}
diff --git a/java/util/jar/Attributes.java b/java/util/jar/Attributes.java
index c8babddab..92d29cf49 100644
--- a/java/util/jar/Attributes.java
+++ b/java/util/jar/Attributes.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package java.util.jar;
+import gnu.java.util.jar.JarUtils;
+
import java.util.Collection;
import java.util.Hashtable;
import java.util.Map;
@@ -65,7 +67,8 @@ import java.util.Set;
* @see java.util.jar.Attributes.Name
* @author Mark Wielaard (mark@klomp.org)
*/
-public class Attributes implements Cloneable, Map
+public class Attributes
+ implements Cloneable, java.util.Map // Fully qualified for jikes 1.22
{
// Fields
@@ -121,14 +124,13 @@ public class Attributes implements Cloneable, Map
* General main attribute -
* the version of this Manifest file.
*/
- public static final Name MANIFEST_VERSION = new Name("Manifest-Version");
+ public static final Name MANIFEST_VERSION = new Name(JarUtils.MANIFEST_VERSION);
/**
* General main attribute -
* the version of the jar file signature.
*/
- public static final Name SIGNATURE_VERSION
- = new Name("Signature-Version");
+ public static final Name SIGNATURE_VERSION = new Name(JarUtils.SIGNATURE_VERSION);
/**
* General main attribute -
@@ -433,7 +435,7 @@ public class Attributes implements Cloneable, Map
* @returns the old value of the attribute name or null if it didn't exist
* yet
*/
- public String putValue(Name name, String value)
+ private String putValue(Name name, String value)
{
return (String) put(name, value);
}
diff --git a/java/util/jar/JarFile.java b/java/util/jar/JarFile.java
index 7ccbc60af..88814f1d6 100644
--- a/java/util/jar/JarFile.java
+++ b/java/util/jar/JarFile.java
@@ -1,5 +1,5 @@
/* JarFile.java - Representation of a jar file
- Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -42,6 +42,7 @@ import gnu.java.io.Base64InputStream;
import gnu.java.security.OID;
import gnu.java.security.pkcs.PKCS7SignedData;
import gnu.java.security.pkcs.SignerInfo;
+import gnu.java.security.provider.Gnu;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -105,6 +106,14 @@ public class JarFile extends ZipFile
/** The suffix for signature files. */
private static final String SF_SUFFIX = ".SF";
+ /**
+ * The security provider to use for signature verification.
+ * We need a known fallback to be able to read any signed jar file
+ * (which might contain the user selected security provider).
+ * This is package-private to avoid accessor methods for inner classes.
+ */
+ static final Gnu provider = new Gnu();
+
// Signature OIDs.
private static final OID MD2_OID = new OID("1.2.840.113549.2.2");
private static final OID MD4_OID = new OID("1.2.840.113549.2.4");
@@ -636,19 +645,19 @@ public class JarFile extends ZipFile
{
if (!signerInfo.getDigestAlgorithmId().equals(SHA1_OID))
return;
- sig = Signature.getInstance("SHA1withDSA");
+ sig = Signature.getInstance("SHA1withDSA", provider);
}
else if (alg.equals(RSA_ENCRYPTION_OID))
{
OID hash = signerInfo.getDigestAlgorithmId();
if (hash.equals(MD2_OID))
- sig = Signature.getInstance("md2WithRsaEncryption");
+ sig = Signature.getInstance("md2WithRsaEncryption", provider);
else if (hash.equals(MD4_OID))
- sig = Signature.getInstance("md4WithRsaEncryption");
+ sig = Signature.getInstance("md4WithRsaEncryption", provider);
else if (hash.equals(MD5_OID))
- sig = Signature.getInstance("md5WithRsaEncryption");
+ sig = Signature.getInstance("md5WithRsaEncryption", provider);
else if (hash.equals(SHA1_OID))
- sig = Signature.getInstance("sha1WithRsaEncryption");
+ sig = Signature.getInstance("sha1WithRsaEncryption", provider);
else
return;
}
@@ -756,7 +765,7 @@ public class JarFile extends ZipFile
try
{
byte[] hash = Base64InputStream.decode((String) e.getValue());
- MessageDigest md = MessageDigest.getInstance(alg);
+ MessageDigest md = MessageDigest.getInstance(alg, provider);
md.update(entryBytes);
byte[] hash2 = md.digest();
if (DEBUG)
@@ -939,8 +948,9 @@ public class JarFile extends ZipFile
hashes.add(Base64InputStream.decode((String) e.getValue()));
try
{
- md.add(MessageDigest.getInstance
- (key.substring(0, key.length() - DIGEST_KEY_SUFFIX.length())));
+ int length = key.length() - DIGEST_KEY_SUFFIX.length();
+ String alg = key.substring(0, length);
+ md.add(MessageDigest.getInstance(alg, provider));
}
catch (NoSuchAlgorithmException nsae)
{
diff --git a/java/util/jar/Manifest.java b/java/util/jar/Manifest.java
index 64876f9da..aa869f4c4 100644
--- a/java/util/jar/Manifest.java
+++ b/java/util/jar/Manifest.java
@@ -37,14 +37,12 @@ exception statement from your version. */
package java.util.jar;
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
+import gnu.java.util.jar.JarUtils;
+
import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Hashtable;
-import java.util.Iterator;
import java.util.Map;
/**
@@ -58,9 +56,6 @@ public class Manifest implements Cloneable
{
// Fields
- /** Platform-independent line-ending. */
- private static final byte[] CRLF = new byte[] { 0x0D, 0x0A };
-
/** The main attributes of the manifest (jar file). */
private final Attributes mainAttr;
@@ -164,152 +159,7 @@ public class Manifest implements Cloneable
*/
public void read(InputStream in) throws IOException
{
- BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
- read_main_section(getMainAttributes(), br);
- read_individual_sections(getEntries(), br);
- }
-
- // Private Static methods for reading the Manifest file from BufferedReader
-
- private static void read_main_section(Attributes attr,
- BufferedReader br) throws IOException
- {
- // According to the spec we should actually call read_version_info() here.
- read_attributes(attr, br);
- // Explicitly set Manifest-Version attribute if not set in Main
- // attributes of Manifest.
- if (attr.getValue(Attributes.Name.MANIFEST_VERSION) == null)
- attr.putValue(Attributes.Name.MANIFEST_VERSION, "0.0");
- }
-
- /**
- * Pedantic method that requires the next attribute in the Manifest to be
- * the "Manifest-Version". This follows the Manifest spec closely but
- * reject some jar Manifest files out in the wild.
- */
- private static void read_version_info(Attributes attr,
- BufferedReader br) throws IOException
- {
- String version_header = Attributes.Name.MANIFEST_VERSION.toString();
- try
- {
- String value = expect_header(version_header, br);
- attr.putValue(Attributes.Name.MANIFEST_VERSION, value);
- }
- catch (IOException ioe)
- {
- throw new JarException("Manifest should start with a " +
- version_header + ": " + ioe.getMessage());
- }
- }
-
- private static String expect_header(String header, BufferedReader br)
- throws IOException
- {
- String s = br.readLine();
- if (s == null)
- {
- throw new JarException("unexpected end of file");
- }
- return expect_header(header, br, s);
- }
-
- private static String expect_header(String header, BufferedReader br,
- String s) throws IOException
- {
- try
- {
- String name = s.substring(0, header.length() + 1);
- if (name.equalsIgnoreCase(header + ":"))
- {
- String value_start = s.substring(header.length() + 2);
- return read_header_value(value_start, br);
- }
- }
- catch (IndexOutOfBoundsException iobe)
- {
- }
- // If we arrive here, something went wrong
- throw new JarException("unexpected '" + s + "'");
- }
-
- private static String read_header_value(String s, BufferedReader br)
- throws IOException
- {
- boolean try_next = true;
- while (try_next)
- {
- // Lets see if there is something on the next line
- br.mark(1);
- if (br.read() == ' ')
- {
- s += br.readLine();
- }
- else
- {
- br.reset();
- try_next = false;
- }
- }
- return s;
- }
-
- private static void read_attributes(Attributes attr,
- BufferedReader br) throws IOException
- {
- String s = br.readLine();
- while (s != null && (!s.equals("")))
- {
- read_attribute(attr, s, br);
- s = br.readLine();
- }
- }
-
- private static void read_attribute(Attributes attr, String s,
- BufferedReader br) throws IOException
- {
- try
- {
- int colon = s.indexOf(": ");
- String name = s.substring(0, colon);
- String value_start = s.substring(colon + 2);
- String value = read_header_value(value_start, br);
- attr.putValue(name, value);
- }
- catch (IndexOutOfBoundsException iobe)
- {
- throw new JarException("Manifest contains a bad header: " + s);
- }
- }
-
- private static void read_individual_sections(Map entries,
- BufferedReader br) throws
- IOException
- {
- String s = br.readLine();
- while (s != null && (!s.equals("")))
- {
- Attributes attr = read_section_name(s, br, entries);
- read_attributes(attr, br);
- s = br.readLine();
- }
- }
-
- private static Attributes read_section_name(String s, BufferedReader br,
- Map entries) throws JarException
- {
- try
- {
- String name = expect_header("Name", br, s);
- Attributes attr = new Attributes();
- entries.put(name, attr);
- return attr;
- }
- catch (IOException ioe)
- {
- throw new JarException
- ("Section should start with a Name header: " + ioe.getMessage());
- }
+ JarUtils.readMFManifest(getMainAttributes(), getEntries(), in);
}
/**
@@ -322,160 +172,7 @@ public class Manifest implements Cloneable
*/
public void write(OutputStream out) throws IOException
{
- BufferedOutputStream bos = out instanceof BufferedOutputStream
- ? (BufferedOutputStream) out
- : new BufferedOutputStream(out, 4096);
- write_main_section(getMainAttributes(), bos);
- bos.write(CRLF);
- write_individual_sections(getEntries(), bos);
- bos.flush();
- }
-
- // Private Static functions for writing the Manifest file to a PrintWriter
-
- private static void write_main_section(Attributes attr, OutputStream out)
- throws IOException
- {
- write_version_info(attr, out);
- write_main_attributes(attr, out);
- }
-
- private static void write_version_info(Attributes attr, OutputStream out)
- throws IOException
- {
- // First check if there is already a version attribute set
- String version = attr.getValue(Attributes.Name.MANIFEST_VERSION);
- if (version == null)
- {
- version = "1.0";
- }
- write_header(Attributes.Name.MANIFEST_VERSION.toString(), version, out);
- }
-
- /**
- * The basic method for writing <code>Mainfest</code> attributes. This
- * implementation respects the rule stated in the Jar Specification concerning
- * the maximum allowed line length; i.e.
- *
- * <pre>
- * No line may be longer than 72 bytes (not characters), in its UTF8-encoded
- * form. If a value would make the initial line longer than this, it should
- * be continued on extra lines (each starting with a single SPACE).
- * </pre>
- * and
- * <pre>
- * Because header names cannot be continued, the maximum length of a header
- * name is 70 bytes (there must be a colon and a SPACE after the name).
- * </pre>
- *
- * @param name the name of the attribute.
- * @param value the value of the attribute.
- * @param out the output stream to write the attribute's name/value pair to.
- * @throws IOException if an I/O related exception occurs during the process.
- */
- private static void write_header(String name, String value, OutputStream out)
- throws IOException
- {
- String target = name + ": ";
- byte[] b = target.getBytes("UTF-8");
- if (b.length > 72)
- throw new IOException("Attribute's name already longer than 70 bytes");
-
- if (b.length == 72)
- {
- out.write(b);
- out.write(CRLF);
- target = " " + value;
- }
- else
- target = target + value;
-
- int n;
- while (true)
- {
- b = target.getBytes("UTF-8");
- if (b.length < 73)
- {
- out.write(b);
- break;
- }
-
- // find an appropriate character position to break on
- n = 72;
- while (true)
- {
- b = target.substring(0, n).getBytes("UTF-8");
- if (b.length < 73)
- break;
-
- n--;
- if (n < 1)
- throw new IOException("Header is unbreakable and longer than 72 bytes");
- }
-
- out.write(b);
- out.write(CRLF);
- target = " " + target.substring(n);
- }
-
- out.write(CRLF);
- }
-
- private static void write_main_attributes(Attributes attr, OutputStream out)
- throws IOException
- {
- Iterator it = attr.entrySet().iterator();
- while (it.hasNext())
- {
- Map.Entry entry = (Map.Entry) it.next();
- // Don't print the manifest version again
- if (!Attributes.Name.MANIFEST_VERSION.equals(entry.getKey()))
- write_attribute_entry(entry, out);
- }
- }
-
- private static void write_attribute_entry(Map.Entry entry, OutputStream out)
- throws IOException
- {
- String name = entry.getKey().toString();
- String value = entry.getValue().toString();
-
- if (name.equalsIgnoreCase("Name"))
- {
- throw new JarException("Attributes cannot be called 'Name'");
- }
- if (name.startsWith("From"))
- {
- throw new
- JarException("Header cannot start with the four letters 'From'" +
- name);
- }
- write_header(name, value, out);
- }
-
- private static void write_individual_sections(Map entries, OutputStream out)
- throws IOException
- {
-
- Iterator it = entries.entrySet().iterator();
- while (it.hasNext())
- {
- Map.Entry entry = (Map.Entry) it.next();
- write_header("Name", entry.getKey().toString(), out);
- write_entry_attributes((Attributes) entry.getValue(), out);
- out.write(CRLF);
- }
- }
-
- private static void write_entry_attributes(Attributes attr, OutputStream out)
- throws IOException
- {
- Iterator it = attr.entrySet().iterator();
- while (it.hasNext())
- {
- Map.Entry entry = (Map.Entry) it.next();
- write_attribute_entry(entry, out);
- }
+ JarUtils.writeMFManifest(getMainAttributes(), getEntries(), out);
}
/**
diff --git a/java/util/logging/Level.java b/java/util/logging/Level.java
index 2c400dc3a..48ff318a4 100644
--- a/java/util/logging/Level.java
+++ b/java/util/logging/Level.java
@@ -1,5 +1,5 @@
/* Level.java -- a class for indicating logging levels
- Copyright (C) 2002, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -341,6 +341,9 @@ public class Level implements Serializable
for (int i = 0; i < knownLevels.length; i++)
{
+ // It's safe to use == instead of .equals here because only the
+ // standard logging levels will be returned by this method, and
+ // they are all created using string literals.
if (name == knownLevels[i].name)
return knownLevels[i];
}
diff --git a/java/util/logging/LogManager.java b/java/util/logging/LogManager.java
index 73eb9bcdd..e2604815b 100644
--- a/java/util/logging/LogManager.java
+++ b/java/util/logging/LogManager.java
@@ -1,6 +1,6 @@
/* LogManager.java -- a class for maintaining Loggers and managing
configuration properties
- Copyright (C) 2002,2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,11 +48,14 @@ import java.lang.ref.WeakReference;
import java.net.URL;
import java.util.Collections;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
+import gnu.classpath.SystemProperties;
+
/**
* The <code>LogManager</code> maintains a hierarchical namespace
* of Logger objects and manages properties for configuring the logging
@@ -114,7 +117,6 @@ public class LogManager
* a WeakReference to it.
*/
private Map loggers;
- final Logger rootLogger;
/**
* The properties for the logging framework which have been
@@ -135,83 +137,62 @@ public class LogManager
* this case.
*/
private final PropertyChangeSupport pcs = new PropertyChangeSupport( /* source bean */
- LogManager.class);
+ LogManager.class);
protected LogManager()
{
- if (logManager != null)
- throw new IllegalStateException("there can be only one LogManager; use LogManager.getLogManager()");
-
- logManager = this;
- loggers = new java.util.HashMap();
- rootLogger = new Logger("", null);
- rootLogger.setLevel(Level.INFO);
- addLogger(rootLogger);
-
- /* Make sure that Logger.global has the rootLogger as its parent.
- *
- * Logger.global is set during class initialization of Logger,
- * which may or may not be before this code is being executed.
- * For example, on the Sun 1.3.1 and 1.4.0 JVMs, Logger.global
- * has been set before this code is being executed. In contrast,
- * Logger.global still is null on GCJ 3.2. Since the LogManager
- * and Logger classes are mutually dependent, both behaviors are
- * correct.
- *
- * This means that we cannot depend on Logger.global to have its
- * value when this code executes, although that variable is final.
- * Since Logger.getLogger will always return the same logger for
- * the same name, the subsequent line works fine irrespective of
- * the order in which classes are initialized.
- */
- Logger.getLogger("global").setParent(rootLogger);
- Logger.getLogger("global").setUseParentHandlers(true);
+ loggers = new HashMap();
}
/**
* Returns the globally shared LogManager instance.
*/
- public static LogManager getLogManager()
+ public static synchronized LogManager getLogManager()
{
+ if (logManager == null)
+ {
+ logManager = makeLogManager();
+ initLogManager();
+ }
return logManager;
}
- static
- {
- makeLogManager();
-
- /* The Javadoc description of the class explains
- * what is going on here.
- */
- Object configurator = createInstance(System.getProperty("java.util.logging.config.class"),
- /* must be instance of */ Object.class);
-
- try
- {
- if (configurator == null)
- getLogManager().readConfiguration();
- }
- catch (IOException ex)
- {
- /* FIXME: Is it ok to ignore exceptions here? */
- }
- }
+ private static final String MANAGER_PROPERTY = "java.util.logging.manager";
private static LogManager makeLogManager()
{
- String managerClassName;
- LogManager manager;
+ String managerClassName = SystemProperties.getProperty(MANAGER_PROPERTY);
+ LogManager manager = (LogManager) createInstance
+ (managerClassName, LogManager.class, MANAGER_PROPERTY);
+ if (manager == null)
+ manager = new LogManager();
+ return manager;
+ }
- managerClassName = System.getProperty("java.util.logging.manager");
- manager = (LogManager) createInstance(managerClassName, LogManager.class);
- if (manager != null)
- return manager;
+ private static final String CONFIG_PROPERTY = "java.util.logging.config.class";
- if (managerClassName != null)
- System.err.println("WARNING: System property \"java.util.logging.manager\""
- + " should be the name of a subclass of java.util.logging.LogManager");
+ private static void initLogManager()
+ {
+ LogManager manager = getLogManager();
+ Logger.root.setLevel(Level.INFO);
+ manager.addLogger(Logger.root);
+
+ /* The Javadoc description of the class explains
+ * what is going on here.
+ */
+ Object configurator = createInstance(System.getProperty(CONFIG_PROPERTY),
+ /* must be instance of */ Object.class,
+ CONFIG_PROPERTY);
- return new LogManager();
+ try
+ {
+ if (configurator == null)
+ manager.readConfiguration();
+ }
+ catch (IOException ex)
+ {
+ /* FIXME: Is it ok to ignore exceptions here? */
+ }
}
/**
@@ -314,7 +295,7 @@ public class LogManager
if(index > -1)
searchName = searchName.substring(0,index);
else
- searchName = "";
+ searchName = "";
}
logger.setLevel(logLevel);
@@ -324,12 +305,12 @@ public class LogManager
* When adding "foo.bar", the logger "foo.bar.baz" should change
* its parent to "foo.bar".
*/
- if (parent != rootLogger)
+ if (parent != Logger.root)
{
for (Iterator iter = loggers.keySet().iterator(); iter.hasNext();)
{
Logger possChild = (Logger) ((WeakReference) loggers.get(iter.next()))
- .get();
+ .get();
if ((possChild == null) || (possChild == logger)
|| (possChild.getParent() != parent))
continue;
@@ -367,14 +348,14 @@ public class LogManager
{
String childName = child.getName();
int childNameLength = childName.length();
- Logger best = rootLogger;
+ Logger best = Logger.root;
int bestNameLength = 0;
Logger cand;
String candName;
int candNameLength;
- if (child == rootLogger)
+ if (child == Logger.root)
return null;
for (Iterator iter = loggers.keySet().iterator(); iter.hasNext();)
@@ -468,7 +449,7 @@ public class LogManager
if (logger == null)
iter.remove();
- else if (logger != rootLogger)
+ else if (logger != Logger.root)
{
logger.resetLogger();
logger.setLevel(null);
@@ -476,8 +457,8 @@ public class LogManager
}
}
- rootLogger.setLevel(Level.INFO);
- rootLogger.resetLogger();
+ Logger.root.setLevel(Level.INFO);
+ Logger.root.resetLogger();
}
/**
@@ -524,11 +505,11 @@ public class LogManager
// If no config file could be found use a default configuration.
if(inputStream == null)
- {
- String defaultConfig = "handlers = java.util.logging.ConsoleHandler \n"
+ {
+ String defaultConfig = "handlers = java.util.logging.ConsoleHandler \n"
+ ".level=INFO \n";
- inputStream = new ByteArrayInputStream(defaultConfig.getBytes());
- }
+ inputStream = new ByteArrayInputStream(defaultConfig.getBytes());
+ }
}
else
inputStream = new java.io.FileInputStream(path);
@@ -574,21 +555,9 @@ public class LogManager
while (tokenizer.hasMoreTokens())
{
String handlerName = tokenizer.nextToken();
- try
- {
- Class handlerClass = ClassLoader.getSystemClassLoader().loadClass(handlerName);
- getLogger("").addHandler((Handler) handlerClass
- .newInstance());
- }
- catch (ClassCastException ex)
- {
- System.err.println("[LogManager] class " + handlerName
- + " is not subclass of java.util.logging.Handler");
- }
- catch (Exception ex)
- {
- //System.out.println("[LogManager.readConfiguration]"+ex);
- }
+ Handler handler = (Handler)
+ createInstance(handlerName, Handler.class, key);
+ Logger.root.addHandler(handler);
}
}
@@ -602,14 +571,19 @@ public class LogManager
logger = Logger.getLogger(loggerName);
addLogger(logger);
}
+ Level level = null;
try
- {
- logger.setLevel(Level.parse(value));
- }
- catch (Exception _)
- {
- //System.out.println("[LogManager.readConfiguration] "+_);
- }
+ {
+ level = Level.parse(value);
+ }
+ catch (IllegalArgumentException e)
+ {
+ warn("bad level \'" + value + "\'", e);
+ }
+ if (level != null)
+ {
+ logger.setLevel(level);
+ }
continue;
}
}
@@ -748,19 +722,17 @@ public class LogManager
*/
static final Class getClassProperty(String propertyName, Class defaultValue)
{
- Class usingClass = null;
+ String propertyValue = logManager.getProperty(propertyName);
- try
- {
- String propertyValue = logManager.getProperty(propertyName);
- if (propertyValue != null)
- usingClass = Class.forName(propertyValue);
- if (usingClass != null)
- return usingClass;
- }
- catch (Exception _)
- {
- }
+ if (propertyValue != null)
+ try
+ {
+ return locateClass(propertyValue);
+ }
+ catch (ClassNotFoundException e)
+ {
+ warn(propertyName + " = " + propertyValue, e);
+ }
return defaultValue;
}
@@ -774,12 +746,17 @@ public class LogManager
try
{
- Object obj = klass.newInstance();
- if (ofClass.isInstance(obj))
- return obj;
+ Object obj = klass.newInstance();
+ if (ofClass.isInstance(obj))
+ return obj;
}
- catch (Exception _)
+ catch (InstantiationException e)
{
+ warn(propertyName + " = " + klass.getName(), e);
+ }
+ catch (IllegalAccessException e)
+ {
+ warn(propertyName + " = " + klass.getName(), e);
}
if (defaultClass == null)
@@ -824,14 +801,17 @@ public class LogManager
}
/**
- * Creates a new instance of a class specified by name.
+ * Creates a new instance of a class specified by name and verifies
+ * that it is an instance (or subclass of) a given type.
*
* @param className the name of the class of which a new instance
* should be created.
*
- * @param ofClass the class to which the new instance should
- * be either an instance or an instance of a subclass.
- * FIXME: This description is just terrible.
+ * @param type the object created must be an instance of
+ * <code>type</code> or any subclass of <code>type</code>
+ *
+ * @param property the system property to reference in error
+ * messages
*
* @return the new instance, or <code>null</code> if
* <code>className</code> is <code>null</code>, if no class
@@ -839,28 +819,89 @@ public class LogManager
* loading that class, or if the constructor of the class
* has thrown an exception.
*/
- static final Object createInstance(String className, Class ofClass)
+ private static final Object createInstance(String className, Class type,
+ String property)
{
- Class klass;
+ Class klass = null;
if ((className == null) || (className.length() == 0))
return null;
try
{
- klass = Class.forName(className);
- if (! ofClass.isAssignableFrom(klass))
- return null;
-
- return klass.newInstance();
+ klass = locateClass(className);
+ if (type.isAssignableFrom(klass))
+ return klass.newInstance();
+ warn(property, className, "not an instance of " + type.getName());
+ }
+ catch (ClassNotFoundException e)
+ {
+ warn(property, className, "class not found");
+ }
+ catch (IllegalAccessException e)
+ {
+ warn(property, className, "illegal access");
}
- catch (Exception _)
+ catch (InstantiationException e)
{
- return null;
+ warn(property, className, e);
}
- catch (java.lang.LinkageError _)
+ catch (java.lang.LinkageError e)
{
- return null;
+ warn(property, className, "linkage error");
}
+
+ return null;
}
+
+ private static final void warn(String property, String klass, Throwable t)
+ {
+ warn(property, klass, null, t);
+ }
+
+ private static final void warn(String property, String klass, String msg)
+ {
+ warn(property, klass, msg, null);
+ }
+
+ private static final void warn(String property, String klass, String msg,
+ Throwable t)
+ {
+ warn("error instantiating '" + klass + "' referenced by " + property +
+ (msg == null ? "" : ", " + msg), t);
+ }
+
+ /**
+ * All debug warnings go through this method.
+ */
+
+ private static final void warn(String msg, Throwable t)
+ {
+ System.err.println("WARNING: " + msg);
+ if (t != null)
+ t.printStackTrace(System.err);
+ }
+
+ /**
+ * Locates a class by first checking the system class loader and
+ * then checking the context class loader.
+ *
+ * @param name the fully qualified name of the Class to locate
+ * @return Class the located Class
+ */
+
+ private static Class locateClass(String name) throws ClassNotFoundException
+ {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ try
+ {
+ return Class.forName(name, true, loader);
+ }
+ catch (ClassNotFoundException e)
+ {
+ loader = ClassLoader.getSystemClassLoader();
+ return Class.forName(name, true, loader);
+ }
+ }
+
}
diff --git a/java/util/logging/Logger.java b/java/util/logging/Logger.java
index 367faad97..567020ef7 100644
--- a/java/util/logging/Logger.java
+++ b/java/util/logging/Logger.java
@@ -1,5 +1,5 @@
/* Logger.java -- a class for logging messages
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -67,6 +67,9 @@ import java.util.ResourceBundle;
*/
public class Logger
{
+
+ static final Logger root = new Logger("", null);
+
/**
* A logger provided to applications that make only occasional use
* of the logging framework, typically early prototypes. Serious
@@ -175,7 +178,7 @@ public class Logger
/* This is null when the root logger is being constructed,
* and the root logger afterwards.
*/
- parent = LogManager.getLogManager().rootLogger;
+ parent = root;
useParentHandlers = (parent != null);
}
@@ -1148,16 +1151,12 @@ public class Logger
*/
public synchronized void setParent(Logger parent)
{
- LogManager lm;
-
/* Throw a new NullPointerException if parent is null. */
parent.getClass();
- lm = LogManager.getLogManager();
-
- if (this == lm.rootLogger)
+ if (this == root)
throw new IllegalArgumentException(
- "only the root logger can have a null parent");
+ "the root logger can only have a null parent");
/* An application is allowed to control an anonymous logger
* without having the permission to control the logging
diff --git a/java/util/regex/Matcher.java b/java/util/regex/Matcher.java
index 98086bfdb..e86be25fc 100644
--- a/java/util/regex/Matcher.java
+++ b/java/util/regex/Matcher.java
@@ -40,6 +40,7 @@ package java.util.regex;
import gnu.regexp.RE;
import gnu.regexp.REMatch;
+import gnu.regexp.CharIndexed;
/**
* Instance of a regular expression applied to a char sequence.
@@ -50,6 +51,10 @@ public final class Matcher implements MatchResult
{
private Pattern pattern;
private CharSequence input;
+ // We use CharIndexed as an input object to the getMatch method in order
+ // that /\G/ (the end of the previous match) may work. The information
+ // of the previous match is stored in the CharIndexed object.
+ private CharIndexed inputCharIndexed;
private int position;
private int appendPosition;
private REMatch match;
@@ -58,6 +63,7 @@ public final class Matcher implements MatchResult
{
this.pattern = pattern;
this.input = input;
+ this.inputCharIndexed = RE.makeCharIndexed(input, 0);
}
/**
@@ -119,7 +125,7 @@ public final class Matcher implements MatchResult
public boolean find ()
{
boolean first = (match == null);
- match = pattern.getRE().getMatch(input, position);
+ match = pattern.getRE().getMatch(inputCharIndexed, position);
if (match != null)
{
int endIndex = match.getEndIndex();
@@ -150,7 +156,7 @@ public final class Matcher implements MatchResult
*/
public boolean find (int start)
{
- match = pattern.getRE().getMatch(input, start);
+ match = pattern.getRE().getMatch(inputCharIndexed, start);
if (match != null)
{
position = match.getEndIndex();
@@ -212,7 +218,7 @@ public final class Matcher implements MatchResult
public boolean lookingAt ()
{
- match = pattern.getRE().getMatch(input, 0);
+ match = pattern.getRE().getMatch(inputCharIndexed, 0);
if (match != null)
{
if (match.getStartIndex() == 0)
@@ -237,7 +243,7 @@ public final class Matcher implements MatchResult
*/
public boolean matches ()
{
- match = pattern.getRE().getMatch(input, 0, RE.REG_TRY_ENTIRE_MATCH);
+ match = pattern.getRE().getMatch(inputCharIndexed, 0, RE.REG_TRY_ENTIRE_MATCH);
if (match != null)
{
if (match.getStartIndex() == 0)
diff --git a/java/util/regex/Pattern.java b/java/util/regex/Pattern.java
index d39f1cfb0..8c1998343 100644
--- a/java/util/regex/Pattern.java
+++ b/java/util/regex/Pattern.java
@@ -74,14 +74,16 @@ public final class Pattern implements Serializable
this.flags = flags;
int gnuFlags = 0;
+ gnuFlags |= RE.REG_ICASE_USASCII;
if ((flags & CASE_INSENSITIVE) != 0)
gnuFlags |= RE.REG_ICASE;
if ((flags & MULTILINE) != 0)
gnuFlags |= RE.REG_MULTILINE;
if ((flags & DOTALL) != 0)
gnuFlags |= RE.REG_DOT_NEWLINE;
+ if ((flags & UNICODE_CASE) != 0)
+ gnuFlags &= ~RE.REG_ICASE_USASCII;
// not yet supported:
- // if ((flags & UNICODE_CASE) != 0) gnuFlags =
// if ((flags & CANON_EQ) != 0) gnuFlags =
RESyntax syntax = RESyntax.RE_SYNTAX_JAVA_1_4;
@@ -94,7 +96,7 @@ public final class Pattern implements Serializable
if ((flags & COMMENTS) != 0)
{
- // Use a syntax with support for comments?
+ gnuFlags |= RE.REG_X_COMMENTS;
}
try
diff --git a/java/util/zip/DeflaterEngine.java b/java/util/zip/DeflaterEngine.java
index 3eea7c250..f79e47742 100644
--- a/java/util/zip/DeflaterEngine.java
+++ b/java/util/zip/DeflaterEngine.java
@@ -497,7 +497,7 @@ class DeflaterEngine implements DeflaterConstants
throw new InternalError();
}
}
- huffman.tallyDist(strstart - matchStart, matchLen);
+ boolean full = huffman.tallyDist(strstart - matchStart, matchLen);
lookahead -= matchLen;
if (matchLen <= max_lazy && lookahead >= MIN_MATCH)
@@ -516,7 +516,8 @@ class DeflaterEngine implements DeflaterConstants
updateHash();
}
matchLen = MIN_MATCH - 1;
- continue;
+ if (!full)
+ continue;
}
else
{
diff --git a/java/util/zip/ZipFile.java b/java/util/zip/ZipFile.java
index 5c0fe17d6..649e80d43 100644
--- a/java/util/zip/ZipFile.java
+++ b/java/util/zip/ZipFile.java
@@ -49,8 +49,8 @@ import java.io.InputStream;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
-import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
/**
* This class represents a Zip archive. You can ask for the contained
@@ -88,7 +88,7 @@ public class ZipFile implements ZipConstants
private final RandomAccessFile raf;
// The entries of this zip file when initialized and not yet closed.
- private HashMap entries;
+ private LinkedHashMap entries;
private boolean closed = false;
@@ -250,7 +250,7 @@ public class ZipFile implements ZipConstants
throw new EOFException(name);
int centralOffset = inp.readLeInt();
- entries = new HashMap(count+count/2);
+ entries = new LinkedHashMap(count+count/2);
inp.seek(centralOffset);
for (int i = 0; i < count; i++)
@@ -347,7 +347,7 @@ public class ZipFile implements ZipConstants
* @exception IllegalStateException when the ZipFile has already been closed.
* @exception IOException when the entries could not be read.
*/
- private HashMap getEntries() throws IOException
+ private LinkedHashMap getEntries() throws IOException
{
synchronized(raf)
{
@@ -375,7 +375,7 @@ public class ZipFile implements ZipConstants
try
{
- HashMap entries = getEntries();
+ LinkedHashMap entries = getEntries();
ZipEntry entry = (ZipEntry) entries.get(name);
// If we didn't find it, maybe it's a directory.
if (entry == null && !name.endsWith("/"))
@@ -414,7 +414,7 @@ public class ZipFile implements ZipConstants
{
checkClosed();
- HashMap entries = getEntries();
+ LinkedHashMap entries = getEntries();
String name = entry.getName();
ZipEntry zipEntry = (ZipEntry) entries.get(name);
if (zipEntry == null)
@@ -445,7 +445,19 @@ public class ZipFile implements ZipConstants
case ZipOutputStream.STORED:
return inp;
case ZipOutputStream.DEFLATED:
- return new InflaterInputStream(inp, new Inflater(true));
+ final Inflater inf = new Inflater(true);
+ final int sz = (int) entry.getSize();
+ return new InflaterInputStream(inp, inf)
+ {
+ public int available() throws IOException
+ {
+ if (sz == -1)
+ return super.available();
+ if (super.available() != 0)
+ return sz - inf.getTotalOut();
+ return 0;
+ }
+ };
default:
throw new ZipException("Unknown compression method " + method);
}
@@ -551,6 +563,7 @@ public class ZipFile implements ZipConstants
pos = 0;
fillBuffer();
}
+
return buffer[pos++] & 0xFF;
}
@@ -581,7 +594,7 @@ public class ZipFile implements ZipConstants
len -= remain;
totalBytesRead += remain;
}
-
+
return totalBytesRead;
}
diff --git a/javax/accessibility/AccessibleAction.java b/javax/accessibility/AccessibleAction.java
index 2ca683e45..a7cf05e4a 100644
--- a/javax/accessibility/AccessibleAction.java
+++ b/javax/accessibility/AccessibleAction.java
@@ -55,6 +55,28 @@ package javax.accessibility;
*/
public interface AccessibleAction
{
+
+ /**
+ * The name of an action which decrements a value.
+ *
+ * @since 1.5
+ */
+ static final String DECREMENT = "decrement";
+
+ /**
+ * The name of an action which increments a value.
+ *
+ * @since 1.5
+ */
+ static final String INCREMENT = "increment";
+
+ /**
+ * The name of an action which toggles the expansion of a tree node.
+ *
+ * @since 1.5
+ */
+ static final String TOGGLE_EXPAND = "toggle expand";
+
/**
* Get the number possible actions for this object, with the zeroth
* representing the default action.
diff --git a/javax/accessibility/AccessibleAttributeSequence.java b/javax/accessibility/AccessibleAttributeSequence.java
new file mode 100644
index 000000000..5ee50e5d7
--- /dev/null
+++ b/javax/accessibility/AccessibleAttributeSequence.java
@@ -0,0 +1,71 @@
+/* AccessibleAttributeSequence.java
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.accessibility;
+
+import javax.swing.text.AttributeSet;
+
+/**
+ * This is a convenience class that represents an accessible
+ * attribute sequence.
+ * @since 1.5
+ */
+public class AccessibleAttributeSequence
+{
+ /**
+ * The attributes of the text.
+ */
+ public AttributeSet attributes;
+
+ /**
+ * The starting index.
+ */
+ public int startIndex;
+
+ /**
+ * The ending index.
+ */
+ public int endIndex;
+
+ /**
+ * Create a new instance.
+ */
+ public AccessibleAttributeSequence()
+ {
+ }
+}
diff --git a/javax/accessibility/AccessibleContext.java b/javax/accessibility/AccessibleContext.java
index 129e19728..972f4feae 100644
--- a/javax/accessibility/AccessibleContext.java
+++ b/javax/accessibility/AccessibleContext.java
@@ -249,6 +249,35 @@ public abstract class AccessibleContext
= "AccessibleHypertextOffset";
/**
+ * Constant used when a component's bounds have changed. The old and
+ * new bounds are given in the event.
+ * @since 1.5
+ */
+ public static final String ACCESSIBLE_COMPONENT_BOUNDS_CHANGED
+ = "accessibleComponentBoundsChanged";
+
+ /**
+ * Constant used when the state of child objects changes. The old
+ * value in the event is always null, and the new value is the component
+ * whose children have changed.
+ * @since 1.5
+ */
+ public static final String ACCESSIBLE_INVALIDATE_CHILDREN
+ = "accessibleInvalidateChildren";
+
+ /**
+ * Constant used when the attributes of some text have changed.
+ * On insertion, the old value is null and the new value is an
+ * {@link AccessibleAttributeSequence} describing the insertion.
+ * On deletion, the old value is an {@link AccessibleAttributeSequence}
+ * and the new value is null. For replacement, both the old
+ * and new values are {@link AccessibleAttributeSequence} objects.
+ * @since 1.5
+ */
+ public static final String ACCESSIBLE_TEXT_ATTRIBUTES_CHANGED
+ = "accessibleTextAttributesChanged";
+
+ /**
* The accessible parent of this object.
*
* @see #getAccessibleParent()
diff --git a/javax/accessibility/AccessibleExtendedText.java b/javax/accessibility/AccessibleExtendedText.java
new file mode 100644
index 000000000..f40fa0fd2
--- /dev/null
+++ b/javax/accessibility/AccessibleExtendedText.java
@@ -0,0 +1,108 @@
+/* AccessibleExtendedText.java
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.accessibility;
+
+import java.awt.Rectangle;
+
+/**
+ * This interface provides extended text functionality, similar
+ * to AccessibleText.
+ * @see AccessibleText
+ * @since 1.5
+ */
+public interface AccessibleExtendedText
+{
+ /**
+ * This constant indicates that the retrieved text should be a
+ * complete line.
+ */
+ int LINE = 4;
+
+ /**
+ * This constant indicates that the retrieved text should consist
+ * of a run with identical attributes.
+ */
+ int ATTRIBUTE_RUN = 5;
+
+ /**
+ * Determines the bounding box of some text held by this object.
+ * @param start the starting index
+ * @param end the ending index
+ * @return the bounding box
+ * @see AccessibleText#getCharacterBounds(int)
+ */
+ Rectangle getTextBounds(int start, int end);
+
+ /**
+ * Return a range of text from the underlying object.
+ * @param start the starting index
+ * @param end the ending index
+ */
+ String getTextRange(int start, int end);
+
+ /**
+ * Return a text sequence from the underlying object. The part
+ * parameter describes the type of sequence to return; it is one
+ * of the constants from {@link AccessibleText} or from this
+ * class.
+ * @param part the type of the sequence to return
+ * @param index start of the sequence
+ */
+ AccessibleTextSequence getTextSequenceAfter(int part, int index);
+
+ /**
+ * Return a text sequence from the underlying object. The part
+ * parameter describes the type of sequence to return; it is one
+ * of the constants from {@link AccessibleText} or from this
+ * class.
+ * @param part the type of the sequence to return
+ * @param index start of the sequence
+ */
+ AccessibleTextSequence getTextSequenceAt(int part, int index);
+
+ /**
+ * Return a text sequence from the underlying object. The part
+ * parameter describes the type of sequence to return; it is one
+ * of the constants from {@link AccessibleText} or from this
+ * class.
+ * @param part the type of the sequence to return
+ * @param index end of the sequence
+ */
+ AccessibleTextSequence getTextSequenceBefore(int part, int index);
+}
diff --git a/javax/accessibility/AccessibleRelation.java b/javax/accessibility/AccessibleRelation.java
index fae69efc4..3d515fd57 100644
--- a/javax/accessibility/AccessibleRelation.java
+++ b/javax/accessibility/AccessibleRelation.java
@@ -61,7 +61,7 @@ public class AccessibleRelation extends AccessibleBundle
* @see #LABELED_BY
* @see #MEMBER_OF
*/
- public static final String LABEL_FOR = "labelFor";
+ public static final String LABEL_FOR;
/**
* Indicates the object is labeled by other objects.
@@ -72,7 +72,7 @@ public class AccessibleRelation extends AccessibleBundle
* @see #LABEL_FOR
* @see #MEMBER_OF
*/
- public static final String LABELED_BY = "labeledBy";
+ public static final String LABELED_BY;
/**
* Indicates an object is a member of a group of target objects.
@@ -83,7 +83,7 @@ public class AccessibleRelation extends AccessibleBundle
* @see #LABEL_FOR
* @see #LABELED_BY
*/
- public static final String MEMBER_OF = "memberOf";
+ public static final String MEMBER_OF;
/**
* Indicates an object is a controller for other objects.
@@ -94,7 +94,7 @@ public class AccessibleRelation extends AccessibleBundle
* @see #LABELED_BY
* @see #MEMBER_OF
*/
- public static final String CONTROLLER_FOR = "controllerFor";
+ public static final String CONTROLLER_FOR;
/**
* Indicates an object is controlled by other objects.
@@ -105,7 +105,7 @@ public class AccessibleRelation extends AccessibleBundle
* @see #LABELED_BY
* @see #MEMBER_OF
*/
- public static final String CONTROLLED_BY = "controlledBy";
+ public static final String CONTROLLED_BY;
/** Indicates that the label target group has changed. */
public static final String LABEL_FOR_PROPERTY = "labelForProperty";
@@ -122,8 +122,104 @@ public class AccessibleRelation extends AccessibleBundle
/** Indicates that the controlling objects have changed. */
public static final String CONTROLLED_BY_PROPERTY = "controlledByProperty";
+ /**
+ * Indicates that an object is a child of another object.
+ * @since 1.5
+ */
+ public static final String CHILD_NODE_OF = "childNodeOf";
+
+ /**
+ * Indicates that the ancestry relationship has changed.
+ * @since 1.5
+ */
+ public static final String CHILD_NODE_OF_PROPERTY = "childNodeOfProperty";
+
+ /**
+ * Indicates that an object is embedded by another object.
+ * @since 1.5
+ */
+ public static final String EMBEDDED_BY = "embeddedBy";
+
+ /**
+ * Indicates that the {@link #EMBEDDED_BY} property changed.
+ * @since 1.5
+ */
+ public static final String EMBEDDED_BY_PROPERTY = "embeddedByProperty";
+
+ /**
+ * Indicates that an object embeds another object.
+ * @since 1.5
+ */
+ public static final String EMBEDS = "embeds";
+
+ /**
+ * Indicates that the {@link #EMBEDS} property changed.
+ * @since 1.5
+ */
+ public static final String EMBEDS_PROPERTY = "embedsProperty";
+
+ /**
+ * Indicates that one object directly follows another object,
+ * as in a paragraph flow.
+ * @since 1.5
+ */
+ public static final String FLOWS_FROM = "flowsFrom";
+
+ /**
+ * Indicates that the {@link #FLOWS_FROM} property changed.
+ * @since 1.5
+ */
+ public static final String FLOWS_FROM_PROPERTY = "flowsFromProperty";
+
+ /**
+ * Indicates that one object comes directly before another object,
+ * as in a paragraph flow.
+ * @since 1.5
+ */
+ public static final String FLOWS_TO = "flowsTo";
+
+ /**
+ * Indicates that the {@link #FLOWS_TO} property changed.
+ * @since 1.5
+ */
+ public static final String FLOWS_TO_PROPERTY = "flowsToProperty";
+
+ /**
+ * Indicates that one object is a parent window of another object.
+ * @since 1.5
+ */
+ public static final String PARENT_WINDOW_OF = "parentWindowOf";
+
+ /**
+ * Indicates that the {@link #PARENT_WINDOW_OF} property changed.
+ * @since 1.5
+ */
+ public static final String PARENT_WINDOW_OF_PROPERTY = "parentWindowOfProperty";
+
+ /**
+ * Indicates that one object is a subwindow of another object.
+ * @since 1.5
+ */
+ public static final String SUBWINDOW_OF = "subwindowOf";
+
+ /**
+ * Indicates that the {@link #SUBWINDOW_OF} property changed.
+ * @since 1.5
+ */
+ public static final String SUBWINDOW_OF_PROPERTY = "subwindowOfProperty";
+
/** An empty set of targets. */
private static final Object[] EMPTY_TARGETS = { };
+
+ static
+ {
+ // not constants in JDK
+ LABEL_FOR = "labelFor";
+ LABELED_BY = "labeledBy";
+ MEMBER_OF = "memberOf";
+ CONTROLLER_FOR = "controllerFor";
+ CONTROLLED_BY = "controlledBy";
+ }
/**
* The related objects.
diff --git a/javax/accessibility/AccessibleRole.java b/javax/accessibility/AccessibleRole.java
index f386ad0e9..a5396f147 100644
--- a/javax/accessibility/AccessibleRole.java
+++ b/javax/accessibility/AccessibleRole.java
@@ -467,6 +467,56 @@ public class AccessibleRole extends AccessibleBundle
= new AccessibleRole("groupbox");
/**
+ * A formula for creating a value.
+ *
+ * @since 1.5
+ */
+ public static final AccessibleRole EDITBAR
+ = new AccessibleRole("editbar");
+
+ /**
+ * A text-based footer.
+ *
+ * @since 1.5
+ */
+ public static final AccessibleRole FOOTER
+ = new AccessibleRole("footer");
+
+ /**
+ * A text-based header.
+ *
+ * @since 1.5
+ */
+ public static final AccessibleRole HEADER
+ = new AccessibleRole("header");
+
+
+ /**
+ * A text-based paragraph.
+ *
+ * @since 1.5
+ */
+ public static final AccessibleRole PARAGRAPH
+ = new AccessibleRole("paragraph");
+
+ /**
+ * Represents the current level of progress on a particular task.
+ *
+ * @since 1.5
+ */
+ public static final AccessibleRole PROGRESS_MONITOR
+ = new AccessibleRole("progress monitor");
+
+ /**
+ * A ruler is a method of measuring the distance between two
+ * points.
+ *
+ * @since 1.5
+ */
+ public static final AccessibleRole RULER
+ = new AccessibleRole("ruler");
+
+ /**
* Create a new constant with a locale independent key. Follow the example,
* keep the constructor private and make public constants instead.
*
diff --git a/javax/accessibility/AccessibleState.java b/javax/accessibility/AccessibleState.java
index a630354b0..e4d00bd70 100644
--- a/javax/accessibility/AccessibleState.java
+++ b/javax/accessibility/AccessibleState.java
@@ -177,6 +177,28 @@ public class AccessibleState extends AccessibleBundle
= new AccessibleState("iconified");
/**
+ * Indicates that the state of this particular object is
+ * indeterminate. This commonly occurs when an object is incapable
+ * of representing the state by a single value.
+ *
+ * @since 1.5
+ */
+ public static final AccessibleState INDETERMINATE
+ = new AccessibleState("indeterminate");
+
+ /**
+ * Indicates that this particular object manages a number of
+ * subcomponents. This is a common property of structures such as
+ * trees and tables, which have a number of sub-elements such as
+ * rows and columns. The subcomponents should be left to the
+ * object, and not managed by the application.
+ *
+ * @since 1.5
+ */
+ public static final AccessibleState MANAGES_DESCENDANTS
+ = new AccessibleState("manages descendants");
+
+ /**
* Indicates that something must be done in the current object before
* interaction is allowed on other windows, usually for dialogs.
*
@@ -250,6 +272,15 @@ public class AccessibleState extends AccessibleBundle
= new AccessibleState("showing");
/**
+ * Indicates that this particular object is truncated when displayed
+ * visually.
+ *
+ * @since 1.5
+ */
+ public static final AccessibleState TRUNCATED
+ = new AccessibleState("truncated");
+
+ /**
* Indicates that this object intends to be visible. However, if its
* parent is invisible, this object is as well.
*
diff --git a/javax/accessibility/AccessibleStreamable.java b/javax/accessibility/AccessibleStreamable.java
new file mode 100644
index 000000000..cbeedf783
--- /dev/null
+++ b/javax/accessibility/AccessibleStreamable.java
@@ -0,0 +1,62 @@
+/* AccessibleStreamable.java
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.accessibility;
+
+import java.awt.datatransfer.DataFlavor;
+import java.io.InputStream;
+
+/**
+ * This interface represents a streamable accessible object.
+ * @since 1.5
+ */
+public interface AccessibleStreamable
+{
+ /**
+ * Return an array of the data flavors supported by this object.
+ */
+ DataFlavor[] getMimeTypes();
+
+ /**
+ * Return an input stream that yields the contents of this object,
+ * using the given data flavor. If the given data flavor cannot
+ * be used, returns null.
+ * @param flavor the data flavor
+ */
+ InputStream getStream(DataFlavor flavor);
+}
diff --git a/javax/accessibility/AccessibleText.java b/javax/accessibility/AccessibleText.java
index 88aee1495..be5f45c7e 100644
--- a/javax/accessibility/AccessibleText.java
+++ b/javax/accessibility/AccessibleText.java
@@ -92,7 +92,7 @@ public interface AccessibleText
* Given a point in the coordinate system of this object, return the
* 0-based index of the character at that point, or -1 if there is none.
*
- * @param p the point to look at
+ * @param point the point to look at
* @return the character index, or -1
*/
int getIndexAtPoint(Point point);
diff --git a/javax/accessibility/AccessibleTextSequence.java b/javax/accessibility/AccessibleTextSequence.java
new file mode 100644
index 000000000..88fa4c2b8
--- /dev/null
+++ b/javax/accessibility/AccessibleTextSequence.java
@@ -0,0 +1,68 @@
+/* AccessibleTextSequence.java
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.accessibility;
+
+/**
+ * This is a convenience class that encapsulates a String and a range.
+ * @since 1.5
+ */
+public class AccessibleTextSequence
+{
+ /**
+ * The text of the sequence.
+ */
+ public String text;
+
+ /**
+ * The starting index.
+ */
+ public int startIndex;
+
+ /**
+ * The ending index.
+ */
+ public int endIndex;
+
+ /**
+ * Create a new instance.
+ */
+ public AccessibleTextSequence()
+ {
+ }
+}
diff --git a/javax/crypto/KeyGenerator.java b/javax/crypto/KeyGenerator.java
index c3f4cee9f..e824c6452 100644
--- a/javax/crypto/KeyGenerator.java
+++ b/javax/crypto/KeyGenerator.java
@@ -160,9 +160,11 @@ public class KeyGenerator
{
try
{
- return new KeyGenerator((KeyGeneratorSpi)
+ KeyGenerator instance = new KeyGenerator((KeyGeneratorSpi)
Engine.getInstance(SERVICE, algorithm, provider),
provider, algorithm);
+ instance.init(new SecureRandom());
+ return instance;
}
catch (InvocationTargetException ite)
{
diff --git a/javax/imageio/ImageIO.java b/javax/imageio/ImageIO.java
index 3ea7e8585..b2304a783 100644
--- a/javax/imageio/ImageIO.java
+++ b/javax/imageio/ImageIO.java
@@ -1016,7 +1016,7 @@ public final class ImageIO
* The image data will be cached in the current cache directory if
* caching is enabled.
*
- * @param input an object to which to write image data
+ * @param output an object to which to write image data
*
* @return an ImageOutputStream that can send data to output, or
* null
diff --git a/javax/imageio/ImageWriteParam.java b/javax/imageio/ImageWriteParam.java
index 1979957fe..4d8efc37a 100644
--- a/javax/imageio/ImageWriteParam.java
+++ b/javax/imageio/ImageWriteParam.java
@@ -103,7 +103,7 @@ public class ImageWriteParam extends IIOParam
protected float compressionQuality;
/**
- * Contains the name of the available compression types.
+ * Contains the name of the current compression type.
*/
protected String compressionType;
diff --git a/javax/imageio/plugins/jpeg/JPEGHuffmanTable.java b/javax/imageio/plugins/jpeg/JPEGHuffmanTable.java
index 82059c69b..c0567be78 100644
--- a/javax/imageio/plugins/jpeg/JPEGHuffmanTable.java
+++ b/javax/imageio/plugins/jpeg/JPEGHuffmanTable.java
@@ -45,119 +45,115 @@ package javax.imageio.plugins.jpeg;
*/
public class JPEGHuffmanTable
{
+ /**
+ * Huffman code lengths.
+ */
private short[] lengths;
+ /**
+ * Huffman values.
+ */
private short[] values;
- private static short[] ACChrominanceLengths = { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5,
- 4, 4, 0, 1, 2, 0x77 };
-
- private static short[] ACChrominanceValues = { 0x00, 0x01, 0x02, 0x03, 0x11,
- 0x04, 0x05, 0x21, 0x31, 0x06,
- 0x12, 0x41, 0x51, 0x07, 0x61,
- 0x71, 0x13, 0x22, 0x32, 0x81,
- 0x08, 0x14, 0x42, 0x91, 0xa1,
- 0xb1, 0xc1, 0x09, 0x23, 0x33,
- 0x52, 0xf0, 0x15, 0x62, 0x72,
- 0xd1, 0x0a, 0x16, 0x24, 0x34,
- 0xe1, 0x25, 0xf1, 0x17, 0x18,
- 0x19, 0x1a, 0x26, 0x27, 0x28,
- 0x29, 0x2a, 0x35, 0x36, 0x37,
- 0x38, 0x39, 0x3a, 0x43, 0x44,
- 0x45, 0x46, 0x47, 0x48, 0x49,
- 0x4a, 0x53, 0x54, 0x55, 0x56,
- 0x57, 0x58, 0x59, 0x5a, 0x63,
- 0x64, 0x65, 0x66, 0x67, 0x68,
- 0x69, 0x6a, 0x73, 0x74, 0x75,
- 0x76, 0x77, 0x78, 0x79, 0x7a,
- 0x82, 0x83, 0x84, 0x85, 0x86,
- 0x87, 0x88, 0x89, 0x8a, 0x92,
- 0x93, 0x94, 0x95, 0x96, 0x97,
- 0x98, 0x99, 0x9a, 0xa2, 0xa3,
- 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
- 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
- 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
- 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
- 0xc6, 0xc7, 0xc8, 0xc9, 0xca,
- 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
- 0xd7, 0xd8, 0xd9, 0xda, 0xe2,
- 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
- 0xe8, 0xe9, 0xea, 0xf2, 0xf3,
- 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
- 0xf9, 0xfa };
-
- private static short[] ACLuminanceLengths = { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5,
- 4, 4, 0, 0, 1, 0x7d };
-
- private static short[] ACLuminanceValues = { 0x01, 0x02, 0x03, 0x00, 0x04,
- 0x11, 0x05, 0x12, 0x21, 0x31,
- 0x41, 0x06, 0x13, 0x51, 0x61,
- 0x07, 0x22, 0x71, 0x14, 0x32,
- 0x81, 0x91, 0xa1, 0x08, 0x23,
- 0x42, 0xb1, 0xc1, 0x15, 0x52,
- 0xd1, 0xf0, 0x24, 0x33, 0x62,
- 0x72, 0x82, 0x09, 0x0a, 0x16,
- 0x17, 0x18, 0x19, 0x1a, 0x25,
- 0x26, 0x27, 0x28, 0x29, 0x2a,
- 0x34, 0x35, 0x36, 0x37, 0x38,
- 0x39, 0x3a, 0x43, 0x44, 0x45,
- 0x46, 0x47, 0x48, 0x49, 0x4a,
- 0x53, 0x54, 0x55, 0x56, 0x57,
- 0x58, 0x59, 0x5a, 0x63, 0x64,
- 0x65, 0x66, 0x67, 0x68, 0x69,
- 0x6a, 0x73, 0x74, 0x75, 0x76,
- 0x77, 0x78, 0x79, 0x7a, 0x83,
- 0x84, 0x85, 0x86, 0x87, 0x88,
- 0x89, 0x8a, 0x92, 0x93, 0x94,
- 0x95, 0x96, 0x97, 0x98, 0x99,
- 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
- 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,
- 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
- 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
- 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
- 0xc8, 0xc9, 0xca, 0xd2, 0xd3,
- 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
- 0xd9, 0xda, 0xe1, 0xe2, 0xe3,
- 0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
- 0xe9, 0xea, 0xf1, 0xf2, 0xf3,
- 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
- 0xf9, 0xfa };
-
- private static short[] DCChrominanceLengths = { 0, 3, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 0, 0, 0, 0, 0 };
-
- private static short[] DCChrominanceValues = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11 };
-
- private static short[] DCLuminanceLengths = { 0, 1, 5, 1, 1, 1, 1, 1, 1, 0,
- 0, 0, 0, 0, 0, 0 };
-
- private static short[] DCLuminanceValues = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11 };
-
+ // The private constructors are used for these final fields to avoid
+ // unnecessary copying.
/**
* The standard JPEG AC chrominance Huffman table.
*/
public static final JPEGHuffmanTable StdACChrominance =
- new JPEGHuffmanTable(ACChrominanceLengths, ACChrominanceValues);
+ new JPEGHuffmanTable(new short[] { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5,
+ 4, 4, 0, 1, 2, 0x77 },
+ new short[] { 0x00, 0x01, 0x02, 0x03, 0x11,
+ 0x04, 0x05, 0x21, 0x31, 0x06,
+ 0x12, 0x41, 0x51, 0x07, 0x61,
+ 0x71, 0x13, 0x22, 0x32, 0x81,
+ 0x08, 0x14, 0x42, 0x91, 0xa1,
+ 0xb1, 0xc1, 0x09, 0x23, 0x33,
+ 0x52, 0xf0, 0x15, 0x62, 0x72,
+ 0xd1, 0x0a, 0x16, 0x24, 0x34,
+ 0xe1, 0x25, 0xf1, 0x17, 0x18,
+ 0x19, 0x1a, 0x26, 0x27, 0x28,
+ 0x29, 0x2a, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x3a, 0x43, 0x44,
+ 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x53, 0x54, 0x55, 0x56,
+ 0x57, 0x58, 0x59, 0x5a, 0x63,
+ 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x73, 0x74, 0x75,
+ 0x76, 0x77, 0x78, 0x79, 0x7a,
+ 0x82, 0x83, 0x84, 0x85, 0x86,
+ 0x87, 0x88, 0x89, 0x8a, 0x92,
+ 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0xa2, 0xa3,
+ 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
+ 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+ 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
+ 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+ 0xc6, 0xc7, 0xc8, 0xc9, 0xca,
+ 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
+ 0xd7, 0xd8, 0xd9, 0xda, 0xe2,
+ 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+ 0xe8, 0xe9, 0xea, 0xf2, 0xf3,
+ 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa }, false);
/**
* The standard JPEG AC luminance Huffman table.
*/
public static final JPEGHuffmanTable StdACLuminance =
- new JPEGHuffmanTable(ACLuminanceLengths, ACLuminanceValues);
+ new JPEGHuffmanTable(new short[] { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5,
+ 4, 4, 0, 0, 1, 0x7d },
+ new short[] { 0x01, 0x02, 0x03, 0x00, 0x04,
+ 0x11, 0x05, 0x12, 0x21, 0x31,
+ 0x41, 0x06, 0x13, 0x51, 0x61,
+ 0x07, 0x22, 0x71, 0x14, 0x32,
+ 0x81, 0x91, 0xa1, 0x08, 0x23,
+ 0x42, 0xb1, 0xc1, 0x15, 0x52,
+ 0xd1, 0xf0, 0x24, 0x33, 0x62,
+ 0x72, 0x82, 0x09, 0x0a, 0x16,
+ 0x17, 0x18, 0x19, 0x1a, 0x25,
+ 0x26, 0x27, 0x28, 0x29, 0x2a,
+ 0x34, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3a, 0x43, 0x44, 0x45,
+ 0x46, 0x47, 0x48, 0x49, 0x4a,
+ 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x63, 0x64,
+ 0x65, 0x66, 0x67, 0x68, 0x69,
+ 0x6a, 0x73, 0x74, 0x75, 0x76,
+ 0x77, 0x78, 0x79, 0x7a, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88,
+ 0x89, 0x8a, 0x92, 0x93, 0x94,
+ 0x95, 0x96, 0x97, 0x98, 0x99,
+ 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+ 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,
+ 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+ 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
+ 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+ 0xc8, 0xc9, 0xca, 0xd2, 0xd3,
+ 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,
+ 0xd9, 0xda, 0xe1, 0xe2, 0xe3,
+ 0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
+ 0xe9, 0xea, 0xf1, 0xf2, 0xf3,
+ 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa }, false);
/**
* The standard JPEG DC chrominance Huffman table.
*/
public static final JPEGHuffmanTable StdDCChrominance =
- new JPEGHuffmanTable(DCChrominanceLengths, DCChrominanceValues);
+ new JPEGHuffmanTable(new short[] { 0, 3, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0 },
+ new short[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11 }, false);
/**
* The standard JPEG DC luminance Huffman table.
*/
public static final JPEGHuffmanTable StdDCLuminance =
- new JPEGHuffmanTable(DCLuminanceLengths, DCLuminanceValues);
+ new JPEGHuffmanTable(new short[] { 0, 1, 5, 1, 1, 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0 },
+ new short[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11 }, false);
/**
* Construct and initialize a Huffman table. Copies are created of
@@ -174,9 +170,28 @@ public class JPEGHuffmanTable
*/
public JPEGHuffmanTable(short[] lengths, short[] values)
{
- if (lengths == null || values == null || lengths.length > 16
- || values.length > 256)
- throw new IllegalArgumentException("invalid length or values array");
+ // Create copies of the lengths and values arguments.
+ this(checkLengths(lengths), checkValues(values, lengths), true);
+ }
+
+ /**
+ * Private constructor that avoids unnecessary copying and argument
+ * checking.
+ *
+ * @param lengths an array of Huffman code lengths
+ * @param values a sorted array of Huffman values
+ * @param copy true if copies should be created of the given arrays
+ */
+ private JPEGHuffmanTable(short[] lengths, short[] values, boolean copy)
+ {
+ this.lengths = copy ? (short[]) lengths.clone() : lengths;
+ this.values = copy ? (short[]) values.clone() : values;
+ }
+
+ private static short[] checkLengths(short[] lengths)
+ {
+ if (lengths == null || lengths.length > 16)
+ throw new IllegalArgumentException("invalid length array");
for (int i = 0; i < lengths.length; i++)
{
@@ -184,12 +199,6 @@ public class JPEGHuffmanTable
throw new IllegalArgumentException("negative length");
}
- for (int i = 0; i < values.length; i++)
- {
- if (values[i] < 0)
- throw new IllegalArgumentException("negative value");
- }
-
int sum = 0;
for (int i = 0; i < lengths.length; i++)
{
@@ -198,15 +207,30 @@ public class JPEGHuffmanTable
+ " for code length " + (i + 1));
sum += lengths[i];
}
+
+ return lengths;
+ }
+
+ private static short[] checkValues(short[] values, short[] lengths)
+ {
+ if (values == null || values.length > 256)
+ throw new IllegalArgumentException("invalid values array");
+
+ for (int i = 0; i < values.length; i++)
+ {
+ if (values[i] < 0)
+ throw new IllegalArgumentException("negative value");
+ }
+ // lengths is known-valid by this point.
+ int sum = 0;
+ for (int i = 0; i < lengths.length; i++)
+ sum += lengths[i];
+
if (values.length != sum)
throw new IllegalArgumentException("invalid number of values"
+ " for number of codes");
- this.lengths = new short[lengths.length];
- System.arraycopy(lengths, 0, this.lengths, 0, lengths.length);
-
- this.values = new short[values.length];
- System.arraycopy(values, 0, this.values, 0, values.length);
+ return values;
}
/**
@@ -218,9 +242,7 @@ public class JPEGHuffmanTable
*/
public short[] getLengths()
{
- short[] lengthsCopy = new short[lengths.length];
- System.arraycopy(lengths, 0, lengthsCopy, 0, lengths.length);
- return lengthsCopy;
+ return (short[]) lengths.clone();
}
/**
@@ -231,9 +253,7 @@ public class JPEGHuffmanTable
*/
public short[] getValues()
{
- short[] valuesCopy = new short[values.length];
- System.arraycopy(values, 0, valuesCopy, 0, values.length);
- return valuesCopy;
+ return (short[]) values.clone();
}
/**
diff --git a/javax/imageio/plugins/jpeg/JPEGImageReadParam.java b/javax/imageio/plugins/jpeg/JPEGImageReadParam.java
new file mode 100644
index 000000000..b570922f9
--- /dev/null
+++ b/javax/imageio/plugins/jpeg/JPEGImageReadParam.java
@@ -0,0 +1,161 @@
+/* JPEGImageReadParam.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package javax.imageio.plugins.jpeg;
+
+import javax.imageio.ImageReadParam;
+
+/**
+ * The JPEGImageReadParam class is only used to set JPEG decoding
+ * tables for streams that do not provide their own tables. If a
+ * stream does not provide tables and a custom JPEGImageReadParam is
+ * not provided, then the standard JPEG tables are used from the
+ * JPEGQTable and JPEGHuffmanTable classes. If a stream does provide
+ * decoding tables then JPEGImageReadParam will be ignored.
+ * JPEGImageReadParam cannot be used to retrieve the tables from a
+ * stream. Instead, use IIOMetadata for this purpose.
+ *
+ * A JPEGImageReadParam instance is retrieved from the built-in JPEG
+ * ImageReader using the getDefaultImageReadParam method.
+ */
+public class JPEGImageReadParam
+ extends ImageReadParam
+{
+ private JPEGQTable[] qTables;
+ private JPEGHuffmanTable[] DCHuffmanTables;
+ private JPEGHuffmanTable[] ACHuffmanTables;
+
+ /**
+ * Construct a JPEGImageReadParam.
+ */
+ public JPEGImageReadParam()
+ {
+ super();
+ }
+
+ /**
+ * Check if the decoding tables are set.
+ *
+ * @return true if the decoding tables are set, false otherwise
+ */
+ public boolean areTablesSet()
+ {
+ // If qTables is not null then all tables are set.
+ return (qTables != null);
+ }
+
+ /**
+ * Set the quantization and Huffman tables that will be used to
+ * decode the stream. Copies are created of the array arguments.
+ * The number of Huffman tables must be the same in both Huffman
+ * table arrays. No argument may be null and no array may be longer
+ * than four elements.
+ *
+ * @param qTables JPEG quantization tables
+ * @param DCHuffmanTables JPEG DC Huffman tables
+ * @param ACHuffmanTables JPEG AC Huffman tables
+ *
+ * @throws IllegalArgumentException if any argument is null, if any
+ * of the arrays are longer than four elements, or if the Huffman
+ * table arrays do not have the same number of elements
+ */
+ public void setDecodeTables(JPEGQTable[] qTables,
+ JPEGHuffmanTable[] DCHuffmanTables,
+ JPEGHuffmanTable[] ACHuffmanTables)
+ {
+ if (qTables == null || DCHuffmanTables == null || ACHuffmanTables == null)
+ throw new IllegalArgumentException("null argument");
+
+ if (qTables.length > 4 || DCHuffmanTables.length > 4
+ || ACHuffmanTables.length > 4)
+ throw new IllegalArgumentException("argument has too many elements");
+
+ if (DCHuffmanTables.length != ACHuffmanTables.length)
+ throw new IllegalArgumentException("Huffman table arrays differ in length");
+
+ // Do a shallow copy. JPEGQTable's data is not directly
+ // modifyable since JPEGQTable.getTable returns a copy. Therefore
+ // it is safe to have multiple references to a single JPEGQTable.
+ // Likewise for JPEGHuffmanTable.
+ this.qTables = (JPEGQTable[]) qTables.clone();
+ this.DCHuffmanTables = (JPEGHuffmanTable[]) DCHuffmanTables.clone();
+ this.ACHuffmanTables = (JPEGHuffmanTable[]) ACHuffmanTables.clone();
+ }
+
+ /**
+ * Clear the quantization and Huffman decoding tables.
+ */
+ public void unsetDecodeTables()
+ {
+ qTables = null;
+ DCHuffmanTables = null;
+ ACHuffmanTables = null;
+ }
+
+ /**
+ * Retrieve the quantization tables.
+ *
+ * @returns an array of JPEG quantization tables
+ */
+ public JPEGQTable[] getQTables()
+ {
+ return qTables == null ? qTables : (JPEGQTable[]) qTables.clone();
+ }
+
+ /**
+ * Retrieve the DC Huffman tables.
+ *
+ * @return an array of JPEG DC Huffman tables
+ */
+ public JPEGHuffmanTable[] getDCHuffmanTables()
+ {
+ return DCHuffmanTables == null ? DCHuffmanTables
+ : (JPEGHuffmanTable[]) DCHuffmanTables.clone();
+ }
+
+ /**
+ * Retrieve the AC Huffman tables.
+ *
+ * @return an array of JPEG AC Huffman tables
+ */
+ public JPEGHuffmanTable[] getACHuffmanTables()
+ {
+ return ACHuffmanTables == null ? ACHuffmanTables
+ : (JPEGHuffmanTable[]) ACHuffmanTables.clone();
+ }
+}
diff --git a/javax/imageio/plugins/jpeg/JPEGImageWriteParam.java b/javax/imageio/plugins/jpeg/JPEGImageWriteParam.java
new file mode 100644
index 000000000..1e7989e82
--- /dev/null
+++ b/javax/imageio/plugins/jpeg/JPEGImageWriteParam.java
@@ -0,0 +1,293 @@
+/* JPEGImageWriteParam.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package javax.imageio.plugins.jpeg;
+
+import java.util.Locale;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+import javax.imageio.ImageWriteParam;
+
+/**
+ * The JPEGImageWriteParam class can be used to specify tables and
+ * settings used in the JPEG encoding process. Encoding tables are
+ * taken from the metadata associated with the output stream, and
+ * failing that (if the metadata tables are null) from an instance of
+ * JPEGImageWriteParam. The default metadata uses the standard JPEG
+ * tables from the JPEGQTable and JPEGHuffmanTable classes. Non-null
+ * metadata tables override JPEGImageWriteParam tables. Compression
+ * settings range from 1.0, best compression, through 0.75, default
+ * compression, to 0.0, worst compression.
+ *
+ * A JPEGImageWriteParam instance is retrieved from the built-in JPEG
+ * ImageWriter using the getDefaultImageWriteParam method.
+ */
+public class JPEGImageWriteParam
+ extends ImageWriteParam
+{
+ private JPEGQTable[] qTables;
+ private JPEGHuffmanTable[] DCHuffmanTables;
+ private JPEGHuffmanTable[] ACHuffmanTables;
+ private boolean optimize;
+ private String[] compressionQualityDescriptions;
+ private float[] compressionQualityValues;
+
+ /**
+ * Localized messages are stored in separate files.
+ */
+ private ResourceBundle messages;
+
+ /**
+ * Construct a JPEGImageWriteParam with the following state: tiling
+ * is not supported, progressive mode is supported, initial
+ * progressive mode is MODE_DISABLED, compression is supported, one
+ * compression type named "JPEG" is supported and the default
+ * compression quality is 0.75f. Compression type names and
+ * compression quality descriptions are localized to the given
+ * locale.
+ *
+ * @param locale the locale used for message localization
+ */
+ public JPEGImageWriteParam(Locale locale)
+ {
+ super(locale);
+
+ // Get localized compression type and compression quality
+ // description strings for the given locale.
+ messages = PropertyResourceBundle.getBundle
+ ("javax/imageio/plugins/jpeg/MessagesBundle", locale);
+
+ // Initialize inherited ImageWriter fields.
+ canWriteTiles = false;
+ canWriteProgressive = true;
+ progressiveMode = MODE_DISABLED;
+ canWriteCompressed = true;
+ compressionTypes = new String[]
+ {
+ messages.getString("compression.types.jpeg")
+ };
+ compressionType = compressionTypes[0];
+ compressionQuality = 0.75f;
+ }
+
+ /**
+ * Reset the compression quality to 0.75f.
+ */
+ public void unsetCompression()
+ {
+ compressionQuality = 0.75f;
+ }
+
+ /**
+ * Check if compression algorithm is lossless. JPEGImageWriteParam
+ * overrides this ImageWriteParam method to always return false
+ * since JPEG compression is inherently lossy.
+ *
+ * @return false
+ */
+ public boolean isCompressionLossless()
+ {
+ return false;
+ }
+
+ /**
+ * Retrieve an array of compression quality descriptions. These
+ * messages are localized using the locale provided upon
+ * construction. Each compression quality description in the
+ * returned array corresponds to the compression quality value at
+ * the same index in the array returned by
+ * getCompressionQualityValues.
+ *
+ * @return an array of strings each of which describes a compression
+ * quality value
+ */
+ public String[] getCompressionQualityDescriptions()
+ {
+ // Make sure exceptions are thrown when this image write param is
+ // in the wrong state.
+ super.getCompressionQualityDescriptions();
+
+ if (compressionQualityDescriptions == null)
+ {
+ compressionQualityDescriptions = new String[]
+ {
+ messages.getString("compression.minimum"),
+ messages.getString("compression.default"),
+ messages.getString("compression.maximum")
+ };
+ }
+
+ return compressionQualityDescriptions;
+ }
+
+ /**
+ * Retrieve an array of compression quality values, ordered from
+ * lowest quality to highest quality.
+ *
+ * @return an array of compressions quality values
+ */
+ public float[] getCompressionQualityValues()
+ {
+ // Make sure exceptions are thrown when this image write param is
+ // in the wrong state.
+ super.getCompressionQualityValues();
+
+ if (compressionQualityValues == null)
+ compressionQualityValues = new float[] { 0.05f, 0.75f, 0.95f };
+
+ return compressionQualityValues;
+ }
+
+ /**
+ * Check if the encoding tables are set.
+ *
+ * @return true if the encoding tables are set, false otherwise
+ */
+ public boolean areTablesSet()
+ {
+ // If qTables is not null then all tables are set.
+ return (qTables != null);
+ }
+
+ /**
+ * Set the quantization and Huffman tables that will be used to
+ * encode the stream. Copies are created of the array arguments.
+ * The number of Huffman tables must be the same in both Huffman
+ * table arrays. No argument may be null and no array may be longer
+ * than four elements.
+ *
+ * @param qTables JPEG quantization tables
+ * @param DCHuffmanTables JPEG DC Huffman tables
+ * @param ACHuffmanTables JPEG AC Huffman tables
+ *
+ * @throws IllegalArgumentException if any argument is null, if any
+ * of the arrays are longer than four elements, or if the Huffman
+ * table arrays do not have the same number of elements
+ */
+ public void setEncodeTables(JPEGQTable[] qTables,
+ JPEGHuffmanTable[] DCHuffmanTables,
+ JPEGHuffmanTable[] ACHuffmanTables)
+ {
+ if (qTables == null || DCHuffmanTables == null || ACHuffmanTables == null)
+ throw new IllegalArgumentException("null argument");
+
+ if (qTables.length > 4 || DCHuffmanTables.length > 4
+ || ACHuffmanTables.length > 4)
+ throw new IllegalArgumentException("argument has too many elements");
+
+ if (DCHuffmanTables.length != ACHuffmanTables.length)
+ throw new IllegalArgumentException("Huffman table arrays differ in length");
+
+ // Do a shallow copy. JPEGQTable's data is not directly
+ // modifyable since JPEGQTable.getTable returns a copy. Therefore
+ // it is safe to have multiple references to a single JPEGQTable.
+ // Likewise for JPEGHuffmanTable.
+ this.qTables = (JPEGQTable[]) qTables.clone();
+ this.DCHuffmanTables = (JPEGHuffmanTable[]) DCHuffmanTables.clone();
+ this.ACHuffmanTables = (JPEGHuffmanTable[]) ACHuffmanTables.clone();
+ }
+
+ /**
+ * Clear the quantization and Huffman encoding tables.
+ */
+ public void unsetEncodeTables()
+ {
+ qTables = null;
+ DCHuffmanTables = null;
+ ACHuffmanTables = null;
+ }
+
+ /**
+ * Retrieve the quantization tables.
+ *
+ * @returns an array of JPEG quantization tables
+ */
+ public JPEGQTable[] getQTables()
+ {
+ return qTables == null ? qTables : (JPEGQTable[]) qTables.clone();
+ }
+
+ /**
+ * Retrieve the DC Huffman tables.
+ *
+ * @return an array of JPEG DC Huffman tables
+ */
+ public JPEGHuffmanTable[] getDCHuffmanTables()
+ {
+ return DCHuffmanTables == null ? DCHuffmanTables
+ : (JPEGHuffmanTable[]) DCHuffmanTables.clone();
+ }
+
+ /**
+ * Retrieve the AC Huffman tables.
+ *
+ * @return an array of JPEG AC Huffman tables
+ */
+ public JPEGHuffmanTable[] getACHuffmanTables()
+ {
+ return ACHuffmanTables == null ? ACHuffmanTables
+ : (JPEGHuffmanTable[]) ACHuffmanTables.clone();
+ }
+
+ /**
+ * Specify whether or not Huffman tables written to the output
+ * stream should be optimized. Every image encoded with this flag
+ * set will contain a Huffman table, and the generated Huffman
+ * tables will override those specified in the metadata.
+ *
+ * @param optimize true to generate optimized Huffman tables, false
+ * otherwise
+ */
+ public void setOptimizeHuffmanTables(boolean optimize)
+ {
+ this.optimize = optimize;
+ }
+
+ /**
+ * Check whether or not Huffman tables written to the output stream
+ * will be optimized. Unless otherwise set using
+ * setOptimizeHuffmanTables, this returns false.
+ *
+ * @return true Huffman tables written to the output stream will be
+ * optimized, false otherwise
+ */
+ public boolean getOptimizeHuffmanTables()
+ {
+ return optimize;
+ }
+}
diff --git a/javax/imageio/plugins/jpeg/JPEGQTable.java b/javax/imageio/plugins/jpeg/JPEGQTable.java
new file mode 100644
index 000000000..a94e8b188
--- /dev/null
+++ b/javax/imageio/plugins/jpeg/JPEGQTable.java
@@ -0,0 +1,196 @@
+/* JPEGQTable.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package javax.imageio.plugins.jpeg;
+
+/**
+ * The JPEGQTable class represents a quantization table that can be
+ * used to encode or decode a JPEG stream. The standard JPEG
+ * luminance and chrominance quantization tables are provided as
+ * static fields. Table entries are stored in natural order, not
+ * zig-zag order.
+ */
+public class JPEGQTable
+{
+ /**
+ * The table entries, stored in natural order.
+ */
+ private int[] table;
+
+ /**
+ * The standard JPEG luminance quantization table. Values are
+ * stored in natural order.
+ */
+ public static final JPEGQTable K1Luminance = new JPEGQTable(new int[]
+ {
+ 16, 11, 10, 16, 24, 40, 51, 61,
+ 12, 12, 14, 19, 26, 58, 60, 55,
+ 14, 13, 16, 24, 40, 57, 69, 56,
+ 14, 17, 22, 29, 51, 87, 80, 62,
+ 18, 22, 37, 56, 68, 109, 103, 77,
+ 24, 35, 55, 64, 81, 104, 113, 92,
+ 49, 64, 78, 87, 103, 121, 120, 101,
+ 72, 92, 95, 98, 112, 100, 103, 99
+ }, false);
+
+ /**
+ * The standard JPEG luminance quantization table, scaled by
+ * one-half. Values are stored in natural order.
+ */
+ public static final JPEGQTable K1Div2Luminance =
+ K1Luminance.getScaledInstance(0.5f, true);
+
+ /**
+ * The standard JPEG chrominance quantization table. Values are
+ * stored in natural order.
+ */
+ public static final JPEGQTable K2Chrominance = new JPEGQTable(new int[]
+ {
+ 17, 18, 24, 47, 99, 99, 99, 99,
+ 18, 21, 26, 66, 99, 99, 99, 99,
+ 24, 26, 56, 99, 99, 99, 99, 99,
+ 47, 66, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99
+ }, false);
+
+ /**
+ * The standard JPEG chrominance quantization table, scaled by
+ * one-half. Values are stored in natural order.
+ */
+ public static final JPEGQTable K2Div2Chrominance =
+ K2Chrominance.getScaledInstance(0.5f, true);
+
+ /**
+ * Construct a new JPEG quantization table. A copy is created of
+ * the table argument.
+ *
+ * @param table the 64-element value table, stored in natural order
+ *
+ * @throws IllegalArgumentException if the table is null or if
+ * table's length is not equal to 64.
+ */
+ public JPEGQTable(int[] table)
+ {
+ this(checkTable(table), true);
+ }
+
+ /**
+ * Private constructor that avoids unnecessary copying and argument
+ * checking.
+ *
+ * @param table the 64-element value table, stored in natural order
+ * @param copy true if a copy should be created of the given table
+ */
+ private JPEGQTable(int[] table, boolean copy)
+ {
+ this.table = copy ? (int[]) table.clone() : table;
+ }
+
+ private static int[] checkTable(int[] table)
+ {
+ if (table == null || table.length != 64)
+ throw new IllegalArgumentException("invalid JPEG quantization table");
+
+ return table;
+ }
+
+ /**
+ * Retrieve a copy of the quantization values for this table.
+ *
+ * @return a copy of the quantization value array
+ */
+ public int[] getTable()
+ {
+ return (int[]) table.clone();
+ }
+
+ /**
+ * Retrieve a copy of this JPEG quantization table with every value
+ * scaled by the given scale factor, and clamped from 1 to 255
+ * baseline or from 1 to 32767 otherwise.
+ *
+ * @param scaleFactor the factor by which to scale this table
+ * @param forceBaseline clamp scaled values to a maximum of 255 if
+ * true, 32767 if false
+ *
+ * @return a new scaled JPEG quantization table
+ */
+ public JPEGQTable getScaledInstance(float scaleFactor,
+ boolean forceBaseline)
+ {
+ int[] scaledTable = getTable();
+ int max = forceBaseline ? 255 : 32767;
+
+ for (int i = 0; i < scaledTable.length; i++)
+ {
+ scaledTable[i] = Math.round (scaleFactor * (float) scaledTable[i]);
+ if (scaledTable[i] < 1)
+ scaledTable[i] = 1;
+ else if (scaledTable[i] > max)
+ scaledTable[i] = max;
+ }
+
+ // Do not copy scaledTable. It is already a copy because we used
+ // getTable to retrieve it.
+ return new JPEGQTable(scaledTable, false);
+ }
+
+ /**
+ * Create a string representing this JPEG quantization table.
+ */
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer();
+
+ buffer.append("JPEGQTable:\n");
+ for (int i = 0; i < 8; i++)
+ {
+ buffer.append(" ");
+ for (int j = 0; j < 8; j++)
+ {
+ buffer.append(table[i * 8 + j] + " ");
+ }
+ buffer.append("\n");
+ }
+
+ return buffer.toString();
+ }
+}
diff --git a/javax/imageio/stream/FileCacheImageOutputStream.java b/javax/imageio/stream/FileCacheImageOutputStream.java
index 16cd0a7a9..ae6559834 100644
--- a/javax/imageio/stream/FileCacheImageOutputStream.java
+++ b/javax/imageio/stream/FileCacheImageOutputStream.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.imageio.stream;
+import gnu.classpath.NotImplementedException;
+
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
@@ -92,14 +94,14 @@ public class FileCacheImageOutputStream extends ImageOutputStreamImpl
}
public int read()
- throws IOException
+ throws IOException, NotImplementedException
{
// FIXME: Implement me.
throw new Error("not implemented");
}
public int read(byte[] data, int offset, int len)
- throws IOException
+ throws IOException, NotImplementedException
{
// FIXME: Implement me.
throw new Error("not implemented");
diff --git a/javax/imageio/stream/ImageInputStreamImpl.java b/javax/imageio/stream/ImageInputStreamImpl.java
index 0967fee46..c1a5dd404 100644
--- a/javax/imageio/stream/ImageInputStreamImpl.java
+++ b/javax/imageio/stream/ImageInputStreamImpl.java
@@ -55,7 +55,7 @@ public abstract class ImageInputStreamImpl implements ImageInputStream
byte[] buffer = new byte[8];
protected int bitOffset;
- protected ByteOrder byteOrder;
+ protected ByteOrder byteOrder = ByteOrder.BIG_ENDIAN;
protected long flushedPos;
protected long streamPos;
diff --git a/javax/imageio/stream/ImageOutputStreamImpl.java b/javax/imageio/stream/ImageOutputStreamImpl.java
index 8ff09e5ff..1179fed7d 100644
--- a/javax/imageio/stream/ImageOutputStreamImpl.java
+++ b/javax/imageio/stream/ImageOutputStreamImpl.java
@@ -38,7 +38,10 @@ exception statement from your version. */
package javax.imageio.stream;
+import gnu.classpath.NotImplementedException;
+
import java.io.IOException;
+import java.io.UTFDataFormatException;
import java.nio.ByteOrder;
/**
@@ -53,7 +56,7 @@ public abstract class ImageOutputStreamImpl extends ImageInputStreamImpl
}
protected final void flushBits()
- throws IOException
+ throws IOException, NotImplementedException
{
// FIXME: Implement me.
throw new Error("not implemented");
@@ -72,14 +75,14 @@ public abstract class ImageOutputStreamImpl extends ImageInputStreamImpl
throws IOException;
public void writeBit(int bit)
- throws IOException
+ throws IOException, NotImplementedException
{
// FIXME: Implement me.
throw new Error("not implemented");
}
public void writeBits(long bits, int numBits)
- throws IOException
+ throws IOException, NotImplementedException
{
// FIXME: Implement me.
throw new Error("not implemented");
@@ -100,13 +103,17 @@ public abstract class ImageOutputStreamImpl extends ImageInputStreamImpl
public void writeBytes(String data)
throws IOException
{
- write(data.getBytes());
+ // This is bogus, but it is how the method is specified.
+ // Sun ought to deprecate this method.
+ int len = data.length();
+ for (int i = 0; i < len; ++i)
+ writeByte(data.charAt(i));
}
public void writeChar(int value)
throws IOException
{
- writeShort((short) value);
+ writeShort(value);
}
public void writeChars(char[] data, int offset, int len)
@@ -119,14 +126,15 @@ public abstract class ImageOutputStreamImpl extends ImageInputStreamImpl
public void writeChars(String data)
throws IOException
{
- // FIXME: Implement me.
- throw new Error("not implemented");
+ int len = data.length();
+ for (int i = 0; i < len; ++i)
+ writeChar(data.charAt(i));
}
public void writeDouble(double value)
throws IOException
{
- writeLong((long) value);
+ writeLong(Double.doubleToLongBits(value));
}
public void writeDoubles(double[] data, int offset, int len)
@@ -139,7 +147,7 @@ public abstract class ImageOutputStreamImpl extends ImageInputStreamImpl
public void writeFloat(float value)
throws IOException
{
- writeInt((int) value);
+ writeInt(Float.floatToIntBits(value));
}
public void writeFloats(float[] data, int offset, int len)
@@ -237,9 +245,52 @@ public abstract class ImageOutputStreamImpl extends ImageInputStreamImpl
writeShort(data[offset + i]);
}
- public void writeUTF(String data)
+ public void writeUTF(String value)
throws IOException
{
- throw new Error("not implemented");
+ // NOTE: this code comes directly from DataOutputStream.
+ int len = value.length();
+ int sum = 0;
+
+ for (int i = 0; i < len && sum <= 65535; ++i)
+ {
+ char c = value.charAt(i);
+ if (c >= '\u0001' && c <= '\u007f')
+ sum += 1;
+ else if (c == '\u0000' || (c >= '\u0080' && c <= '\u07ff'))
+ sum += 2;
+ else
+ sum += 3;
+ }
+
+ if (sum > 65535)
+ throw new UTFDataFormatException ();
+
+ int pos = 0;
+ byte[] buf = new byte[sum];
+
+ for (int i = 0; i < len; ++i)
+ {
+ char c = value.charAt(i);
+ if (c >= '\u0001' && c <= '\u007f')
+ buf[pos++] = (byte) c;
+ else if (c == '\u0000' || (c >= '\u0080' && c <= '\u07ff'))
+ {
+ buf[pos++] = (byte) (0xc0 | (0x1f & (c >> 6)));
+ buf[pos++] = (byte) (0x80 | (0x3f & c));
+ }
+ else
+ {
+ // JSL says the first byte should be or'd with 0xc0, but
+ // that is a typo. Unicode says 0xe0, and that is what is
+ // consistent with DataInputStream.
+ buf[pos++] = (byte) (0xe0 | (0x0f & (c >> 12)));
+ buf[pos++] = (byte) (0x80 | (0x3f & (c >> 6)));
+ buf[pos++] = (byte) (0x80 | (0x3f & c));
+ }
+ }
+
+ writeShort (sum);
+ write(buf, 0, sum);
}
}
diff --git a/javax/imageio/stream/MemoryCacheImageInputStream.java b/javax/imageio/stream/MemoryCacheImageInputStream.java
index 3d9f61846..935408c9a 100644
--- a/javax/imageio/stream/MemoryCacheImageInputStream.java
+++ b/javax/imageio/stream/MemoryCacheImageInputStream.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.imageio.stream;
+import gnu.classpath.NotImplementedException;
+
import java.io.IOException;
import java.io.InputStream;
@@ -61,7 +63,7 @@ public class MemoryCacheImageInputStream extends ImageInputStreamImpl
}
public void flushBefore(long position)
- throws IOException
+ throws IOException, NotImplementedException
{
// FIXME: Implement me.
throw new Error("not implemented");
diff --git a/javax/imageio/stream/MemoryCacheImageOutputStream.java b/javax/imageio/stream/MemoryCacheImageOutputStream.java
index 8914c3305..17039f544 100644
--- a/javax/imageio/stream/MemoryCacheImageOutputStream.java
+++ b/javax/imageio/stream/MemoryCacheImageOutputStream.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.imageio.stream;
+import gnu.classpath.NotImplementedException;
+
import java.io.IOException;
import java.io.OutputStream;
@@ -61,7 +63,7 @@ public class MemoryCacheImageOutputStream extends ImageOutputStreamImpl
}
public void flushBefore(long position)
- throws IOException
+ throws IOException, NotImplementedException
{
// FIXME: Implement me.
throw new Error("not implemented");
@@ -83,14 +85,14 @@ public class MemoryCacheImageOutputStream extends ImageOutputStreamImpl
}
public int read()
- throws IOException
+ throws IOException, NotImplementedException
{
// FIXME: Implement me.
throw new Error("not implemented");
}
public int read (byte[] data, int offset, int len)
- throws IOException
+ throws IOException, NotImplementedException
{
// FIXME: Implement me.
throw new Error("not implemented");
diff --git a/javax/naming/Binding.java b/javax/naming/Binding.java
index 9d6608aba..a34f8b329 100644
--- a/javax/naming/Binding.java
+++ b/javax/naming/Binding.java
@@ -39,31 +39,73 @@ exception statement from your version. */
package javax.naming;
/**
+ * <code>Binding</code> represents the name-object mapping of a
+ * binding in a context.
+ * <p>
+ * Bindings are mappings of a name to an object and this class is used to
+ * specify such mappings. The bindings of a context are retrieved by the
+ * <code>Context#listBindings()</code> methods.
+ * </p>
+ *
* @author Tom Tromey (tromey@redhat.com)
- * @date May 16, 2001
+ * @since 1.3
*/
public class Binding extends NameClassPair
{
private static final long serialVersionUID = 8839217842691845890L;
+ /**
+ * Constructs an instance with the given name and object.
+ *
+ * @param name the name of the binding relative to the target context
+ * (may not be <code>null</code>)
+ * @param obj the bound object
+ */
public Binding (String name, Object obj)
{
super (name, null);
boundObj = obj;
}
+ /**
+ * Constructs an instance with the given name and object and a
+ * flag indicating if the name is relative to the target context.
+ *
+ * @param name the name of the binding relative to the target context
+ * (may not be <code>null</code>)
+ * @param obj the bound object
+ * @param isRelative flag indicating if the name is relative or not
+ */
public Binding (String name, Object obj, boolean isRelative)
{
super (name, null, isRelative);
boundObj = obj;
}
+ /**
+ * Constructs an instance with the given name, classname and object.
+ *
+ * @param name the name of the binding relative to the target context
+ * (may not be <code>null</code>)
+ * @param className the classname to set (maybe <code>null</code>)
+ * @param obj the bound object
+ */
public Binding (String name, String className, Object obj)
{
super (name, className);
boundObj = obj;
}
+ /**
+ * Constructs an instance with the given name, classname, object and a
+ * flag indicating if the name is relative to the target context.
+ *
+ * @param name the name of the binding relative to the target context
+ * (may not be <code>null</code>)
+ * @param className the classname to set (maybe <code>null</code>)
+ * @param isRelative flag indicating if the name is relative or not
+ * @param obj the bound object
+ */
public Binding (String name, String className, Object obj,
boolean isRelative)
{
@@ -71,6 +113,15 @@ public class Binding extends NameClassPair
boundObj = obj;
}
+ /**
+ * Returns the classname of the bound object.
+ * <p>
+ * Returns the classname if set explicitly. If not and the bound object is
+ * not <code>null</code> the classname of the bound object is used.
+ * </p>
+ *
+ * @return The fully qualified classname (may be <code>null</code>).
+ */
public String getClassName ()
{
String r = super.getClassName ();
@@ -79,16 +130,29 @@ public class Binding extends NameClassPair
return boundObj == null ? null : boundObj.getClass ().getName ();
}
+ /**
+ * Returns the bound object of this binding.
+ * @return The bound object (maybe <code>null</code>).
+ */
public Object getObject ()
{
return boundObj;
}
+ /**
+ * Sets the bound object of this binding.
+ * @param obj the bound object.
+ */
public void setObject (Object obj)
{
boundObj = obj;
}
+ /**
+ * Returns the string representation.
+ * @return The string as given by the NameClassPair superclass plus
+ * the bound objects string representation seperated by a colon.
+ */
public String toString ()
{
// Format specified by the documentation.
diff --git a/javax/naming/CompositeName.java b/javax/naming/CompositeName.java
index 61adcf177..6f3466ca2 100644
--- a/javax/naming/CompositeName.java
+++ b/javax/naming/CompositeName.java
@@ -1,5 +1,5 @@
/* CompositeName.java --
- Copyright (C) 2001, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,9 @@ exception statement from your version. */
package javax.naming;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.NoSuchElementException;
@@ -45,10 +48,6 @@ import java.util.Vector;
/**
* @author Tom Tromey (tromey@redhat.com)
- * @date May 16, 2001
- *
- * FIXME: must write readObject and writeObject to conform to
- * serialization spec.
*/
public class CompositeName implements Name, Cloneable, Serializable
{
@@ -316,6 +315,22 @@ public class CompositeName implements Name, Cloneable, Serializable
}
return result.toString ();
}
+
+ private void readObject(ObjectInputStream s)
+ throws IOException, ClassNotFoundException
+ {
+ int size = s.readInt();
+ elts = new Vector(size);
+ for (int i = 0; i < size; i++)
+ elts.add(s.readObject());
+ }
+
+ private void writeObject(ObjectOutputStream s) throws IOException
+ {
+ s.writeInt(elts.size());
+ for (int i = 0; i < elts.size(); i++)
+ s.writeObject(elts.get(i));
+ }
private transient Vector elts;
}
diff --git a/javax/naming/NameClassPair.java b/javax/naming/NameClassPair.java
index 127730af4..7925d45d8 100644
--- a/javax/naming/NameClassPair.java
+++ b/javax/naming/NameClassPair.java
@@ -41,18 +41,43 @@ package javax.naming;
import java.io.Serializable;
/**
+ * <code>NameClassPair</code> represents the name-classname mapping pair
+ * of a binding in a context.
+ * <p>
+ * Bindings are mappings of a name to an object and this class is used to
+ * specify the mapping of the name to the class type of the bound object.
+ * As classname the fully qualified classname is used.
+ * </p>
+ *
* @author Tom Tromey (tromey@redhat.com)
- * @date May 16, 2001
+ * @since 1.3
*/
public class NameClassPair implements Serializable
{
private static final long serialVersionUID = 5620776610160863339L;
+ /**
+ * Constructs an instance with the given name and classname.
+ *
+ * @param name the name of the binding relative to the target context
+ * (may not be <code>null</code>)
+ * @param className the name of the class. If <code>null</code> the bound
+ * object is also <code>null</code>
+ */
public NameClassPair (String name, String className)
{
this (name, className, true);
}
+ /**
+ * Constructs an instance with the given name and classname and a
+ * flag indicating if the name is relative to the target context.
+ *
+ * @param name the name of the binding (may not be <code>null</code>)
+ * @param className the name of the class. If <code>null</code> the bound
+ * object is also <code>null</code>
+ * @param isRelative flag indicating if the name is relative or not
+ */
public NameClassPair (String name, String className, boolean isRelative)
{
this.name = name;
@@ -60,36 +85,105 @@ public class NameClassPair implements Serializable
this.isRel = isRelative;
}
+ /**
+ * Returns the classname of the binding.
+ * @return The fully qualified classname or <code>null</code> if the
+ * bound object is null.
+ */
public String getClassName ()
{
return className;
}
+ /**
+ * Returns the name of the binding.
+ * @return The name.
+ */
public String getName ()
{
return name;
}
+ /**
+ * Checks whether the name is relative to the target context or not.
+ * @return <code>true</code> if the name is relative,
+ * <code>false</code> otherwise.
+ */
public boolean isRelative ()
{
return isRel;
}
+ /**
+ * Sets the classname of the bound object.
+ * @param name the classname to set (maybe <code>null</code>)
+ */
public void setClassName (String name)
{
this.className = name;
}
+ /**
+ * Sets the name of the binding.
+ * @param name the name to set
+ */
public void setName (String name)
{
this.name = name;
}
+ /**
+ * Sets if the name is relative to the target context.
+ * @param r <code>true</code> to mark as relative
+ */
public void setRelative (boolean r)
{
this.isRel = r;
}
+
+ /**
+ * Sets the full name for this binding. Setting the full name by this
+ * method is the only way to initialize full names of bindings if
+ * supported by a specific naming system.
+ *
+ * @param fullName the full name of this binding. If not set or set to
+ * <code>null</code> the <code>getNameInNamespace()</code> method will
+ * throw an exception
+ *
+ * @see #getNameInNamespace()
+ *
+ * @since 1.5
+ */
+ public void setNameInNamespace(String fullName)
+ {
+ this.fullName = fullName;
+ }
+
+ /**
+ * Returns the full name for this binding. The full name of a binding is
+ * defined as the absolute name in its own namespace and is not valid
+ * outside.
+ *
+ * @return The full name in the bindings namespace.
+ * @throws UnsupportedOperationException if no full name is applicable in
+ * the specific naming system.
+ *
+ * @see Context#getNameInNamespace()
+ *
+ * @since 1.5
+ */
+ public String getNameInNamespace()
+ {
+ if (this.fullName == null)
+ throw new UnsupportedOperationException();
+
+ return this.fullName;
+ }
+ /**
+ * Returns the string representation.
+ * @return The string <code>getName() + ":" + getClassName()</code>.
+ */
public String toString ()
{
// Specified by class documentation.
@@ -100,4 +194,5 @@ public class NameClassPair implements Serializable
private String name;
private String className;
private boolean isRel;
+ private String fullName;
}
diff --git a/javax/naming/directory/BasicAttribute.java b/javax/naming/directory/BasicAttribute.java
index 047036585..c6419794f 100644
--- a/javax/naming/directory/BasicAttribute.java
+++ b/javax/naming/directory/BasicAttribute.java
@@ -1,5 +1,5 @@
/* BasicAttribute.java --
- Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,9 @@ exception statement from your version. */
package javax.naming.directory;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.util.NoSuchElementException;
import java.util.Vector;
@@ -48,6 +51,7 @@ import javax.naming.OperationNotSupportedException;
/**
* @author Tom Tromey (tromey@redhat.com)
* @date June 20, 2001
+ * @since 1.3
*/
public class BasicAttribute implements Attribute
{
@@ -297,11 +301,29 @@ public class BasicAttribute implements Attribute
return one.equals (two);
}
+
+ private void readObject(ObjectInputStream s)
+ throws IOException, ClassNotFoundException
+ {
+ s.defaultReadObject();
+ int size = s.readInt();
+ values = new Vector(size);
+ for (int i=0; i < size; i++)
+ values.add(s.readObject());
+ }
+ private void writeObject(ObjectOutputStream s) throws IOException
+ {
+ s.defaultWriteObject();
+ s.writeInt(values.size());
+ for (int i=0; i < values.size(); i++)
+ s.writeObject(values.get(i));
+ }
+
// Used when enumerating this attribute.
private class BasicAttributeEnumeration implements NamingEnumeration
{
- int where = -1;
+ int where = 0;
public BasicAttributeEnumeration ()
{
@@ -328,10 +350,9 @@ public class BasicAttribute implements Attribute
public Object nextElement () throws NoSuchElementException
{
- if (where + 1 >= values.size ())
+ if (where == values.size ())
throw new NoSuchElementException ("no more elements");
- ++where;
- return values.get (where);
+ return values.get (where++);
}
}
}
diff --git a/javax/naming/directory/BasicAttributes.java b/javax/naming/directory/BasicAttributes.java
index 37ec19577..9318fbb2b 100644
--- a/javax/naming/directory/BasicAttributes.java
+++ b/javax/naming/directory/BasicAttributes.java
@@ -1,5 +1,5 @@
/* BasicAttributes.java --
- Copyright (C) 2000, 2001, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,9 @@ exception statement from your version. */
package javax.naming.directory;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.util.NoSuchElementException;
import java.util.Vector;
@@ -196,6 +199,24 @@ public class BasicAttributes implements Attributes
// Package-private to avoid a trampoline.
transient Vector attributes;
+ private void readObject(ObjectInputStream s) throws IOException,
+ ClassNotFoundException
+ {
+ s.defaultReadObject();
+ int size = s.readInt();
+ attributes = new Vector(size);
+ for (int i = 0; i < size; i++)
+ attributes.add(s.readObject());
+ }
+
+ private void writeObject(ObjectOutputStream s) throws IOException
+ {
+ s.defaultWriteObject();
+ s.writeInt(attributes.size());
+ for (int i = 0; i < attributes.size(); i++)
+ s.writeObject(attributes.get(i));
+ }
+
// Used when enumerating.
private class BasicAttributesEnumeration implements NamingEnumeration
{
diff --git a/javax/naming/ldap/StartTlsRequest.java b/javax/naming/ldap/StartTlsRequest.java
new file mode 100644
index 000000000..b0a30b54f
--- /dev/null
+++ b/javax/naming/ldap/StartTlsRequest.java
@@ -0,0 +1,108 @@
+/* StartTlsRequest.java -- extended ldap TLS request
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.naming.ldap;
+
+import java.util.Iterator;
+
+import gnu.classpath.ServiceFactory;
+
+import javax.naming.NamingException;
+
+/**
+ * @since 1.4
+ */
+public class StartTlsRequest
+ implements ExtendedRequest
+{
+ private static final long serialVersionUID = 4441679576360753397L;
+
+ /**
+ * The assigned object identifier for this response.
+ */
+ public static final String OID = "1.3.6.1.4.1.1466.20037";
+
+ /**
+ * Create a new instance.
+ */
+ public StartTlsRequest()
+ {
+ }
+
+ /**
+ * Return the response identifier. This is simply the value
+ * of the {@link #OID} field.
+ */
+ public String getID()
+ {
+ return OID;
+ }
+
+ /**
+ * Return the encoded value. This implementation always returns null.
+ */
+ public byte[] getEncodedValue()
+ {
+ return null;
+ }
+
+ /**
+ * Create a new extended reponse object, using the standard service
+ * provider approach to load a provider. The provider will be a subclass
+ * of StartTlsRequest with a no-argument constructor. The key is
+ * "javax.naming.ldap.StartTlsRequest".
+ * @param id the identifier, must be {@link #OID} or null
+ * @param berValue ignored
+ * @param offset ignored
+ * @param length ignored
+ * @throws NamingException if there is a problem creating the response
+ */
+ public ExtendedResponse createExtendedResponse(String id, byte[] berValue,
+ int offset, int length)
+ throws NamingException
+ {
+ if (id != null && ! OID.equals(id))
+ throw new NamingException("incorrect id: was \"" + id
+ + "\", but expected: \"" + OID + "\"");
+ Iterator it = ServiceFactory.lookupProviders(StartTlsRequest.class);
+ if (it.hasNext())
+ return (ExtendedResponse) it.next();
+ throw new NamingException("couldn't find provider for "
+ + "javax.naming.ldap.StartTlsRequest");
+ }
+}
diff --git a/javax/naming/ldap/StartTlsResponse.java b/javax/naming/ldap/StartTlsResponse.java
new file mode 100644
index 000000000..68cd5bf86
--- /dev/null
+++ b/javax/naming/ldap/StartTlsResponse.java
@@ -0,0 +1,119 @@
+/* StartTlsResponse.java -- extended ldap TLS response
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.naming.ldap;
+
+import java.io.IOException;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+
+/**
+ * @since 1.4
+ */
+public abstract class StartTlsResponse
+ implements ExtendedResponse
+{
+ private static final long serialVersionUID = 8372842182579276418L;
+
+ /**
+ * The assigned object identifier for this response.
+ */
+ public static final String OID = "1.3.6.1.4.1.1466.20037";
+
+ /**
+ * Create a new instance.
+ */
+ protected StartTlsResponse()
+ {
+ }
+
+ /**
+ * Return the response identifier. This is simply the value
+ * of the {@link #OID} field.
+ */
+ public String getID()
+ {
+ return OID;
+ }
+
+ /**
+ * Return the encoded value. This implementation always returns null.
+ */
+ public byte[] getEncodedValue()
+ {
+ return null;
+ }
+
+ /**
+ * Set the list of cipher suites to use.
+ * @param cipherSuites the list of suites
+ * @see SSLSocketFactory#getSupportedCipherSuites()
+ */
+ public abstract void setEnabledCipherSuites(String[] cipherSuites);
+
+ /**
+ * Set the hostname verifier to use. This must be called before
+ * {@link #negotiate()}.
+ * @param verifier the hostname verifier
+ */
+ public abstract void setHostnameVerifier(HostnameVerifier verifier);
+
+ /**
+ * Negotiate the TLS session using the default SSL socket factory.
+ * @return the SSL session
+ * @throws IOException if communication fails for some reason
+ */
+ public abstract SSLSession negotiate() throws IOException;
+
+ /**
+ * Negotiate the TLS session using the supplied SSL socket factory.
+ * @param factory the socket factory to use
+ * @return the SSL session
+ * @throws IOException if communication fails for some reason
+ */
+ public abstract SSLSession negotiate(SSLSocketFactory factory)
+ throws IOException;
+
+ /**
+ * Close the connection.
+ * @throws IOException if communication fails for some reason
+ */
+ public abstract void close() throws IOException;
+}
diff --git a/javax/net/ssl/HttpsURLConnection.java b/javax/net/ssl/HttpsURLConnection.java
index 4c73edbcd..3f30dc1b8 100644
--- a/javax/net/ssl/HttpsURLConnection.java
+++ b/javax/net/ssl/HttpsURLConnection.java
@@ -1,5 +1,5 @@
/* HttpsURLConnection.java -- an HTTPS connection.
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,7 +38,6 @@ exception statement from your version. */
package javax.net.ssl;
-import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.cert.Certificate;
@@ -90,9 +89,10 @@ public abstract class HttpsURLConnection extends HttpURLConnection
* Creates a new HTTPS URL connection.
*
* @param url The URL of the connection being established.
- * @throws IOException If the connection cannot be established.
+ * @specnote This was marked as throwing IOException in 1.4,
+ * but this was removed in 1.5.
*/
- protected HttpsURLConnection(URL url) throws IOException
+ protected HttpsURLConnection(URL url)
{
super(url);
}
diff --git a/javax/security/auth/kerberos/DelegationPermission.java b/javax/security/auth/kerberos/DelegationPermission.java
new file mode 100644
index 000000000..33e1f9893
--- /dev/null
+++ b/javax/security/auth/kerberos/DelegationPermission.java
@@ -0,0 +1,136 @@
+/* DelegationPermission.java -- kerberos delegation permission
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.security.auth.kerberos;
+
+import java.security.BasicPermission;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.util.Enumeration;
+import java.util.Vector;
+
+/**
+ * @since 1.4
+ */
+public final class DelegationPermission
+ extends BasicPermission
+{
+ // FIXME: Enable this when serialization works.
+ // private static final long serialVersionUID = 883133252142523922L;
+
+ /**
+ * Create a new instance with the given name.
+ */
+ public DelegationPermission(String name)
+ {
+ super(name);
+ checkSyntax(name);
+ }
+
+ /**
+ * Create a new instance with the given name and actions.
+ *
+ * The name consists of two parts: first the subordinate
+ * service principal, then the target service principal.
+ * Each principal is surrounded by quotes; the two are separated
+ * by a space.
+ *
+ * @param name the name
+ * @param actions the actions; this is ignored
+ */
+ public DelegationPermission(String name, String actions)
+ {
+ super(name, actions);
+ checkSyntax(name);
+ }
+
+ private static void checkSyntax(String name)
+ {
+ int index = name.indexOf('"', 1);
+ int len = name.length();
+ if (name.charAt(0) != '"' || name.charAt(len - 1) != '"'
+ || index == -1 || index + 3 >= len
+ || name.charAt(index + 1) != ' '
+ || name.charAt(index + 2) != '"')
+ // FIXME: better message here.
+ throw new IllegalArgumentException("invalid syntax for principals");
+ }
+
+ public boolean implies(Permission perm)
+ {
+ return equals(perm);
+ }
+
+ public PermissionCollection newPermissionCollection()
+ {
+ // FIXME: don't know how to serialize here. I suspect this
+ // class has to have a particular name, etc ...
+ return new PermissionCollection()
+ {
+ private Vector permissions = new Vector();
+
+ public void add(Permission perm)
+ {
+ if (isReadOnly())
+ throw new SecurityException("readonly");
+ if (! (perm instanceof DelegationPermission))
+ throw new IllegalArgumentException("can only add DelegationPermissions");
+ permissions.add(perm);
+ }
+
+ public boolean implies(Permission perm)
+ {
+ if (! (perm instanceof DelegationPermission))
+ return false;
+ Enumeration e = elements();
+ while (e.hasMoreElements())
+ {
+ DelegationPermission dp = (DelegationPermission) e.nextElement();
+ if (dp.implies(perm))
+ return true;
+ }
+ return false;
+ }
+
+ public Enumeration elements()
+ {
+ return permissions.elements();
+ }
+ };
+ }
+}
diff --git a/javax/security/auth/kerberos/KerberosKey.java b/javax/security/auth/kerberos/KerberosKey.java
new file mode 100644
index 000000000..3372a162f
--- /dev/null
+++ b/javax/security/auth/kerberos/KerberosKey.java
@@ -0,0 +1,180 @@
+/* KerberosKey.java -- kerberos key
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.security.auth.kerberos;
+
+import gnu.classpath.NotImplementedException;
+
+import java.io.Serializable;
+
+import javax.crypto.SecretKey;
+import javax.security.auth.DestroyFailedException;
+import javax.security.auth.Destroyable;
+
+/**
+ * This class represents a Kerberos key. See the Kerberos
+ * authentication RFC for more information:
+ * <a href="http://www.ietf.org/rfc/rfc1510.txt">RFC 1510</a>.
+ *
+ * @since 1.4
+ */
+public class KerberosKey
+ implements Serializable, SecretKey, Destroyable
+{
+ private static final long serialVersionUID = -4625402278148246993L;
+
+ private KerberosPrincipal principal;
+ private int versionNum;
+ private KeyImpl key;
+
+ /**
+ * Construct a new key with the indicated principal and key.
+ * @param principal the principal
+ * @param key the key's data
+ * @param type the key's type
+ * @param version the key's version number
+ */
+ public KerberosKey(KerberosPrincipal principal, byte[] key, int type,
+ int version)
+ {
+ this.principal = principal;
+ this.versionNum = version;
+ this.key = new KeyImpl(key, type);
+ }
+
+ /**
+ * Construct a new key with the indicated principal and a password.
+ * @param principal the principal
+ * @param passwd the password to use
+ * @param algo the algorithm; if null the "DES" algorithm is used
+ */
+ public KerberosKey(KerberosPrincipal principal, char[] passwd, String algo)
+ // Not implemented because KeyImpl really does nothing here.
+ throws NotImplementedException
+ {
+ this.principal = principal;
+ this.versionNum = 0; // FIXME: correct?
+ this.key = new KeyImpl(passwd, algo);
+ }
+
+ /**
+ * Return the name of the algorithm used to create this key.
+ */
+ public final String getAlgorithm()
+ {
+ checkDestroyed();
+ return key.algorithm;
+ }
+
+ /**
+ * Return the format of this key. This implementation always returns "RAW".
+ */
+ public final String getFormat()
+ {
+ checkDestroyed();
+ // Silly, but specified.
+ return "RAW";
+ }
+
+ /**
+ * Return the principal associated with this key.
+ */
+ public final KerberosPrincipal getPrincipal()
+ {
+ checkDestroyed();
+ return principal;
+ }
+
+ /**
+ * Return the type of this key.
+ */
+ public final int getKeyType()
+ {
+ checkDestroyed();
+ return key.type;
+ }
+
+ /**
+ * Return the version number of this key.
+ */
+ public final int getVersionNumber()
+ {
+ checkDestroyed();
+ return versionNum;
+ }
+
+ /**
+ * Return the encoded form of this key.
+ */
+ public final byte[] getEncoded()
+ {
+ checkDestroyed();
+ return (byte[]) key.key.clone();
+ }
+
+ /**
+ * Destroy this key.
+ */
+ public void destroy() throws DestroyFailedException
+ {
+ if (key == null)
+ throw new DestroyFailedException("already destroyed");
+ key = null;
+ }
+
+ /**
+ * Return true if this key has been destroyed. After this has been
+ * called, other methods on this object will throw IllegalStateException.
+ */
+ public boolean isDestroyed()
+ {
+ return key == null;
+ }
+
+ private void checkDestroyed()
+ {
+ if (key == null)
+ throw new IllegalStateException("key is destroyed");
+ }
+
+ public String toString()
+ {
+ // FIXME: random choice here.
+ return principal + ":" + versionNum;
+ }
+}
diff --git a/javax/security/auth/kerberos/KerberosPrincipal.java b/javax/security/auth/kerberos/KerberosPrincipal.java
new file mode 100644
index 000000000..d52b5cf9e
--- /dev/null
+++ b/javax/security/auth/kerberos/KerberosPrincipal.java
@@ -0,0 +1,207 @@
+/* KerberosPrincipal.java -- a kerberos principal
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.security.auth.kerberos;
+
+import gnu.classpath.NotImplementedException;
+import gnu.classpath.SystemProperties;
+
+import java.io.Serializable;
+import java.security.Principal;
+
+/**
+ * This represents a Kerberos principal. See the Kerberos
+ * authentication RFC for more information:
+ * <a href="http://www.ietf.org/rfc/rfc1510.txt">RFC 1510</a>.
+ *
+ * @since 1.4
+ */
+public final class KerberosPrincipal
+ implements Serializable, Principal
+{
+ // Uncomment when serialization is correct.
+ // private static final long serialVersionUID = -7374788026156829911L;
+
+ /**
+ * Constant from the RFC: "Just the name of the principal as in DCE, or
+ * for users".
+ */
+ public static final int KRB_NT_PRINCIPAL = 1;
+
+ /**
+ * Constant from the RFC: "Service and other unique instance (krbtgt)".
+ */
+ public static final int KRB_NT_SRV_HST = 3;
+
+ /**
+ * Constant from the RFC: "Service with host name as instance (telnet,
+ * rcommands)".
+ */
+ public static final int KRB_NT_SRV_INST = 2;
+
+ /**
+ * Constant from the RFC: "Service with host as remaining components".
+ */
+ public static final int KRB_NT_SRV_XHST = 4;
+
+ /**
+ * Constant from the RFC: "Unique ID".
+ */
+ public static final int KRB_NT_UID = 5;
+
+ /**
+ * Constant from the RFC: "Name type not known".
+ */
+ public static final int KRB_NT_UNKNOWN = 0;
+
+ private String name;
+ private int type;
+ private String realm;
+
+ /**
+ * Create a new instance with the given name and a type of
+ * {@link #KRB_NT_PRINCIPAL}.
+ * @param name the principal's name
+ */
+ public KerberosPrincipal(String name)
+ {
+ this(name, KRB_NT_PRINCIPAL);
+ }
+
+ /**
+ * Create a new instance with the given name and type. The name is
+ * parsed according to the rules in the RFC. If there is no realm,
+ * then the local realm is used instead.
+ *
+ * @param name the principal's name
+ * @param type the principal's type
+ */
+ public KerberosPrincipal(String name, int type)
+ // Marked as unimplemented because we don't look for the realm as needed.
+ throws NotImplementedException
+ {
+ if (type < KRB_NT_UNKNOWN || type > KRB_NT_UID)
+ throw new IllegalArgumentException("unknown type: " + type);
+ this.name = name;
+ this.type = type;
+ this.realm = parseRealm();
+ }
+
+ private String parseRealm()
+ {
+ // Handle quoting as specified by the Kerberos RFC.
+ int i, len = name.length();
+ boolean quoted = false;
+ for (i = 0; i < len; ++i)
+ {
+ if (quoted)
+ {
+ quoted = false;
+ continue;
+ }
+ char c = name.charAt(i);
+ if (c == '\\')
+ {
+ quoted = true;
+ continue;
+ }
+ if (c == '@')
+ break;
+ }
+ if (quoted || i == len - 1)
+ throw new IllegalArgumentException("malformed principal: " + name);
+ if (i < len)
+ {
+ // We have the realm. FIXME: verify its syntax?
+ return name.substring(i + 1);
+ }
+ // Try to find the default realm.
+ String def = SystemProperties.getProperty("java.security.krb5.realm");
+ if (def != null)
+ return def;
+ // Now ask the system.
+ // FIXME: use java.security.krb5.conf,
+ // or $JAVA_HOME/lib/security/krb5.conf to find the krb config file.
+ // Then pass to native code using krb5_set_config_files() and
+ // krb5_get_default_realm(). But... what about /etc/krb5.conf?
+ throw new IllegalArgumentException("default realm can't be found");
+ }
+
+ /**
+ * Return the name of this principal.
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /**
+ * Return the realm of this principal.
+ */
+ public String getRealm()
+ {
+ return realm;
+ }
+
+ /**
+ * Return the type of this principal.
+ */
+ public int getNameType()
+ {
+ return type;
+ }
+
+ public int hashCode()
+ {
+ return name.hashCode();
+ }
+
+ public boolean equals(Object other)
+ {
+ if (! (other instanceof KerberosPrincipal))
+ return false;
+ KerberosPrincipal kp = (KerberosPrincipal) other;
+ return name.equals(kp.name) && type == kp.type;
+ }
+
+ public String toString()
+ {
+ // This is what came to mind.
+ return name + ":" + type;
+ }
+}
diff --git a/javax/security/auth/kerberos/KerberosTicket.java b/javax/security/auth/kerberos/KerberosTicket.java
new file mode 100644
index 000000000..85e253749
--- /dev/null
+++ b/javax/security/auth/kerberos/KerberosTicket.java
@@ -0,0 +1,339 @@
+/* KerberosTicket.java -- a kerberos ticket
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.security.auth.kerberos;
+
+import gnu.classpath.NotImplementedException;
+
+import java.io.Serializable;
+import java.net.InetAddress;
+import java.util.Date;
+
+import javax.crypto.SecretKey;
+import javax.security.auth.DestroyFailedException;
+import javax.security.auth.Destroyable;
+import javax.security.auth.RefreshFailedException;
+import javax.security.auth.Refreshable;
+
+/**
+ * This class represents a Kerberos ticket. See the Kerberos
+ * authentication RFC for more information:
+ * <a href="http://www.ietf.org/rfc/rfc1510.txt">RFC 1510</a>.
+ *
+ * @since 1.4
+ */
+public class KerberosTicket
+ implements Destroyable, Serializable, Refreshable
+{
+ private static final long serialVersionUID = 7395334370157380539L;
+
+ // Indices of the various flags. From the kerberos spec.
+ // We only list the ones we use.
+ private static final int FORWARDABLE = 1;
+ private static final int FORWARDED = 2;
+ private static final int PROXIABLE = 3;
+ private static final int PROXY = 4;
+ private static final int POSTDATED = 6;
+ private static final int RENEWABLE = 8;
+ private static final int INITIAL = 9;
+ private static final int NUM_FLAGS = 12;
+
+ private byte[] asn1Encoding;
+ private KeyImpl sessionKey;
+ private boolean[] flags;
+ private Date authTime;
+ private Date startTime;
+ private Date endTime;
+ private Date renewTill;
+ private KerberosPrincipal client;
+ private KerberosPrincipal server;
+ private InetAddress[] clientAddresses;
+
+ /**
+ * Create a new ticket given all the facts about it.
+ *
+ * Note that flags may be null or "short"; any flags not specified
+ * will be taken to be false.
+ *
+ * If the key is not renewable, then renewTill may be null.
+ *
+ * If authTime is null, then it is taken to be the same as startTime.
+ *
+ * If clientAddresses is null, then the ticket can be used anywhere.
+ *
+ * @param asn1Encoding the contents of the ticket, as ASN1
+ * @param client the client principal
+ * @param server the server principal
+ * @param key the contents of the session key
+ * @param type the type of the key
+ * @param flags an array of flags, as specified by the RFC
+ * @param authTime when the client was authenticated
+ * @param startTime starting time at which the ticket is valid
+ * @param endTime ending time, after which the ticket is invalid
+ * @param renewTill for a rewewable ticket, the time before which it must
+ * be renewed
+ * @param clientAddresses a possibly-null array of addresses where this
+ * ticket may be used
+ */
+ public KerberosTicket(byte[] asn1Encoding, KerberosPrincipal client,
+ KerberosPrincipal server, byte[] key, int type,
+ boolean[] flags, Date authTime, Date startTime,
+ Date endTime, Date renewTill,
+ InetAddress[] clientAddresses)
+ {
+ this.asn1Encoding = (byte[]) asn1Encoding.clone();
+ this.sessionKey = new KeyImpl(key, type);
+ this.flags = new boolean[NUM_FLAGS];
+ if (flags != null)
+ System.arraycopy(flags, 0, this.flags, 0,
+ Math.min(flags.length, NUM_FLAGS));
+ this.flags = (boolean[]) flags.clone();
+ this.authTime = (Date) authTime.clone();
+ this.startTime = (Date) ((startTime == null)
+ ? authTime : startTime).clone();
+ this.endTime = (Date) endTime.clone();
+ this.renewTill = (Date) renewTill.clone();
+ this.client = client;
+ this.server = server;
+ this.clientAddresses = (clientAddresses == null
+ ? null
+ : (InetAddress[]) clientAddresses.clone());
+ }
+
+ /**
+ * Destroy this ticket. This discards secret information. After this
+ * method is called, other methods will throw IllegalStateException.
+ */
+ public void destroy() throws DestroyFailedException
+ {
+ if (sessionKey == null)
+ throw new DestroyFailedException("already destroyed");
+ sessionKey = null;
+ asn1Encoding = null;
+ }
+
+ /**
+ * Return true if this ticket has been destroyed.
+ */
+ public boolean isDestroyed()
+ {
+ return sessionKey == null;
+ }
+
+ /**
+ * Return true if the ticket is currently valid. This is true if
+ * the system time is between the ticket's start and end times.
+ */
+ public boolean isCurrent()
+ {
+ long now = System.currentTimeMillis();
+ return startTime.getTime() <= now && now <= endTime.getTime();
+ }
+
+ /**
+ * If the ticket is renewable, and the renewal time has not yet elapsed,
+ * attempt to renew the ticket.
+ * @throws RefreshFailedException if the renewal fails for any reason
+ */
+ public void refresh() throws RefreshFailedException, NotImplementedException
+ {
+ if (! isRenewable())
+ throw new RefreshFailedException("not renewable");
+ if (renewTill != null
+ && System.currentTimeMillis() >= renewTill.getTime())
+ throw new RefreshFailedException("renewal time elapsed");
+ // FIXME: must contact the KDC.
+ // Use the java.security.krb5.kdc property...
+ throw new RefreshFailedException("not implemented");
+ }
+
+ /**
+ * Return the client principal for this ticket.
+ */
+ public final KerberosPrincipal getClient()
+ {
+ return client;
+ }
+
+ /**
+ * Return the server principal for this ticket.
+ */
+ public final KerberosPrincipal getServer()
+ {
+ return server;
+ }
+
+ /**
+ * Return true if this ticket is forwardable.
+ */
+ public final boolean isForwardable()
+ {
+ return flags[FORWARDABLE];
+ }
+
+ /**
+ * Return true if this ticket has been forwarded.
+ */
+ public final boolean isForwarded()
+ {
+ return flags[FORWARDED];
+ }
+
+ /**
+ * Return true if this ticket is proxiable.
+ */
+ public final boolean isProxiable()
+ {
+ return flags[PROXIABLE];
+ }
+
+ /**
+ * Return true if this ticket is a proxy ticket.
+ */
+ public final boolean isProxy()
+ {
+ return flags[PROXY];
+ }
+
+ /**
+ * Return true if this ticket was post-dated.
+ */
+ public final boolean isPostdated()
+ {
+ return flags[POSTDATED];
+ }
+
+ /**
+ * Return true if this ticket is renewable.
+ */
+ public final boolean isRenewable()
+ {
+ return flags[RENEWABLE];
+ }
+
+ /**
+ * Return true if this ticket was granted by an application
+ * server, and not via a ticket-granting ticket.
+ */
+ public final boolean isInitial()
+ {
+ return flags[INITIAL];
+ }
+
+ /**
+ * Return the flags for this ticket as a boolean array.
+ * See the RFC to understand what the different entries mean.
+ */
+ public final boolean[] getFlags()
+ {
+ return (boolean[]) flags.clone();
+ }
+
+ /**
+ * Return the authentication time for this ticket.
+ */
+ public final Date getAuthTime()
+ {
+ return (Date) authTime.clone();
+ }
+
+ /**
+ * Return the start time for this ticket.
+ */
+ public final Date getStartTime()
+ {
+ return (Date) startTime.clone();
+ }
+
+ /**
+ * Return the end time for this ticket.
+ */
+ public final Date getEndTime()
+ {
+ return (Date) endTime.clone();
+ }
+
+ /**
+ * Return the renewal time for this ticket. For a non-renewable
+ * ticket, this will return null.
+ */
+ public final Date getRenewTill()
+ {
+ return flags[RENEWABLE] ? ((Date) renewTill.clone()) : null;
+ }
+
+ /**
+ * Return the allowable client addresses for this ticket. This will
+ * return null if the ticket can be used anywhere.
+ */
+ public final InetAddress[] getClientAddresses()
+ {
+ return (clientAddresses == null
+ ? null
+ : (InetAddress[]) clientAddresses.clone());
+ }
+
+ /**
+ * Return the encoded form of this ticket.
+ */
+ public final byte[] getEncoded()
+ {
+ checkDestroyed();
+ return (byte[]) sessionKey.key.clone();
+ }
+
+ /**
+ * Return the secret key associated with this ticket.
+ */
+ public final SecretKey getSessionKey()
+ {
+ checkDestroyed();
+ return sessionKey;
+ }
+
+ private void checkDestroyed()
+ {
+ if (sessionKey == null)
+ throw new IllegalStateException("key is destroyed");
+ }
+
+ public String toString()
+ {
+ return "FIXME bob";
+ }
+}
diff --git a/javax/security/auth/kerberos/KeyImpl.java b/javax/security/auth/kerberos/KeyImpl.java
new file mode 100644
index 000000000..6773dfa3e
--- /dev/null
+++ b/javax/security/auth/kerberos/KeyImpl.java
@@ -0,0 +1,93 @@
+/* KeyImpl.java -- kerberos key implementation
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.security.auth.kerberos;
+
+import java.io.Serializable;
+
+import javax.crypto.SecretKey;
+
+/**
+ * Note that the name of this class is fixed by the serialization
+ * spec, even though the class itself is not public.
+ */
+final class KeyImpl implements Serializable, SecretKey
+{
+ // Enable this when serialization works.
+ // private static final long serialVersionUID = -7889313790214321193L;
+
+ public String algorithm;
+ public int type;
+ public byte[] key;
+
+ public KeyImpl(byte[] key, int type)
+ {
+ // From kerberos spec.
+ if (type == 0)
+ this.algorithm = null;
+ else if (type == 1)
+ this.algorithm = "DES";
+ else
+ this.algorithm = "FIXME";
+ this.type = type;
+ this.key = (byte[]) key.clone();
+ }
+
+ public KeyImpl(char[] passwd, String algo)
+ {
+ this.algorithm = (algo == null) ? "DES" : algo;
+ this.type = 0; // FIXME
+ this.key = null; // double FIXME
+ }
+
+ public String getAlgorithm()
+ {
+ return algorithm;
+ }
+
+ public byte[] getEncoded()
+ {
+ return key;
+ }
+
+ public String getFormat()
+ {
+ // FIXME.
+ return null;
+ }
+}
diff --git a/javax/security/auth/kerberos/ServicePermission.java b/javax/security/auth/kerberos/ServicePermission.java
new file mode 100644
index 000000000..452f8e966
--- /dev/null
+++ b/javax/security/auth/kerberos/ServicePermission.java
@@ -0,0 +1,172 @@
+/* ServicePermission.java -- kerberos service permission
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.security.auth.kerberos;
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.util.Enumeration;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+/**
+ * This represents permission to access to a Kerberos service principal.
+ * See the Kerberos authentication RFC for more information:
+ * <a href="http://www.ietf.org/rfc/rfc1510.txt">RFC 1510</a>.
+ *
+ * @since 1.4
+ */
+public final class ServicePermission
+ extends Permission
+{
+ // FIXME: Enable this when serialization works.
+ // private static final long serialVersionUID = -1227585031618624935L;
+
+ private static final int INITIATE = 1;
+ private static final int ACCEPT = 2;
+
+ private int flags;
+
+ /**
+ * Create a new service permission with the indicated name and actions.
+ *
+ * The name is the name of the kerberos principal for the service.
+ *
+ * The actions are a comma-separated list of strings. The recognized
+ * actions are "initiate" and "accept". The "initiate" action means
+ * that the holder of the permission can access the service. The
+ * "accept" action means that the holder of the permission can operate
+ * as this service.
+ *
+ * @param name the prinicpal's name
+ * @param action the allowed actions
+ */
+ public ServicePermission(String name, String action)
+ {
+ super(name);
+ parseActions(action);
+ }
+
+ public boolean implies(Permission perm)
+ {
+ if (! (perm instanceof ServicePermission))
+ return false;
+ ServicePermission sp = (ServicePermission) perm;
+ if ((flags & sp.flags) != sp.flags)
+ return false;
+ return getName().equals(sp.getName());
+ }
+
+ public boolean equals(Object obj)
+ {
+ if (! (obj instanceof ServicePermission))
+ return false;
+ ServicePermission sp = (ServicePermission) obj;
+ return flags == sp.flags && getName().equals(sp.getName());
+ }
+
+ public int hashCode()
+ {
+ return getName().hashCode() + flags;
+ }
+
+ /**
+ * Return a string representing the actions.
+ */
+ public String getActions()
+ {
+ if (flags == (INITIATE | ACCEPT))
+ return "initiate,accept";
+ if (flags == INITIATE)
+ return "initiate";
+ if (flags == ACCEPT)
+ return "accept";
+ return "";
+ }
+
+ public PermissionCollection newPermissionCollection()
+ {
+ return new PermissionCollection()
+ {
+ private Vector permissions = new Vector();
+
+ public void add(Permission perm)
+ {
+ if (isReadOnly())
+ throw new SecurityException("readonly");
+ if (! (perm instanceof ServicePermission))
+ throw new IllegalArgumentException("can only add DelegationPermissions");
+ permissions.add(perm);
+ }
+
+ public boolean implies(Permission perm)
+ {
+ if (! (perm instanceof ServicePermission))
+ return false;
+ Enumeration e = elements();
+ while (e.hasMoreElements())
+ {
+ ServicePermission sp = (ServicePermission) e.nextElement();
+ if (sp.implies(perm))
+ return true;
+ }
+ return false;
+ }
+
+ public Enumeration elements()
+ {
+ return permissions.elements();
+ }
+ };
+ }
+
+ private void parseActions(String actions)
+ {
+ StringTokenizer tok = new StringTokenizer(actions, ",");
+ while (tok.hasMoreTokens())
+ {
+ String token = tok.nextToken();
+ if ("accept".equals(token))
+ flags |= ACCEPT;
+ else if ("initiate".equals(token))
+ flags |= INITIATE;
+ else
+ throw new IllegalArgumentException("unrecognized token: " + token);
+ }
+ }
+}
diff --git a/javax/security/auth/x500/X500Principal.java b/javax/security/auth/x500/X500Principal.java
index fcbb4950a..d78b0d3ee 100644
--- a/javax/security/auth/x500/X500Principal.java
+++ b/javax/security/auth/x500/X500Principal.java
@@ -395,7 +395,7 @@ public final class X500Principal implements Principal, Serializable
buf.append((char) ch);
}
sep = in.read();
- if (sep != '+' || sep != ',')
+ if (sep != '+' && sep != ',')
throw new IOException("illegal character: " + (char) ch);
return buf.toString();
}
diff --git a/javax/swing/AbstractAction.java b/javax/swing/AbstractAction.java
index 4a2334570..ffd122fe0 100644
--- a/javax/swing/AbstractAction.java
+++ b/javax/swing/AbstractAction.java
@@ -40,9 +40,6 @@ package javax.swing;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
@@ -110,32 +107,6 @@ public abstract class AbstractAction
}
/**
- * readObject
- *
- * @param stream the stream to read from
- *
- * @exception ClassNotFoundException TODO
- * @exception IOException if an error occurs
- */
- private void readObject(ObjectInputStream stream)
- throws ClassNotFoundException, IOException
- {
- // TODO
- }
-
- /**
- * writeObject
- *
- * @param stream the stream to write to
- *
- * @exception IOException if an error occurs
- */
- private void writeObject(ObjectOutputStream stream) throws IOException
- {
- // TODO
- }
-
- /**
* Returns a clone of the action.
*
* @return A clone of the action.
diff --git a/javax/swing/AbstractButton.java b/javax/swing/AbstractButton.java
index 70a374bdd..9b2b526f3 100644
--- a/javax/swing/AbstractButton.java
+++ b/javax/swing/AbstractButton.java
@@ -1,5 +1,5 @@
/* AbstractButton.java -- Provides basic button functionality.
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,12 +37,17 @@ exception statement from your version. */
package javax.swing;
+import gnu.classpath.NotImplementedException;
+
+import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.ItemSelectable;
+import java.awt.LayoutManager;
import java.awt.Point;
import java.awt.Rectangle;
+import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
@@ -51,17 +56,26 @@ import java.awt.image.ImageObserver;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
+import java.util.Enumeration;
+import javax.accessibility.Accessible;
import javax.accessibility.AccessibleAction;
+import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleIcon;
+import javax.accessibility.AccessibleRelation;
import javax.accessibility.AccessibleRelationSet;
+import javax.accessibility.AccessibleState;
import javax.accessibility.AccessibleStateSet;
import javax.accessibility.AccessibleText;
import javax.accessibility.AccessibleValue;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.ButtonUI;
+import javax.swing.plaf.basic.BasicHTML;
import javax.swing.text.AttributeSet;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Position;
+import javax.swing.text.View;
/**
@@ -260,7 +274,7 @@ public abstract class AbstractButton extends JComponent
protected ChangeListener changeListener;
/**
- * The time in miliseconds in which clicks get coalesced into a single
+ * The time in milliseconds in which clicks get coalesced into a single
* <code>ActionEvent</code>.
*/
long multiClickThreshhold;
@@ -275,6 +289,42 @@ public abstract class AbstractButton extends JComponent
protected ChangeEvent changeEvent = new ChangeEvent(this);
/**
+ * Indicates if the borderPainted property has been set by a client
+ * program or by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientBorderPaintedSet = false;
+
+ /**
+ * Indicates if the rolloverEnabled property has been set by a client
+ * program or by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientRolloverEnabledSet = false;
+
+ /**
+ * Indicates if the iconTextGap property has been set by a client
+ * program or by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientIconTextGapSet = false;
+
+ /**
+ * Indicates if the contentAreaFilled property has been set by a client
+ * program or by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientContentAreaFilledSet = false;
+
+ /**
* Fired in a PropertyChangeEvent when the "borderPainted" property changes.
*/
public static final String BORDER_PAINTED_CHANGED_PROPERTY = "borderPainted";
@@ -388,135 +438,405 @@ public abstract class AbstractButton extends JComponent
// Nothing to do here yet.
}
+ /**
+ * Returns the accessible state set of this object. In addition to the
+ * superclass's states, the <code>AccessibleAbstractButton</code>
+ * supports the following states: {@link AccessibleState#ARMED},
+ * {@link AccessibleState#FOCUSED}, {@link AccessibleState#PRESSED} and
+ * {@link AccessibleState#CHECKED}.
+ *
+ * @return the current state of this accessible object
+ */
public AccessibleStateSet getAccessibleStateSet()
{
- return null; // TODO
+ AccessibleStateSet state = super.getAccessibleStateSet();
+
+ if (getModel().isArmed())
+ state.add(AccessibleState.ARMED);
+ if (getModel().isPressed())
+ state.add(AccessibleState.PRESSED);
+ if (isSelected())
+ state.add(AccessibleState.CHECKED);
+
+ return state;
}
+ /**
+ * Returns the accessible name for the button.
+ */
public String getAccessibleName()
{
- return null; // TODO
+ String result = super.getAccessibleName();
+ if (result == null)
+ result = text;
+ return result;
}
+ /**
+ * Returns the accessible icons of this object. If the AbstractButton's
+ * icon is an Accessible, and it's AccessibleContext is an AccessibleIcon,
+ * then this AccessibleIcon is returned, otherwise <code>null</code>.
+ *
+ * @return the accessible icons of this object, or <code>null</code> if
+ * there is no accessible icon
+ */
public AccessibleIcon[] getAccessibleIcon()
{
- return null; // TODO
+ AccessibleIcon[] ret = null;
+ Icon icon = getIcon();
+ if (icon instanceof Accessible)
+ {
+ AccessibleContext ctx = ((Accessible) icon).getAccessibleContext();
+ if (ctx instanceof AccessibleIcon)
+ {
+ ret = new AccessibleIcon[]{ (AccessibleIcon) ctx };
+ }
+ }
+ return ret;
}
+ /**
+ * Returns the accessible relations of this AccessibleAbstractButton.
+ * If the AbstractButton is part of a ButtonGroup, then all the buttons
+ * in this button group are added as targets in a MEMBER_OF relation,
+ * otherwise an empty relation set is returned (from super).
+ *
+ * @return the accessible relations of this AccessibleAbstractButton
+ */
public AccessibleRelationSet getAccessibleRelationSet()
{
- // TODO: What should be modified here?
- return super.getAccessibleRelationSet();
+ AccessibleRelationSet relations = super.getAccessibleRelationSet();
+ ButtonModel model = getModel();
+ if (model instanceof DefaultButtonModel)
+ {
+ ButtonGroup group = ((DefaultButtonModel) model).getGroup();
+ if (group != null)
+ {
+ Object[] target = new Object[group.getButtonCount()];
+ Enumeration els = group.getElements();
+
+ for (int index = 0; els.hasMoreElements(); ++index)
+ {
+ target[index] = els.nextElement();
+ }
+
+ AccessibleRelation rel =
+ new AccessibleRelation(AccessibleRelation.MEMBER_OF);
+ rel.setTarget(target);
+ relations.add(rel);
+ }
+ }
+ return relations;
}
+ /**
+ * Returns the accessible action associated with this object. For buttons,
+ * this will be <code>this</code>.
+ *
+ * @return <code>this</code>
+ */
public AccessibleAction getAccessibleAction()
{
- return null; // TODO
+ return this;
}
+ /**
+ * Returns the accessible value of this AccessibleAbstractButton, which
+ * is always <code>this</code>.
+ *
+ * @return the accessible value of this AccessibleAbstractButton, which
+ * is always <code>this</code>
+ */
public AccessibleValue getAccessibleValue()
{
- return null; // TODO
+ return this;
}
+ /**
+ * Returns the number of accessible actions that are supported by this
+ * object. Buttons support one action by default ('press button'), so this
+ * method always returns <code>1</code>.
+ *
+ * @return <code>1</code>, the number of supported accessible actions
+ */
public int getAccessibleActionCount()
{
- return 0; // TODO
+ return 1;
}
- public String getAccessibleActionDescription(int value0)
+ /**
+ * Returns a description for the action with the specified index or
+ * <code>null</code> if such action does not exist.
+ *
+ * @param actionIndex the zero based index to the actions
+ *
+ * @return a description for the action with the specified index or
+ * <code>null</code> if such action does not exist
+ */
+ public String getAccessibleActionDescription(int actionIndex)
{
- return null; // TODO
+ String descr = null;
+ if (actionIndex == 0)
+ {
+ // FIXME: Supply localized descriptions in the UIDefaults.
+ descr = UIManager.getString("AbstractButton.clickText");
+ }
+ return descr;
}
- public boolean doAccessibleAction(int value0)
+ /**
+ * Performs the acccessible action with the specified index on this object.
+ * Since buttons have only one action by default (which is to press the
+ * button), this method performs a 'press button' when the specified index
+ * is <code>0</code> and nothing otherwise.
+ *
+ * @param actionIndex a zero based index into the actions of this button
+ *
+ * @return <code>true</code> if the specified action has been performed
+ * successfully, <code>false</code> otherwise
+ */
+ public boolean doAccessibleAction(int actionIndex)
{
- return false; // TODO
+ boolean retVal = false;
+ if (actionIndex == 0)
+ {
+ doClick();
+ retVal = true;
+ }
+ return retVal;
}
+ /**
+ * Returns the current value of this object as a number. This
+ * implementation returns an <code>Integer(1)</code> if the button is
+ * selected, <code>Integer(0)</code> if the button is not selected.
+ *
+ * @return the current value of this object as a number
+ */
public Number getCurrentAccessibleValue()
{
- return null; // TODO
+ Integer retVal;
+ if (isSelected())
+ retVal = new Integer(1);
+ else
+ retVal = new Integer(0);
+ return retVal;
}
- public boolean setCurrentAccessibleValue(Number value0)
+ /**
+ * Sets the current accessible value as object. If the specified number
+ * is 0 the button will be deselected, otherwise the button will
+ * be selected.
+ *
+ * @param value 0 for deselected button, other for selected button
+ *
+ * @return <code>true</code> if the value has been set, <code>false</code>
+ * otherwise
+ */
+ public boolean setCurrentAccessibleValue(Number value)
{
- return false; // TODO
+ boolean retVal = false;
+ if (value != null)
+ {
+ if (value.intValue() == 0)
+ setSelected(false);
+ else
+ setSelected(true);
+ retVal = true;
+ }
+ return retVal;
}
+ /**
+ * Returns the minimum accessible value for the AccessibleAbstractButton,
+ * which is <code>0</code>.
+ *
+ * @return the minimimum accessible value for the AccessibleAbstractButton,
+ * which is <code>0</code>
+ */
public Number getMinimumAccessibleValue()
{
- return null; // TODO
+ return new Integer(0);
}
+ /**
+ * Returns the maximum accessible value for the AccessibleAbstractButton,
+ * which is <code>1</code>.
+ *
+ * @return the maximum accessible value for the AccessibleAbstractButton,
+ * which is <code>1</code>
+ */
public Number getMaximumAccessibleValue()
{
- return null; // TODO
+ return new Integer(1);
}
+ /**
+ * Returns the accessible text for this AccessibleAbstractButton. This
+ * will be <code>null</code> if the button has a non-HTML label, otherwise
+ * <code>this</code>.
+ *
+ * @return the accessible text for this AccessibleAbstractButton
+ */
public AccessibleText getAccessibleText()
{
- return null; // TODO
+ AccessibleText accessibleText = null;
+ if (getClientProperty(BasicHTML.propertyKey) != null)
+ accessibleText = this;
+
+ return accessibleText;
}
- public int getIndexAtPoint(Point value0)
+ /**
+ * Returns the index of the label's character at the specified point,
+ * relative to the local bounds of the button. This only works for
+ * HTML labels.
+ *
+ * @param p the point, relative to the buttons local bounds
+ *
+ * @return the index of the label's character at the specified point
+ */
+ public int getIndexAtPoint(Point p)
{
- return 0; // TODO
+ int index = -1;
+ View view = (View) getClientProperty(BasicHTML.propertyKey);
+ if (view != null)
+ {
+ Rectangle shape = new Rectangle(0, 0, getWidth(), getHeight());
+ index = view.viewToModel(p.x, p.y, shape, new Position.Bias[1]);
+ }
+ return index;
}
- public Rectangle getCharacterBounds(int value0)
+ /**
+ * Returns the bounds of the character at the specified index of the
+ * button's label. This will only work for HTML labels.
+ *
+ * @param i the index of the character of the label
+ *
+ * @return the bounds of the character at the specified index of the
+ * button's label
+ */
+ public Rectangle getCharacterBounds(int i)
{
- return null; // TODO
+ Rectangle rect = null;
+ View view = (View) getClientProperty(BasicHTML.propertyKey);
+ if (view != null)
+ {
+ Rectangle shape = new Rectangle(0, 0, getWidth(), getHeight());
+ try
+ {
+ Shape s = view.modelToView(i, shape, Position.Bias.Forward);
+ rect = s.getBounds();
+ }
+ catch (BadLocationException ex)
+ {
+ rect = null;
+ }
+ }
+ return rect;
}
+ /**
+ * Returns the number of characters in the button's label.
+ *
+ * @return the bounds of the character at the specified index of the
+ * button's label
+ */
public int getCharCount()
{
- return 0; // TODO
+ int charCount;
+ View view = (View) getClientProperty(BasicHTML.propertyKey);
+ if (view != null)
+ {
+ charCount = view.getDocument().getLength();
+ }
+ else
+ {
+ charCount = getAccessibleName().length();
+ }
+ return charCount;
}
+ /**
+ * This always returns <code>-1</code> since there is no caret in a button.
+ *
+ * @return <code>-1</code> since there is no caret in a button
+ */
public int getCaretPosition()
{
- return 0; // TODO
+ return -1;
}
public String getAtIndex(int value0, int value1)
+ throws NotImplementedException
{
return null; // TODO
}
public String getAfterIndex(int value0, int value1)
+ throws NotImplementedException
{
return null; // TODO
}
public String getBeforeIndex(int value0, int value1)
+ throws NotImplementedException
{
return null; // TODO
}
- public AttributeSet getCharacterAttribute(int value0)
+ /**
+ * Returns the text attribute for the character at the specified character
+ * index.
+ *
+ * @param i the character index
+ *
+ * @return the character attributes for the specified character or
+ * <code>null</code> if the character has no attributes
+ */
+ public AttributeSet getCharacterAttribute(int i)
{
- return null; // TODO
+ AttributeSet atts = null;
+ View view = (View) getClientProperty(BasicHTML.propertyKey);
+ if (view != null)
+ {
+
+ }
+ return atts;
}
+ /**
+ * This always returns <code>-1</code> since
+ * button labels can't be selected.
+ *
+ * @return <code>-1</code>, button labels can't be selected
+ */
public int getSelectionStart()
{
- return 0; // TODO
+ return -1;
}
+ /**
+ * This always returns <code>-1</code> since
+ * button labels can't be selected.
+ *
+ * @return <code>-1</code>, button labels can't be selected
+ */
public int getSelectionEnd()
{
- return 0; // TODO
+ return -1;
}
+ /**
+ * Returns the selected text. This always returns <code>null</code> since
+ * button labels can't be selected.
+ *
+ * @return <code>null</code>, button labels can't be selected
+ */
public String getSelectedText()
{
- return null; // TODO
- }
-
- private Rectangle getTextRectangle()
- {
- return null; // TODO
+ return null;
}
}
@@ -906,6 +1226,7 @@ public abstract class AbstractButton extends JComponent
*/
public void setRolloverEnabled(boolean r)
{
+ clientRolloverEnabledSet = true;
if (rollOverEnabled != r)
{
rollOverEnabled = r;
@@ -1138,6 +1459,7 @@ public abstract class AbstractButton extends JComponent
*/
public void setBorderPainted(boolean b)
{
+ clientBorderPaintedSet = true;
if (borderPainted == b)
return;
boolean old = borderPainted;
@@ -1283,15 +1605,18 @@ public abstract class AbstractButton extends JComponent
* Set the value of the {@link #iconTextGap} property.
*
* @param i The new value of the property
+ *
+ * @since 1.4
*/
public void setIconTextGap(int i)
{
+ clientIconTextGapSet = true;
if (iconTextGap == i)
return;
int old = iconTextGap;
iconTextGap = i;
- fireStateChanged();
+ firePropertyChange("iconTextGap", new Integer(old), new Integer(i));
revalidate();
repaint();
}
@@ -1300,6 +1625,8 @@ public abstract class AbstractButton extends JComponent
* Get the value of the {@link #iconTextGap} property.
*
* @return The current value of the property
+ *
+ * @since 1.4
*/
public int getIconTextGap()
{
@@ -1917,15 +2244,16 @@ public abstract class AbstractButton extends JComponent
*/
public void setContentAreaFilled(boolean b)
{
+ clientContentAreaFilledSet = true;
if (contentAreaFilled == b)
return;
- boolean old = contentAreaFilled;
- contentAreaFilled = b;
- firePropertyChange(CONTENT_AREA_FILLED_CHANGED_PROPERTY, old, b);
// The JDK sets the opaque property to the value of the contentAreaFilled
// property, so should we do.
setOpaque(b);
+ boolean old = contentAreaFilled;
+ contentAreaFilled = b;
+ firePropertyChange(CONTENT_AREA_FILLED_CHANGED_PROPERTY, old, b);
}
/**
@@ -2044,4 +2372,97 @@ public abstract class AbstractButton extends JComponent
multiClickThreshhold = threshhold;
}
+
+ /**
+ * Adds the specified component to this AbstractButton. This overrides the
+ * default in order to install an {@link OverlayLayout} layout manager
+ * before adding the component. The layout manager is only installed if
+ * no other layout manager has been installed before.
+ *
+ * @param comp the component to be added
+ * @param constraints constraints for the layout manager
+ * @param index the index at which the component is added
+ *
+ * @since 1.5
+ */
+ protected void addImpl(Component comp, Object constraints, int index)
+ {
+ // We use a client property here, so that no extra memory is used in
+ // the common case with no layout manager.
+ if (getClientProperty("AbstractButton.customLayoutSet") == null)
+ setLayout(new OverlayLayout(this));
+ super.addImpl(comp, constraints, index);
+ }
+
+ /**
+ * Sets a layout manager on this AbstractButton. This is overridden in order
+ * to detect if the application sets a custom layout manager. If no custom
+ * layout manager is set, {@link #addImpl(Component, Object, int)} installs
+ * an OverlayLayout before adding a component.
+ *
+ * @param layout the layout manager to install
+ *
+ * @since 1.5
+ */
+ public void setLayout(LayoutManager layout)
+ {
+ // We use a client property here, so that no extra memory is used in
+ // the common case with no layout manager.
+ putClientProperty("AbstractButton.customLayoutSet", Boolean.TRUE);
+ super.setLayout(layout);
+ }
+
+ /**
+ * Helper method for
+ * {@link LookAndFeel#installProperty(JComponent, String, Object)}.
+ *
+ * @param propertyName the name of the property
+ * @param value the value of the property
+ *
+ * @throws IllegalArgumentException if the specified property cannot be set
+ * by this method
+ * @throws ClassCastException if the property value does not match the
+ * property type
+ * @throws NullPointerException if <code>c</code> or
+ * <code>propertyValue</code> is <code>null</code>
+ */
+ void setUIProperty(String propertyName, Object value)
+ {
+ if (propertyName.equals("borderPainted"))
+ {
+ if (! clientBorderPaintedSet)
+ {
+ setBorderPainted(((Boolean) value).booleanValue());
+ clientBorderPaintedSet = false;
+ }
+ }
+ else if (propertyName.equals("rolloverEnabled"))
+ {
+ if (! clientRolloverEnabledSet)
+ {
+ setRolloverEnabled(((Boolean) value).booleanValue());
+ clientRolloverEnabledSet = false;
+ }
+ }
+ else if (propertyName.equals("iconTextGap"))
+ {
+ if (! clientIconTextGapSet)
+ {
+ setIconTextGap(((Integer) value).intValue());
+ clientIconTextGapSet = false;
+ }
+ }
+ else if (propertyName.equals("contentAreaFilled"))
+ {
+ if (! clientContentAreaFilledSet)
+ {
+ setContentAreaFilled(((Boolean) value).booleanValue());
+ clientContentAreaFilledSet = false;
+ }
+ }
+ else
+ {
+ super.setUIProperty(propertyName, value);
+ }
+ }
}
diff --git a/javax/swing/ActionMap.java b/javax/swing/ActionMap.java
index 65e193d2e..0d6706c3b 100644
--- a/javax/swing/ActionMap.java
+++ b/javax/swing/ActionMap.java
@@ -1,5 +1,5 @@
/* ActionMap.java --
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,9 +37,6 @@ exception statement from your version. */
package javax.swing;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
@@ -195,30 +192,4 @@ public class ActionMap
return null;
}
- /**
- * writeObject
- *
- * @param stream the stream to write to
- *
- * @exception IOException If an error occurs
- */
- private void writeObject(ObjectOutputStream stream)
- throws IOException
- {
- // TODO
- }
-
- /**
- * readObject
- *
- * @param stream the stream to read from
- *
- * @exception ClassNotFoundException If the serialized class cannot be found
- * @exception IOException If an error occurs
- */
- private void readObject(ObjectInputStream stream)
- throws ClassNotFoundException, IOException
- {
- // TODO
- }
}
diff --git a/javax/swing/ButtonGroup.java b/javax/swing/ButtonGroup.java
index 94f0109e6..2f8d19831 100644
--- a/javax/swing/ButtonGroup.java
+++ b/javax/swing/ButtonGroup.java
@@ -91,8 +91,12 @@ public class ButtonGroup implements Serializable
{
b.getModel().setGroup(this);
if (b.isSelected())
- sel = b.getModel();
- buttons.addElement(b);
+ {
+ if (sel == null)
+ sel = b.getModel();
+ else
+ b.setSelected(false);
+ } buttons.addElement(b);
}
/**
diff --git a/javax/swing/CompatibilityFocusTraversalPolicy.java b/javax/swing/CompatibilityFocusTraversalPolicy.java
new file mode 100644
index 000000000..40c2010c3
--- /dev/null
+++ b/javax/swing/CompatibilityFocusTraversalPolicy.java
@@ -0,0 +1,164 @@
+/* CompatibilityFocusTraversalPolicy.java -- Provides compatibility to old
+ focus API
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.swing;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.FocusTraversalPolicy;
+import java.util.HashMap;
+
+/**
+ * Provides compatibility to the older focus API in
+ * {@link JComponent#setNextFocusableComponent(Component)}.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+class CompatibilityFocusTraversalPolicy
+ extends FocusTraversalPolicy
+{
+
+ /**
+ * The focus traversal policy that has been installed on the focus cycle
+ * root before, and to which we fall back.
+ */
+ private FocusTraversalPolicy fallback;
+
+ /**
+ * Maps components to their next focused components.
+ */
+ private HashMap forward;
+
+ /**
+ * Maps components to their previous focused components.
+ */
+ private HashMap backward;
+
+ /**
+ * Creates a new CompatibilityFocusTraversalPolicy with the specified
+ * policy as fallback.
+ *
+ * @param p the fallback policy
+ */
+ CompatibilityFocusTraversalPolicy(FocusTraversalPolicy p)
+ {
+ fallback = p;
+ forward = new HashMap();
+ backward = new HashMap();
+ }
+
+ public Component getComponentAfter(Container root, Component current)
+ {
+ Component next = (Component) forward.get(current);
+ if (next == null && fallback != null)
+ next = fallback.getComponentAfter(root, current);
+ return next;
+ }
+
+ public Component getComponentBefore(Container root, Component current)
+ {
+ Component previous = (Component) backward.get(current);
+ if (previous == null && fallback != null)
+ previous = fallback.getComponentAfter(root, current);
+ return previous;
+ }
+
+ public Component getFirstComponent(Container root)
+ {
+ Component first = null;
+ if (fallback != null)
+ first = fallback.getFirstComponent(root);
+ return first;
+ }
+
+ public Component getLastComponent(Container root)
+ {
+ Component last = null;
+ if (fallback != null)
+ last = fallback.getLastComponent(root);
+ return last;
+ }
+
+ public Component getDefaultComponent(Container root)
+ {
+ Component def = null;
+ if (fallback != null)
+ def = fallback.getDefaultComponent(root);
+ return def;
+ }
+
+ /**
+ * Sets a next focused component for a specified component. This is called
+ * by {@link JComponent#setNextFocusableComponent(Component)}.
+ *
+ * @param current the current component
+ * @param next the next focused component
+ */
+ void setNextFocusableComponent(Component current, Component next)
+ {
+ forward.put(current, next);
+ backward.put(next, current);
+ }
+
+ /**
+ * Sets a next focused component for a specified component. This is called
+ * by {@link JComponent#setNextFocusableComponent(Component)}.
+ *
+ * @param current the current component
+ * @param next the next focused component
+ */
+ void addNextFocusableComponent(Component current, Component next)
+ {
+ forward.put(current, next);
+ backward.put(next, current);
+ }
+
+ /**
+ * Removes a focused component mapping. This is called
+ * by {@link JComponent#setNextFocusableComponent(Component)}.
+ *
+ * @param current the current component
+ * @param next the next focused component
+ */
+ void removeNextFocusableComponent(Component current, Component next)
+ {
+ forward.remove(current);
+ backward.remove(next);
+ }
+}
diff --git a/javax/swing/DefaultComboBoxModel.java b/javax/swing/DefaultComboBoxModel.java
index ea261a33b..ab80b61f1 100644
--- a/javax/swing/DefaultComboBoxModel.java
+++ b/javax/swing/DefaultComboBoxModel.java
@@ -1,5 +1,5 @@
/* DefaultComboBoxModel.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -107,22 +107,24 @@ public class DefaultComboBoxModel extends AbstractListModel
public DefaultComboBoxModel(Vector vector)
{
this.list = vector;
- if (vector.size() > 0)
+ if (getSize() > 0)
selectedItem = vector.get(0);
}
/**
* Adds an element to the model's item list and sends a {@link ListDataEvent}
* to all registered listeners. If the new element is the first item added
- * to the list, it is set as the selected item.
+ * to the list, and the selected item is <code>null</code>, the new element
+ * is set as the selected item.
*
* @param object item to add to the model's item list.
*/
public void addElement(Object object)
{
- list.add(object);
- fireIntervalAdded(this, list.size() - 1, list.size() - 1);
- if (list.size() == 1)
+ list.addElement(object);
+ int index = list.size() - 1;
+ fireIntervalAdded(this, index, index);
+ if (list.size() == 1 && selectedItem == null)
setSelectedItem(object);
}
@@ -141,14 +143,14 @@ public class DefaultComboBoxModel extends AbstractListModel
public void removeElementAt(int index)
{
int selected = getIndexOf(selectedItem);
- list.remove(index);
if (selected == index) // choose a new selected item
{
if (selected > 0)
selectedItem = getElementAt(selected - 1);
else
- selectedItem = getElementAt(selected);
+ selectedItem = getElementAt(selected + 1);
}
+ list.removeElementAt(index);
fireIntervalRemoved(this, index, index);
}
diff --git a/javax/swing/DefaultDesktopManager.java b/javax/swing/DefaultDesktopManager.java
index df2ab6cdb..0304461ad 100644
--- a/javax/swing/DefaultDesktopManager.java
+++ b/javax/swing/DefaultDesktopManager.java
@@ -124,8 +124,6 @@ public class DefaultDesktopManager implements DesktopManager, Serializable
public void closeFrame(JInternalFrame frame)
{
Container c = frame.getParent();
- frame.doDefaultCloseAction();
-
if (c != null)
{
if (frame.isIcon())
diff --git a/javax/swing/DefaultListSelectionModel.java b/javax/swing/DefaultListSelectionModel.java
index 7ec4e614c..998aee452 100644
--- a/javax/swing/DefaultListSelectionModel.java
+++ b/javax/swing/DefaultListSelectionModel.java
@@ -162,11 +162,14 @@ public class DefaultListSelectionModel implements Cloneable,
/**
* Sets the value of the {@link #selectionMode} property.
*
- * @param a The new value of the property
+ * @param mode The new value of the property
*/
- public void setSelectionMode(int a)
+ public void setSelectionMode(int mode)
{
- selectionMode = a;
+ if (mode < ListSelectionModel.SINGLE_SELECTION
+ || mode > ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)
+ throw new IllegalArgumentException("Unrecognised mode: " + mode);
+ selectionMode = mode;
}
/**
@@ -286,8 +289,14 @@ public class DefaultListSelectionModel implements Cloneable,
int beg = sel.nextSetBit(0), end = -1;
for(int i=beg; i >= 0; i=sel.nextSetBit(i+1))
end = i;
- if (sel.equals(oldSel) == false)
- fireValueChanged(beg, end, valueIsAdjusting);
+
+ BitSet old = (BitSet) oldSel;
+
+ // The new and previous lead location requires repainting.
+ old.set(oldLeadIndex, !sel.get(oldLeadIndex));
+ old.set(leadSelectionIndex, !sel.get(leadSelectionIndex));
+
+ fireDifference(sel, old);
}
/**
@@ -492,8 +501,7 @@ public class DefaultListSelectionModel implements Cloneable,
leadSelectionIndex = index1;
anchorSelectionIndex = index0;
sel.set(lo, hi+1);
- if (sel.equals(oldSel) == false)
- fireValueChanged(lo, hi, valueIsAdjusting);
+ fireDifference(sel, (BitSet) oldSel);
}
}
@@ -530,8 +538,8 @@ public class DefaultListSelectionModel implements Cloneable,
//TODO: will probably need MouseDragged to test properly and know if this works
setAnchorSelectionIndex(index0);
leadSelectionIndex = index1;
- if (sel.equals(oldSel) == false)
- fireValueChanged(lo, hi, valueIsAdjusting);
+
+ fireDifference(sel, (BitSet) oldSel);
}
/**
@@ -539,20 +547,48 @@ public class DefaultListSelectionModel implements Cloneable,
*/
public void clearSelection()
{
- oldSel = sel.clone();
- int sz = sel.size();
+ // Find the selected interval.
+ int from = sel.nextSetBit(0);
+ if (from < 0)
+ return; // Empty selection - nothing to do.
+ int to = from;
+
+ int i;
+
+ for (i = from; i>=0; i=sel.nextSetBit(i+1))
+ to = i;
+
sel.clear();
- if (sel.equals(oldSel) == false)
- fireValueChanged(0, sz, valueIsAdjusting);
+ fireValueChanged(from, to, valueIsAdjusting);
}
/**
- * Clears the current selection and marks a given interval as
- * "selected". If the current selection mode is
- * <code>SINGLE_SELECTION</code> only the index <code>index2</code> is
- * selected.
- *
- * @param index0 The low end of the new selection
+ * Fire the change event, covering the difference between the two sets.
+ *
+ * @param current the current set
+ * @param x the previous set, the object will be reused.
+ */
+ private void fireDifference(BitSet current, BitSet x)
+ {
+ x.xor(current);
+ int from = x.nextSetBit(0);
+ if (from < 0)
+ return; // No difference.
+ int to = from;
+ int i;
+
+ for (i = from; i >= 0; i = x.nextSetBit(i+1))
+ to = i;
+
+ fireValueChanged(from, to, valueIsAdjusting);
+ }
+
+ /**
+ * Clears the current selection and marks a given interval as "selected". If
+ * the current selection mode is <code>SINGLE_SELECTION</code> only the
+ * index <code>index2</code> is selected.
+ *
+ * @param index0 The low end of the new selection
* @param index1 The high end of the new selection
*/
public void setSelectionInterval(int index0, int index1)
@@ -560,7 +596,7 @@ public class DefaultListSelectionModel implements Cloneable,
if (index0 == -1 || index1 == -1)
return;
- oldSel = sel.clone();
+ BitSet oldSel = (BitSet) sel.clone();
sel.clear();
if (selectionMode == SINGLE_SELECTION)
index0 = index1;
@@ -571,8 +607,8 @@ public class DefaultListSelectionModel implements Cloneable,
// update the anchorSelectionIndex and leadSelectionIndex variables
setAnchorSelectionIndex(index0);
leadSelectionIndex=index1;
- if (sel.equals(oldSel) == false)
- fireValueChanged(lo, hi, valueIsAdjusting);
+
+ fireDifference(sel, oldSel);
}
/**
@@ -744,6 +780,7 @@ public class DefaultListSelectionModel implements Cloneable,
DefaultListSelectionModel model =
(DefaultListSelectionModel) super.clone();
model.sel = (BitSet) sel.clone();
+ model.listenerList = new EventListenerList();
return model;
}
}
diff --git a/javax/swing/ImageIcon.java b/javax/swing/ImageIcon.java
index 0baaf6f60..cedf4be35 100644
--- a/javax/swing/ImageIcon.java
+++ b/javax/swing/ImageIcon.java
@@ -1,5 +1,5 @@
/* ImageIcon.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,6 +39,7 @@ package javax.swing;
import java.awt.Component;
import java.awt.Graphics;
+import java.awt.IllegalComponentStateException;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
@@ -60,7 +61,8 @@ public class ImageIcon
implements Icon, Serializable, Accessible
{
/**
- * Accessibility support for ImageIcon.
+ * Provides the accessibility features for the <code>ImageIcon</code>
+ * class.
*/
protected class AccessibleImageIcon
extends AccessibleContext
@@ -69,7 +71,7 @@ public class ImageIcon
private static final long serialVersionUID = 2113430526551336564L;
/**
- * Creates a new instance of AccessibleImageIcon.
+ * Creates a new instance of <code>AccessibleImageIcon</code>.
*/
protected AccessibleImageIcon()
{
@@ -77,10 +79,9 @@ public class ImageIcon
}
/**
- * Returns the AccessibleRole of ImageIcon, which is
- * {@link AccessibleRole#ICON}.
+ * Returns the accessible role for the <code>ImageIcon</code>.
*
- * @return {@link AccessibleRole#ICON}
+ * @return {@link AccessibleRole#ICON}.
*/
public AccessibleRole getAccessibleRole()
{
@@ -88,45 +89,47 @@ public class ImageIcon
}
/**
- * Returns the accessible state of this ImageIcon.
+ * Returns the accessible state for the <code>ImageIcon</code>. To
+ * match the reference implementation, this method always returns
+ * <code>null</code>.
*
- * @return the accessible state of this ImageIcon
+ * @return <code>null</code>.
*/
public AccessibleStateSet getAccessibleStateSet()
{
- // TODO: which state information from ImageIcon is returned here??
- return new AccessibleStateSet();
+ // refer to Sun's bug report 4269253
+ return null;
}
/**
- * Returns the accessible parent of this object, which is <code>null</code>
- * in this case, because ImageIcons have no parent.
+ * Returns the accessible parent of this object. To match the reference
+ * implementation, this method always returns <code>null</code>.
*
- * @return <code>null</code>, because ImageIcons have no parent
+ * @return <code>null</code>.
*/
public Accessible getAccessibleParent()
{
- // TODO: ImageIcons have no parent, have they ??
+ // refer to Sun's bug report 4269253
return null;
}
/**
- * Returns the index of this object in its accessible parent, which is
- * -1 here, because ImageIcons have no accessible parent.
+ * Returns the index of this object in its accessible parent. To match
+ * the reference implementation, this method always returns <code>-1</code>.
*
- * @return -1 because ImageIcons have no parent
+ * @return <code>-1</code>.
*/
public int getAccessibleIndexInParent()
{
- // TODO: do ImageIcons have parents??
+ // refer to Sun's bug report 4269253
return -1;
}
/**
* Returns the number of accessible children of this component,
- * which is 0, because ImageIcons have no children.
+ * which is 0, because an {@link ImageIcon} has no children.
*
- * @return 0 because ImageIcons have no children
+ * @return <code>0</code>.
*/
public int getAccessibleChildrenCount()
{
@@ -135,11 +138,12 @@ public class ImageIcon
/**
* Returns the accessible child at index <code>i</code>, which is
- * <code>null</code> in this case because ImageIcons have no children.
+ * <code>null</code> in this case because an {@link ImageIcon} has no
+ * children.
*
* @param i the index of the child to be fetched
*
- * @return <code>null</code> because ImageIcons have no children
+ * @return <code>null</code>.
*/
public Accessible getAccessibleChild(int i)
{
@@ -147,21 +151,25 @@ public class ImageIcon
}
/**
- * Returns the locale of this object. This returns the default locale
- * that is set for the current VM.
+ * Returns the locale of this object. To match the reference
+ * implementation, this method always returns <code>null</code>.
*
- * @return the locale of this object
+ * @return <code>null</code>.
*/
- public Locale getLocale()
+ public Locale getLocale()
+ throws IllegalComponentStateException
{
- return Locale.getDefault();
+ // refer to Sun's bug report 4269253
+ return null;
}
/**
- * Returns the accessible Icon description. This returns the
- * actual 'description' property of the ImageIcon.
+ * Returns the accessible icon description. This returns the
+ * <code>description</code> property of the underlying {@link ImageIcon}.
*
- * @return the accessible Icon description
+ * @return The description (possibly <code>null</code>).
+ *
+ * @see #setAccessibleIconDescription(String)
*/
public String getAccessibleIconDescription()
{
@@ -169,10 +177,12 @@ public class ImageIcon
}
/**
- * Sets the accessible Icon description. This sets the
- * actual 'description' property of the ImageIcon.
+ * Sets the accessible icon description. This sets the
+ * <code>description</code> property of the underlying {@link ImageIcon}.
*
- * @param newDescr the description to be set
+ * @param newDescr the description (<code>null</code> permitted).
+ *
+ * @see #getAccessibleIconDescription()
*/
public void setAccessibleIconDescription(String newDescr)
{
@@ -180,10 +190,10 @@ public class ImageIcon
}
/**
- * Returns the icon height. This returns the iconHeight property of
- * the underlying Icon.
+ * Returns the icon height. This returns the <code>iconHeight</code>
+ * property of the underlying {@link ImageIcon}.
*
- * @return the icon height
+ * @return The icon height.
*/
public int getAccessibleIconHeight()
{
@@ -191,10 +201,10 @@ public class ImageIcon
}
/**
- * Returns the icon width. This returns the iconWidth property of
- * the underlying Icon.
+ * Returns the icon width. This returns the <code>iconWidth</code> property
+ * of the underlying {@link ImageIcon}.
*
- * @return the icon width
+ * @return The icon width.
*/
public int getAccessibleIconWidth()
{
@@ -278,12 +288,12 @@ public class ImageIcon
}
/**
- * Creates an ImageIcon from the given URL without any description
- * set.
+ * Creates an ImageIcon from the given URL and sets the description
+ * to the URL String representation.
*/
public ImageIcon(URL url)
{
- this(url, null);
+ this(url, url.toString());
}
/**
@@ -446,9 +456,11 @@ public class ImageIcon
}
/**
- * Returns the AccessibleContext for this ImageIcon.
+ * Returns the object that provides accessibility features for this
+ * <code>ImageIcon</code> instance.
*
- * @return the AccessibleContext for this ImageIcon
+ * @return The accessible context (an instance of
+ * {@link AccessibleImageIcon}).
*/
public AccessibleContext getAccessibleContext()
{
diff --git a/javax/swing/InputMap.java b/javax/swing/InputMap.java
index cc65dfeed..28fccd9b9 100644
--- a/javax/swing/InputMap.java
+++ b/javax/swing/InputMap.java
@@ -190,8 +190,11 @@ public class InputMap
Set set = new HashSet();
if (parent != null)
- set.addAll(Arrays.asList(parent.allKeys()));
-
+ {
+ Object[] parentKeys = parent.allKeys();
+ if (parentKeys != null)
+ set.addAll(Arrays.asList(parentKeys));
+ }
set.addAll(inputMap.keySet());
if (set.size() == 0)
return null;
diff --git a/javax/swing/JButton.java b/javax/swing/JButton.java
index ff0ecfccf..787adb87c 100644
--- a/javax/swing/JButton.java
+++ b/javax/swing/JButton.java
@@ -1,5 +1,5 @@
/* JButton.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -72,49 +72,82 @@ public class JButton extends AbstractButton
}
private static final long serialVersionUID = -1907255238954382202L;
- boolean def;
- boolean is_def;
+ /**
+ * Indicates if this button is capable to become the default button.
+ */
+ private boolean defaultCapable;
+
+ /**
+ * Creates a new button with an empty string for the button text and no
+ * icon.
+ */
public JButton()
{
this(null, null);
}
+ /**
+ * Creates a new button from the specified action.
+ *
+ * @param a the action (<code>null</code> permitted).
+ *
+ * @see AbstractButton#setAction(Action)
+ */
public JButton(Action a)
{
this();
setAction(a);
}
+ /**
+ * Creates a new button with the specified icon (and an empty string for
+ * the button text).
+ *
+ * @param icon the icon (<code>null</code> permitted).
+ */
public JButton(Icon icon)
{
this(null, icon);
}
+ /**
+ * Creates a new button with the specified text and no icon.
+ *
+ * @param text the button text (<code>null</code> permitted, will be
+ * substituted by an empty string).
+ */
public JButton(String text)
{
this(text, null);
}
+ /**
+ * Creates a new button with the specified text and icon.
+ *
+ * @param text the button text (<code>null</code> permitted, will be
+ * substituted by an empty string).
+ * @param icon the icon (<code>null</code> permitted).
+ */
public JButton(String text, Icon icon)
{
super();
init(text, icon);
setModel(new DefaultButtonModel());
- }
-
- public Object[] getSelectedObjects()
- {
- return null;
+ defaultCapable = true;
}
protected void configurePropertiesFromAction(Action a)
- {
- // Factory method which sets the AbstractButton's properties according to
- // values from the Action instance.
+ {
super.configurePropertiesFromAction(a);
}
+ /**
+ * Returns the object that provides accessibility features for this
+ * <code>JButton</code> component.
+ *
+ * @return The accessible context (an instance of {@link AccessibleJButton}).
+ */
public AccessibleContext getAccessibleContext()
{
if (accessibleContext == null)
@@ -122,6 +155,13 @@ public class JButton extends AbstractButton
return accessibleContext;
}
+ /**
+ * Returns the suffix (<code>"ButtonUI"</code> in this case) used to
+ * determine the class name for a UI delegate that can provide the look and
+ * feel for a <code>JButton</code>.
+ *
+ * @return <code>"ButtonUI"</code>.
+ */
public String getUIClassID()
{
// Returns a string that specifies the name of the L&F class that renders
@@ -129,28 +169,65 @@ public class JButton extends AbstractButton
return "ButtonUI";
}
+ /**
+ * Returns <code>true</code> if this button is the default button in
+ * its <code>JRootPane</code>. The default button gets automatically
+ * activated when the user presses <code>ENTER</code> (or whatever
+ * key this is bound to in the current Look and Feel).
+ *
+ * @return <code>true</code> if this button is the default button in
+ * its <code>JRootPane</code>
+ *
+ * @see #isDefaultCapable()
+ * @see #setDefaultCapable(boolean)
+ * @see JRootPane#getDefaultButton()
+ * @see JRootPane#setDefaultButton(JButton)
+ */
public boolean isDefaultButton()
{
- // Returns whether or not this button is the default button on the
- // RootPane.
- return is_def;
+ // The default button is managed by the JRootPane, so the safest way
+ // to determine this property is to ask the root pane of this button,
+ // if it exists.
+ JRootPane rp = SwingUtilities.getRootPane(this);
+ boolean isDefault = false;
+ if (rp != null)
+ isDefault = rp.getDefaultButton() == this;
+ return isDefault;
}
+ /**
+ * Returns <code>true</code> if this button can act as the default button.
+ * This is <code>true</code> by default.
+ *
+ * @return <code>true</code> if this button can act as the default button
+ *
+ * @see #setDefaultCapable(boolean)
+ * @see #isDefaultButton()
+ * @see JRootPane#getDefaultButton()
+ * @see JRootPane#setDefaultButton(JButton)
+ */
public boolean isDefaultCapable()
{
// Returns whether or not this button is capable of being the default
// button on the RootPane.
- return def;
+ return defaultCapable;
}
+ /**
+ * Returns an implementation-dependent string describing the attributes of
+ * this <code>JButton</code>.
+ *
+ * @return A string describing the attributes of this <code>JButton</code>
+ * (never <code>null</code>).
+ */
protected String paramString()
{
String superParam = super.paramString();
// 41 is the maximum number of chars which may be needed.
StringBuffer sb = new StringBuffer(41);
- sb.append(",defaultButton=").append(is_def);
- sb.append(",defaultCapable=").append(def);
+ sb.append(",defaultButton=").append(isDefaultButton());
+ sb.append(",defaultCapable=").append(defaultCapable);
return superParam + sb.toString();
}
@@ -169,11 +246,27 @@ public class JButton extends AbstractButton
super.removeNotify();
}
+ /**
+ * Sets the <code>defaultCapable</code> property which indicates if
+ * this button may become the default button in its <code>JRootPane</code>.
+ *
+ * @param defaultCapable <code>true</code> if this button can become the
+ * default button in its JRootPane, <code>false</code> otherwise
+ *
+ * @see #setDefaultCapable(boolean)
+ * @see #isDefaultButton()
+ * @see JRootPane#getDefaultButton()
+ * @see JRootPane#setDefaultButton(JButton)
+ */
public void setDefaultCapable(boolean defaultCapable)
{
- def = defaultCapable;
+ this.defaultCapable = defaultCapable;
}
+ /**
+ * Sets this button's UI delegate to the default (obtained from the
+ * {@link UIManager}) for the current look and feel.
+ */
public void updateUI()
{
setUI((ButtonUI) UIManager.getUI(this));
diff --git a/javax/swing/JColorChooser.java b/javax/swing/JColorChooser.java
index 8760dfd6a..674f0fd82 100644
--- a/javax/swing/JColorChooser.java
+++ b/javax/swing/JColorChooser.java
@@ -301,10 +301,9 @@ public class JColorChooser extends JComponent implements Accessible
throw new AWTError("No suitable parent found for Component.");
JDialog dialog;
if (parent instanceof Frame)
- dialog = new ModalDialog((Frame) parent, title);
+ dialog = new JDialog((Frame) parent, title, true);
else
- dialog = new ModalDialog((Dialog) parent, title);
- dialog.setModal(modal);
+ dialog = new JDialog((Dialog) parent, title, true);
dialog.getContentPane().setLayout(new BorderLayout());
@@ -642,64 +641,4 @@ public class JColorChooser extends JComponent implements Accessible
}
}
- /**
- * This is a custom JDialog that will notify when it is hidden and the modal
- * property is set.
- */
- static class ModalDialog extends JDialog
- {
- /** The modal property. */
- private boolean modal;
-
- /**
- * Creates a new ModalDialog object with the given parent and title.
- *
- * @param parent The parent of the JDialog.
- * @param title The title of the JDialog.
- */
- public ModalDialog(Frame parent, String title)
- {
- super(parent, title);
- }
-
- /**
- * Creates a new ModalDialog object with the given parent and title.
- *
- * @param parent The parent of the JDialog.
- * @param title The title of the JDialog.
- */
- public ModalDialog(Dialog parent, String title)
- {
- super(parent, title);
- }
-
- /**
- * This method sets the modal property.
- *
- * @param modal The modal property.
- */
- public void setModal(boolean modal)
- {
- this.modal = modal;
- }
-
- /**
- * This method shows the ModalDialog.
- */
- public void show()
- {
- super.show();
- if (modal)
- makeModal(this);
- }
-
- /**
- * This method hides the ModalDialog.
- */
- public synchronized void hide()
- {
- super.hide();
- notifyAll();
- }
- }
}
diff --git a/javax/swing/JComboBox.java b/javax/swing/JComboBox.java
index 2e6bc0e4d..992162163 100644
--- a/javax/swing/JComboBox.java
+++ b/javax/swing/JComboBox.java
@@ -1,5 +1,5 @@
/* JComboBox.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -55,9 +55,11 @@ import javax.accessibility.AccessibleRole;
import javax.accessibility.AccessibleSelection;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
-import javax.swing.event.PopupMenuListener;
import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
import javax.swing.plaf.ComboBoxUI;
+import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.basic.ComboPopup;
/**
* A component that allows a user to select any item in its list and
@@ -926,7 +928,7 @@ public class JComboBox extends JComponent implements ItemSelectable,
*/
public void actionPerformed(ActionEvent e)
{
- setSelectedItem(((ComboBoxEditor) e.getSource()).getItem());
+ setSelectedItem(getEditor().getItem());
setPopupVisible(false);
}
@@ -943,8 +945,19 @@ public class JComboBox extends JComponent implements ItemSelectable,
*/
public boolean selectWithKeyChar(char keyChar)
{
- // FIXME: Need to implement
- return false;
+ if (keySelectionManager == null)
+ {
+ keySelectionManager = createDefaultKeySelectionManager();
+ }
+
+ int index = keySelectionManager.selectionForKey(keyChar, getModel());
+ boolean retVal = false;
+ if (index >= 0)
+ {
+ setSelectedIndex(index);
+ retVal = true;
+ }
+ return retVal;
}
/**
@@ -1089,15 +1102,33 @@ public class JComboBox extends JComponent implements ItemSelectable,
}
/**
- * A string that describes this JComboBox. Normally only used for debugging.
+ * Returns an implementation-dependent string describing the attributes of
+ * this <code>JComboBox</code>.
*
- * @return A string describing this JComboBox
+ * @return A string describing the attributes of this <code>JComboBox</code>
+ * (never <code>null</code>).
*/
protected String paramString()
{
- return "JComboBox";
+ String superParamStr = super.paramString();
+ StringBuffer sb = new StringBuffer();
+ sb.append(",isEditable=").append(isEditable());
+ sb.append(",lightWeightPopupEnabled=").append(isLightWeightPopupEnabled());
+ sb.append(",maximumRowCount=").append(getMaximumRowCount());
+
+ sb.append(",selectedItemReminder=");
+ if (selectedItemReminder != null)
+ sb.append(selectedItemReminder);
+ return superParamStr + sb.toString();
}
+ /**
+ * Returns the object that provides accessibility features for this
+ * <code>JComboBox</code> component.
+ *
+ * @return The accessible context (an instance of
+ * {@link AccessibleJComboBox}).
+ */
public AccessibleContext getAccessibleContext()
{
if (accessibleContext == null)
@@ -1206,84 +1237,238 @@ public class JComboBox extends JComponent implements ItemSelectable,
{
private static final long serialVersionUID = 8217828307256675666L;
- protected AccessibleJComboBox()
+ /**
+ * @specnote This constructor was protected in 1.4, but made public
+ * in 1.5.
+ */
+ public AccessibleJComboBox()
{
// Nothing to do here.
}
+ /**
+ * Returns the number of accessible children of this object. The
+ * implementation of AccessibleJComboBox delegates this call to the UI
+ * of the associated JComboBox.
+ *
+ * @return the number of accessible children of this object
+ *
+ * @see ComponentUI#getAccessibleChildrenCount(JComponent)
+ */
public int getAccessibleChildrenCount()
{
- return 0;
+ ComponentUI ui = getUI();
+ int count;
+ if (ui != null)
+ count = ui.getAccessibleChildrenCount(JComboBox.this);
+ else
+ count = super.getAccessibleChildrenCount();
+ return count;
}
- public Accessible getAccessibleChild(int value0)
+ /**
+ * Returns the number of accessible children of this object. The
+ * implementation of AccessibleJComboBox delegates this call to the UI
+ * of the associated JComboBox.
+ *
+ * @param index the index of the accessible child to fetch
+ *
+ * @return the number of accessible children of this object
+ *
+ * @see ComponentUI#getAccessibleChild(JComponent, int)
+ */
+ public Accessible getAccessibleChild(int index)
{
- return null;
+ ComponentUI ui = getUI();
+ Accessible child = null;
+ if (ui != null)
+ child = ui.getAccessibleChild(JComboBox.this, index);
+ else
+ child = super.getAccessibleChild(index);
+ return child;
}
+ /**
+ * Returns the AccessibleSelection object associated with this object.
+ * AccessibleJComboBoxes handle their selection themselves, so this
+ * always returns <code>this</code>.
+ *
+ * @return the AccessibleSelection object associated with this object
+ */
public AccessibleSelection getAccessibleSelection()
{
- return null;
+ return this;
}
- public Accessible getAccessibleSelection(int value0)
+ /**
+ * Returns the accessible selection from this AccssibleJComboBox.
+ *
+ * @param index the index of the selected child to fetch
+ *
+ * @return the accessible selection from this AccssibleJComboBox
+ */
+ public Accessible getAccessibleSelection(int index)
{
- return null;
+ // Get hold of the actual popup.
+ Accessible popup = getUI().getAccessibleChild(JComboBox.this, 0);
+ Accessible selected = null;
+ if (popup != null && popup instanceof ComboPopup)
+ {
+ ComboPopup cPopup = (ComboPopup) popup;
+ // Query the list for the currently selected child.
+ JList l = cPopup.getList();
+ AccessibleContext listCtx = l.getAccessibleContext();
+ if (listCtx != null)
+ {
+ AccessibleSelection s = listCtx.getAccessibleSelection();
+ if (s != null)
+ {
+ selected = s.getAccessibleSelection(index);
+ }
+ }
+ }
+ return selected;
}
- public boolean isAccessibleChildSelected(int value0)
+ /**
+ * Returns <code>true</code> if the accessible child with the specified
+ * <code>index</code> is selected, <code>false</code> otherwise.
+ *
+ * @param index the index of the accessible child
+ *
+ * @return <code>true</code> if the accessible child with the specified
+ * <code>index</code> is selected, <code>false</code> otherwise
+ */
+ public boolean isAccessibleChildSelected(int index)
{
- return false;
+ return getSelectedIndex() == index;
}
+ /**
+ * Returns the accessible role for the <code>JComboBox</code> component.
+ *
+ * @return {@link AccessibleRole#COMBO_BOX}.
+ */
public AccessibleRole getAccessibleRole()
{
return AccessibleRole.COMBO_BOX;
}
+ /**
+ * Returns the accessible action associated to this accessible object.
+ * AccessibleJComboBox implements its own AccessibleAction, so this
+ * method returns <code>this</code>.
+ *
+ * @return the accessible action associated to this accessible object
+ */
public AccessibleAction getAccessibleAction()
{
- return null;
+ return this;
}
- public String getAccessibleActionDescription(int value0)
+ /**
+ * Returns the description of the specified action. AccessibleJComboBox
+ * implements 1 action (toggle the popup menu) and thus returns
+ * <code>UIManager.getString("ComboBox.togglePopupText")</code>
+ *
+ * @param actionIndex the index of the action for which to return the
+ * description
+ *
+ * @return the description of the specified action
+ */
+ public String getAccessibleActionDescription(int actionIndex)
{
- return null;
+ return UIManager.getString("ComboBox.togglePopupText");
}
+ /**
+ * Returns the number of accessible actions that can be performed by
+ * this object. AccessibleJComboBox implement s one accessible action
+ * (toggle the popup menu), so this method always returns <code>1</code>.
+ *
+ * @return the number of accessible actions that can be performed by
+ * this object
+ */
public int getAccessibleActionCount()
{
- return 0;
+ return 1;
}
- public boolean doAccessibleAction(int value0)
+ /**
+ * Performs the accessible action with the specified index.
+ * AccessibleJComboBox has 1 accessible action
+ * (<code>actionIndex == 0</code>), which is to toggle the
+ * popup menu. All other action indices have no effect and return
+ * <code<>false</code>.
+ *
+ * @param actionIndex the index of the action to perform
+ *
+ * @return <code>true</code> if the action has been performed,
+ * <code>false</code> otherwise
+ */
+ public boolean doAccessibleAction(int actionIndex)
{
- return false;
+ boolean actionPerformed = false;
+ if (actionIndex == 0)
+ {
+ setPopupVisible(! isPopupVisible());
+ actionPerformed = true;
+ }
+ return actionPerformed;
}
+ /**
+ * Returns the number of selected accessible children of this object. This
+ * returns <code>1</code> if the combobox has a selected entry,
+ * <code>0</code> otherwise.
+ *
+ * @return the number of selected accessible children of this object
+ */
public int getAccessibleSelectionCount()
{
- return 0;
+ Object sel = getSelectedItem();
+ int count = 0;
+ if (sel != null)
+ count = 1;
+ return count;
}
- public void addAccessibleSelection(int value0)
+ /**
+ * Sets the current selection to the specified <code>index</code>.
+ *
+ * @param index the index to set as selection
+ */
+ public void addAccessibleSelection(int index)
{
- // TODO: Implement this properly.
+ setSelectedIndex(index);
}
- public void removeAccessibleSelection(int value0)
+ /**
+ * Removes the specified index from the current selection.
+ *
+ * @param index the index to remove from the selection
+ */
+ public void removeAccessibleSelection(int index)
{
- // TODO: Implement this properly.
+ if (getSelectedIndex() == index)
+ clearAccessibleSelection();
}
+ /**
+ * Clears the current selection.
+ */
public void clearAccessibleSelection()
{
- // TODO: Implement this properly.
+ setSelectedIndex(-1);
}
+ /**
+ * Multiple selection is not supported by AccessibleJComboBox, so this
+ * does nothing.
+ */
public void selectAllAccessibleSelection()
{
- // TODO: Implement this properly.
+ // Nothing to do here.
}
}
}
diff --git a/javax/swing/JComponent.java b/javax/swing/JComponent.java
index 7b57efe43..d916d0583 100644
--- a/javax/swing/JComponent.java
+++ b/javax/swing/JComponent.java
@@ -67,10 +67,10 @@ import java.awt.event.MouseEvent;
import java.awt.peer.LightweightPeer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.EventListener;
import java.util.Hashtable;
import java.util.Locale;
@@ -81,6 +81,7 @@ import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleExtendedComponent;
import javax.accessibility.AccessibleKeyBinding;
import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleState;
import javax.accessibility.AccessibleStateSet;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
@@ -104,7 +105,7 @@ public abstract class JComponent extends Container implements Serializable
private static final long serialVersionUID = -7908749299918704233L;
/**
- * Accessibility support is currently missing.
+ * The accessible context of this <code>JComponent</code>.
*/
protected AccessibleContext accessibleContext;
@@ -117,78 +118,186 @@ public abstract class JComponent extends Container implements Serializable
implements AccessibleExtendedComponent
{
/**
- * Accessibility support for <code>JComponent</code>'s focus handler.
+ * Receives notification if the focus on the JComponent changes and
+ * fires appropriate PropertyChangeEvents to listeners registered with
+ * the AccessibleJComponent.
*/
protected class AccessibleFocusHandler
implements FocusListener
{
+ /**
+ * Creates a new AccessibleFocusHandler.
+ */
protected AccessibleFocusHandler()
{
- // TODO: Implement this properly.
+ // Nothing to do here.
}
+
+ /**
+ * Receives notification when the JComponent gained focus and fires
+ * a PropertyChangeEvent to listeners registered on the
+ * AccessibleJComponent with a property name of
+ * {@link AccessibleContext#ACCESSIBLE_STATE_PROPERTY} and a new value
+ * of {@link AccessibleState#FOCUSED}.
+ */
public void focusGained(FocusEvent event)
{
- // TODO: Implement this properly.
+ AccessibleJComponent.this.firePropertyChange
+ (AccessibleContext.ACCESSIBLE_STATE_PROPERTY, null,
+ AccessibleState.FOCUSED);
}
+
+ /**
+ * Receives notification when the JComponent lost focus and fires
+ * a PropertyChangeEvent to listeners registered on the
+ * AccessibleJComponent with a property name of
+ * {@link AccessibleContext#ACCESSIBLE_STATE_PROPERTY} and an old value
+ * of {@link AccessibleState#FOCUSED}.
+ */
public void focusLost(FocusEvent valevent)
{
- // TODO: Implement this properly.
+ AccessibleJComponent.this.firePropertyChange
+ (AccessibleContext.ACCESSIBLE_STATE_PROPERTY,
+ AccessibleState.FOCUSED, null);
}
}
/**
- * Accessibility support for <code>JComponent</code>'s container handler.
+ * Receives notification if there are child components are added or removed
+ * from the JComponent and fires appropriate PropertyChangeEvents to
+ * interested listeners on the AccessibleJComponent.
*/
protected class AccessibleContainerHandler
implements ContainerListener
{
+ /**
+ * Creates a new AccessibleContainerHandler.
+ */
protected AccessibleContainerHandler()
{
- // TODO: Implement this properly.
+ // Nothing to do here.
}
+
+ /**
+ * Receives notification when a child component is added to the
+ * JComponent and fires a PropertyChangeEvent on listeners registered
+ * with the AccessibleJComponent with a property name of
+ * {@link AccessibleContext#ACCESSIBLE_CHILD_PROPERTY}.
+ *
+ * @param event the container event
+ */
public void componentAdded(ContainerEvent event)
{
- // TODO: Implement this properly.
+ Component c = event.getChild();
+ if (c != null && c instanceof Accessible)
+ {
+ AccessibleContext childCtx = c.getAccessibleContext();
+ AccessibleJComponent.this.firePropertyChange
+ (AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, null, childCtx);
+ }
}
- public void componentRemoved(ContainerEvent valevent)
+
+ /**
+ * Receives notification when a child component is removed from the
+ * JComponent and fires a PropertyChangeEvent on listeners registered
+ * with the AccessibleJComponent with a property name of
+ * {@link AccessibleContext#ACCESSIBLE_CHILD_PROPERTY}.
+ *
+ * @param event the container event
+ */
+ public void componentRemoved(ContainerEvent event)
{
- // TODO: Implement this properly.
+ Component c = event.getChild();
+ if (c != null && c instanceof Accessible)
+ {
+ AccessibleContext childCtx = c.getAccessibleContext();
+ AccessibleJComponent.this.firePropertyChange
+ (AccessibleContext.ACCESSIBLE_CHILD_PROPERTY, childCtx, null);
+ }
}
}
private static final long serialVersionUID = -7047089700479897799L;
-
+
+ /**
+ * Receives notification when a child component is added to the
+ * JComponent and fires a PropertyChangeEvent on listeners registered
+ * with the AccessibleJComponent.
+ *
+ * @specnote AccessibleAWTContainer has a protected field with the same
+ * name. Looks like a bug or nasty misdesign to me.
+ */
protected ContainerListener accessibleContainerHandler;
- protected FocusListener accessibleFocusHandler;
/**
- * Manages the property change listeners;
+ * Receives notification if the focus on the JComponent changes and
+ * fires appropriate PropertyChangeEvents to listeners registered with
+ * the AccessibleJComponent.
+ *
+ * @specnote AccessibleAWTComponent has a protected field
+ * accessibleAWTFocusHandler. Looks like a bug or nasty misdesign
+ * to me.
*/
- private PropertyChangeSupport changeSupport;
+ protected FocusListener accessibleFocusHandler;
+ /**
+ * Creates a new AccessibleJComponent.
+ */
protected AccessibleJComponent()
{
- changeSupport = new PropertyChangeSupport(this);
+ // Nothing to do here.
}
/**
* Adds a property change listener to the list of registered listeners.
*
+ * This sets up the {@link #accessibleContainerHandler} and
+ * {@link #accessibleFocusHandler} fields and calls
+ * <code>super.addPropertyChangeListener(listener)</code>.
+ *
* @param listener the listener to add
*/
public void addPropertyChangeListener(PropertyChangeListener listener)
{
- changeSupport.addPropertyChangeListener(listener);
+ // Tests seem to indicate that this method also sets up the other two
+ // handlers.
+ if (accessibleContainerHandler == null)
+ {
+ accessibleContainerHandler = new AccessibleContainerHandler();
+ addContainerListener(accessibleContainerHandler);
+ }
+ if (accessibleFocusHandler == null)
+ {
+ accessibleFocusHandler = new AccessibleFocusHandler();
+ addFocusListener(accessibleFocusHandler);
+ }
+ super.addPropertyChangeListener(listener);
}
/**
- * Removes a propery change listener from the list of registered listeners.
+ * Removes a property change listener from the list of registered listeners.
+ *
+ * This uninstalls the {@link #accessibleContainerHandler} and
+ * {@link #accessibleFocusHandler} fields and calls
+ * <code>super.removePropertyChangeListener(listener)</code>.
*
* @param listener the listener to remove
*/
public void removePropertyChangeListener(PropertyChangeListener listener)
{
- changeSupport.removePropertyChangeListener(listener);
+ // Tests seem to indicate that this method also resets the other two
+ // handlers.
+ if (accessibleContainerHandler != null)
+ {
+ removeContainerListener(accessibleContainerHandler);
+ accessibleContainerHandler = null;
+ }
+ if (accessibleFocusHandler != null)
+ {
+ removeFocusListener(accessibleFocusHandler);
+ accessibleFocusHandler = null;
+ }
+ super.removePropertyChangeListener(listener);
}
/**
@@ -198,14 +307,11 @@ public abstract class JComponent extends Container implements Serializable
*/
public int getAccessibleChildrenCount()
{
- int count = 0;
- Component[] children = getComponents();
- for (int i = 0; i < children.length; ++i)
- {
- if (children[i] instanceof Accessible)
- count++;
- }
- return count;
+ // TODO: The functionality should be performed in the superclass.
+ // Find out why this is overridden. However, it is very well possible
+ // that this is left over from times when there was no such superclass
+ // method.
+ return super.getAccessibleChildrenCount();
}
/**
@@ -217,18 +323,11 @@ public abstract class JComponent extends Container implements Serializable
*/
public Accessible getAccessibleChild(int i)
{
- int index = 0;
- Component[] children = getComponents();
- Accessible found = null;
- for (int j = 0; index != i; j++)
- {
- if (children[j] instanceof Accessible)
- index++;
- if (index == i)
- found = (Accessible) children[index];
- }
- // TODO: Figure out what to do when i is not a valid index.
- return found;
+ // TODO: The functionality should be performed in the superclass.
+ // Find out why this is overridden. However, it is very well possible
+ // that this is left over from times when there was no such superclass
+ // method.
+ return super.getAccessibleChild(i);
}
/**
@@ -238,9 +337,14 @@ public abstract class JComponent extends Container implements Serializable
*/
public AccessibleStateSet getAccessibleStateSet()
{
- // FIXME: Figure out which states should be set here, and which are
- // inherited from the super class.
- return super.getAccessibleStateSet();
+ // Note: While the java.awt.Component has an 'opaque' property, it
+ // seems that it is not added to the accessible state set there, even
+ // if this property is true. However, it is handled for JComponent, so
+ // we add it here.
+ AccessibleStateSet state = super.getAccessibleStateSet();
+ if (isOpaque())
+ state.add(AccessibleState.OPAQUE);
+ return state;
}
/**
@@ -256,9 +360,33 @@ public abstract class JComponent extends Container implements Serializable
*/
public String getAccessibleName()
{
- // TODO: Figure out what exactly to return here. It's possible that this
- // method simply should return null.
- return null;
+ String name = super.getAccessibleName();
+
+ // There are two fallbacks provided by the JComponent in the case the
+ // superclass returns null:
+ // - If the component is inside a titled border, then it inherits the
+ // name from the border title.
+ // - If the component is not inside a titled border but has a label
+ // (via JLabel.setLabelFor()), then it gets the name from the label's
+ // accessible context.
+
+ if (name == null)
+ {
+ name = getTitledBorderText();
+ }
+
+ if (name == null)
+ {
+ Object l = getClientProperty(JLabel.LABEL_PROPERTY);
+ if (l instanceof Accessible)
+ {
+ AccessibleContext labelCtx =
+ ((Accessible) l).getAccessibleContext();
+ name = labelCtx.getAccessibleName();
+ }
+ }
+
+ return name;
}
/**
@@ -269,9 +397,32 @@ public abstract class JComponent extends Container implements Serializable
*/
public String getAccessibleDescription()
{
- // TODO: Figure out what exactly to return here. It's possible that this
- // method simply should return null.
- return null;
+ // There are two fallbacks provided by the JComponent in the case the
+ // superclass returns null:
+ // - If the component has a tooltip, then inherit the description from
+ // the tooltip.
+ // - If the component is not inside a titled border but has a label
+ // (via JLabel.setLabelFor()), then it gets the name from the label's
+ // accessible context.
+ String descr = super.getAccessibleDescription();
+
+ if (descr == null)
+ {
+ descr = getToolTipText();
+ }
+
+ if (descr == null)
+ {
+ Object l = getClientProperty(JLabel.LABEL_PROPERTY);
+ if (l instanceof Accessible)
+ {
+ AccessibleContext labelCtx =
+ ((Accessible) l).getAccessibleContext();
+ descr = labelCtx.getAccessibleName();
+ }
+ }
+
+ return descr;
}
/**
@@ -283,7 +434,6 @@ public abstract class JComponent extends Container implements Serializable
*/
public AccessibleRole getAccessibleRole()
{
- // TODO: Check if this is correct.
return AccessibleRole.SWING_COMPONENT;
}
@@ -349,7 +499,8 @@ public abstract class JComponent extends Container implements Serializable
*/
public AccessibleKeyBinding getAccessibleKeyBinding()
{
- // TODO: Implement this properly.
+ // The reference implementation seems to always return null here,
+ // independent of the key bindings of the JComponent. So do we.
return null;
}
}
@@ -616,6 +767,24 @@ public abstract class JComponent extends Container implements Serializable
boolean isCompletelyDirty = false;
/**
+ * Indicates if the opaque property has been set by a client program or by
+ * the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientOpaqueSet = false;
+
+ /**
+ * Indicates if the autoscrolls property has been set by a client program or
+ * by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientAutoscrollsSet = false;
+
+ /**
* Creates a new <code>JComponent</code> instance.
*/
public JComponent()
@@ -1228,7 +1397,12 @@ public abstract class JComponent extends Container implements Serializable
*/
public Component getNextFocusableComponent()
{
- return null;
+ Container focusRoot = this;
+ if (! this.isFocusCycleRoot())
+ focusRoot = getFocusCycleRootAncestor();
+
+ FocusTraversalPolicy policy = focusRoot.getFocusTraversalPolicy();
+ return policy.getComponentAfter(focusRoot, this);
}
/**
@@ -1422,7 +1596,7 @@ public abstract class JComponent extends Container implements Serializable
*/
public void grabFocus()
{
- // TODO: Implement this properly.
+ requestFocus();
}
/**
@@ -1590,8 +1764,9 @@ public abstract class JComponent extends Container implements Serializable
paintBorder(g2);
paintChildren(g2);
Rectangle clip = g2.getClipBounds();
- if (clip.x == 0 && clip.y == 0 && clip.width == getWidth()
- && clip.height == getHeight())
+ if (clip == null
+ || (clip.x == 0 && clip.y == 0 && clip.width == getWidth()
+ && clip.height == getHeight()))
RepaintManager.currentManager(this).markCompletelyClean(this);
}
}
@@ -1651,41 +1826,219 @@ public abstract class JComponent extends Container implements Serializable
*/
protected void paintChildren(Graphics g)
{
+ if (getComponentCount() > 0)
+ {
+ if (isOptimizedDrawingEnabled())
+ paintChildrenOptimized(g);
+ else
+ paintChildrenWithOverlap(g);
+ }
+ }
+
+ /**
+ * Paints the children of this JComponent in the case when the component
+ * is not marked as optimizedDrawingEnabled, that means the container cannot
+ * guarantee that it's children are tiled. For this case we must
+ * perform a more complex optimization to determine the minimal rectangle
+ * to be painted for each child component.
+ *
+ * @param g the graphics context to use
+ */
+ private void paintChildrenWithOverlap(Graphics g)
+ {
Shape originalClip = g.getClip();
Rectangle inner = SwingUtilities.calculateInnerArea(this, rectCache);
g.clipRect(inner.x, inner.y, inner.width, inner.height);
Component[] children = getComponents();
- // Find the bottommost component that needs to be painted. This is a
- // component that completely covers the current clip and is opaque. In
- // this case we don't need to paint the components below it.
- int startIndex = children.length - 1;
- // No need to check for overlapping components when this component is
- // optimizedDrawingEnabled (== it tiles its children).
- if (! isOptimizedDrawingEnabled())
+ // Find the rectangles that need to be painted for each child component.
+ // We push on this list arrays that have the Rectangles to be painted as
+ // the first elements and the component to be painted as the last one.
+ // Later we go through that list in reverse order and paint the rectangles.
+ ArrayList paintRegions = new ArrayList(children.length);
+ ArrayList paintRectangles = new ArrayList();
+ ArrayList newPaintRects = new ArrayList();
+ paintRectangles.add(g.getClipBounds());
+ ArrayList componentRectangles = new ArrayList();
+
+ // Go through children from top to bottom and find out their paint
+ // rectangles.
+ for (int index = 0; paintRectangles.size() > 0 &&
+ index < children.length; index++)
{
- for (int i = 0; i < children.length; i++)
+ Component comp = children[index];
+ if (! comp.isVisible())
+ continue;
+
+ Rectangle compBounds = comp.getBounds();
+ boolean isOpaque = comp instanceof JComponent
+ && ((JComponent) comp).isOpaque();
+
+ // Add all the current paint rectangles that intersect with the
+ // component to the component's paint rectangle array.
+ for (int i = paintRectangles.size() - 1; i >= 0; i--)
{
- Rectangle childBounds = children[i].getBounds();
- if (children[i].isOpaque() && children[i].isVisible()
- && SwingUtilities.isRectangleContainingRectangle(childBounds,
- g.getClipBounds()))
+ Rectangle r = (Rectangle) paintRectangles.get(i);
+ if (r.intersects(compBounds))
{
- startIndex = i;
- break;
+ Rectangle compRect = r.intersection(compBounds);
+ componentRectangles.add(compRect);
+ // If the component is opaque, split up each paint rect and
+ // add paintRect - compBounds to the newPaintRects array.
+ if (isOpaque)
+ {
+ int x, y, w, h;
+ Rectangle rect = new Rectangle();
+
+ // The north retangle.
+ x = Math.max(compBounds.x, r.x);
+ y = r.y;
+ w = Math.min(compBounds.width, r.width + r.x - x);
+ h = compBounds.y - r.y;
+ rect.setBounds(x, y, w, h);
+ if (! rect.isEmpty())
+ {
+ newPaintRects.add(rect);
+ rect = new Rectangle();
+ }
+
+ // The south rectangle.
+ x = Math.max(compBounds.x, r.x);
+ y = compBounds.y + compBounds.height;
+ w = Math.min(compBounds.width, r.width + r.x - x);
+ h = r.height - (compBounds.y - r.y) - compBounds.height;
+ rect.setBounds(x, y, w, h);
+ if (! rect.isEmpty())
+ {
+ newPaintRects.add(rect);
+ rect = new Rectangle();
+ }
+
+ // The west rectangle.
+ x = r.x;
+ y = r.y;
+ w = compBounds.x - r.x;
+ h = r.height;
+ rect.setBounds(x, y, w, h);
+ if (! rect.isEmpty())
+ {
+ newPaintRects.add(rect);
+ rect = new Rectangle();
+ }
+
+ // The east rectangle.
+ x = compBounds.x + compBounds.width;
+ y = r.y;
+ w = r.width - (compBounds.x - r.x) - compBounds.width;
+ h = r.height;
+ rect.setBounds(x, y, w, h);
+ if (! rect.isEmpty())
+ {
+ newPaintRects.add(rect);
+ }
+ }
+ else
+ {
+ // Not opaque, need to reuse the current paint rectangles
+ // for the next component.
+ newPaintRects.add(r);
+ }
+
}
+ else
+ {
+ newPaintRects.add(r);
+ }
+ }
+
+ // Replace the paintRectangles with the new split up
+ // paintRectangles.
+ paintRectangles.clear();
+ paintRectangles.addAll(newPaintRects);
+ newPaintRects.clear();
+
+ // Store paint rectangles if there are any for the current component.
+ int compRectsSize = componentRectangles.size();
+ if (compRectsSize > 0)
+ {
+ componentRectangles.add(comp);
+ paintRegions.add(componentRectangles);
+ componentRectangles = new ArrayList();
}
}
+
// paintingTile becomes true just before we start painting the component's
// children.
paintingTile = true;
- for (int i = startIndex; i >= 0; --i)
+
+ // We must go through the painting regions backwards, because the
+ // topmost components have been added first, followed by the components
+ // below.
+ int prEndIndex = paintRegions.size() - 1;
+ for (int i = prEndIndex; i >= 0; i--)
{
// paintingTile must be set to false before we begin to start painting
// the last tile.
if (i == 0)
paintingTile = false;
+ ArrayList paintingRects = (ArrayList) paintRegions.get(i);
+ // The last element is always the component.
+ Component c = (Component) paintingRects.get(paintingRects.size() - 1);
+ int endIndex = paintingRects.size() - 2;
+ for (int j = 0; j <= endIndex; j++)
+ {
+ Rectangle cBounds = c.getBounds();
+ Rectangle bounds = (Rectangle) paintingRects.get(j);
+ Rectangle oldClip = g.getClipBounds();
+ if (oldClip == null)
+ oldClip = bounds;
+
+ boolean translated = false;
+ try
+ {
+ g.setClip(bounds);
+ g.translate(cBounds.x, cBounds.y);
+ translated = true;
+ c.paint(g);
+ }
+ finally
+ {
+ if (translated)
+ g.translate(-cBounds.x, -cBounds.y);
+ g.setClip(oldClip);
+ }
+ }
+ }
+ g.setClip(originalClip);
+ }
+
+ /**
+ * Paints the children of this container when it is marked as
+ * optimizedDrawingEnabled. In this case the container can guarantee that
+ * it's children are tiled, which allows for a much more efficient
+ * algorithm to determine the minimum rectangles to be painted for
+ * each child.
+ *
+ * @param g the graphics context to use
+ */
+ private void paintChildrenOptimized(Graphics g)
+ {
+ Shape originalClip = g.getClip();
+ Rectangle inner = SwingUtilities.calculateInnerArea(this, rectCache);
+ g.clipRect(inner.x, inner.y, inner.width, inner.height);
+ Component[] children = getComponents();
+
+ // paintingTile becomes true just before we start painting the component's
+ // children.
+ paintingTile = true;
+ for (int i = children.length - 1; i >= 0; i--) //children.length; i++)
+ {
+ // paintingTile must be set to false before we begin to start painting
+ // the last tile.
+ if (i == children.length - 1)
+ paintingTile = false;
+
if (!children[i].isVisible())
continue;
@@ -1807,6 +2160,33 @@ public abstract class JComponent extends Container implements Serializable
}
/**
+ * Gets the root of the component given. If a parent of the
+ * component is an instance of Applet, then the applet is
+ * returned. The applet is considered the root for painting
+ * and adding/removing components. Otherwise, the root Window
+ * is returned if it exists.
+ *
+ * @param comp - The component to get the root for.
+ * @return the parent root. An applet if it is a parent,
+ * or the root window. If neither exist, null is returned.
+ */
+ private Component getRoot(Component comp)
+ {
+ Applet app = null;
+
+ while (comp != null)
+ {
+ if (app == null && comp instanceof Window)
+ return comp;
+ else if (comp instanceof Applet)
+ app = (Applet) comp;
+ comp = comp.getParent();
+ }
+
+ return app;
+ }
+
+ /**
* Performs double buffered repainting.
*/
private void paintDoubleBuffered(Rectangle r)
@@ -1814,7 +2194,7 @@ public abstract class JComponent extends Container implements Serializable
RepaintManager rm = RepaintManager.currentManager(this);
// Paint on the offscreen buffer.
- Component root = SwingUtilities.getRoot(this);
+ Component root = getRoot(this);
Image buffer = rm.getOffscreenBuffer(this, root.getWidth(),
root.getHeight());
//Rectangle targetClip = SwingUtilities.convertRectangle(this, r, root);
@@ -2212,7 +2592,20 @@ public abstract class JComponent extends Container implements Serializable
*/
public void unregisterKeyboardAction(KeyStroke aKeyStroke)
{
- // FIXME: Must be implemented.
+ ActionMap am = getActionMap();
+ // This loops through the conditions WHEN_FOCUSED,
+ // WHEN_ANCESTOR_OF_FOCUSED_COMPONENT and WHEN_IN_FOCUSED_WINDOW.
+ for (int cond = 0; cond < 3; cond++)
+ {
+ InputMap im = getInputMap(cond);
+ if (im != null)
+ {
+ Object action = im.get(aKeyStroke);
+ if (action != null && am != null)
+ am.remove(action);
+ im.remove(aKeyStroke);
+ }
+ }
}
@@ -2351,6 +2744,7 @@ public abstract class JComponent extends Container implements Serializable
public void setAutoscrolls(boolean a)
{
autoscrolls = a;
+ clientAutoscrollsSet = true;
}
/**
@@ -2489,7 +2883,29 @@ public abstract class JComponent extends Container implements Serializable
*/
public void setNextFocusableComponent(Component aComponent)
{
- // TODO: Implement this properly.
+ Container focusRoot = this;
+ if (! this.isFocusCycleRoot())
+ focusRoot = getFocusCycleRootAncestor();
+
+ FocusTraversalPolicy policy = focusRoot.getFocusTraversalPolicy();
+ if (policy instanceof CompatibilityFocusTraversalPolicy)
+ {
+ policy = new CompatibilityFocusTraversalPolicy(policy);
+ focusRoot.setFocusTraversalPolicy(policy);
+ }
+ CompatibilityFocusTraversalPolicy p =
+ (CompatibilityFocusTraversalPolicy) policy;
+
+ Component old = getNextFocusableComponent();
+ if (old != null)
+ {
+ p.removeNextFocusableComponent(this, old);
+ }
+
+ if (aComponent != null)
+ {
+ p.addNextFocusableComponent(this, aComponent);
+ }
}
/**
@@ -2534,9 +2950,12 @@ public abstract class JComponent extends Container implements Serializable
}
/**
- * Set the value of the {@link #opaque} property.
+ * Set if the component should paint all pixels withing its bounds.
+ * If this property is set to false, the component expects the cleared
+ * background.
*
- * @param isOpaque The new value of the property
+ * @param isOpaque if true, paint all pixels. If false, expect the clean
+ * background.
*
* @see ComponentUI#update
*/
@@ -2544,6 +2963,7 @@ public abstract class JComponent extends Container implements Serializable
{
boolean oldOpaque = opaque;
opaque = isOpaque;
+ clientOpaqueSet = true;
firePropertyChange("opaque", oldOpaque, opaque);
}
@@ -3219,4 +3639,44 @@ public abstract class JComponent extends Container implements Serializable
km.registerEntireMap((ComponentInputMap)
getInputMap(WHEN_IN_FOCUSED_WINDOW));
}
+
+ /**
+ * Helper method for
+ * {@link LookAndFeel#installProperty(JComponent, String, Object)}.
+ *
+ * @param propertyName the name of the property
+ * @param value the value of the property
+ *
+ * @throws IllegalArgumentException if the specified property cannot be set
+ * by this method
+ * @throws ClassCastException if the property value does not match the
+ * property type
+ * @throws NullPointerException if <code>c</code> or
+ * <code>propertyValue</code> is <code>null</code>
+ */
+ void setUIProperty(String propertyName, Object value)
+ {
+ if (propertyName.equals("opaque"))
+ {
+ if (! clientOpaqueSet)
+ {
+ setOpaque(((Boolean) value).booleanValue());
+ clientOpaqueSet = false;
+ }
+ }
+ else if (propertyName.equals("autoscrolls"))
+ {
+ if (! clientAutoscrollsSet)
+ {
+ setAutoscrolls(((Boolean) value).booleanValue());
+ clientAutoscrollsSet = false;
+ }
+ }
+ else
+ {
+ throw new IllegalArgumentException
+ ("Unsupported property for LookAndFeel.installProperty(): "
+ + propertyName);
+ }
+ }
}
diff --git a/javax/swing/JDesktopPane.java b/javax/swing/JDesktopPane.java
index 9c4e9a1fc..454870ea6 100644
--- a/javax/swing/JDesktopPane.java
+++ b/javax/swing/JDesktopPane.java
@@ -56,7 +56,6 @@ import javax.swing.plaf.DesktopPaneUI;
*/
public class JDesktopPane extends JLayeredPane implements Accessible
{
- /** DOCUMENT ME! */
private static final long serialVersionUID = 766333777224038726L;
/**
@@ -85,15 +84,24 @@ public class JDesktopPane extends JLayeredPane implements Accessible
private transient int dragMode = LIVE_DRAG_MODE;
/**
- * AccessibleJDesktopPane
+ * Indicates if the dragMode property has been set by a client
+ * program or by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientDragModeSet = false;
+
+ /**
+ * Provides the accessibility features for the <code>JDesktopPane</code>
+ * component.
*/
protected class AccessibleJDesktopPane extends AccessibleJComponent
{
- /** DOCUMENT ME! */
private static final long serialVersionUID = 6079388927946077570L;
/**
- * Constructor AccessibleJDesktopPane
+ * Creates a new <code>AccessibleJDesktopPane</code> instance.
*/
protected AccessibleJDesktopPane()
{
@@ -101,9 +109,9 @@ public class JDesktopPane extends JLayeredPane implements Accessible
}
/**
- * getAccessibleRole
+ * Returns the accessible role for the <code>JSlider</code> component.
*
- * @return AccessibleRole
+ * @return {@link AccessibleRole#DESKTOP_PANE}.
*/
public AccessibleRole getAccessibleRole()
{
@@ -153,6 +161,8 @@ public class JDesktopPane extends JLayeredPane implements Accessible
if ((mode != LIVE_DRAG_MODE) && (mode != OUTLINE_DRAG_MODE))
throw new IllegalArgumentException("Drag mode not valid.");
+ clientDragModeSet = true;
+
// FIXME: Unsupported mode.
if (mode == OUTLINE_DRAG_MODE)
// throw new IllegalArgumentException("Outline drag modes are
@@ -287,13 +297,22 @@ public class JDesktopPane extends JLayeredPane implements Accessible
}
/**
- * This method returns a String that describes the JDesktopPane.
+ * Returns an implementation-dependent string describing the attributes of
+ * this <code>JDesktopPane</code>.
*
- * @return A String that describes the JDesktopPane.
+ * @return A string describing the attributes of this <code>JDesktopPane</code>
+ * (never <code>null</code>).
*/
protected String paramString()
{
- return "JDesktopPane";
+ String superParamStr = super.paramString();
+ StringBuffer sb = new StringBuffer();
+ sb.append(",isOptimizedDrawingPossible=");
+ sb.append(isOptimizedDrawingEnabled());
+ sb.append(",desktopManager=");
+ if (desktopManager != null)
+ sb.append(desktopManager);
+ return superParamStr + sb.toString();
}
/**
@@ -319,9 +338,11 @@ public class JDesktopPane extends JLayeredPane implements Accessible
}
/**
- * getAccessibleContext
+ * Returns the object that provides accessibility features for this
+ * <code>JDesktopPane</code> component.
*
- * @return AccessibleContext
+ * @return The accessible context (an instance of
+ * {@link AccessibleJDesktopPane}).
*/
public AccessibleContext getAccessibleContext()
{
@@ -330,4 +351,34 @@ public class JDesktopPane extends JLayeredPane implements Accessible
return accessibleContext;
}
+
+ /**
+ * Helper method for
+ * {@link LookAndFeel#installProperty(JComponent, String, Object)}.
+ *
+ * @param propertyName the name of the property
+ * @param value the value of the property
+ *
+ * @throws IllegalArgumentException if the specified property cannot be set
+ * by this method
+ * @throws ClassCastException if the property value does not match the
+ * property type
+ * @throws NullPointerException if <code>c</code> or
+ * <code>propertyValue</code> is <code>null</code>
+ */
+ void setUIProperty(String propertyName, Object value)
+ {
+ if (propertyName.equals("dragMode"))
+ {
+ if (! clientDragModeSet)
+ {
+ setDragMode(((Integer) value).intValue());
+ clientDragModeSet = false;
+ }
+ }
+ else
+ {
+ super.setUIProperty(propertyName, value);
+ }
+ }
}
diff --git a/javax/swing/JFileChooser.java b/javax/swing/JFileChooser.java
index 4d79f0444..7da3a132d 100644
--- a/javax/swing/JFileChooser.java
+++ b/javax/swing/JFileChooser.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package javax.swing;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Frame;
import java.awt.HeadlessException;
@@ -49,7 +51,6 @@ import java.util.ArrayList;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
-import javax.swing.JDialog;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;
import javax.swing.filechooser.FileView;
@@ -491,6 +492,7 @@ public class JFileChooser extends JComponent implements Accessible
* @param b DOCUMENT ME!
*/
public void setDragEnabled(boolean b)
+ throws NotImplementedException
{
// FIXME: Implement
}
@@ -501,6 +503,7 @@ public class JFileChooser extends JComponent implements Accessible
* @return DOCUMENT ME!
*/
public boolean getDragEnabled()
+ throws NotImplementedException
{
// FIXME: Implement
return false;
@@ -1527,7 +1530,9 @@ public class JFileChooser extends JComponent implements Accessible
*/
public AccessibleContext getAccessibleContext()
{
- return new AccessibleJFileChooser();
+ if (accessibleContext == null)
+ accessibleContext = new AccessibleJFileChooser();
+ return accessibleContext;
}
/**
diff --git a/javax/swing/JInternalFrame.java b/javax/swing/JInternalFrame.java
index 92bd8ec4a..79dcc7326 100644
--- a/javax/swing/JInternalFrame.java
+++ b/javax/swing/JInternalFrame.java
@@ -1,5 +1,5 @@
/* JInternalFrame.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -44,6 +44,7 @@ import java.awt.Graphics;
import java.awt.KeyboardFocusManager;
import java.awt.LayoutManager;
import java.awt.Rectangle;
+import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import javax.accessibility.Accessible;
@@ -67,11 +68,12 @@ public class JInternalFrame extends JComponent implements Accessible,
WindowConstants,
RootPaneContainer
{
- /** DOCUMENT ME! */
+
private static final long serialVersionUID = -5425177187760785402L;
/**
- * DOCUMENT ME!
+ * Provides the accessibility features for the <code>JInternalFrame</code>
+ * component.
*/
protected class AccessibleJInternalFrame extends AccessibleJComponent
implements AccessibleValue
@@ -79,7 +81,7 @@ public class JInternalFrame extends JComponent implements Accessible,
private static final long serialVersionUID = 5931936924175476797L;
/**
- * Creates a new AccessibleJInternalFrame object.
+ * Creates a new <code>AccessibleJInternalFrame</code> instance.
*/
protected AccessibleJInternalFrame()
{
@@ -87,75 +89,83 @@ public class JInternalFrame extends JComponent implements Accessible,
}
/**
- * DOCUMENT ME!
+ * Returns the frame title.
*
- * @return DOCUMENT ME!
+ * @return The frame title.
*/
public String getAccessibleName()
{
- return null;
+ return getTitle();
}
/**
- * DOCUMENT ME!
+ * Returns the accessible role for the <code>JInternalFrame</code>
+ * component.
*
- * @return DOCUMENT ME!
+ * @return {@link AccessibleRole#INTERNAL_FRAME}.
*/
public AccessibleRole getAccessibleRole()
{
- return null;
+ return AccessibleRole.INTERNAL_FRAME;
}
/**
- * DOCUMENT ME!
+ * Returns an object that provides access to the current, minimum and
+ * maximum values for the {@link JInternalFrame}. Since this class
+ * implements {@link AccessibleValue}, it returns itself.
*
- * @return DOCUMENT ME!
+ * @return The accessible value.
*/
public AccessibleValue getAccessibleValue()
{
- return null;
+ return this;
}
/**
- * DOCUMENT ME!
+ * Returns the current layer for the {@link JInternalFrame} component,
+ * as an {@link Integer}.
*
- * @return DOCUMENT ME!
+ * @return The layer for the {@link JInternalFrame} component.
*/
public Number getCurrentAccessibleValue()
{
- return null;
+ return new Integer(getLayer());
}
/**
- * DOCUMENT ME!
+ * Returns the maximum permitted accessible value.
*
- * @return DOCUMENT ME!
+ * @return <code>Integer(Integer.MAX_VALUE)</code>.
*/
public Number getMaximumAccessibleValue()
{
- return null;
+ return new Integer(Integer.MAX_VALUE);
}
/**
- * DOCUMENT ME!
+ * Returns the minimum permitted accessible value.
*
- * @return DOCUMENT ME!
+ * @return <code>Integer(Integer.MIN_VALUE)</code>.
*/
public Number getMinimumAccessibleValue()
{
- return null;
+ return new Integer(Integer.MIN_VALUE);
}
/**
- * DOCUMENT ME!
+ * Sets the layer for the internal frame.
*
- * @param n DOCUMENT ME!
+ * @param n the layer (see the constants defined in {@link JLayeredPane}).
*
- * @return DOCUMENT ME!
+ * @return <code>true</code> if the value is set, and <code>false</code>
+ * if it was not set.
*/
public boolean setCurrentAccessibleValue(Number n)
{
- return false;
+ if (n == null)
+ return false;
+ setLayer(n.intValue());
+ return true;
}
}
@@ -165,7 +175,8 @@ public class JInternalFrame extends JComponent implements Accessible,
public static class JDesktopIcon extends JComponent implements Accessible
{
/**
- * DOCUMENT ME!
+ * Provides the accessibility features for the <code>JDesktopIcon</code>
+ * component.
*/
protected class AccessibleJDesktopIcon extends AccessibleJComponent
implements AccessibleValue
@@ -173,73 +184,83 @@ public class JInternalFrame extends JComponent implements Accessible,
private static final long serialVersionUID = 5035560458941637802L;
/**
- * Creates a new AccessibleJDesktopIcon object.
+ * Creates a new <code>AccessibleJDesktopIcon</code> instance.
*/
protected AccessibleJDesktopIcon()
{
- super();
+ super();
}
/**
- * DOCUMENT ME!
+ * Returns the accessible role for the <code>JDesktopIcon</code>
+ * component.
*
- * @return DOCUMENT ME!
+ * @return {@link AccessibleRole#DESKTOP_ICON}.
*/
public AccessibleRole getAccessibleRole()
{
- return null;
+ return AccessibleRole.DESKTOP_ICON;
}
/**
- * DOCUMENT ME!
+ * Returns an object that provides access to the current, minimum and
+ * maximum values for the {@link JDesktopIcon}. Since this class
+ * implements {@link AccessibleValue}, it returns itself.
*
- * @return DOCUMENT ME!
+ * @return The accessible value.
*/
public AccessibleValue getAccessibleValue()
{
- return null;
+ return this;
}
/**
- * DOCUMENT ME!
+ * Returns the current layer for the {@link JInternalFrame} component
+ * represented by this <code>JDesktopIcon</code>, as an {@link Integer}.
*
- * @return DOCUMENT ME!
+ * @return The layer.
*/
public Number getCurrentAccessibleValue()
{
- return null;
+ return new Integer(frame.getLayer());
}
/**
- * DOCUMENT ME!
+ * Returns the maximum permitted accessible value.
*
- * @return DOCUMENT ME!
+ * @return <code>Integer(Integer.MAX_VALUE)</code>.
*/
public Number getMaximumAccessibleValue()
{
- return null;
+ return new Integer(Integer.MAX_VALUE);
}
/**
- * DOCUMENT ME!
+ * Returns the minimum permitted accessible value.
*
- * @return DOCUMENT ME!
+ * @return <code>Integer(Integer.MIN_VALUE)</code>.
*/
public Number getMinimumAccessibleValue()
{
- return null;
+ return new Integer(Integer.MIN_VALUE);
}
/**
- * DOCUMENT ME!
+ * Sets the layer for the internal frame represented by this
+ * <code>JDesktopIcon</code> component.
*
- * @param n DOCUMENT ME!
+ * @param n the layer (see the constants defined in
+ * {@link JLayeredPane}).
*
- * @return DOCUMENT ME!
+ * @return <code>true</code> if the value is set, and <code>false</code>
+ * if it was not set.
*/
public boolean setCurrentAccessibleValue(Number n)
{
- return false;
+ if (n == null)
+ return false;
+ frame.setLayer(n.intValue());
+ return true;
}
}
@@ -259,15 +280,17 @@ public class JInternalFrame extends JComponent implements Accessible,
updateUI();
}
- /**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
- */
+ /**
+ * Returns the object that provides accessibility features for this
+ * <code>JDesktopIcon</code> component.
+ *
+ * @return The accessible context (an instance of
+ * {@link AccessibleJDesktopIcon}).
+ */
public AccessibleContext getAccessibleContext()
{
if (accessibleContext == null)
- accessibleContext = new AccessibleJDesktopIcon();
+ accessibleContext = new AccessibleJDesktopIcon();
return accessibleContext;
}
@@ -477,12 +500,13 @@ public class JInternalFrame extends JComponent implements Accessible,
private transient boolean wasIcon = false;
/**
- * Creates a new JInternalFrame object that has no title, and is
- * non-resizable, non-maximizable, non-iconifiable, and non-closable.
+ * Creates a new JInternalFrame object that has an empty string for its
+ * title, and is non-resizable, non-maximizable, non-iconifiable, and
+ * non-closable.
*/
public JInternalFrame()
{
- this(null, false, false, false, false);
+ this("", false, false, false, false);
}
/**
@@ -727,9 +751,11 @@ public class JInternalFrame extends JComponent implements Accessible,
}
/**
- * DOCUMENT ME!
+ * Returns the object that provides accessibility features for this
+ * <code>JInternalFrame</code> component.
*
- * @return DOCUMENT ME!
+ * @return The accessible context (an instance of
+ * {@link AccessibleJInternalFrame}).
*/
public AccessibleContext getAccessibleContext()
{
@@ -749,10 +775,16 @@ public class JInternalFrame extends JComponent implements Accessible,
}
/**
- * This method returns the default action taken when this JInternalFrame is
- * closed.
+ * Returns a code for the default action taken when this
+ * <code>JInternalFrame</code> is closed.
*
- * @return The default action taken when this JInternalFrame is closed.
+ * @return The action code (usually one of
+ * {@link WindowConstants#DO_NOTHING_ON_CLOSE},
+ * {@link WindowConstants#HIDE_ON_CLOSE}, or
+ * {@link WindowConstants#DISPOSE_ON_CLOSE}).
+ *
+ * @see #setDefaultCloseOperation(int)
+ * @see #doDefaultCloseAction()
*/
public int getDefaultCloseOperation()
{
@@ -760,11 +792,10 @@ public class JInternalFrame extends JComponent implements Accessible,
}
/**
- * This method returns the JDesktopIcon that represents this JInternalFrame
- * while it is iconified.
+ * Returns the <code>JDesktopIcon</code> that represents this
+ * <code>JInternalFrame</code> while it is iconified.
*
- * @return The JDesktopIcon that represents this JInternalFrame while it is
- * iconified.
+ * @return The desktop icon component.
*/
public JDesktopIcon getDesktopIcon()
{
@@ -879,7 +910,12 @@ public class JInternalFrame extends JComponent implements Accessible,
// instead of the static method (this would lead to infinite
// recursion).
return pane.getLayer((Component) this);
- return -1;
+
+ Integer layer = (Integer) getClientProperty(JLayeredPane.LAYER_PROPERTY);
+ if (layer != null)
+ return layer.intValue();
+
+ return JLayeredPane.DEFAULT_LAYER.intValue();
}
/**
@@ -951,9 +987,11 @@ public class JInternalFrame extends JComponent implements Accessible,
}
/**
- * This method sets the title of the JInternalFrame.
+ * Returns the frame's title.
*
- * @return The String displayed in the TitlePane of this JInternalFrame.
+ * @return The frame's title (can be <code>null</code>).
+ *
+ * @see #setTitle(String)
*/
public String getTitle()
{
@@ -1172,13 +1210,15 @@ public class JInternalFrame extends JComponent implements Accessible,
}
/**
- * This method returns a String describing this JInternalFrame.
+ * An implementation dependent string describing the current state of this
+ * <code>JInternalFrame</code> instance.
*
- * @return A String describing this JInternalFrame.
+ * @return A string describing the current state of this
+ * <code>JInternalFrame</code> instance.
*/
protected String paramString()
{
- return super.paramString();
+ return super.paramString() + ",title=" + getTitle();
}
/**
@@ -1292,12 +1332,17 @@ public class JInternalFrame extends JComponent implements Accessible,
}
/**
- * This method sets the action taken when this JInternalFrame is closed.
- *
- * @param operation One of DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE or
- * DISPOSE_ON_CLOSE.
+ * Sets a code for the action to be taken when this
+ * <code>JInternalFrame</code> is closed. Note that no validation is
+ * performed on the <code>operation</code> code, any integer will be
+ * accepted (nevertheless, you should pass in one of the listed values).
*
- * @throws Error If the given operation is not one of the allowed modes.
+ * @param operation one of {@link WindowConstants#DO_NOTHING_ON_CLOSE},
+ * {@link WindowConstants#HIDE_ON_CLOSE} or
+ * {@link WindowConstants#DISPOSE_ON_CLOSE}.
+ *
+ * @see #getDefaultCloseOperation()
+ * @see #doDefaultCloseAction()
*/
public void setDefaultCloseOperation(int operation)
{
@@ -1309,16 +1354,24 @@ public class JInternalFrame extends JComponent implements Accessible,
}
/**
- * This method sets the JDesktopIcon that represents this JInternalFrame
- * while it is iconified.
+ * Sets the <code>JDesktopIcon</code> instance that represents this
+ * <code>JInternalFrame</code> while it is iconified and, if the new icon is
+ * not the same instance as the existing icon, sends a
+ * {@link PropertyChangeEvent} (with the property name
+ * <code>"desktopIcon"</code>) to all registered listeners..
*
- * @param d The JDesktopIcon that represents this JInternalFrame while it is
- * iconified.
+ * @param d the icon.
+ *
+ * @see #getDesktopIcon()
*/
public void setDesktopIcon(JDesktopIcon d)
{
- d.setInternalFrame(this);
- desktopIcon = d;
+ if (desktopIcon != d)
+ {
+ JDesktopIcon oldIcon = desktopIcon;
+ desktopIcon = d;
+ firePropertyChange("desktopIcon", oldIcon, d);
+ }
}
/**
@@ -1624,10 +1677,13 @@ public class JInternalFrame extends JComponent implements Accessible,
}
/**
- * This method sets the title displayed in the TitlePane of this
- * JInternalFrame.
+ * Sets the title for the <code>JInternalFrame</code> and sends a
+ * {@link PropertyChangeEvent} (with the property name
+ * {@link #TITLE_PROPERTY}) to all registered listeners.
*
- * @param title The title displayed.
+ * @param title the new title (<code>null</code> permitted).
+ *
+ * @see #getTitle()
*/
public void setTitle(String title)
{
@@ -1635,9 +1691,9 @@ public class JInternalFrame extends JComponent implements Accessible,
return;
if (title == null || this.title == null || ! this.title.equals(title))
{
- String old = title;
- this.title = title;
- firePropertyChange(TITLE_PROPERTY, old, this.title);
+ String old = this.title;
+ this.title = title;
+ firePropertyChange(TITLE_PROPERTY, old, this.title);
}
}
diff --git a/javax/swing/JLabel.java b/javax/swing/JLabel.java
index a9adc96b2..a993fb8f3 100644
--- a/javax/swing/JLabel.java
+++ b/javax/swing/JLabel.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Font;
import java.awt.Image;
@@ -67,15 +69,15 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
implements AccessibleText, AccessibleExtendedComponent
{
/**
- * Returns the selected text. This is an empty string since JLabels
+ * Returns the selected text. This is null since JLabels
* are not selectable.
*
- * @return the selected text
+ * @return <code>null</code> because JLabels cannot have selected text
*/
public String getSelectedText()
{
- // We return "" here since JLabel's text is not selectable.
- return "";
+ // We return null here since JLabel's text is not selectable.
+ return null;
}
/**
@@ -85,8 +87,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
*/
public int getSelectionStart()
{
- // TODO: Figure out what should be returned here, because JLabels don't
- // allow selection. I guess -1 for now.
+ // JLabel don't have selected text, so we return -1 here.
return -1;
}
@@ -97,8 +98,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
*/
public int getSelectionEnd()
{
- // TODO: Figure out what should be returned here, because JLabels don't
- // allow selection. I guess -1 for now.
+ // JLabel don't have selected text, so we return -1 here.
return -1;
}
@@ -115,6 +115,8 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
*/
public AttributeSet getCharacterAttribute(int index)
{
+ // FIXME: Return null here for simple labels, and query the HTML
+ // view for HTML labels.
return new SimpleAttributeSet();
}
@@ -259,6 +261,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
*/
public int getCharCount()
{
+ // FIXME: Query HTML view for HTML labels.
return text.length();
}
@@ -271,6 +274,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
* @return the bounding box of the character at the specified index
*/
public Rectangle getCharacterBounds(int index)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return new Rectangle();
@@ -286,6 +290,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
* point
*/
public int getIndexAtPoint(Point point)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return 0;
@@ -295,6 +300,8 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
/** DOCUMENT ME! */
private static final long serialVersionUID = 5496508283662221534L;
+ static final String LABEL_PROPERTY = "labeledBy";
+
/**
* The Component the label will give focus to when its mnemonic is
* activated.
@@ -337,7 +344,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
*/
public JLabel()
{
- this(null, null, LEADING);
+ this("", null, LEADING);
}
/**
@@ -348,7 +355,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
*/
public JLabel(Icon image)
{
- this(null, image, CENTER);
+ this("", image, CENTER);
}
/**
@@ -361,7 +368,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
*/
public JLabel(Icon image, int horizontalAlignment)
{
- this(null, image, horizontalAlignment);
+ this("", image, horizontalAlignment);
}
/**
@@ -452,7 +459,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
*/
protected String paramString()
{
- return "JLabel";
+ return super.paramString();
}
/**
@@ -510,6 +517,7 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
Icon oldIcon = icon;
icon = newIcon;
firePropertyChange("icon", oldIcon, newIcon);
+ repaint();
}
}
@@ -860,8 +868,23 @@ public class JLabel extends JComponent implements Accessible, SwingConstants
{
if (c != labelFor)
{
+ // We put the label into the client properties for the labeled
+ // component so that it can be read by the AccessibleJComponent.
+ // The other option would be to reserve a default visible field
+ // in JComponent, but since this is relativly seldomly used, it
+ // would be unnecessary waste of memory to do so.
Component oldLabelFor = labelFor;
+ if (oldLabelFor instanceof JComponent)
+ {
+ ((JComponent) oldLabelFor).putClientProperty(LABEL_PROPERTY, null);
+ }
+
labelFor = c;
+ if (labelFor instanceof JComponent)
+ {
+ ((JComponent) labelFor).putClientProperty(LABEL_PROPERTY, this);
+ }
+
firePropertyChange("labelFor", oldLabelFor, labelFor);
}
}
diff --git a/javax/swing/JLayeredPane.java b/javax/swing/JLayeredPane.java
index ffd803c87..f887c2450 100644
--- a/javax/swing/JLayeredPane.java
+++ b/javax/swing/JLayeredPane.java
@@ -599,6 +599,7 @@ public class JLayeredPane extends JComponent implements Accessible
int newIdx = insertIndexForLayer(layer, index);
setLayer(comp, layer);
super.addImpl(comp, layerConstraint, newIdx);
+ repaint(comp.getX(), comp.getY(), comp.getWidth(), comp.getHeight());
}
/**
diff --git a/javax/swing/JList.java b/javax/swing/JList.java
index 763a6be59..55978a4c6 100644
--- a/javax/swing/JList.java
+++ b/javax/swing/JList.java
@@ -1,5 +1,5 @@
/* JList.java --
- Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -965,11 +965,19 @@ public class JList extends JComponent implements Accessible, Scrollable
int visibleRowCount;
/**
- * Fire a {@link ListSelectionEvent} to all the registered ListSelectionListeners.
+ * Fire a {@link ListSelectionEvent} to all the registered
+ * ListSelectionListeners.
+ *
+ * @param firstIndex the lowest index covering the selection change.
+ * @param lastIndex the highest index covering the selection change.
+ * @param isAdjusting a flag indicating if this event is one in a series
+ * of events updating the selection.
*/
- protected void fireSelectionValueChanged(int firstIndex, int lastIndex, boolean isAdjusting)
+ protected void fireSelectionValueChanged(int firstIndex, int lastIndex,
+ boolean isAdjusting)
{
- ListSelectionEvent evt = new ListSelectionEvent(this, firstIndex, lastIndex, isAdjusting);
+ ListSelectionEvent evt = new ListSelectionEvent(this, firstIndex,
+ lastIndex, isAdjusting);
ListSelectionListener listeners[] = getListSelectionListeners();
for (int i = 0; i < listeners.length; ++i)
{
@@ -1022,48 +1030,56 @@ public class JList extends JComponent implements Accessible, Scrollable
/**
- * Creates a new JList object.
+ * Creates a new <code>JList</code> object.
*/
public JList()
{
- init();
+ init(new DefaultListModel());
}
/**
- * Creates a new JList object.
+ * Creates a new <code>JList</code> object.
*
- * @param listData Initial data to populate the list with
+ * @param items the initial list items.
*/
- public JList(Object[] listData)
+ public JList(Object[] items)
{
- init();
- setListData(listData);
+ init(createListModel(items));
}
/**
- * Creates a new JList object.
+ * Creates a new <code>JList</code> object.
*
- * @param listData Initial data to populate the list with
+ * @param items the initial list items.
*/
- public JList(Vector listData)
+ public JList(Vector items)
{
- init();
- setListData(listData);
+ init(createListModel(items));
}
/**
- * Creates a new JList object.
+ * Creates a new <code>JList</code> object.
*
- * @param listData Initial data to populate the list with
+ * @param model a model containing the list items (<code>null</code> not
+ * permitted).
+ *
+ * @throws IllegalArgumentException if <code>model</code> is
+ * <code>null</code>.
*/
- public JList(ListModel listData)
+ public JList(ListModel model)
{
- init();
- setModel(listData);
+ init(model);
}
- void init()
+ /**
+ * Initializes the list.
+ *
+ * @param m the list model (<code>null</code> not permitted).
+ */
+ private void init(ListModel m)
{
+ if (m == null)
+ throw new IllegalArgumentException("Null model not permitted.");
dragEnabled = false;
fixedCellHeight = -1;
fixedCellWidth = -1;
@@ -1075,9 +1091,17 @@ public class JList extends JComponent implements Accessible, Scrollable
cellRenderer = new DefaultListCellRenderer();
listListener = new ListListener();
- setModel(new DefaultListModel());
- setSelectionModel(createSelectionModel());
- setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+ model = m;
+ if (model != null)
+ model.addListDataListener(listListener);
+
+ selectionModel = createSelectionModel();
+ if (selectionModel != null)
+ {
+ selectionModel.addListSelectionListener(listListener);
+ selectionModel.setSelectionMode
+ (ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+ }
setLayout(null);
updateUI();
@@ -1117,6 +1141,8 @@ public class JList extends JComponent implements Accessible, Scrollable
* #prototypeCellValue} property is set, but setting it explicitly
* overrides the height computed from {@link #prototypeCellValue}.
*
+ * @param h the height.
+ *
* @see #getFixedCellHeight
* @see #getPrototypeCellValue
*/
@@ -1127,7 +1153,7 @@ public class JList extends JComponent implements Accessible, Scrollable
int old = fixedCellHeight;
fixedCellHeight = h;
- firePropertyChange("fixedCellWidth", old, h);
+ firePropertyChange("fixedCellHeight", old, h);
}
@@ -1154,6 +1180,8 @@ public class JList extends JComponent implements Accessible, Scrollable
* #prototypeCellValue} property is set, but setting it explicitly
* overrides the width computed from {@link #prototypeCellValue}.
*
+ * @param w the width.
+ *
* @see #getFixedCellHeight
* @see #getPrototypeCellValue
*/
@@ -1229,6 +1257,16 @@ public class JList extends JComponent implements Accessible, Scrollable
return (ListSelectionListener[]) getListeners(ListSelectionListener.class);
}
+ /**
+ * Returns the selection mode for the list (one of:
+ * {@link ListSelectionModel#SINGLE_SELECTION},
+ * {@link ListSelectionModel#SINGLE_INTERVAL_SELECTION} and
+ * {@link ListSelectionModel#MULTIPLE_INTERVAL_SELECTION}).
+ *
+ * @return The selection mode.
+ *
+ * @see #setSelectionMode(int)
+ */
public int getSelectionMode()
{
return selectionModel.getSelectionMode();
@@ -1274,6 +1312,9 @@ public class JList extends JComponent implements Accessible, Scrollable
* For each element <code>a[i]</code> of the provided array
* <code>a</code>, calls {@link #setSelectedIndex} on <code>a[i]</code>.
*
+ * @param a an array of selected indices (<code>null</code> not permitted).
+ *
+ * @throws NullPointerException if <code>a</code> is <code>null</code>.
* @see #setSelectionMode
* @see #selectionModel
*/
@@ -1549,20 +1590,53 @@ public class JList extends JComponent implements Accessible, Scrollable
* @param listData The object array to build a new list model on
* @see #setModel
*/
- public void setListData(final Object[] listData)
+ public void setListData(Object[] listData)
{
- setModel(new AbstractListModel()
- {
- public int getSize()
- {
- return listData.length;
- }
+ setModel(createListModel(listData));
+ }
- public Object getElementAt(int i)
- {
- return listData[i];
- }
- });
+ /**
+ * Returns a {@link ListModel} backed by the specified array.
+ *
+ * @param items the list items (don't use <code>null</code>).
+ *
+ * @return A list model containing the specified items.
+ */
+ private ListModel createListModel(final Object[] items)
+ {
+ return new AbstractListModel()
+ {
+ public int getSize()
+ {
+ return items.length;
+ }
+ public Object getElementAt(int i)
+ {
+ return items[i];
+ }
+ };
+ }
+
+ /**
+ * Returns a {@link ListModel} backed by the specified vector.
+ *
+ * @param items the list items (don't use <code>null</code>).
+ *
+ * @return A list model containing the specified items.
+ */
+ private ListModel createListModel(final Vector items)
+ {
+ return new AbstractListModel()
+ {
+ public int getSize()
+ {
+ return items.size();
+ }
+ public Object getElementAt(int i)
+ {
+ return items.get(i);
+ }
+ };
}
/**
@@ -1573,20 +1647,9 @@ public class JList extends JComponent implements Accessible, Scrollable
* @param listData The object array to build a new list model on
* @see #setModel
*/
- public void setListData(final Vector listData)
+ public void setListData(Vector listData)
{
- setModel(new AbstractListModel()
- {
- public int getSize()
- {
- return listData.size();
- }
-
- public Object getElementAt(int i)
- {
- return listData.elementAt(i);
- }
- });
+ setModel(createListModel(listData));
}
/**
@@ -1657,7 +1720,21 @@ public class JList extends JComponent implements Accessible, Scrollable
repaint();
}
-
+ /**
+ * Returns the selection model for the {@link JList} component. Note that
+ * this class contains a range of convenience methods for configuring the
+ * selection model:<br>
+ * <ul>
+ * <li>{@link #clearSelection()};</li>
+ * <li>{@link #setSelectionMode(int)};</li>
+ * <li>{@link #addSelectionInterval(int, int)};</li>
+ * <li>{@link #setSelectedIndex(int)};</li>
+ * <li>{@link #setSelectedIndices(int[])};</li>
+ * <li>{@link #setSelectionInterval(int, int)}.</li>
+ * </ul>
+ *
+ * @return The selection model.
+ */
public ListSelectionModel getSelectionModel()
{
return selectionModel;
@@ -2012,41 +2089,96 @@ public class JList extends JComponent implements Accessible, Scrollable
return retVal;
}
+ /**
+ * Returns the index of the anchor item in the current selection, or
+ * <code>-1</code> if there is no anchor item.
+ *
+ * @return The item index.
+ */
public int getAnchorSelectionIndex()
{
return selectionModel.getAnchorSelectionIndex();
}
+ /**
+ * Returns the index of the lead item in the current selection, or
+ * <code>-1</code> if there is no lead item.
+ *
+ * @return The item index.
+ */
public int getLeadSelectionIndex()
{
return selectionModel.getLeadSelectionIndex();
}
+ /**
+ * Returns the lowest item index in the current selection, or <code>-1</code>
+ * if there is no selection.
+ *
+ * @return The index.
+ *
+ * @see #getMaxSelectionIndex()
+ */
public int getMinSelectionIndex()
{
- return selectionModel.getMaxSelectionIndex();
+ return selectionModel.getMinSelectionIndex();
}
+ /**
+ * Returns the highest item index in the current selection, or
+ * <code>-1</code> if there is no selection.
+ *
+ * @return The index.
+ *
+ * @see #getMinSelectionIndex()
+ */
public int getMaxSelectionIndex()
{
return selectionModel.getMaxSelectionIndex();
}
+ /**
+ * Clears the current selection.
+ */
public void clearSelection()
{
selectionModel.clearSelection();
}
+ /**
+ * Sets the current selection to the items in the specified range (inclusive).
+ * Note that <code>anchor</code> can be less than, equal to, or greater than
+ * <code>lead</code>.
+ *
+ * @param anchor the index of the anchor item.
+ * @param lead the index of the anchor item.
+ */
public void setSelectionInterval(int anchor, int lead)
{
selectionModel.setSelectionInterval(anchor, lead);
}
+ /**
+ * Adds the specified interval to the current selection. Note that
+ * <code>anchor</code> can be less than, equal to, or greater than
+ * <code>lead</code>.
+ *
+ * @param anchor the index of the anchor item.
+ * @param lead the index of the lead item.
+ */
public void addSelectionInterval(int anchor, int lead)
{
selectionModel.addSelectionInterval(anchor, lead);
}
+ /**
+ * Removes the specified interval from the current selection. Note that
+ * <code>index0</code> can be less than, equal to, or greater than
+ * <code>index1</code>.
+ *
+ * @param index0 an index for one end of the range.
+ * @param index1 an index for the other end of the range.
+ */
public void removeSelectionInterval(int index0, int index1)
{
selectionModel.removeSelectionInterval(index0, index1);
@@ -2140,7 +2272,14 @@ public class JList extends JComponent implements Accessible, Scrollable
*/
public Rectangle getCellBounds(int index0, int index1)
{
- return getUI().getCellBounds(this, index0, index1);
+ ListUI ui = getUI();
+ Rectangle bounds = null;
+ if (ui != null)
+ {
+ bounds = ui.getCellBounds(this, index0, index1);
+ }
+ // When the UI is null, this method also returns null in the RI.
+ return bounds;
}
/**
@@ -2203,4 +2342,28 @@ public class JList extends JComponent implements Accessible, Scrollable
}
return index;
}
+
+ /**
+ * Returns a string describing the attributes for the <code>JList</code>
+ * component, for use in debugging. The return value is guaranteed to be
+ * non-<code>null</code>, but the format of the string may vary between
+ * implementations.
+ *
+ * @return A string describing the attributes of the <code>JList</code>.
+ */
+ protected String paramString()
+ {
+ StringBuffer sb = new StringBuffer(super.paramString());
+ sb.append(",fixedCellHeight=").append(getFixedCellHeight());
+ sb.append(",fixedCellWidth=").append(getFixedCellWidth());
+ sb.append(",selectionBackground=");
+ if (getSelectionBackground() != null)
+ sb.append(getSelectionBackground());
+ sb.append(",selectionForeground=");
+ if (getSelectionForeground() != null)
+ sb.append(getSelectionForeground());
+ sb.append(",visibleRowCount=").append(getVisibleRowCount());
+ sb.append(",layoutOrientation=").append(getLayoutOrientation());
+ return sb.toString();
+ }
}
diff --git a/javax/swing/JMenu.java b/javax/swing/JMenu.java
index f86ffe0b7..37ed14854 100644
--- a/javax/swing/JMenu.java
+++ b/javax/swing/JMenu.java
@@ -1,5 +1,5 @@
/* JMenu.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Point;
import java.awt.event.KeyEvent;
@@ -55,7 +57,6 @@ import javax.accessibility.AccessibleSelection;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import javax.swing.plaf.MenuItemUI;
-import javax.swing.plaf.PanelUI;
/**
* This class represents a menu that can be added to a menu bar or
@@ -765,7 +766,7 @@ public class JMenu extends JMenuItem implements Accessible, MenuElement
*/
protected void processKeyEvent(KeyEvent event)
{
- // TODO: Implement this properly.
+ MenuSelectionManager.defaultManager().processKeyEvent(event);
}
/**
@@ -822,26 +823,31 @@ public class JMenu extends JMenuItem implements Accessible, MenuElement
}
public int getAccessibleChildrenCount()
+ throws NotImplementedException
{
return 0;
}
public Accessible getAccessibleChild(int value0)
+ throws NotImplementedException
{
return null;
}
public AccessibleSelection getAccessibleSelection()
+ throws NotImplementedException
{
return null;
}
public Accessible getAccessibleSelection(int value0)
+ throws NotImplementedException
{
return null;
}
public boolean isAccessibleChildSelected(int value0)
+ throws NotImplementedException
{
return false;
}
@@ -852,26 +858,31 @@ public class JMenu extends JMenuItem implements Accessible, MenuElement
}
public int getAccessibleSelectionCount()
+ throws NotImplementedException
{
return 0;
}
public void addAccessibleSelection(int value0)
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
public void removeAccessibleSelection(int value0)
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
public void clearAccessibleSelection()
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
public void selectAllAccessibleSelection()
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
diff --git a/javax/swing/JMenuItem.java b/javax/swing/JMenuItem.java
index cbd8d6e3c..272c1cfe6 100644
--- a/javax/swing/JMenuItem.java
+++ b/javax/swing/JMenuItem.java
@@ -1,5 +1,5 @@
/* JMenuItem.java --
- Copyright (C) 2002, 2004, 2005,2006 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
@@ -56,7 +58,6 @@ import javax.swing.event.MenuDragMouseListener;
import javax.swing.event.MenuKeyEvent;
import javax.swing.event.MenuKeyListener;
import javax.swing.plaf.MenuItemUI;
-import javax.swing.plaf.PanelUI;
/**
* JMenuItem represents element in the menu. It inherits most of
@@ -397,7 +398,15 @@ public class JMenuItem extends AbstractButton implements Accessible,
public void processKeyEvent(KeyEvent event, MenuElement[] path,
MenuSelectionManager manager)
{
- // Need to implement.
+ MenuKeyEvent e = new MenuKeyEvent(event.getComponent(), event.getID(),
+ event.getWhen(), event.getModifiers(),
+ event.getKeyCode(), event.getKeyChar(),
+ path, manager);
+ processMenuKeyEvent(e);
+
+ // Consume original key event, if the menu key event has been consumed.
+ if (e.isConsumed())
+ event.consume();
}
/**
@@ -435,7 +444,20 @@ public class JMenuItem extends AbstractButton implements Accessible,
*/
public void processMenuKeyEvent(MenuKeyEvent event)
{
- // Need to implement.
+ switch (event.getID())
+ {
+ case KeyEvent.KEY_PRESSED:
+ fireMenuKeyPressed(event);
+ break;
+ case KeyEvent.KEY_RELEASED:
+ fireMenuKeyReleased(event);
+ break;
+ case KeyEvent.KEY_TYPED:
+ fireMenuKeyTyped(event);
+ break;
+ default:
+ break;
+ }
}
/**
@@ -651,16 +673,26 @@ public class JMenuItem extends AbstractButton implements Accessible,
}
/**
- * A string that describes this JMenuItem. Normally only used
- * for debugging.
+ * Returns a string describing the attributes for the <code>JToolTip</code>
+ * component, for use in debugging. The return value is guaranteed to be
+ * non-<code>null</code>, but the format of the string may vary between
+ * implementations.
*
- * @return A string describing this JMenuItem
+ * @return A string describing the attributes of the <code>JMenuItem</code>.
*/
protected String paramString()
{
+ // calling super seems to be sufficient here...
return super.paramString();
}
+ /**
+ * Returns the object that provides accessibility features for this
+ * <code>JMenuItem</code> component.
+ *
+ * @return The accessible context (an instance of
+ * {@link AccessibleJMenuItem}).
+ */
public AccessibleContext getAccessibleContext()
{
if (accessibleContext == null)
@@ -669,13 +701,19 @@ public class JMenuItem extends AbstractButton implements Accessible,
return accessibleContext;
}
+ /**
+ * Provides the accessibility features for the <code>JMenuItem</code>
+ * component.
+ *
+ * @see JMenuItem#getAccessibleContext()
+ */
protected class AccessibleJMenuItem extends AccessibleAbstractButton
implements ChangeListener
{
private static final long serialVersionUID = 6748924232082076534L;
/**
- * Creates a new AccessibleJMenuItem object.
+ * Creates a new <code>AccessibleJMenuItem</code> instance.
*/
AccessibleJMenuItem()
{
@@ -683,10 +721,16 @@ public class JMenuItem extends AbstractButton implements Accessible,
}
public void stateChanged(ChangeEvent event)
+ throws NotImplementedException
{
// TODO: What should be done here, if anything?
}
+ /**
+ * Returns the accessible role for the <code>JMenuItem</code> component.
+ *
+ * @return {@link AccessibleRole#MENU_ITEM}.
+ */
public AccessibleRole getAccessibleRole()
{
return AccessibleRole.MENU_ITEM;
diff --git a/javax/swing/JOptionPane.java b/javax/swing/JOptionPane.java
index 360e60af7..36f4a867d 100644
--- a/javax/swing/JOptionPane.java
+++ b/javax/swing/JOptionPane.java
@@ -1,5 +1,5 @@
/* JOptionPane.java
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -57,17 +57,15 @@ import javax.swing.plaf.OptionPaneUI;
public class JOptionPane extends JComponent implements Accessible
{
/**
- * DOCUMENT ME!
+ * Provides the accessibility features for the <code>JOptionPane</code>
+ * component.
*/
- // FIXME: This inner class is a complete stub and needs to be implemented
- // properly.
protected class AccessibleJOptionPane extends JComponent.AccessibleJComponent
{
- /** DOCUMENT ME! */
private static final long serialVersionUID = 686071432213084821L;
/**
- * Creates a new AccessibleJOptionPane object.
+ * Creates a new <code>AccessibleJOptionPane</code> instance.
*/
protected AccessibleJOptionPane()
{
@@ -75,17 +73,17 @@ public class JOptionPane extends JComponent implements Accessible
}
/**
- * DOCUMENT ME!
+ * Returns the accessible role of this object, which is always
+ * {@link AccessibleRole#OPTION_PANE}.
*
- * @return DOCUMENT ME!
+ * @return the accessible role of this object
*/
public AccessibleRole getAccessibleRole()
{
- return null;
+ return AccessibleRole.OPTION_PANE;
}
}
- /** DOCUMENT ME! */
private static final long serialVersionUID = 5231143276678566796L;
/** The value returned when cancel option is selected. */
@@ -430,9 +428,11 @@ public class JOptionPane extends JComponent implements Accessible
}
/**
- * DOCUMENT ME!
+ * Returns the object that provides accessibility features for this
+ * <code>JOptionPane</code> component.
*
- * @return DOCUMENT ME!
+ * @return The accessible context (an instance of
+ * {@link AccessibleJOptionPane}).
*/
public AccessibleContext getAccessibleContext()
{
diff --git a/javax/swing/JPanel.java b/javax/swing/JPanel.java
index 815e452dc..3bd71d1c2 100644
--- a/javax/swing/JPanel.java
+++ b/javax/swing/JPanel.java
@@ -1,5 +1,5 @@
/* JPanel.java --
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -80,54 +80,108 @@ public class JPanel extends JComponent implements Accessible
}
}
+ /**
+ * Creates a new panel with a new instance of {@link FlowLayout} as the
+ * layout manager and double-buffering enabled.
+ */
public JPanel()
{
this(new FlowLayout(), true);
}
- public JPanel(boolean double_buffered)
+ /**
+ * Creates a new panel with double-buffering enabled or disabled as
+ * specified. The default layout manager is an instance of
+ * {@link FlowLayout}.
+ *
+ * @param isDoubleBuffered a flag that controls whether or not
+ * double-buffering is enabled.
+ */
+ public JPanel(boolean isDoubleBuffered)
{
- this(new FlowLayout(), double_buffered);
+ this(new FlowLayout(), isDoubleBuffered);
}
+ /**
+ * Creates a new panel with the specified layout manager. Double-buffering
+ * is enabled by default.
+ *
+ * @param layout the layout manager (<code>null</code> permitted).
+ */
public JPanel(LayoutManager layout)
{
this(layout, true);
}
+ /**
+ * Creates a new panel with the specified layout manager and
+ * double-buffering.
+ *
+ * @param layout the layout manager (<code>null</code> permitted).
+ * @param isDoubleBuffered a flag that controls whether or not
+ * double-buffering is enabled.
+ */
public JPanel(LayoutManager layout, boolean isDoubleBuffered)
{
- if (layout == null)
- {
- // TODO: Is this correct? Or should we throw a NPE?
- layout = new FlowLayout();
- }
setLayout(layout);
- setOpaque(true);
-
+ setOpaque(true);
+ setDoubleBuffered(isDoubleBuffered);
updateUI();
}
+ /**
+ * Returns the suffix (<code>"PanelUI"</code> in this case) used to
+ * determine the class name for a UI delegate that can provide the look and
+ * feel for a <code>JPanel</code>.
+ *
+ * @return <code>"PanelUI"</code>.
+ */
public String getUIClassID()
{
return "PanelUI";
}
+ /**
+ * Sets the UI delegate for the <code>JPanel</code> component.
+ *
+ * @param ui the UI delegate.
+ *
+ * @since 1.4
+ * @see #getUI()
+ */
public void setUI(PanelUI ui)
{
super.setUI(ui);
}
+ /**
+ * Returns the UI delegate for the <code>JPanel</code> component.
+ *
+ * @return The UI delegate.
+ *
+ * @since 1.4
+ * @see #setUI(PanelUI)
+ */
public PanelUI getUI()
{
return (PanelUI) ui;
}
+ /**
+ * Sets this panel's UI delegate to the default (obtained from the
+ * {@link UIManager}) for the current look and feel.
+ */
public void updateUI()
{
setUI((PanelUI) UIManager.getUI(this));
}
+ /**
+ * Returns the object that provides accessibility features for this
+ * <code>JPanel</code> component.
+ *
+ * @return The accessible context (an instance of {@link AccessibleJPanel}).
+ */
public AccessibleContext getAccessibleContext()
{
if (accessibleContext == null)
@@ -135,7 +189,14 @@ public class JPanel extends JComponent implements Accessible
return accessibleContext;
}
- protected String paramString()
+ /**
+ * Returns an implementation-dependent string describing the attributes of
+ * this <code>JPanel</code>.
+ *
+ * @return A string describing the attributes of this <code>JPanel</code>
+ * (never <code>null</code>).
+ */
+ protected String paramString()
{
return super.paramString();
}
diff --git a/javax/swing/JProgressBar.java b/javax/swing/JProgressBar.java
index 6648c1780..db936f64a 100644
--- a/javax/swing/JProgressBar.java
+++ b/javax/swing/JProgressBar.java
@@ -39,10 +39,12 @@ exception statement from your version. */
package javax.swing;
import java.awt.Graphics;
+import java.beans.PropertyChangeEvent;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleState;
import javax.accessibility.AccessibleStateSet;
import javax.accessibility.AccessibleValue;
import javax.swing.border.Border;
@@ -79,17 +81,16 @@ public class JProgressBar extends JComponent implements SwingConstants,
Accessible
{
/**
- * AccessibleJProgressBar
+ * Provides the accessibility features for the <code>JProgressBar</code>
+ * component.
*/
- // FIXME: This inner class is a complete stub and needs to be implemented
- // properly.
protected class AccessibleJProgressBar extends AccessibleJComponent
implements AccessibleValue
{
private static final long serialVersionUID = -2938130009392721813L;
/**
- * Constructor AccessibleJProgressBar
+ * Creates a new <code>AccessibleJProgressBar</code> instance.
*/
protected AccessibleJProgressBar()
{
@@ -97,19 +98,25 @@ public class JProgressBar extends JComponent implements SwingConstants,
}
/**
- * getAccessibleStateSet
+ * Returns a set containing the current state of the {@link JProgressBar}
+ * component.
*
- * @return AccessibleStateSet
+ * @return The accessible state set.
*/
public AccessibleStateSet getAccessibleStateSet()
{
- return null;
+ AccessibleStateSet result = super.getAccessibleStateSet();
+ if (orientation == JProgressBar.HORIZONTAL)
+ result.add(AccessibleState.HORIZONTAL);
+ else if (orientation == JProgressBar.VERTICAL)
+ result.add(AccessibleState.VERTICAL);
+ return result;
}
/**
- * getAccessibleRole
+ * Returns the accessible role for the <code>JProgressBar</code> component.
*
- * @return AccessibleRole
+ * @return {@link AccessibleRole#PROGRESS_BAR}.
*/
public AccessibleRole getAccessibleRole()
{
@@ -117,56 +124,71 @@ public class JProgressBar extends JComponent implements SwingConstants,
}
/**
- * getAccessibleValue
+ * Returns an object that provides access to the current, minimum and
+ * maximum values.
*
- * @return AccessibleValue
+ * @return The accessible value.
*/
public AccessibleValue getAccessibleValue()
{
- return null;
+ return this;
}
/**
- * getCurrentAccessibleValue
+ * Returns the current value of the {@link JProgressBar} component, as an
+ * {@link Integer}.
*
- * @return Number
+ * @return The current value of the {@link JProgressBar} component.
*/
public Number getCurrentAccessibleValue()
{
- return null;
- }
+ return new Integer(getValue());
+ }
/**
- * setCurrentAccessibleValue
+ * Sets the current value of the {@link JProgressBar} component and sends a
+ * {@link PropertyChangeEvent} (with the property name
+ * {@link AccessibleContext#ACCESSIBLE_VALUE_PROPERTY}) to all registered
+ * listeners. If the supplied value is <code>null</code>, this method
+ * does nothing and returns <code>false</code>.
*
- * @param value0 TODO
+ * @param value the new progress bar value (<code>null</code> permitted).
*
- * @return boolean
+ * @return <code>true</code> if the slider value is updated, and
+ * <code>false</code> otherwise.
*/
- public boolean setCurrentAccessibleValue(Number value0)
+ public boolean setCurrentAccessibleValue(Number value)
{
- return false;
- }
+ if (value == null)
+ return false;
+ Number oldValue = getCurrentAccessibleValue();
+ setValue(value.intValue());
+ firePropertyChange(AccessibleContext.ACCESSIBLE_VALUE_PROPERTY, oldValue,
+ new Integer(getValue()));
+ return true;
+ }
/**
- * getMinimumAccessibleValue
+ * Returns the minimum value of the {@link JProgressBar} component, as an
+ * {@link Integer}.
*
- * @return Number
+ * @return The minimum value of the {@link JProgressBar} component.
*/
public Number getMinimumAccessibleValue()
{
- return null;
- }
+ return new Integer(getMinimum());
+ }
/**
- * getMaximumAccessibleValue
+ * Returns the maximum value of the {@link JProgressBar} component, as an
+ * {@link Integer}.
*
- * @return Number
+ * @return The maximum value of the {@link JProgressBar} component.
*/
public Number getMaximumAccessibleValue()
{
- return null;
- }
+ return new Integer(getMaximum());
+ }
}
private static final long serialVersionUID = 1980046021813598781L;
@@ -612,15 +634,28 @@ public class JProgressBar extends JComponent implements SwingConstants,
}
/**
- * This method returns a string that can be used to
- * describe this JProgressBar. This method is usually
- * only used for debugging purposes.
+ * Returns an implementation-dependent string describing the attributes of
+ * this <code>JProgressBar</code>.
*
- * @return A string that describes this JProgressBar.
+ * @return A string describing the attributes of this
+ * <code>JProgressBar</code> (never <code>null</code>).
*/
protected String paramString()
{
- return "JProgressBar";
+ String superParamStr = super.paramString();
+ StringBuffer sb = new StringBuffer();
+ sb.append(",orientation=");
+ if (orientation == HORIZONTAL)
+ sb.append("HORIZONTAL");
+ else
+ sb.append("VERTICAL");
+ sb.append(",paintBorder=").append(isBorderPainted());
+ sb.append(",paintString=").append(isStringPainted());
+ sb.append(",progressString=");
+ if (progressString != null)
+ sb.append(progressString);
+ sb.append(",indeterminateString=").append(isIndeterminate());
+ return superParamStr + sb.toString();
}
/**
@@ -654,9 +689,11 @@ public class JProgressBar extends JComponent implements SwingConstants,
}
/**
- * DOCUMENT ME!
+ * Returns the object that provides accessibility features for this
+ * <code>JProgressBar</code> component.
*
- * @return DOCUMENT ME!
+ * @return The accessible context (an instance of
+ * {@link AccessibleJProgressBar}).
*/
public AccessibleContext getAccessibleContext()
{
diff --git a/javax/swing/JRadioButtonMenuItem.java b/javax/swing/JRadioButtonMenuItem.java
index 61a8dbab3..0d7c1d105 100644
--- a/javax/swing/JRadioButtonMenuItem.java
+++ b/javax/swing/JRadioButtonMenuItem.java
@@ -1,5 +1,5 @@
/* JRadioButtonMenuItem.java --
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -168,16 +168,27 @@ public class JRadioButtonMenuItem extends JMenuItem implements Accessible
}
/**
- * A string that describes this JRadioButtonMenuItem. Normally only used
- * for debugging.
+ * Returns a string describing the attributes for the
+ * <code>JRadioButtonMenuItem</code> component, for use in debugging. The
+ * return value is guaranteed to be non-<code>null</code>, but the format of
+ * the string may vary between implementations.
*
- * @return A string describing this JRadioButtonMenuItem
+ * @return A string describing the attributes of the
+ * <code>JRadioButtonMenuItem</code>.
*/
protected String paramString()
{
- return "JRadioButtonMenuItem";
+ // calling super seems to be sufficient here...
+ return super.paramString();
}
+ /**
+ * Returns the object that provides accessibility features for this
+ * <code>JRadioButtonMenuItem</code> component.
+ *
+ * @return The accessible context (an instance of
+ * {@link AccessibleJRadioButtonMenuItem}).
+ */
public AccessibleContext getAccessibleContext()
{
if (accessibleContext == null)
@@ -186,18 +197,30 @@ public class JRadioButtonMenuItem extends JMenuItem implements Accessible
return accessibleContext;
}
+ /**
+ * Provides the accessibility features for the
+ * <code>JRadioButtonMenuItem</code> component.
+ *
+ * @see JRadioButtonMenuItem#getAccessibleContext()
+ */
protected class AccessibleJRadioButtonMenuItem extends AccessibleJMenuItem
{
private static final long serialVersionUID = 4381471510145292179L;
/**
- * Creates a new AccessibleJRadioButtonMenuItem object.
+ * Creates a new <code>AccessibleJRadioButtonMenuItem</code> instance.
*/
protected AccessibleJRadioButtonMenuItem()
{
// Nothing to do here.
}
+ /**
+ * Returns the accessible role for the <code>JRadioButtonMenuItem</code>
+ * component.
+ *
+ * @return {@link AccessibleRole#RADIO_BUTTON}.
+ */
public AccessibleRole getAccessibleRole()
{
return AccessibleRole.RADIO_BUTTON;
diff --git a/javax/swing/JRootPane.java b/javax/swing/JRootPane.java
index dec43956c..5c4723596 100644
--- a/javax/swing/JRootPane.java
+++ b/javax/swing/JRootPane.java
@@ -50,6 +50,7 @@ import java.awt.Rectangle;
import java.io.Serializable;
import javax.accessibility.Accessible;
+import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.swing.plaf.RootPaneUI;
@@ -550,6 +551,7 @@ public class JRootPane extends JComponent implements Accessible
JPanel p = new JPanel();
p.setName(this.getName() + ".contentPane");
p.setLayout(new BorderLayout());
+ p.setBackground(null);
return p;
}
@@ -624,12 +626,15 @@ public class JRootPane extends JComponent implements Accessible
public void setDefaultButton(JButton newButton)
{
- if (defaultButton == newButton)
- return;
-
- JButton oldButton = defaultButton;
- defaultButton = newButton;
- firePropertyChange("defaultButton", oldButton, newButton);
+ // We only change the default button if the new button is defaultCapable
+ // or null and the old and new button are different objects.
+ if (defaultButton != newButton
+ && (newButton == null || newButton.isDefaultCapable()))
+ {
+ JButton oldButton = defaultButton;
+ defaultButton = newButton;
+ firePropertyChange("defaultButton", oldButton, newButton);
+ }
}
/**
@@ -674,4 +679,17 @@ public class JRootPane extends JComponent implements Accessible
{
return ! glassPane.isVisible();
}
+
+ /**
+ * Returns the accessible context for this JRootPane. This will be
+ * an instance of {@link AccessibleJRootPane}.
+ *
+ * @return the accessible context for this JRootPane
+ */
+ public AccessibleContext getAccessibleContext()
+ {
+ if (accessibleContext == null)
+ accessibleContext = new AccessibleJRootPane();
+ return accessibleContext;
+ }
}
diff --git a/javax/swing/JScrollBar.java b/javax/swing/JScrollBar.java
index 68aafe917..bf0803ab5 100644
--- a/javax/swing/JScrollBar.java
+++ b/javax/swing/JScrollBar.java
@@ -1,5 +1,5 @@
/* JScrollBar.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -42,10 +42,12 @@ import java.awt.Adjustable;
import java.awt.Dimension;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
+import java.beans.PropertyChangeEvent;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleState;
import javax.accessibility.AccessibleStateSet;
import javax.accessibility.AccessibleValue;
import javax.swing.plaf.ScrollBarUI;
@@ -60,7 +62,8 @@ import javax.swing.plaf.ScrollBarUI;
public class JScrollBar extends JComponent implements Adjustable, Accessible
{
/**
- * DOCUMENT ME!
+ * Provides the accessibility features for the <code>JScrollBar</code>
+ * component.
*/
protected class AccessibleJScrollBar extends JComponent.AccessibleJComponent
implements AccessibleValue
@@ -68,7 +71,7 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible
private static final long serialVersionUID = -7758162392045586663L;
/**
- * Creates a new AccessibleJSlider object.
+ * Creates a new <code>AccessibleJScrollBar</code> instance.
*/
protected AccessibleJScrollBar()
{
@@ -76,75 +79,96 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible
}
/**
- * DOCUMENT ME!
+ * Returns a set containing the current state of the {@link JScrollBar}
+ * component.
*
- * @return DOCUMENT ME!
+ * @return The accessible state set.
*/
public AccessibleStateSet getAccessibleStateSet()
{
- return null;
+ AccessibleStateSet result = super.getAccessibleStateSet();
+ if (orientation == JScrollBar.HORIZONTAL)
+ result.add(AccessibleState.HORIZONTAL);
+ else if (orientation == JScrollBar.VERTICAL)
+ result.add(AccessibleState.VERTICAL);
+ return result;
}
/**
- * DOCUMENT ME!
+ * Returns the accessible role for the <code>JScrollBar</code> component.
*
- * @return DOCUMENT ME!
+ * @return {@link AccessibleRole#SCROLL_BAR}.
*/
public AccessibleRole getAccessibleRole()
{
- return null;
+ return AccessibleRole.SCROLL_BAR;
}
/**
- * DOCUMENT ME!
+ * Returns an object that provides access to the current, minimum and
+ * maximum values.
*
- * @return DOCUMENT ME!
+ * @return The accessible value.
*/
public AccessibleValue getAccessibleValue()
{
- return null;
+ return this;
}
/**
- * DOCUMENT ME!
+ * Returns the current value of the {@link JScrollBar} component, as an
+ * {@link Integer}.
*
- * @return DOCUMENT ME!
+ * @return The current value of the {@link JScrollBar} component.
*/
public Number getCurrentAccessibleValue()
{
- return null;
+ return new Integer(getValue());
}
/**
- * setCurrentAccessibleValue
+ * Sets the current value of the {@link JScrollBar} component and sends a
+ * {@link PropertyChangeEvent} (with the property name
+ * {@link AccessibleContext#ACCESSIBLE_VALUE_PROPERTY}) to all registered
+ * listeners. If the supplied value is <code>null</code>, this method
+ * does nothing and returns <code>false</code>.
*
- * @param value0 TODO
+ * @param value the new slider value (<code>null</code> permitted).
*
- * @return boolean
+ * @return <code>true</code> if the slider value is updated, and
+ * <code>false</code> otherwise.
*/
- public boolean setCurrentAccessibleValue(Number value0)
+ public boolean setCurrentAccessibleValue(Number value)
{
- return false;
+ if (value == null)
+ return false;
+ Number oldValue = getCurrentAccessibleValue();
+ setValue(value.intValue());
+ firePropertyChange(AccessibleContext.ACCESSIBLE_VALUE_PROPERTY, oldValue,
+ new Integer(getValue()));
+ return true;
}
/**
- * getMinimumAccessibleValue
+ * Returns the minimum value of the {@link JScrollBar} component, as an
+ * {@link Integer}.
*
- * @return Number
+ * @return The minimum value of the {@link JScrollBar} component.
*/
public Number getMinimumAccessibleValue()
{
- return null;
+ return new Integer(getMinimum());
}
/**
- * getMaximumAccessibleValue
+ * Returns the maximum value of the {@link JScrollBar} component, as an
+ * {@link Integer}.
*
- * @return Number
+ * @return The maximum value of the {@link JScrollBar} component.
*/
public Number getMaximumAccessibleValue()
{
- return null;
+ return new Integer(getMaximum() - model.getExtent());
}
}
@@ -619,20 +643,32 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible
}
/**
- * A string that describes this JScrollBar. Normally only used
- * for debugging.
+ * Returns a string describing the attributes for the <code>JScrollBar</code>
+ * component, for use in debugging. The return value is guaranteed to be
+ * non-<code>null</code>, but the format of the string may vary between
+ * implementations.
*
- * @return A string describing this JScrollBar.
+ * @return A string describing the attributes of the <code>JScrollBar</code>.
*/
protected String paramString()
{
- return "JScrollBar";
+ StringBuffer sb = new StringBuffer(super.paramString());
+ sb.append(",blockIncrement=").append(blockIncrement);
+ sb.append(",orientation=");
+ if (this.orientation == JScrollBar.HORIZONTAL)
+ sb.append("HORIZONTAL");
+ else
+ sb.append("VERTICAL");
+ sb.append(",unitIncrement=").append(unitIncrement);
+ return sb.toString();
}
/**
- * DOCUMENT ME!
+ * Returns the object that provides accessibility features for this
+ * <code>JScrollBar</code> component.
*
- * @return DOCUMENT ME!
+ * @return The accessible context (an instance of
+ * {@link AccessibleJScrollBar}).
*/
public AccessibleContext getAccessibleContext()
{
diff --git a/javax/swing/JScrollPane.java b/javax/swing/JScrollPane.java
index b1e16a681..09e37378b 100644
--- a/javax/swing/JScrollPane.java
+++ b/javax/swing/JScrollPane.java
@@ -51,7 +51,6 @@ import javax.accessibility.AccessibleContext;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
-import javax.swing.plaf.ScrollBarUI;
import javax.swing.plaf.ScrollPaneUI;
import javax.swing.plaf.UIResource;
diff --git a/javax/swing/JSeparator.java b/javax/swing/JSeparator.java
index 602af6a38..c87783b73 100644
--- a/javax/swing/JSeparator.java
+++ b/javax/swing/JSeparator.java
@@ -37,12 +37,13 @@ exception statement from your version. */
package javax.swing;
+import java.beans.PropertyChangeEvent;
+
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.swing.plaf.SeparatorUI;
-
/**
* The JSeparator. It is mostly used to divide/space out
* components.
@@ -51,14 +52,15 @@ public class JSeparator extends JComponent implements SwingConstants,
Accessible
{
/**
- * AccessibleJSeparator
+ * Provides the accessibility features for the <code>JSeparator</code>
+ * component.
*/
protected class AccessibleJSeparator extends AccessibleJComponent
{
private static final long serialVersionUID = 916332890553201095L;
/**
- * Constructor AccessibleJSeparator
+ * Creates a new <code>AccessibleJSeparator</code> instance.
*/
protected AccessibleJSeparator()
{
@@ -66,9 +68,9 @@ public class JSeparator extends JComponent implements SwingConstants,
}
/**
- * getAccessibleRole
+ * Returns the accessible role for the <code>JSeparator</code> component.
*
- * @return AccessibleRole
+ * @return {@link AccessibleRole#SEPARATOR}.
*/
public AccessibleRole getAccessibleRole()
{
@@ -82,7 +84,7 @@ public class JSeparator extends JComponent implements SwingConstants,
private transient int orientation = HORIZONTAL;
/**
- * Creates a new horizontal JSeparator object.
+ * Creates a new horizontal <code>JSeparator</code> object.
*/
public JSeparator()
{
@@ -90,9 +92,13 @@ public class JSeparator extends JComponent implements SwingConstants,
}
/**
- * Creates a new JSeparator object with the given orientation.
+ * Creates a new <code>JSeparator</code> object with the given orientation.
*
- * @param orientation The orientation of the JSeparator.
+ * @param orientation the orientation (either {@link #HORIZONTAL} or
+ * {@link #VERTICAL}).
+ *
+ * @throws IllegalArgumentException if <code>orientation</code> is not
+ * one of the specified values.
*/
public JSeparator(int orientation)
{
@@ -104,10 +110,9 @@ public class JSeparator extends JComponent implements SwingConstants,
}
/**
- * This method returns the UI delegate being
- * used with the JSeparator.
+ * Returns the UI delegate being used with the <code>JSeparator</code>.
*
- * @return SeparatorUI The JSeparator's UI delegate.
+ * @return The JSeparator's UI delegate.
*/
public SeparatorUI getUI()
{
@@ -115,10 +120,9 @@ public class JSeparator extends JComponent implements SwingConstants,
}
/**
- * This method sets the UI delegate to use
- * with the JSeparator.
+ * Sets the separator's UI delegate.
*
- * @param ui The UI delegate to use.
+ * @param ui the UI delegate.
*/
public void setUI(SeparatorUI ui)
{
@@ -126,8 +130,8 @@ public class JSeparator extends JComponent implements SwingConstants,
}
/**
- * This method resets the UI delegate to the
- * default for the current look and feel.
+ * Sets this separator's UI delegate to the default (obtained from the
+ * {@link UIManager}) for the current look and feel.
*/
public void updateUI()
{
@@ -135,11 +139,11 @@ public class JSeparator extends JComponent implements SwingConstants,
}
/**
- * This method returns the identifier string
- * that is used to determine the UI delegate
- * from the current look and feel.
+ * Returns the suffix (<code>"SeparatorUI"</code> in this case) used to
+ * determine the class name for a UI delegate that can provide the look and
+ * feel for a <code>JSeparator</code>.
*
- * @return String The identifier string for the UI.
+ * @return <code>"SeparatorUI"</code>.
*/
public String getUIClassID()
{
@@ -147,9 +151,11 @@ public class JSeparator extends JComponent implements SwingConstants,
}
/**
- * This method returns the JSeparator's orientation.
+ * Returns the orientation of the <code>JSeparator</code>.
*
- * @return int The JSeparator's orientation.
+ * @return The orientation (one of {@link #HORIZONTAL} and {@link #VERTICAL}).
+ *
+ * @see #setOrientation(int)
*/
public int getOrientation()
{
@@ -157,33 +163,50 @@ public class JSeparator extends JComponent implements SwingConstants,
}
/**
- * This method changes the JSeparator's orientation.
+ * Sets the orientation for the <code>JSeparator</code> and sends a
+ * {@link PropertyChangeEvent} (with the property name
+ * <code>orientation</code>) to all registered listeners.
*
- * @param orientation The JSeparator's orientation.
+ * @param orientation the orientation (either {@link #HORIZONTAL} or
+ * {@link #VERTICAL}).
+ *
+ * @throws IllegalArgumentException if <code>orientation</code> is not
+ * one of the specified values.
+ *
+ * @see #getOrientation()
*/
public void setOrientation(int orientation)
{
if (orientation != HORIZONTAL && orientation != VERTICAL)
throw new IllegalArgumentException(orientation
+ " is not a valid orientation.");
+ int old = this.orientation;
this.orientation = orientation;
+ firePropertyChange("orientation", old, orientation);
}
/**
- * This method returns a string desribing the JSeparator.
- * Normally only used in debugging.
+ * Returns an implementation-dependent string describing the attributes of
+ * this <code>JSeparator</code>.
*
- * @return String A string describing the JSeparator.
+ * @return A string describing the attributes of this <code>JSeparator</code>
+ * (never <code>null</code>).
*/
protected String paramString()
{
- return "JSeparator";
+ String superParamStr = super.paramString();
+ if (orientation == HORIZONTAL)
+ return superParamStr + ",orientation=HORIZONTAL";
+ else
+ return superParamStr + ",orientation=VERTICAL";
}
/**
- * getAccessibleContext
+ * Returns the object that provides accessibility features for this
+ * <code>JSeparator</code> component.
*
- * @return AccessibleContext
+ * @return The accessible context (an instance of
+ * {@link AccessibleJSeparator}).
*/
public AccessibleContext getAccessibleContext()
{
diff --git a/javax/swing/JSlider.java b/javax/swing/JSlider.java
index b5991f876..ed94c4ecc 100644
--- a/javax/swing/JSlider.java
+++ b/javax/swing/JSlider.java
@@ -1,5 +1,5 @@
/* JSlider.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -50,6 +50,7 @@ import java.util.Hashtable;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleState;
import javax.accessibility.AccessibleStateSet;
import javax.accessibility.AccessibleValue;
import javax.swing.event.ChangeEvent;
@@ -57,13 +58,12 @@ import javax.swing.event.ChangeListener;
import javax.swing.plaf.SliderUI;
/**
- * The JSlider is a Swing component that allows selection of a value within a
+ * A visual component that allows selection of a value within a
* range by adjusting a thumb in a track. The values for the minimum,
* maximum, extent and value are stored in a {@link
* DefaultBoundedRangeModel}.
- *
* <p>
- * JSliders have the following properties:
+ * A <code>JSlider</code> component has the following properties:
* </p>
*
* <table>
@@ -72,38 +72,38 @@ import javax.swing.plaf.SliderUI;
* <tr><td> inverted </td><td> slider </td><td> yes </td></tr>
* <tr><td> labelTable </td><td> slider </td><td> yes </td></tr>
* <tr><td> majorTickSpacing </td><td> slider </td><td> yes </td></tr>
- * <tr><td> maximum </td><td> model </td><td> no </td></tr>
- * <tr><td> minimum </td><td> model </td><td> no </td></tr>
+ * <tr><td> maximum </td><td> model </td><td> yes </td></tr>
+ * <tr><td> minimum </td><td> model </td><td> yes </td></tr>
* <tr><td> minorTickSpacing </td><td> slider </td><td> yes </td></tr>
* <tr><td> model </td><td> slider </td><td> yes </td></tr>
* <tr><td> orientation </td><td> slider </td><td> yes </td></tr>
* <tr><td> paintLabels </td><td> slider </td><td> yes </td></tr>
* <tr><td> paintTicks </td><td> slider </td><td> yes </td></tr>
- * <tr><td> snapToTicks </td><td> slider </td><td> no </td></tr>
+ * <tr><td> snapToTicks </td><td> slider </td><td> yes </td></tr>
* <tr><td> value </td><td> model </td><td> no </td></tr>
* <tr><td> valueIsAdjusting </td><td> model </td><td> no </td></tr>
* </table>
*
* <p>
- * The various behavioral aspects of these properties follows:
+ * The various behavioural aspects of these properties follows:
* </p>
*
* <ul>
* <li>
- * When non-bound properties stored in the slider change, the slider fires
- * ChangeEvents to its ChangeListeners.
+ * When a non-bound property stored in the slider changes, the slider fires
+ * a {@link ChangeEvent} to its change listeners.
* </li>
* <li>
- * When bound properties stored in the slider change, the slider fires
- * PropertyChangeEvents to its PropertyChangeListeners
+ * When a bound property stored in the slider changes, the slider fires a
+ * {@link PropertyChangeEvent} to its property change listeners.
* </li>
* <li>
- * If any of the model's properties change, it fires a ChangeEvent to its
- * ChangeListeners, which include the slider.
+ * If any of the model's properties change, it fires a {@link ChangeEvent} to
+ * its listeners, which include the slider.
* </li>
* <li>
- * If the slider receives a ChangeEvent from its model, it will propagate the
- * ChangeEvent to its ChangeListeners, with the ChangeEvent's "source"
+ * If the slider receives a {@link ChangeEvent} from its model, it will
+ * propagate the event to its own change listeners, with the event's "source"
* property set to refer to the slider, rather than the model.
* </li>
* </ul>
@@ -112,21 +112,19 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
ImageObserver,
MenuContainer, Serializable
{
- /** DOCUMENT ME! */
private static final long serialVersionUID = -1441275936141218479L;
/**
- * DOCUMENT ME!
+ * Provides the accessibility features for the <code>JSlider</code>
+ * component.
*/
- // FIXME: This inner class is a complete stub and needs to be implemented
- // properly.
protected class AccessibleJSlider extends JComponent.AccessibleJComponent
implements AccessibleValue
{
private static final long serialVersionUID = -6301740148041106789L;
/**
- * Creates a new AccessibleJSlider object.
+ * Creates a new <code>AccessibleJSlider</code> instance.
*/
protected AccessibleJSlider()
{
@@ -134,75 +132,97 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * DOCUMENT ME!
+ * Returns a set containing the current state of the {@link JSlider}
+ * component.
*
- * @return DOCUMENT ME!
+ * @return The accessible state set.
*/
public AccessibleStateSet getAccessibleStateSet()
{
- return null;
+ AccessibleStateSet result = super.getAccessibleStateSet();
+ if (orientation == JSlider.HORIZONTAL)
+ result.add(AccessibleState.HORIZONTAL);
+ else if (orientation == JSlider.VERTICAL)
+ result.add(AccessibleState.VERTICAL);
+ return result;
}
/**
- * DOCUMENT ME!
+ * Returns the accessible role for the <code>JSlider</code> component.
*
- * @return DOCUMENT ME!
+ * @return {@link AccessibleRole#SLIDER}.
*/
public AccessibleRole getAccessibleRole()
{
- return null;
+ return AccessibleRole.SLIDER;
}
/**
- * DOCUMENT ME!
+ * Returns an object that provides access to the current, minimum and
+ * maximum values for the {@link JSlider}. Since this class implements
+ * {@link AccessibleValue}, it returns itself.
*
- * @return DOCUMENT ME!
+ * @return The accessible value.
*/
public AccessibleValue getAccessibleValue()
{
- return null;
+ return this;
}
/**
- * DOCUMENT ME!
+ * Returns the current value of the {@link JSlider} component, as an
+ * {@link Integer}.
*
- * @return DOCUMENT ME!
+ * @return The current value of the {@link JSlider} component.
*/
public Number getCurrentAccessibleValue()
{
- return null;
+ return new Integer(getValue());
}
/**
- * setCurrentAccessibleValue
+ * Sets the current value of the {@link JSlider} component and sends a
+ * {@link PropertyChangeEvent} (with the property name
+ * {@link AccessibleContext#ACCESSIBLE_VALUE_PROPERTY}) to all registered
+ * listeners. If the supplied value is <code>null</code>, this method
+ * does nothing and returns <code>false</code>.
*
- * @param value0 TODO
+ * @param value the new slider value (<code>null</code> permitted).
*
- * @return boolean
+ * @return <code>true</code> if the slider value is updated, and
+ * <code>false</code> otherwise.
*/
- public boolean setCurrentAccessibleValue(Number value0)
+ public boolean setCurrentAccessibleValue(Number value)
{
- return false;
+ if (value == null)
+ return false;
+ Number oldValue = getCurrentAccessibleValue();
+ setValue(value.intValue());
+ firePropertyChange(AccessibleContext.ACCESSIBLE_VALUE_PROPERTY, oldValue,
+ new Integer(getValue()));
+ return true;
}
/**
- * getMinimumAccessibleValue
+ * Returns the minimum value of the {@link JSlider} component, as an
+ * {@link Integer}.
*
- * @return Number
+ * @return The minimum value of the {@link JSlider} component.
*/
public Number getMinimumAccessibleValue()
{
- return null;
+ return new Integer(getMinimum());
}
/**
- * getMaximumAccessibleValue
+ * Returns the maximum value of the {@link JSlider} component, as an
+ * {@link Integer}.
*
- * @return Number
+ * @return The maximum value of the {@link JSlider} component.
*/
public Number getMaximumAccessibleValue()
{
- return null;
+ return new Integer(getMaximum());
}
}
@@ -221,33 +241,36 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
*/
private transient Dictionary labelTable;
- /** The model used to describe the slider. */
+ /** The model used to store the slider's range and current value. */
protected BoundedRangeModel sliderModel;
- /** The space between major ticks. */
+ /** The space/distance between major ticks. */
protected int majorTickSpacing;
- /** The space between minor ticks. */
+ /** The space/distance between minor ticks. */
protected int minorTickSpacing;
/** Whether the slider snaps its values to ticks. */
protected boolean snapToTicks = false;
- /** The orientation of the slider. */
+ /** The orientation (horizontal or vertical) of the slider. */
protected int orientation = HORIZONTAL;
/** Whether the slider is inverted. */
private transient boolean isInverted;
- /** The ChangeListener that listens to the model. */
+ /**
+ * The listener that monitors the slider's model and forwards events to the
+ * slider's listeners (see <code>createChangeListener()</code>).
+ */
protected ChangeListener changeListener;
- /** The ChangeEvent that is passed to all listeners of this slider. */
+ /** The change event that is passed to all listeners of this slider. */
protected transient ChangeEvent changeEvent;
/**
- * Creates a new horizontal JSlider object with a minimum of 0, a maximum of
- * 100, and a value of 50.
+ * Creates a new horizontal <code>JSlider</code> instance with a minimum of
+ * 0, a maximum of 100, and a value of 50.
*/
public JSlider()
{
@@ -255,8 +278,8 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * Creates a new JSlider object with the given orientation and a minimum of
- * 0, a maximum of 100, and a value of 50.
+ * Creates a new <code>JSlider</code> instance with the given orientation
+ * and a minimum of 0, a maximum of 100, and a value of 50.
*
* @param orientation The orientation of the slider ({@link #HORIZONTAL} or
* {@link #VERTICAL}).
@@ -270,12 +293,15 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * Creates a new horizontal JSlider object with the given maximum and
- * minimum and a value that is halfway between the minimum and the
+ * Creates a new horizontal <code>JSlider</code> instance with the given
+ * maximum and minimum and a value that is halfway between the minimum and the
* maximum.
*
- * @param minimum The minimum value of the JSlider.
- * @param maximum The maximum value of the JSlider.
+ * @param minimum The minimum value.
+ * @param maximum The maximum value.
+ *
+ * @throws IllegalArgumentException if <code>minimum</code> is greater than
+ * <code>maximum</code>.
*/
public JSlider(int minimum, int maximum)
{
@@ -283,12 +309,17 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * Creates a new horizontal JSlider object with the given minimum, maximum,
- * and value.
+ * Creates a new horizontal <code>JSlider</code> instance with the given
+ * minimum, maximum, and value.
*
- * @param minimum The minimum value of the JSlider.
- * @param maximum The maximum value of the JSlider.
- * @param value The initial value of the JSlider.
+ * @param minimum The minimum value.
+ * @param maximum The maximum value.
+ * @param value The initial value.
+ *
+ * @throws IllegalArgumentException if <code>value</code> is not in the
+ * specified range.
+ * @throws IllegalArgumentException if <code>minimum</code> is greater than
+ * <code>maximum</code>.
*/
public JSlider(int minimum, int maximum, int value)
{
@@ -296,8 +327,8 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * Creates a new JSlider object with the given orientation, minimum,
- * maximum, and value.
+ * Creates a new <code>JSlider</code> instance with the given orientation,
+ * minimum, maximum, and value.
*
* @param orientation The orientation of the slider ({@link #HORIZONTAL} or
* {@link #VERTICAL}).
@@ -306,13 +337,18 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
* @param value The initial value of the JSlider.
*
* @throws IllegalArgumentException if <code>orientation</code> is not one of
- * the specified values.
+ * the specified values.
+ * @throws IllegalArgumentException if <code>value</code> is not in the
+ * specified range.
+ * @throws IllegalArgumentException if <code>minimum</code> is greater than
+ * <code>maximum</code>.
*/
public JSlider(int orientation, int minimum, int maximum, int value)
{
sliderModel = new DefaultBoundedRangeModel(value, 0, minimum, maximum);
if (orientation != HORIZONTAL && orientation != VERTICAL)
- throw new IllegalArgumentException(orientation + " is not a legal orientation");
+ throw new IllegalArgumentException(orientation
+ + " is not a legal orientation");
this.orientation = orientation;
changeListener = createChangeListener();
sliderModel.addChangeListener(changeListener);
@@ -320,7 +356,8 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * Creates a new horizontal JSlider object with the given model.
+ * Creates a new horizontal <code>JSlider</code> instance with the given
+ * model.
*
* @param model The model (<code>null</code> not permitted).
*
@@ -335,9 +372,11 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method returns the current value of the slider.
+ * Returns the slider's value (from the slider's model).
*
- * @return The value of the slider stored in the model.
+ * @return The value of the slider.
+ *
+ * @see #setValue(int)
*/
public int getValue()
{
@@ -345,9 +384,15 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method sets the value of the slider.
+ * Sets the slider's value and sends a {@link ChangeEvent} to all
+ * registered listeners. Note that the model will fire a change event to all
+ * of its registered listeners first (with the model as the event source) and
+ * then the slider will fire another change event to all of its registered
+ * listeners (this time with the slider as the event source).
*
- * @param value The slider's new value.
+ * @param value the new value.
+ *
+ * @see #getValue()
*/
public void setValue(int value)
{
@@ -355,7 +400,7 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method returns the slider's UI delegate.
+ * Returns the slider's UI delegate.
*
* @return The slider's UI delegate.
*/
@@ -365,9 +410,9 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method sets the slider's UI delegate.
+ * Sets the slider's UI delegate.
*
- * @param ui A SliderUI object to use with this slider.
+ * @param ui the UI delegate.
*/
public void setUI(SliderUI ui)
{
@@ -375,8 +420,8 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method sets this slider's UI to the UIManager's default for the
- * current look and feel.
+ * Sets this slider's UI delegate to the default (obtained from the
+ * {@link UIManager}) for the current look and feel.
*/
public void updateUI()
{
@@ -384,10 +429,11 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method returns a name to identify which look and feel class will be
- * the UI delegate for the slider.
+ * Returns the suffix (<code>"SliderUI"</code> in this case) used to
+ * determine the class name for a UI delegate that can provide the look and
+ * feel for a <code>JSlider</code>.
*
- * @return The Look and Feel classID. "SliderUI"
+ * @return <code>"SliderUI"</code>.
*/
public String getUIClassID()
{
@@ -395,29 +441,36 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * Creates a ChangeListener for this Slider.
+ * Creates a {@link ChangeListener} that is added to the slider's model and
+ * forwards change events generated by the model to the listeners that are
+ * registered with the <code>JSlider</code> (by calling the
+ * {@link #fireStateChanged} method).
*
- * @return A new ChangeListener.
+ * @return A new listener.
*/
protected ChangeListener createChangeListener()
{
return new ChangeListener()
{
- public void stateChanged(ChangeEvent ce)
- {
- // No need to trigger a repaint since the UI listens to the model
- // as well. All we need to do is pass on the stateChanged event
- // to our listeners.
- fireStateChanged();
- }
+ public void stateChanged(ChangeEvent ce)
+ {
+ // No need to trigger a repaint since the UI listens to the model
+ // as well. All we need to do is pass on the stateChanged event
+ // to our listeners.
+ fireStateChanged();
+ }
};
}
/**
- * This method registers a listener to this slider. The listener will be
- * informed of new ChangeEvents.
+ * Registers a listener with the slider so that it will receive
+ * {@link ChangeEvent} notifications. Note that change events generated
+ * by the slider's model will be forwarded automatically to the slider's
+ * listeners.
*
- * @param listener The listener to register.
+ * @param listener the listener to register.
+ *
+ * @see #removeChangeListener(ChangeListener)
*/
public void addChangeListener(ChangeListener listener)
{
@@ -425,9 +478,12 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method removes a listener from this slider.
+ * Removes a listener from this slider so that it will no longer receive
+ * {@link ChangeEvent} notifications from the slider.
*
* @param listener The listener to remove.
+ *
+ * @see #addChangeListener(ChangeListener)
*/
public void removeChangeListener(ChangeListener listener)
{
@@ -435,9 +491,8 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method is called whenever the model fires a ChangeEvent. It should
- * propagate the ChangeEvent to its listeners with a new ChangeEvent that
- * identifies the slider as the source.
+ * Sends a {@link ChangeEvent} to all registered listeners, with this slider
+ * as the source.
*/
protected void fireStateChanged()
{
@@ -446,16 +501,19 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
changeEvent = new ChangeEvent(this);
for (int i = changeListeners.length - 2; i >= 0; i -= 2)
{
- if (changeListeners[i] == ChangeListener.class)
- ((ChangeListener) changeListeners[i + 1]).stateChanged(changeEvent);
+ if (changeListeners[i] == ChangeListener.class)
+ ((ChangeListener) changeListeners[i + 1]).stateChanged(changeEvent);
}
}
/**
- * This method returns an array of all ChangeListeners listening to this
- * slider.
+ * Returns an array containing all the {@link ChangeListener} instances
+ * registered with this slider. If no listeners are registered, this method
+ * returns an empty array.
*
- * @return An array of ChangeListeners listening to this slider.
+ * @return An array array containing all the {@link ChangeListener} instances
+ * registered with this slider (possibly empty, but never
+ * <code>null</code>).
*/
public ChangeListener[] getChangeListeners()
{
@@ -463,9 +521,12 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method returns the model of the slider.
+ * Returns the slider's model, which stores the minimum, maximum and current
+ * values.
*
* @return The slider's model.
+ *
+ * @see #setModel(BoundedRangeModel)
*/
public BoundedRangeModel getModel()
{
@@ -473,11 +534,16 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method changes the "model" property. It also needs to unregister
- * any listeners to the old model and register any listeners to the new
- * model.
+ * Sets the slider's model and sends a {@link PropertyChangeEvent} (with the
+ * property name "model") to all registered listeners. The change listener
+ * that the slider registered with the original model is removed and added
+ * to the new model (this ensures that {@link ChangeEvent} notifications
+ * generated by the model are automatically forwarded to listeners that are
+ * registered with the slider).
*
* @param model The model to use with the slider.
+ *
+ * @see #getModel()
*/
public void setModel(BoundedRangeModel model)
{
@@ -486,18 +552,20 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
// and bork the next time it tries to access the model.
if (model != sliderModel)
{
- BoundedRangeModel oldModel = sliderModel;
- sliderModel = model;
- oldModel.removeChangeListener(changeListener);
- sliderModel.addChangeListener(changeListener);
- firePropertyChange("model", oldModel, sliderModel);
+ BoundedRangeModel oldModel = sliderModel;
+ sliderModel = model;
+ oldModel.removeChangeListener(changeListener);
+ sliderModel.addChangeListener(changeListener);
+ firePropertyChange("model", oldModel, sliderModel);
}
}
/**
- * This method returns the minimum value of the slider.
+ * Returns the minimum value of the slider (from the slider's model).
*
* @return The minimum value of the slider.
+ *
+ * @see #setMinimum(int)
*/
public int getMinimum()
{
@@ -505,9 +573,20 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method sets the minimum value of the slider.
- *
+ * Sets the minimum value of the slider and fires a
+ * {@link PropertyChangeEvent} (with the property name "minimum") to all
+ * registered listeners. Note that:
+ * <p>
+ * <ul>
+ * <li>the minimum value is stored in the slider's model (see
+ * {@link #getModel()});</li>
+ * <li>in addition to the property change event, the slider also fires a
+ * {@link ChangeEvent}.</li>
+ * </ul>
+ *
* @param minimum The minimum value of the slider.
+ *
+ * @see #getMinimum()
*/
public void setMinimum(int minimum)
{
@@ -518,9 +597,11 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method returns the maximum value of the slider.
+ * Returns the slider's maximum value (obtained from the slider's model).
*
* @return The maximum value of the slider.
+ *
+ * @see #setMaximum(int)
*/
public int getMaximum()
{
@@ -528,9 +609,20 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method sets the maximum value of the slider.
+ * Sets the maximum value of the slider and fires a
+ * {@link PropertyChangeEvent} (with the property name "maximum") to all
+ * registered listeners. Note that:
+ * <p>
+ * <ul>
+ * <li>the maximum value is stored in the slider's model (see
+ * {@link #getModel()});</li>
+ * <li>in addition to the property change event, the slider also fires a
+ * {@link ChangeEvent}.</li>
+ * </ul>
*
* @param maximum The maximum value of the slider.
+ *
+ * @see #getMaximum()
*/
public void setMaximum(int maximum)
{
@@ -541,10 +633,11 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method returns this slider's isAdjusting value which is true if the
- * thumb is being dragged.
+ * Returns the <code>valueIsAdjusting</code> flag from the slider's model.
*
- * @return The slider's isAdjusting value.
+ * @return The <code>valueIsAdjusting</code> flag from the slider's model.
+ *
+ * @see #setValueIsAdjusting(boolean)
*/
public boolean getValueIsAdjusting()
{
@@ -552,9 +645,12 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method sets the isAdjusting value for the slider.
+ * Sets the <code>valueIsAdjusting</code> flag in the slider's model, and
+ * sends a {@link ChangeEvent} to all registered listeners.
*
- * @param adjusting The slider's isAdjusting value.
+ * @param adjusting the new flag value.
+ *
+ * @see #getValueIsAdjusting()
*/
public void setValueIsAdjusting(boolean adjusting)
{
@@ -562,9 +658,11 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method returns the extent value for this slider.
+ * Returns the slider's extent value, obtained from the slider's model.
*
- * @return The extent value for this slider.
+ * @return The extent value.
+ *
+ * @see #setExtent(int)
*/
public int getExtent()
{
@@ -572,9 +670,15 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method sets the extent value for this slider.
+ * Sets the slider's extent value and sends a {@link ChangeEvent} to all
+ * registered listeners. Note that the model will fire a change event to all
+ * of its registered listeners first (with the model as the event source) and
+ * then the slider will fire another change event to all of its registered
+ * listeners (this time with the slider as the event source).
*
* @param extent The extent value for this slider.
+ *
+ * @see #getExtent()
*/
public void setExtent(int extent)
{
@@ -582,9 +686,12 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method returns the slider orientation.
+ * Returns the orientation of the slider, either {@link JSlider#HORIZONTAL}
+ * or {@link JSlider#VERTICAL}.
*
* @return The orientation of the slider.
+ *
+ * @see #setOrientation(int)
*/
public int getOrientation()
{
@@ -592,28 +699,37 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method changes the "orientation" property of this slider. If the
- * orientation is not VERTICAL or HORIZONTAL, this method does nothing.
+ * Sets the orientation for the slider and sends a
+ * {@link PropertyChangeEvent} (with the property name "orientation") to all
+ * registered listeners.
*
- * @param orientation The orientation of this slider.
+ * @param orientation the orientation (one of {@link JSlider#HORIZONTAL} or
+ * {@link JSlider#VERTICAL}).
+ *
+ * @throws IllegalArgumentException if <code>orientation</code> is not one of
+ * the permitted values.
+ *
+ * @see #getOrientation()
*/
public void setOrientation(int orientation)
{
if (orientation != VERTICAL && orientation != HORIZONTAL)
- throw new IllegalArgumentException("orientation must be one of: VERTICAL, HORIZONTAL");
+ throw new IllegalArgumentException(
+ "orientation must be one of: VERTICAL, HORIZONTAL");
if (orientation != this.orientation)
{
- int oldOrientation = this.orientation;
- this.orientation = orientation;
- firePropertyChange("orientation", oldOrientation,
- this.orientation);
+ int oldOrientation = this.orientation;
+ this.orientation = orientation;
+ firePropertyChange("orientation", oldOrientation, this.orientation);
}
}
/**
- * This method returns the label table for this slider.
+ * Returns the label table for the slider.
*
- * @return The label table for this slider.
+ * @return The label table for the slider (possibly <code>null</code>).
+ *
+ * @see #setLabelTable(Dictionary)
*/
public Dictionary getLabelTable()
{
@@ -621,23 +737,27 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method changes the "labelTable" property of this slider.
+ * Sets the table of labels for the slider and sends a
+ * {@link PropertyChangeEvent} (with the property name "labelTable") to all
+ * registered listeners.
*
- * @param table The label table for this slider.
+ * @param table the table of labels (<code>null</code> permitted).
+ *
+ * @see #getLabelTable()
*/
public void setLabelTable(Dictionary table)
{
if (table != labelTable)
{
- Dictionary oldTable = labelTable;
- labelTable = table;
- firePropertyChange("labelTable", oldTable, labelTable);
+ Dictionary oldTable = labelTable;
+ labelTable = table;
+ firePropertyChange("labelTable", oldTable, labelTable);
}
}
/**
- * This method is called to reset UI delegates for the labels in the
- * labelTable to a default for the current look and feel.
+ * Resets the UI delegates for the labels in the <code>labelTable</code> to
+ * the default for the current look and feel.
*/
protected void updateLabelUIs()
{
@@ -645,20 +765,20 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
return;
for (Enumeration list = labelTable.elements(); list.hasMoreElements();)
{
- JLabel label = (JLabel) list.nextElement();
- label.updateUI();
+ JLabel label = (JLabel) list.nextElement();
+ label.updateUI();
}
}
/**
- * Creates a hashtable of (Integer, JLabel) pairs that can be used as a
- * label table for this slider. The labels will start from the sliders
- * minimum and increase by the increment. Each label will have a text
- * string indicating their integer value.
+ * Creates a hashtable of <code>(Integer, JLabel)</code> pairs that can be
+ * used as a label table for this slider. The labels will start from the
+ * slider's minimum and increase by the increment. Each label will have a text
+ * string indicating its integer value.
*
* @param increment The increment between labels (must be > 0).
*
- * @return A hashtable with the labels and their keys.
+ * @return A hashtable containing the labels.
*
* @throws IllegalArgumentException if <code>increment</code> is not greater
* than zero.
@@ -669,10 +789,10 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * Creates a hashtable of (Integer, JLabel) pairs that can be used as a
- * label table for this slider. The labels will start from the given start
- * value and increase by the increment. Each label will have a text string
- * indicating its integer value.
+ * Creates a hashtable of <code>(Integer, JLabel)</code> pairs that can be
+ * used as a label table for this slider. The labels will start from the
+ * given start value and increase by the increment. Each label will have a
+ * text string indicating its integer value.
*
* @param increment The increment between labels (must be > 0).
* @param start The value to start from.
@@ -697,29 +817,29 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
for (int i = start; i <= max; i += increment)
{
- label = new JLabel(String.valueOf(i));
- label.setVerticalAlignment(CENTER);
- label.setHorizontalAlignment(CENTER);
-
- // Make sure these labels have the width and height
- // they want.
- dim = label.getPreferredSize();
- label.setBounds(label.getX(), label.getY(),
- (int) dim.getWidth(),
- (int) dim.getHeight());
- table.put(new Integer(i), label);
+ label = new JLabel(String.valueOf(i));
+ label.setVerticalAlignment(CENTER);
+ label.setHorizontalAlignment(CENTER);
+
+ // Make sure these labels have the width and height
+ // they want.
+ dim = label.getPreferredSize();
+ label.setBounds(label.getX(), label.getY(),
+ (int) dim.getWidth(),
+ (int) dim.getHeight());
+ table.put(new Integer(i), label);
}
return table;
}
/**
- * This method returns whether the slider is inverted. Horizontal sliders
- * that are not inverted will have the minimums on the left. If they are
- * inverted, the minimums will be on the right. Vertical sliders that are
- * not inverted will have the minimums at the bottom. If they are inverted,
- * the minimums will be at the top.
+ * Returns the flag that controls whether or not the value scale for the
+ * slider is inverted (the default value is <code>false</code>).
*
- * @return Whether this slider is inverted.
+ * @return The flag that controls whether or not the value scale for the
+ * slider is inverted.
+ *
+ * @see #setInverted(boolean)
*/
public boolean getInverted()
{
@@ -727,30 +847,36 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method changes the "inverted" property for this slider.Horizontal
- * sliders that are not inverted will have the minimums on the left. If
- * they are inverted, the minimums will be on the right. Vertical sliders
- * that are not inverted will have the minimums at the bottom. If they are
- * inverted, the minimums will be at the top. However, if the slider's
- * componentOrientation is set to RIGHT_TO_LEFT, then everything gets
- * reversed again.
+ * Sets the flag that controls whether or not the value scale for the
+ * slider is inverted and, if the new flag value is different to the old flag
+ * value, sends a {@link PropertyChangeEvent} to all registered listeners.
+ * Typically, a horizontal slider will display a scale that increases from
+ * left to right, but this is reversed if the 'inverted' flag is set to
+ * <code>true</code>. Similarly, a vertical slider will display a scale that
+ * increases from bottom to top, and this is reversed if the 'inverted' flag
+ * is set to <code>true</code>.
*
- * @param inverted Whether the slider should be inverted.
+ * @param inverted the new flag value.
+ *
+ * @see #getInverted()
*/
public void setInverted(boolean inverted)
{
if (isInverted != inverted)
{
- boolean oldInverted = isInverted;
- isInverted = inverted;
- firePropertyChange("inverted", oldInverted, isInverted);
+ boolean oldInverted = isInverted;
+ isInverted = inverted;
+ firePropertyChange("inverted", oldInverted, isInverted);
}
}
/**
- * This method returns the amount of units between each major tick mark.
+ * Returns the distance between major tick marks along the slider's value
+ * scale.
*
* @return The amount of units between each major tick mark.
+ *
+ * @see #setMajorTickSpacing(int)
*/
public int getMajorTickSpacing()
{
@@ -758,26 +884,32 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method changes the "majorTickSpacing" property for this slider. The
- * major tick spacing is the amount of units between each major tick mark.
+ * Sets the distance between major tick marks along the slider's value scale,
+ * and sends a {@link PropertyChangeEvent} (with the property name
+ * "majorTickSpacing") to all registered listeners.
*
- * @param spacing The amount of units between each major tick mark.
+ * @param spacing the distance between major tick marks.
+ *
+ * @see #getMajorTickSpacing()
*/
public void setMajorTickSpacing(int spacing)
{
if (majorTickSpacing != spacing)
{
- int oldSpacing = majorTickSpacing;
- majorTickSpacing = spacing;
- firePropertyChange("majorTickSpacing", oldSpacing,
- majorTickSpacing);
+ int oldSpacing = majorTickSpacing;
+ majorTickSpacing = spacing;
+ firePropertyChange("majorTickSpacing", oldSpacing, majorTickSpacing);
}
}
/**
- * This method returns the amount of units between each minor tick mark.
+ * Returns the distance between minor tick marks along the slider's value
+ * scale.
*
- * @return The amount of units between each minor tick mark.
+ * @return The distance between minor tick marks along the slider's value
+ * scale.
+ *
+ * @see #setMinorTickSpacing(int)
*/
public int getMinorTickSpacing()
{
@@ -785,28 +917,32 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method changes the "minorTickSpacing" property for this slider. The
- * minor tick spacing is the amount of units between each minor tick mark.
+ * Sets the distance between minor tick marks along the slider's value scale,
+ * and sends a {@link PropertyChangeEvent} (with the property name
+ * "minorTickSpacing") to all registered listeners.
*
- * @param spacing The amount of units between each minor tick mark.
+ * @param spacing the distance between minor tick marks.
+ *
+ * @see #getMinorTickSpacing()
*/
public void setMinorTickSpacing(int spacing)
{
if (minorTickSpacing != spacing)
{
- int oldSpacing = minorTickSpacing;
- minorTickSpacing = spacing;
- firePropertyChange("minorTickSpacing", oldSpacing,
- minorTickSpacing);
+ int oldSpacing = minorTickSpacing;
+ minorTickSpacing = spacing;
+ firePropertyChange("minorTickSpacing", oldSpacing, minorTickSpacing);
}
}
/**
- * This method returns whether this slider is snapping to ticks. Sliders
- * that snap to ticks will automatically move the thumb to the nearest tick
- * mark.
+ * Returns the flag that controls whether the slider thumb will snap to ticks.
+ * Sliders that snap to ticks will automatically move the thumb to the
+ * nearest tick mark.
*
- * @return Whether this slider snaps to ticks.
+ * @return <code>true</code> if the slider thumb automatically.
+ *
+ * @see #setSnapToTicks(boolean)
*/
public boolean getSnapToTicks()
{
@@ -814,28 +950,32 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method sets whether this slider will snap to ticks. Sliders that
- * snap to ticks will automatically move the thumb to the nearest tick
- * mark.
+ * Sets the flag that controls whether the slider thumb will snap to ticks
+ * and sends a {@link PropertyChangeEvent} (with the property name
+ * 'snapToTicks') to all registered listeners. Sliders that snap to ticks
+ * will automatically move the thumb to the nearest tick mark.
*
- * @param snap Whether this slider snaps to ticks.
+ * @param snap the new flag value.
+ *
+ * @see #getSnapToTicks()
*/
public void setSnapToTicks(boolean snap)
{
if (snap != snapToTicks)
{
- snapToTicks = snap;
- firePropertyChange("snapToTicks", !snap, snap);
+ snapToTicks = snap;
+ firePropertyChange("snapToTicks", !snap, snap);
}
}
/**
- * This method returns whether the slider will paint its tick marks. In
- * addition to setting this property to true, one of minor tick spacing or
- * major tick spacing must be set to a value greater than 0 in order for
- * ticks to be painted.
+ * Returns the flag that controls whether or not tick marks are painted along
+ * the slider's value scale.
*
- * @return Whether ticks will be painted.
+ * @return <code>true</code> if tick marks should be painted, and
+ * <code>false</code> if tick marks should not be painted.
+ *
+ * @see #setPaintTicks(boolean)
*/
public boolean getPaintTicks()
{
@@ -843,27 +983,33 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method changes the "paintTicks" property for this slider. In
- * addition to setting this property to true, one of minor tick spacing or
- * major tick spacing must be set to a value greater than 0 in order for
- * ticks to be painted.
+ * Sets the flag that controls whether or not tick marks are painted along
+ * the slider's value scale, and sends a {@link PropertyChangeEvent} (with
+ * the property name "paintTicks") to all registered listeners. In
+ * addition to setting this property to <code>true</code>, one or both of the
+ * minor tick spacing and major tick spacing attributes must be set to a
+ * value greater than 0 in order for ticks to be painted.
*
* @param paint Whether ticks will be painted.
+ *
+ * @see #getPaintTicks()
*/
public void setPaintTicks(boolean paint)
{
if (paint != paintTicks)
{
- boolean oldPaintTicks = paintTicks;
- paintTicks = paint;
- firePropertyChange("paintTicks", oldPaintTicks, paintTicks);
+ boolean oldPaintTicks = paintTicks;
+ paintTicks = paint;
+ firePropertyChange("paintTicks", oldPaintTicks, paintTicks);
}
}
/**
- * This method returns whether the track will be painted.
+ * Returns the flag that controls whether or not the track is painted.
*
* @return Whether the track will be painted.
+ *
+ * @see #setPaintTrack(boolean)
*/
public boolean getPaintTrack()
{
@@ -876,6 +1022,8 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
* registered listeners.
*
* @param paint Whether the track will be painted.
+ *
+ * @see #getPaintTrack()
*/
public void setPaintTrack(boolean paint)
{
@@ -887,9 +1035,12 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method returns whether labels will be painted.
+ * Returns the flag that controls whether or not labels are painted for the
+ * tick marks along the slider.
*
* @return Whether labels will be painted.
+ *
+ * @see #setPaintLabels(boolean)
*/
public boolean getPaintLabels()
{
@@ -897,36 +1048,62 @@ public class JSlider extends JComponent implements SwingConstants, Accessible,
}
/**
- * This method changes the "paintLabels" property.
+ * Sets the flag that controls whether or not labels are painted for the
+ * tick marks along the slider and sends a {@link PropertyChangeEvent} (with
+ * the property name "paintLabels") to all registered listeners.
*
* @param paint Whether labels will be painted.
+ *
+ * @see #getPaintLabels()
*/
public void setPaintLabels(boolean paint)
{
if (paint != paintLabels)
{
- paintLabels = paint;
- if (paint && majorTickSpacing > 0)
+ paintLabels = paint;
+ if (paint && majorTickSpacing > 0 && labelTable == null)
labelTable = createStandardLabels(majorTickSpacing);
- firePropertyChange("paintLabels", !paint, paint);
+ firePropertyChange("paintLabels", !paint, paint);
}
}
/**
- * This method is used primarily for debugging purposes and returns a string
- * that can be used to represent this slider.
+ * Returns an implementation-dependent string describing the attributes of
+ * this <code>JSlider</code>.
*
- * @return A string representing this slider.
+ * @return A string describing the attributes of this <code>JSlider</code>
+ * (never <code>null</code>).
*/
protected String paramString()
{
- return "JSlider";
+ String superParamStr = super.paramString();
+ StringBuffer sb = new StringBuffer();
+ sb.append(",isInverted=").append(getInverted());
+ sb.append(",majorTickSpacing=").append(getMajorTickSpacing());
+ sb.append(",minorTickSpacing=").append(getMinorTickSpacing());
+ sb.append(",orientation=");
+ if (orientation == HORIZONTAL)
+ sb.append("HORIZONTAL");
+ else
+ sb.append("VERTICAL");
+ sb.append(",paintLabels=").append(getPaintLabels());
+ sb.append(",paintTicks=").append(getPaintTicks());
+ sb.append(",paintTrack=").append(getPaintTrack());
+ sb.append(",snapToTicks=").append(getSnapToTicks());
+
+ // the following is output by the reference implementation. We don't
+ // strictly need to replicate this. Perhaps it has some meaning, but
+ // I couldn't determine it yet...
+ sb.append(",snapToValue=true");
+
+ return superParamStr + sb.toString();
}
/**
- * DOCUMENT ME!
+ * Returns the object that provides accessibility features for this
+ * <code>JSlider</code> component.
*
- * @return DOCUMENT ME!
+ * @return The accessible context (an instance of {@link AccessibleJSlider}).
*/
public AccessibleContext getAccessibleContext()
{
diff --git a/javax/swing/JSpinner.java b/javax/swing/JSpinner.java
index 882d216e1..70045ed53 100644
--- a/javax/swing/JSpinner.java
+++ b/javax/swing/JSpinner.java
@@ -106,6 +106,10 @@ public class JSpinner extends JComponent
add(ftf);
ftf.setValue(spinner.getValue());
ftf.addPropertyChangeListener(this);
+ if(getComponentOrientation().isLeftToRight())
+ ftf.setHorizontalAlignment(JTextField.RIGHT);
+ else
+ ftf.setHorizontalAlignment(JTextField.LEFT);
spinner.addChangeListener(this);
}
diff --git a/javax/swing/JSplitPane.java b/javax/swing/JSplitPane.java
index 934bfd703..c11512198 100644
--- a/javax/swing/JSplitPane.java
+++ b/javax/swing/JSplitPane.java
@@ -1,5 +1,5 @@
/* JSplitPane.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -40,10 +40,12 @@ package javax.swing;
import java.awt.Component;
import java.awt.Graphics;
+import java.beans.PropertyChangeEvent;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
+import javax.accessibility.AccessibleState;
import javax.accessibility.AccessibleStateSet;
import javax.accessibility.AccessibleValue;
import javax.swing.plaf.SplitPaneUI;
@@ -56,18 +58,18 @@ import javax.swing.plaf.SplitPaneUI;
*/
public class JSplitPane extends JComponent implements Accessible
{
+
/**
- * DOCUMENT ME!
+ * Provides the accessibility features for the <code>JSplitPane</code>
+ * component.
*/
- // FIXME: This inner class is a complete stub and must be implemented
- // properly.
protected class AccessibleJSplitPane extends JComponent.AccessibleJComponent
implements AccessibleValue
{
private static final long serialVersionUID = -1788116871416305366L;
/**
- * Creates a new AccessibleJSplitPane object.
+ * Creates a new <code>AccessibleJSplitPane</code> instance.
*/
protected AccessibleJSplitPane()
{
@@ -75,75 +77,101 @@ public class JSplitPane extends JComponent implements Accessible
}
/**
- * DOCUMENT ME!
+ * Returns a set containing the current state of the {@link JSplitPane}
+ * component.
*
- * @return DOCUMENT ME!
+ * @return The accessible state set.
*/
public AccessibleStateSet getAccessibleStateSet()
{
- return null;
+ AccessibleStateSet result = super.getAccessibleStateSet();
+ if (getOrientation() == HORIZONTAL_SPLIT)
+ {
+ result.add(AccessibleState.HORIZONTAL);
+ }
+ else if (getOrientation() == VERTICAL_SPLIT)
+ {
+ result.add(AccessibleState.VERTICAL);
+ }
+ return result;
}
/**
- * DOCUMENT ME!
+ * Returns the accessible role for the <code>JSplitPane</code> component.
*
- * @return DOCUMENT ME!
+ * @return {@link AccessibleRole#SPLIT_PANE}.
*/
public AccessibleRole getAccessibleRole()
{
- return null;
+ return AccessibleRole.SPLIT_PANE;
}
/**
- * DOCUMENT ME!
+ * Returns an object that provides access to the current, minimum and
+ * maximum values for the {@link JSlider}. Since this class implements
+ * {@link AccessibleValue}, it returns itself.
*
- * @return DOCUMENT ME!
+ * @return The accessible value.
*/
public AccessibleValue getAccessibleValue()
{
- return null;
+ return this;
}
/**
- * DOCUMENT ME!
+ * Returns the current divider location for the {@link JSplitPane}
+ * component, as an {@link Integer}.
*
- * @return DOCUMENT ME!
+ * @return The current divider location.
*/
public Number getCurrentAccessibleValue()
{
- return null;
+ return new Integer(getDividerLocation());
}
/**
- * DOCUMENT ME!
+ * Sets the divider location for the {@link JSplitPane} component and sends
+ * a {@link PropertyChangeEvent} (with the property name
+ * {@link AccessibleContext#ACCESSIBLE_VALUE_PROPERTY}) to all registered
+ * listeners. If the supplied value is <code>null</code>, this method
+ * does nothing and returns <code>false</code>.
*
- * @param value0 DOCUMENT ME!
+ * @param value the new slider value (<code>null</code> permitted).
*
- * @return DOCUMENT ME!
+ * @return <code>true</code> if the slider value is updated, and
+ * <code>false</code> otherwise.
*/
- public boolean setCurrentAccessibleValue(Number value0)
+ public boolean setCurrentAccessibleValue(Number value)
{
- return false;
+ if (value == null)
+ return false;
+ Number oldValue = getCurrentAccessibleValue();
+ setDividerLocation(value.intValue());
+ firePropertyChange(AccessibleContext.ACCESSIBLE_VALUE_PROPERTY, oldValue,
+ new Integer(value.intValue()));
+ return true;
}
/**
- * DOCUMENT ME!
+ * Returns the minimum divider location for the {@link JSplitPane}
+ * component, as an {@link Integer}.
*
- * @return DOCUMENT ME!
+ * @return The minimum divider location.
*/
public Number getMinimumAccessibleValue()
{
- return null;
+ return new Integer(getMinimumDividerLocation());
}
/**
- * DOCUMENT ME!
+ * Returns the maximum divider location for the {@link JSplitPane}
+ * component, as an {@link Integer}.
*
- * @return DOCUMENT ME!
+ * @return The maximum divider location.
*/
public Number getMaximumAccessibleValue()
{
- return null;
+ return new Integer(getMaximumDividerLocation());
}
}
@@ -223,6 +251,24 @@ public class JSplitPane extends JComponent implements Accessible
private transient double resizeWeight;
/**
+ * Indicates if the dividerSize property has been set by a client program or
+ * by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientDividerSizeSet = false;
+
+ /**
+ * Indicates if the oneTouchExpandable property has been set by a client
+ * program or by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientOneTouchExpandableSet = false;
+
+ /**
* Creates a new JSplitPane object with the given orientation, layout mode,
* and left and right components.
*
@@ -353,9 +399,11 @@ public class JSplitPane extends JComponent implements Accessible
}
/**
- * DOCUMENT ME!
+ * Returns the object that provides accessibility features for this
+ * <code>JSplitPane</code> component.
*
- * @return DOCUMENT ME!
+ * @return The accessible context (an instance of
+ * {@link AccessibleJSplitPane}).
*/
public AccessibleContext getAccessibleContext()
{
@@ -541,14 +589,27 @@ public class JSplitPane extends JComponent implements Accessible
}
/**
- * This method returns a String that describes this JSplitPane. The string
- * is primarily used for debugging purposes.
+ * Returns an implementation-dependent string describing the attributes of
+ * this <code>JSplitPane</code>.
*
- * @return A String used for debugging purposes.
+ * @return A string describing the attributes of this <code>JSplitPane</code>
+ * (never <code>null</code>).
*/
protected String paramString()
{
- return "JSplitPane";
+ // FIXME: the next line can be restored once PR27208 is fixed
+ String superParamStr = ""; //super.paramString();
+ StringBuffer sb = new StringBuffer();
+ sb.append(",continuousLayout=").append(isContinuousLayout());
+ sb.append(",dividerSize=").append(getDividerSize());
+ sb.append(",lastDividerLocation=").append(getLastDividerLocation());
+ sb.append(",oneTouchExpandable=").append(isOneTouchExpandable());
+ sb.append(",orientation=");
+ if (orientation == HORIZONTAL_SPLIT)
+ sb.append("HORIZONTAL_SPLIT");
+ else
+ sb.append("VERTICAL_SPLIT");
+ return superParamStr + sb.toString();
}
/**
@@ -652,16 +713,23 @@ public class JSplitPane extends JComponent implements Accessible
/**
* This method sets the location of the divider.
- *
- * @param location The location of the divider.
+ *
+ * @param location The location of the divider. The negative value forces to
+ * compute the new location from the preferred sizes of the split
+ * pane components.
*/
public void setDividerLocation(int location)
{
if (ui != null && location != getDividerLocation())
{
- int oldLocation = getDividerLocation();
- ((SplitPaneUI) ui).setDividerLocation(this, location);
- firePropertyChange(DIVIDER_LOCATION_PROPERTY, oldLocation, location);
+ int oldLocation = getDividerLocation();
+ if (location < 0)
+ ((SplitPaneUI) ui).resetToPreferredSizes(this);
+ else
+ ((SplitPaneUI) ui).setDividerLocation(this, location);
+
+ firePropertyChange(DIVIDER_LOCATION_PROPERTY, oldLocation,
+ getDividerLocation());
}
}
@@ -672,6 +740,7 @@ public class JSplitPane extends JComponent implements Accessible
*/
public void setDividerSize(int newSize)
{
+ clientDividerSizeSet = true;
if (newSize != dividerSize)
{
int oldSize = dividerSize;
@@ -723,6 +792,7 @@ public class JSplitPane extends JComponent implements Accessible
*/
public void setOneTouchExpandable(boolean newValue)
{
+ clientOneTouchExpandableSet = true;
if (newValue != oneTouchExpandable)
{
boolean oldValue = oneTouchExpandable;
@@ -733,11 +803,15 @@ public class JSplitPane extends JComponent implements Accessible
}
/**
- * This method sets the orientation of the JSplitPane.
+ * Sets the orientation for the <code>JSplitPane</code> and sends a
+ * {@link PropertyChangeEvent} (with the property name
+ * {@link #ORIENTATION_PROPERTY}) to all registered listeners.
*
- * @param orientation The orientation of the JSplitPane.
+ * @param orientation the orientation (either {@link #HORIZONTAL_SPLIT}
+ * or {@link #VERTICAL_SPLIT}).
*
- * @throws IllegalArgumentException DOCUMENT ME!
+ * @throws IllegalArgumentException if <code>orientation</code> is not one of
+ * the listed values.
*/
public void setOrientation(int orientation)
{
@@ -764,7 +838,14 @@ public class JSplitPane extends JComponent implements Accessible
*/
public void setResizeWeight(double value)
{
- resizeWeight = value;
+ if (value < 0.0 || value > 1.0)
+ throw new IllegalArgumentException("Value outside permitted range.");
+ if (this.resizeWeight != value)
+ {
+ double old = resizeWeight;
+ resizeWeight = value;
+ firePropertyChange(RESIZE_WEIGHT_PROPERTY, old, value);
+ }
}
/**
@@ -822,4 +903,42 @@ public class JSplitPane extends JComponent implements Accessible
{
return "SplitPaneUI";
}
+
+ /**
+ * Helper method for
+ * {@link LookAndFeel#installProperty(JComponent, String, Object)}.
+ *
+ * @param propertyName the name of the property
+ * @param value the value of the property
+ *
+ * @throws IllegalArgumentException if the specified property cannot be set
+ * by this method
+ * @throws ClassCastException if the property value does not match the
+ * property type
+ * @throws NullPointerException if <code>c</code> or
+ * <code>propertyValue</code> is <code>null</code>
+ */
+ void setUIProperty(String propertyName, Object value)
+ {
+ if (propertyName.equals("dividerSize"))
+ {
+ if (! clientDividerSizeSet)
+ {
+ setDividerSize(((Integer) value).intValue());
+ clientDividerSizeSet = false;
+ }
+ }
+ else if (propertyName.equals("oneTouchExpandable"))
+ {
+ if (! clientOneTouchExpandableSet)
+ {
+ setOneTouchExpandable(((Boolean) value).booleanValue());
+ clientOneTouchExpandableSet = false;
+ }
+ }
+ else
+ {
+ super.setUIProperty(propertyName, value);
+ }
+ }
}
diff --git a/javax/swing/JTabbedPane.java b/javax/swing/JTabbedPane.java
index 5581c521f..34ab8eeaa 100644
--- a/javax/swing/JTabbedPane.java
+++ b/javax/swing/JTabbedPane.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
@@ -102,6 +104,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* @param e the change event describing the change
*/
public void stateChanged(ChangeEvent e)
+ throws NotImplementedException
{
// Implement this properly.
}
@@ -113,6 +116,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* @return the accessible role of the <code>JTabbedPane</code>
*/
public AccessibleRole getAccessibleRole()
+ throws NotImplementedException
{
return null;
}
@@ -125,6 +129,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* <code>JTabbedPane</code>
*/
public int getAccessibleChildrenCount()
+ throws NotImplementedException
{
return 0;
}
@@ -153,6 +158,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* @return the current selection state of the <code>JTabbedPane</code>
*/
public AccessibleSelection getAccessibleSelection()
+ throws NotImplementedException
{
return null;
}
@@ -169,6 +175,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* this location
*/
public Accessible getAccessibleAt(Point p)
+ throws NotImplementedException
{
return null;
}
@@ -183,6 +190,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* <code>JTabbedPane</code>
*/
public int getAccessibleSelectionCount()
+ throws NotImplementedException
{
return 0;
}
@@ -195,6 +203,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* @return DOCUMENT ME!
*/
public Accessible getAccessibleSelection(int i)
+ throws NotImplementedException
{
return null;
}
@@ -207,6 +216,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* @return DOCUMENT ME!
*/
public boolean isAccessibleChildSelected(int i)
+ throws NotImplementedException
{
return false;
}
@@ -217,6 +227,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* @param i DOCUMENT ME!
*/
public void addAccessibleSelection(int i)
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
@@ -227,6 +238,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* @param i DOCUMENT ME!
*/
public void removeAccessibleSelection(int i)
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
@@ -235,6 +247,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* DOCUMENT ME!
*/
public void clearAccessibleSelection()
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
@@ -243,6 +256,7 @@ public class JTabbedPane extends JComponent implements Serializable,
* DOCUMENT ME!
*/
public void selectAllAccessibleSelection()
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
@@ -379,7 +393,12 @@ public class JTabbedPane extends JComponent implements Serializable,
*/
public Color getBackground()
{
- return bg;
+ Color background;
+ if (bg == null)
+ background = JTabbedPane.this.getBackground();
+ else
+ background = bg;
+ return background;
}
/**
@@ -399,7 +418,12 @@ public class JTabbedPane extends JComponent implements Serializable,
*/
public Color getForeground()
{
- return fg;
+ Color foreground;
+ if (fg == null)
+ foreground = JTabbedPane.this.getForeground();
+ else
+ foreground = fg;
+ return foreground;
}
/**
@@ -585,12 +609,14 @@ public class JTabbedPane extends JComponent implements Serializable,
}
public AccessibleStateSet getAccessibleStateSet()
+ throws NotImplementedException
{
// FIXME: Implement this properly.
return null;
}
public int getAccessibleIndexInParent()
+ throws NotImplementedException
{
// FIXME: Implement this properly.
return 0;
@@ -949,7 +975,11 @@ public class JTabbedPane extends JComponent implements Serializable,
*/
public Component getSelectedComponent()
{
- return getComponentAt(getSelectedIndex());
+ int selectedIndex = getSelectedIndex();
+ Component selected = null;
+ if (selectedIndex >= 0)
+ selected = getComponentAt(selectedIndex);
+ return selected;
}
/**
@@ -1143,8 +1173,45 @@ public class JTabbedPane extends JComponent implements Serializable,
public void removeTabAt(int index)
{
checkIndex(index, 0, tabs.size());
+
+ // We need to adjust the selection if we remove a tab that comes
+ // before the selected tab or if the selected tab is removed.
+ // This decrements the selected index by 1 if any of this is the case.
+ // Note that this covers all cases:
+ // - When the selected tab comes after the removed tab, this simply
+ // adjusts the selection so that after the removal the selected tab
+ // is still the same.
+ // - When we remove the currently selected tab, then the tab before the
+ // selected tab gets selected.
+ // - When the last tab is removed, then we have an index==0, which gets
+ // decremented to -1, which means no selection, which is 100% perfect.
+ int selectedIndex = getSelectedIndex();
+ if (selectedIndex >= index)
+ setSelectedIndex(selectedIndex - 1);
+
+ Component comp = getComponentAt(index);
+
+ // Remove the tab object.
tabs.remove(index);
- getComponentAt(index).show();
+
+ // Remove the component. I think we cannot assume that the tab order
+ // is equal to the component order, so we iterate over the children
+ // here to find the and remove the correct component.
+ if (comp != null)
+ {
+ Component[] children = getComponents();
+ for (int i = children.length - 1; i >= 0; --i)
+ {
+ if (children[i] == comp)
+ {
+ super.remove(i);
+ comp.setVisible(true);
+ break;
+ }
+ }
+ }
+ revalidate();
+ repaint();
}
/**
@@ -1174,7 +1241,8 @@ public class JTabbedPane extends JComponent implements Serializable,
*/
public void removeAll()
{
- for (int i = tabs.size() - 1; i >= 0; i--)
+ setSelectedIndex(-1);
+ for (int i = getTabCount() - 1; i >= 0; i--)
removeTabAt(i);
}
diff --git a/javax/swing/JTable.java b/javax/swing/JTable.java
index 43780f2bc..348534469 100644
--- a/javax/swing/JTable.java
+++ b/javax/swing/JTable.java
@@ -1018,19 +1018,7 @@ public class JTable
* The CheckBox that is used for rendering.
*/
private final JCheckBox checkBox = new JCheckBox();
-
- /**
- * The check box must have the text field background and be centered.
- */
- private BooleanCellRenderer()
- {
- // Render the checkbox identically as the text field.
- JTextField f = new JTextField();
- checkBox.setForeground(f.getForeground());
- checkBox.setBackground(f.getBackground());
- checkBox.setHorizontalAlignment(SwingConstants.CENTER);
- }
-
+
/**
* Get the check box.
*/
@@ -1041,14 +1029,13 @@ public class JTable
/**
* Returns the component that is used for rendering the value.
- *
+ *
* @param table the JTable
* @param value the value of the object
* @param isSelected is the cell selected?
* @param hasFocus has the cell the focus?
* @param row the row to render
* @param column the cell to render
- *
* @return this component (the default table cell renderer)
*/
public Component getTableCellRendererComponent(JTable table, Object value,
@@ -1056,6 +1043,32 @@ public class JTable
boolean hasFocus, int row,
int column)
{
+ if (isSelected)
+ {
+ checkBox.setBackground(table.getSelectionBackground());
+ checkBox.setForeground(table.getSelectionForeground());
+ }
+ else
+ {
+ checkBox.setBackground(table.getBackground());
+ checkBox.setForeground(table.getForeground());
+ }
+
+ if (hasFocus)
+ {
+ checkBox.setBorder(
+ UIManager.getBorder("Table.focusCellHighlightBorder"));
+ if (table.isCellEditable(row, column))
+ {
+ checkBox.setBackground(
+ UIManager.getColor("Table.focusCellBackground"));
+ checkBox.setForeground(
+ UIManager.getColor("Table.focusCellForeground"));
+ }
+ }
+ else
+ checkBox.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
+
// Null is rendered as false.
if (value == null)
checkBox.setSelected(false);
@@ -1233,8 +1246,12 @@ public class JTable
{
Icon iconValue = (Icon) value;
setIcon(iconValue);
- setText("");
}
+ else
+ {
+ setIcon(null);
+ }
+ setText("");
return this;
}
}
@@ -1253,22 +1270,18 @@ public class JTable
*/
TableTextField()
{
- setBorder(null);
+ setBorder(BorderFactory.createLineBorder(getGridColor(), 2));
}
/**
- * Scroll the table, making the given rectangle of this component
- * visible. Mind the component position with relate to the table.
* With not this method overridden, the scroll pane scrolls to the
* top left cornec (untranslated position of the caret) after the first
- * keystroke.
+ * keystroke.
*/
public void scrollRectToVisible(Rectangle r)
{
- // In private class we known that the rectangle data will not be
- // reused and we need not to clone it.
- r.translate(getX(), getY());
- super.scrollRectToVisible(r);
+ // Do nothing here. If the editing session starts outside the visible
+ // bounds, the editCellAt will scroll.
}
}
@@ -1317,7 +1330,6 @@ public class JTable
*/
public static final int AUTO_RESIZE_LAST_COLUMN = 3;
-
/**
* A table mapping {@link java.lang.Class} objects to
* {@link TableCellEditor} objects. This table is consulted by the
@@ -1567,6 +1579,15 @@ public class JTable
private Rectangle rectCache = new Rectangle();
/**
+ * Indicates if the rowHeight property has been set by a client program or by
+ * the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientRowHeightSet = false;
+
+ /**
* Creates a new <code>JTable</code> instance.
*/
public JTable ()
@@ -1643,13 +1664,22 @@ public class JTable
public JTable (TableModel dm, TableColumnModel cm, ListSelectionModel sm)
{
boolean autoCreate = false;
+ TableColumnModel columnModel;
if (cm != null)
- setColumnModel(cm);
+ columnModel = cm;
else
{
- setColumnModel(createDefaultColumnModel());
+ columnModel = createDefaultColumnModel();
autoCreate = true;
- }
+ }
+
+ // Initialise the intercelar spacing before setting the column model to
+ // avoid firing unnecessary events.
+ // The initial incellar spacing is new Dimenstion(1,1).
+ rowMargin = 1;
+ columnModel.setColumnMargin(1);
+ setColumnModel(columnModel);
+
setSelectionModel(sm == null ? createDefaultSelectionModel() : sm);
setModel(dm == null ? createDefaultDataModel() : dm);
setAutoCreateColumnsFromModel(autoCreate);
@@ -1709,7 +1739,6 @@ public class JTable
this.showVerticalLines = true;
this.editingColumn = -1;
this.editingRow = -1;
- setIntercellSpacing(new Dimension(1,1));
}
/**
@@ -1856,13 +1885,38 @@ public class JTable
}
/**
- * Invoked when the the column selection changes.
+ * Invoked when the the column selection changes, repaints the changed
+ * columns. It is not recommended to override this method, register the
+ * listener instead.
*/
public void columnSelectionChanged (ListSelectionEvent event)
{
- repaint();
+ // Does not make sense for the table with the single column.
+ if (getColumnCount() < 2)
+ return;
+
+ int x0 = 0;
+
+ // We must limit the indices to the bounds of the JTable's model, because
+ // we might get values of -1 or greater then columnCount in the case
+ // when columns get removed.
+ int idx0 = Math.max(0, Math.min(getColumnCount() - 1,
+ event.getFirstIndex()));
+ int idxn = Math.max(0, Math.min(getColumnCount() - 1,
+ event.getLastIndex()));
+ int i;
+
+ for (i = 0; i < idx0; i++)
+ x0 += columnModel.getColumn(i).getWidth();
+
+ int xn = x0;
+
+ for (i = idx0; i <= idxn; i++)
+ xn += columnModel.getColumn(i).getWidth();
+
+ repaint(x0, 0, xn-x0, getHeight());
}
-
+
/**
* Invoked when the editing is cancelled.
*/
@@ -1910,9 +1964,33 @@ public class JTable
// affect the size parameters of the JTable. Otherwise we only need
// to perform a repaint to update the view.
if (event == null || event.getType() == TableModelEvent.INSERT)
- revalidate();
+ {
+ // Sync selection model with data model.
+ if (event != null)
+ {
+ int first = event.getFirstRow();
+ if (first < 0)
+ first = 0;
+ int last = event.getLastRow();
+ if (last < 0)
+ last = getRowCount() - 1;
+ selectionModel.insertIndexInterval(first, last - first + 1, true);
+ }
+ revalidate();
+ }
if (event == null || event.getType() == TableModelEvent.DELETE)
{
+ // Sync selection model with data model.
+ if (event != null)
+ {
+ int first = event.getFirstRow();
+ if (first < 0)
+ first = 0;
+ int last = event.getLastRow();
+ if (last < 0)
+ last = getRowCount() - 1;
+ selectionModel.removeIndexInterval(first, last);
+ }
if (dataModel.getRowCount() == 0)
clearSelection();
revalidate();
@@ -1921,11 +1999,19 @@ public class JTable
}
/**
- * Invoked when another table row is selected.
+ * Invoked when another table row is selected. It is not recommended
+ * to override thid method, register the listener instead.
*/
public void valueChanged (ListSelectionEvent event)
{
- repaint();
+ // Does not make sense for the table with the single row.
+ if (getRowCount() < 2)
+ return;
+
+ int y_gap = rowMargin;
+ int y0 = (getRowHeight() + y_gap) * (event.getFirstIndex());
+ int yn = (getRowHeight() + y_gap) * (event.getLastIndex()+1);
+ repaint(0, y0, getWidth(), yn-y0);
}
/**
@@ -1938,21 +2024,18 @@ public class JTable
*/
public int columnAtPoint(Point point)
{
- if (point != null)
- {
- int ncols = getColumnCount();
- Dimension gap = getIntercellSpacing();
- TableColumnModel cols = getColumnModel();
- int x = point.x;
+ int ncols = getColumnCount();
+ Dimension gap = getIntercellSpacing();
+ TableColumnModel cols = getColumnModel();
+ int x = point.x;
- for (int i = 0; i < ncols; ++i)
- {
- int width = cols.getColumn(i).getWidth()
- + (gap == null ? 0 : gap.width);
- if (0 <= x && x < width)
- return i;
- x -= width;
- }
+ for (int i = 0; i < ncols; ++i)
+ {
+ int width = cols.getColumn(i).getWidth()
+ + (gap == null ? 0 : gap.width);
+ if (0 <= x && x < width)
+ return i;
+ x -= width;
}
return -1;
}
@@ -1961,8 +2044,7 @@ public class JTable
* Returns index of the row that contains specified point or -1 if this table
* doesn't contain this point.
*
- * @param point
- * point to identify the row
+ * @param point point to identify the row
* @return index of the row that contains specified point or -1 if this table
* doesn't contain this point.
*/
@@ -2004,9 +2086,6 @@ public class JTable
int column,
boolean includeSpacing)
{
- // moveToCellBeingEdited expects the cached value and clones it.
- // If the caching would be removed later, uplate moveToCellBeingEdited
- // as well.
int height = getRowHeight(row);
int width = columnModel.getColumn(column).getWidth();
int x_gap = columnModel.getColumnMargin();
@@ -2020,12 +2099,14 @@ public class JTable
for (int i = 0; i < column; ++i)
x += columnModel.getColumn(i).getWidth();
+
+ Rectangle rect = new Rectangle();
if (includeSpacing)
- rectCache.setBounds(x, y, width, height +y_gap);
+ rect.setBounds(x, y, width, height +y_gap);
else
- rectCache.setBounds(x, y, width - x_gap, height);
- return rectCache;
+ rect.setBounds(x, y, width - x_gap, height);
+ return rect;
}
public void clearSelection()
@@ -2088,26 +2169,39 @@ public class JTable
else
return true;
}
-
- public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
+
+ /**
+ * Return the preferred scrolling amount (in pixels) for the given scrolling
+ * direction and orientation. This method handles a partially exposed row by
+ * returning the distance required to completely expose the item. When
+ * scrolling the top item is completely exposed.
+ *
+ * @param visibleRect the currently visible part of the component.
+ * @param orientation the scrolling orientation
+ * @param direction the scrolling direction (negative - up, positive -down).
+ * The values greater than one means that more mouse wheel or similar
+ * events were generated, and hence it is better to scroll the longer
+ * distance.
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+ public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation,
+ int direction)
{
- // FIXME: I don't exactly know what sun does here. in both cases they
- // pick values which do *not* simply expose the next cell in a given
- // scroll direction.
+ int h = (rowHeight + rowMargin);
+ int delta = h * direction;
+ // Round so that the top would start from the row boundary
if (orientation == SwingConstants.VERTICAL)
- return direction * rowHeight;
- else
{
- int sum = 0;
- for (int i = 0; i < getColumnCount(); ++i)
- sum += columnModel.getColumn(0).getWidth();
- int inc = getColumnCount() == 0 ? 10 : sum / getColumnCount();
- return direction * inc;
+ // Completely expose the top row
+ int near = ((visibleRect.y + delta + h / 2) / h) * h;
+ int diff = visibleRect.y + delta - near;
+ delta -= diff;
}
+ return delta;
+ // TODO when scrollng horizontally, scroll into the column boundary.
}
-
/**
* Get the cell editor, suitable for editing the given cell. The default
* method requests the editor from the column model. If the column model does
@@ -2372,7 +2466,7 @@ public class JTable
/**
* Get the value of the <code>columnCount</code> property by
- * delegation to the @{link #columnModel} field.
+ * delegation to the {@link #columnModel} field.
*
* @return The current value of the columnCount property
*/
@@ -2383,7 +2477,7 @@ public class JTable
/**
* Get the value of the <code>rowCount</code> property by
- * delegation to the @{link #dataModel} field.
+ * delegation to the {@link #dataModel} field.
*
* @return The current value of the rowCount property
*/
@@ -2404,7 +2498,7 @@ public class JTable
/**
* Get the value of the <code>selectedColumn</code> property by
- * delegation to the @{link #columnModel} field.
+ * delegation to the {@link #columnModel} field.
*
* @return The current value of the selectedColumn property
*/
@@ -2473,7 +2567,7 @@ public class JTable
/**
* Get the value of the <code>selectedColumnCount</code> property by
- * delegation to the @{link #columnModel} field.
+ * delegation to the {@link #columnModel} field.
*
* @return The current value of the selectedColumnCount property
*/
@@ -2484,7 +2578,7 @@ public class JTable
/**
* Get the value of the <code>selectedColumns</code> property by
- * delegation to the @{link #columnModel} field.
+ * delegation to the {@link #columnModel} field.
*
* @return The current value of the selectedColumns property
*/
@@ -2505,7 +2599,7 @@ public class JTable
/**
* Get the value of the <code>selectedRowCount</code> property by
- * delegation to the @{link #selectionModel} field.
+ * delegation to the {@link #selectionModel} field.
*
* @return The current value of the selectedRowCount property
*/
@@ -2516,7 +2610,7 @@ public class JTable
/**
* Get the value of the <code>selectedRows</code> property by
- * delegation to the @{link #selectionModel} field.
+ * delegation to the {@link #selectionModel} field.
*
* @return The current value of the selectedRows property
*/
@@ -2694,7 +2788,9 @@ public class JTable
{
if (r < 1)
throw new IllegalArgumentException();
-
+
+ clientRowHeightSet = true;
+
rowHeight = r;
revalidate();
repaint();
@@ -3499,8 +3595,7 @@ public class JTable
}
/**
- * Set value for the cell at the given position. If the cell is not
- * editable, this method returns without action. The modified cell is
+ * Set value for the cell at the given position. The modified cell is
* repainted.
*
* @param value the value to set
@@ -3509,8 +3604,6 @@ public class JTable
*/
public void setValueAt(Object value, int row, int column)
{
- if (!isCellEditable(row, column))
- return;
dataModel.setValueAt(value, row, convertColumnIndexToModel(column));
repaint(getCellRect(row, column, true));
@@ -3658,18 +3751,14 @@ public class JTable
private void moveToCellBeingEdited(Component component)
{
Rectangle r = getCellRect(editingRow, editingColumn, true);
- // Place the text field so that it would not touch the table
- // border.
-
- // TODO Figure out while 5 and which constant should here be.
- int xOffset = 5;
- r.x+=xOffset;
- r.y++;
- r.width -=xOffset;
- r.height --;
-
- // Clone rectangle as getCellRect returns the cached value.
- component.setBounds(new Rectangle(r));
+ // Adjust bounding box of the editing component, so that it lies
+ // 'above' the grid on all edges, not only right and bottom.
+ // The table grid is painted only at the right and bottom edge of a cell.
+ r.x -= 1;
+ r.y -= 1;
+ r.width += 1;
+ r.height += 1;
+ component.setBounds(r);
}
/**
@@ -3747,4 +3836,34 @@ public class JTable
// TODO: Implement functionality of this property (in UI impl).
return surrendersFocusOnKeystroke;
}
+
+ /**
+ * Helper method for
+ * {@link LookAndFeel#installProperty(JComponent, String, Object)}.
+ *
+ * @param propertyName the name of the property
+ * @param value the value of the property
+ *
+ * @throws IllegalArgumentException if the specified property cannot be set
+ * by this method
+ * @throws ClassCastException if the property value does not match the
+ * property type
+ * @throws NullPointerException if <code>c</code> or
+ * <code>propertyValue</code> is <code>null</code>
+ */
+ void setUIProperty(String propertyName, Object value)
+ {
+ if (propertyName.equals("rowHeight"))
+ {
+ if (! clientRowHeightSet)
+ {
+ setRowHeight(((Integer) value).intValue());
+ clientRowHeightSet = false;
+ }
+ }
+ else
+ {
+ super.setUIProperty(propertyName, value);
+ }
+ }
}
diff --git a/javax/swing/JTextField.java b/javax/swing/JTextField.java
index 01c5c06a3..367503b73 100644
--- a/javax/swing/JTextField.java
+++ b/javax/swing/JTextField.java
@@ -1,5 +1,5 @@
/* JTextField.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -42,6 +42,7 @@ import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Insets;
+import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
@@ -110,8 +111,7 @@ public class JTextField extends JTextComponent
private int columns;
private int align;
- private int scrollOffset;
-
+
/** @since 1.3 */
private Action action;
@@ -184,6 +184,9 @@ public class JTextField extends JTextComponent
this.columns = columns;
+ // Initialize the horizontal visibility model.
+ horizontalVisibility = new DefaultBoundedRangeModel();
+
setDocument(doc == null ? createDefaultModel() : doc);
if (text != null)
@@ -191,9 +194,6 @@ public class JTextField extends JTextComponent
// default value for alignment
align = LEADING;
-
- // Initialize the horizontal visibility model.
- horizontalVisibility = new DefaultBoundedRangeModel();
}
/**
@@ -270,7 +270,7 @@ public class JTextField extends JTextComponent
*/
protected void fireActionPerformed()
{
- ActionEvent event = new ActionEvent(this, 0, notifyAction);
+ ActionEvent event = new ActionEvent(this, 0, getText());
ActionListener[] listeners = getActionListeners();
for (int index = 0; index < listeners.length; ++index)
@@ -368,8 +368,7 @@ public class JTextField extends JTextComponent
*/
public int getScrollOffset()
{
- //FIXME: this should return horizontalVisibility's value
- return scrollOffset;
+ return horizontalVisibility.getValue();
}
/**
@@ -379,8 +378,13 @@ public class JTextField extends JTextComponent
*/
public void setScrollOffset(int offset)
{
- //FIXME: this should actualy scroll the field if needed
- scrollOffset = offset;
+ // Automatically sets to the highest possible value if
+ // offset is bigger than that.
+ horizontalVisibility.setValue(
+ Math.min(horizontalVisibility.getMaximum()
+ - horizontalVisibility.getExtent(),
+ offset));
+
}
/**
@@ -525,9 +529,6 @@ public class JTextField extends JTextComponent
*/
public BoundedRangeModel getHorizontalVisibility()
{
- // TODO: The real implementation of this property is still missing.
- // However, this is not done in JTextField but must instead be handled in
- // javax.swing.text.FieldView.
return horizontalVisibility;
}
@@ -544,4 +545,25 @@ public class JTextField extends JTextComponent
{
return ! (getParent() instanceof JViewport);
}
+
+ public void scrollRectToVisible(Rectangle r)
+ {
+ int v = horizontalVisibility.getValue();
+
+ // The extent value is the inner width of the text field.
+ int e = horizontalVisibility.getExtent();
+ Insets i = getInsets();
+
+ // The x value in the rectangle (usually) denotes the new location
+ // of the caret. We check whether the location lies inside the left or
+ // right border and scroll into the appropriate direction.
+ // The calculation has to be shifted by the BoundedRangeModel's value
+ // because that value was already used to calculate r.x (this happens
+ // as part of a modelToView() call in FieldView).
+ if (r.x < i.left)
+ setScrollOffset(v + r.x - i.left);
+ else if (r.x > e + i.left)
+ setScrollOffset(r.x + v - e - i.left);
+ }
+
}
diff --git a/javax/swing/JToolBar.java b/javax/swing/JToolBar.java
index 488e106e8..fe4d2ae20 100644
--- a/javax/swing/JToolBar.java
+++ b/javax/swing/JToolBar.java
@@ -1,5 +1,5 @@
/* JToolBar.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -50,7 +50,6 @@ import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.accessibility.AccessibleStateSet;
-import javax.swing.JButton;
import javax.swing.plaf.ToolBarUI;
/**
@@ -66,17 +65,15 @@ import javax.swing.plaf.ToolBarUI;
public class JToolBar extends JComponent implements SwingConstants, Accessible
{
/**
- * AccessibleJToolBar
+ * Provides the accessibility features for the <code>JToolBar</code>
+ * component.
*/
- // FIXME: This inner class is a complete stub and must be implemented
- // properly.
protected class AccessibleJToolBar extends AccessibleJComponent
{
- /** DOCUMENT ME! */
private static final long serialVersionUID = -5516888265903814215L;
/**
- * Constructor AccessibleJToolBar
+ * Creates a new <code>AccessibleJToolBar</code> instance.
*/
protected AccessibleJToolBar()
{
@@ -84,19 +81,23 @@ public class JToolBar extends JComponent implements SwingConstants, Accessible
}
/**
- * getAccessibleStateSet
+ * Returns a set containing the current state of the {@link JToolBar}
+ * component. The current implementation simply calls the superclass.
*
- * @return AccessibleStateSet
+ * @return The accessible state set.
*/
public AccessibleStateSet getAccessibleStateSet()
{
- return null; // TODO
+ // running tests against the reference implementation, I was unable
+ // to find any state information that is set specifically by the
+ // tool bar...
+ return super.getAccessibleStateSet();
}
/**
- * getAccessibleRole
+ * Returns the accessible role for the <code>JToolBar</code> component.
*
- * @return AccessibleRole
+ * @return {@link AccessibleRole#TOOL_BAR}.
*/
public AccessibleRole getAccessibleRole()
{
@@ -756,19 +757,34 @@ public class JToolBar extends JComponent implements SwingConstants, Accessible
} // addImpl()
/**
- * This method returns a String description of the JToolBar.
+ * Returns a string describing the attributes for the <code>JToolBar</code>
+ * component, for use in debugging. The return value is guaranteed to be
+ * non-<code>null</code>, but the format of the string may vary between
+ * implementations.
*
- * @return A String description of the JToolBar.
+ * @return A string describing the attributes of the <code>JToolBar</code>.
*/
protected String paramString()
{
- return "JToolBar";
- } // paramString()
+ StringBuffer sb = new StringBuffer(super.paramString());
+ sb.append(",floatable=").append(floatable);
+ sb.append(",margin=");
+ if (margin != null)
+ sb.append(margin);
+ sb.append(",orientation=");
+ if (orientation == HORIZONTAL)
+ sb.append("HORIZONTAL");
+ else
+ sb.append(VERTICAL);
+ sb.append(",paintBorder=").append(paintBorder);
+ return sb.toString();
+ }
/**
- * getAccessibleContext
+ * Returns the object that provides accessibility features for this
+ * <code>JToolBar</code> component.
*
- * @return AccessibleContext
+ * @return The accessible context (an instance of {@link AccessibleJToolBar}).
*/
public AccessibleContext getAccessibleContext()
{
diff --git a/javax/swing/JToolTip.java b/javax/swing/JToolTip.java
index 6d00b1dc8..836c122c6 100644
--- a/javax/swing/JToolTip.java
+++ b/javax/swing/JToolTip.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package javax.swing;
import java.awt.AWTEvent;
+import java.beans.PropertyChangeEvent;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
@@ -52,14 +53,13 @@ import javax.swing.plaf.ToolTipUI;
*/
public class JToolTip extends JComponent implements Accessible
{
- /** DOCUMENT ME! */
+
private static final long serialVersionUID = -1138929898906751643L;
/**
- * DOCUMENT ME!
+ * Provides the accessibility features for the <code>JToolTip</code>
+ * component.
*/
- // FIXME: This inner class is a complete stub and must be implemented
- // properly.
protected class AccessibleJToolTip extends AccessibleJComponent
{
private static final long serialVersionUID = -6222548177795408476L;
@@ -73,34 +73,37 @@ public class JToolTip extends JComponent implements Accessible
}
/**
- * DOCUMENT ME!
+ * Returns a description for the accessible component.
*
- * @return DOCUMENT ME!
+ * @return A description for the accessible component.
*/
public String getAccessibleDescription()
{
- return null;
+ String result = super.getAccessibleDescription();
+ if (result == null)
+ result = text;
+ return result;
}
/**
- * DOCUMENT ME!
+ * Returns the accessible role for the <code>JToolTip</code> component.
*
- * @return DOCUMENT ME!
+ * @return {@link AccessibleRole#TOOL_TIP}.
*/
public AccessibleRole getAccessibleRole()
{
- return null;
+ return AccessibleRole.TOOL_TIP;
}
}
/** The text to display in the JToolTip. */
String text;
- /** The JComponent this JToolTip is used for. */
+ /** The component that the tool tip is associated with. */
JComponent component;
/**
- * Creates a new JToolTip object.
+ * Creates a new <code>JToolTip</code> instance.
*/
public JToolTip()
{
@@ -109,9 +112,11 @@ public class JToolTip extends JComponent implements Accessible
}
/**
- * This method returns the text this JToolTip displays.
+ * Returns the text displayed by the tool tip.
*
- * @return The text that this JToolTip displays.
+ * @return The text (possibly <code>null</code>).
+ *
+ * @see #setTipText(String)
*/
public String getTipText()
{
@@ -119,19 +124,24 @@ public class JToolTip extends JComponent implements Accessible
}
/**
- * DOCUMENT ME!
+ * Returns the object that provides accessibility features for this
+ * <code>JToolTip</code> component.
*
- * @return DOCUMENT ME!
+ * @return The accessible context (an instance of {@link AccessibleJToolTip}).
*/
public AccessibleContext getAccessibleContext()
{
- return null;
+ if (accessibleContext == null)
+ accessibleContext = new AccessibleJToolTip();
+ return accessibleContext;
}
/**
- * This method returns the JComponent this JToolTip displays for.
+ * Returns the component that the tool tip is associated with.
*
- * @return The JComponent this JToolTip displays for.
+ * @return The component (possibly <code>null</code>).
+ *
+ * @see #setComponent(JComponent)
*/
public JComponent getComponent()
{
@@ -139,9 +149,9 @@ public class JToolTip extends JComponent implements Accessible
}
/**
- * This method returns the UI responsible for displaying this JToolTip.
+ * Returns the current UI delegate for this component.
*
- * @return The UI responsible for displaying this JToolTip.
+ * @return The UI delegate.
*/
public ToolTipUI getUI()
{
@@ -149,9 +159,10 @@ public class JToolTip extends JComponent implements Accessible
}
/**
- * This method returns the String identifier for the UI class.
+ * Returns the string suffix used to identify the UI class, in this case
+ * <code>"ToolTipUI"</code>.
*
- * @return The String identifier for the UI class.
+ * @return <code>"ToolTipUI"</code>.
*/
public String getUIClassID()
{
@@ -159,33 +170,52 @@ public class JToolTip extends JComponent implements Accessible
}
/**
- * This method returns a debugging String describing the JToolTip.
+ * Returns a string describing the attributes for the <code>JToolTip</code>
+ * component, for use in debugging. The return value is guaranteed to be
+ * non-<code>null</code>, but the format of the string may vary between
+ * implementations.
*
- * @return A debugging String describing the JToolTip.
+ * @return A string describing the attributes of the <code>JToolTip</code>.
*/
protected String paramString()
{
- return "JToolTip";
+ StringBuffer sb = new StringBuffer(super.paramString());
+ sb.append(",tiptext=");
+ if (text != null);
+ sb.append(text);
+ return sb.toString();
}
/**
- * This method sets the JComponent that the JToolTip displays for.
+ * Sets the component that the tool tip is associated with and sends a
+ * {@link PropertyChangeEvent} (with the property name 'component') to all
+ * registered listeners.
*
- * @param c The JComponent that the JToolTip displays for.
+ * @param c the component (<code>null</code> permitted).
+ *
+ * @see #getComponent()
*/
public void setComponent(JComponent c)
{
+ JComponent oldValue = component;
component = c;
+ firePropertyChange("component", oldValue, c);
}
/**
- * This method sets the text that the JToolTip displays.
+ * Sets the text to be displayed by the tool tip and sends a
+ * {@link PropertyChangeEvent} (with the property name 'tiptext') to all
+ * registered listeners.
*
- * @param tipText The text that the JToolTip displays.
+ * @param tipText the text (<code>null</code> permitted).
+ *
+ * @see #getTipText()
*/
public void setTipText(String tipText)
{
+ String oldValue = text;
text = tipText;
+ firePropertyChange("tiptext", oldValue, tipText);
}
/**
diff --git a/javax/swing/JTree.java b/javax/swing/JTree.java
index 7876eeb6a..e3b8b7e7c 100644
--- a/javax/swing/JTree.java
+++ b/javax/swing/JTree.java
@@ -1276,10 +1276,16 @@ public class JTree extends JComponent implements Scrollable, Accessible
*/
public void valueChanged(TreeSelectionEvent ev)
{
- TreeSelectionEvent rewritten =
+ TreeSelectionEvent rewritten =
(TreeSelectionEvent) ev.cloneWithSource(JTree.this);
fireValueChanged(rewritten);
- JTree.this.repaint();
+
+ // Only repaint the changed nodes.
+ TreePath[] changed = ev.getPaths();
+ for (int i = 0; i < changed.length; i++)
+ {
+ repaint(getPathBounds(changed[i]));
+ }
}
}
@@ -1396,8 +1402,6 @@ public class JTree extends JComponent implements Scrollable, Accessible
private TreePath anchorSelectionPath;
- private TreePath leadSelectionPath;
-
/**
* This contains the state of all nodes in the tree. Al/ entries map the
* TreePath of a note to to its state. Valid states are EXPANDED and
@@ -1443,6 +1447,33 @@ public class JTree extends JComponent implements Scrollable, Accessible
new TreeSelectionRedirector();
/**
+ * Indicates if the rowHeight property has been set by a client
+ * program or by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientRowHeightSet = false;
+
+ /**
+ * Indicates if the scrollsOnExpand property has been set by a client
+ * program or by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientScrollsOnExpandSet = false;
+
+ /**
+ * Indicates if the showsRootHandles property has been set by a client
+ * program or by the UI.
+ *
+ * @see #setUIProperty(String, Object)
+ * @see LookAndFeel#installProperty(JComponent, String, Object)
+ */
+ private boolean clientShowsRootHandlesSet = false;
+
+ /**
* Creates a new <code>JTree</code> object.
*/
public JTree()
@@ -1477,8 +1508,8 @@ public class JTree extends JComponent implements Scrollable, Accessible
*/
public JTree(TreeModel model)
{
- updateUI();
setRootVisible(true);
+ // The setModel also calls the updateUI
setModel(model);
setSelectionModel(new EmptySelectionModel());
selectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
@@ -1535,7 +1566,15 @@ public class JTree extends JComponent implements Scrollable, Accessible
TreeUI ui = getUI();
return ui != null ? ui.getPathForRow(this, row) : null;
}
-
+
+ /**
+ * Get the pathes that are displayes between the two given rows.
+ *
+ * @param index0 the starting row, inclusive
+ * @param index1 the ending row, inclusive
+ *
+ * @return the array of the tree pathes
+ */
protected TreePath[] getPathBetweenRows(int index0, int index1)
{
TreeUI ui = getUI();
@@ -1619,19 +1658,48 @@ public class JTree extends JComponent implements Scrollable, Accessible
*/
public Dimension getPreferredScrollableViewportSize()
{
- return new Dimension (getPreferredSize().width, getVisibleRowCount()*getRowHeight());
+ return getPreferredSize();
}
-
- public int getScrollableUnitIncrement(Rectangle visibleRect,
- int orientation, int direction)
+
+ /**
+ * Return the preferred scrolling amount (in pixels) for the given scrolling
+ * direction and orientation. This method handles a partially exposed row by
+ * returning the distance required to completely expose the item.
+ *
+ * @param visibleRect the currently visible part of the component.
+ * @param orientation the scrolling orientation
+ * @param direction the scrolling direction (negative - up, positive -down).
+ * The values greater than one means that more mouse wheel or similar
+ * events were generated, and hence it is better to scroll the longer
+ * distance.
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+ public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation,
+ int direction)
{
- return 1;
+ int delta;
+
+ // Round so that the top would start from the row boundary
+ if (orientation == SwingConstants.VERTICAL)
+ {
+ // One pixel down, otherwise picks another row too high.
+ int row = getClosestRowForLocation(visibleRect.x, visibleRect.y + 1);
+ row = row + direction;
+ if (row < 0)
+ row = 0;
+
+ Rectangle newTop = getRowBounds(row);
+ delta = newTop.y - visibleRect.y;
+ }
+ else
+ delta = direction * rowHeight == 0 ? 20 : rowHeight;
+ return delta;
}
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation, int direction)
{
- return 1;
+ return getScrollableUnitIncrement(visibleRect, orientation, direction);
}
public boolean getScrollableTracksViewportHeight()
@@ -1885,9 +1953,19 @@ public class JTree extends JComponent implements Scrollable, Accessible
if (rootVisible == flag)
return;
+ // If the root is currently selected, unselect it
+ if (rootVisible && !flag)
+ {
+ TreeSelectionModel model = getSelectionModel();
+ // The root is always shown in the first row
+ TreePath rootPath = getPathForRow(0);
+ model.removeSelectionPath(rootPath);
+ }
+
boolean oldValue = rootVisible;
rootVisible = flag;
firePropertyChange(ROOT_VISIBLE_PROPERTY, oldValue, flag);
+
}
public boolean getShowsRootHandles()
@@ -1897,6 +1975,8 @@ public class JTree extends JComponent implements Scrollable, Accessible
public void setShowsRootHandles(boolean flag)
{
+ clientShowsRootHandlesSet = true;
+
if (showsRootHandles == flag)
return;
@@ -1996,6 +2076,8 @@ public class JTree extends JComponent implements Scrollable, Accessible
public void setRowHeight(int height)
{
+ clientRowHeightSet = true;
+
if (rowHeight == height)
return;
@@ -2050,27 +2132,8 @@ public class JTree extends JComponent implements Scrollable, Accessible
{
if (path == null)
return;
-
- Object[] oPath = path.getPath();
- TreePath temp = new TreePath(oPath[0]);
- boolean stop = false;
- int i = 1;
- while (!stop)
- {
- while (isVisible(temp))
- if (i < oPath.length)
- temp = temp.pathByAddingChild(oPath[i++]);
- else
- {
- stop = true;
- break;
- }
- makeVisible(temp);
- }
Rectangle rect = getPathBounds(path);
scrollRectToVisible(rect);
- revalidate();
- repaint();
}
public void scrollRowToVisible(int row)
@@ -2085,6 +2148,7 @@ public class JTree extends JComponent implements Scrollable, Accessible
public void setScrollsOnExpand(boolean scroll)
{
+ clientScrollsOnExpandSet = true;
if (scrollsOnExpand == scroll)
return;
@@ -2164,7 +2228,15 @@ public class JTree extends JComponent implements Scrollable, Accessible
addSelectionPaths(paths);
}
-
+
+ /**
+ * Select all rows between the two given indexes, inclusive. The method
+ * will not select the inner leaves and braches of the currently collapsed
+ * nodes in this interval.
+ *
+ * @param index0 the starting row, inclusive
+ * @param index1 the ending row, inclusive
+ */
public void addSelectionInterval(int index0, int index1)
{
TreePath[] paths = getPathBetweenRows(index0, index1);
@@ -2220,7 +2292,10 @@ public class JTree extends JComponent implements Scrollable, Accessible
public TreePath getLeadSelectionPath()
{
- return leadSelectionPath;
+ if (selectionModel == null)
+ return null;
+ else
+ return selectionModel.getLeadSelectionPath();
}
/**
@@ -2228,12 +2303,24 @@ public class JTree extends JComponent implements Scrollable, Accessible
*/
public void setLeadSelectionPath(TreePath path)
{
- if (leadSelectionPath == path)
- return;
-
- TreePath oldValue = leadSelectionPath;
- leadSelectionPath = path;
- firePropertyChange(LEAD_SELECTION_PATH_PROPERTY, oldValue, path);
+ if (selectionModel != null)
+ {
+ TreePath oldValue = selectionModel.getLeadSelectionPath();
+ if (path.equals(oldValue))
+ return;
+
+ // Repaint the previous and current rows with the lead selection path.
+ if (path != null)
+ {
+ repaint(getPathBounds(path));
+ selectionModel.addSelectionPath(path);
+ }
+
+ if (oldValue!=null)
+ repaint(getPathBounds(oldValue));
+
+ firePropertyChange(LEAD_SELECTION_PATH_PROPERTY, oldValue, path);
+ }
}
/**
@@ -2369,7 +2456,8 @@ public class JTree extends JComponent implements Scrollable, Accessible
public void expandPath(TreePath path)
{
// Don't expand if path is null
- if (path == null)
+ // or is already expanded.
+ if (path == null || isExpanded(path))
return;
try
@@ -2906,13 +2994,69 @@ public class JTree extends JComponent implements Scrollable, Accessible
}
/**
- * Sent when the tree has changed enough that we need to resize the bounds,
- * but not enough that we need to remove the expanded node set (e.g nodes
- * were expanded or collapsed, or nodes were inserted into the tree). You
- * should never have to invoke this, the UI will invoke this as it needs to.
+ * <p>
+ * Sent when the tree has changed enough that we need to resize the bounds,
+ * but not enough that we need to remove the expanded node set (e.g nodes were
+ * expanded or collapsed, or nodes were inserted into the tree). You should
+ * never have to invoke this, the UI will invoke this as it needs to.
+ * </p>
+ * <p>
+ * If the tree uses {@link DefaultTreeModel}, you must call
+ * {@link DefaultTreeModel#reload(TreeNode)} or
+ * {@link DefaultTreeModel#reload()} after adding or removing nodes. Following
+ * the official Java 1.5 API standard, just calling treeDidChange, repaint()
+ * or revalidate() does <i>not</i> update the tree appearance properly.
+ *
+ * @see DefaultTreeModel#reload()
*/
public void treeDidChange()
{
repaint();
}
+
+ /**
+ * Helper method for
+ * {@link LookAndFeel#installProperty(JComponent, String, Object)}.
+ *
+ * @param propertyName the name of the property
+ * @param value the value of the property
+ *
+ * @throws IllegalArgumentException if the specified property cannot be set
+ * by this method
+ * @throws ClassCastException if the property value does not match the
+ * property type
+ * @throws NullPointerException if <code>c</code> or
+ * <code>propertyValue</code> is <code>null</code>
+ */
+ void setUIProperty(String propertyName, Object value)
+ {
+ if (propertyName.equals("rowHeight"))
+ {
+ if (! clientRowHeightSet)
+ {
+ setRowHeight(((Integer) value).intValue());
+ clientRowHeightSet = false;
+ }
+ }
+ else if (propertyName.equals("scrollsOnExpand"))
+ {
+ if (! clientScrollsOnExpandSet)
+ {
+ setScrollsOnExpand(((Boolean) value).booleanValue());
+ clientScrollsOnExpandSet = false;
+ }
+ }
+ else if (propertyName.equals("showsRootHandles"))
+ {
+ if (! clientShowsRootHandlesSet)
+ {
+ setShowsRootHandles(((Boolean) value).booleanValue());
+ clientShowsRootHandlesSet = false;
+ }
+ }
+ else
+ {
+ super.setUIProperty(propertyName, value);
+ }
+ }
}
diff --git a/javax/swing/KeyboardManager.java b/javax/swing/KeyboardManager.java
index aa9524cfe..4f778f733 100644
--- a/javax/swing/KeyboardManager.java
+++ b/javax/swing/KeyboardManager.java
@@ -195,7 +195,7 @@ class KeyboardManager
if (map == null)
return;
JComponent comp = map.getComponent();
- KeyStroke[] keys = map.keys();
+ KeyStroke[] keys = map.allKeys();
if (keys == null)
return;
// Find the top-level container associated with this ComponentInputMap
diff --git a/javax/swing/LookAndFeel.java b/javax/swing/LookAndFeel.java
index d6c91e055..7f59f1b5f 100644
--- a/javax/swing/LookAndFeel.java
+++ b/javax/swing/LookAndFeel.java
@@ -384,4 +384,50 @@ public abstract class LookAndFeel
if (c.getBorder() instanceof UIResource)
c.setBorder(null);
}
+
+ /**
+ * This methods installs a UI property if it hasn't already been set by an
+ * application. This method is used by UI delegates that install a default
+ * value for a property with a primitive type but do not want to override
+ * a value that has been set by an application.
+ *
+ * The supported properties depend on the actual type of the component and
+ * are listed in the table below. The supported properties are of course
+ * inherited to subclasses.
+ *
+ * <table>
+ * <tr><th>Type</th><th>Supported properties</th></tr>
+ * <tr><td><code>JComponent</code></td>
+ * <td><code>opaque, autoscrolls</code></td></tr>
+ * <tr><td><code>AbstractButton</code></td>
+ * <td><code>borderPainted, rolloverEnabled, iconTextGap,
+ * contentAreaFilled</code></td></tr>
+ * <tr><td><code>JDesktopPane</code></td>
+ * <td><code>dragMode</code></td></tr>
+ * <tr><td><code>JSplitPane</code></td>
+ * <td><code>dividerSize, oneTouchExpandable</code></td></tr>
+ * <tr><td><code>JTable</code></td>
+ * <td><code>rowHeight</code></td></tr>
+ * <tr><td><code>JTree</code></td>
+ * <td><code>rowHeight, scrollsOnExpand, showsRootHandles</code></td></tr>
+ * </table>
+ *
+ * @param c the component to install the property to
+ * @param propertyName the name of the property
+ * @param value the value of the property
+ *
+ * @throws IllegalArgumentException if the specified property cannot be set
+ * by this method
+ * @throws ClassCastException if the property value does not match the
+ * property type
+ * @throws NullPointerException if <code>c</code> or
+ * <code>propertyValue</code> is <code>null</code>
+ *
+ * @since 1.5
+ */
+ public static void installProperty(JComponent c, String propertyName,
+ Object value)
+ {
+ c.setUIProperty(propertyName, value);
+ }
}
diff --git a/javax/swing/MenuSelectionManager.java b/javax/swing/MenuSelectionManager.java
index 4e5275106..df7b42037 100644
--- a/javax/swing/MenuSelectionManager.java
+++ b/javax/swing/MenuSelectionManager.java
@@ -216,28 +216,90 @@ public class MenuSelectionManager
public boolean isComponentPartOfCurrentMenu(Component c)
{
MenuElement[] subElements;
- for (int i = 0; i < selectedPath.size(); i++)
+ boolean ret = false;
+ for (int i = 0; i < selectedPath.size(); i++)
{
- subElements = ((MenuElement) selectedPath.get(i)).getSubElements();
- for (int j = 0; j < subElements.length; j++)
- {
- MenuElement me = subElements[j];
- if (me != null && (me.getComponent()).equals(c))
- return true;
- }
+ // Check first element.
+ MenuElement first = (MenuElement) selectedPath.get(i);
+ if (SwingUtilities.isDescendingFrom(c, first.getComponent()))
+ {
+ ret = true;
+ break;
+ }
+ else
+ {
+ // Check sub elements.
+ subElements = first.getSubElements();
+ for (int j = 0; j < subElements.length; j++)
+ {
+ MenuElement me = subElements[j];
+ if (me != null
+ && (SwingUtilities.isDescendingFrom(c, me.getComponent())))
+ {
+ ret = true;
+ break;
+ }
+ }
+ }
}
- return false;
+ return ret;
}
/**
- * DOCUMENT ME!
+ * Processes key events on behalf of the MenuElements. MenuElement
+ * instances should always forward their key events to this method and
+ * get their {@link MenuElement#processKeyEvent(KeyEvent, MenuElement[],
+ * MenuSelectionManager)} eventually called back.
*
- * @param e DOCUMENT ME!
+ * @param e the key event
*/
public void processKeyEvent(KeyEvent e)
{
- throw new UnsupportedOperationException("not implemented");
+ MenuElement[] selection = (MenuElement[])
+ selectedPath.toArray(new MenuElement[selectedPath.size()]);
+ MenuElement[] path;
+ for (int index = selection.length - 1; index >= 0; index--)
+ {
+ MenuElement el = selection[index];
+ // This method's main purpose is to forward key events to the
+ // relevant menu items, so that they can act in response to their
+ // mnemonics beeing typed. So we also need to forward the key event
+ // to all the subelements of the currently selected menu elements
+ // in the path.
+ MenuElement[] subEls = el.getSubElements();
+ path = null;
+ for (int subIndex = 0; subIndex < subEls.length; subIndex++)
+ {
+ MenuElement sub = subEls[subIndex];
+ // Skip elements that are not showing or not enabled.
+ if (sub == null || ! sub.getComponent().isShowing()
+ || ! sub.getComponent().isEnabled())
+ {
+ continue;
+ }
+
+ if (path == null)
+ {
+ path = new MenuElement[index + 2];
+ System.arraycopy(selection, 0, path, 0, index + 1);
+ }
+ path[index + 1] = sub;
+ sub.processKeyEvent(e, path, this);
+ if (e.isConsumed())
+ break;
+ }
+ if (e.isConsumed())
+ break;
+ }
+
+ // Dispatch to first element in selection if it hasn't been consumed.
+ if (! e.isConsumed())
+ {
+ path = new MenuElement[1];
+ path[0] = selection[0];
+ path[0].processKeyEvent(e, path, this);
+ }
}
/**
@@ -303,53 +365,35 @@ public class MenuSelectionManager
return;
}
- int i;
- int minSize = path.length; // size of the smaller path.
+ int minSize = path.length; // size of the smaller path.
+ int currentSize = selectedPath.size();
+ int firstDiff = 0;
- if (path.length > selectedPath.size())
+ // Search first item that is different in the current and new path.
+ for (int i = 0; i < minSize; i++)
{
- minSize = selectedPath.size();
-
- // if new selected path contains more elements then current
- // selection then first add all elements at
- // the indexes > selectedPath.size
- for (i = selectedPath.size(); i < path.length; i++)
- {
- selectedPath.add(path[i]);
- path[i].menuSelectionChanged(true);
- }
+ if (i < currentSize && (MenuElement) selectedPath.get(i) == path[i])
+ firstDiff++;
+ else
+ break;
}
- else if (path.length < selectedPath.size())
+ // Remove items from selection and send notification.
+ for (int i = currentSize - 1; i >= firstDiff; i--)
{
- // if new selected path contains less elements then current
- // selection then first remove all elements from the selection
- // at the indexes > path.length
- for (i = selectedPath.size() - 1; i >= path.length; i--)
- {
- ((MenuElement) selectedPath.get(i)).menuSelectionChanged(false);
- selectedPath.remove(i);
- }
-
- minSize = path.length;
+ MenuElement el = (MenuElement) selectedPath.get(i);
+ selectedPath.remove(i);
+ el.menuSelectionChanged(false);
}
- // Now compare elements in new and current selection path at the
- // same location and adjust selection until
- // same menu elements will be encountered at the
- // same index in both current and new selection path.
- MenuElement oldSelectedItem;
-
- for (i = minSize - 1; i >= 0; i--)
+ // Add new items to selection and send notification.
+ for (int i = firstDiff; i < minSize; i++)
{
- oldSelectedItem = (MenuElement) selectedPath.get(i);
-
- if (path[i].equals(oldSelectedItem))
- break;
-
- oldSelectedItem.menuSelectionChanged(false);
- path[i].menuSelectionChanged(true);
- selectedPath.setElementAt(path[i], i);
+ if (path[i] != null)
+ {
+ selectedPath.add(path[i]);
+ path[i].menuSelectionChanged(true);
+ }
}
fireStateChanged();
diff --git a/javax/swing/ProgressMonitor.java b/javax/swing/ProgressMonitor.java
index dc0c6434c..73e36b9ca 100644
--- a/javax/swing/ProgressMonitor.java
+++ b/javax/swing/ProgressMonitor.java
@@ -398,7 +398,11 @@ public class ProgressMonitor
if (( now - timestamp ) > millisToDecideToPopup )
{
first = false;
- long expected = ( now - timestamp ) * ( max - min ) / ( progress - min );
+
+
+ long expected = ( progress - min == 0 ) ?
+ ( now - timestamp ) * ( max - min ) :
+ ( now - timestamp ) * ( max - min ) / ( progress - min );
if ( expected > millisToPopup )
{
diff --git a/javax/swing/RepaintManager.java b/javax/swing/RepaintManager.java
index ed0500992..345c348db 100644
--- a/javax/swing/RepaintManager.java
+++ b/javax/swing/RepaintManager.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package javax.swing;
+import java.applet.Applet;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
@@ -161,9 +162,9 @@ public class RepaintManager
if (o1 instanceof JComponent && o2 instanceof JComponent)
{
JComponent c1 = (JComponent) o1;
- Rectangle d1 = (Rectangle) dirtyComponents.get(c1);
+ Rectangle d1 = (Rectangle) dirtyComponentsWork.get(c1);
JComponent c2 = (JComponent) o2;
- Rectangle d2 = (Rectangle) dirtyComponents.get(c2);
+ Rectangle d2 = (Rectangle) dirtyComponentsWork.get(c2);
return d2.width * d2.height - d1.width * d1.height;
}
throw new ClassCastException("This comparator can only be used with "
@@ -189,6 +190,12 @@ public class RepaintManager
HashMap dirtyComponents;
/**
+ * The dirtyComponents which is used in paintDiryRegions to avoid unnecessary
+ * locking.
+ */
+ HashMap dirtyComponentsWork;
+
+ /**
* The comparator used for ordered inserting into the repaintOrder list.
*/
private transient Comparator comparator;
@@ -263,6 +270,7 @@ public class RepaintManager
public RepaintManager()
{
dirtyComponents = new HashMap();
+ dirtyComponentsWork = new HashMap();
invalidComponents = new ArrayList();
repaintWorker = new RepaintWorker();
doubleBufferMaximumSize = new Dimension(2000,2000);
@@ -414,7 +422,6 @@ public class RepaintManager
{
if (w <= 0 || h <= 0 || !component.isShowing())
return;
-
component.computeVisibleRect(rectCache);
SwingUtilities.computeIntersection(x, y, w, h, rectCache);
@@ -556,31 +563,36 @@ public class RepaintManager
if (dirtyComponents.size() == 0)
return;
+ // Swap dirtyRegions with dirtyRegionsWork to avoid locking.
synchronized (dirtyComponents)
{
- // We sort the components by their size here. This way we have a good
- // chance that painting the bigger components also paints the smaller
- // components and we don't need to paint them twice.
- ArrayList repaintOrder = new ArrayList(dirtyComponents.size());
- repaintOrder.addAll(dirtyComponents.keySet());
- if (comparator == null)
- comparator = new ComponentComparator();
- Collections.sort(repaintOrder, comparator);
- repaintUnderway = true;
- for (Iterator i = repaintOrder.iterator(); i.hasNext();)
- {
- JComponent comp = (JComponent) i.next();
- // If a component is marked completely clean in the meantime, then skip
- // it.
- Rectangle damaged = (Rectangle) dirtyComponents.get(comp);
- if (damaged == null || damaged.isEmpty())
- continue;
- comp.paintImmediately(damaged);
- dirtyComponents.remove(comp);
- }
- repaintUnderway = false;
- commitRemainingBuffers();
+ HashMap swap = dirtyComponents;
+ dirtyComponents = dirtyComponentsWork;
+ dirtyComponentsWork = swap;
}
+
+ ArrayList repaintOrder = new ArrayList(dirtyComponentsWork.size());;
+ // We sort the components by their size here. This way we have a good
+ // chance that painting the bigger components also paints the smaller
+ // components and we don't need to paint them twice.
+ repaintOrder.addAll(dirtyComponentsWork.keySet());
+
+ if (comparator == null)
+ comparator = new ComponentComparator();
+ Collections.sort(repaintOrder, comparator);
+ repaintUnderway = true;
+ for (Iterator i = repaintOrder.iterator(); i.hasNext();)
+ {
+ JComponent comp = (JComponent) i.next();
+ // If a component is marked completely clean in the meantime, then skip
+ // it.
+ Rectangle damaged = (Rectangle) dirtyComponentsWork.remove(comp);
+ if (damaged == null || damaged.isEmpty())
+ continue;
+ comp.paintImmediately(damaged);
+ }
+ repaintUnderway = false;
+ commitRemainingBuffers();
}
/**
@@ -597,7 +609,7 @@ public class RepaintManager
public Image getOffscreenBuffer(Component component, int proposedWidth,
int proposedHeight)
{
- Component root = SwingUtilities.getRoot(component);
+ Component root = getRoot(component);
Image buffer = (Image) offscreenBuffers.get(root);
if (buffer == null
|| buffer.getWidth(null) < proposedWidth
@@ -612,7 +624,33 @@ public class RepaintManager
}
return buffer;
}
-
+
+ /**
+ * Gets the root of the component given. If a parent of the
+ * component is an instance of Applet, then the applet is
+ * returned. The applet is considered the root for painting.
+ * Otherwise, the root Window is returned if it exists.
+ *
+ * @param comp - The component to get the root for.
+ * @return the parent root. An applet if it is a parent,
+ * or the root window. If neither exist, null is returned.
+ */
+ private Component getRoot(Component comp)
+ {
+ Applet app = null;
+
+ while (comp != null)
+ {
+ if (app == null && comp instanceof Window)
+ return comp;
+ else if (comp instanceof Applet)
+ app = (Applet) comp;
+ comp = comp.getParent();
+ }
+
+ return app;
+ }
+
/**
* Blits the back buffer of the specified root component to the screen. If
* the RepaintManager is currently working on a paint request, the commit
@@ -663,8 +701,7 @@ public class RepaintManager
dy1 = Math.min(bufferHeight, dy1);
dx2 = Math.min(bufferWidth, dx2);
dy2 = Math.min(bufferHeight, dy2);
- g.drawImage(buffer, dx1, dy1, dx2, dy2,
- dx1, dy1, dx2, dy2, root);
+ g.drawImage(buffer, 0, 0, root);
g.dispose();
}
// Otherwise queue this request up, until all the RepaintManager work
diff --git a/javax/swing/ScrollPaneLayout.java b/javax/swing/ScrollPaneLayout.java
index b00b5c4e7..31846fa55 100644
--- a/javax/swing/ScrollPaneLayout.java
+++ b/javax/swing/ScrollPaneLayout.java
@@ -328,7 +328,13 @@ public class ScrollPaneLayout
// parent is no JScrollPane, so do we.
JScrollPane sc = (JScrollPane) parent;
JViewport viewport = sc.getViewport();
- Dimension viewSize = viewport.getViewSize();
+ Component view = viewport.getView();
+
+ // If there is no view in the viewport, there is no work to be done.
+ if (view == null)
+ return;
+
+ Dimension viewSize = viewport.getView().getPreferredSize();
int x1 = 0, x2 = 0, x3 = 0, x4 = 0;
int y1 = 0, y2 = 0, y3 = 0, y4 = 0;
@@ -350,27 +356,49 @@ public class ScrollPaneLayout
int vsbPolicy = sc.getVerticalScrollBarPolicy();
int hsbPolicy = sc.getHorizontalScrollBarPolicy();
+
+ int vsWidth = 0;
+ int hsHeight = 0;
boolean showVsb =
(vsb != null)
&& ((vsbPolicy == VERTICAL_SCROLLBAR_ALWAYS)
|| (vsbPolicy == VERTICAL_SCROLLBAR_AS_NEEDED
&& viewSize.height > (y4 - y2)));
+
+ if (showVsb)
+ vsWidth = vsb.getPreferredSize().width;
+
+ // The horizontal scroll bar may become necessary if the vertical scroll
+ // bar appears, reducing the space, left for the component.
+
boolean showHsb =
(hsb != null)
&& ((hsbPolicy == HORIZONTAL_SCROLLBAR_ALWAYS)
|| (hsbPolicy == HORIZONTAL_SCROLLBAR_AS_NEEDED
- && viewSize.width > (x4 - x2)));
-
+ && viewSize.width > (x4 - x2 - vsWidth)));
+
+ if (showHsb)
+ hsHeight = hsb.getPreferredSize().height;
+
+ // If the horizontal scroll bar appears, and the vertical scroll bar
+ // was not necessary assuming that there is no horizontal scroll bar,
+ // the vertical scroll bar may become necessary because the horizontal
+ // scroll bar reduces the vertical space for the component.
if (!showVsb)
- x3 = x4;
- else
- x3 = x4 - vsb.getPreferredSize().width;
+ {
+ showVsb =
+ (vsb != null)
+ && ((vsbPolicy == VERTICAL_SCROLLBAR_ALWAYS)
+ || (vsbPolicy == VERTICAL_SCROLLBAR_AS_NEEDED
+ && viewSize.height > (y4 - y2)));
+
+ if (showVsb)
+ vsWidth = vsb.getPreferredSize().width;
+ }
- if (!showHsb)
- y3 = y4;
- else
- y3 = y4 - hsb.getPreferredSize().height;
+ x3 = x4 - vsWidth;
+ y3 = y4 - hsHeight;
// now set the layout
if (viewport != null)
diff --git a/javax/swing/Scrollable.java b/javax/swing/Scrollable.java
index 9dce665d6..396d530ed 100644
--- a/javax/swing/Scrollable.java
+++ b/javax/swing/Scrollable.java
@@ -50,14 +50,57 @@ public interface Scrollable
{
Dimension getPreferredScrollableViewportSize();
+ /**
+ * Return the preferred scrolling amount (in pixels) for the given
+ * scrolling direction and orientation when scrolling in small amounts
+ * like table lines.
+ *
+ * @param visibleRect the currently visible part of the component.
+ * @param orientation the scrolling orientation
+ * @param direction the scrolling direction (negative - up, positive -down).
+ * The values greater than one means that more mouse wheel or similar
+ * events were generated, and hence it is better to scroll the longer
+ * distance.
+ *
+ * @return the preferred scrolling distance, negative if up or left.
+ */
int getScrollableUnitIncrement(Rectangle visibleRect, int orientation,
int direction);
+ /**
+ * Return the preferred scrolling amount (in pixels) for the given
+ * scrolling direction and orientation when scrolling in large amounts
+ * (pages).
+ *
+ * @param visibleRect the currently visible part of the component.
+ * @param orientation the scrolling orientation
+ * @param direction the scrolling direction (negative - up, positive -down).
+ * The values greater than one means that more mouse wheel or similar
+ * events were generated, and hence it is better to scroll the longer
+ * distance.
+ *
+ * @return the preferred scrolling distance, negative if up or left.
+ */
int getScrollableBlockIncrement(Rectangle visibleRect, int orientation,
int direction);
+ /**
+ * Return true if the width of the scrollable is always equal to the
+ * view, where it is displayed, width (for instance, the text area with
+ * the word wrap). In such case, the horizontal scrolling should not be
+ * performed.
+ *
+ * @return true is no horizontal scrolling is assumed, faster otherwise.
+ */
boolean getScrollableTracksViewportWidth();
+ /**
+ * Return true if the height of the scrollable is always equal to the view,
+ * where it is displayed, height.In such case, the vertical scrolling should
+ * not be performed.
+ *
+ * @return true is no horizontal scrolling is assumed, faster otherwise.
+ */
boolean getScrollableTracksViewportHeight();
}
diff --git a/javax/swing/SizeSequence.java b/javax/swing/SizeSequence.java
index dff966b3e..26099a154 100644
--- a/javax/swing/SizeSequence.java
+++ b/javax/swing/SizeSequence.java
@@ -1,5 +1,5 @@
/* SizeSequence.java --
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,20 +38,22 @@ exception statement from your version. */
package javax.swing;
/**
- * SizeSequence
+ * A sequence of values that represent the dimensions (widths or heights) of
+ * some collection of items (for example, the widths of the columns in a table).
+ *
* @author Andrew Selkirk
- * @version 1.0
*/
public class SizeSequence
{
+ // TODO: Sun's API specification for this class contains an implementation
+ // note regarding the encoding for the element sizes. We currently use the
+ // simple size encoding but we should look at improving this.
- /**
- * sizes
- */
- private int[] sizes = new int[0];
+ /** Storage for the element sizes. */
+ private int[] sizes;
/**
- * Constructor SizeSequence
+ * Creates a new empty <code>SizeSequence</code> instance.
*/
public SizeSequence()
{
@@ -59,8 +61,10 @@ public class SizeSequence
}
/**
- * Constructor SizeSequence
- * @param numEntries TODO
+ * Creates a new <code>SizeSequence</code> instance with the specified number
+ * of elements, each having a size of 0.
+ *
+ * @param numEntries the number of elements.
*/
public SizeSequence(int numEntries)
{
@@ -68,48 +72,66 @@ public class SizeSequence
}
/**
- * Constructor SizeSequence
- * @param numEntries TODO
- * @param value TODO
+ * Creates a new <code>SizeSequence</code> instance with the specified number
+ * of elements all having the same size (<code>value</code>).
+ *
+ * @param numEntries the number of elements.
+ * @param value the value for each element.
*/
public SizeSequence(int numEntries, int value)
{
+ sizes = new int[0];
insertEntries(0, numEntries, value);
}
/**
- * Constructor SizeSequence
- * @param sizes TODO
+ * Creates a new <code>SizeSequence</code> instance using the specified
+ * element sizes.
+ *
+ * @param sizes the element sizes (<code>null</code> not permitted).
*/
public SizeSequence(int[] sizes)
{
- setSizes(sizes);
+ this.sizes = (int[]) sizes.clone();
}
/**
- * setSize
- * @param index TODO
- * @param size TODO
+ * Sets the size of the element at the specified index.
+ *
+ * @param index the index.
+ * @param size the size.
*/
public void setSize(int index, int size)
{
- sizes[index] = size;
+ if (index >= 0 && index < sizes.length)
+ sizes[index] = size;
}
/**
- * getIndex
- * @param position TODO
- * @returns int
+ * Returns the index of the element that contains the specified position.
+ *
+ * @param position the position.
+ *
+ * @return The index of the element that contains the specified position.
*/
public int getIndex(int position)
{
- return 0; // TODO
+ int i = 0;
+ int runningTotal = 0;
+ while (i < sizes.length && position >= runningTotal + sizes[i])
+ {
+ runningTotal += sizes[i];
+ i++;
+ }
+ return i;
}
/**
- * getSize
- * @param index TODO
- * @returns int
+ * Returns the size of the specified element.
+ *
+ * @param index the element index.
+ *
+ * @return The size of the specified element.
*/
public int getSize(int index)
{
@@ -117,122 +139,81 @@ public class SizeSequence
}
/**
- * setSizes
- * @param sizes TODO
+ * Sets the sizes for the elements in the sequence.
+ *
+ * @param sizes the element sizes (<code>null</code> not permitted).
*/
public void setSizes(int[] sizes)
{
- int index;
- // Initialize sizes.
- this.sizes = new int[sizes.length];
- for (index = 0; index < sizes.length; index++)
- this.sizes[index] = sizes[index];
-
+ this.sizes = (int[]) sizes.clone();
}
/**
- * getSizes
- * @returns int[]
+ * Returns an array containing the sizes for all the elements in the sequence.
+ *
+ * @return The element sizes.
*/
public int[] getSizes()
{
- int[] array;
- int index;
-
- // Create new array.
- array = new int[sizes.length];
- for (index = 0; index < sizes.length; index++)
- array[index] = sizes[index];
-
- // Return newly created array.
- return array;
-
+ return (int[]) sizes.clone();
}
/**
- * getPosition
- * @param index TODO
- * @returns int
+ * Returns the position of the specified element.
+ *
+ * @param index the element index.
+ *
+ * @return The position.
*/
public int getPosition(int index)
{
int position;
int loop;
-
- // Process sizes.
position = 0;
for (loop = 0; loop < index; loop++)
position += sizes[loop];
-
- // Return position.
return position;
}
/**
- * insertEntries
- * @param start TODO
- * @param length TODO
- * @param value TODO
+ * Inserts new entries into the sequence at the <code>start</code> position.
+ * There are <code>length</code> new entries each having the specified
+ * <code>value</code>.
+ *
+ * @param start the start element.
+ * @param length the number of elements to insert.
+ * @param value the size for each of the new elements.
*/
public void insertEntries(int start, int length, int value)
{
- int[] array;
- int index;
- int arrayIndex;
- int loop;
-
- // Create new array.
- array = new int[sizes.length + length];
- arrayIndex = 0;
- for (index = 0; index < sizes.length; index++)
- {
- if (index == start)
- {
- for (loop = 0; loop < length; loop++)
- {
- array[arrayIndex] = value;
- arrayIndex++;
- }
- }
- else
- {
- array[arrayIndex] = sizes[index];
- arrayIndex++;
- }
- }
-
- }
+ int[] newSizes = new int[sizes.length + length];
+ System.arraycopy(sizes, 0, newSizes, 0, start);
+ for (int i = start; i < start + length; i++)
+ newSizes[i] = value;
+ System.arraycopy(sizes, start, newSizes, start + length,
+ sizes.length - start);
+ sizes = newSizes;
+ }
/**
- * removeEntries
- * @param start TODO
- * @param length TODO
+ * Removes the element(s) at index <code>start</code> (the number of elements
+ * removed is <code>length</code>).
+ *
+ * @param start the index of the first element to remove.
+ * @param length the number of elements to remove.
*/
public void removeEntries(int start, int length)
{
- int[] array;
- int index;
- int arrayIndex;
-
// Sanity check.
if ((start + length) > sizes.length)
throw new IllegalArgumentException("Specified start/length that "
+ "is greater than available sizes");
- // Create new array.
- array = new int[sizes.length - length];
- arrayIndex = 0;
- for (index = 0; index < sizes.length; index++)
- {
- if (index == start)
- index += length - 1;
- else
- {
- array[arrayIndex] = sizes[index];
- arrayIndex++;
- }
- }
+ int[] newSizes = new int[sizes.length - length];
+ System.arraycopy(sizes, 0, newSizes, 0, start);
+ System.arraycopy(sizes, start + length, newSizes, start,
+ sizes.length - start - length);
+ sizes = newSizes;
}
-
}
diff --git a/javax/swing/SpinnerDateModel.java b/javax/swing/SpinnerDateModel.java
index e0ccab776..e5ff76f1a 100644
--- a/javax/swing/SpinnerDateModel.java
+++ b/javax/swing/SpinnerDateModel.java
@@ -59,13 +59,13 @@ public class SpinnerDateModel extends AbstractSpinnerModel
private Calendar date;
/**
- * The start or earliest permitted date (<code>null</code> for no
- * minimum).
+ * A constraint on the start or earliest permitted date (<code>null</code>
+ * for no minimum).
*/
private Comparable start;
/**
- * The end or latest permitted date (<code>null</code> for no
+ * A constraint on the end or latest permitted date (<code>null</code> for no
* maximum).
*/
private Comparable end;
@@ -77,7 +77,6 @@ public class SpinnerDateModel extends AbstractSpinnerModel
/**
* For compatability with Sun's JDK
- * FIXME: Which fields should be serialized?
*/
private static final long serialVersionUID = -4802518107105940612L;
@@ -92,23 +91,30 @@ public class SpinnerDateModel extends AbstractSpinnerModel
}
/**
- * Constructs a SpinnerDateModel which spins a given calendar field,
- * using a given date and start and end date limits.
- * @param value - the initial Date value
- * @param start - start limit, as a Date object, or <code>null</code>
- * for no lower limit.
- * @param end - end limit, or <code>null</code> for no upper limit.
- * @param calendarField - the <code>Calendar</code> field to spin,
- * (Calendar.ZONE_OFFSET and Calendar.DST_OFFSET are invalid)
+ * Constructs a <code>SpinnerDateModel</code> with the specified value, lower
+ * and upper bounds, and which spins the specified calendar field.
+ * <p>
+ * The <code>start</code> and <code>end</code> limits must have a
+ * <code>compareTo</code> method that supports instances of {@link Date}, but
+ * do not themselves need to be instances of {@link Date} (although typically
+ * they are).
+ *
+ * @param value the initial value/date (<code>null</code> not permitted).
+ * @param start a constraint that specifies the earliest permitted date
+ * value, or <code>null</code> for no lower limit.
+ * @param end a constraint that specifies the latest permitted date value,
+ * or <code>null</code> for no upper limit.
+ * @param calendarField the <code>Calendar</code> field to spin,
+ * (Calendar.ZONE_OFFSET and Calendar.DST_OFFSET are invalid)
*/
public SpinnerDateModel(Date value, Comparable start, Comparable end,
int calendarField)
{
if (value == null)
throw new IllegalArgumentException("Null 'value' argument.");
- if (start != null && value.compareTo(start) < 0)
+ if (start != null && start.compareTo(value) > 0)
throw new IllegalArgumentException("Require value on or after start.");
- if (end != null && value.compareTo(end) > 0)
+ if (end != null && end.compareTo(value) < 0)
throw new IllegalArgumentException("Require value on or before end.");
date = Calendar.getInstance();
date.setTime(value);
@@ -129,9 +135,11 @@ public class SpinnerDateModel extends AbstractSpinnerModel
}
/**
- * Returns the current date.
+ * Returns the current date/time.
+ *
+ * @return The current date/time (never <code>null</code>).
*
- * @return The current date.
+ * @see #getValue()
*/
public Date getDate()
{
@@ -139,9 +147,12 @@ public class SpinnerDateModel extends AbstractSpinnerModel
}
/**
- * Returns the start date, or <code>null</code> if there is no minimum date.
+ * Returns the lower limit on the date/time value, or <code>null</code> if
+ * there is no minimum date/time.
*
- * @return The start date.
+ * @return The lower limit.
+ *
+ * @see #setStart(Comparable)
*/
public Comparable getStart()
{
@@ -149,9 +160,12 @@ public class SpinnerDateModel extends AbstractSpinnerModel
}
/**
- * Returns the end date, or <code>null</code> if there is no maximum date.
+ * Returns the upper limit on the date/time value, or <code>null</code> if
+ * there is no maximum date/time.
+ *
+ * @return The upper limit.
*
- * @return The end date.
+ * @see #setEnd(Comparable)
*/
public Comparable getEnd()
{
@@ -160,9 +174,9 @@ public class SpinnerDateModel extends AbstractSpinnerModel
/**
* Returns the current date in the sequence (this method returns the same as
- * {@link #getDate()}.
+ * {@link #getDate()}).
*
- * @return The current date.
+ * @return The current date (never <code>null</code>).
*/
public Object getValue()
{
@@ -171,10 +185,13 @@ public class SpinnerDateModel extends AbstractSpinnerModel
/**
* Returns the next date in the sequence, or <code>null</code> if the
- * next date is after the end date. The current date is not changed.
+ * next date is past the upper limit (if one is specified). The current date
+ * is not changed.
*
* @return The next date, or <code>null</code> if the current value is
* the latest date represented by the model.
+ *
+ * @see #getEnd()
*/
public Object getNextValue()
{
@@ -190,11 +207,13 @@ public class SpinnerDateModel extends AbstractSpinnerModel
/**
* Returns the previous date in the sequence, or <code>null</code> if the
- * previous date is prior to the start date. The current date is not
- * changed.
+ * previous date is prior to the lower limit (if one is specified). The
+ * current date is not changed.
*
* @return The previous date, or <code>null</code> if the current value is
* the earliest date represented by the model.
+ *
+ * @see #getStart()
*/
public Object getPreviousValue()
{
@@ -233,14 +252,16 @@ public class SpinnerDateModel extends AbstractSpinnerModel
}
/**
- * Sets the start date and, if the new date is different to the old date,
- * sends a {@link ChangeEvent} to all registered listeners. A
- * <code>null</code> date is interpreted as "no start date". No check
- * is made to ensure that the new start date is on or before the current
- * date - the caller is responsible for ensuring that this relationship
- * holds.
+ * Sets the lower limit for the date/time value and, if the new limit is
+ * different to the old limit, sends a {@link ChangeEvent} to all registered
+ * listeners. A <code>null</code> value is interpreted as "no lower limit".
+ * No check is made to ensure that the current date/time is on or after the
+ * new lower limit - the caller is responsible for ensuring that this
+ * relationship holds. In addition, the caller should ensure that
+ * <code>start</code> is {@link Serializable}.
*
- * @param start the new start date (<code>null</code> permitted).
+ * @param start the new lower limit for the date/time value
+ * (<code>null</code> permitted).
*/
public void setStart(Comparable start)
{
@@ -252,13 +273,16 @@ public class SpinnerDateModel extends AbstractSpinnerModel
}
/**
- * Sets the end date and, if the new date is different to the old date,
- * sends a {@link ChangeEvent} to all registered listeners. A
- * <code>null</code> date is interpreted as "no end date". No check
- * is made to ensure that the new end date is on or after the current date -
- * the caller is responsible for ensuring that this relationship holds.
+ * Sets the upper limit for the date/time value and, if the new limit is
+ * different to the old limit, sends a {@link ChangeEvent} to all registered
+ * listeners. A <code>null</code> value is interpreted as "no upper limit".
+ * No check is made to ensure that the current date/time is on or before the
+ * new upper limit - the caller is responsible for ensuring that this
+ * relationship holds. In addition, the caller should ensure that
+ * <code>end</code> is {@link Serializable}.
*
- * @param end the new end date (<code>null</code> permitted).
+ * @param end the new upper limit for the date/time value (<code>null</code>
+ * permitted).
*/
public void setEnd(Comparable end)
{
diff --git a/javax/swing/SpinnerNumberModel.java b/javax/swing/SpinnerNumberModel.java
index 389c536e4..1abbbe377 100644
--- a/javax/swing/SpinnerNumberModel.java
+++ b/javax/swing/SpinnerNumberModel.java
@@ -110,12 +110,14 @@ public class SpinnerNumberModel extends AbstractSpinnerModel
}
/**
- * Creates a <code>SpinnerNumberModel</code> with the given attributes.
+ * Creates a <code>SpinnerNumberModel</code> with the given attributes. The
+ * caller should ensure that both <code>minimum</code> and
+ * <code>maximum</code> are serializable.
*
- * @param value the initial value.
+ * @param value the initial value (<code>null</code> not permitted).
* @param minimum the minimum value (<code>null</code> permitted).
* @param maximum the maximum value (<code>null</code> permitted).
- * @param stepSize the step size.
+ * @param stepSize the step size (<code>null</code> not permitted).
*
* @throws IllegalArgumentException if minimum &lt;= value &lt;= maximum
* does not hold
@@ -171,9 +173,12 @@ public class SpinnerNumberModel extends AbstractSpinnerModel
}
/**
- * Returns the current value.
+ * Returns the current value, which for this class is always an instance of
+ * {@link Number}.
*
* @return The current value.
+ *
+ * @see #getNumber()
*/
public Object getValue()
{
@@ -258,6 +263,8 @@ public class SpinnerNumberModel extends AbstractSpinnerModel
* Returns the minimum value, or <code>null</code> if there is no minimum.
*
* @return The minimum value.
+ *
+ * @see #setMinimum(Comparable)
*/
public Comparable getMinimum()
{
@@ -270,9 +277,12 @@ public class SpinnerNumberModel extends AbstractSpinnerModel
* <code>null</code> value is interpreted as "no minimum value". No check
* is made to ensure that the new minimum is less than or equal to the
* current value, the caller is responsible for ensuring that this
- * relationship holds.
+ * relationship holds. In addition, the caller should ensure that
+ * <code>newMinimum</code> is {@link Serializable}.
*
* @param newMinimum the new minimum value (<code>null</code> permitted).
+ *
+ * @see #getMinimum()
*/
public void setMinimum(Comparable newMinimum)
{
@@ -287,6 +297,9 @@ public class SpinnerNumberModel extends AbstractSpinnerModel
* Returns the maximum value, or <code>null</code> if there is no maximum.
*
* @return The maximum value.
+ *
+ * @see #getMinimum()
+ * @see #setMaximum(Comparable)
*/
public Comparable getMaximum()
{
@@ -299,9 +312,12 @@ public class SpinnerNumberModel extends AbstractSpinnerModel
* <code>null</code> value is interpreted as "no maximum value". No check
* is made to ensure that the new maximum is greater than or equal to the
* current value, the caller is responsible for ensuring that this
- * relationship holds.
+ * relationship holds. In addition, the caller should ensure that
+ * <code>newMaximum</code> is {@link Serializable}.
*
* @param newMaximum the new maximum (<code>null</code> permitted).
+ *
+ * @see #getMaximum()
*/
public void setMaximum(Comparable newMaximum)
{
@@ -315,7 +331,7 @@ public class SpinnerNumberModel extends AbstractSpinnerModel
/**
* Returns the step size.
*
- * @return The step size.
+ * @return The step size (never <code>null</code>).
*/
public Number getStepSize()
{
diff --git a/javax/swing/SwingUtilities.java b/javax/swing/SwingUtilities.java
index b472342ce..9d8e8df38 100644
--- a/javax/swing/SwingUtilities.java
+++ b/javax/swing/SwingUtilities.java
@@ -386,20 +386,17 @@ public class SwingUtilities
app = (Applet) comp;
comp = comp.getParent();
}
-
+
if (win != null)
return win;
- else
- return app;
+ return app;
}
/**
- * Return true if a descends from b, in other words if b is an
- * ancestor of a.
- *
+ * Return true if a descends from b, in other words if b is an ancestor of a.
+ *
* @param a The child to search the ancestry of
* @param b The potential ancestor to search for
- *
* @return true if a is a descendent of b, false otherwise
*/
public static boolean isDescendingFrom(Component a, Component b)
diff --git a/javax/swing/UIManager.java b/javax/swing/UIManager.java
index 725d64c5e..e1ee28b3f 100644
--- a/javax/swing/UIManager.java
+++ b/javax/swing/UIManager.java
@@ -1,5 +1,5 @@
/* UIManager.java --
- Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -613,7 +613,10 @@ public class UIManager implements Serializable
*/
public static void installLookAndFeel(LookAndFeelInfo info)
{
- // FIXME: not yet implemented
+ LookAndFeelInfo[] newInstalled = new LookAndFeelInfo[installed.length + 1];
+ System.arraycopy(installed, 0, newInstalled, 0, installed.length);
+ newInstalled[newInstalled.length - 1] = info;
+ setInstalledLookAndFeels(newInstalled);
}
/**
@@ -633,7 +636,7 @@ public class UIManager implements Serializable
*/
public static void setInstalledLookAndFeels(UIManager.LookAndFeelInfo[] infos)
{
- // FIXME: not yet implemented.
+ installed = infos;
}
/**
diff --git a/javax/swing/ViewportLayout.java b/javax/swing/ViewportLayout.java
index 674de959f..b61834e9e 100644
--- a/javax/swing/ViewportLayout.java
+++ b/javax/swing/ViewportLayout.java
@@ -120,80 +120,83 @@ public class ViewportLayout implements LayoutManager, Serializable
}
/**
- * Layout the view and viewport to respect the following rules. These are
- * not precisely the rules described in sun's javadocs, but they are the
- * rules which sun's swing implementation follows, if you watch its
- * behavior:
- *
- * <ol>
- *
- * <li>If the port is smaller than the view, leave the view at its
- * current size. Also, do not move the port, <em>unless</em> the port
- * extends into space <em>past</em> the edge of the view. If so, move the
- * port up or to the left, in view space, by the amount of empty space
- * (keep the lower and right edges lined up)</li>
+ * Layout the view and viewport to respect the following rules. These are not
+ * precisely the rules described in sun's javadocs, but they are the rules
+ * which sun's swing implementation follows, if you watch its behavior:
+ * <ol>
+ * <li>If the port is smaller than the view, leave the view at its current
+ * size.</li>
+ * <li>If the view is smaller than the port, the view is top aligned.</li>
+ * <li>If the view tracks the port size, the view position is always zero and
+ * the size equal to the viewport size</li>
* <li>In {@link JViewport#setViewSize(Dimension)}, the view size is never
* set smaller that its minimum size.</li>
- *
* </ol>
- *
+ *
* @see JViewport#getViewSize
* @see JViewport#setViewSize
* @see JViewport#getViewPosition
* @see JViewport#setViewPosition
*/
- public void layoutContainer(Container parent)
+ public void layoutContainer(Container parent)
{
// The way to interpret this function is basically to ignore the names
// of methods it calls, and focus on the variable names here. getViewRect
// doesn't, for example, return the view; it returns the port bounds in
- // view space. Likwise setViewPosition doesn't reposition the view; it
+ // view space. Likwise setViewPosition doesn't reposition the view; it
// positions the port, in view coordinates.
- JViewport port = (JViewport) parent;
+ JViewport port = (JViewport) parent;
Component view = port.getView();
-
+
if (view == null)
return;
- // These dimensions and positions are in *view space*. Do not mix
+ // These dimensions and positions are in *view space*. Do not mix
// variables in here from port space (eg. parent.getBounds()). This
// function should be entirely in view space, because the methods on
// the viewport require inputs in view space.
Rectangle portBounds = port.getViewRect();
- Dimension viewPref = view.getPreferredSize();
- Dimension viewMinimum = view.getMinimumSize();
-
+ Dimension viewPref = new Dimension(view.getPreferredSize());
+
Point portLowerRight = new Point(portBounds.x + portBounds.width,
portBounds.y + portBounds.height);
- int overextension;
// vertical implementation of the above rules
- if ((! (view instanceof Scrollable) && viewPref.height < portBounds.height
- || (view instanceof Scrollable
- && ((Scrollable) view).getScrollableTracksViewportHeight())))
- viewPref.height = portBounds.height;
-
- // If the view is larger than the port, and port is partly outside
- // the view, it is moved fully into the view area.
- overextension = portLowerRight.y - viewPref.height;
- if (overextension > 0)
- portBounds.y -= overextension;
-
- // horizontal implementation of the above rules
- if ((! (view instanceof Scrollable) && viewPref.width < portBounds.width
- || (view instanceof Scrollable
- && ((Scrollable) view).getScrollableTracksViewportWidth())))
- viewPref.width = portBounds.width;
-
- // If the view is larger than the port, and port is partly outside
- // the view, it is moved fully into the view area.
- overextension = portLowerRight.x - viewPref.width;
- if (overextension > 0)
- portBounds.x -= overextension;
+ if (view instanceof Scrollable)
+ {
+ Scrollable sView = (Scrollable) view;
+
+ // If the view size matches viewport size, the port offset can
+ // only be zero.
+ if (sView.getScrollableTracksViewportWidth())
+ {
+ viewPref.width = portBounds.width;
+ portBounds.x = 0;
+ }
+ if (sView.getScrollableTracksViewportHeight())
+ {
+ viewPref.height = portBounds.height;
+ portBounds.y = 0;
+ }
+ }
+
+ if (viewPref.width < portBounds.width)
+ viewPref.width = portBounds.width;
+ if (viewPref.height < portBounds.height)
+ viewPref.height = portBounds.height;
+
+ // If the view is larger than the port, the port is top and right
+ // aligned.
+ if (portLowerRight.x > viewPref.width)
+ portBounds.x = 0;
+
+ if (portLowerRight.y > viewPref.height)
+ portBounds.y = 0;
port.setViewSize(viewPref);
port.setViewPosition(portBounds.getLocation());
}
+
}
diff --git a/javax/swing/border/AbstractBorder.java b/javax/swing/border/AbstractBorder.java
index 7cbbcdaa8..c995de1c2 100644
--- a/javax/swing/border/AbstractBorder.java
+++ b/javax/swing/border/AbstractBorder.java
@@ -1,5 +1,5 @@
/* AbstractBorder.java --
- Copyright (C) 2003 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -68,7 +68,7 @@ public abstract class AbstractBorder implements Border, Serializable
* Performs nothing, because the default implementation provided by
* this class is an invisible, zero-width border. Subclasses will
* likely want to override this method, but they are not required
- * for doing so.
+ * to do so.
*
* @param c the component whose border is to be painted.
* @param g the graphics for painting.
@@ -87,9 +87,11 @@ public abstract class AbstractBorder implements Border, Serializable
}
/**
- * Measures the width of this border.
+ * Returns the insets required for drawing this border around the specified
+ * component.
*
- * @param c the component whose border is to be measured.
+ * @param c the component that the border applies to (ignored here,
+ * subclasses may use it).
*
* @return an Insets object whose <code>left</code>, <code>right</code>,
* <code>top</code> and <code>bottom</code> fields indicate the
@@ -104,16 +106,23 @@ public abstract class AbstractBorder implements Border, Serializable
}
/**
- * Determines the insets of this border. The implementation provided
- * by AbstractButton sets the <code>left</code>, <code>right</code>,
- * <code>top</code> and <code>bottom</code> fields of the passed
- * <code>insets</code> parameter to zero.
+ * Returns the insets required for drawing this border around the specified
+ * component. The default implementation provided here sets the
+ * <code>left</code>, <code>right</code>, <code>top</code> and
+ * <code>bottom</code> fields of the passed <code>insets</code> parameter to
+ * zero.
*
- * @param c the component whose border is to be measured
+ * @param c the component that the border applies to (ignored here,
+ * subclasses may use it).
+ * @param insets an instance that will be overwritten and returned as the
+ * result (<code>null</code> not permitted).
*
- * @return the same object that was passed for <code>insets</code>
+ * @return The border insets (the same object that was passed as the
+ * <code>insets</code> argument).
*
* @see #getBorderInsets(Component)
+ *
+ * @throws NullPointerException if <code>insets</code> is <code>null</code>.
*/
public Insets getBorderInsets(Component c, Insets insets)
{
@@ -126,7 +135,7 @@ public abstract class AbstractBorder implements Border, Serializable
* fills every pixel in its area when painting. Partially
* translucent borders must return <code>false</code>, or ugly
* artifacts can appear on screen. The default implementation
- * provided by AbstractBorder always returns <code>false</code>.
+ * provided here always returns <code>false</code>.
*
* @return <code>false</code>.
*/
@@ -136,9 +145,9 @@ public abstract class AbstractBorder implements Border, Serializable
}
/**
- * Returns a rectangle that covers the specified area minus this
- * border. Components that wish to determine an area into which
- * they can safely draw without intersecting with a border might
+ * Returns a rectangle that covers the specified area minus the insets
+ * required to draw this border. Components that wish to determine an area
+ * into which they can safely draw without intersecting with a border might
* want to use this helper method.
*
* @param c the component in the center of this border.
@@ -146,24 +155,30 @@ public abstract class AbstractBorder implements Border, Serializable
* @param y the vertical position of the border.
* @param width the width of the available area for the border.
* @param height the height of the available area for the border.
+ *
+ * @return The interior rectangle.
*/
public Rectangle getInteriorRectangle(Component c, int x, int y, int width,
int height)
{
- return getInteriorRectangle (c, this, x, y, width, height);
+ return getInteriorRectangle(c, this, x, y, width, height);
}
/**
- * Returns a rectangle that covers the specified area minus a
- * border. Components that wish to determine an area into which
- * they can safely draw without intersecting with a border might
- * want to use this helper method.
+ * Returns a rectangle that covers the specified area minus the insets
+ * required to draw the specified border (if the border is <code>null</code>,
+ * zero insets are assumed). Components that wish to determine an area into
+ * which they can safely draw without intersecting with a border might want
+ * to use this helper method.
*
* @param c the component in the center of this border.
+ * @param b the border (<code>null</code> permitted).
* @param x the horizontal position of the border.
* @param y the vertical position of the border.
* @param width the width of the available area for the border.
* @param height the height of the available area for the border.
+ *
+ * @return The interior rectangle.
*/
public static Rectangle getInteriorRectangle(Component c, Border b, int x,
int y, int width, int height)
@@ -172,7 +187,7 @@ public abstract class AbstractBorder implements Border, Serializable
if (b != null)
{
- borderInsets = b.getBorderInsets (c);
+ borderInsets = b.getBorderInsets(c);
x += borderInsets.left;
y += borderInsets.top;
width -= borderInsets.left + borderInsets.right;
diff --git a/javax/swing/border/BevelBorder.java b/javax/swing/border/BevelBorder.java
index 45b758cae..403c35c04 100644
--- a/javax/swing/border/BevelBorder.java
+++ b/javax/swing/border/BevelBorder.java
@@ -305,6 +305,8 @@ public class BevelBorder extends AbstractBorder
*
* @param c the component enclosed by this border.
*
+ * @return The color.
+ *
* @see #getHighlightInnerColor(java.awt.Component)
* @see java.awt.Color#brighter()
*/
@@ -326,6 +328,8 @@ public class BevelBorder extends AbstractBorder
*
* @param c the component enclosed by this border.
*
+ * @return The color.
+ *
* @see java.awt.Component#getBackground()
* @see java.awt.Color#brighter()
*/
@@ -347,6 +351,8 @@ public class BevelBorder extends AbstractBorder
*
* @param c the component enclosed by this border.
*
+ * @return The color.
+ *
* @see java.awt.Component#getBackground()
* @see java.awt.Color#darker()
*/
@@ -367,6 +373,8 @@ public class BevelBorder extends AbstractBorder
*
* @param c the component enclosed by this border.
*
+ * @return The color.
+ *
* @see #getShadowInnerColor(java.awt.Component)
* @see java.awt.Color#darker()
*/
@@ -384,6 +392,8 @@ public class BevelBorder extends AbstractBorder
* highlighted edges when painting the border, or <code>null</code>
* if that color will be derived from the background of the enclosed
* Component.
+ *
+ * @return The color (possibly <code>null</code>).
*/
public Color getHighlightOuterColor()
{
@@ -396,6 +406,8 @@ public class BevelBorder extends AbstractBorder
* highlighted edges when painting the border, or <code>null</code>
* if that color will be derived from the background of the enclosed
* Component.
+ *
+ * @return The color (possibly <code>null</code>).
*/
public Color getHighlightInnerColor()
{
@@ -408,6 +420,8 @@ public class BevelBorder extends AbstractBorder
* shadowed edges when painting the border, or <code>null</code> if
* that color will be derived from the background of the enclosed
* Component.
+ *
+ * @return The color (possibly <code>null</code>).
*/
public Color getShadowInnerColor()
{
@@ -420,6 +434,8 @@ public class BevelBorder extends AbstractBorder
* shadowed edges when painting the border, or <code>null</code> if
* that color will be derived from the background of the enclosed
* Component.
+ *
+ * @return The color (possibly <code>null</code>).
*/
public Color getShadowOuterColor()
{
@@ -430,6 +446,8 @@ public class BevelBorder extends AbstractBorder
/**
* Returns the appearance of this border, which is either {@link
* #RAISED} or {@link #LOWERED}.
+ *
+ * @return The bevel type ({@link #RAISED} or {@link #LOWERED}).
*/
public int getBevelType()
{
diff --git a/javax/swing/border/CompoundBorder.java b/javax/swing/border/CompoundBorder.java
index 998a9bab3..a69c5e20a 100644
--- a/javax/swing/border/CompoundBorder.java
+++ b/javax/swing/border/CompoundBorder.java
@@ -224,6 +224,8 @@ public class CompoundBorder extends AbstractBorder
* Returns the outside border, which is painted outside both the
* bordered Component and the inside border. It is valid for the
* result to be <code>null</code>.
+ *
+ * @return The outside border (possibly <code>null</code>).
*/
public Border getOutsideBorder()
{
@@ -234,6 +236,8 @@ public class CompoundBorder extends AbstractBorder
* Returns the inside border, which is painted between the bordered
* Component and the outside border. It is valid for the result to
* be <code>null</code>.
+ *
+ * @return The inside border (possibly <code>null</code>).
*/
public Border getInsideBorder ()
{
diff --git a/javax/swing/border/EtchedBorder.java b/javax/swing/border/EtchedBorder.java
index 22882b78c..cd48b18da 100644
--- a/javax/swing/border/EtchedBorder.java
+++ b/javax/swing/border/EtchedBorder.java
@@ -281,6 +281,8 @@ public class EtchedBorder extends AbstractBorder
/**
* Returns the appearance of this EtchedBorder, which is either
* {@link #RAISED} or {@link #LOWERED}.
+ *
+ * @return The type ({@link #RAISED} or {@link #LOWERED}).
*/
public int getEtchType()
{
@@ -297,6 +299,8 @@ public class EtchedBorder extends AbstractBorder
*
* @param c the component enclosed by this border.
*
+ * @return The color.
+ *
* @see java.awt.Component#getBackground()
* @see java.awt.Color#brighter()
*/
@@ -312,6 +316,8 @@ public class EtchedBorder extends AbstractBorder
* Returns the color that will be used for highlighted parts when
* painting the border, or <code>null</code> if that color will be
* derived from the background of the enclosed Component.
+ *
+ * @return The highlight color (possibly <code>null</code>).
*/
public Color getHighlightColor()
{
@@ -328,6 +334,8 @@ public class EtchedBorder extends AbstractBorder
*
* @param c the component enclosed by this border.
*
+ * @return The shadow color.
+ *
* @see java.awt.Component#getBackground()
* @see java.awt.Color#darker()
*/
@@ -344,6 +352,8 @@ public class EtchedBorder extends AbstractBorder
* Returns the color that will be used for shadowed parts when
* painting the border, or <code>null</code> if that color will be
* derived from the background of the enclosed Component.
+ *
+ * @return The shadow color (possibly <code>null</code>).
*/
public Color getShadowColor()
{
diff --git a/javax/swing/border/LineBorder.java b/javax/swing/border/LineBorder.java
index 36abddd91..31e19fe1f 100644
--- a/javax/swing/border/LineBorder.java
+++ b/javax/swing/border/LineBorder.java
@@ -162,8 +162,10 @@ public class LineBorder extends AbstractBorder
/**
- * Returns a black, one pixel thick, plain LineBorder. The method
- * may always return the same (singleton) LineBorder instance.
+ * Returns a black, one pixel thick, plain {@link LineBorder}. The method
+ * may always return the same (singleton) {@link LineBorder} instance.
+ *
+ * @return The border.
*/
public static Border createBlackLineBorder()
{
@@ -178,8 +180,10 @@ public class LineBorder extends AbstractBorder
/**
- * Returns a gray, one pixel thick, plain LineBorder. The method
- * may always return the same (singleton) LineBorder instance.
+ * Returns a gray, one pixel thick, plain {@link LineBorder}. The method
+ * may always return the same (singleton) {@link LineBorder} instance.
+ *
+ * @return The border.
*/
public static Border createGrayLineBorder()
{
@@ -295,6 +299,8 @@ public class LineBorder extends AbstractBorder
/**
* Returns the color of the line.
+ *
+ * @return The line color (never <code>null</code>).
*/
public Color getLineColor()
{
@@ -304,6 +310,8 @@ public class LineBorder extends AbstractBorder
/**
* Returns the thickness of the line in pixels.
+ *
+ * @return The line thickness (in pixels).
*/
public int getThickness()
{
diff --git a/javax/swing/border/MatteBorder.java b/javax/swing/border/MatteBorder.java
index 4d5b8c253..114cac623 100644
--- a/javax/swing/border/MatteBorder.java
+++ b/javax/swing/border/MatteBorder.java
@@ -299,6 +299,8 @@ public class MatteBorder extends EmptyBorder
* Returns the color that is used for filling the border, or
* <code>null</code> if the border is filled with repetitions of a
* tile icon.
+ *
+ * @return The color (possibly <code>null</code>).
*/
public Color getMatteColor()
{
@@ -310,6 +312,8 @@ public class MatteBorder extends EmptyBorder
* Returns the icon is used for tiling the border, or
* <code>null</code> if the border is filled with a color instead of
* an icon.
+ *
+ * @return The icon (possibly <code>null</code>).
*/
public Icon getTileIcon()
{
diff --git a/javax/swing/border/TitledBorder.java b/javax/swing/border/TitledBorder.java
index 8d3ee13d4..38b575423 100644
--- a/javax/swing/border/TitledBorder.java
+++ b/javax/swing/border/TitledBorder.java
@@ -912,8 +912,10 @@ public class TitledBorder extends AbstractBorder
* Calculates the minimum size needed for displaying the border
* and its title.
*
- * @param c the Component for which this TitledBorder consitutes
+ * @param c the Component for which this TitledBorder constitutes
* a border.
+ *
+ * @return The minimum size.
*/
public Dimension getMinimumSize(Component c)
{
@@ -980,6 +982,10 @@ public class TitledBorder extends AbstractBorder
/**
* Performs various measurements for the current state of this TitledBorder
* and the given Component.
+ *
+ * @param c the component (<code>null</code> not permitted).
+ *
+ * @return Various measurements.
*/
private Measurements getMeasurements(Component c)
{
@@ -1172,6 +1178,8 @@ public class TitledBorder extends AbstractBorder
/**
* Calculates the minimum size needed for displaying the border
* and its title. Used by {@link TitledBorder#getMinimumSize(Component)}.
+ *
+ * @return The minimum size.
*/
public Dimension getMinimumSize()
{
diff --git a/javax/swing/event/ChangeEvent.java b/javax/swing/event/ChangeEvent.java
index f75c15aac..8854282a9 100644
--- a/javax/swing/event/ChangeEvent.java
+++ b/javax/swing/event/ChangeEvent.java
@@ -1,5 +1,5 @@
/* ChangeEvent.java --
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,23 +37,30 @@ exception statement from your version. */
package javax.swing.event;
-// Imports
import java.util.EventObject;
/**
- * ChangeEvent
+ * An event used to signal a state change for an object.
+ *
+ * @see ChangeListener
+ * @see CellEditorListener
+ * @see TableColumnModelListener
+ *
* @author Andrew Selkirk
* @author Ronald Veldema
*/
-public class ChangeEvent extends EventObject {
+public class ChangeEvent
+ extends EventObject
+{
- /**
- * ChangeEvent constructor
- * @param source Source object
- */
- public ChangeEvent(Object source) {
- super(source);
- } // ChangeEvent()
+ /**
+ * Creates a new <code>ChangeEvent</code> instance for the specified source.
+ *
+ * @param source the source for the event (<code>null</code> not permitted).
+ */
+ public ChangeEvent(Object source)
+ {
+ super(source);
+ }
-
-} // ChangeEvent
+}
diff --git a/javax/swing/event/ChangeListener.java b/javax/swing/event/ChangeListener.java
index 1e58b1d82..75809707b 100644
--- a/javax/swing/event/ChangeListener.java
+++ b/javax/swing/event/ChangeListener.java
@@ -1,5 +1,5 @@
/* ChangeListener.java --
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,21 +37,27 @@ exception statement from your version. */
package javax.swing.event;
-// Imports
import java.util.EventListener;
/**
- * ChangeListener interface
+ * A <code>ChangeListener</code> can register with an object to receive
+ * notification of state changes (for objects that support this mechanism).
+ *
* @author Andrew Selkirk
* @author Ronald Veldema
*/
-public interface ChangeListener extends EventListener {
-
- /**
- * State changed
- * @param event Change Event
- */
- void stateChanged(ChangeEvent event);
-
-
-} // ChangeListener
+public interface ChangeListener
+ extends EventListener
+{
+
+ /**
+ * Called by an object to notify the listener that the object's state has
+ * changed. The incoming <code>event</code> identifies the
+ * <code>source</code> of the event, allowing the listener to differentiate
+ * when it is listening for changes in multiple sources.
+ *
+ * @param event the change event.
+ */
+ void stateChanged(ChangeEvent event);
+
+}
diff --git a/javax/swing/event/InternalFrameEvent.java b/javax/swing/event/InternalFrameEvent.java
index badfa80ac..4e289bfb7 100644
--- a/javax/swing/event/InternalFrameEvent.java
+++ b/javax/swing/event/InternalFrameEvent.java
@@ -1,5 +1,5 @@
/* InternalFrameEvent.java --
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -43,6 +43,8 @@ import java.awt.AWTEvent;
import javax.swing.JInternalFrame;
/**
+ * An event that indicates a change to a {@link JInternalFrame} component.
+ *
* @author Andrew Selkirk
*/
public class InternalFrameEvent extends AWTEvent
@@ -50,55 +52,59 @@ public class InternalFrameEvent extends AWTEvent
private static final long serialVersionUID = -5204823611874873183L;
/**
- * Internal frame activated event
+ * Internal frame activated event.
*/
public static final int INTERNAL_FRAME_ACTIVATED = 25554;
/**
- * Internal frame closed event
+ * Internal frame closed event.
*/
public static final int INTERNAL_FRAME_CLOSED = 25551;
/**
- * Internal frame closing event
+ * Internal frame closing event.
*/
public static final int INTERNAL_FRAME_CLOSING = 25550;
/**
- * Internal frame deactivated event
+ * Internal frame deactivated event.
*/
public static final int INTERNAL_FRAME_DEACTIVATED = 25555;
/**
- * Internal frame deiconifed event
+ * Internal frame deiconifed event.
*/
public static final int INTERNAL_FRAME_DEICONIFIED = 25553;
/**
- * Internal frame frame first event
+ * Internal frame frame first event.
*/
public static final int INTERNAL_FRAME_FIRST = 25549;
/**
- * Internal frame iconified event
+ * Internal frame iconified event.
*/
public static final int INTERNAL_FRAME_ICONIFIED = 25552;
/**
- * Internal frame last event
+ * Internal frame last event.
*/
public static final int INTERNAL_FRAME_LAST = 25555;
/**
- * Internal frame opened event
+ * Internal frame opened event.
*/
public static final int INTERNAL_FRAME_OPENED = 25549;
/**
- * Creates a <code>JInternalFrameEvent</code> object.
+ * Creates a new <code>JInternalFrameEvent</code> instance.
*
- * @param source The source of this event.
- * @param id Then event ID of this event.
+ * @param source the source of this event (<code>null</code> not permitted).
+ * @param id the event ID of this event (see the constants defined by this
+ * class).
+ *
+ * @throws IllegalArgumentException if <code>source</code> is
+ * <code>null</code>.
*/
public InternalFrameEvent(JInternalFrame source, int id)
{
@@ -106,10 +112,43 @@ public class InternalFrameEvent extends AWTEvent
}
/**
- * Returns the <code>JInternalFrame</code> object stored in this event.
+ * Returns the <code>JInternalFrame</code> component that is the source for
+ * this event.
+ *
+ * @return The source.
+ *
+ * @since 1.3
*/
public JInternalFrame getInternalFrame()
{
return (JInternalFrame) source;
}
+
+ /**
+ * Returns a string that indicates the event id. This is used by the
+ * {@link #toString()} method.
+ *
+ * @return A string that indicates the event id.
+ */
+ public String paramString()
+ {
+ switch (id) {
+ case INTERNAL_FRAME_ACTIVATED:
+ return "INTERNAL_FRAME_ACTIVATED";
+ case INTERNAL_FRAME_CLOSED:
+ return "INTERNAL_FRAME_CLOSED";
+ case INTERNAL_FRAME_CLOSING:
+ return "INTERNAL_FRAME_CLOSING";
+ case INTERNAL_FRAME_DEACTIVATED:
+ return "INTERNAL_FRAME_DEACTIVATED";
+ case INTERNAL_FRAME_DEICONIFIED:
+ return "INTERNAL_FRAME_DEICONIFIED";
+ case INTERNAL_FRAME_ICONIFIED:
+ return "INTERNAL_FRAME_ICONIFIED";
+ case INTERNAL_FRAME_OPENED:
+ return "INTERNAL_FRAME_OPENED";
+ default:
+ return "unknown type";
+ }
+ }
}
diff --git a/javax/swing/event/TableColumnModelListener.java b/javax/swing/event/TableColumnModelListener.java
index 90e1b29cc..522e0a8c6 100644
--- a/javax/swing/event/TableColumnModelListener.java
+++ b/javax/swing/event/TableColumnModelListener.java
@@ -1,5 +1,5 @@
/* TableColumnModelListener.java --
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,44 +37,58 @@ exception statement from your version. */
package javax.swing.event;
-// Imports
import java.util.EventListener;
+import javax.swing.table.TableColumnModel;
+
/**
- * TableColumnModelListener public interface
+ * A <code>TableColumnModelListener</code> can register with a
+ * {@link TableColumnModel} to receive notification of changes to the model.
+ *
* @author Andrew Selkirk
*/
-public interface TableColumnModelListener extends EventListener {
-
- /**
- * Column added
- * @param event Table Column Model Event
- */
- void columnAdded(TableColumnModelEvent event);
-
- /**
- * Column margin changed
- * @param event Change Event
- */
- void columnMarginChanged(ChangeEvent event);
-
- /**
- * Column moved
- * @param event Table Column Model Event
- */
- void columnMoved(TableColumnModelEvent event);
-
- /**
- * Column removed
- * @param event Table Column Model Event
- */
- void columnRemoved(TableColumnModelEvent event);
-
- /**
- * Column selection changed
- * @param event List Selection Event
- */
- void columnSelectionChanged(ListSelectionEvent event);
-
-
-} // TableColumnModelListener
+public interface TableColumnModelListener
+ extends EventListener
+{
+
+ /**
+ * Called by the {@link TableColumnModel} to indicate that a column has been
+ * added to the model.
+ *
+ * @param event information about the column addition.
+ */
+ void columnAdded(TableColumnModelEvent event);
+
+ /**
+ * Called by the {@link TableColumnModel} to indicate that the model's
+ * column margin has changed.
+ *
+ * @param event the event (identifies the source).
+ */
+ void columnMarginChanged(ChangeEvent event);
+
+ /**
+ * Called by the {@link TableColumnModel} to indicate that a column has been
+ * moved.
+ *
+ * @param event information about the column move.
+ */
+ void columnMoved(TableColumnModelEvent event);
+
+ /**
+ * Called by the {@link TableColumnModel} to indicate that a column has been
+ * removed from the model.
+ *
+ * @param event information about the column removal.
+ */
+ void columnRemoved(TableColumnModelEvent event);
+
+ /**
+ * Called by the {@link TableColumnModel} to indicate that the column
+ * selection state has changed.
+ *
+ * @param event information about the column selection state.
+ */
+ void columnSelectionChanged(ListSelectionEvent event);
+
+}
diff --git a/javax/swing/filechooser/UnixFileSystemView.java b/javax/swing/filechooser/UnixFileSystemView.java
index c2f65965e..96dfd2e1b 100644
--- a/javax/swing/filechooser/UnixFileSystemView.java
+++ b/javax/swing/filechooser/UnixFileSystemView.java
@@ -37,8 +37,11 @@ exception statement from your version. */
package javax.swing.filechooser;
+import gnu.classpath.NotImplementedException;
+
import java.io.File;
import java.io.IOException;
+
import javax.swing.Icon;
@@ -110,6 +113,7 @@ class UnixFileSystemView extends FileSystemView
* @return <code>null</code>.
*/
public String getSystemDisplayName(File f)
+ throws NotImplementedException
{
// FIXME: Implement;
return null;
@@ -124,6 +128,7 @@ class UnixFileSystemView extends FileSystemView
* @return <code>null</code>.
*/
public Icon getSystemIcon(File f)
+ throws NotImplementedException
{
// FIXME: Implement;
return null;
@@ -138,6 +143,7 @@ class UnixFileSystemView extends FileSystemView
* @return <code>null</code>.
*/
public String getSystemTypeDescription(File f)
+ throws NotImplementedException
{
// FIXME: Implement.
return null;
diff --git a/javax/swing/plaf/basic/BasicButtonListener.java b/javax/swing/plaf/basic/BasicButtonListener.java
index 1fca69451..89e99a29a 100644
--- a/javax/swing/plaf/basic/BasicButtonListener.java
+++ b/javax/swing/plaf/basic/BasicButtonListener.java
@@ -52,6 +52,7 @@ import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@@ -204,14 +205,12 @@ public class BasicButtonListener implements MouseListener, MouseMotionListener,
{
AbstractButton button = (AbstractButton) e.getSource();
ButtonModel model = button.getModel();
- if (button.isRolloverEnabled())
+ if (button.isRolloverEnabled()
+ && ! SwingUtilities.isLeftMouseButton(e))
model.setRollover(true);
-
- if (model.isPressed()
- && (e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) != 0)
+
+ if (model.isPressed())
model.setArmed(true);
- else
- model.setArmed(false);
}
}
diff --git a/javax/swing/plaf/basic/BasicButtonUI.java b/javax/swing/plaf/basic/BasicButtonUI.java
index ab079fc5e..7dbcb9146 100644
--- a/javax/swing/plaf/basic/BasicButtonUI.java
+++ b/javax/swing/plaf/basic/BasicButtonUI.java
@@ -172,8 +172,10 @@ public class BasicButtonUI extends ButtonUI
{
if (b.getFont() instanceof UIResource)
b.setFont(null);
- b.setForeground(null);
- b.setBackground(null);
+ if (b.getForeground() instanceof UIResource)
+ b.setForeground(null);
+ if (b.getBackground() instanceof UIResource)
+ b.setBackground(null);
if (b.getBorder() instanceof UIResource)
b.setBorder(null);
b.setIconTextGap(defaultTextIconGap);
diff --git a/javax/swing/plaf/basic/BasicComboBoxEditor.java b/javax/swing/plaf/basic/BasicComboBoxEditor.java
index 4cbc4ae68..d87926196 100644
--- a/javax/swing/plaf/basic/BasicComboBoxEditor.java
+++ b/javax/swing/plaf/basic/BasicComboBoxEditor.java
@@ -39,14 +39,10 @@ exception statement from your version. */
package javax.swing.plaf.basic;
import java.awt.Component;
-import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
-import java.util.Iterator;
-import java.util.LinkedList;
-
import javax.swing.ComboBoxEditor;
import javax.swing.JTextField;
@@ -62,8 +58,6 @@ public class BasicComboBoxEditor extends Object implements ComboBoxEditor,
/** The editor component. */
protected JTextField editor;
- private ComboBoxEditorListener listener;
-
/**
* Creates a new <code>BasicComboBoxEditor</code> instance.
*/
@@ -72,7 +66,6 @@ public class BasicComboBoxEditor extends Object implements ComboBoxEditor,
editor = new JTextField();
editor.setBorder(null);
editor.setColumns(9);
- listener = new ComboBoxEditorListener();
}
/**
@@ -156,7 +149,7 @@ public class BasicComboBoxEditor extends Object implements ComboBoxEditor,
*/
public void addActionListener(ActionListener l)
{
- listener.addListener(l);
+ editor.addActionListener(l);
}
/**
@@ -166,7 +159,7 @@ public class BasicComboBoxEditor extends Object implements ComboBoxEditor,
*/
public void removeActionListener(ActionListener l)
{
- listener.removeListener(l);
+ editor.removeActionListener(l);
}
/**
@@ -185,37 +178,4 @@ public class BasicComboBoxEditor extends Object implements ComboBoxEditor,
}
}
- /**
- * Helper class that forwards action events between the jtextfield
- * editor and the basic combo box editor for use by the combo box.
- */
- class ComboBoxEditorListener implements ActionListener
- {
- private final LinkedList listeners = new LinkedList();
-
- public void actionPerformed(ActionEvent ae)
- {
- ActionEvent nae;
- nae = new ActionEvent(BasicComboBoxEditor.this,
- ae.getID(), ae.getActionCommand(),
- ae.getWhen(), ae.getModifiers());
- Iterator it = listeners.iterator();
- while (it.hasNext())
- ((ActionListener) it.next()).actionPerformed(nae);
- }
-
- void addListener(ActionListener al)
- {
- if (listeners.size() == 0)
- editor.addActionListener(this);
- listeners.add(al);
- }
-
- void removeListener(ActionListener al)
- {
- listeners.remove(al);
- if (listeners.size() == 0)
- editor.removeActionListener(this);
- }
- }
}
diff --git a/javax/swing/plaf/basic/BasicComboBoxUI.java b/javax/swing/plaf/basic/BasicComboBoxUI.java
index 5b183786f..557eea93f 100644
--- a/javax/swing/plaf/basic/BasicComboBoxUI.java
+++ b/javax/swing/plaf/basic/BasicComboBoxUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
@@ -70,7 +72,6 @@ import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.LookAndFeel;
-import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
@@ -672,9 +673,7 @@ public class BasicComboBoxUI extends ComboBoxUI
*/
public Dimension getPreferredSize(JComponent c)
{
- Dimension size = getMinimumSize(c);
- size.width += 4;
- return size;
+ return getMinimumSize(c);
}
/**
@@ -691,10 +690,8 @@ public class BasicComboBoxUI extends ComboBoxUI
{
Insets i = getInsets();
Dimension d = getDisplaySize();
- d.height += i.top + i.bottom;
- int arrowButtonWidth = d.height - (i.top + i.bottom);
- cachedMinimumSize = new Dimension(d.width + arrowButtonWidth + i.left
- + i.right, d.height);
+ d.width += i.left + i.right + d.height;
+ cachedMinimumSize = new Dimension(d.width, d.height + i.top + i.bottom);
isMinimumSizeDirty = false;
}
return new Dimension(cachedMinimumSize);
@@ -710,9 +707,7 @@ public class BasicComboBoxUI extends ComboBoxUI
*/
public Dimension getMaximumSize(JComponent c)
{
- Dimension size = getPreferredSize(c);
- size.width = 32767;
- return size;
+ return new Dimension(32767, 32767);
}
public int getAccessibleChildrenCount(JComponent c)
@@ -780,11 +775,16 @@ public class BasicComboBoxUI extends ComboBoxUI
*/
protected Rectangle rectangleForCurrentValue()
{
- Rectangle cbBounds = SwingUtilities.getLocalBounds(comboBox);
- Rectangle abBounds = arrowButton.getBounds();
- Rectangle rectForCurrentValue = new Rectangle(cbBounds.x, cbBounds.y,
- cbBounds.width - abBounds.width, cbBounds.height);
- return rectForCurrentValue;
+ int w = comboBox.getWidth();
+ int h = comboBox.getHeight();
+ Insets i = comboBox.getInsets();
+ int arrowSize = h - (i.top + i.bottom);
+ if (arrowButton != null)
+ {
+ arrowSize = arrowButton.getWidth();
+ }
+ return new Rectangle(i.left, i.top, w - (i.left + i.right + arrowSize),
+ h - (i.top + i.left));
}
/**
@@ -902,9 +902,9 @@ public class BasicComboBoxUI extends ComboBoxUI
false);
currentValuePane.add(comp);
comp.setFont(comboBox.getFont());
- int h = comp.getPreferredSize().height;
+ Dimension d = comp.getPreferredSize();
currentValuePane.remove(comp);
- return new Dimension(100, h);
+ return d;
}
/**
@@ -915,37 +915,58 @@ public class BasicComboBoxUI extends ComboBoxUI
*/
protected Dimension getDisplaySize()
{
- if (comboBox.isEditable() && comboBox.getModel().getSize() == 0)
- return new Dimension(100, editor.getPreferredSize().height);
-
Dimension dim = new Dimension();
ListCellRenderer renderer = comboBox.getRenderer();
- ComboBoxModel model = comboBox.getModel();
- if (renderer != null && model.getSize() > 0)
+ if (renderer == null)
{
- // TODO: Optimize using prototype here.
+ renderer = DEFAULT_RENDERER;
+ }
+
+ Object prototype = comboBox.getPrototypeDisplayValue();
+ if (prototype != null)
+ {
+ Component comp = renderer.getListCellRendererComponent
+ (listBox, prototype, -1, false, false);
+ currentValuePane.add(comp);
+ comp.setFont(comboBox.getFont());
+ Dimension renderSize = comp.getPreferredSize();
+ currentValuePane.remove(comp);
+ dim.height = renderSize.height;
+ dim.width = renderSize.width;
+ }
+ else
+ {
+ ComboBoxModel model = comboBox.getModel();
int size = model.getSize();
- for (int i = 0; i < size; ++i)
+ if (size > 0)
{
- Component comp = renderer.getListCellRendererComponent
- (listBox, model.getElementAt(i), -1, false, false);
- currentValuePane.add(comp);
- comp.setFont(comboBox.getFont());
- Dimension renderSize = comp.getPreferredSize();
- currentValuePane.remove(comp);
- dim.width = Math.max(dim.width, renderSize.width);
- dim.height = Math.max(dim.height, renderSize.height);
+ for (int i = 0; i < size; ++i)
+ {
+ Component comp = renderer.getListCellRendererComponent
+ (listBox, model.getElementAt(i), -1, false, false);
+ currentValuePane.add(comp);
+ comp.setFont(comboBox.getFont());
+ Dimension renderSize = comp.getPreferredSize();
+ currentValuePane.remove(comp);
+ dim.width = Math.max(dim.width, renderSize.width);
+ dim.height = Math.max(dim.height, renderSize.height);
+ }
}
- if (comboBox.isEditable())
+ else
{
- Dimension editSize = editor.getPreferredSize();
- dim.width = Math.max(dim.width, editSize.width);
- dim.height = Math.max(dim.height, editSize.height);
+ dim = getDefaultSize();
+ if (comboBox.isEditable())
+ dim.width = 100;
}
- displaySize.setSize(dim.width, dim.height);
- return displaySize;
}
- return getDefaultSize();
+ if (comboBox.isEditable())
+ {
+ Dimension editSize = editor.getPreferredSize();
+ dim.width = Math.max(dim.width, editSize.width);
+ dim.height = Math.max(dim.height, editSize.height);
+ }
+ displaySize.setSize(dim.width, dim.height);
+ return dim;
}
/**
@@ -953,6 +974,7 @@ public class BasicComboBoxUI extends ComboBoxUI
* by the look and feel.
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Need to implement.
}
@@ -962,6 +984,7 @@ public class BasicComboBoxUI extends ComboBoxUI
* installed by in {@link #installListeners}.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Need to implement.
}
@@ -1046,12 +1069,11 @@ public class BasicComboBoxUI extends ComboBoxUI
int arrowSize = comboBox.getHeight() - (i.top + i.bottom);
int editorWidth = comboBox.getBounds().width - arrowSize;
- if (editor != null)
- editor.setBounds(rectangleForCurrentValue());
-
if (arrowButton != null)
arrowButton.setBounds(comboBox.getWidth() - (i.right + arrowSize),
i.top, arrowSize, arrowSize);
+ if (editor != null)
+ editor.setBounds(rectangleForCurrentValue());
}
}
diff --git a/javax/swing/plaf/basic/BasicComboPopup.java b/javax/swing/plaf/basic/BasicComboPopup.java
index aa058b87d..d4eabc602 100644
--- a/javax/swing/plaf/basic/BasicComboPopup.java
+++ b/javax/swing/plaf/basic/BasicComboPopup.java
@@ -38,9 +38,12 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
+import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ItemEvent;
@@ -185,6 +188,8 @@ public class BasicComboPopup extends JPopupMenu implements ComboPopup
{
Dimension size = comboBox.getSize();
size.height = getPopupHeightForRowCount(comboBox.getMaximumRowCount());
+ Insets i = getInsets();
+ size.width -= i.left + i.right;
Rectangle bounds = computePopupBounds(0, comboBox.getBounds().height,
size.width, size.height);
@@ -197,7 +202,8 @@ public class BasicComboPopup extends JPopupMenu implements ComboPopup
list.ensureIndexIsVisible(list.getSelectedIndex());
setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled());
- show(comboBox, bounds.x, bounds.y); }
+ show(comboBox, bounds.x, bounds.y);
+ }
/**
* This method hides drop down list of items
@@ -288,6 +294,7 @@ public class BasicComboPopup extends JPopupMenu implements ComboPopup
* This method uninstalls keyboard actions installed by the UI.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Need to implement
}
@@ -555,6 +562,7 @@ public class BasicComboPopup extends JPopupMenu implements ComboPopup
* DOCUMENT ME!
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Need to implement
}
@@ -710,7 +718,7 @@ public class BasicComboPopup extends JPopupMenu implements ComboPopup
totalHeight += dim.height;
}
- return totalHeight;
+ return totalHeight == 0 ? 100 : totalHeight;
}
/**
diff --git a/javax/swing/plaf/basic/BasicFileChooserUI.java b/javax/swing/plaf/basic/BasicFileChooserUI.java
index 30e3156b4..daa977083 100644
--- a/javax/swing/plaf/basic/BasicFileChooserUI.java
+++ b/javax/swing/plaf/basic/BasicFileChooserUI.java
@@ -157,6 +157,21 @@ public class BasicFileChooserUI extends FileChooserUI
closeDialog();
}
}
+ else
+ {
+ File f = new File(filechooser.getCurrentDirectory(), getFileName());
+ if (filechooser.isTraversable(f))
+ {
+ filechooser.setCurrentDirectory(f);
+ filechooser.rescanCurrentDirectory();
+ }
+ else
+ {
+ filechooser.setSelectedFile(f);
+ filechooser.approveSelection();
+ closeDialog();
+ }
+ }
}
}
@@ -1046,9 +1061,7 @@ public class BasicFileChooserUI extends FileChooserUI
*/
public String getFileName()
{
- // FIXME: I'm thinking that this method just provides access to the
- // text value in the JTextField component...but not sure yet
- return null; //filename;
+ return entry.getText();
}
/**
diff --git a/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java b/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java
index d7e26669f..11980f6ca 100644
--- a/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java
+++ b/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java
@@ -520,22 +520,22 @@ public class BasicInternalFrameTitlePane extends JComponent
}
/** The action command for the Close action. */
- protected static final String CLOSE_CMD = "Close";
+ protected static final String CLOSE_CMD;
/** The action command for the Minimize action. */
- protected static final String ICONIFY_CMD = "Minimize";
+ protected static final String ICONIFY_CMD;
/** The action command for the Maximize action. */
- protected static final String MAXIMIZE_CMD = "Maximize";
+ protected static final String MAXIMIZE_CMD;
/** The action command for the Move action. */
- protected static final String MOVE_CMD = "Move";
+ protected static final String MOVE_CMD;
/** The action command for the Restore action. */
- protected static final String RESTORE_CMD = "Restore";
+ protected static final String RESTORE_CMD;
/** The action command for the Size action. */
- protected static final String SIZE_CMD = "Size";
+ protected static final String SIZE_CMD;
/** The action associated with closing the JInternalFrame. */
protected Action closeAction;
@@ -614,6 +614,17 @@ public class BasicInternalFrameTitlePane extends JComponent
* This is package-private to avoid an accessor method.
*/
transient JLabel title;
+
+ static
+ {
+ // not constants in JDK
+ CLOSE_CMD = "Close";
+ ICONIFY_CMD = "Minimize";
+ MAXIMIZE_CMD = "Maximize";
+ MOVE_CMD = "Move";
+ RESTORE_CMD = "Restore";
+ SIZE_CMD = "Size";
+ }
/**
* Creates a new BasicInternalFrameTitlePane object that is used in the
diff --git a/javax/swing/plaf/basic/BasicInternalFrameUI.java b/javax/swing/plaf/basic/BasicInternalFrameUI.java
index c6f3dd99e..0a330e776 100644
--- a/javax/swing/plaf/basic/BasicInternalFrameUI.java
+++ b/javax/swing/plaf/basic/BasicInternalFrameUI.java
@@ -38,10 +38,13 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
+import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
@@ -164,6 +167,12 @@ public class BasicInternalFrameUI extends InternalFrameUI
protected class BorderListener extends MouseInputAdapter
implements SwingConstants
{
+ /**
+ * If true, the cursor is being already shown in the alternative "resize"
+ * shape.
+ */
+ transient boolean showingResizeCursor;
+
/** FIXME: Use for something. */
protected final int RESIZE_NONE = 0;
@@ -263,25 +272,69 @@ public class BasicInternalFrameUI extends InternalFrameUI
/**
* This method is called when the mouse exits the JInternalFrame.
- *
+ *
* @param e The MouseEvent.
*/
public void mouseExited(MouseEvent e)
{
- // There is nothing to do when the mouse exits
- // the border area.
+ // Reset the cursor shape.
+ if (showingResizeCursor)
+ {
+ frame.setCursor(Cursor.getDefaultCursor());
+ showingResizeCursor = false;
+ }
}
/**
- * This method is called when the mouse is moved inside the
- * JInternalFrame.
- *
+ * This method is called when the mouse is moved inside the JInternalFrame.
+ *
* @param e The MouseEvent.
*/
public void mouseMoved(MouseEvent e)
{
- // There is nothing to do when the mouse moves
- // over the border area.
+ // Turn off the resize cursor if we are in the frame header.
+ if (showingResizeCursor && e.getSource() != frame)
+ {
+ frame.setCursor(Cursor.getDefaultCursor());
+ showingResizeCursor = false;
+ }
+ else if (e.getSource()==frame && frame.isResizable())
+ {
+ int cursor;
+ switch (sectionOfClick(e.getX(), e.getY()))
+ {
+ case NORTH:
+ cursor = Cursor.N_RESIZE_CURSOR;
+ break;
+ case NORTH_EAST:
+ cursor = Cursor.NE_RESIZE_CURSOR;
+ break;
+ case EAST:
+ cursor = Cursor.E_RESIZE_CURSOR;
+ break;
+ case SOUTH_EAST:
+ cursor = Cursor.SE_RESIZE_CURSOR;
+ break;
+ case SOUTH:
+ cursor = Cursor.S_RESIZE_CURSOR;
+ break;
+ case SOUTH_WEST:
+ cursor = Cursor.SW_RESIZE_CURSOR;
+ break;
+ case WEST:
+ cursor = Cursor.W_RESIZE_CURSOR;
+ break;
+ case NORTH_WEST:
+ cursor = Cursor.NW_RESIZE_CURSOR;
+ break;
+ default:
+ cursor = Cursor.DEFAULT_CURSOR;
+ }
+
+ Cursor resize = Cursor.getPredefinedCursor(cursor);
+ frame.setCursor(resize);
+ showingResizeCursor = true;
+ }
}
/**
@@ -1158,6 +1211,7 @@ public class BasicInternalFrameUI extends InternalFrameUI
* This method installs the keyboard actions for the JInternalFrame.
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Implement.
}
@@ -1240,6 +1294,7 @@ public class BasicInternalFrameUI extends InternalFrameUI
* This method uninstalls the keyboard actions for the JInternalFrame.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Implement.
}
diff --git a/javax/swing/plaf/basic/BasicLabelUI.java b/javax/swing/plaf/basic/BasicLabelUI.java
index d0964f473..60e3a9868 100644
--- a/javax/swing/plaf/basic/BasicLabelUI.java
+++ b/javax/swing/plaf/basic/BasicLabelUI.java
@@ -37,6 +37,8 @@
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
@@ -372,6 +374,7 @@ public class BasicLabelUI extends LabelUI implements PropertyChangeListener
* @param l The {@link JLabel} to install keyboard actions for.
*/
protected void installKeyboardActions(JLabel l)
+ throws NotImplementedException
{
//FIXME: implement.
}
@@ -382,6 +385,7 @@ public class BasicLabelUI extends LabelUI implements PropertyChangeListener
* @param l The {@link JLabel} to uninstall keyboard actions for.
*/
protected void uninstallKeyboardActions(JLabel l)
+ throws NotImplementedException
{
//FIXME: implement.
}
diff --git a/javax/swing/plaf/basic/BasicListUI.java b/javax/swing/plaf/basic/BasicListUI.java
index 5cde9630c..d9bc0676d 100644
--- a/javax/swing/plaf/basic/BasicListUI.java
+++ b/javax/swing/plaf/basic/BasicListUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
@@ -1025,6 +1027,7 @@ public class BasicListUI extends ListUI
* Uninstalls keyboard actions for this UI in the {@link JList}.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
diff --git a/javax/swing/plaf/basic/BasicLookAndFeel.java b/javax/swing/plaf/basic/BasicLookAndFeel.java
index 3451224be..78c16ef08 100644
--- a/javax/swing/plaf/basic/BasicLookAndFeel.java
+++ b/javax/swing/plaf/basic/BasicLookAndFeel.java
@@ -44,6 +44,7 @@ import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
+import java.awt.SystemColor;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent;
@@ -52,10 +53,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Enumeration;
-import java.util.Iterator;
import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.WeakHashMap;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
@@ -66,11 +64,9 @@ import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
-import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
import javax.swing.LookAndFeel;
import javax.swing.MenuSelectionManager;
-import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.border.BevelBorder;
@@ -104,11 +100,6 @@ public abstract class BasicLookAndFeel extends LookAndFeel
{
/**
- * Registered popups for autoclose.
- */
- private WeakHashMap autoClosePopups = new WeakHashMap();
-
- /**
* Receives an event from the event queue.
*
* @param event
@@ -137,46 +128,8 @@ public abstract class BasicLookAndFeel extends LookAndFeel
target = ((Container) target).findComponentAt(ev.getPoint());
if (! m.isComponentPartOfCurrentMenu(target))
m.clearSelectedPath();
-
- // Handle other registered popup instances, like ComboBox popups.
- autoClosePopups(ev, target);
- }
-
- /**
- * Registers Popup and its content to be autoclosed when a mouseclick
- * occurs outside of the popup.
- *
- * @param popup the popup to be autoclosed when clicked outside
- */
- void registerForAutoClose(JPopupMenu popup)
- {
- autoClosePopups.put(popup, null);
}
- /**
- * Automatically closes all popups that are not 'hit' by the mouse event.
- *
- * @param ev the mouse event
- * @param target the target of the mouse event
- */
- private void autoClosePopups(MouseEvent ev, Component target)
- {
- if (autoClosePopups.size() != 0)
- {
- Set popups = autoClosePopups.keySet();
- Iterator i = popups.iterator();
- while (i.hasNext())
- {
- JPopupMenu popup = (JPopupMenu) i.next();
- if (!(target == popup
- || SwingUtilities.isDescendingFrom(target, popup)))
- {
- popup.setVisible(false);
- i.remove();
- }
- }
- }
- }
}
/**
@@ -251,7 +204,7 @@ public abstract class BasicLookAndFeel extends LookAndFeel
*/
public BasicLookAndFeel()
{
- // TODO
+ // Nothing to do here.
}
/**
@@ -337,59 +290,138 @@ public abstract class BasicLookAndFeel extends LookAndFeel
/**
* Populates the <code>defaults</code> table with system color defaults.
+ *
+ * This sets up a couple of default values and passes them to
+ * {@link #loadSystemColors(UIDefaults, String[], boolean)}. If the
+ * look and feel is a native look and feel, these defaults may be overridden
+ * by the corresponding SystemColor constants.
*
* @param defaults the defaults table (<code>null</code> not permitted).
*/
protected void initSystemColorDefaults(UIDefaults defaults)
{
- Color highLight = new Color(249, 247, 246);
- Color light = new Color(239, 235, 231);
- Color shadow = new Color(139, 136, 134);
- Color darkShadow = new Color(16, 16, 16);
-
- Object[] uiDefaults;
- uiDefaults = new Object[] {
- "activeCaption", new ColorUIResource(0, 0, 128),
- "activeCaptionBorder", new ColorUIResource(Color.lightGray),
- "activeCaptionText", new ColorUIResource(Color.white),
- "control", new ColorUIResource(light),
- "controlDkShadow", new ColorUIResource(shadow),
- "controlHighlight", new ColorUIResource(highLight),
- "controlLtHighlight", new ColorUIResource(highLight),
- "controlShadow", new ColorUIResource(shadow),
- "controlText", new ColorUIResource(darkShadow),
- "desktop", new ColorUIResource(0, 92, 92),
- "inactiveCaption", new ColorUIResource(Color.gray),
- "inactiveCaptionBorder", new ColorUIResource(Color.lightGray),
- "inactiveCaptionText", new ColorUIResource(Color.lightGray),
- "info", new ColorUIResource(light),
- "infoText", new ColorUIResource(darkShadow),
- "menu", new ColorUIResource(light),
- "menuText", new ColorUIResource(darkShadow),
- "scrollbar", new ColorUIResource(light),
- "text", new ColorUIResource(Color.white),
- "textHighlight", new ColorUIResource(Color.black),
- "textHighlightText", new ColorUIResource(Color.white),
- "textInactiveText", new ColorUIResource(Color.gray),
- "textText", new ColorUIResource(Color.black),
- "window", new ColorUIResource(light),
- "windowBorder", new ColorUIResource(Color.black),
- "windowText", new ColorUIResource(darkShadow)
+ String[] defaultColors = new String[] {
+ "activeCaption", "#000080",
+ "activeCaptionBorder", "#C0C0C0",
+ "activeCaptionText", "#FFFFFF",
+ "control", "#C0C0C0",
+ "controlDkShadow", "#000000",
+ "controlHighlight", "#C0C0C0",
+ "controlLtHighlight", "#FFFFFF",
+ "controlShadow", "#808080",
+ "controlText", "#000000",
+ "desktop", "#005C5C",
+ "inactiveCaption", "#808080",
+ "inactiveCaptionBorder", "#C0C0C0",
+ "inactiveCaptionText", "#C0C0C0",
+ "info", "#FFFFE1",
+ "infoText", "#000000",
+ "menu", "#C0C0C0",
+ "menuText", "#000000",
+ "scrollbar", "#E0E0E0",
+ "text", "#C0C0C0",
+ "textHighlight", "#000080",
+ "textHighlightText", "#FFFFFF",
+ "textInactiveText", "#808080",
+ "textText", "#000000",
+ "window", "#FFFFFF",
+ "windowBorder", "#000000",
+ "windowText", "#000000"
};
- defaults.putDefaults(uiDefaults);
+ loadSystemColors(defaults, defaultColors, isNativeLookAndFeel());
}
/**
- * Loads the system colors. This method is not implemented yet.
- *
+ * Populates the <code>defaults</code> table with the system colors. If
+ * <code>useNative</code> is <code>true</code>, the table is populated
+ * with the constants in {@link SystemColor}, otherwise the
+ * <code>systemColors</code> parameter is decoded into the defaults table.
+ * The system colors array is made up of pairs, where the first entry is the
+ * name of the system color, and the second entry is a string denoting
+ * an RGB color value like &quot;#C0C0C0&quot;, which is decoded using
+ * {@link Color#decode(String)}.
+ *
* @param defaults the defaults table (<code>null</code> not permitted).
- * @param systemColors TODO
- * @param useNative TODO
+ * @param systemColors defaults to use when <code>useNative</code> is
+ * <code>false</code>
+ * @param useNative when <code>true</code>, installs the values of the
+ * SystemColor constants, when <code>false</code>, install the values
+ * from <code>systemColors</code>
*/
protected void loadSystemColors(UIDefaults defaults, String[] systemColors,
boolean useNative)
{
- // TODO
+ if (useNative)
+ {
+ defaults.put("activeCaption",
+ new ColorUIResource(SystemColor.ACTIVE_CAPTION));
+ defaults.put("activeCaptionBorder",
+ new ColorUIResource(SystemColor.ACTIVE_CAPTION_BORDER));
+ defaults.put("activeCaptionText",
+ new ColorUIResource(SystemColor.ACTIVE_CAPTION_TEXT));
+ defaults.put("control",
+ new ColorUIResource(SystemColor.CONTROL));
+ defaults.put("controlDkShadow",
+ new ColorUIResource(SystemColor.CONTROL_DK_SHADOW));
+ defaults.put("controlHighlight",
+ new ColorUIResource(SystemColor.CONTROL_HIGHLIGHT));
+ defaults.put("controlLtHighlight",
+ new ColorUIResource(SystemColor.CONTROL_LT_HIGHLIGHT));
+ defaults.put("controlShadow",
+ new ColorUIResource(SystemColor.CONTROL_SHADOW));
+ defaults.put("controlText",
+ new ColorUIResource(SystemColor.CONTROL_TEXT));
+ defaults.put("desktop",
+ new ColorUIResource(SystemColor.DESKTOP));
+ defaults.put("inactiveCaption",
+ new ColorUIResource(SystemColor.INACTIVE_CAPTION));
+ defaults.put("inactiveCaptionBorder",
+ new ColorUIResource(SystemColor.INACTIVE_CAPTION_BORDER));
+ defaults.put("inactiveCaptionText",
+ new ColorUIResource(SystemColor.INACTIVE_CAPTION_TEXT));
+ defaults.put("info",
+ new ColorUIResource(SystemColor.INFO));
+ defaults.put("infoText",
+ new ColorUIResource(SystemColor.INFO_TEXT));
+ defaults.put("menu",
+ new ColorUIResource(SystemColor.MENU));
+ defaults.put("menuText",
+ new ColorUIResource(SystemColor.MENU_TEXT));
+ defaults.put("scrollbar",
+ new ColorUIResource(SystemColor.SCROLLBAR));
+ defaults.put("text",
+ new ColorUIResource(SystemColor.TEXT));
+ defaults.put("textHighlight",
+ new ColorUIResource(SystemColor.TEXT_HIGHLIGHT));
+ defaults.put("textHighlightText",
+ new ColorUIResource(SystemColor.TEXT_HIGHLIGHT_TEXT));
+ defaults.put("textInactiveText",
+ new ColorUIResource(SystemColor.TEXT_INACTIVE_TEXT));
+ defaults.put("textText",
+ new ColorUIResource(SystemColor.TEXT_TEXT));
+ defaults.put("window",
+ new ColorUIResource(SystemColor.WINDOW));
+ defaults.put("windowBorder",
+ new ColorUIResource(SystemColor.WINDOW_BORDER));
+ defaults.put("windowText",
+ new ColorUIResource(SystemColor.WINDOW_TEXT));
+ }
+ else
+ {
+ for (int i = 0; i < systemColors.length; i += 2)
+ {
+ Color color = Color.BLACK;
+ try
+ {
+ color = Color.decode(systemColors[i + 1]);
+ }
+ catch (NumberFormatException e)
+ {
+ e.printStackTrace();
+ }
+ defaults.put(systemColors[i], new ColorUIResource(color));
+ }
+ }
}
/**
@@ -1162,6 +1194,7 @@ public abstract class BasicLookAndFeel extends LookAndFeel
"TabbedPane.shadow", new ColorUIResource(shadow),
"TabbedPane.tabbedPaneContentBorderInsets", new InsetsUIResource(3, 2, 1, 2),
"TabbedPane.tabbedPaneTabPadInsets", new InsetsUIResource(1, 1, 1, 1),
+ "TabbedPane.tabsOpaque", Boolean.TRUE,
"TabbedPane.tabAreaInsets", new InsetsUIResource(3, 2, 0, 2),
"TabbedPane.tabInsets", new InsetsUIResource(0, 4, 1, 4),
"TabbedPane.tabRunOverlay", new Integer(2),
@@ -1648,17 +1681,4 @@ public abstract class BasicLookAndFeel extends LookAndFeel
toolkit.removeAWTEventListener(popupHelper);
popupHelper = null;
}
-
- /**
- * Registers a JPopupMenu for autoclosing when a mouseclick occurs outside
- * of the JPopupMenu. This must be called when the popup gets opened. The
- * popup is unregistered from autoclosing as soon as it either got closed
- * by this helper, or when it has been garbage collected.
- *
- * @param popup the popup menu to autoclose
- */
- void registerForAutoClose(JPopupMenu popup)
- {
- popupHelper.registerForAutoClose(popup);
- }
}
diff --git a/javax/swing/plaf/basic/BasicMenuBarUI.java b/javax/swing/plaf/basic/BasicMenuBarUI.java
index a21514467..f258ebe30 100644
--- a/javax/swing/plaf/basic/BasicMenuBarUI.java
+++ b/javax/swing/plaf/basic/BasicMenuBarUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Dimension;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
@@ -176,6 +178,7 @@ public class BasicMenuBarUI extends MenuBarUI
* This method installs the keyboard actions for the JMenuBar.
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement
}
@@ -223,6 +226,7 @@ public class BasicMenuBarUI extends MenuBarUI
* This method reverses the work done in installKeyboardActions.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement.
}
diff --git a/javax/swing/plaf/basic/BasicMenuItemUI.java b/javax/swing/plaf/basic/BasicMenuItemUI.java
index 9166c49ee..69c9c4507 100644
--- a/javax/swing/plaf/basic/BasicMenuItemUI.java
+++ b/javax/swing/plaf/basic/BasicMenuItemUI.java
@@ -40,6 +40,7 @@ package javax.swing.plaf.basic;
import java.awt.Color;
import java.awt.Component;
+import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
@@ -82,6 +83,7 @@ import javax.swing.plaf.ActionMapUIResource;
import javax.swing.plaf.ComponentInputMapUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.MenuItemUI;
+import javax.swing.text.View;
/**
* UI Delegate for JMenuItem.
@@ -183,7 +185,43 @@ public class BasicMenuItemUI extends MenuItemUI
/** A PropertyChangeListener to make UI updates after property changes **/
PropertyChangeHandler propertyChangeListener;
-
+
+ /**
+ * The view rectangle used for layout of the menu item.
+ */
+ private Rectangle viewRect;
+
+ /**
+ * The rectangle that holds the area of the label.
+ */
+ private Rectangle textRect;
+
+ /**
+ * The rectangle that holds the area of the accelerator.
+ */
+ private Rectangle accelRect;
+
+ /**
+ * The rectangle that holds the area of the icon.
+ */
+ private Rectangle iconRect;
+
+ /**
+ * The rectangle that holds the area of the icon.
+ */
+ private Rectangle arrowIconRect;
+
+ /**
+ * The rectangle that holds the area of the check icon.
+ */
+ private Rectangle checkIconRect;
+
+ /**
+ * A rectangle used for temporary storage to avoid creation of new
+ * rectangles.
+ */
+ private Rectangle cachedRect;
+
/**
* A class to handle PropertChangeEvents for the JMenuItem
* @author Anthony Balkissoon abalkiss at redhat dot com.
@@ -242,6 +280,15 @@ public class BasicMenuItemUI extends MenuItemUI
menuKeyListener = createMenuKeyListener(menuItem);
itemListener = new ItemHandler();
propertyChangeListener = new PropertyChangeHandler();
+
+ // Initialize rectangles for layout.
+ viewRect = new Rectangle();
+ textRect = new Rectangle();
+ iconRect = new Rectangle();
+ arrowIconRect = new Rectangle();
+ checkIconRect = new Rectangle();
+ accelRect = new Rectangle();
+ cachedRect = new Rectangle();
}
/**
@@ -378,50 +425,69 @@ public class BasicMenuItemUI extends MenuItemUI
int defaultTextIconGap)
{
JMenuItem m = (JMenuItem) c;
- Dimension d = BasicGraphicsUtils.getPreferredButtonSize(m,
- defaultTextIconGap);
-
- // if menu item has accelerator then take accelerator's size into account
- // when calculating preferred size.
- KeyStroke accelerator = m.getAccelerator();
- Rectangle rect;
-
- if (accelerator != null)
+ String accelText = getAcceleratorString(m);
+
+ // Layout the menu item. The result gets stored in the rectangle
+ // fields of this class.
+ layoutMenuItem(m, accelText);
+
+ // The union of the text and icon areas is the label area.
+ cachedRect.setBounds(textRect);
+ Rectangle pref = SwingUtilities.computeUnion(iconRect.x, iconRect.y,
+ iconRect.width,
+ iconRect.height,
+ cachedRect);
+
+ // Find the widest menu item text and accelerator and store it in
+ // client properties of the parent, so that we can align the accelerators
+ // properly. Of course, we only need can do this, if the parent is
+ // a JComponent and this menu item is not a toplevel menu.
+ Container parent = m.getParent();
+ if (parent != null && parent instanceof JComponent
+ && !(m instanceof JMenu && ((JMenu) m).isTopLevelMenu()))
{
- rect = getAcceleratorRect(
- accelerator,
- m.getToolkit().getFontMetrics(acceleratorFont));
+ JComponent p = (JComponent) parent;
- // add width of accelerator's text
- d.width += rect.width + defaultAcceleratorLabelGap;
+ // The widest text so far.
+ Integer maxTextWidth = (Integer) p.getClientProperty("maxTextWidth");
+ int maxTextValue = maxTextWidth == null ? 0 : maxTextWidth.intValue();
+ if (pref.width < maxTextValue)
+ pref.width = maxTextValue;
+ else
+ p.putClientProperty("maxTextWidth", new Integer(pref.width));
- // adjust the heigth of the preferred size if necessary
- if (d.height < rect.height)
- d.height = rect.height;
+ // The widest accelerator so far.
+ Integer maxAccelWidth = (Integer) p.getClientProperty("maxAccelWidth");
+ int maxAccelValue = maxAccelWidth == null ? 0
+ : maxAccelWidth.intValue();
+ if (accelRect.width > maxAccelValue)
+ {
+ maxAccelValue = accelRect.width;
+ p.putClientProperty("maxAccelWidth", new Integer(accelRect.width));
+ }
+ pref.width += maxAccelValue;
+ pref.width += defaultTextIconGap;
}
- if (checkIcon != null)
+ // Add arrow and check size if appropriate.
+ if (! (m instanceof JMenu && ((JMenu) m).isTopLevelMenu()))
{
- d.width += checkIcon.getIconWidth() + defaultTextIconGap;
-
- if (checkIcon.getIconHeight() > d.height)
- d.height = checkIcon.getIconHeight();
+ pref.width += checkIconRect.width;
+ pref.width += defaultTextIconGap;
+ pref.width += arrowIconRect.width;
+ pref.width += defaultTextIconGap;
}
- if (arrowIcon != null && (c instanceof JMenu))
- {
- int pWidth = m.getParent().getWidth();
- if (!((JMenu)c).isTopLevelMenu() && d.width < pWidth)
- d.width = pWidth
- - m.getInsets().left - m.getInsets().right;
- else
- d.width += arrowIcon.getIconWidth() + MenuGap;
-
- if (arrowIcon.getIconHeight() > d.height)
- d.height = arrowIcon.getIconHeight();
- }
-
- return d;
+ // Add a gap ~2 times as wide as the defaultTextIconGap.
+ pref.width += 2 * defaultTextIconGap;
+
+ // Respect the insets of the menu item.
+ Insets i = m.getInsets();
+ pref.width += i.left + i.right;
+ pref.height += i.top + i.bottom;
+
+ // Return a copy, so that nobody messes with our textRect.
+ return pref.getSize();
}
/**
@@ -541,7 +607,7 @@ public class BasicMenuItemUI extends MenuItemUI
*/
public void paint(Graphics g, JComponent c)
{
- paintMenuItem(g, c, checkIcon, arrowIcon, c.getBackground(),
+ paintMenuItem(g, c, checkIcon, arrowIcon, selectionBackground,
c.getForeground(), defaultTextIconGap);
}
@@ -560,16 +626,18 @@ public class BasicMenuItemUI extends MenuItemUI
// Menu item is considered to be highlighted when it is selected.
// But we don't want to paint the background of JCheckBoxMenuItems
ButtonModel mod = menuItem.getModel();
- if (menuItem.isContentAreaFilled())
+ Color saved = g.getColor();
+ if (mod.isArmed() || ((menuItem instanceof JMenu) && mod.isSelected()))
{
- if ((menuItem.isSelected() && checkIcon == null) || (mod != null &&
- mod.isArmed())
- && (menuItem.getParent() instanceof MenuElement))
- g.setColor(selectionBackground);
- else
- g.setColor(bgColor);
+ g.setColor(bgColor);
+ g.fillRect(0, 0, menuItem.getWidth(), menuItem.getHeight());
+ }
+ else if (menuItem.isOpaque())
+ {
+ g.setColor(menuItem.getBackground());
g.fillRect(0, 0, menuItem.getWidth(), menuItem.getHeight());
- }
+ }
+ g.setColor(saved);
}
/**
@@ -595,87 +663,123 @@ public class BasicMenuItemUI extends MenuItemUI
Color foreground, int defaultTextIconGap)
{
JMenuItem m = (JMenuItem) c;
- Rectangle tr = new Rectangle(); // text rectangle
- Rectangle ir = new Rectangle(); // icon rectangle
- Rectangle vr = new Rectangle(); // view rectangle
- Rectangle br = new Rectangle(); // border rectangle
- Rectangle ar = new Rectangle(); // accelerator rectangle
- Rectangle cr = new Rectangle(); // checkIcon rectangle
-
- int vertAlign = m.getVerticalAlignment();
- int horAlign = m.getHorizontalAlignment();
- int vertTextPos = m.getVerticalTextPosition();
- int horTextPos = m.getHorizontalTextPosition();
-
- Font f = m.getFont();
- g.setFont(f);
- FontMetrics fm = g.getFontMetrics(f);
- SwingUtilities.calculateInnerArea(m, vr);
+
+ // Fetch fonts.
+ Font oldFont = g.getFont();
+ Font font = c.getFont();
+ g.setFont(font);
+ FontMetrics accelFm = m.getFontMetrics(acceleratorFont);
+
+ // Create accelerator string.
+ String accelText = getAcceleratorString(m);
+
+ // Layout menu item. The result gets stored in the rectangle fields
+ // of this class.
+ layoutMenuItem(m, accelText);
+
+ // Paint the background.
paintBackground(g, m, background);
- /*
- * MenuItems insets are equal to menuItems margin, space between text and
- * menuItems border. We need to paint insets region as well.
- */
- Insets insets = m.getInsets();
- br.x -= insets.left;
- br.y -= insets.top;
- br.width += insets.right + insets.left;
- br.height += insets.top + insets.bottom;
+ Color oldColor = g.getColor();
- // If this menu item is a JCheckBoxMenuItem then paint check icon
+ // Paint the check icon.
if (checkIcon != null)
{
- SwingUtilities.layoutCompoundLabel(m, fm, null, checkIcon, vertAlign,
- horAlign, vertTextPos, horTextPos,
- vr, cr, tr, defaultTextIconGap);
- checkIcon.paintIcon(m, g, cr.x, cr.y);
- // We need to calculate position of the menu text and position of
- // user menu icon if there exists one relative to the check icon.
- // So we need to adjust view rectangle s.t. its starting point is at
- // checkIcon.width + defaultTextIconGap.
- vr.x = cr.x + cr.width + defaultTextIconGap;
+ checkIcon.paintIcon(m, g, checkIconRect.x, checkIconRect.y);
+ }
+
+ // Paint the icon.
+ ButtonModel model = m.getModel();
+ if (m.getIcon() != null)
+ {
+ // Determine icon depending on the menu item
+ // state (normal/disabled/pressed).
+ Icon icon;
+ if (! m.isEnabled())
+ {
+ icon = m.getDisabledIcon();
+ }
+ else if (model.isPressed() && model.isArmed())
+ {
+ icon = m.getPressedIcon();
+ if (icon == null)
+ {
+ icon = m.getIcon();
+ }
+ }
+ else
+ {
+ icon = m.getIcon();
+ }
+
+ if (icon != null)
+ {
+ icon.paintIcon(m, g, iconRect.x, iconRect.y);
+ }
}
- // if this is a submenu, then paint arrow icon to indicate it.
- if (arrowIcon != null && (c instanceof JMenu))
+ // Paint the text.
+ String text = m.getText();
+ if (text != null)
{
- if (!((JMenu) c).isTopLevelMenu())
+ // Handle HTML.
+ View html = (View) m.getClientProperty(BasicHTML.propertyKey);
+ if (html != null)
+ {
+ html.paint(g, textRect);
+ }
+ else
{
- int width = arrowIcon.getIconWidth();
- int height = arrowIcon.getIconHeight();
- int offset = (vr.height - height) / 2;
- arrowIcon.paintIcon(m, g, vr.width - width, vr.y + offset);
+ paintText(g, m, textRect, text);
}
}
- // paint text and user menu icon if it exists
- Icon i = m.getIcon();
- SwingUtilities.layoutCompoundLabel(c, fm, m.getText(), i, vertAlign,
- horAlign, vertTextPos, horTextPos, vr,
- ir, tr, defaultTextIconGap);
- if (i != null)
- i.paintIcon(c, g, ir.x, ir.y);
- paintText(g, m, tr, m.getText());
+ // Paint accelerator text.
+ if (! accelText.equals(""))
+ {
+ // Align the accelerator text. In getPreferredMenuItemSize() we
+ // store a client property 'maxAccelWidth' in the parent which holds
+ // the maximum accelerator width for the children of this parent.
+ // We use this here to align the accelerators properly.
+ int accelOffset = 0;
+ Container parent = m.getParent();
+ if (parent != null && parent instanceof JComponent)
+ {
+ JComponent p = (JComponent) parent;
+ Integer maxAccelWidth =
+ (Integer) p.getClientProperty("maxAccelWidth");
+ int maxAccelValue = maxAccelWidth == null ? 0
+ : maxAccelWidth.intValue();
+ accelOffset = maxAccelValue - accelRect.width;
+ }
- // paint accelerator
- String acceleratorText = "";
+ g.setFont(acceleratorFont);
+ if (! m.isEnabled())
+ {
+ // Paint accelerator disabled.
+ g.setColor(disabledForeground);
+ }
+ else
+ {
+ if (m.isArmed() || (m instanceof JMenu && m.isSelected()))
+ g.setColor(acceleratorSelectionForeground);
+ else
+ g.setColor(acceleratorForeground);
+ }
+ g.drawString(accelText, accelRect.x - accelOffset,
+ accelRect.y + accelFm.getAscent());
+ }
- if (m.getAccelerator() != null)
+ // Paint arrow.
+ if (arrowIcon != null
+ && ! (m instanceof JMenu && ((JMenu) m).isTopLevelMenu()))
{
- acceleratorText = getAcceleratorText(m.getAccelerator());
- fm = g.getFontMetrics(acceleratorFont);
- ar.width = fm.stringWidth(acceleratorText);
- ar.x = br.width - ar.width;
- vr.x = br.width - ar.width - defaultTextIconGap;
-
- SwingUtilities.layoutCompoundLabel(m, fm, acceleratorText, null,
- vertAlign, horAlign, vertTextPos,
- horTextPos, vr, ir, ar,
- defaultTextIconGap);
-
- paintAccelerator(g, m, ar, acceleratorText);
+ arrowIcon.paintIcon(m, g, arrowIconRect.x, arrowIconRect.y);
}
+
+ g.setFont(oldFont);
+ g.setColor(oldColor);
+
}
/**
@@ -860,37 +964,6 @@ public class BasicMenuItemUI extends MenuItemUI
}
/**
- * Paints accelerator inside menu item
- *
- * @param g
- * The graphics context used to paint the border
- * @param menuItem
- * Menu item for which to draw accelerator
- * @param acceleratorRect
- * rectangle representing position of the accelerator relative to the
- * menu item
- * @param acceleratorText
- * accelerator's text
- */
- private void paintAccelerator(Graphics g, JMenuItem menuItem,
- Rectangle acceleratorRect,
- String acceleratorText)
- {
- g.setFont(acceleratorFont);
- FontMetrics fm = g.getFontMetrics(acceleratorFont);
-
- if (menuItem.isEnabled())
- g.setColor(acceleratorForeground);
- else
- // FIXME: should fix this to use 'disabledForeground', but its
- // default value in BasicLookAndFeel is null.
- g.setColor(Color.gray);
-
- BasicGraphicsUtils.drawString(g, acceleratorText, 0, acceleratorRect.x,
- acceleratorRect.y + fm.getAscent());
- }
-
- /**
* This class handles mouse events occuring inside the menu item. Most of the
* events are forwarded for processing to MenuSelectionManager of the current
* menu hierarchy.
@@ -1139,4 +1212,134 @@ public class BasicMenuItemUI extends MenuItemUI
menuItem.repaint();
}
}
+
+ /**
+ * A helper method to create the accelerator string from the menu item's
+ * accelerator property. The returned string is empty if there is
+ * no accelerator defined.
+ *
+ * @param m the menu item
+ *
+ * @return the accelerator string, not null
+ */
+ private String getAcceleratorString(JMenuItem m)
+ {
+ // Create accelerator string.
+ KeyStroke accel = m.getAccelerator();
+ String accelText = "";
+ if (accel != null)
+ {
+ int mods = accel.getModifiers();
+ if (mods > 0)
+ {
+ accelText = KeyEvent.getKeyModifiersText(mods);
+ accelText += acceleratorDelimiter;
+ }
+ int keycode = accel.getKeyCode();
+ if (keycode != 0)
+ accelText += KeyEvent.getKeyText(keycode);
+ else
+ accelText += accel.getKeyChar();
+ }
+ return accelText;
+ }
+
+ /**
+ * A helper method that lays out the menu item. The layout is stored
+ * in the fields of this class.
+ *
+ * @param m the menu item to layout
+ * @param accelText the accelerator text
+ */
+ private void layoutMenuItem(JMenuItem m, String accelText)
+ {
+ int width = m.getWidth();
+ int height = m.getHeight();
+
+ // Reset rectangles.
+ iconRect.setBounds(0, 0, 0, 0);
+ textRect.setBounds(0, 0, 0, 0);
+ accelRect.setBounds(0, 0, 0, 0);
+ checkIconRect.setBounds(0, 0, 0, 0);
+ arrowIconRect.setBounds(0, 0, 0, 0);
+ viewRect.setBounds(0, 0, width, height);
+
+ // Substract insets to the view rect.
+ Insets insets = m.getInsets();
+ viewRect.x += insets.left;
+ viewRect.y += insets.top;
+ viewRect.width -= (insets.left + insets.right);
+ viewRect.height -= (insets.top + insets.bottom);
+
+ // Fetch the fonts.
+ Font font = m.getFont();
+ FontMetrics fm = m.getFontMetrics(font);
+ FontMetrics accelFm = m.getFontMetrics(acceleratorFont);
+
+ String text = m.getText();
+ SwingUtilities.layoutCompoundLabel(m, fm, text, m.getIcon(),
+ m.getVerticalAlignment(),
+ m.getHorizontalAlignment(),
+ m.getVerticalTextPosition(),
+ m.getHorizontalTextPosition(),
+ viewRect, iconRect, textRect,
+ defaultTextIconGap);
+
+ // Initialize accelerator width and height.
+ if (! accelText.equals(""))
+ {
+ accelRect.width = accelFm.stringWidth(accelText);
+ accelRect.height = accelFm.getHeight();
+ }
+
+ // Initialize check and arrow icon width and height.
+ if (! (m instanceof JMenu && ((JMenu) m).isTopLevelMenu()))
+ {
+ if (checkIcon != null)
+ {
+ checkIconRect.width = checkIcon.getIconWidth();
+ checkIconRect.height = checkIcon.getIconHeight();
+ }
+ if (arrowIcon != null)
+ {
+ arrowIconRect.width = arrowIcon.getIconWidth();
+ arrowIconRect.height = arrowIcon.getIconHeight();
+ }
+ }
+
+ // The union of the icon and text of the menu item is the 'label area'.
+ cachedRect.setBounds(textRect);
+ Rectangle labelRect = SwingUtilities.computeUnion(iconRect.x,
+ iconRect.y,
+ iconRect.width,
+ iconRect.height,
+ cachedRect);
+ textRect.x += defaultTextIconGap;
+ iconRect.x += defaultTextIconGap;
+
+ // Layout accelerator rect.
+ accelRect.x = viewRect.x + viewRect.width - arrowIconRect.width
+ - defaultTextIconGap - accelRect.width;
+ // Layout check and arrow icons only when not in toplevel menu.
+ if (! (m instanceof JMenu && ((JMenu) m).isTopLevelMenu()))
+ {
+ checkIconRect.x = viewRect.x + defaultTextIconGap;
+ textRect.x += defaultTextIconGap + checkIconRect.width;
+ iconRect.x += defaultTextIconGap + checkIconRect.width;
+ arrowIconRect.x = viewRect.x + viewRect.width - defaultTextIconGap
+ - arrowIconRect.width;
+ }
+
+ // Align the accelerator text and all the icons vertically centered to
+ // the menu text.
+ accelRect.y = labelRect.y + (labelRect.height / 2)
+ - (accelRect.height / 2);
+ if (! (m instanceof JMenu && ((JMenu) m).isTopLevelMenu()))
+ {
+ arrowIconRect.y = labelRect.y + (labelRect.height / 2)
+ - (arrowIconRect.height / 2);
+ checkIconRect.y = labelRect.y + (labelRect.height / 2)
+ - (checkIconRect.height / 2);
+ }
+ }
}
diff --git a/javax/swing/plaf/basic/BasicMenuUI.java b/javax/swing/plaf/basic/BasicMenuUI.java
index 4fb250d24..f8936be5b 100644
--- a/javax/swing/plaf/basic/BasicMenuUI.java
+++ b/javax/swing/plaf/basic/BasicMenuUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
@@ -218,6 +220,7 @@ public class BasicMenuUI extends BasicMenuItemUI
*
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Need to implement
}
@@ -262,6 +265,7 @@ public class BasicMenuUI extends BasicMenuItemUI
* Basic look and feel's defaults.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Need to implement
}
diff --git a/javax/swing/plaf/basic/BasicOptionPaneUI.java b/javax/swing/plaf/basic/BasicOptionPaneUI.java
index 005a3b394..88bca3b53 100644
--- a/javax/swing/plaf/basic/BasicOptionPaneUI.java
+++ b/javax/swing/plaf/basic/BasicOptionPaneUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
@@ -1204,6 +1206,7 @@ public class BasicOptionPaneUI extends OptionPaneUI
* This method installs keyboard actions for the JOptionpane.
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement.
}
@@ -1336,6 +1339,7 @@ public class BasicOptionPaneUI extends OptionPaneUI
* This method uninstalls keyboard actions for the JOptionPane.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement.
}
diff --git a/javax/swing/plaf/basic/BasicPopupMenuUI.java b/javax/swing/plaf/basic/BasicPopupMenuUI.java
index 6ecd06b39..a26a5c7c4 100644
--- a/javax/swing/plaf/basic/BasicPopupMenuUI.java
+++ b/javax/swing/plaf/basic/BasicPopupMenuUI.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
@@ -137,6 +139,7 @@ public class BasicPopupMenuUI extends PopupMenuUI
* This method installs the keyboard actions for this {@link JPopupMenu}.
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Need to implement
}
@@ -179,6 +182,7 @@ public class BasicPopupMenuUI extends PopupMenuUI
* Uninstalls any keyboard actions.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Need to implement
}
diff --git a/javax/swing/plaf/basic/BasicRadioButtonUI.java b/javax/swing/plaf/basic/BasicRadioButtonUI.java
index 66e538037..a66fa28e6 100644
--- a/javax/swing/plaf/basic/BasicRadioButtonUI.java
+++ b/javax/swing/plaf/basic/BasicRadioButtonUI.java
@@ -45,6 +45,7 @@ import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.AbstractButton;
+import javax.swing.ButtonModel;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
@@ -142,14 +143,15 @@ public class BasicRadioButtonUI extends BasicToggleButtonUI
g.setFont(f);
+ ButtonModel m = b.getModel();
Icon currentIcon = null;
- if (b.isSelected() && b.isEnabled())
+ if (m.isSelected() && m.isEnabled())
currentIcon = b.getSelectedIcon();
- else if (!b.isSelected() && b.isEnabled())
+ else if (! m.isSelected() && m.isEnabled())
currentIcon = b.getIcon();
- else if (b.isSelected() && !b.isEnabled())
+ else if (m.isSelected() && ! m.isEnabled())
currentIcon = b.getDisabledSelectedIcon();
- else // (!b.isSelected() && !b.isEnabled())
+ else // (!m.isSelected() && ! m.isEnabled())
currentIcon = b.getDisabledIcon();
SwingUtilities.calculateInnerArea(b, vr);
@@ -166,7 +168,7 @@ public class BasicRadioButtonUI extends BasicToggleButtonUI
if (text != null)
paintText(g, b, tr, text);
// TODO: Figure out what is the size parameter?
- if (b.hasFocus() && b.isFocusPainted() && b.isEnabled())
+ if (b.hasFocus() && b.isFocusPainted() && m.isEnabled())
paintFocus(g, tr, null);
}
diff --git a/javax/swing/plaf/basic/BasicRootPaneUI.java b/javax/swing/plaf/basic/BasicRootPaneUI.java
index 28e3b67c1..933db4c6b 100644
--- a/javax/swing/plaf/basic/BasicRootPaneUI.java
+++ b/javax/swing/plaf/basic/BasicRootPaneUI.java
@@ -38,17 +38,98 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
+import javax.swing.AbstractAction;
+import javax.swing.ButtonModel;
+import javax.swing.InputMap;
+import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JRootPane;
+import javax.swing.LookAndFeel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.plaf.ActionMapUIResource;
+import javax.swing.plaf.ComponentInputMapUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.RootPaneUI;
public class BasicRootPaneUI extends RootPaneUI
implements PropertyChangeListener
{
+
+ /**
+ * Performed when the user activates the default button inside the JRootPane,
+ * usually by pressing 'ENTER'.
+ */
+ private class DefaultPressAction
+ extends AbstractAction
+ {
+ /**
+ * The JRootPane for which this action should be installed.
+ */
+ private JRootPane rootPane;
+
+ /**
+ * Creates a new DefaultPressAction for the specified JRootPane.
+ */
+ DefaultPressAction(JRootPane rp)
+ {
+ rootPane = rp;
+ }
+
+ /**
+ * Performes the action.
+ */
+ public void actionPerformed(ActionEvent ev)
+ {
+ JButton b = rootPane.getDefaultButton();
+ if (b != null)
+ {
+ ButtonModel m = b.getModel();
+ m.setArmed(true);
+ m.setPressed(true);
+ }
+ }
+ }
+
+ /**
+ * Performed when the user activates the default button inside the JRootPane,
+ * usually by releasing 'ENTER'.
+ */
+ private class DefaultReleaseAction
+ extends AbstractAction
+ {
+ /**
+ * The JRootPane for which this action should be installed.
+ */
+ private JRootPane rootPane;
+
+ /**
+ * Creates a new DefaultReleaseAction for the specified JRootPane.
+ */
+ DefaultReleaseAction(JRootPane rp)
+ {
+ rootPane = rp;
+ }
+
+ /**
+ * Performes the action.
+ */
+ public void actionPerformed(ActionEvent ev)
+ {
+ JButton b = rootPane.getDefaultButton();
+ if (b != null)
+ {
+ ButtonModel m = b.getModel();
+ m.setPressed(false);
+ m.setArmed(false);
+ }
+ }
+ }
+
public static ComponentUI createUI(JComponent x)
{
return new BasicRootPaneUI();
@@ -107,14 +188,43 @@ public class BasicRootPaneUI extends RootPaneUI
*/
protected void installKeyboardActions(JRootPane rp)
{
- // We currently do not install any keyboard actions here.
- // This method is here anyway for compatibility and to provide
- // the necessary hooks to subclasses.
+ // Install the keyboard actions.
+ ActionMapUIResource am = new ActionMapUIResource();
+ am.put("press", new DefaultPressAction(rp));
+ am.put("release", new DefaultReleaseAction(rp));
+ SwingUtilities.replaceUIActionMap(rp, am);
+
+ // Install the input map from the UIManager. It seems like the actual
+ // bindings are installed in the JRootPane only when the defaultButton
+ // property receives a value. So we also only install an empty
+ // input map here, and fill it in propertyChange.
+ ComponentInputMapUIResource im = new ComponentInputMapUIResource(rp);
+ SwingUtilities.replaceUIInputMap(rp, JComponent.WHEN_IN_FOCUSED_WINDOW,
+ im);
}
public void propertyChange(PropertyChangeEvent event)
{
- // TODO: Implement this properly.
+ JRootPane source = (JRootPane) event.getSource();
+ String propertyName = event.getPropertyName();
+ if (propertyName.equals("defaultButton"))
+ {
+ Object newValue = event.getNewValue();
+ InputMap im =
+ SwingUtilities.getUIInputMap(source,
+ JComponent.WHEN_IN_FOCUSED_WINDOW);
+ if (newValue != null)
+ {
+ Object[] keybindings =
+ (Object[]) UIManager.get
+ ("RootPane.defaultButtonWindowKeyBindings");
+ LookAndFeel.loadKeyBindings(im, keybindings);
+ }
+ else
+ {
+ im.clear();
+ }
+ }
}
/**
@@ -176,6 +286,8 @@ public class BasicRootPaneUI extends RootPaneUI
*/
protected void uninstallKeyboardActions(JRootPane rp)
{
- // We do nothing here.
+ SwingUtilities.replaceUIActionMap(rp, null);
+ SwingUtilities.replaceUIInputMap(rp, JComponent.WHEN_IN_FOCUSED_WINDOW,
+ null);
}
}
diff --git a/javax/swing/plaf/basic/BasicScrollBarUI.java b/javax/swing/plaf/basic/BasicScrollBarUI.java
index 0ab2914ea..f24485484 100644
--- a/javax/swing/plaf/basic/BasicScrollBarUI.java
+++ b/javax/swing/plaf/basic/BasicScrollBarUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
@@ -763,6 +765,7 @@ public class BasicScrollBarUI extends ScrollBarUI implements LayoutManager,
* This method installs the keyboard actions for the scrollbar.
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement.
}
@@ -1141,6 +1144,7 @@ public class BasicScrollBarUI extends ScrollBarUI implements LayoutManager,
* during install.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement.
}
diff --git a/javax/swing/plaf/basic/BasicScrollPaneUI.java b/javax/swing/plaf/basic/BasicScrollPaneUI.java
index 71671b799..e6a4eaf4f 100644
--- a/javax/swing/plaf/basic/BasicScrollPaneUI.java
+++ b/javax/swing/plaf/basic/BasicScrollPaneUI.java
@@ -38,9 +38,15 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
+import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ContainerEvent;
+import java.awt.event.ContainerListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.beans.PropertyChangeEvent;
@@ -53,6 +59,8 @@ import javax.swing.JViewport;
import javax.swing.LookAndFeel;
import javax.swing.ScrollPaneConstants;
import javax.swing.ScrollPaneLayout;
+import javax.swing.Scrollable;
+import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.ComponentUI;
@@ -222,18 +230,149 @@ public class BasicScrollPaneUI extends ScrollPaneUI
*/
protected class MouseWheelHandler implements MouseWheelListener
{
+ /**
+ * Use to compute the visible rectangle.
+ */
+ final Rectangle rect = new Rectangle();
/**
- * Receives notification whenever the mouse wheel is moved.
- *
- * @param event the mouse wheel event
+ * Scroll with the mouse whell.
+ *
+ * @author Audrius Meskauskas (audriusa@Bioinformatics.org)
*/
- public void mouseWheelMoved(MouseWheelEvent event)
+ public void mouseWheelMoved(MouseWheelEvent e)
{
- // TODO: Implement this properly.
+ if (scrollpane.getViewport().getComponentCount() == 0)
+ return;
+
+ Component target = scrollpane.getViewport().getComponent(0);
+ JScrollBar bar = scrollpane.getVerticalScrollBar();
+ Scrollable scrollable = (target instanceof Scrollable) ? (Scrollable) target
+ : null;
+
+ boolean tracksHeight = scrollable != null
+ && scrollable.getScrollableTracksViewportHeight();
+ int wheel = e.getWheelRotation() * ROWS_PER_WHEEL_CLICK;
+ int delta;
+
+ // If possible, scroll vertically.
+ if (bar != null && ! tracksHeight)
+ {
+ if (scrollable != null)
+ {
+ bounds(target);
+ delta = scrollable.getScrollableUnitIncrement(
+ rect, SwingConstants.VERTICAL, wheel);
+ }
+ else
+ {
+ // Scroll non scrollables.
+ delta = wheel * SCROLL_NON_SCROLLABLES;
+ }
+ scroll(bar, delta);
+ }
+ // If not, try to scroll horizontally
+ else
+ {
+ bar = scrollpane.getHorizontalScrollBar();
+ boolean tracksWidth = scrollable != null
+ && scrollable.getScrollableTracksViewportWidth();
+
+ if (bar != null && ! tracksWidth)
+ {
+ if (scrollable != null)
+ {
+ bounds(target);
+ delta = scrollable.getScrollableUnitIncrement(
+ rect, SwingConstants.HORIZONTAL, wheel);
+ }
+ else
+ {
+ // Scroll non scrollables.
+ delta = wheel * SCROLL_NON_SCROLLABLES;
+ }
+ scroll(bar, delta);
+ }
+ }
}
+
+ /**
+ * Place the component bounds into rect. The x and y values
+ * need to be reversed.
+ *
+ * @param target the target being scrolled
+ */
+ final void bounds(Component target)
+ {
+ // Viewport bounds, translated by the scroll bar positions.
+ target.getParent().getBounds(rect);
+ rect.x = getValue(scrollpane.getHorizontalScrollBar());
+ rect.y = getValue(scrollpane.getVerticalScrollBar());
+ }
+
+ /**
+ * Get the scroll bar value or null if there is no such scroll bar.
+ */
+ final int getValue(JScrollBar bar)
+ {
+ return bar != null ? bar.getValue() : 0;
+ }
+
+ /**
+ * Scroll the given distance.
+ *
+ * @param bar the scrollbar to scroll
+ * @param delta the distance
+ */
+ final void scroll(JScrollBar bar, int delta)
+ {
+ int y = bar.getValue() + delta;
+
+ if (y < bar.getMinimum())
+ y = bar.getMinimum();
+ if (y > bar.getMaximum())
+ y = bar.getMaximum();
+ bar.setValue(y);
+ }
+ }
+
+ /**
+ * Adds/removes the mouse wheel listener when the component is added/removed
+ * to/from the scroll pane view port.
+ *
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+ class ViewportContainerListener implements ContainerListener
+ {
+ /**
+ * Add the mouse wheel listener, allowing to scroll with the mouse.
+ */
+ public void componentAdded(ContainerEvent e)
+ {
+ e.getChild().addMouseWheelListener(mouseWheelListener);
+ }
+
+ /**
+ * Remove the mouse wheel listener.
+ */
+ public void componentRemoved(ContainerEvent e)
+ {
+ e.getChild().removeMouseWheelListener(mouseWheelListener);
+ }
}
+
+ /**
+ * The number of pixels by that we should scroll the content that does
+ * not implement Scrollable.
+ */
+ static int SCROLL_NON_SCROLLABLES = 10;
+
+ /**
+ * The number of rows to scroll per mouse wheel click. From impression,
+ * Sun seems using the value 3.
+ */
+ static int ROWS_PER_WHEEL_CLICK = 3;
/** The Scrollpane for which the UI is provided by this class. */
protected JScrollPane scrollpane;
@@ -262,6 +401,12 @@ public class BasicScrollPaneUI extends ScrollPaneUI
* The mousewheel listener for the scrollpane.
*/
MouseWheelListener mouseWheelListener;
+
+ /**
+ * The listener to add and remove the mouse wheel listener to/from
+ * the component container.
+ */
+ ContainerListener containerListener;
public static ComponentUI createUI(final JComponent c)
{
@@ -316,11 +461,21 @@ public class BasicScrollPaneUI extends ScrollPaneUI
if (viewportChangeListener == null)
viewportChangeListener = createViewportChangeListener();
- sp.getViewport().addChangeListener(viewportChangeListener);
-
+
if (mouseWheelListener == null)
mouseWheelListener = createMouseWheelListener();
- sp.addMouseWheelListener(mouseWheelListener);
+
+ if (containerListener == null)
+ containerListener = new ViewportContainerListener();
+
+ JViewport v = sp.getViewport();
+ v.addChangeListener(viewportChangeListener);
+ v.addContainerListener(containerListener);
+
+ // Add mouse wheel listeners to the componets that are probably already
+ // in the view port.
+ for (int i = 0; i < v.getComponentCount(); i++)
+ v.getComponent(i).addMouseWheelListener(mouseWheelListener);
}
/**
@@ -331,6 +486,7 @@ public class BasicScrollPaneUI extends ScrollPaneUI
* @param sp the scrollpane to install keyboard actions on
*/
protected void installKeyboardActions(JScrollPane sp)
+ throws NotImplementedException
{
// TODO: Is this only a hook method or should we actually do something
// here? If the latter, than figure out what and implement this.
@@ -408,8 +564,14 @@ public class BasicScrollPaneUI extends ScrollPaneUI
.removeChangeListener(hsbChangeListener);
sp.getVerticalScrollBar().getModel()
.removeChangeListener(vsbChangeListener);
- sp.getViewport().removeChangeListener(viewportChangeListener);
- sp.removeMouseWheelListener(mouseWheelListener);
+
+ JViewport v = sp.getViewport();
+ v.removeChangeListener(viewportChangeListener);
+ v.removeContainerListener(containerListener);
+
+ for (int i = 0; i < v.getComponentCount(); i++)
+ v.getComponent(i).removeMouseWheelListener(mouseWheelListener);
+
}
/**
@@ -420,6 +582,7 @@ public class BasicScrollPaneUI extends ScrollPaneUI
* @param sp the scrollpane to uninstall keyboard actions from
*/
protected void uninstallKeyboardActions(JScrollPane sp)
+ throws NotImplementedException
{
// TODO: Is this only a hook method or should we actually do something
// here? If the latter, than figure out what and implement this.
diff --git a/javax/swing/plaf/basic/BasicSliderUI.java b/javax/swing/plaf/basic/BasicSliderUI.java
index 694aa9612..137ab55a6 100644
--- a/javax/swing/plaf/basic/BasicSliderUI.java
+++ b/javax/swing/plaf/basic/BasicSliderUI.java
@@ -1,5 +1,5 @@
/* BasicSliderUI.java --
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Component;
import java.awt.ComponentOrientation;
@@ -61,7 +63,9 @@ import java.util.Dictionary;
import java.util.Enumeration;
import javax.swing.AbstractAction;
+import javax.swing.ActionMap;
import javax.swing.BoundedRangeModel;
+import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JSlider;
@@ -72,6 +76,7 @@ import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.MouseInputAdapter;
+import javax.swing.plaf.ActionMapUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.SliderUI;
@@ -204,6 +209,7 @@ public class BasicSliderUI extends SliderUI
* @param e A {@link FocusEvent}.
*/
public void focusGained(FocusEvent e)
+ throws NotImplementedException
{
// FIXME: implement.
}
@@ -215,6 +221,7 @@ public class BasicSliderUI extends SliderUI
* @param e A {@link FocusEvent}.
*/
public void focusLost(FocusEvent e)
+ throws NotImplementedException
{
// FIXME: implement.
}
@@ -236,14 +243,16 @@ public class BasicSliderUI extends SliderUI
{
// Check for orientation changes.
if (e.getPropertyName().equals("orientation"))
- recalculateIfOrientationChanged();
+ recalculateIfOrientationChanged();
else if (e.getPropertyName().equals("model"))
{
- BoundedRangeModel oldModel = (BoundedRangeModel) e.getOldValue();
- oldModel.removeChangeListener(changeListener);
- slider.getModel().addChangeListener(changeListener);
- calculateThumbLocation();
+ BoundedRangeModel oldModel = (BoundedRangeModel) e.getOldValue();
+ oldModel.removeChangeListener(changeListener);
+ slider.getModel().addChangeListener(changeListener);
+ calculateThumbLocation();
}
+ else if (e.getPropertyName().equals("paintTicks"))
+ calculateGeometry();
// elif the componentOrientation changes (this is a bound property,
// just undocumented) we change leftToRightCache. In Sun's
@@ -304,14 +313,14 @@ public class BasicSliderUI extends SliderUI
{
if (! trackListener.shouldScroll(direction))
{
- scrollTimer.stop();
- return;
+ scrollTimer.stop();
+ return;
}
if (block)
- scrollByBlock(direction);
+ scrollByBlock(direction);
else
- scrollByUnit(direction);
+ scrollByUnit(direction);
}
/**
@@ -416,7 +425,8 @@ public class BasicSliderUI extends SliderUI
if (slider.getSnapToTicks())
value = findClosestTick(value);
- // If the thumb is hit, then we don't need to set the timers to move it.
+ // If the thumb is hit, then we don't need to set the timers to
+ // move it.
if (! thumbRect.contains(e.getPoint()))
{
// The mouse has hit some other part of the slider.
@@ -469,14 +479,14 @@ public class BasicSliderUI extends SliderUI
{
int value;
if (slider.getOrientation() == JSlider.HORIZONTAL)
- value = valueForXPosition(currentMouseX);
+ value = valueForXPosition(currentMouseX);
else
- value = valueForYPosition(currentMouseY);
+ value = valueForYPosition(currentMouseY);
if (direction == POSITIVE_SCROLL)
- return (value > slider.getValue());
+ return (value > slider.getValue());
else
- return (value < slider.getValue());
+ return (value < slider.getValue());
}
}
@@ -652,35 +662,35 @@ public class BasicSliderUI extends SliderUI
super.installUI(c);
if (c instanceof JSlider)
{
- slider = (JSlider) c;
+ slider = (JSlider) c;
- focusRect = new Rectangle();
- contentRect = new Rectangle();
- thumbRect = new Rectangle();
- trackRect = new Rectangle();
- tickRect = new Rectangle();
- labelRect = new Rectangle();
+ focusRect = new Rectangle();
+ contentRect = new Rectangle();
+ thumbRect = new Rectangle();
+ trackRect = new Rectangle();
+ tickRect = new Rectangle();
+ labelRect = new Rectangle();
- insetCache = slider.getInsets();
- leftToRightCache = ! slider.getInverted();
+ insetCache = slider.getInsets();
+ leftToRightCache = ! slider.getInverted();
- scrollTimer = new Timer(200, null);
- scrollTimer.setRepeats(true);
+ scrollTimer = new Timer(200, null);
+ scrollTimer.setRepeats(true);
- installDefaults(slider);
- installListeners(slider);
- installKeyboardActions(slider);
+ installDefaults(slider);
+ installListeners(slider);
+ installKeyboardActions(slider);
- calculateFocusRect();
+ calculateFocusRect();
- calculateContentRect();
- calculateThumbSize();
- calculateTrackBuffer();
- calculateTrackRect();
- calculateThumbLocation();
+ calculateContentRect();
+ calculateThumbSize();
+ calculateTrackBuffer();
+ calculateTrackRect();
+ calculateThumbLocation();
- calculateTickRect();
- calculateLabelRect();
+ calculateTickRect();
+ calculateLabelRect();
}
}
@@ -865,7 +875,10 @@ public class BasicSliderUI extends SliderUI
*/
protected void installKeyboardActions(JSlider slider)
{
- // FIXME: implement.
+ InputMap keyMap = getInputMap(JComponent.WHEN_FOCUSED);
+ SwingUtilities.replaceUIInputMap(slider, JComponent.WHEN_FOCUSED, keyMap);
+ ActionMap map = getActionMap();
+ SwingUtilities.replaceUIActionMap(slider, map);
}
/**
@@ -877,7 +890,8 @@ public class BasicSliderUI extends SliderUI
*/
protected void uninstallKeyboardActions(JSlider slider)
{
- // FIXME: implement.
+ SwingUtilities.replaceUIActionMap(slider, null);
+ SwingUtilities.replaceUIInputMap(slider, JComponent.WHEN_FOCUSED, null);
}
/* XXX: This is all after experimentation with SUN's implementation.
@@ -908,8 +922,7 @@ public class BasicSliderUI extends SliderUI
// The width should cover all the labels (which are usually the
// deciding factor of the width)
int width = getWidthOfWidestLabel() * (slider.getLabelTable() == null ? 0
- : slider.getLabelTable()
- .size());
+ : slider.getLabelTable().size());
// If there are not enough labels.
// This number is pretty much arbitrary, but it looks nice.
@@ -1129,8 +1142,8 @@ public class BasicSliderUI extends SliderUI
}
/**
- * This method calculates the size but not the position of the thumbRect. It
- * must take into account the orientation of the slider.
+ * Sets the width and height of the <code>thumbRect</code> field, using the
+ * dimensions returned by {@link #getThumbSize()}.
*/
protected void calculateThumbSize()
{
@@ -1144,8 +1157,9 @@ public class BasicSliderUI extends SliderUI
}
/**
- * This method calculates the size and position of the contentRect. This
- * method does not need to be called if the orientation changes.
+ * Updates the <code>contentRect</code> field to an area inside the
+ * <code>focusRect</code>. This method does not need to be called if the
+ * orientation changes.
*/
protected void calculateContentRect()
{
@@ -1172,36 +1186,50 @@ public class BasicSliderUI extends SliderUI
if (slider.getOrientation() == JSlider.HORIZONTAL)
{
- thumbRect.x = xPositionForValue(value) - thumbRect.width / 2;
- thumbRect.y = trackRect.y;
+ thumbRect.x = xPositionForValue(value) - thumbRect.width / 2;
+ thumbRect.y = trackRect.y;
}
else
{
- thumbRect.x = trackRect.x;
- thumbRect.y = yPositionForValue(value) - thumbRect.height / 2;
+ thumbRect.x = trackRect.x;
+ thumbRect.y = yPositionForValue(value) - thumbRect.height / 2;
}
}
/**
- * Calculates the gap size between the left edge of the contentRect and the
- * left edge of the trackRect.
+ * Calculates the gap size between the edge of the <code>contentRect</code>
+ * and the edge of the <code>trackRect</code>, storing the result in the
+ * <code>trackBuffer</code> field. Sufficient space needs to be reserved
+ * for the slider thumb and/or the labels at each end of the slider track.
*/
protected void calculateTrackBuffer()
{
if (slider.getOrientation() == JSlider.HORIZONTAL)
- trackBuffer = thumbRect.width / 2;
+ {
+ int w = Math.max(getWidthOfLowValueLabel(), getWidthOfHighValueLabel());
+ trackBuffer = Math.max(thumbRect.width / 2, w / 2);
+
+ }
else
- trackBuffer = thumbRect.height / 2;
+ {
+ int h = Math.max(getHeightOfLowValueLabel(),
+ getHeightOfHighValueLabel());
+ trackBuffer = Math.max(thumbRect.height / 2, h / 2);
+ }
}
/**
- * This method returns the size of the thumbRect.
+ * Returns the size of the slider's thumb. The size is hard coded to
+ * <code>11 x 20</code> for horizontal sliders, and <code>20 x 11</code> for
+ * vertical sliders. Note that a new instance of {@link Dimension} is
+ * returned for every call to this method (this seems wasteful, but
+ * {@link Dimension} instances are not immutable, so this is probably
+ * unavoidable).
*
- * @return The dimensions of the thumb.
+ * @return The size of the slider's thumb.
*/
protected Dimension getThumbSize()
{
- // TODO: shouldn't create new objects every time
if (slider.getOrientation() == JSlider.HORIZONTAL)
return new Dimension(11, 20);
else
@@ -1216,14 +1244,16 @@ public class BasicSliderUI extends SliderUI
{
if (slider.getOrientation() == JSlider.HORIZONTAL)
{
- trackRect.x = contentRect.x + trackBuffer;
+ trackRect.x = contentRect.x + trackBuffer;
int h = getThumbSize().height;
if (slider.getPaintTicks() && (slider.getMajorTickSpacing() > 0
|| slider.getMinorTickSpacing() > 0))
h += getTickLength();
- trackRect.y = contentRect.y + (contentRect.height - h) / 2 - 1;
- trackRect.width = contentRect.width - 2 * trackBuffer;
- trackRect.height = thumbRect.height;
+ if (slider.getPaintLabels())
+ h += getHeightOfTallestLabel();
+ trackRect.y = contentRect.y + (contentRect.height - h) / 2 - 1;
+ trackRect.width = contentRect.width - 2 * trackBuffer;
+ trackRect.height = thumbRect.height;
}
else
{
@@ -1231,10 +1261,12 @@ public class BasicSliderUI extends SliderUI
if (slider.getPaintTicks() && (slider.getMajorTickSpacing() > 0
|| slider.getMinorTickSpacing() > 0))
w += getTickLength();
- trackRect.x = contentRect.x + (contentRect.width - w) / 2 - 1;
- trackRect.y = contentRect.y + trackBuffer;
- trackRect.width = thumbRect.width;
- trackRect.height = contentRect.height - 2 * trackBuffer;
+ if (slider.getPaintLabels())
+ w += getWidthOfWidestLabel();
+ trackRect.x = contentRect.x + (contentRect.width - w) / 2 - 1;
+ trackRect.y = contentRect.y + trackBuffer;
+ trackRect.width = thumbRect.width;
+ trackRect.height = contentRect.height - 2 * trackBuffer;
}
}
@@ -1261,23 +1293,23 @@ public class BasicSliderUI extends SliderUI
{
if (slider.getOrientation() == JSlider.HORIZONTAL)
{
- tickRect.x = trackRect.x;
- tickRect.y = trackRect.y + trackRect.height;
- tickRect.width = trackRect.width;
- tickRect.height = getTickLength();
+ tickRect.x = trackRect.x;
+ tickRect.y = trackRect.y + trackRect.height;
+ tickRect.width = trackRect.width;
+ tickRect.height = (slider.getPaintTicks() ? getTickLength() : 0);
- if (tickRect.y + tickRect.height > contentRect.y + contentRect.height)
- tickRect.height = contentRect.y + contentRect.height - tickRect.y;
+ if (tickRect.y + tickRect.height > contentRect.y + contentRect.height)
+ tickRect.height = contentRect.y + contentRect.height - tickRect.y;
}
else
{
- tickRect.x = trackRect.x + trackRect.width;
- tickRect.y = trackRect.y;
- tickRect.width = getTickLength();
- tickRect.height = trackRect.height;
+ tickRect.x = trackRect.x + trackRect.width;
+ tickRect.y = trackRect.y;
+ tickRect.width = (slider.getPaintTicks() ? getTickLength() : 0);
+ tickRect.height = trackRect.height;
- if (tickRect.x + tickRect.width > contentRect.x + contentRect.width)
- tickRect.width = contentRect.x + contentRect.width - tickRect.x;
+ if (tickRect.x + tickRect.width > contentRect.x + contentRect.width)
+ tickRect.width = contentRect.x + contentRect.width - tickRect.x;
}
}
@@ -1289,17 +1321,17 @@ public class BasicSliderUI extends SliderUI
{
if (slider.getOrientation() == JSlider.HORIZONTAL)
{
- labelRect.x = contentRect.x;
- labelRect.y = tickRect.y + tickRect.height;
- labelRect.width = contentRect.width;
- labelRect.height = contentRect.height - labelRect.y;
+ labelRect.x = contentRect.x;
+ labelRect.y = tickRect.y + tickRect.height;
+ labelRect.width = contentRect.width;
+ labelRect.height = getHeightOfTallestLabel();
}
else
{
- labelRect.x = tickRect.x + tickRect.width;
- labelRect.y = contentRect.y;
- labelRect.width = contentRect.width - labelRect.x;
- labelRect.height = contentRect.height;
+ labelRect.x = tickRect.x + tickRect.width;
+ labelRect.y = contentRect.y;
+ labelRect.width = getWidthOfWidestLabel();
+ labelRect.height = contentRect.height;
}
}
@@ -1321,13 +1353,13 @@ public class BasicSliderUI extends SliderUI
for (Enumeration list = slider.getLabelTable().elements();
list.hasMoreElements();)
{
- Object comp = list.nextElement();
- if (! (comp instanceof Component))
- continue;
- label = (Component) comp;
- pref = label.getPreferredSize();
- if (pref != null && pref.width > widest)
- widest = pref.width;
+ Object comp = list.nextElement();
+ if (! (comp instanceof Component))
+ continue;
+ label = (Component) comp;
+ pref = label.getPreferredSize();
+ if (pref != null && pref.width > widest)
+ widest = pref.width;
}
return widest;
}
@@ -1349,50 +1381,54 @@ public class BasicSliderUI extends SliderUI
for (Enumeration list = slider.getLabelTable().elements();
list.hasMoreElements();)
{
- Object comp = list.nextElement();
- if (! (comp instanceof Component))
- continue;
- label = (Component) comp;
- pref = label.getPreferredSize();
- if (pref != null && pref.height > tallest)
- tallest = pref.height;
+ Object comp = list.nextElement();
+ if (! (comp instanceof Component))
+ continue;
+ label = (Component) comp;
+ pref = label.getPreferredSize();
+ if (pref != null && pref.height > tallest)
+ tallest = pref.height;
}
return tallest;
}
/**
- * This method returns the width of the label whose key has the highest
- * value.
+ * Returns the width of the label whose key has the highest value, or 0 if
+ * there are no labels.
*
- * @return The width of the high value label or 0 if no label table exists.
+ * @return The width of the label whose key has the highest value.
+ *
+ * @see #getHighestValueLabel()
*/
protected int getWidthOfHighValueLabel()
{
Component highValueLabel = getHighestValueLabel();
if (highValueLabel != null)
- return highValueLabel.getWidth();
+ return highValueLabel.getPreferredSize().width;
else
return 0;
}
/**
- * This method returns the width of the label whose key has the lowest
- * value.
+ * Returns the width of the label whose key has the lowest value, or 0 if
+ * there are no labels.
*
- * @return The width of the low value label or 0 if no label table exists.
+ * @return The width of the label whose key has the lowest value.
+ *
+ * @see #getLowestValueLabel()
*/
protected int getWidthOfLowValueLabel()
{
Component lowValueLabel = getLowestValueLabel();
if (lowValueLabel != null)
- return lowValueLabel.getWidth();
+ return lowValueLabel.getPreferredSize().width;
else
return 0;
}
/**
- * This method returns the height of the label whose key has the highest
- * value.
+ * Returns the height of the label whose key has the highest value, or 0 if
+ * there are no labels.
*
* @return The height of the high value label or 0 if no label table exists.
*/
@@ -1400,14 +1436,14 @@ public class BasicSliderUI extends SliderUI
{
Component highValueLabel = getHighestValueLabel();
if (highValueLabel != null)
- return highValueLabel.getHeight();
+ return highValueLabel.getPreferredSize().height;
else
return 0;
}
/**
- * This method returns the height of the label whose key has the lowest
- * value.
+ * Returns the height of the label whose key has the lowest value, or 0 if
+ * there are no labels.
*
* @return The height of the low value label or 0 if no label table exists.
*/
@@ -1415,19 +1451,20 @@ public class BasicSliderUI extends SliderUI
{
Component lowValueLabel = getLowestValueLabel();
if (lowValueLabel != null)
- return lowValueLabel.getHeight();
+ return lowValueLabel.getPreferredSize().height;
else
return 0;
}
/**
- * This method returns whether the slider is to be drawn inverted.
+ * Returns <code>true</code> if the slider scale is to be drawn inverted,
+ * and <code>false</code> if not.
*
- * @return True is the slider is to be drawn inverted.
+ * @return <code>true</code> if the slider is to be drawn inverted.
*/
protected boolean drawInverted()
{
- return ! (slider.getInverted() ^ leftToRightCache);
+ return slider.getInverted();
}
/**
@@ -1446,12 +1483,12 @@ public class BasicSliderUI extends SliderUI
for (Enumeration list = labelTable.keys(); list.hasMoreElements();)
{
- Object value = list.nextElement();
- if (! (value instanceof Integer))
- continue;
- tmpKey = (Integer) value;
- if (tmpKey.intValue() < key.intValue())
- key = tmpKey;
+ Object value = list.nextElement();
+ if (! (value instanceof Integer))
+ continue;
+ tmpKey = (Integer) value;
+ if (tmpKey.intValue() < key.intValue())
+ key = tmpKey;
}
Object comp = labelTable.get(key);
if (! (comp instanceof Component))
@@ -1460,9 +1497,10 @@ public class BasicSliderUI extends SliderUI
}
/**
- * This method returns the label whose key has the highest value.
+ * Returns the label whose key has the highest value.
*
- * @return The high value label or null if no label table exists.
+ * @return The label whose key has the highest value or <code>null</code> if
+ * no label table exists.
*/
protected Component getHighestValueLabel()
{
@@ -1475,12 +1513,12 @@ public class BasicSliderUI extends SliderUI
for (Enumeration list = labelTable.keys(); list.hasMoreElements();)
{
- Object value = list.nextElement();
- if (! (value instanceof Integer))
- continue;
- tmpKey = (Integer) value;
- if (tmpKey.intValue() > key.intValue())
- key = tmpKey;
+ Object value = list.nextElement();
+ if (! (value instanceof Integer))
+ continue;
+ tmpKey = (Integer) value;
+ if (tmpKey.intValue() > key.intValue())
+ key = tmpKey;
}
Object comp = labelTable.get(key);
if (! (comp instanceof Component))
@@ -1499,7 +1537,8 @@ public class BasicSliderUI extends SliderUI
public void paint(Graphics g, JComponent c)
{
// FIXME: Move this to propertyChangeEvent handler, when we get those.
- leftToRightCache = slider.getComponentOrientation() != ComponentOrientation.RIGHT_TO_LEFT;
+ leftToRightCache = slider.getComponentOrientation()
+ != ComponentOrientation.RIGHT_TO_LEFT;
// FIXME: This next line is only here because the above line is here.
calculateGeometry();
@@ -1608,23 +1647,23 @@ public class BasicSliderUI extends SliderUI
if (slider.getOrientation() == JSlider.HORIZONTAL)
{
- width = trackRect.width;
- height = (thumbRect.height / 4 == 0) ? 1 : thumbRect.height / 4;
+ width = trackRect.width;
+ height = (thumbRect.height / 4 == 0) ? 1 : thumbRect.height / 4;
- a.translate(0, (trackRect.height / 2) - (height / 2));
- b.translate(0, (trackRect.height / 2) + (height / 2));
- c.translate(trackRect.width, (trackRect.height / 2) + (height / 2));
- d.translate(trackRect.width, (trackRect.height / 2) - (height / 2));
+ a.translate(0, (trackRect.height / 2) - (height / 2));
+ b.translate(0, (trackRect.height / 2) + (height / 2));
+ c.translate(trackRect.width, (trackRect.height / 2) + (height / 2));
+ d.translate(trackRect.width, (trackRect.height / 2) - (height / 2));
}
else
{
- width = (thumbRect.width / 4 == 0) ? 1 : thumbRect.width / 4;
- height = trackRect.height;
+ width = (thumbRect.width / 4 == 0) ? 1 : thumbRect.width / 4;
+ height = trackRect.height;
- a.translate((trackRect.width / 2) - (width / 2), 0);
- b.translate((trackRect.width / 2) - (width / 2), trackRect.height);
- c.translate((trackRect.width / 2) + (width / 2), trackRect.height);
- d.translate((trackRect.width / 2) + (width / 2), 0);
+ a.translate((trackRect.width / 2) - (width / 2), 0);
+ b.translate((trackRect.width / 2) - (width / 2), trackRect.height);
+ c.translate((trackRect.width / 2) + (width / 2), trackRect.height);
+ d.translate((trackRect.width / 2) + (width / 2), 0);
}
g.setColor(Color.GRAY);
g.fillRect(a.x, a.y, width, height);
@@ -1656,86 +1695,42 @@ public class BasicSliderUI extends SliderUI
if (majorSpace > 0)
{
- if (slider.getOrientation() == JSlider.HORIZONTAL)
- {
- double loc = tickRect.x + 0.5;
- double increment = (max == min) ? 0
- : majorSpace * (double) (tickRect.width - 1) / (max - min);
- if (drawInverted())
- {
- loc += tickRect.width;
- increment *= -1;
- }
+ if (slider.getOrientation() == JSlider.HORIZONTAL)
+ {
g.translate(0, tickRect.y);
- for (int i = min; i <= max; i += majorSpace)
- {
- paintMajorTickForHorizSlider(g, tickRect, (int) loc);
- loc += increment;
- }
+ for (int i = min; i <= max; i += majorSpace)
+ paintMajorTickForHorizSlider(g, tickRect, xPositionForValue(i));
g.translate(0, -tickRect.y);
- }
- else
- {
- double loc = tickRect.height + tickRect.y + 0.5;
- double increment = (max == min) ? 0
- : -majorSpace * (double) (tickRect.height - 1) / (max - min);
- if (drawInverted())
- {
- loc = tickRect.y + 0.5;
- increment *= -1;
- }
+ }
+ else // JSlider.VERTICAL
+ {
g.translate(tickRect.x, 0);
- for (int i = min; i <= max; i += majorSpace)
- {
- paintMajorTickForVertSlider(g, tickRect, (int) loc);
- loc += increment;
- }
+ for (int i = min; i <= max; i += majorSpace)
+ paintMajorTickForVertSlider(g, tickRect, yPositionForValue(i));
g.translate(-tickRect.x, 0);
- }
+ }
}
if (minorSpace > 0)
{
- if (slider.getOrientation() == JSlider.HORIZONTAL)
- {
- double loc = tickRect.x + 0.5;
- double increment = (max == min) ? 0
- : minorSpace * (double) (tickRect.width - 1) / (max - min);
- if (drawInverted())
- {
- loc += tickRect.width;
- increment *= -1;
- }
+ if (slider.getOrientation() == JSlider.HORIZONTAL)
+ {
g.translate(0, tickRect.y);
- for (int i = min; i <= max; i += minorSpace)
- {
- paintMinorTickForHorizSlider(g, tickRect, (int) loc);
- loc += increment;
- }
+ for (int i = min; i <= max; i += minorSpace)
+ paintMinorTickForHorizSlider(g, tickRect, xPositionForValue(i));
g.translate(0, -tickRect.y);
- }
- else
- {
- double loc = tickRect.height + tickRect.y + 0.5;
- double increment = (max == min) ? 0
- : -minorSpace * (double) (tickRect.height - 1) / (max - min);
- if (drawInverted())
- {
- loc = tickRect.y + 0.5;
- increment *= -1;
- }
+ }
+ else
+ {
g.translate(tickRect.x, 0);
- for (int i = min; i <= max; i += minorSpace)
- {
- paintMinorTickForVertSlider(g, tickRect, (int) loc);
- loc += increment;
- }
+ for (int i = min; i <= max; i += minorSpace)
+ paintMinorTickForVertSlider(g, tickRect, yPositionForValue(i));
g.translate(-tickRect.x, 0);
- }
+ }
}
}
- /* Minor ticks start at 1/4 of the height (or width) of the tickRect and extend
- to 1/2 of the tickRect.
+ /* Minor ticks start at 1/4 of the height (or width) of the tickRect and
+ extend to 1/2 of the tickRect.
Major ticks start at 1/4 of the height and extend to 3/4.
*/
@@ -1828,45 +1823,45 @@ public class BasicSliderUI extends SliderUI
{
if (slider.getLabelTable() != null)
{
- Dictionary table = slider.getLabelTable();
- Integer tmpKey;
- Object key;
- Object element;
- Component label;
- if (slider.getOrientation() == JSlider.HORIZONTAL)
- {
- for (Enumeration list = table.keys(); list.hasMoreElements();)
- {
- key = list.nextElement();
- if (! (key instanceof Integer))
- continue;
- tmpKey = (Integer) key;
- element = table.get(tmpKey);
- // We won't paint them if they're not
- // JLabels so continue anyway
- if (! (element instanceof JLabel))
- continue;
- label = (Component) element;
- paintHorizontalLabel(g, tmpKey.intValue(), label);
- }
- }
- else
- {
- for (Enumeration list = table.keys(); list.hasMoreElements();)
- {
- key = list.nextElement();
- if (! (key instanceof Integer))
- continue;
- tmpKey = (Integer) key;
- element = table.get(tmpKey);
- // We won't paint them if they're not
- // JLabels so continue anyway
- if (! (element instanceof JLabel))
- continue;
- label = (Component) element;
- paintVerticalLabel(g, tmpKey.intValue(), label);
- }
- }
+ Dictionary table = slider.getLabelTable();
+ Integer tmpKey;
+ Object key;
+ Object element;
+ Component label;
+ if (slider.getOrientation() == JSlider.HORIZONTAL)
+ {
+ for (Enumeration list = table.keys(); list.hasMoreElements();)
+ {
+ key = list.nextElement();
+ if (! (key instanceof Integer))
+ continue;
+ tmpKey = (Integer) key;
+ element = table.get(tmpKey);
+ // We won't paint them if they're not
+ // JLabels so continue anyway
+ if (! (element instanceof JLabel))
+ continue;
+ label = (Component) element;
+ paintHorizontalLabel(g, tmpKey.intValue(), label);
+ }
+ }
+ else
+ {
+ for (Enumeration list = table.keys(); list.hasMoreElements();)
+ {
+ key = list.nextElement();
+ if (! (key instanceof Integer))
+ continue;
+ tmpKey = (Integer) key;
+ element = table.get(tmpKey);
+ // We won't paint them if they're not
+ // JLabels so continue anyway
+ if (! (element instanceof JLabel))
+ continue;
+ label = (Component) element;
+ paintVerticalLabel(g, tmpKey.intValue(), label);
+ }
+ }
}
}
@@ -1927,7 +1922,7 @@ public class BasicSliderUI extends SliderUI
h = labelRect.height;
label.setBounds(xpos, ypos, w, h);
- javax.swing.SwingUtilities.paintComponent(g, label, null, label.getBounds());
+ SwingUtilities.paintComponent(g, label, null, label.getBounds());
}
/**
@@ -1966,7 +1961,7 @@ public class BasicSliderUI extends SliderUI
w = labelRect.width;
label.setBounds(xpos, ypos, w, h);
- javax.swing.SwingUtilities.paintComponent(g, label, null, label.getBounds());
+ SwingUtilities.paintComponent(g, label, null, label.getBounds());
}
/**
@@ -2006,49 +2001,52 @@ public class BasicSliderUI extends SliderUI
Polygon dark; // dark shadow
Polygon all;
- // This will be in X-dimension if the slider is inverted and y if it isn't.
+ // This will be in X-dimension if the slider is inverted and y if it isn't.
int turnPoint;
if (slider.getOrientation() == JSlider.HORIZONTAL)
{
- turnPoint = thumbRect.height * 3 / 4;
+ turnPoint = thumbRect.height * 3 / 4;
- b.translate(thumbRect.width - 1, 0);
- c.translate(thumbRect.width - 1, turnPoint);
- d.translate(thumbRect.width / 2 - 1, thumbRect.height - 1);
- e.translate(0, turnPoint);
+ b.translate(thumbRect.width - 1, 0);
+ c.translate(thumbRect.width - 1, turnPoint);
+ d.translate(thumbRect.width / 2 - 1, thumbRect.height - 1);
+ e.translate(0, turnPoint);
- bright = new Polygon(new int[] { b.x - 1, a.x, e.x, d.x },
- new int[] { b.y, a.y, e.y, d.y }, 4);
+ bright = new Polygon(new int[] { b.x - 1, a.x, e.x, d.x },
+ new int[] { b.y, a.y, e.y, d.y }, 4);
- dark = new Polygon(new int[] { b.x, c.x, d.x + 1 },
- new int[] { b.y, c.y - 1, d.y }, 3);
+ dark = new Polygon(new int[] { b.x, c.x, d.x + 1 },
+ new int[] { b.y, c.y - 1, d.y }, 3);
light = new Polygon(new int[] { b.x - 1, c.x - 1, d.x + 1 },
new int[] { b.y + 1, c.y - 1, d.y - 1 }, 3);
- all = new Polygon(new int[] { a.x + 1, b.x - 2, c.x - 2, d.x, e.x + 1 },
- new int[] { a.y + 1, b.y + 1, c.y - 1, d.y - 1, e.y }, 5);
+ all = new Polygon(new int[] { a.x + 1, b.x - 2, c.x - 2, d.x, e.x + 1 },
+ new int[] { a.y + 1, b.y + 1, c.y - 1, d.y - 1, e.y },
+ 5);
}
else
{
- turnPoint = thumbRect.width * 3 / 4 - 1;
+ turnPoint = thumbRect.width * 3 / 4 - 1;
- b.translate(turnPoint, 0);
- c.translate(thumbRect.width - 1, thumbRect.height / 2);
- d.translate(turnPoint, thumbRect.height - 1);
- e.translate(0, thumbRect.height - 1);
+ b.translate(turnPoint, 0);
+ c.translate(thumbRect.width - 1, thumbRect.height / 2);
+ d.translate(turnPoint, thumbRect.height - 1);
+ e.translate(0, thumbRect.height - 1);
- bright = new Polygon(new int[] { c.x - 1, b.x, a.x, e.x },
- new int[] { c.y - 1, b.y, a.y, e.y - 1 }, 4);
+ bright = new Polygon(new int[] { c.x - 1, b.x, a.x, e.x },
+ new int[] { c.y - 1, b.y, a.y, e.y - 1 }, 4);
- dark = new Polygon(new int[] { c.x, d.x, e.x },
- new int[] { c.y, d.y, e.y }, 3);
+ dark = new Polygon(new int[] { c.x, d.x, e.x },
+ new int[] { c.y, d.y, e.y }, 3);
light = new Polygon(new int[] { c.x - 1, d.x, e.x + 1},
new int[] { c.y, d.y - 1, e.y - 1}, 3);
- all = new Polygon(new int[] { a.x + 1, b.x, c.x - 2, c.x - 2, d.x, e.x + 1 },
- new int[] { a.y + 1, b.y + 1, c.y - 1, c.y, d.y - 2, e.y - 2 }, 6);
+ all = new Polygon(new int[] { a.x + 1, b.x, c.x - 2, c.x - 2, d.x,
+ e.x + 1 },
+ new int[] { a.y + 1, b.y + 1, c.y - 1, c.y, d.y - 2,
+ e.y - 2 }, 6);
}
g.setColor(Color.WHITE);
@@ -2080,18 +2078,22 @@ public class BasicSliderUI extends SliderUI
}
/**
- * This method is used to move the thumb one block in the direction
- * specified. If the slider snaps to ticks, this method is responsible for
- * snapping it to a tick after the thumb has been moved.
+ * Moves the thumb one block in the direction specified (a block is 1/10th
+ * of the slider range). If the slider snaps to ticks, this method is
+ * responsible for snapping it to a tick after the thumb has been moved.
*
- * @param direction The direction to move in.
+ * @param direction the direction (positive values increment the thumb
+ * position by one block, zero/negative values decrement the thumb position
+ * by one block).
*/
public void scrollByBlock(int direction)
{
- // The direction is -1 for backwards and 1 for forwards.
- int unit = direction * (slider.getMaximum() - slider.getMinimum()) / 10;
-
- int moveTo = slider.getValue() + unit;
+ int unit = (slider.getMaximum() - slider.getMinimum()) / 10;
+ int moveTo = slider.getValue();
+ if (direction > 0)
+ moveTo += unit;
+ else
+ moveTo -= unit;
if (slider.getSnapToTicks())
moveTo = findClosestTick(moveTo);
@@ -2100,16 +2102,21 @@ public class BasicSliderUI extends SliderUI
}
/**
- * This method is used to move the thumb one unit in the direction
- * specified. If the slider snaps to ticks, this method is responsible for
- * snapping it to a tick after the thumb has been moved.
+ * Moves the thumb one unit in the specified direction. If the slider snaps
+ * to ticks, this method is responsible for snapping it to a tick after the
+ * thumb has been moved.
*
- * @param direction The direction to move in.
+ * @param direction the direction (positive values increment the thumb
+ * position by one, zero/negative values decrement the thumb position by
+ * one).
*/
public void scrollByUnit(int direction)
{
- // The direction is -1 for backwards and 1 for forwards.
- int moveTo = slider.getValue() + direction;
+ int moveTo = slider.getValue();
+ if (direction > 0)
+ moveTo++;
+ else
+ moveTo--;
if (slider.getSnapToTicks())
moveTo = findClosestTick(moveTo);
@@ -2135,53 +2142,60 @@ public class BasicSliderUI extends SliderUI
}
/**
- * This method returns the X coordinate for the value passed in.
+ * Returns the x-coordinate (relative to the component) for the given slider
+ * value. This method assumes that the <code>trackRect</code> field is
+ * set up.
*
- * @param value The value to calculate an x coordinate for.
+ * @param value the slider value.
*
- * @return The x coordinate for the value.
+ * @return The x-coordinate.
*/
protected int xPositionForValue(int value)
{
- int min = slider.getMinimum();
- int max = slider.getMaximum();
- int len = trackRect.width - 1;
-
- int xPos = (max == min) ? 0 : (value - min) * len / (max - min);
+ double min = slider.getMinimum();
+ if (value < min)
+ value = (int) min;
+ double max = slider.getMaximum();
+ if (value > max)
+ value = (int) max;
+ double len = trackRect.width;
+ if ((max - min) <= 0.0)
+ return 0;
+ int xPos = (int) ((value - min) / (max - min) * len + 0.5);
- if (! drawInverted())
- xPos += trackRect.x;
+ if (drawInverted())
+ return trackRect.x + Math.max(trackRect.width - xPos - 1, 0);
else
- {
- xPos = len - xPos;
- xPos += trackRect.x;
- }
- return xPos;
+ return trackRect.x + Math.min(xPos, trackRect.width - 1);
}
/**
- * This method returns the y coordinate for the value passed in.
+ * Returns the y-coordinate (relative to the component) for the given slider
+ * value. This method assumes that the <code>trackRect</code> field is
+ * set up.
*
- * @param value The value to calculate a y coordinate for.
+ * @param value the slider value.
*
- * @return The y coordinate for the value.
+ * @return The y-coordinate.
*/
protected int yPositionForValue(int value)
{
- int min = slider.getMinimum();
- int max = slider.getMaximum();
- int len = trackRect.height - 1;
+ double min = slider.getMinimum();
+ if (value < min)
+ value = (int) min;
+ double max = slider.getMaximum();
+ if (value > max)
+ value = (int) max;
+ int len = trackRect.height;
+ if ((max - min) <= 0.0)
+ return 0;
- int yPos = (max == min) ? 0 : (value - min) * len / (max - min);
+ int yPos = (int) ((value - min) / (max - min) * len + 0.5);
if (! drawInverted())
- {
- yPos = len - yPos;
- yPos += trackRect.y;
- }
+ return trackRect.y + trackRect.height - Math.max(yPos, 1);
else
- yPos += trackRect.y;
- return yPos;
+ return trackRect.y + Math.min(yPos, trackRect.height - 1);
}
/**
@@ -2288,26 +2302,26 @@ public class BasicSliderUI extends SliderUI
// First check the major ticks.
if (majorSpace > 0)
{
- int lowerBound = (value - min) / majorSpace;
- int majLower = majorSpace * lowerBound + min;
- int majHigher = majorSpace * (lowerBound + 1) + min;
-
- if (majHigher <= max && majHigher - value <= value - majLower)
- major = majHigher - value;
- else
- major = majLower - value;
+ int lowerBound = (value - min) / majorSpace;
+ int majLower = majorSpace * lowerBound + min;
+ int majHigher = majorSpace * (lowerBound + 1) + min;
+
+ if (majHigher <= max && majHigher - value <= value - majLower)
+ major = majHigher - value;
+ else
+ major = majLower - value;
}
if (minorSpace > 0)
{
- int lowerBound = value / minorSpace;
- int minLower = minorSpace * lowerBound;
- int minHigher = minorSpace * (lowerBound + 1);
-
- if (minHigher <= max && minHigher - value <= value - minLower)
- minor = minHigher - value;
- else
- minor = minLower - value;
+ int lowerBound = value / minorSpace;
+ int minLower = minorSpace * lowerBound;
+ int minHigher = minorSpace * (lowerBound + 1);
+
+ if (minHigher <= max && minHigher - value <= value - minLower)
+ minor = minHigher - value;
+ else
+ minor = minLower - value;
}
// Give preference to minor ticks
@@ -2316,4 +2330,123 @@ public class BasicSliderUI extends SliderUI
else
return value + minor;
}
+
+ InputMap getInputMap(int condition)
+ {
+ if (condition == JComponent.WHEN_FOCUSED)
+ return (InputMap) UIManager.get("Slider.focusInputMap");
+ return null;
+ }
+
+ /**
+ * Returns the action map for the {@link JSlider}. All sliders share
+ * a single action map which is created the first time this method is
+ * called, then stored in the UIDefaults table for subsequent access.
+ *
+ * @return The shared action map.
+ */
+ ActionMap getActionMap()
+ {
+ ActionMap map = (ActionMap) UIManager.get("Slider.actionMap");
+
+ if (map == null) // first time here
+ {
+ map = createActionMap();
+ if (map != null)
+ UIManager.put("Slider.actionMap", map);
+ }
+ return map;
+ }
+
+ /**
+ * Creates the action map shared by all {@link JSlider} instances.
+ * This method is called once by {@link #getActionMap()} when it
+ * finds no action map in the UIDefaults table...after the map is
+ * created, it gets added to the defaults table so that subsequent
+ * calls to {@link #getActionMap()} will return the same shared
+ * instance.
+ *
+ * @return The action map.
+ */
+ ActionMap createActionMap()
+ {
+ ActionMap map = new ActionMapUIResource();
+ map.put("positiveUnitIncrement",
+ new AbstractAction("positiveUnitIncrement") {
+ public void actionPerformed(ActionEvent event)
+ {
+ JSlider slider = (JSlider) event.getSource();
+ BasicSliderUI ui = (BasicSliderUI) slider.getUI();
+ if (slider.getInverted())
+ ui.scrollByUnit(BasicSliderUI.NEGATIVE_SCROLL);
+ else
+ ui.scrollByUnit(BasicSliderUI.POSITIVE_SCROLL);
+ }
+ }
+ );
+ map.put("negativeUnitIncrement",
+ new AbstractAction("negativeUnitIncrement") {
+ public void actionPerformed(ActionEvent event)
+ {
+ JSlider slider = (JSlider) event.getSource();
+ BasicSliderUI ui = (BasicSliderUI) slider.getUI();
+ if (slider.getInverted())
+ ui.scrollByUnit(BasicSliderUI.POSITIVE_SCROLL);
+ else
+ ui.scrollByUnit(BasicSliderUI.NEGATIVE_SCROLL);
+ }
+ }
+ );
+ map.put("positiveBlockIncrement",
+ new AbstractAction("positiveBlockIncrement") {
+ public void actionPerformed(ActionEvent event)
+ {
+ JSlider slider = (JSlider) event.getSource();
+ BasicSliderUI ui = (BasicSliderUI) slider.getUI();
+ if (slider.getInverted())
+ ui.scrollByBlock(BasicSliderUI.NEGATIVE_SCROLL);
+ else
+ ui.scrollByBlock(BasicSliderUI.POSITIVE_SCROLL);
+ }
+ }
+ );
+ map.put("negativeBlockIncrement",
+ new AbstractAction("negativeBlockIncrement") {
+ public void actionPerformed(ActionEvent event)
+ {
+ JSlider slider = (JSlider) event.getSource();
+ BasicSliderUI ui = (BasicSliderUI) slider.getUI();
+ if (slider.getInverted())
+ ui.scrollByBlock(BasicSliderUI.POSITIVE_SCROLL);
+ else
+ ui.scrollByBlock(BasicSliderUI.NEGATIVE_SCROLL);
+ }
+ }
+ );
+ map.put("minScroll",
+ new AbstractAction("minScroll") {
+ public void actionPerformed(ActionEvent event)
+ {
+ JSlider slider = (JSlider) event.getSource();
+ if (slider.getInverted())
+ slider.setValue(slider.getMaximum());
+ else
+ slider.setValue(slider.getMinimum());
+ }
+ }
+ );
+ map.put("maxScroll",
+ new AbstractAction("maxScroll") {
+ public void actionPerformed(ActionEvent event)
+ {
+ JSlider slider = (JSlider) event.getSource();
+ if (slider.getInverted())
+ slider.setValue(slider.getMinimum());
+ else
+ slider.setValue(slider.getMaximum());
+ }
+ }
+ );
+ return map;
+ }
}
diff --git a/javax/swing/plaf/basic/BasicSpinnerUI.java b/javax/swing/plaf/basic/BasicSpinnerUI.java
index 6f7a41a1d..465374bfd 100644
--- a/javax/swing/plaf/basic/BasicSpinnerUI.java
+++ b/javax/swing/plaf/basic/BasicSpinnerUI.java
@@ -41,7 +41,6 @@ package javax.swing.plaf.basic;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
-import java.awt.Font;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
@@ -365,9 +364,9 @@ public class BasicSpinnerUI extends SpinnerUI
private class DefaultLayoutManager implements LayoutManager
{
/**
- * DOCUMENT ME!
+ * Layout the spinners inner parts.
*
- * @param parent DOCUMENT ME!
+ * @param parent The parent container
*/
public void layoutContainer(Container parent)
{
@@ -385,12 +384,12 @@ public class BasicSpinnerUI extends SpinnerUI
Dimension e = prefSize(editor);
Dimension n = prefSize(next);
Dimension p = prefSize(previous);
- Dimension s = spinner.getPreferredSize();
+ Dimension s = parent.getSize();
int x = l2r ? i.left : i.right;
int y = i.top;
int w = Math.max(p.width, n.width);
- int h = e.height / 2;
+ int h = (s.height - i.bottom) / 2;
int e_width = s.width - w - i.left - i.right;
if (l2r)
diff --git a/javax/swing/plaf/basic/BasicSplitPaneUI.java b/javax/swing/plaf/basic/BasicSplitPaneUI.java
index 906acfe16..694baadda 100644
--- a/javax/swing/plaf/basic/BasicSplitPaneUI.java
+++ b/javax/swing/plaf/basic/BasicSplitPaneUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Component;
@@ -1047,6 +1049,7 @@ public class BasicSplitPaneUI extends SplitPaneUI
* This method installs the keyboard actions for the JSplitPane.
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement.
}
@@ -1055,6 +1058,7 @@ public class BasicSplitPaneUI extends SplitPaneUI
* This method reverses the work done in installKeyboardActions.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement.
}
diff --git a/javax/swing/plaf/basic/BasicTabbedPaneUI.java b/javax/swing/plaf/basic/BasicTabbedPaneUI.java
index 5b1e1ff0f..6d9bed331 100644
--- a/javax/swing/plaf/basic/BasicTabbedPaneUI.java
+++ b/javax/swing/plaf/basic/BasicTabbedPaneUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
@@ -130,52 +132,49 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
*/
public void mousePressed(MouseEvent e)
{
- int x = e.getX();
- int y = e.getY();
- int tabCount = tabPane.getTabCount();
-
- if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)
+ if (tabPane.isEnabled())
{
- if (e.getSource() == incrButton)
+ int index = tabForCoordinate(tabPane, e.getX(), e.getY());
+ if (index >= 0 && tabPane.isEnabledAt(index))
{
- if (++currentScrollLocation >= tabCount)
- currentScrollLocation = tabCount - 1;
-
- int width = 0;
- for (int i = currentScrollLocation - 1; i < tabCount; i++)
- width += rects[i].width;
- if (width < viewport.getWidth())
- // FIXME: Still getting mouse events after the button is disabled.
- // incrButton.setEnabled(false);
- currentScrollLocation--;
- else if (! decrButton.isEnabled())
- decrButton.setEnabled(true);
- tabPane.revalidate();
- tabPane.repaint();
- return;
- }
- else if (e.getSource() == decrButton)
- {
- if (--currentScrollLocation < 0)
- currentScrollLocation = 0;
- if (currentScrollLocation == 0)
- decrButton.setEnabled(false);
- else if (! incrButton.isEnabled())
- incrButton.setEnabled(true);
- tabPane.revalidate();
- tabPane.repaint();
- return;
+ tabPane.setSelectedIndex(index);
}
}
+ }
- int index = tabForCoordinate(tabPane, x, y);
+ /**
+ * Receives notification when the mouse pointer has entered the tabbed
+ * pane.
+ *
+ * @param ev the mouse event
+ */
+ public void mouseEntered(MouseEvent ev)
+ {
+ int tabIndex = tabForCoordinate(tabPane, ev.getX(), ev.getY());
+ setRolloverTab(tabIndex);
+ }
- // We need to check since there are areas where tabs cannot be
- // e.g. in the inset area.
- if (index != -1 && tabPane.isEnabledAt(index))
- tabPane.setSelectedIndex(index);
- tabPane.revalidate();
- tabPane.repaint();
+ /**
+ * Receives notification when the mouse pointer has exited the tabbed
+ * pane.
+ *
+ * @param ev the mouse event
+ */
+ public void mouseExited(MouseEvent ev)
+ {
+ setRolloverTab(-1);
+ }
+
+ /**
+ * Receives notification when the mouse pointer has moved over the tabbed
+ * pane.
+ *
+ * @param ev the mouse event
+ */
+ public void mouseMoved(MouseEvent ev)
+ {
+ int tabIndex = tabForCoordinate(tabPane, ev.getX(), ev.getY());
+ setRolloverTab(tabIndex);
}
}
@@ -241,21 +240,10 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
*/
public void calculateLayoutInfo()
{
- assureRectsCreated(tabPane.getTabCount());
- contentRect = SwingUtilities.calculateInnerArea(tabPane, contentRect);
-
- calculateTabRects(tabPane.getTabPlacement(), tabPane.getTabCount());
-
- if (tabPane.getSelectedIndex() != -1)
- {
- Component visible = getVisibleComponent();
- Insets insets = getContentBorderInsets(tabPane.getTabPlacement());
- if (visible != null)
- visible.setBounds(contentRect.x + insets.left,
- contentRect.y + insets.top,
- contentRect.width - insets.left - insets.right,
- contentRect.height - insets.top - insets.bottom);
- }
+ int count = tabPane.getTabCount();
+ assureRectsCreated(count);
+ calculateTabRects(tabPane.getTabPlacement(), count);
+ tabRunsDirty = false;
}
/**
@@ -269,45 +257,51 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
protected Dimension calculateSize(boolean minimum)
{
int tabPlacement = tabPane.getTabPlacement();
+
int width = 0;
int height = 0;
-
- int componentHeight = 0;
- int componentWidth = 0;
Component c;
Dimension dims;
+
+ // Find out the minimum/preferred size to display the largest child
+ // of the tabbed pane.
for (int i = 0; i < tabPane.getTabCount(); i++)
{
c = tabPane.getComponentAt(i);
if (c == null)
continue;
- calcRect = c.getBounds();
- dims = c.getPreferredSize();
+ dims = minimum ? c.getMinimumSize() : c.getPreferredSize();
if (dims != null)
{
- componentHeight = Math.max(componentHeight, dims.height);
- componentWidth = Math.max(componentWidth, dims.width);
+ height = Math.max(height, dims.height);
+ width = Math.max(width, dims.width);
}
}
+
+ Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
if (tabPlacement == SwingConstants.TOP
|| tabPlacement == SwingConstants.BOTTOM)
{
int min = calculateMaxTabWidth(tabPlacement);
- width = Math.max(min, componentWidth);
-
- int tabAreaHeight = preferredTabAreaHeight(tabPlacement, width);
- height = tabAreaHeight + componentHeight;
+ width = Math.max(min, width);
+ int tabAreaHeight = preferredTabAreaHeight(tabPlacement,
+ width - tabAreaInsets.left
+ -tabAreaInsets.right);
+ height += tabAreaHeight;
}
else
{
int min = calculateMaxTabHeight(tabPlacement);
- height = Math.max(min, componentHeight);
-
- int tabAreaWidth = preferredTabAreaWidth(tabPlacement, height);
- width = tabAreaWidth + componentWidth;
+ height = Math.max(min, height);
+ int tabAreaWidth = preferredTabAreaWidth(tabPlacement,
+ height - tabAreaInsets.top
+ - tabAreaInsets.bottom);
+ width += tabAreaWidth;
}
- return new Dimension(width, height);
+ Insets tabPaneInsets = tabPane.getInsets();
+ return new Dimension(width + tabPaneInsets.left + tabPaneInsets.right,
+ height + tabPaneInsets.top + tabPaneInsets.bottom);
}
// if tab placement is LEFT OR RIGHT, they share width.
@@ -330,192 +324,197 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
*/
protected void calculateTabRects(int tabPlacement, int tabCount)
{
+ Insets insets = tabPane.getInsets();
+ Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
+ Dimension size = tabPane.getSize();
+
+ // The coordinates of the upper left corner of the tab area.
+ int x;
+ int y;
+ // The location at which the runs must be broken.
+ int breakAt;
+
+ // Calculate the bounds for the tab area.
+ switch (tabPlacement)
+ {
+ case LEFT:
+ maxTabWidth = calculateMaxTabWidth(tabPlacement);
+ x = insets.left + tabAreaInsets.left;
+ y = insets.top + tabAreaInsets.top;
+ breakAt = size.height - (insets.bottom + tabAreaInsets.bottom);
+ break;
+ case RIGHT:
+ maxTabWidth = calculateMaxTabWidth(tabPlacement);
+ x = size.width - (insets.right + tabAreaInsets.right) - maxTabWidth;
+ y = insets.top + tabAreaInsets.top;
+ breakAt = size.height - (insets.bottom + tabAreaInsets.bottom);
+ break;
+ case BOTTOM:
+ maxTabHeight = calculateMaxTabHeight(tabPlacement);
+ x = insets.left + tabAreaInsets.left;
+ y = size.height - (insets.bottom + tabAreaInsets.bottom)
+ - maxTabHeight;
+ breakAt = size.width - (insets.right + tabAreaInsets.right);
+ break;
+ case TOP:
+ default:
+ maxTabHeight = calculateMaxTabHeight(tabPlacement);
+ x = insets.left + tabAreaInsets.left;
+ y = insets.top + tabAreaInsets.top;
+ breakAt = size.width - (insets.right + tabAreaInsets.right);
+ break;
+ }
+
if (tabCount == 0)
return;
FontMetrics fm = getFontMetrics();
- SwingUtilities.calculateInnerArea(tabPane, calcRect);
- Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
- Insets insets = tabPane.getInsets();
- int max = 0;
- int runs = 0;
- int start = getTabRunIndent(tabPlacement, 1);
+ runCount = 0;
+ selectedRun = -1;
+ int selectedIndex = tabPane.getSelectedIndex();
+
+ Rectangle rect;
+
+ // Go through all the tabs and build the tab runs.
if (tabPlacement == SwingConstants.TOP
|| tabPlacement == SwingConstants.BOTTOM)
{
- int maxHeight = calculateMaxTabHeight(tabPlacement);
-
- calcRect.width -= tabAreaInsets.left + tabAreaInsets.right;
- max = calcRect.width + tabAreaInsets.left + insets.left;
- start += tabAreaInsets.left + insets.left;
- int width = 0;
- int runWidth = start;
-
for (int i = 0; i < tabCount; i++)
{
- width = calculateTabWidth(tabPlacement, i, fm);
- if (runWidth + width > max)
+ rect = rects[i];
+ if (i > 0)
{
- runWidth = tabAreaInsets.left + insets.left
- + getTabRunIndent(tabPlacement, ++runs);
- rects[i] = new Rectangle(runWidth,
- insets.top + tabAreaInsets.top,
- width, maxHeight);
- runWidth += width;
- if (runs > tabRuns.length - 1)
- expandTabRunsArray();
- tabRuns[runs] = i;
+ rect.x = rects[i - 1].x + rects[i - 1].width;
}
else
{
- rects[i] = new Rectangle(runWidth,
- insets.top + tabAreaInsets.top,
- width, maxHeight);
- runWidth += width;
+ tabRuns[0] = 0;
+ runCount = 1;
+ maxTabWidth = 0;
+ rect.x = x;
}
- }
- runs++;
- tabAreaRect.width = tabPane.getWidth() - insets.left - insets.right;
- tabAreaRect.height = runs * maxTabHeight
- - (runs - 1) * tabRunOverlay
- + tabAreaInsets.top + tabAreaInsets.bottom;
- contentRect.width = tabAreaRect.width;
- contentRect.height = tabPane.getHeight() - insets.top
- - insets.bottom - tabAreaRect.height;
- contentRect.x = insets.left;
- tabAreaRect.x = insets.left;
- if (tabPlacement == SwingConstants.BOTTOM)
- {
- contentRect.y = insets.top;
- tabAreaRect.y = contentRect.y + contentRect.height;
- }
- else
- {
- tabAreaRect.y = insets.top;
- contentRect.y = tabAreaRect.y + tabAreaRect.height;
+ rect.width = calculateTabWidth(tabPlacement, i, fm);
+ maxTabWidth = Math.max(maxTabWidth, rect.width);
+
+ if (rect.x != 2 + insets.left && rect.x + rect.width > breakAt)
+ {
+ if (runCount > tabRuns.length - 1)
+ expandTabRunsArray();
+ tabRuns[runCount] = i;
+ runCount++;
+ rect.x = x;
+ }
+
+ rect.y = y;
+ rect.height = maxTabHeight;
+ if (i == selectedIndex)
+ selectedRun = runCount - 1;
+
}
}
else
{
- int maxWidth = calculateMaxTabWidth(tabPlacement);
- calcRect.height -= tabAreaInsets.top + tabAreaInsets.bottom;
- max = calcRect.height + tabAreaInsets.top + insets.top;
-
- int height = 0;
- start += tabAreaInsets.top + insets.top;
- int runHeight = start;
-
- int fontHeight = fm.getHeight();
-
for (int i = 0; i < tabCount; i++)
{
- height = calculateTabHeight(tabPlacement, i, fontHeight);
- if (runHeight + height > max)
+ rect = rects[i];
+ if (i > 0)
{
- runHeight = tabAreaInsets.top + insets.top
- + getTabRunIndent(tabPlacement, ++runs);
- rects[i] = new Rectangle(insets.left + tabAreaInsets.left,
- runHeight, maxWidth, height);
- runHeight += height;
- if (runs > tabRuns.length - 1)
- expandTabRunsArray();
- tabRuns[runs] = i;
+ rect.y = rects[i - 1].y + rects[i - 1].height;
}
else
{
- rects[i] = new Rectangle(insets.left + tabAreaInsets.left,
- runHeight, maxWidth, height);
- runHeight += height;
+ tabRuns[0] = 0;
+ runCount = 1;
+ maxTabHeight = 0;
+ rect.y = y;
}
- }
- runs++;
+ rect.height = calculateTabHeight(tabPlacement, i,
+ fm.getHeight());
+ maxTabHeight = Math.max(maxTabHeight, rect.height);
- tabAreaRect.width = runs * maxTabWidth - (runs - 1) * tabRunOverlay
- + tabAreaInsets.left + tabAreaInsets.right;
- tabAreaRect.height = tabPane.getHeight() - insets.top
- - insets.bottom;
- tabAreaRect.y = insets.top;
- contentRect.width = tabPane.getWidth() - insets.left - insets.right
- - tabAreaRect.width;
- contentRect.height = tabAreaRect.height;
- contentRect.y = insets.top;
- if (tabPlacement == SwingConstants.LEFT)
- {
- tabAreaRect.x = insets.left;
- contentRect.x = tabAreaRect.x + tabAreaRect.width;
- }
- else
- {
- contentRect.x = insets.left;
- tabAreaRect.x = contentRect.x + contentRect.width;
+ if (rect.y != 2 + insets.top && rect.y + rect.height > breakAt)
+ {
+ if (runCount > tabRuns.length - 1)
+ expandTabRunsArray();
+ tabRuns[runCount] = i;
+ runCount++;
+ rect.y = y;
+ }
+
+ rect.x = x;
+ rect.width = maxTabWidth;
+
+ if (i == selectedIndex)
+ selectedRun = runCount - 1;
}
}
- runCount = runs;
- if (runCount > tabRuns.length)
- expandTabRunsArray();
-
- tabRuns[0] = 0;
- normalizeTabRuns(tabPlacement, tabCount, start, max);
- selectedRun = getRunForTab(tabCount, tabPane.getSelectedIndex());
- if (shouldRotateTabRuns(tabPlacement))
- rotateTabRuns(tabPlacement, selectedRun);
- // Need to pad the runs and move them to the correct location.
- for (int i = 0; i < runCount; i++)
+ if (runCount > 1)
{
- int first = lastTabInRun(tabCount, getPreviousTabRun(i)) + 1;
- if (first == tabCount)
- first = 0;
- int last = lastTabInRun(tabCount, i);
- if (shouldPadTabRun(tabPlacement, i))
- padTabRun(tabPlacement, first, last, max);
-
- // Done padding, now need to move it.
- if (tabPlacement == SwingConstants.TOP && i > 0)
+ int start;
+ if (tabPlacement == SwingConstants.TOP
+ || tabPlacement == SwingConstants.BOTTOM)
+ start = y;
+ else
+ start = x;
+ normalizeTabRuns(tabPlacement, tabCount, start, breakAt);
+ selectedRun = getRunForTab(tabCount, selectedIndex);
+ if (shouldRotateTabRuns(tabPlacement))
{
- for (int j = first; j <= last; j++)
- rects[j].y += (runCount - i) * maxTabHeight
- - (runCount - i) * tabRunOverlay;
+ rotateTabRuns(tabPlacement, selectedRun);
}
+ }
- if (tabPlacement == SwingConstants.BOTTOM)
+ // Pad the runs.
+ int tabRunOverlay = getTabRunOverlay(tabPlacement);
+ for (int i = runCount - 1; i >= 0; --i)
+ {
+ int start = tabRuns[i];
+ int nextIndex;
+ if (i == runCount - 1)
+ nextIndex = 0;
+ else
+ nextIndex = i + 1;
+ int next = tabRuns[nextIndex];
+ int end = (next != 0 ? next - 1 : tabCount - 1);
+ if (tabPlacement == SwingConstants.TOP
+ || tabPlacement == SwingConstants.BOTTOM)
{
- int height = tabPane.getBounds().height - insets.bottom
- - tabAreaInsets.bottom;
- int adjustment;
- if (i == 0)
- adjustment = height - maxTabHeight;
+ for (int j = start; j <= end; ++j)
+ {
+ rect = rects[j];
+ rect.y = y;
+ rect.x += getTabRunIndent(tabPlacement, i);
+ }
+ if (shouldPadTabRun(tabPlacement, i))
+ {
+ padTabRun(tabPlacement, start, end, breakAt);
+ }
+ if (tabPlacement == BOTTOM)
+ y -= (maxTabHeight - tabRunOverlay);
else
- adjustment = height - (runCount - i + 1) * maxTabHeight
- - (runCount - i) * tabRunOverlay;
-
- for (int j = first; j <= last; j++)
- rects[j].y = adjustment;
- }
-
- if (tabPlacement == SwingConstants.LEFT && i > 0)
- {
- for (int j = first; j <= last; j++)
- rects[j].x += (runCount - i) * maxTabWidth
- - (runCount - i) * tabRunOverlay;
+ y += (maxTabHeight - tabRunOverlay);
}
-
- if (tabPlacement == SwingConstants.RIGHT)
+ else
{
- int width = tabPane.getBounds().width - insets.right
- - tabAreaInsets.right;
- int adjustment;
- if (i == 0)
- adjustment = width - maxTabWidth;
+ for (int j = start; j <= end; ++j)
+ {
+ rect = rects[j];
+ rect.x = x;
+ rect.y += getTabRunIndent(tabPlacement, i);
+ }
+ if (shouldPadTabRun(tabPlacement, i))
+ {
+ padTabRun(tabPlacement, start, end, breakAt);
+ }
+ if (tabPlacement == RIGHT)
+ x -= (maxTabWidth - tabRunOverlay);
else
- adjustment = width - (runCount - i + 1) * maxTabWidth
- + (runCount - i) * tabRunOverlay;
-
- for (int j = first; j <= last; j++)
- rects[j].x = adjustment;
+ x += (maxTabWidth - tabRunOverlay);
+
}
}
- padSelectedTab(tabPlacement, tabPane.getSelectedIndex());
+ padSelectedTab(tabPlacement, selectedIndex);
}
/**
@@ -528,6 +527,58 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
public void layoutContainer(Container parent)
{
calculateLayoutInfo();
+
+ int tabPlacement = tabPane.getTabPlacement();
+ Insets insets = tabPane.getInsets();
+ int childCount = tabPane.getComponentCount();
+ if (childCount > 0)
+ {
+ int compX;
+ int compY;
+ int tabAreaWidth = 0;
+ int tabAreaHeight = 0;
+ switch (tabPlacement)
+ {
+ case LEFT:
+ tabAreaWidth = calculateTabAreaWidth(tabPlacement, runCount,
+ maxTabWidth);
+ compX = tabAreaWidth + insets.left + contentBorderInsets.left;
+ compY = insets.top + contentBorderInsets.top;
+ break;
+ case RIGHT:
+ tabAreaWidth = calculateTabAreaWidth(tabPlacement, runCount,
+ maxTabWidth);
+ compX = insets.left + contentBorderInsets.left;
+ compY = insets.top + contentBorderInsets.top;
+ break;
+ case BOTTOM:
+ tabAreaHeight = calculateTabAreaHeight(tabPlacement, runCount,
+ maxTabHeight);
+ compX = insets.left + contentBorderInsets.left;
+ compY = insets.top + contentBorderInsets.top;
+ break;
+ case TOP:
+ default:
+ tabAreaHeight = calculateTabAreaHeight(tabPlacement, runCount,
+ maxTabHeight);
+ compX = insets.left + contentBorderInsets.left;
+ compY = tabAreaHeight + insets.top + contentBorderInsets.top;
+ }
+ Rectangle bounds = tabPane.getBounds();
+ int compWidth = bounds.width - tabAreaWidth - insets.left
+ - insets.right - contentBorderInsets.left
+ - contentBorderInsets.right;
+ int compHeight = bounds.height - tabAreaHeight - insets.top
+ - insets.bottom - contentBorderInsets.top
+ - contentBorderInsets.bottom;
+
+
+ for (int i = 0; i < childCount; ++i)
+ {
+ Component c = tabPane.getComponent(i);
+ c.setBounds(compX, compY, compWidth, compHeight);
+ }
+ }
}
/**
@@ -1288,6 +1339,12 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
protected int[] tabRuns;
/**
+ * Indicates if the layout of the tab runs is ok or not. This is package
+ * private to avoid a synthetic accessor method.
+ */
+ boolean tabRunsDirty;
+
+ /**
* This is the keystroke for moving down.
*
* @deprecated 1.3
@@ -1343,6 +1400,17 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
transient Rectangle contentRect;
/**
+ * The index over which the mouse is currently moving.
+ */
+ private int rolloverTab;
+
+ /**
+ * Determines if tabs are painted opaque or not. This can be adjusted using
+ * the UIManager property 'TabbedPane.tabsOpaque'.
+ */
+ private boolean tabsOpaque;
+
+ /**
* Creates a new BasicTabbedPaneUI object.
*/
public BasicTabbedPaneUI()
@@ -1557,6 +1625,7 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
selectedTabPadInsets = UIManager.getInsets("TabbedPane.tabbedPaneTabPadInsets");
tabAreaInsets = UIManager.getInsets("TabbedPane.tabAreaInsets");
contentBorderInsets = UIManager.getInsets("TabbedPane.tabbedPaneContentBorderInsets");
+ tabsOpaque = UIManager.getBoolean("TabbedPane.tabsOpaque");
calcRect = new Rectangle();
tabRuns = new int[10];
@@ -1585,9 +1654,10 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
lightHighlight = null;
highlight = null;
- tabPane.setBackground(null);
- tabPane.setForeground(null);
- tabPane.setFont(null);
+ // Install UI colors and fonts.
+ LookAndFeel.installColorsAndFont(tabPane, "TabbedPane.background",
+ "TabbedPane.foreground",
+ "TabbedPane.font");
}
/**
@@ -1666,6 +1736,7 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
* This method installs keyboard actions for the JTabbedPane.
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Implement.
}
@@ -1674,6 +1745,7 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
* This method uninstalls keyboard actions for the JTabbedPane.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Implement.
}
@@ -1710,6 +1782,9 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
*/
public void paint(Graphics g, JComponent c)
{
+ if (!tabPane.isValid())
+ tabPane.validate();
+
if (tabPane.getTabCount() == 0)
return;
if (tabPane.getTabLayoutPolicy() == JTabbedPane.WRAP_TAB_LAYOUT)
@@ -1735,42 +1810,26 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
// Please note: the ordering of the painting is important.
// we WANT to paint the outermost run first and then work our way in.
int tabCount = tabPane.getTabCount();
- int currRun = 1;
-
- if (tabCount < 1)
- return;
-
- if (runCount > 1)
- currRun = 0;
- for (int i = 0; i < runCount; i++)
+ for (int i = runCount - 1; i >= 0; --i)
{
- int first = lastTabInRun(tabCount, getPreviousTabRun(currRun)) + 1;
- if (isScroll)
- first = currentScrollLocation;
- else if (first == tabCount)
- first = 0;
- int last = lastTabInRun(tabCount, currRun);
- if (isScroll)
+ int start = tabRuns[i];
+ int next;
+ if (i == runCount - 1)
+ next = tabRuns[0];
+ else
+ next = tabRuns[i + 1];
+ int end = (next != 0 ? next - 1 : tabCount - 1);
+ for (int j = start; j <= end; ++j)
{
- for (int k = first; k < tabCount; k++)
+ if (j != selectedIndex)
{
- if (rects[k].x + rects[k].width - rects[first].x > viewport
- .getWidth())
- {
- last = k;
- break;
- }
+ paintTab(g, tabPlacement, rects, j, ir, tr);
}
}
-
- for (int j = first; j <= last; j++)
- {
- if (j != selectedIndex || isScroll)
- paintTab(g, tabPlacement, rects, j, ir, tr);
- }
- currRun = getPreviousTabRun(currRun);
}
- if (! isScroll)
+
+ // Paint selected tab in front of every other tab.
+ if (selectedIndex >= 0)
paintTab(g, tabPlacement, rects, selectedIndex, ir, tr);
}
@@ -1788,49 +1847,34 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects,
int tabIndex, Rectangle iconRect, Rectangle textRect)
{
- FontMetrics fm = getFontMetrics();
- Icon icon = getIconForTab(tabIndex);
- String title = tabPane.getTitleAt(tabIndex);
+ Rectangle rect = rects[tabIndex];
boolean isSelected = tabIndex == tabPane.getSelectedIndex();
- calcRect = getTabBounds(tabPane, tabIndex);
-
- int x = calcRect.x;
- int y = calcRect.y;
- int w = calcRect.width;
- int h = calcRect.height;
- if (getRunForTab(tabPane.getTabCount(), tabIndex) == 1)
+ // Paint background if necessary.
+ if (tabsOpaque || tabPane.isOpaque())
{
- Insets insets = getTabAreaInsets(tabPlacement);
- switch (tabPlacement)
- {
- case TOP:
- h += insets.bottom;
- break;
- case LEFT:
- w += insets.right;
- break;
- case BOTTOM:
- y -= insets.top;
- h += insets.top;
- break;
- case RIGHT:
- x -= insets.left;
- w += insets.left;
- break;
- }
+ paintTabBackground(g, tabPlacement, tabIndex, rect.x, rect.y,
+ rect.width, rect.height, isSelected);
}
- layoutLabel(tabPlacement, fm, tabIndex, title, icon, calcRect, iconRect,
- textRect, isSelected);
- paintTabBackground(g, tabPlacement, tabIndex, x, y, w, h, isSelected);
- paintTabBorder(g, tabPlacement, tabIndex, x, y, w, h, isSelected);
+ // Paint border.
+ paintTabBorder(g, tabPlacement, tabIndex, rect.x, rect.y, rect.width,
+ rect.height, isSelected);
- // FIXME: Paint little folding corner and jagged edge clipped tab.
- if (icon != null)
- paintIcon(g, tabPlacement, tabIndex, icon, iconRect, isSelected);
- if (title != null && ! title.equals(""))
- paintText(g, tabPlacement, tabPane.getFont(), fm, tabIndex, title,
+
+ // Layout label.
+ FontMetrics fm = getFontMetrics();
+ Icon icon = getIconForTab(tabIndex);
+ String title = tabPane.getTitleAt(tabIndex);
+ layoutLabel(tabPlacement, fm, tabIndex, title, icon, rect, iconRect,
textRect, isSelected);
+ // Paint the text.
+ paintText(g, tabPlacement, tabPane.getFont(), fm, tabIndex, title,
+ textRect, isSelected);
+ // Paint icon if necessary.
+ paintIcon(g, tabPlacement, tabIndex, icon, iconRect, isSelected);
+ // Paint focus indicator.
+ paintFocusIndicator(g, tabPlacement, rects, tabIndex, iconRect, textRect,
+ isSelected);
}
/**
@@ -1902,6 +1946,7 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
FontMetrics metrics, int tabIndex, String title,
Rectangle textRect, boolean isSelected)
{
+ g.setFont(font);
View textView = getTextViewForTab(tabIndex);
if (textView != null)
{
@@ -1909,54 +1954,48 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
return;
}
- Color fg = tabPane.getForegroundAt(tabIndex);
- if (fg == null)
- fg = tabPane.getForeground();
- Color bg = tabPane.getBackgroundAt(tabIndex);
- if (bg == null)
- bg = tabPane.getBackground();
-
- Color saved_color = g.getColor();
- Font f = g.getFont();
- g.setFont(font);
+ int ascent = metrics.getAscent();
- if (tabPane.isEnabledAt(tabIndex))
+ int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex);
+ if (tabPane.isEnabled() && tabPane.isEnabledAt(tabIndex))
{
+ Color fg = tabPane.getForegroundAt(tabIndex);
+ if (isSelected && (fg instanceof UIResource))
+ {
+ Color selectionForeground =
+ UIManager.getColor("TabbedPane.selectionForeground");
+ if (selectionForeground != null)
+ fg = selectionForeground;
+ }
g.setColor(fg);
- int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex);
-
if (mnemIndex != -1)
BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex,
textRect.x,
- textRect.y
- + metrics.getAscent());
+ textRect.y + ascent);
else
- g.drawString(title, textRect.x, textRect.y + metrics.getAscent());
+ g.drawString(title, textRect.x, textRect.y + ascent);
}
else
{
+ Color bg = tabPane.getBackgroundAt(tabIndex);
g.setColor(bg.brighter());
-
- int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex);
-
if (mnemIndex != -1)
BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex,
- textRect.x, textRect.y);
+ textRect.x, textRect.y
+ + ascent);
else
- g.drawString(title, textRect.x, textRect.y);
+ g.drawString(title, textRect.x, textRect.y + ascent);
g.setColor(bg.darker());
if (mnemIndex != -1)
BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex,
textRect.x + 1,
- textRect.y + 1);
+ textRect.y + 1
+ + ascent);
else
- g.drawString(title, textRect.x + 1, textRect.y + 1);
+ g.drawString(title, textRect.x + 1, textRect.y + 1 + ascent);
}
-
- g.setColor(saved_color);
- g.setFont(f);
}
/**
@@ -2009,14 +2048,45 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
Rectangle iconRect, Rectangle textRect,
boolean isSelected)
{
- Color saved = g.getColor();
- calcRect = iconRect.union(textRect);
-
- g.setColor(focus);
-
- g.drawRect(calcRect.x, calcRect.y, calcRect.width, calcRect.height);
-
- g.setColor(saved);
+ if (tabPane.hasFocus() && isSelected)
+ {
+ Rectangle rect = rects[tabIndex];
+ // The focus rectangle.
+ int x;
+ int y;
+ int w;
+ int h;
+
+ g.setColor(focus);
+ switch (tabPlacement)
+ {
+ case LEFT:
+ x = rect.x + 3;
+ y = rect.y + 3;
+ w = rect.width - 5;
+ h = rect.height - 6;
+ break;
+ case RIGHT:
+ x = rect.x + 2;
+ y = rect.y + 3;
+ w = rect.width - 6;
+ h = rect.height - 5;
+ break;
+ case BOTTOM:
+ x = rect.x + 3;
+ y = rect.y + 2;
+ w = rect.width - 6;
+ h = rect.height - 5;
+ break;
+ case TOP:
+ default:
+ x = rect.x + 3;
+ y = rect.y + 3;
+ w = rect.width - 6;
+ h = rect.height - 5;
+ }
+ BasicGraphicsUtils.drawDashedRect(g, x, y, w, h);
+ }
}
/**
@@ -2109,10 +2179,44 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
protected void paintContentBorder(Graphics g, int tabPlacement,
int selectedIndex)
{
- int x = contentRect.x;
- int y = contentRect.y;
- int w = contentRect.width;
- int h = contentRect.height;
+ int width = tabPane.getWidth();
+ int height = tabPane.getHeight();
+ Insets insets = tabPane.getInsets();
+ Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
+
+ // Calculate coordinates of content area.
+ int x = insets.left;
+ int y = insets.top;
+ int w = width - insets.left - insets.right;
+ int h = height - insets.top - insets.bottom;
+
+ switch (tabPlacement)
+ {
+ case LEFT:
+ x += calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth);
+ w -= (x - insets.left);
+ break;
+ case RIGHT:
+ w -= calculateTabAreaWidth(tabPlacement, runCount, maxTabWidth);
+ break;
+ case BOTTOM:
+ h -= calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight);
+ break;
+ case TOP:
+ default:
+ y += calculateTabAreaHeight(tabPlacement, runCount, maxTabHeight);
+ h -= (y - insets.top);
+ }
+
+ // Fill background if necessary.
+ if (tabPane.isOpaque())
+ {
+ Color bg = UIManager.getColor("TabbedPane.contentAreaColor");
+ g.setColor(bg);
+ g.fillRect(x, y, w, h);
+ }
+
+ // Paint border.
paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h);
@@ -2332,23 +2436,23 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
*/
public int tabForCoordinate(JTabbedPane pane, int x, int y)
{
- Point p = new Point(x, y);
+ if (! tabPane.isValid())
+ tabPane.validate();
+
int tabCount = tabPane.getTabCount();
- int currRun = 1;
- for (int i = 0; i < runCount; i++)
+ int index = -1;
+ for (int i = 0; i < tabCount; ++i)
{
- int first = lastTabInRun(tabCount, getPreviousTabRun(currRun)) + 1;
- if (first == tabCount)
- first = 0;
- int last = lastTabInRun(tabCount, currRun);
- for (int j = first; j <= last; j++)
+ if (rects[i].contains(x, y))
{
- if (getTabBounds(pane, j).contains(p))
- return j;
+ index = i;
+ break;
}
- currRun = getNextTabRun(currRun);
}
- return -1;
+
+ // FIXME: Handle scrollable tab layout.
+
+ return index;
}
/**
@@ -2455,10 +2559,23 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
*/
protected int lastTabInRun(int tabCount, int run)
{
- if (tabRuns[run] == 0)
- return tabCount - 1;
+ int lastTab;
+ if (runCount == 1)
+ lastTab = tabCount - 1;
else
- return tabRuns[run] - 1;
+ {
+ int nextRun;
+ if (run == runCount - 1)
+ nextRun = 0;
+ else
+ nextRun = run + 1;
+
+ if (tabRuns[nextRun] == 0)
+ lastTab = tabCount - 1;
+ else
+ lastTab = tabRuns[nextRun] - 1;
+ }
+ return lastTab;
}
/**
@@ -2554,24 +2671,14 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
protected int calculateTabHeight(int tabPlacement, int tabIndex,
int fontHeight)
{
- Icon icon = getIconForTab(tabIndex);
- Insets insets = getTabInsets(tabPlacement, tabIndex);
+ // FIXME: Handle HTML somehow.
- int height = 0;
+ int height = fontHeight;
+ Icon icon = getIconForTab(tabIndex);
+ Insets tabInsets = getTabInsets(tabPlacement, tabIndex);
if (icon != null)
- {
- Rectangle vr = new Rectangle();
- Rectangle ir = new Rectangle();
- Rectangle tr = new Rectangle();
- layoutLabel(tabPlacement, getFontMetrics(), tabIndex,
- tabPane.getTitleAt(tabIndex), icon, vr, ir, tr,
- tabIndex == tabPane.getSelectedIndex());
- height = tr.union(ir).height;
- }
- else
- height = fontHeight;
-
- height += insets.top + insets.bottom;
+ height = Math.max(height, icon.getIconHeight());
+ height += tabInsets.top + tabInsets.bottom + 2;
return height;
}
@@ -2704,9 +2811,7 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
*/
protected Insets getTabInsets(int tabPlacement, int tabIndex)
{
- Insets target = new Insets(0, 0, 0, 0);
- rotateInsets(tabInsets, target, tabPlacement);
- return target;
+ return tabInsets;
}
/**
@@ -3068,4 +3173,33 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
break;
}
}
+
+ /**
+ * Sets the tab which should be highlighted when in rollover mode. And
+ * <code>index</code> of <code>-1</code> means that the rollover tab
+ * is deselected (i.e. the mouse is outside of the tabarea).
+ *
+ * @param index the index of the tab that is under the mouse, <code>-1</code>
+ * for no tab
+ *
+ * @since 1.5
+ */
+ protected void setRolloverTab(int index)
+ {
+ rolloverTab = index;
+ }
+
+ /**
+ * Retunrs the index of the tab over which the mouse is currently moving,
+ * or <code>-1</code> for no tab.
+ *
+ * @return the index of the tab over which the mouse is currently moving,
+ * or <code>-1</code> for no tab
+ *
+ * @since 1.5
+ */
+ protected int getRolloverTab()
+ {
+ return rolloverTab;
+ }
}
diff --git a/javax/swing/plaf/basic/BasicTableHeaderUI.java b/javax/swing/plaf/basic/BasicTableHeaderUI.java
index c6f9e37df..cfbebda21 100644
--- a/javax/swing/plaf/basic/BasicTableHeaderUI.java
+++ b/javax/swing/plaf/basic/BasicTableHeaderUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
@@ -97,6 +99,11 @@ public class BasicTableHeaderUI extends TableHeaderUI
* The header cell border.
*/
private Border cellBorder;
+
+ /**
+ * Original mouse cursor prior to resizing.
+ */
+ private Cursor originalCursor;
/**
* If not null, one of the columns is currently being dragged.
@@ -243,6 +250,7 @@ public class BasicTableHeaderUI extends TableHeaderUI
if (onBoundary)
{
+ originalCursor = header.getCursor();
if (p < x)
header.setCursor(Cursor.getPredefinedCursor
(Cursor.W_RESIZE_CURSOR));
@@ -252,7 +260,7 @@ public class BasicTableHeaderUI extends TableHeaderUI
}
else
{
- header.setCursor(Cursor.getDefaultCursor());
+ header.setCursor(originalCursor);
header.setResizingColumn(null);
}
@@ -343,7 +351,7 @@ public class BasicTableHeaderUI extends TableHeaderUI
showingResizeCursor = false;
if (timer != null)
timer.stop();
- header.setCursor(Cursor.getDefaultCursor());
+ header.setCursor(originalCursor);
}
/**
@@ -415,6 +423,7 @@ public class BasicTableHeaderUI extends TableHeaderUI
}
protected void installKeyboardActions()
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
@@ -447,6 +456,7 @@ public class BasicTableHeaderUI extends TableHeaderUI
}
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
diff --git a/javax/swing/plaf/basic/BasicTableUI.java b/javax/swing/plaf/basic/BasicTableUI.java
index 8360a9ec7..ef491cbf1 100644
--- a/javax/swing/plaf/basic/BasicTableUI.java
+++ b/javax/swing/plaf/basic/BasicTableUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Component;
import java.awt.ComponentOrientation;
@@ -88,7 +90,7 @@ public class BasicTableUI extends TableUI
protected FocusListener focusListener;
protected KeyListener keyListener;
- protected MouseInputListener mouseInputListener;
+ protected MouseInputListener mouseInputListener;
protected CellRendererPane rendererPane;
protected JTable table;
@@ -115,6 +117,8 @@ public class BasicTableUI extends TableUI
/**
* Receives notification that a key has been pressed and released.
+ * Activates the editing session for the focused cell by pressing the
+ * character keys.
*
* @param event the key event
*/
@@ -122,6 +126,16 @@ public class BasicTableUI extends TableUI
{
// Key events should be handled through the InputMap/ActionMap mechanism
// since JDK1.3. This class is only there for backwards compatibility.
+
+ // Editor activation is a specific kind of response to ''any''
+ // character key. Hence it is handled here.
+ if (!table.isEditing() && table.isEnabled())
+ {
+ int r = table.getSelectedRow();
+ int c = table.getSelectedColumn();
+ if (table.isCellEditable(r, c))
+ table.editCellAt(r, c);
+ }
}
/**
@@ -509,11 +523,9 @@ public class BasicTableUI extends TableUI
if (command.equals("selectPreviousRowExtendSelection"))
{
rowModel.setLeadSelectionIndex(Math.max(rowLead - 1, 0));
- colModel.setLeadSelectionIndex(colLead);
}
else if (command.equals("selectLastColumn"))
{
- rowModel.setSelectionInterval(rowLead, rowLead);
colModel.setSelectionInterval(colMax, colMax);
}
else if (command.equals("startEditing"))
@@ -524,53 +536,43 @@ public class BasicTableUI extends TableUI
else if (command.equals("selectFirstRowExtendSelection"))
{
rowModel.setLeadSelectionIndex(0);
- colModel.setLeadSelectionIndex(colLead);
}
else if (command.equals("selectFirstColumn"))
{
- rowModel.setSelectionInterval(rowLead, rowLead);
colModel.setSelectionInterval(0, 0);
}
else if (command.equals("selectFirstColumnExtendSelection"))
{
colModel.setLeadSelectionIndex(0);
- rowModel.setLeadSelectionIndex(rowLead);
}
else if (command.equals("selectLastRow"))
{
rowModel.setSelectionInterval(rowMax,rowMax);
- colModel.setSelectionInterval(colLead, colLead);
}
else if (command.equals("selectNextRowExtendSelection"))
{
rowModel.setLeadSelectionIndex(Math.min(rowLead + 1, rowMax));
- colModel.setLeadSelectionIndex(colLead);
}
else if (command.equals("selectFirstRow"))
{
rowModel.setSelectionInterval(0,0);
- colModel.setSelectionInterval(colLead, colLead);
}
else if (command.equals("selectNextColumnExtendSelection"))
{
colModel.setLeadSelectionIndex(Math.min(colLead + 1, colMax));
- rowModel.setLeadSelectionIndex(rowLead);
}
else if (command.equals("selectLastColumnExtendSelection"))
{
colModel.setLeadSelectionIndex(colMax);
- rowModel.setLeadSelectionIndex(rowLead);
}
else if (command.equals("selectPreviousColumnExtendSelection"))
{
colModel.setLeadSelectionIndex(Math.max(colLead - 1, 0));
- rowModel.setLeadSelectionIndex(rowLead);
}
else if (command.equals("selectNextRow"))
{
rowModel.setSelectionInterval(Math.min(rowLead + 1, rowMax),
Math.min(rowLead + 1, rowMax));
- colModel.setSelectionInterval(colLead,colLead);
}
else if (command.equals("scrollUpExtendSelection"))
{
@@ -589,7 +591,6 @@ public class BasicTableUI extends TableUI
{
rowModel.setSelectionInterval(Math.max(rowLead - 1, 0),
Math.max(rowLead - 1, 0));
- colModel.setSelectionInterval(colLead,colLead);
}
else if (command.equals("scrollRightChangeSelection"))
{
@@ -606,7 +607,6 @@ public class BasicTableUI extends TableUI
}
else if (command.equals("selectPreviousColumn"))
{
- rowModel.setSelectionInterval(rowLead,rowLead);
colModel.setSelectionInterval(Math.max(colLead - 1, 0),
Math.max(colLead - 1, 0));
}
@@ -715,7 +715,6 @@ public class BasicTableUI extends TableUI
}
else if (command.equals("selectNextColumn"))
{
- rowModel.setSelectionInterval(rowLead,rowLead);
colModel.setSelectionInterval(Math.min(colLead + 1, colMax),
Math.min(colLead + 1, colMax));
}
@@ -903,7 +902,6 @@ public class BasicTableUI extends TableUI
table.scrollRectToVisible
(table.getCellRect(rowModel.getLeadSelectionIndex(),
colModel.getLeadSelectionIndex(), false));
- table.repaint();
}
/**
@@ -1172,6 +1170,7 @@ public class BasicTableUI extends TableUI
}
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
@@ -1247,16 +1246,18 @@ public class BasicTableUI extends TableUI
if (rn == -1)
rn = table.getRowCount() - 1;
+ int columnMargin = table.getColumnModel().getColumnMargin();
+ int rowMargin = table.getRowMargin();
+
TableColumnModel cmodel = table.getColumnModel();
int [] widths = new int[cn+1];
for (int i = c0; i <=cn ; i++)
{
- widths[i] = cmodel.getColumn(i).getWidth();
+ widths[i] = cmodel.getColumn(i).getWidth() - columnMargin;
}
Rectangle bounds = table.getCellRect(r0, c0, false);
- bounds.height = table.getRowHeight()+table.getRowMargin();
-
+
// The left boundary of the area being repainted.
int left = bounds.x;
@@ -1266,9 +1267,6 @@ public class BasicTableUI extends TableUI
// The bottom boundary of the area being repainted.
int bottom;
- // The cell height.
- int height = bounds.height;
-
// paint the cell contents
Color grid = table.getGridColor();
for (int r = r0; r <= rn; ++r)
@@ -1277,25 +1275,28 @@ public class BasicTableUI extends TableUI
{
bounds.width = widths[c];
paintCell(gfx, r, c, bounds, table.getCellRenderer(r, c));
- bounds.x += widths[c];
+ bounds.x += widths[c] + columnMargin;
}
- bounds.y += height;
bounds.x = left;
+ bounds.y += table.getRowHeight(r) + rowMargin;
+ // Update row height for tables with custom heights.
+ bounds.height = table.getRowHeight(r + 1);
}
- bottom = bounds.y;
+ bottom = bounds.y - rowMargin;
// paint vertical grid lines
if (grid != null && table.getShowVerticalLines())
{
Color save = gfx.getColor();
gfx.setColor(grid);
- int x = left;
-
+ int x = left - columnMargin;
for (int c = c0; c <= cn; ++c)
{
+ // The vertical grid is draw right from the cells, so we
+ // add before drawing.
+ x += widths[c] + columnMargin;
gfx.drawLine(x, top, x, bottom);
- x += widths[c];
}
gfx.setColor(save);
}
@@ -1305,11 +1306,13 @@ public class BasicTableUI extends TableUI
{
Color save = gfx.getColor();
gfx.setColor(grid);
- int y = top;
+ int y = top - rowMargin;
for (int r = r0; r <= rn; ++r)
{
+ // The horizontal grid is draw below the cells, so we
+ // add before drawing.
+ y += table.getRowHeight(r) + rowMargin;
gfx.drawLine(left, y, p2.x, y);
- y += height;
}
gfx.setColor(save);
}
diff --git a/javax/swing/plaf/basic/BasicTextAreaUI.java b/javax/swing/plaf/basic/BasicTextAreaUI.java
index 36854e07f..93e119b31 100644
--- a/javax/swing/plaf/basic/BasicTextAreaUI.java
+++ b/javax/swing/plaf/basic/BasicTextAreaUI.java
@@ -1,5 +1,5 @@
/* BasicTextAreaUI.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -108,6 +108,9 @@ public class BasicTextAreaUI extends BasicTextUI
JTextArea comp = (JTextArea)getComponent();
if (ev.getPropertyName() == "lineWrap"
|| ev.getPropertyName() == "wrapStyleWord")
- modelChanged();
+ {
+ // Changes the View (without modifying the document or it's listeners).
+ setView(create(textComponent.getDocument().getDefaultRootElement()));
+ }
}
}
diff --git a/javax/swing/plaf/basic/BasicTextFieldUI.java b/javax/swing/plaf/basic/BasicTextFieldUI.java
index 4e2ca9f93..89c4e5a75 100644
--- a/javax/swing/plaf/basic/BasicTextFieldUI.java
+++ b/javax/swing/plaf/basic/BasicTextFieldUI.java
@@ -1,5 +1,5 @@
/* BasicTextFieldUI.java
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -42,6 +42,7 @@ import java.beans.PropertyChangeEvent;
import javax.swing.JComponent;
import javax.swing.UIDefaults;
+import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.text.Element;
import javax.swing.text.FieldView;
@@ -83,6 +84,9 @@ public class BasicTextFieldUI extends BasicTextUI
* Receives notification whenever one of the text component's bound
* properties changes. Here we check for the editable and enabled
* properties and adjust the background color accordingly.
+ *
+ * <p>The colors are only changed if they are not a
+ * <code>ColorUIResource</code>.</p>
*
* @param event the property change event
*/
@@ -91,10 +95,11 @@ public class BasicTextFieldUI extends BasicTextUI
if (event.getPropertyName().equals("editable"))
{
boolean editable = ((Boolean) event.getNewValue()).booleanValue();
- if (editable)
- textComponent.setBackground(background);
- else
- textComponent.setBackground(inactiveBackground);
+
+ // Changing the color only if the current background is an instance of
+ // ColorUIResource is the behavior of the RI.
+ if (textComponent.getBackground() instanceof ColorUIResource)
+ textComponent.setBackground(editable ? background : inactiveBackground);
}
}
}
diff --git a/javax/swing/plaf/basic/BasicTextUI.java b/javax/swing/plaf/basic/BasicTextUI.java
index bc5917105..3b620f049 100644
--- a/javax/swing/plaf/basic/BasicTextUI.java
+++ b/javax/swing/plaf/basic/BasicTextUI.java
@@ -38,14 +38,20 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
+import java.awt.HeadlessException;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
@@ -55,7 +61,6 @@ import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
-import javax.swing.KeyStroke;
import javax.swing.LookAndFeel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
@@ -63,7 +68,6 @@ import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.plaf.ActionMapUIResource;
-import javax.swing.plaf.InputMapUIResource;
import javax.swing.plaf.TextUI;
import javax.swing.plaf.UIResource;
import javax.swing.text.AbstractDocument;
@@ -436,6 +440,9 @@ public abstract class BasicTextUI extends TextUI
*/
public void changedUpdate(DocumentEvent ev)
{
+ // Updates are forwarded to the View even if 'getVisibleEditorRect'
+ // method returns null. This means the View classes have to be
+ // aware of that possibility.
rootView.changedUpdate(ev, getVisibleEditorRect(),
rootView.getViewFactory());
}
@@ -447,6 +454,9 @@ public abstract class BasicTextUI extends TextUI
*/
public void insertUpdate(DocumentEvent ev)
{
+ // Updates are forwarded to the View even if 'getVisibleEditorRect'
+ // method returns null. This means the View classes have to be
+ // aware of that possibility.
rootView.insertUpdate(ev, getVisibleEditorRect(),
rootView.getViewFactory());
}
@@ -458,6 +468,9 @@ public abstract class BasicTextUI extends TextUI
*/
public void removeUpdate(DocumentEvent ev)
{
+ // Updates are forwarded to the View even if 'getVisibleEditorRect'
+ // method returns null. This means the View classes have to be
+ // aware of that possibility.
rootView.removeUpdate(ev, getVisibleEditorRect(),
rootView.getViewFactory());
}
@@ -607,6 +620,44 @@ public abstract class BasicTextUI extends TextUI
public void focusLost(FocusEvent e)
{
textComponent.repaint();
+
+ // Integrates Swing text components with the system clipboard:
+ // The idea is that if one wants to copy text around X11-style
+ // (select text and middle-click in the target component) the focus
+ // will move to the new component which gives the old focus owner the
+ // possibility to paste its selection into the clipboard.
+ if (!e.isTemporary()
+ && textComponent.getSelectionStart()
+ != textComponent.getSelectionEnd())
+ {
+ SecurityManager sm = System.getSecurityManager();
+ try
+ {
+ if (sm != null)
+ sm.checkSystemClipboardAccess();
+
+ Clipboard cb = Toolkit.getDefaultToolkit().getSystemSelection();
+ if (cb != null)
+ {
+ StringSelection selection = new StringSelection(textComponent.getSelectedText());
+ cb.setContents(selection, selection);
+ }
+ }
+ catch (SecurityException se)
+ {
+ // Not allowed to access the clipboard: Ignore and
+ // do not access it.
+ }
+ catch (HeadlessException he)
+ {
+ // There is no AWT: Ignore and do not access the
+ // clipboard.
+ }
+ catch (IllegalStateException ise)
+ {
+ // Clipboard is currently unavaible.
+ }
+ }
}
};
@@ -654,33 +705,23 @@ public abstract class BasicTextUI extends TextUI
*/
protected Keymap createKeymap()
{
- // FIXME: It seems to me that this method implementation is wrong. It seems
- // to fetch the focusInputMap and transform it to the KeyBinding/Keymap
- // implemenation. I would think that it should be done the other way,
- // fetching the keybindings (from prefix + ".bindings") and transform
- // it to the newer InputMap/ActionMap implementation.
- JTextComponent.KeyBinding[] bindings = null;
- String prefix = getPropertyPrefix();
- InputMapUIResource m = (InputMapUIResource) UIManager.get(prefix + ".focusInputMap");
- if (m != null)
+ String keymapName = getKeymapName();
+ Keymap keymap = JTextComponent.getKeymap(keymapName);
+ if (keymap == null)
{
- KeyStroke[] keys = m.keys();
- int len = keys.length;
- bindings = new JTextComponent.KeyBinding[len];
- for (int i = 0; i < len; i++)
+ Keymap parentMap =
+ JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP);
+ keymap = JTextComponent.addKeymap(keymapName, parentMap);
+ Object val = UIManager.get(getPropertyPrefix() + ".keyBindings");
+ if (val != null && val instanceof JTextComponent.KeyBinding[])
{
- KeyStroke curr = keys[i];
- bindings[i] = new JTextComponent.KeyBinding(curr,
- (String) m.get(curr));
+ JTextComponent.KeyBinding[] bindings =
+ (JTextComponent.KeyBinding[]) val;
+ JTextComponent.loadKeymap(keymap, bindings,
+ getComponent().getActions());
}
}
- if (bindings == null)
- bindings = new JTextComponent.KeyBinding[0];
-
- Keymap km = JTextComponent.addKeymap(getKeymapName(),
- JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP));
- JTextComponent.loadKeymap(km, bindings, textComponent.getActions());
- return km;
+ return keymap;
}
/**
@@ -688,11 +729,8 @@ public abstract class BasicTextUI extends TextUI
*/
protected void installKeyboardActions()
{
- // load key bindings for the older interface
- Keymap km = JTextComponent.getKeymap(getKeymapName());
- if (km == null)
- km = createKeymap();
- textComponent.setKeymap(km);
+ // This is only there for backwards compatibility.
+ textComponent.setKeymap(createKeymap());
// load any bindings for the newer InputMap / ActionMap interface
SwingUtilities.replaceUIInputMap(textComponent, JComponent.WHEN_FOCUSED,
@@ -793,6 +831,7 @@ public abstract class BasicTextUI extends TextUI
* this UI.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: Uninstall keyboard actions here.
}
@@ -985,6 +1024,10 @@ public abstract class BasicTextUI extends TextUI
public void damageRange(JTextComponent t, int p0, int p1,
Position.Bias firstBias, Position.Bias secondBias)
{
+ // Do nothing if the component cannot be properly displayed.
+ if (t.getWidth() == 0 || t.getHeight() == 0)
+ return;
+
try
{
// Limit p0 and p1 to sane values to prevent unfriendly
@@ -999,7 +1042,10 @@ public abstract class BasicTextUI extends TextUI
Rectangle l1 = modelToView(t, p0, firstBias);
Rectangle l2 = modelToView(t, p1, secondBias);
if (l1.y == l2.y)
- t.repaint(l1.union(l2));
+ {
+ SwingUtilities.computeUnion(l2.x, l2.y, l2.width, l2.height, l1);
+ t.repaint(l1);
+ }
else
{
// The two rectangles lie on different lines and we need a
@@ -1107,7 +1153,12 @@ public abstract class BasicTextUI extends TextUI
Position.Bias[] biasRet)
throws BadLocationException
{
- return 0; // TODO: Implement me.
+ // A comment in the spec of NavigationFilter.getNextVisualPositionFrom()
+ // suggests that this method should be implemented by forwarding the call
+ // the root view.
+ return rootView.getNextVisualPositionFrom(pos, b,
+ getVisibleEditorRect(),
+ direction, biasRet);
}
/**
@@ -1163,7 +1214,10 @@ public abstract class BasicTextUI extends TextUI
public Rectangle modelToView(JTextComponent t, int pos, Position.Bias bias)
throws BadLocationException
{
- return rootView.modelToView(pos, getVisibleEditorRect(), bias).getBounds();
+ Rectangle r = getVisibleEditorRect();
+
+ return (r != null) ? rootView.modelToView(pos, r, bias).getBounds()
+ : null;
}
/**
@@ -1240,8 +1294,9 @@ public abstract class BasicTextUI extends TextUI
int width = textComponent.getWidth();
int height = textComponent.getHeight();
+ // Return null if the component has no valid size.
if (width <= 0 || height <= 0)
- return new Rectangle(0, 0, 0, 0);
+ return null;
Insets insets = textComponent.getInsets();
return new Rectangle(insets.left, insets.top,
diff --git a/javax/swing/plaf/basic/BasicToolBarUI.java b/javax/swing/plaf/basic/BasicToolBarUI.java
index 5d718876f..80fec6a77 100644
--- a/javax/swing/plaf/basic/BasicToolBarUI.java
+++ b/javax/swing/plaf/basic/BasicToolBarUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.basic;
+import gnu.classpath.NotImplementedException;
+
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
@@ -604,6 +606,7 @@ public class BasicToolBarUI extends ToolBarUI implements SwingConstants
* by the look and feel.
*/
protected void installKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement.
}
@@ -900,6 +903,7 @@ public class BasicToolBarUI extends ToolBarUI implements SwingConstants
* This method uninstalls keyboard actions installed by the UI.
*/
protected void uninstallKeyboardActions()
+ throws NotImplementedException
{
// FIXME: implement.
}
diff --git a/javax/swing/plaf/basic/BasicTreeUI.java b/javax/swing/plaf/basic/BasicTreeUI.java
index 1c6e6c5e5..a143a962b 100644
--- a/javax/swing/plaf/basic/BasicTreeUI.java
+++ b/javax/swing/plaf/basic/BasicTreeUI.java
@@ -1,5 +1,5 @@
/* BasicTreeUI.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,8 @@
package javax.swing.plaf.basic;
+import gnu.javax.swing.tree.GnuPath;
+
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
@@ -55,6 +57,7 @@ import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
+import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
@@ -76,7 +79,6 @@ import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
-import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.LookAndFeel;
@@ -96,17 +98,17 @@ import javax.swing.plaf.ActionMapUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.InputMapUIResource;
import javax.swing.plaf.TreeUI;
-import javax.swing.text.Caret;
+import javax.swing.plaf.metal.MetalIconFactory;
import javax.swing.tree.AbstractLayoutCache;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.FixedHeightLayoutCache;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
+import javax.swing.tree.VariableHeightLayoutCache;
/**
* A delegate providing the user interface for <code>JTree</code> according to
@@ -117,16 +119,17 @@ import javax.swing.tree.TreeSelectionModel;
* @author Sascha Brawer (brawer@dandelis.ch)
* @author Audrius Meskauskas (audriusa@bioinformatics.org)
*/
-public class BasicTreeUI extends TreeUI
+public class BasicTreeUI
+ extends TreeUI
{
/**
* The tree cell editing may be started by the single mouse click on the
* selected cell. To separate it from the double mouse click, the editing
- * session starts after this time (in ms) after that single click, and only
- * no other clicks were performed during that time.
+ * session starts after this time (in ms) after that single click, and only no
+ * other clicks were performed during that time.
*/
- static int WAIT_TILL_EDITING = 900;
-
+ static int WAIT_TILL_EDITING = 900;
+
/** Collapse Icon for the tree. */
protected transient Icon collapsedIcon;
@@ -251,39 +254,45 @@ public class BasicTreeUI extends TreeUI
int maxHeight = 0;
/** Listeners */
- private PropertyChangeListener propertyChangeListener;
+ PropertyChangeListener propertyChangeListener;
- private FocusListener focusListener;
+ FocusListener focusListener;
- private TreeSelectionListener treeSelectionListener;
+ TreeSelectionListener treeSelectionListener;
- private MouseListener mouseListener;
+ MouseListener mouseListener;
- private KeyListener keyListener;
+ KeyListener keyListener;
- private PropertyChangeListener selectionModelPropertyChangeListener;
+ PropertyChangeListener selectionModelPropertyChangeListener;
- private ComponentListener componentListener;
+ ComponentListener componentListener;
CellEditorListener cellEditorListener;
- private TreeExpansionListener treeExpansionListener;
+ TreeExpansionListener treeExpansionListener;
+
+ TreeModelListener treeModelListener;
- private TreeModelListener treeModelListener;
-
/**
* This timer fires the editing action after about 1200 ms if not reset during
- * that time. It handles the editing start with the single mouse click
- * (and not the double mouse click) on the selected tree node.
+ * that time. It handles the editing start with the single mouse click (and
+ * not the double mouse click) on the selected tree node.
*/
Timer startEditTimer;
/**
+ * The zero size icon, used for expand controls, if they are not visible.
+ */
+ static Icon nullIcon;
+
+ /**
* The special value of the mouse event is sent indicating that this is not
* just the mouse click, but the mouse click on the selected node. Sending
* such event forces to start the cell editing session.
*/
- static final MouseEvent EDIT = new MouseEvent(new Label(), 7,7,7,7,7,7, false);
+ static final MouseEvent EDIT = new MouseEvent(new Label(), 7, 7, 7, 7, 7, 7,
+ false);
/**
* Creates a new BasicTreeUI object.
@@ -306,22 +315,21 @@ public class BasicTreeUI extends TreeUI
treeExpansionListener = createTreeExpansionListener();
treeModelListener = createTreeModelListener();
- editingRow = -1;
- lastSelectedRow = -1;
+ editingRow = - 1;
+ lastSelectedRow = - 1;
}
/**
* Returns an instance of the UI delegate for the specified component.
*
- * @param c
- * the <code>JComponent</code> for which we need a UI delegate for.
+ * @param c the <code>JComponent</code> for which we need a UI delegate for.
* @return the <code>ComponentUI</code> for c.
*/
public static ComponentUI createUI(JComponent c)
{
return new BasicTreeUI();
}
-
+
/**
* Returns the Hash color.
*
@@ -335,8 +343,7 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the Hash color.
*
- * @param color
- * the <code>Color</code> to set the Hash to.
+ * @param color the <code>Color</code> to set the Hash to.
*/
protected void setHashColor(Color color)
{
@@ -347,8 +354,7 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the left child's indent value.
*
- * @param newAmount
- * is the new indent value for the left child.
+ * @param newAmount is the new indent value for the left child.
*/
public void setLeftChildIndent(int newAmount)
{
@@ -368,8 +374,7 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the right child's indent value.
*
- * @param newAmount
- * is the new indent value for the right child.
+ * @param newAmount is the new indent value for the right child.
*/
public void setRightChildIndent(int newAmount)
{
@@ -389,8 +394,7 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the expanded icon.
*
- * @param newG
- * is the new expanded icon.
+ * @param newG is the new expanded icon.
*/
public void setExpandedIcon(Icon newG)
{
@@ -410,8 +414,7 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the collapsed icon.
*
- * @param newG
- * is the new collapsed icon.
+ * @param newG is the new collapsed icon.
*/
public void setCollapsedIcon(Icon newG)
{
@@ -431,8 +434,7 @@ public class BasicTreeUI extends TreeUI
/**
* Updates the componentListener, if necessary.
*
- * @param largeModel
- * sets this.largeModel to it.
+ * @param largeModel sets this.largeModel to it.
*/
protected void setLargeModel(boolean largeModel)
{
@@ -457,13 +459,12 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the row height.
*
- * @param rowHeight
- * is the height to set this.rowHeight to.
+ * @param rowHeight is the height to set this.rowHeight to.
*/
protected void setRowHeight(int rowHeight)
{
if (rowHeight == 0)
- rowHeight = Math.max(getMaxHeight(tree), 20);
+ rowHeight = getMaxHeight(tree);
treeState.setRowHeight(rowHeight);
}
@@ -474,15 +475,14 @@ public class BasicTreeUI extends TreeUI
*/
protected int getRowHeight()
{
- return treeState.getRowHeight();
+ return tree.getRowHeight();
}
/**
* Sets the TreeCellRenderer to <code>tcr</code>. This invokes
* <code>updateRenderer</code>.
*
- * @param tcr
- * is the new TreeCellRenderer.
+ * @param tcr is the new TreeCellRenderer.
*/
protected void setCellRenderer(TreeCellRenderer tcr)
{
@@ -507,13 +507,13 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the tree's model.
*
- * @param model
- * to set the treeModel to.
+ * @param model to set the treeModel to.
*/
protected void setModel(TreeModel model)
{
tree.setModel(model);
treeModel = tree.getModel();
+ treeState.setModel(treeModel);
}
/**
@@ -529,8 +529,7 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the root to being visible.
*
- * @param newValue
- * sets the visibility of the root
+ * @param newValue sets the visibility of the root
*/
protected void setRootVisible(boolean newValue)
{
@@ -550,8 +549,7 @@ public class BasicTreeUI extends TreeUI
/**
* Determines whether the node handles are to be displayed.
*
- * @param newValue
- * sets whether or not node handles should be displayed.
+ * @param newValue sets whether or not node handles should be displayed.
*/
protected void setShowsRootHandles(boolean newValue)
{
@@ -571,8 +569,7 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the cell editor.
*
- * @param editor
- * to set the cellEditor to.
+ * @param editor to set the cellEditor to.
*/
protected void setCellEditor(TreeCellEditor editor)
{
@@ -593,8 +590,7 @@ public class BasicTreeUI extends TreeUI
/**
* Configures the receiver to allow, or not allow, editing.
*
- * @param newValue
- * sets the receiver to allow editing if true.
+ * @param newValue sets the receiver to allow editing if true.
*/
protected void setEditable(boolean newValue)
{
@@ -615,8 +611,7 @@ public class BasicTreeUI extends TreeUI
* Resets the selection model. The appropriate listeners are installed on the
* model.
*
- * @param newLSM
- * resets the selection model.
+ * @param newLSM resets the selection model.
*/
protected void setSelectionModel(TreeSelectionModel newLSM)
{
@@ -642,35 +637,23 @@ public class BasicTreeUI extends TreeUI
* path will be drawn to. Will return null if any component in path is
* currently valid.
*
- * @param tree
- * is the current tree the path will be drawn to.
- * @param path
- * is the current path the tree to draw to.
+ * @param tree is the current tree the path will be drawn to.
+ * @param path is the current path the tree to draw to.
* @return the Rectangle enclosing the label portion that the last item in the
* path will be drawn to.
*/
public Rectangle getPathBounds(JTree tree, TreePath path)
{
- int row = -1;
- Object cell = null;
- if (path != null)
- {
- row = getRowForPath(tree, path);
- cell = path.getLastPathComponent();
- }
- return nodeDimensions.getNodeDimensions(cell, row, getLevel(cell),
- tree.isExpanded(path),
- new Rectangle());
+ return treeState.getBounds(path, new Rectangle());
}
/**
* Returns the max height of all the nodes in the tree.
*
- * @param tree -
- * the current tree
+ * @param tree - the current tree
* @return the max height.
*/
- private int getMaxHeight(JTree tree)
+ int getMaxHeight(JTree tree)
{
if (maxHeight != 0)
return maxHeight;
@@ -692,72 +675,61 @@ public class BasicTreeUI extends TreeUI
maxHeight = Math.max(maxHeight, iconHeight + gap);
}
-
+
+ treeState.setRowHeight(maxHeight);
return maxHeight;
}
+
+ /**
+ * Get the tree node icon.
+ */
+ Icon getNodeIcon(TreePath path)
+ {
+ Object node = path.getLastPathComponent();
+ if (treeModel.isLeaf(node))
+ return UIManager.getIcon("Tree.leafIcon");
+ else if (treeState.getExpandedState(path))
+ return UIManager.getIcon("Tree.openIcon");
+ else
+ return UIManager.getIcon("Tree.closedIcon");
+ }
/**
* Returns the path for passed in row. If row is not visible null is returned.
*
- * @param tree
- * is the current tree to return path for.
- * @param row
- * is the row number of the row to return.
+ * @param tree is the current tree to return path for.
+ * @param row is the row number of the row to return.
* @return the path for passed in row. If row is not visible null is returned.
*/
public TreePath getPathForRow(JTree tree, int row)
{
- if (treeModel != null && currentVisiblePath != null)
- {
- Object[] nodes = currentVisiblePath.getPath();
- if (row < nodes.length)
- return new TreePath(getPathToRoot(nodes[row], 0));
- }
- return null;
+ return treeState.getPathForRow(row);
}
/**
* Returns the row that the last item identified in path is visible at. Will
* return -1 if any of the elments in the path are not currently visible.
*
- * @param tree
- * is the current tree to return the row for.
- * @param path
- * is the path used to find the row.
+ * @param tree is the current tree to return the row for.
+ * @param path is the path used to find the row.
* @return the row that the last item identified in path is visible at. Will
* return -1 if any of the elments in the path are not currently
* visible.
*/
public int getRowForPath(JTree tree, TreePath path)
{
- int row = 0;
- Object dest = path.getLastPathComponent();
- int rowCount = getRowCount(tree);
- if (currentVisiblePath != null)
- {
- Object[] nodes = currentVisiblePath.getPath();
- while (row < rowCount)
- {
- if (dest.equals(nodes[row]))
- return row;
- row++;
- }
- }
- return -1;
+ return treeState.getRowForPath(path);
}
/**
* Returns the number of rows that are being displayed.
*
- * @param tree
- * is the current tree to return the number of rows for.
+ * @param tree is the current tree to return the number of rows for.
* @return the number of rows being displayed.
*/
public int getRowCount(JTree tree)
{
- if (currentVisiblePath != null)
- return currentVisiblePath.getPathCount();
- return 0;
+ return treeState.getRowCount();
}
/**
@@ -766,35 +738,21 @@ public class BasicTreeUI extends TreeUI
* valid path. If you need to test if the returned object is exactly at x,y
* you should get the bounds for the returned path and test x,y against that.
*
- * @param tree
- * the tree to search for the closest path
- * @param x
- * is the x coordinate of the location to search
- * @param y
- * is the y coordinate of the location to search
+ * @param tree the tree to search for the closest path
+ * @param x is the x coordinate of the location to search
+ * @param y is the y coordinate of the location to search
* @return the tree path closes to x,y.
*/
public TreePath getClosestPathForLocation(JTree tree, int x, int y)
{
- int row = Math.round(y / getMaxHeight(tree));
- TreePath path = getPathForRow(tree, row);
-
- // no row is visible at this node
- while (row > 0 && path == null)
- {
- --row;
- path = getPathForRow(tree, row);
- }
-
- return path;
+ return treeState.getPathClosestTo(x, y);
}
/**
* Returns true if the tree is being edited. The item that is being edited can
* be returned by getEditingPath().
*
- * @param tree
- * is the tree to check for editing.
+ * @param tree is the tree to check for editing.
* @return true if the tree is being edited.
*/
public boolean isEditing(JTree tree)
@@ -807,8 +765,7 @@ public class BasicTreeUI extends TreeUI
* being edited. Returns true if the editor allows the editing session to
* stop.
*
- * @param tree
- * is the tree to stop the editing on
+ * @param tree is the tree to stop the editing on
* @return true if the editor allows the editing session to stop.
*/
public boolean stopEditing(JTree tree)
@@ -818,32 +775,29 @@ public class BasicTreeUI extends TreeUI
completeEditing(false, false, true);
finish();
}
- return !isEditing(tree);
+ return ! isEditing(tree);
}
/**
* Cancels the current editing session.
*
- * @param tree
- * is the tree to cancel the editing session on.
+ * @param tree is the tree to cancel the editing session on.
*/
public void cancelEditing(JTree tree)
- {
- // There is no need to send the cancel message to the editor,
- // as the cancellation event itself arrives from it. This would
- // only be necessary when cancelling the editing programatically.
- completeEditing(false, false, false);
- finish();
+ {
+ // There is no need to send the cancel message to the editor,
+ // as the cancellation event itself arrives from it. This would
+ // only be necessary when cancelling the editing programatically.
+ completeEditing(false, false, false);
+ finish();
}
/**
* Selects the last item in path and tries to edit it. Editing will fail if
* the CellEditor won't allow it for the selected item.
*
- * @param tree
- * is the tree to edit on.
- * @param path
- * is the path in tree to edit on.
+ * @param tree is the tree to edit on.
+ * @param path is the path in tree to edit on.
*/
public void startEditingAtPath(JTree tree, TreePath path)
{
@@ -853,8 +807,7 @@ public class BasicTreeUI extends TreeUI
/**
* Returns the path to the element that is being editted.
*
- * @param tree
- * is the tree to get the editing path from.
+ * @param tree is the tree to get the editing path from.
* @return the path that is being edited.
*/
public TreePath getEditingPath(JTree tree)
@@ -902,7 +855,8 @@ public class BasicTreeUI extends TreeUI
/**
* Creates an instance of NodeDimensions that is able to determine the size of
- * a given node in the tree.
+ * a given node in the tree. The node dimensions must be created before
+ * configuring the layout cache.
*
* @return the NodeDimensions of a given node in the tree
*/
@@ -1018,7 +972,7 @@ public class BasicTreeUI extends TreeUI
*/
protected AbstractLayoutCache createLayoutCache()
{
- return new FixedHeightLayoutCache();
+ return new VariableHeightLayoutCache();
}
/**
@@ -1152,8 +1106,7 @@ public class BasicTreeUI extends TreeUI
* by getting the expanded descendants from the tree and forwarding to the
* tree state.
*
- * @param path
- * the path used to update the expanded states
+ * @param path the path used to update the expanded states
*/
protected void updateExpandedDescendants(TreePath path)
{
@@ -1165,8 +1118,7 @@ public class BasicTreeUI extends TreeUI
/**
* Returns a path to the last child of <code>parent</code>
*
- * @param parent
- * is the topmost path to specified
+ * @param parent is the topmost path to specified
* @return a path to the last child of parent
*/
protected TreePath getLastChildPath(TreePath parent)
@@ -1200,23 +1152,21 @@ public class BasicTreeUI extends TreeUI
protected void updateRenderer()
{
if (tree != null)
- {
- if (tree.getCellRenderer() == null)
- {
- if (currentCellRenderer == null)
- currentCellRenderer = createDefaultCellRenderer();
- tree.setCellRenderer(currentCellRenderer);
- }
- }
+ currentCellRenderer = tree.getCellRenderer();
+
+ if (currentCellRenderer == null)
+ currentCellRenderer = createDefaultCellRenderer();
}
/**
* Resets the treeState instance based on the tree we're providing the look
- * and feel for.
+ * and feel for. The node dimensions handler is required and must be created
+ * in advance.
*/
protected void configureLayoutCache()
{
treeState = createLayoutCache();
+ treeState.setNodeDimensions(nodeDimensions);
}
/**
@@ -1236,42 +1186,19 @@ public class BasicTreeUI extends TreeUI
*/
protected void updateCachedPreferredSize()
{
- int maxWidth = 0;
- updateCurrentVisiblePath();
- boolean isLeaf = false;
- if (currentVisiblePath != null)
- {
- Object[] path = currentVisiblePath.getPath();
- for (int i = 0; i < path.length; i++)
- {
- TreePath curr = new TreePath(getPathToRoot(path[i], 0));
- Rectangle bounds = getPathBounds(tree, curr);
- if (treeModel != null)
- isLeaf = treeModel.isLeaf(path[i]);
- if (!isLeaf && hasControlIcons())
- bounds.width += getCurrentControlIcon(curr).getIconWidth();
- maxWidth = Math.max(maxWidth, bounds.x + bounds.width);
- }
-
- maxHeight = 0;
- maxHeight = getMaxHeight(tree);
- preferredSize = new Dimension(maxWidth, (maxHeight * path.length));
- }
- else
- preferredSize = new Dimension(0, 0);
- validCachedPreferredSize = true;
+ validCachedPreferredSize = false;
}
/**
* Messaged from the VisibleTreeNode after it has been expanded.
*
- * @param path
- * is the path that has been expanded.
+ * @param path is the path that has been expanded.
*/
protected void pathWasExpanded(TreePath path)
{
validCachedPreferredSize = false;
- tree.repaint();
+ treeState.setExpandedState(path, true);
+ tree.repaint();
}
/**
@@ -1280,6 +1207,7 @@ public class BasicTreeUI extends TreeUI
protected void pathWasCollapsed(TreePath path)
{
validCachedPreferredSize = false;
+ treeState.setExpandedState(path, false);
tree.repaint();
}
@@ -1294,6 +1222,7 @@ public class BasicTreeUI extends TreeUI
rightChildIndent = UIManager.getInt("Tree.rightChildIndent");
leftChildIndent = UIManager.getInt("Tree.leftChildIndent");
+ totalChildIndent = rightChildIndent + leftChildIndent;
setRowHeight(UIManager.getInt("Tree.rowHeight"));
tree.setRowHeight(getRowHeight());
tree.setScrollsOnExpand(UIManager.getBoolean("Tree.scrollsOnExpand"));
@@ -1345,8 +1274,7 @@ public class BasicTreeUI extends TreeUI
/**
* Converts the modifiers.
*
- * @param mod -
- * modifier to convert
+ * @param mod - modifier to convert
* @returns the new modifier
*/
private int convertModifiers(int mod)
@@ -1354,27 +1282,27 @@ public class BasicTreeUI extends TreeUI
if ((mod & KeyEvent.SHIFT_DOWN_MASK) != 0)
{
mod |= KeyEvent.SHIFT_MASK;
- mod &= ~KeyEvent.SHIFT_DOWN_MASK;
+ mod &= ~ KeyEvent.SHIFT_DOWN_MASK;
}
if ((mod & KeyEvent.CTRL_DOWN_MASK) != 0)
{
mod |= KeyEvent.CTRL_MASK;
- mod &= ~KeyEvent.CTRL_DOWN_MASK;
+ mod &= ~ KeyEvent.CTRL_DOWN_MASK;
}
if ((mod & KeyEvent.META_DOWN_MASK) != 0)
{
mod |= KeyEvent.META_MASK;
- mod &= ~KeyEvent.META_DOWN_MASK;
+ mod &= ~ KeyEvent.META_DOWN_MASK;
}
if ((mod & KeyEvent.ALT_DOWN_MASK) != 0)
{
mod |= KeyEvent.ALT_MASK;
- mod &= ~KeyEvent.ALT_DOWN_MASK;
+ mod &= ~ KeyEvent.ALT_DOWN_MASK;
}
if ((mod & KeyEvent.ALT_GRAPH_DOWN_MASK) != 0)
{
mod |= KeyEvent.ALT_GRAPH_MASK;
- mod &= ~KeyEvent.ALT_GRAPH_DOWN_MASK;
+ mod &= ~ KeyEvent.ALT_GRAPH_DOWN_MASK;
}
return mod;
}
@@ -1399,16 +1327,16 @@ public class BasicTreeUI extends TreeUI
/**
* Install the UI for the component
*
- * @param c
- * the component to install UI for
+ * @param c the component to install UI for
*/
public void installUI(JComponent c)
{
tree = (JTree) c;
+ treeModel = tree.getModel();
+
prepareForUIInstall();
super.installUI(c);
installDefaults();
-
installComponents();
installKeyboardActions();
installListeners();
@@ -1419,10 +1347,13 @@ public class BasicTreeUI extends TreeUI
setModel(tree.getModel());
treeSelectionModel = tree.getSelectionModel();
+ setRootVisible(tree.isRootVisible());
+ treeState.setRootVisible(tree.isRootVisible());
+ updateExpandedDescendants(new TreePath(new Object[] { treeModel.getRoot() }));
completeUIInstall();
}
-
+
/**
* Uninstall the defaults for the tree
*/
@@ -1436,8 +1367,7 @@ public class BasicTreeUI extends TreeUI
/**
* Uninstall the UI for the component
*
- * @param c
- * the component to uninstall UI for
+ * @param c the component to uninstall UI for
*/
public void uninstallUI(JComponent c)
{
@@ -1456,51 +1386,103 @@ public class BasicTreeUI extends TreeUI
* component is being painted. Subclasses should override this method and use
* the specified Graphics object to render the content of the component.
*
- * @param g
- * the Graphics context in which to paint
- * @param c
- * the component being painted; this argument is often ignored, but
+ * @param g the Graphics context in which to paint
+ * @param c the component being painted; this argument is often ignored, but
* might be used if the UI object is stateless and shared by multiple
* components
*/
public void paint(Graphics g, JComponent c)
{
JTree tree = (JTree) c;
- updateCurrentVisiblePath();
+
+ int rows = treeState.getRowCount();
+
+ if (rows == 0)
+ // There is nothing to do if the tree is empty.
+ return;
Rectangle clip = g.getClipBounds();
+
Insets insets = tree.getInsets();
- if (clip != null && treeModel != null && currentVisiblePath != null)
+ if (clip != null && treeModel != null)
{
int startIndex = tree.getClosestRowForLocation(clip.x, clip.y);
int endIndex = tree.getClosestRowForLocation(clip.x + clip.width,
clip.y + clip.height);
- paintVerticalPartOfLeg(g, clip, insets, currentVisiblePath);
- for (int i = startIndex; i <= endIndex; i++)
+ // Also paint dashes to the invisible nodes below.
+ // These should be painted first, otherwise they may cover
+ // the control icons.
+ if (endIndex < rows)
+ for (int i = endIndex + 1; i < rows; i++)
+ {
+ TreePath path = treeState.getPathForRow(i);
+ if (isLastChild(path))
+ paintVerticalPartOfLeg(g, clip, insets, path);
+ }
+
+ // The two loops are required to ensure that the lines are not
+ // painted over the other tree components.
+
+ int n = endIndex - startIndex + 1;
+ Rectangle[] bounds = new Rectangle[n];
+ boolean[] isLeaf = new boolean[n];
+ boolean[] isExpanded = new boolean[n];
+ TreePath[] path = new TreePath[n];
+ int k;
+
+ k = 0;
+ for (int i = startIndex; i <= endIndex; i++, k++)
{
- Object curr = currentVisiblePath.getPathComponent(i);
- boolean isLeaf = treeModel.isLeaf(curr);
- TreePath path = new TreePath(getPathToRoot(curr, 0));
-
- boolean isExpanded = tree.isExpanded(path);
- Rectangle bounds = getPathBounds(tree, path);
- paintHorizontalPartOfLeg(g, clip, insets, bounds, path, i,
- isExpanded, false, isLeaf);
- paintRow(g, clip, insets, bounds, path, i, isExpanded, false,
- isLeaf);
+ path[k] = treeState.getPathForRow(i);
+ isLeaf[k] = treeModel.isLeaf(path[k].getLastPathComponent());
+ isExpanded[k] = tree.isExpanded(path[k]);
+ bounds[k] = getPathBounds(tree, path[k]);
+
+ paintHorizontalPartOfLeg(g, clip, insets, bounds[k], path[k], i,
+ isExpanded[k], false, isLeaf[k]);
+ if (isLastChild(path[k]))
+ paintVerticalPartOfLeg(g, clip, insets, path[k]);
+ }
+
+ k = 0;
+ for (int i = startIndex; i <= endIndex; i++, k++)
+ {
+ paintRow(g, clip, insets, bounds[k], path[k], i, isExpanded[k],
+ false, isLeaf[k]);
}
}
}
/**
+ * Check if the path is referring to the last child of some parent.
+ */
+ private boolean isLastChild(TreePath path)
+ {
+ if (path instanceof GnuPath)
+ {
+ // Except the seldom case when the layout cache is changed, this
+ // optimized code will be executed.
+ return ((GnuPath) path).isLastChild;
+ }
+ else
+ {
+ // Non optimized general case.
+ TreePath parent = path.getParentPath();
+ if (parent == null)
+ return false;
+ int childCount = treeState.getVisibleChildCount(parent);
+ int p = treeModel.getIndexOfChild(parent, path.getLastPathComponent());
+ return p == childCount - 1;
+ }
+ }
+
+ /**
* Ensures that the rows identified by beginRow through endRow are visible.
*
- * @param beginRow
- * is the first row
- * @param endRow
- * is the last row
+ * @param beginRow is the first row
+ * @param endRow is the last row
*/
protected void ensureRowsAreVisible(int beginRow, int endRow)
{
@@ -1514,7 +1496,7 @@ public class BasicTreeUI extends TreeUI
for (int i = beginRow; i < endRow; i++)
{
TreePath path = getPathForRow(tree, i);
- if (!tree.isVisible(path))
+ if (! tree.isVisible(path))
tree.makeVisible(path);
}
}
@@ -1522,8 +1504,7 @@ public class BasicTreeUI extends TreeUI
/**
* Sets the preferred minimum size.
*
- * @param newSize
- * is the new preferred minimum size.
+ * @param newSize is the new preferred minimum size.
*/
public void setPreferredMinSize(Dimension newSize)
{
@@ -1537,15 +1518,17 @@ public class BasicTreeUI extends TreeUI
*/
public Dimension getPreferredMinSize()
{
- return preferredMinSize;
+ if (preferredMinSize == null)
+ return getPreferredSize(tree);
+ else
+ return preferredMinSize;
}
/**
* Returns the preferred size to properly display the tree, this is a cover
* method for getPreferredSize(c, false).
*
- * @param c
- * the component whose preferred size is being queried; this argument
+ * @param c the component whose preferred size is being queried; this argument
* is often ignored but might be used if the UI object is stateless
* and shared by multiple components
* @return the preferred size
@@ -1559,17 +1542,20 @@ public class BasicTreeUI extends TreeUI
* Returns the preferred size to represent the tree in c. If checkConsistancy
* is true, checkConsistancy is messaged first.
*
- * @param c
- * the component whose preferred size is being queried.
- * @param checkConsistancy
- * if true must check consistancy
+ * @param c the component whose preferred size is being queried.
+ * @param checkConsistancy if true must check consistancy
* @return the preferred size
*/
public Dimension getPreferredSize(JComponent c, boolean checkConsistancy)
{
- // FIXME: checkConsistancy not implemented, c not used
- if (!validCachedPreferredSize)
- updateCachedPreferredSize();
+ if (! validCachedPreferredSize)
+ {
+ Rectangle size = tree.getBounds();
+ // Add the scrollbar dimensions to the preferred size.
+ preferredSize = new Dimension(treeState.getPreferredWidth(size),
+ treeState.getPreferredHeight());
+ validCachedPreferredSize = true;
+ }
return preferredSize;
}
@@ -1577,31 +1563,24 @@ public class BasicTreeUI extends TreeUI
* Returns the minimum size for this component. Which will be the min
* preferred size or (0,0).
*
- * @param c
- * the component whose min size is being queried.
+ * @param c the component whose min size is being queried.
* @returns the preferred size or null
*/
public Dimension getMinimumSize(JComponent c)
{
- Dimension min = getPreferredMinSize();
- if (min == null)
- return new Dimension();
- return min;
+ return preferredMinSize = getPreferredSize(c);
}
/**
* Returns the maximum size for the component, which will be the preferred
* size if the instance is currently in JTree or (0,0).
*
- * @param c
- * the component whose preferred size is being queried
+ * @param c the component whose preferred size is being queried
* @return the max size or null
*/
public Dimension getMaximumSize(JComponent c)
{
- if (c instanceof JTree)
- return ((JTree) c).getPreferredSize();
- return new Dimension();
+ return getPreferredSize(c);
}
/**
@@ -1622,12 +1601,9 @@ public class BasicTreeUI extends TreeUI
* cancelEditing. If messageTree is true, the treeModel is messaged with
* valueForPathChanged.
*
- * @param messageStop
- * message to stop editing
- * @param messageCancel
- * message to cancel editing
- * @param messageTree
- * message to treeModel
+ * @param messageStop message to stop editing
+ * @param messageCancel message to cancel editing
+ * @param messageTree message to treeModel
*/
protected void completeEditing(boolean messageStop, boolean messageCancel,
boolean messageTree)
@@ -1659,25 +1635,16 @@ public class BasicTreeUI extends TreeUI
* Will start editing for node if there is a cellEditor and shouldSelectCall
* returns true. This assumes that path is valid and visible.
*
- * @param path
- * is the path to start editing
- * @param event
- * is the MouseEvent performed on the path
+ * @param path is the path to start editing
+ * @param event is the MouseEvent performed on the path
* @return true if successful
*/
protected boolean startEditing(TreePath path, MouseEvent event)
{
- // Force to recalculate the maximal row height.
- maxHeight = 0;
-
- // Force to recalculate the cached preferred size.
- validCachedPreferredSize = false;
-
updateCellEditor();
TreeCellEditor ed = getCellEditor();
- if (ed != null
- && (event == EDIT || ed.shouldSelectCell(event))
+ if (ed != null && (event == EDIT || ed.shouldSelectCell(event))
&& ed.isCellEditable(event))
{
Rectangle bounds = getPathBounds(tree, path);
@@ -1718,12 +1685,9 @@ public class BasicTreeUI extends TreeUI
* If the <code>mouseX</code> and <code>mouseY</code> are in the expand or
* collapse region of the row, this will toggle the row.
*
- * @param path
- * the path we are concerned with
- * @param mouseX
- * is the cursor's x position
- * @param mouseY
- * is the cursor's y position
+ * @param path the path we are concerned with
+ * @param mouseX is the cursor's x position
+ * @param mouseY is the cursor's y position
*/
protected void checkForClickInExpandControl(TreePath path, int mouseX,
int mouseY)
@@ -1737,12 +1701,9 @@ public class BasicTreeUI extends TreeUI
* the area of row that is used to expand/collpse the node and the node at row
* does not represent a leaf.
*
- * @param path
- * the path we are concerned with
- * @param mouseX
- * is the cursor's x position
- * @param mouseY
- * is the cursor's y position
+ * @param path the path we are concerned with
+ * @param mouseX is the cursor's x position
+ * @param mouseY is the cursor's y position
* @return true if the <code>mouseX</code> and <code>mouseY</code> fall in
* the area of row that is used to expand/collpse the node and the
* node at row does not represent a leaf.
@@ -1753,7 +1714,7 @@ public class BasicTreeUI extends TreeUI
boolean cntlClick = false;
int row = getRowForPath(tree, path);
- if (!isLeaf(row))
+ if (! isLeaf(row))
{
Rectangle bounds = getPathBounds(tree, path);
@@ -1769,12 +1730,9 @@ public class BasicTreeUI extends TreeUI
* Messaged when the user clicks the particular row, this invokes
* toggleExpandState.
*
- * @param path
- * the path we are concerned with
- * @param mouseX
- * is the cursor's x position
- * @param mouseY
- * is the cursor's y position
+ * @param path the path we are concerned with
+ * @param mouseX is the cursor's x position
+ * @param mouseY is the cursor's y position
*/
protected void handleExpandControlClick(TreePath path, int mouseX, int mouseY)
{
@@ -1787,8 +1745,7 @@ public class BasicTreeUI extends TreeUI
* invoked to scroll as many of the children to visible as possible (tries to
* scroll to last visible descendant of path).
*
- * @param path
- * the path we are concerned with
+ * @param path the path we are concerned with
*/
protected void toggleExpandState(TreePath path)
{
@@ -1800,30 +1757,40 @@ public class BasicTreeUI extends TreeUI
/**
* Returning true signifies a mouse event on the node should toggle the
- * selection of only the row under the mouse.
+ * selection of only the row under the mouse. The BasisTreeUI treats the
+ * event as "toggle selection event" if the CTRL button was pressed while
+ * clicking. The event is not counted as toggle event if the associated
+ * tree does not support the multiple selection.
*
- * @param event
- * is the MouseEvent performed on the row.
+ * @param event is the MouseEvent performed on the row.
* @return true signifies a mouse event on the node should toggle the
* selection of only the row under the mouse.
*/
protected boolean isToggleSelectionEvent(MouseEvent event)
{
- return (tree.getSelectionModel().getSelectionMode() == TreeSelectionModel.SINGLE_TREE_SELECTION);
+ return
+ (tree.getSelectionModel().getSelectionMode() !=
+ TreeSelectionModel.SINGLE_TREE_SELECTION) &&
+ ((event.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0);
}
/**
* Returning true signifies a mouse event on the node should select from the
- * anchor point.
+ * anchor point. The BasisTreeUI treats the event as "multiple selection
+ * event" if the SHIFT button was pressed while clicking. The event is not
+ * counted as multiple selection event if the associated tree does not support
+ * the multiple selection.
*
- * @param event
- * is the MouseEvent performed on the node.
+ * @param event is the MouseEvent performed on the node.
* @return true signifies a mouse event on the node should select from the
* anchor point.
*/
protected boolean isMultiSelectEvent(MouseEvent event)
{
- return (tree.getSelectionModel().getSelectionMode() == TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
+ return
+ (tree.getSelectionModel().getSelectionMode() !=
+ TreeSelectionModel.SINGLE_TREE_SELECTION) &&
+ ((event.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) != 0);
}
/**
@@ -1831,8 +1798,7 @@ public class BasicTreeUI extends TreeUI
* the event. This is invoked after checkForClickInExpandControl, implying the
* location is not in the expand (toggle) control.
*
- * @param event
- * is the MouseEvent performed on the row.
+ * @param event is the MouseEvent performed on the row.
* @return true indicates the row under the mouse should be toggled based on
* the event.
*/
@@ -1846,17 +1812,19 @@ public class BasicTreeUI extends TreeUI
* row. If the even is a toggle selection event, the row is either selected,
* or deselected. If the event identifies a multi selection event, the
* selection is updated from the anchor point. Otherwise, the row is selected,
- * and if the even specified a toggle event the row is expanded/collapsed.
+ * and the previous selection is cleared.</p>
*
- * @param path
- * is the path selected for an event
- * @param event
- * is the MouseEvent performed on the path.
+ * @param path is the path selected for an event
+ * @param event is the MouseEvent performed on the path.
+ *
+ * @see #isToggleSelectionEvent(MouseEvent)
+ * @see #isMultiSelectEvent(MouseEvent)
*/
protected void selectPathForEvent(TreePath path, MouseEvent event)
{
if (isToggleSelectionEvent(event))
{
+ // The event selects or unselects the clicked row.
if (tree.isPathSelected(path))
tree.removeSelectionPath(path);
else
@@ -1867,6 +1835,7 @@ public class BasicTreeUI extends TreeUI
}
else if (isMultiSelectEvent(event))
{
+ // The event extends selection form anchor till the clicked row.
TreePath anchor = tree.getAnchorSelectionPath();
if (anchor != null)
{
@@ -1877,14 +1846,17 @@ public class BasicTreeUI extends TreeUI
tree.addSelectionPath(path);
}
else
- tree.addSelectionPath(path);
+ {
+ // This is an ordinary event that just selects the clicked row.
+ tree.setSelectionPath(path);
+ tree.setAnchorSelectionPath(path);
+ }
}
/**
* Returns true if the node at <code>row</code> is a leaf.
*
- * @param row
- * is the row we are concerned with.
+ * @param row is the row we are concerned with.
* @return true if the node at <code>row</code> is a leaf.
*/
protected boolean isLeaf(int row)
@@ -1902,46 +1874,38 @@ public class BasicTreeUI extends TreeUI
* are pressed for the JTree. The actionPerformed method is called when a key
* that has been registered for the JTree is received.
*/
- class TreeAction extends AbstractAction
+ class TreeAction
+ extends AbstractAction
{
/**
* What to do when this action is called.
*
- * @param e
- * the ActionEvent that caused this action.
+ * @param e the ActionEvent that caused this action.
*/
public void actionPerformed(ActionEvent e)
{
+ String command = e.getActionCommand();
TreePath lead = tree.getLeadSelectionPath();
- if (e.getActionCommand().equals("selectPreviousChangeLead")
- || e.getActionCommand().equals("selectPreviousExtendSelection")
- || e.getActionCommand().equals("selectPrevious")
- || e.getActionCommand().equals("selectNext")
- || e.getActionCommand().equals("selectNextExtendSelection")
- || e.getActionCommand().equals("selectNextChangeLead"))
+ if (command.equals("selectPreviousChangeLead")
+ || command.equals("selectPreviousExtendSelection")
+ || command.equals("selectPrevious") || command.equals("selectNext")
+ || command.equals("selectNextExtendSelection")
+ || command.equals("selectNextChangeLead"))
(new TreeIncrementAction(0, "")).actionPerformed(e);
- else if (e.getActionCommand().equals("selectParent")
- || e.getActionCommand().equals("selectChild"))
+ else if (command.equals("selectParent") || command.equals("selectChild"))
(new TreeTraverseAction(0, "")).actionPerformed(e);
- else if (e.getActionCommand().equals("selectAll"))
+ else if (command.equals("selectAll"))
{
- TreePath[] paths = new TreePath[tree.getVisibleRowCount()];
-
- Object curr = getNextVisibleNode(treeModel.getRoot());
- int i = 0;
- while (curr != null && i < paths.length)
- {
- paths[i] = new TreePath(getPathToRoot(curr, 0));
- i++;
- }
-
+ TreePath[] paths = new TreePath[treeState.getRowCount()];
+ for (int i = 0; i < paths.length; i++)
+ paths[i] = treeState.getPathForRow(i);
tree.addSelectionPaths(paths);
}
- else if (e.getActionCommand().equals("startEditing"))
+ else if (command.equals("startEditing"))
tree.startEditingAtPath(lead);
- else if (e.getActionCommand().equals("toggle"))
+ else if (command.equals("toggle"))
{
if (tree.isEditing())
tree.stopEditing();
@@ -1949,17 +1913,17 @@ public class BasicTreeUI extends TreeUI
{
Object last = lead.getLastPathComponent();
TreePath path = new TreePath(getPathToRoot(last, 0));
- if (!treeModel.isLeaf(last))
+ if (! treeModel.isLeaf(last))
toggleExpandState(path);
}
}
- else if (e.getActionCommand().equals("clearSelection"))
+ else if (command.equals("clearSelection"))
tree.clearSelection();
- if (tree.isEditing() && !e.getActionCommand().equals("startEditing"))
+ if (tree.isEditing() && ! command.equals("startEditing"))
tree.stopEditing();
- tree.scrollPathToVisible(lead);
+ tree.scrollPathToVisible(tree.getLeadSelectionPath());
}
}
@@ -1970,7 +1934,8 @@ public class BasicTreeUI extends TreeUI
* to the true receiver after altering the actionCommand property of the
* event.
*/
- private static class ActionListenerProxy extends AbstractAction
+ private static class ActionListenerProxy
+ extends AbstractAction
{
ActionListener target;
@@ -1992,11 +1957,12 @@ public class BasicTreeUI extends TreeUI
}
}
- /**
+ /**
* Updates the preferred size when scrolling, if necessary.
*/
- public class ComponentHandler extends ComponentAdapter implements
- ActionListener
+ public class ComponentHandler
+ extends ComponentAdapter
+ implements ActionListener
{
/**
* Timer used when inside a scrollpane and the scrollbar is adjusting
@@ -2017,8 +1983,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when the component's position changes.
*
- * @param e
- * the event that occurs when moving the component
+ * @param e the event that occurs when moving the component
*/
public void componentMoved(ComponentEvent e)
{
@@ -2048,8 +2013,7 @@ public class BasicTreeUI extends TreeUI
* Public as a result of Timer. If the scrollBar is null, or not adjusting,
* this stops the timer and updates the sizing.
*
- * @param ae
- * is the action performed
+ * @param ae is the action performed
*/
public void actionPerformed(ActionEvent ae)
{
@@ -2061,7 +2025,8 @@ public class BasicTreeUI extends TreeUI
* Listener responsible for getting cell editing events and updating the tree
* accordingly.
*/
- public class CellEditorHandler implements CellEditorListener
+ public class CellEditorHandler
+ implements CellEditorListener
{
/**
* Constructor
@@ -2075,8 +2040,7 @@ public class BasicTreeUI extends TreeUI
* Messaged when editing has stopped in the tree. Tells the listeners
* editing has stopped.
*
- * @param e
- * is the notification event
+ * @param e is the notification event
*/
public void editingStopped(ChangeEvent e)
{
@@ -2087,8 +2051,7 @@ public class BasicTreeUI extends TreeUI
* Messaged when editing has been canceled in the tree. This tells the
* listeners the editor has canceled editing.
*
- * @param e
- * is the notification event
+ * @param e is the notification event
*/
public void editingCanceled(ChangeEvent e)
{
@@ -2099,7 +2062,8 @@ public class BasicTreeUI extends TreeUI
/**
* Repaints the lead selection row when focus is lost/grained.
*/
- public class FocusHandler implements FocusListener
+ public class FocusHandler
+ implements FocusListener
{
/**
* Constructor
@@ -2111,26 +2075,38 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when focus is activated on the tree we're in, redraws the lead
- * row. Invoked when a component gains the keyboard focus.
+ * row. Invoked when a component gains the keyboard focus. The method
+ * repaints the lead row that is shown differently when the tree is in
+ * focus.
*
- * @param e
- * is the focus event that is activated
+ * @param e is the focus event that is activated
*/
public void focusGained(FocusEvent e)
{
- // TODO: Implement this properly.
+ repaintLeadRow();
}
/**
* Invoked when focus is deactivated on the tree we're in, redraws the lead
- * row. Invoked when a component loses the keyboard focus.
+ * row. Invoked when a component loses the keyboard focus. The method
+ * repaints the lead row that is shown differently when the tree is in
+ * focus.
*
- * @param e
- * is the focus event that is deactivated
+ * @param e is the focus event that is deactivated
*/
public void focusLost(FocusEvent e)
{
- // TODO: Implement this properly.
+ repaintLeadRow();
+ }
+
+ /**
+ * Repaint the lead row.
+ */
+ void repaintLeadRow()
+ {
+ TreePath lead = tree.getLeadSelectionPath();
+ if (lead!=null)
+ tree.repaint(tree.getPathBounds(lead));
}
}
@@ -2138,7 +2114,8 @@ public class BasicTreeUI extends TreeUI
* This is used to get multiple key down events to appropriately genereate
* events.
*/
- public class KeyHandler extends KeyAdapter
+ public class KeyHandler
+ extends KeyAdapter
{
/** Key code that is being generated for. */
protected Action repeatKeyAction;
@@ -2160,8 +2137,7 @@ public class BasicTreeUI extends TreeUI
* user. Subsequent same key presses move the keyboard focus to the next
* object that starts with the same letter.
*
- * @param e
- * the key typed
+ * @param e the key typed
*/
public void keyTyped(KeyEvent e)
{
@@ -2171,8 +2147,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when a key has been pressed.
*
- * @param e
- * the key pressed
+ * @param e the key pressed
*/
public void keyPressed(KeyEvent e)
{
@@ -2182,8 +2157,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when a key has been released
*
- * @param e
- * the key released
+ * @param e the key released
*/
public void keyReleased(KeyEvent e)
{
@@ -2195,7 +2169,9 @@ public class BasicTreeUI extends TreeUI
* MouseListener is responsible for updating the selection based on mouse
* events.
*/
- public class MouseHandler extends MouseAdapter implements MouseMotionListener
+ public class MouseHandler
+ extends MouseAdapter
+ implements MouseMotionListener
{
/**
* Constructor
@@ -2208,11 +2184,10 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when a mouse button has been pressed on a component.
*
- * @param e
- * is the mouse event that occured
+ * @param e is the mouse event that occured
*/
public void mousePressed(MouseEvent e)
- {
+ {
// Any mouse click cancels the previous waiting edit action, initiated
// by the single click on the selected node.
if (startEditTimer != null)
@@ -2220,7 +2195,7 @@ public class BasicTreeUI extends TreeUI
startEditTimer.stop();
startEditTimer = null;
}
-
+
Point click = e.getPoint();
TreePath path = getClosestPathForLocation(tree, click.x, click.y);
@@ -2228,6 +2203,11 @@ public class BasicTreeUI extends TreeUI
{
Rectangle bounds = getPathBounds(tree, path);
int row = getRowForPath(tree, path);
+
+ // Cancel the editing session if clicked on the different row.
+ if (tree.isEditing() && row != editingRow)
+ cancelEditing(tree);
+
boolean cntlClick = isLocationInExpandControl(path, click.x, click.y);
boolean isLeaf = isLeaf(row);
@@ -2258,35 +2238,32 @@ public class BasicTreeUI extends TreeUI
if (inBounds)
{
TreePath currentLead = tree.getLeadSelectionPath();
- if (
- currentLead != null &&
- currentLead.equals(path) &&
- e.getClickCount() == 1 &&
- tree.isEditable()
- )
+ if (currentLead != null && currentLead.equals(path)
+ && e.getClickCount() == 1 && tree.isEditable())
{
// Schedule the editing session.
final TreePath editPath = path;
-
+
if (startEditTimer != null)
startEditTimer.stop();
-
- startEditTimer = new Timer(WAIT_TILL_EDITING,
- new ActionListener()
- {
+
+ startEditTimer = new Timer(WAIT_TILL_EDITING,
+ new ActionListener()
+ {
public void actionPerformed(ActionEvent e)
- {
- startEditing(editPath, EDIT);
- }
+ {
+ startEditing(editPath, EDIT);
+ }
});
- startEditTimer.setRepeats(false);
- startEditTimer.start();
+ startEditTimer.setRepeats(false);
+ startEditTimer.start();
}
else
{
- selectPath(tree, path);
- if (e.getClickCount() == 2 && !isLeaf(row))
+ if (e.getClickCount() == 2 && ! isLeaf(row))
toggleExpandState(path);
+ else
+ selectPathForEvent(path, e);
}
}
@@ -2309,8 +2286,7 @@ public class BasicTreeUI extends TreeUI
* the drag originated until the mouse button is released (regardless of
* whether the mouse position is within the bounds of the component).
*
- * @param e
- * is the mouse event that occured
+ * @param e is the mouse event that occured
*/
public void mouseDragged(MouseEvent e)
{
@@ -2321,8 +2297,7 @@ public class BasicTreeUI extends TreeUI
* Invoked when the mouse button has been moved on a component (with no
* buttons no down).
*
- * @param e
- * the mouse event that occured
+ * @param e the mouse event that occured
*/
public void mouseMoved(MouseEvent e)
{
@@ -2332,8 +2307,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when a mouse button has been released on a component.
*
- * @param e
- * is the mouse event that occured
+ * @param e is the mouse event that occured
*/
public void mouseReleased(MouseEvent e)
{
@@ -2346,7 +2320,8 @@ public class BasicTreeUI extends TreeUI
* events, until the mouse is released to the destination it is constructed
* with.
*/
- public class MouseInputHandler implements MouseInputListener
+ public class MouseInputHandler
+ implements MouseInputListener
{
/** Source that events are coming from */
protected Component source;
@@ -2357,12 +2332,9 @@ public class BasicTreeUI extends TreeUI
/**
* Constructor
*
- * @param source
- * that events are coming from
- * @param destination
- * that receives all events
- * @param e
- * is the event received
+ * @param source that events are coming from
+ * @param destination that receives all events
+ * @param e is the event received
*/
public MouseInputHandler(Component source, Component destination,
MouseEvent e)
@@ -2375,8 +2347,7 @@ public class BasicTreeUI extends TreeUI
* Invoked when the mouse button has been clicked (pressed and released) on
* a component.
*
- * @param e
- * mouse event that occured
+ * @param e mouse event that occured
*/
public void mouseClicked(MouseEvent e)
{
@@ -2386,8 +2357,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when a mouse button has been pressed on a component.
*
- * @param e
- * mouse event that occured
+ * @param e mouse event that occured
*/
public void mousePressed(MouseEvent e)
{
@@ -2397,8 +2367,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when a mouse button has been released on a component.
*
- * @param e
- * mouse event that occured
+ * @param e mouse event that occured
*/
public void mouseReleased(MouseEvent e)
{
@@ -2408,8 +2377,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when the mouse enters a component.
*
- * @param e
- * mouse event that occured
+ * @param e mouse event that occured
*/
public void mouseEntered(MouseEvent e)
{
@@ -2419,8 +2387,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when the mouse exits a component.
*
- * @param e
- * mouse event that occured
+ * @param e mouse event that occured
*/
public void mouseExited(MouseEvent e)
{
@@ -2433,8 +2400,7 @@ public class BasicTreeUI extends TreeUI
* the drag originated until the mouse button is released (regardless of
* whether the mouse position is within the bounds of the component).
*
- * @param e
- * mouse event that occured
+ * @param e mouse event that occured
*/
public void mouseDragged(MouseEvent e)
{
@@ -2445,8 +2411,7 @@ public class BasicTreeUI extends TreeUI
* Invoked when the mouse cursor has been moved onto a component but no
* buttons have been pushed.
*
- * @param e
- * mouse event that occured
+ * @param e mouse event that occured
*/
public void mouseMoved(MouseEvent e)
{
@@ -2467,7 +2432,8 @@ public class BasicTreeUI extends TreeUI
* BasicTreeUI method. X location does not include insets, that is handled in
* getPathBounds.
*/
- public class NodeDimensionsHandler extends AbstractLayoutCache.NodeDimensions
+ public class NodeDimensionsHandler
+ extends AbstractLayoutCache.NodeDimensions
{
/**
* Constructor
@@ -2483,16 +2449,11 @@ public class BasicTreeUI extends TreeUI
* bounds is null, a newly created Rectangle should be returned, otherwise
* the value should be placed in bounds and returned.
*
- * @param cell
- * the value to be represented
- * @param row
- * row being queried
- * @param depth
- * the depth of the row
- * @param expanded
- * true if row is expanded
- * @param size
- * a Rectangle containing the size needed to represent value
+ * @param cell the value to be represented
+ * @param row row being queried
+ * @param depth the depth of the row
+ * @param expanded true if row is expanded
+ * @param size a Rectangle containing the size needed to represent value
* @return containing the node dimensions, or null if node has no dimension
*/
public Rectangle getNodeDimensions(Object cell, int row, int depth,
@@ -2507,8 +2468,11 @@ public class BasicTreeUI extends TreeUI
if (s != null)
{
+ TreePath path = treeState.getPathForRow(row);
size.x = getRowX(row, depth);
size.width = SwingUtilities.computeStringWidth(fm, s);
+ size.width = size.width + getCurrentControlIcon(path).getIconWidth()
+ + gap + getNodeIcon(path).getIconWidth();
size.height = getMaxHeight(tree);
size.y = size.height * row;
}
@@ -2523,17 +2487,16 @@ public class BasicTreeUI extends TreeUI
*/
protected int getRowX(int row, int depth)
{
- if (row == 0)
- return 0;
- return depth * rightChildIndent;
+ return depth * totalChildIndent;
}
}// NodeDimensionsHandler
/**
- * PropertyChangeListener for the tree. Updates the appropriate varaible, or
+ * PropertyChangeListener for the tree. Updates the appropriate variable, or
* TreeState, based on what changes.
*/
- public class PropertyChangeHandler implements PropertyChangeListener
+ public class PropertyChangeHandler
+ implements PropertyChangeListener
{
/**
@@ -2547,17 +2510,28 @@ public class BasicTreeUI extends TreeUI
/**
* This method gets called when a bound property is changed.
*
- * @param event
- * A PropertyChangeEvent object describing the event source and the
- * property that has changed.
+ * @param event A PropertyChangeEvent object describing the event source and
+ * the property that has changed.
*/
public void propertyChange(PropertyChangeEvent event)
{
- if ((event.getPropertyName()).equals("rootVisible"))
+ String property = event.getPropertyName();
+ if (property.equals(JTree.ROOT_VISIBLE_PROPERTY))
{
validCachedPreferredSize = false;
+ treeState.setRootVisible(tree.isRootVisible());
tree.repaint();
}
+ else if (property.equals(JTree.SELECTION_MODEL_PROPERTY))
+ {
+ treeSelectionModel = tree.getSelectionModel();
+ treeSelectionModel.setRowMapper(treeState);
+ }
+ else if (property.equals(JTree.TREE_MODEL_PROPERTY))
+ {
+ treeModel = tree.getModel();
+ treeModel.addTreeModelListener(treeModelListener);
+ }
}
}
@@ -2565,8 +2539,8 @@ public class BasicTreeUI extends TreeUI
* Listener on the TreeSelectionModel, resets the row selection if any of the
* properties of the model change.
*/
- public class SelectionModelPropertyChangeHandler implements
- PropertyChangeListener
+ public class SelectionModelPropertyChangeHandler
+ implements PropertyChangeListener
{
/**
@@ -2580,9 +2554,8 @@ public class BasicTreeUI extends TreeUI
/**
* This method gets called when a bound property is changed.
*
- * @param event
- * A PropertyChangeEvent object describing the event source and the
- * property that has changed.
+ * @param event A PropertyChangeEvent object describing the event source and
+ * the property that has changed.
*/
public void propertyChange(PropertyChangeEvent event)
{
@@ -2593,7 +2566,8 @@ public class BasicTreeUI extends TreeUI
/**
* ActionListener that invokes cancelEditing when action performed.
*/
- public class TreeCancelEditingAction extends AbstractAction
+ public class TreeCancelEditingAction
+ extends AbstractAction
{
/**
@@ -2607,8 +2581,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when an action occurs.
*
- * @param e
- * event that occured
+ * @param e event that occured
*/
public void actionPerformed(ActionEvent e)
{
@@ -2630,7 +2603,8 @@ public class BasicTreeUI extends TreeUI
/**
* Updates the TreeState in response to nodes expanding/collapsing.
*/
- public class TreeExpansionHandler implements TreeExpansionListener
+ public class TreeExpansionHandler
+ implements TreeExpansionListener
{
/**
@@ -2644,24 +2618,30 @@ public class BasicTreeUI extends TreeUI
/**
* Called whenever an item in the tree has been expanded.
*
- * @param event
- * is the event that occured
+ * @param event is the event that occured
*/
public void treeExpanded(TreeExpansionEvent event)
{
validCachedPreferredSize = false;
+ treeState.setExpandedState(event.getPath(), true);
+ // The maximal cell height may change
+ maxHeight = 0;
+ tree.revalidate();
tree.repaint();
}
/**
* Called whenever an item in the tree has been collapsed.
*
- * @param event
- * is the event that occured
+ * @param event is the event that occured
*/
public void treeCollapsed(TreeExpansionEvent event)
{
validCachedPreferredSize = false;
+ treeState.setExpandedState(event.getPath(), false);
+ // The maximal cell height may change
+ maxHeight = 0;
+ tree.revalidate();
tree.repaint();
}
}// TreeExpansionHandler
@@ -2670,7 +2650,8 @@ public class BasicTreeUI extends TreeUI
* TreeHomeAction is used to handle end/home actions. Scrolls either the first
* or last cell to be visible based on direction.
*/
- public class TreeHomeAction extends AbstractAction
+ public class TreeHomeAction
+ extends AbstractAction
{
/** The direction, either home or end */
@@ -2679,10 +2660,8 @@ public class BasicTreeUI extends TreeUI
/**
* Constructor
*
- * @param direction -
- * it is home or end
- * @param name
- * is the name of the direction
+ * @param direction - it is home or end
+ * @param name is the name of the direction
*/
public TreeHomeAction(int direction, String name)
{
@@ -2692,8 +2671,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when an action occurs.
*
- * @param e
- * is the event that occured
+ * @param e is the event that occured
*/
public void actionPerformed(ActionEvent e)
{
@@ -2716,7 +2694,8 @@ public class BasicTreeUI extends TreeUI
* TreeIncrementAction is used to handle up/down actions. Selection is moved
* up or down based on direction.
*/
- public class TreeIncrementAction extends AbstractAction
+ public class TreeIncrementAction
+ extends AbstractAction
{
/** Specifies the direction to adjust the selection by. */
@@ -2725,10 +2704,8 @@ public class BasicTreeUI extends TreeUI
/**
* Constructor
*
- * @param direction
- * up or down
- * @param name
- * is the name of the direction
+ * @param direction up or down
+ * @param name is the name of the direction
*/
public TreeIncrementAction(int direction, String name)
{
@@ -2738,73 +2715,79 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when an action occurs.
*
- * @param e
- * is the event that occured
+ * @param e is the event that occured
*/
public void actionPerformed(ActionEvent e)
{
- Object last = tree.getLeadSelectionPath().getLastPathComponent();
+ TreePath currentPath = tree.getLeadSelectionPath();
+ int currentRow;
- if (e.getActionCommand().equals("selectPreviousChangeLead"))
- {
- Object prev = getPreviousVisibleNode(last);
+ if (currentPath != null)
+ currentRow = treeState.getRowForPath(currentPath);
+ else
+ currentRow = 0;
- if (prev != null)
- {
- TreePath newPath = new TreePath(getPathToRoot(prev, 0));
- selectPath(tree, newPath);
- tree.setLeadSelectionPath(newPath);
- }
- }
- else if (e.getActionCommand().equals("selectPreviousExtendSelection"))
+ int rows = treeState.getRowCount();
+
+ int nextRow = currentRow + 1;
+ int prevRow = currentRow - 1;
+ boolean hasNext = nextRow < rows;
+ boolean hasPrev = prevRow >= 0 && rows > 0;
+ TreePath newPath;
+ String command = e.getActionCommand();
+
+ if (command.equals("selectPreviousChangeLead") && hasPrev)
{
- Object prev = getPreviousVisibleNode(last);
- if (prev != null)
- {
- TreePath newPath = new TreePath(getPathToRoot(prev, 0));
- tree.addSelectionPath(newPath);
- tree.setLeadSelectionPath(newPath);
- }
+ newPath = treeState.getPathForRow(prevRow);
+ tree.setSelectionPath(newPath);
+ tree.setAnchorSelectionPath(newPath);
+ tree.setLeadSelectionPath(newPath);
}
- else if (e.getActionCommand().equals("selectPrevious"))
+ else if (command.equals("selectPreviousExtendSelection") && hasPrev)
{
- Object prev = getPreviousVisibleNode(last);
+ newPath = treeState.getPathForRow(prevRow);
- if (prev != null)
- {
- TreePath newPath = new TreePath(getPathToRoot(prev, 0));
- selectPath(tree, newPath);
- }
+ // If the new path is already selected, the selection shrinks,
+ // unselecting the previously current path.
+ if (tree.isPathSelected(newPath))
+ tree.getSelectionModel().removeSelectionPath(currentPath);
+
+ // This must be called in any case because it updates the model
+ // lead selection index.
+ tree.addSelectionPath(newPath);
+ tree.setLeadSelectionPath(newPath);
}
- else if (e.getActionCommand().equals("selectNext"))
+ else if (command.equals("selectPrevious") && hasPrev)
{
- Object next = getNextVisibleNode(last);
-
- if (next != null)
- {
- TreePath newPath = new TreePath(getPathToRoot(next, 0));
- selectPath(tree, newPath);
- }
+ newPath = treeState.getPathForRow(prevRow);
+ tree.setSelectionPath(newPath);
}
- else if (e.getActionCommand().equals("selectNextExtendSelection"))
+ else if (command.equals("selectNext") && hasNext)
{
- Object next = getNextVisibleNode(last);
- if (next != null)
- {
- TreePath newPath = new TreePath(getPathToRoot(next, 0));
- tree.addSelectionPath(newPath);
- tree.setLeadSelectionPath(newPath);
- }
+ newPath = treeState.getPathForRow(nextRow);
+ tree.setSelectionPath(newPath);
}
- else if (e.getActionCommand().equals("selectNextChangeLead"))
+ else if (command.equals("selectNextExtendSelection") && hasNext)
{
- Object next = getNextVisibleNode(last);
- if (next != null)
- {
- TreePath newPath = new TreePath(getPathToRoot(next, 0));
- selectPath(tree, newPath);
- tree.setLeadSelectionPath(newPath);
- }
+ newPath = treeState.getPathForRow(nextRow);
+
+ // If the new path is already selected, the selection shrinks,
+ // unselecting the previously current path.
+ if (tree.isPathSelected(newPath))
+ tree.getSelectionModel().removeSelectionPath(currentPath);
+
+ // This must be called in any case because it updates the model
+ // lead selection index.
+ tree.addSelectionPath(newPath);
+
+ tree.setLeadSelectionPath(newPath);
+ }
+ else if (command.equals("selectNextChangeLead") && hasNext)
+ {
+ newPath = treeState.getPathForRow(nextRow);
+ tree.setSelectionPath(newPath);
+ tree.setAnchorSelectionPath(newPath);
+ tree.setLeadSelectionPath(newPath);
}
}
@@ -2823,7 +2806,8 @@ public class BasicTreeUI extends TreeUI
/**
* Forwards all TreeModel events to the TreeState.
*/
- public class TreeModelHandler implements TreeModelListener
+ public class TreeModelHandler
+ implements TreeModelListener
{
/**
* Constructor
@@ -2843,12 +2827,12 @@ public class BasicTreeUI extends TreeUI
* node(s). e.getChildIndices() returns the index(es) of the changed
* node(s).
*
- * @param e
- * is the event that occured
+ * @param e is the event that occured
*/
public void treeNodesChanged(TreeModelEvent e)
{
validCachedPreferredSize = false;
+ treeState.treeNodesChanged(e);
tree.repaint();
}
@@ -2857,12 +2841,12 @@ public class BasicTreeUI extends TreeUI
* get the parent of the new node(s). e.getChildIndices() returns the
* index(es) of the new node(s) in ascending order.
*
- * @param e
- * is the event that occured
+ * @param e is the event that occured
*/
public void treeNodesInserted(TreeModelEvent e)
{
validCachedPreferredSize = false;
+ treeState.treeNodesInserted(e);
tree.repaint();
}
@@ -2874,12 +2858,12 @@ public class BasicTreeUI extends TreeUI
* node(s). e.getChildIndices() returns, in ascending order, the index(es)
* the node(s) had before being deleted.
*
- * @param e
- * is the event that occured
+ * @param e is the event that occured
*/
public void treeNodesRemoved(TreeModelEvent e)
{
validCachedPreferredSize = false;
+ treeState.treeNodesRemoved(e);
tree.repaint();
}
@@ -2890,15 +2874,15 @@ public class BasicTreeUI extends TreeUI
* should become the new root of the tree. Use e.getPath() to get the path
* to the node. e.getChildIndices() returns null.
*
- * @param e
- * is the event that occured
+ * @param e is the event that occured
*/
public void treeStructureChanged(TreeModelEvent e)
{
if (e.getPath().length == 1
- && !e.getPath()[0].equals(treeModel.getRoot()))
+ && ! e.getPath()[0].equals(treeModel.getRoot()))
tree.expandPath(new TreePath(treeModel.getRoot()));
validCachedPreferredSize = false;
+ treeState.treeStructureChanged(e);
tree.repaint();
}
}// TreeModelHandler
@@ -2906,7 +2890,8 @@ public class BasicTreeUI extends TreeUI
/**
* TreePageAction handles page up and page down events.
*/
- public class TreePageAction extends AbstractAction
+ public class TreePageAction
+ extends AbstractAction
{
/** Specifies the direction to adjust the selection by. */
protected int direction;
@@ -2914,10 +2899,8 @@ public class BasicTreeUI extends TreeUI
/**
* Constructor
*
- * @param direction
- * up or down
- * @param name
- * is the name of the direction
+ * @param direction up or down
+ * @param name is the name of the direction
*/
public TreePageAction(int direction, String name)
{
@@ -2927,8 +2910,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when an action occurs.
*
- * @param e
- * is the event that occured
+ * @param e is the event that occured
*/
public void actionPerformed(ActionEvent e)
{
@@ -2950,7 +2932,8 @@ public class BasicTreeUI extends TreeUI
* Listens for changes in the selection model and updates the display
* accordingly.
*/
- public class TreeSelectionHandler implements TreeSelectionListener
+ public class TreeSelectionHandler
+ implements TreeSelectionListener
{
/**
* Constructor
@@ -2964,26 +2947,42 @@ public class BasicTreeUI extends TreeUI
* Messaged when the selection changes in the tree we're displaying for.
* Stops editing, messages super and displays the changed paths.
*
- * @param event
- * the event that characterizes the change.
+ * @param event the event that characterizes the change.
*/
public void valueChanged(TreeSelectionEvent event)
{
if (tree.isEditing())
- tree.stopEditing();
+ tree.cancelEditing();
+
+ TreePath op = event.getOldLeadSelectionPath();
+ TreePath np = event.getNewLeadSelectionPath();
+
+ // Repaint of the changed lead selection path.
+ if (op != np)
+ {
+ Rectangle o = treeState.getBounds(event.getOldLeadSelectionPath(),
+ new Rectangle());
+ Rectangle n = treeState.getBounds(event.getNewLeadSelectionPath(),
+ new Rectangle());
+
+ if (o!=null)
+ tree.repaint(o);
+ if (n!=null)
+ tree.repaint(n);
+ }
}
}// TreeSelectionHandler
/**
* For the first selected row expandedness will be toggled.
*/
- public class TreeToggleAction extends AbstractAction
+ public class TreeToggleAction
+ extends AbstractAction
{
/**
* Constructor
*
- * @param name
- * is the name of <code>Action</code> field
+ * @param name is the name of <code>Action</code> field
*/
public TreeToggleAction(String name)
{
@@ -2993,8 +2992,7 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when an action occurs.
*
- * @param e
- * the event that occured
+ * @param e the event that occured
*/
public void actionPerformed(ActionEvent e)
{
@@ -3016,7 +3014,8 @@ public class BasicTreeUI extends TreeUI
* TreeTraverseAction is the action used for left/right keys. Will toggle the
* expandedness of a node, as well as potentially incrementing the selection.
*/
- public class TreeTraverseAction extends AbstractAction
+ public class TreeTraverseAction
+ extends AbstractAction
{
/**
* Determines direction to traverse, 1 means expand, -1 means collapse.
@@ -3026,10 +3025,8 @@ public class BasicTreeUI extends TreeUI
/**
* Constructor
*
- * @param direction
- * to traverse
- * @param name
- * is the name of the direction
+ * @param direction to traverse
+ * @param name is the name of the direction
*/
public TreeTraverseAction(int direction, String name)
{
@@ -3039,35 +3036,49 @@ public class BasicTreeUI extends TreeUI
/**
* Invoked when an action occurs.
*
- * @param e
- * the event that occured
+ * @param e the event that occured
*/
public void actionPerformed(ActionEvent e)
{
- Object last = tree.getLeadSelectionPath().getLastPathComponent();
+ TreePath current = tree.getLeadSelectionPath();
+ if (current == null)
+ return;
if (e.getActionCommand().equals("selectParent"))
{
- TreePath path = new TreePath(getPathToRoot(last, 0));
- Object p = getParent(treeModel.getRoot(), last);
+ if (current == null)
+ return;
- if (!treeModel.isLeaf(last))
- toggleExpandState(path);
- else if (p != null)
- selectPath(tree, new TreePath(getPathToRoot(p, 0)));
+ if (tree.isExpanded(current))
+ {
+ tree.collapsePath(current);
+ }
+ else
+ {
+ // If the node is not expanded (also, if it is a leaf node),
+ // we just select the parent. We do not select the root if it
+ // is not visible.
+ TreePath parent = current.getParentPath();
+ if (parent != null &&
+ !(parent.getPathCount()==1 && !tree.isRootVisible()) )
+ tree.setSelectionPath(parent);
+ }
}
else if (e.getActionCommand().equals("selectChild"))
{
- TreePath path = new TreePath(getPathToRoot(last, 0));
-
- if (!treeModel.isLeaf(last))
- toggleExpandState(path);
+ Object node = current.getLastPathComponent();
+ int nc = treeModel.getChildCount(node);
+ if (nc == 0 || treeState.isExpanded(current))
+ {
+ // If the node is leaf or it is already expanded,
+ // we just select the next row.
+ int nextRow = tree.getLeadSelectionRow() + 1;
+ if (nextRow <= tree.getRowCount())
+ tree.setSelectionRow(nextRow);
+ }
else
{
- Object next = getNextVisibleNode(last);
-
- if (next != null)
- selectPath(tree, new TreePath(getPathToRoot(next, 0)));
+ tree.expandPath(current);
}
}
}
@@ -3105,18 +3116,42 @@ public class BasicTreeUI extends TreeUI
*/
Icon getCurrentControlIcon(TreePath path)
{
- if (tree.isExpanded(path))
- return expandedIcon;
- return collapsedIcon;
+ if (hasControlIcons())
+ {
+ if (tree.isExpanded(path))
+ return expandedIcon;
+ else
+ return collapsedIcon;
+ }
+ else
+ {
+ if (nullIcon == null)
+ nullIcon = new Icon()
+ {
+ public int getIconHeight()
+ {
+ return 0;
+ }
+
+ public int getIconWidth()
+ {
+ return 0;
+ }
+
+ public void paintIcon(Component c, Graphics g, int x, int y)
+ {
+ // No action here.
+ }
+ };
+ return nullIcon;
+ }
}
/**
* Returns the parent of the current node
*
- * @param root
- * is the root of the tree
- * @param node
- * is the current node
+ * @param root is the root of the tree
+ * @param node is the current node
* @return is the parent of the current node
*/
Object getParent(Object root, Object node)
@@ -3132,15 +3167,13 @@ public class BasicTreeUI extends TreeUI
/**
* Recursively checks the tree for the specified node, starting at the root.
*
- * @param root
- * is starting node to start searching at.
- * @param node
- * is the node to search for
+ * @param root is starting node to start searching at.
+ * @param node is the node to search for
* @return the parent node of node
*/
private Object findNode(Object root, Object node)
{
- if (!treeModel.isLeaf(root) && !root.equals(node))
+ if (! treeModel.isLeaf(root) && ! root.equals(node))
{
int size = treeModel.getChildCount(root);
for (int j = 0; j < size; j++)
@@ -3158,167 +3191,20 @@ public class BasicTreeUI extends TreeUI
}
/**
- * Get previous visible node in the tree. Package private for use in inner
- * classes.
- *
- * @param node -
- * current node
- * @return the next visible node in the JTree. Return null if there are no
- * more.
- */
- Object getPreviousVisibleNode(Object node)
- {
- if (currentVisiblePath != null)
- {
- Object[] nodes = currentVisiblePath.getPath();
- int i = 0;
- while (i < nodes.length && !node.equals(nodes[i]))
- i++;
- // return the next node
- if (i - 1 >= 0)
- return nodes[i - 1];
- }
- return null;
- }
-
- /**
- * Returns the next node in the tree Package private for use in inner classes.
- *
- * @param curr -
- * current node
- * @return the next node in the tree
- */
- Object getNextNode(Object curr)
- {
- if (!treeModel.isLeaf(curr) && treeModel.getChildCount(curr) > 0)
- return treeModel.getChild(curr, 0);
-
- Object node = curr;
- Object sibling = null;
- do
- {
- sibling = getNextSibling(node);
- node = getParent(treeModel.getRoot(), node);
- }
- while (sibling == null && node != null);
-
- return sibling;
- }
-
- /**
- * Returns the previous node in the tree Package private for use in inner
- * classes.
- *
- * @param node
- * current node
- * @return the previous node in the tree
- */
- Object getPreviousNode(Object node)
- {
- Object parent = getParent(treeModel.getRoot(), node);
- if (parent == null)
- return null;
-
- Object sibling = getPreviousSibling(node);
-
- if (sibling == null)
- return parent;
-
- int size = 0;
- if (!treeModel.isLeaf(sibling))
- size = treeModel.getChildCount(sibling);
- while (size > 0)
- {
- sibling = treeModel.getChild(sibling, size - 1);
- if (!treeModel.isLeaf(sibling))
- size = treeModel.getChildCount(sibling);
- else
- size = 0;
- }
-
- return sibling;
- }
-
- /**
- * Returns the next sibling in the tree Package private for use in inner
- * classes.
- *
- * @param node -
- * current node
- * @return the next sibling in the tree
- */
- Object getNextSibling(Object node)
- {
- Object parent = getParent(treeModel.getRoot(), node);
- if (parent == null)
- return null;
-
- int index = treeModel.getIndexOfChild(parent, node) + 1;
-
- int size = 0;
- if (!treeModel.isLeaf(parent))
- size = treeModel.getChildCount(parent);
- if (index == 0 || index >= size)
- return null;
-
- return treeModel.getChild(parent, index);
- }
-
- /**
- * Returns the previous sibling in the tree Package private for use in inner
- * classes.
- *
- * @param node -
- * current node
- * @return the previous sibling in the tree
- */
- Object getPreviousSibling(Object node)
- {
- Object parent = getParent(treeModel.getRoot(), node);
- if (parent == null)
- return null;
-
- int index = treeModel.getIndexOfChild(parent, node) - 1;
-
- int size = 0;
- if (!treeModel.isLeaf(parent))
- size = treeModel.getChildCount(parent);
- if (index < 0 || index >= size)
- return null;
-
- return treeModel.getChild(parent, index);
- }
-
- /**
* Selects the specified path in the tree depending on modes. Package private
* for use in inner classes.
*
- * @param tree
- * is the tree we are selecting the path in
- * @param path
- * is the path we are selecting
+ * @param tree is the tree we are selecting the path in
+ * @param path is the path we are selecting
*/
void selectPath(JTree tree, TreePath path)
{
if (path != null)
{
- if (tree.getSelectionModel().getSelectionMode() == TreeSelectionModel.SINGLE_TREE_SELECTION)
- {
- tree.getSelectionModel().clearSelection();
- tree.addSelectionPath(path);
- tree.setLeadSelectionPath(path);
- }
- else if (tree.getSelectionModel().getSelectionMode() == TreeSelectionModel.CONTIGUOUS_TREE_SELECTION)
- {
- // TODO
- }
- else
- {
- tree.addSelectionPath(path);
- tree.setLeadSelectionPath(path);
- tree.getSelectionModel().setSelectionMode(
- TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
- }
+ tree.setSelectionPath(path);
+ tree.setLeadSelectionPath(path);
+ tree.makeVisible(path);
+ tree.scrollPathToVisible(path);
}
}
@@ -3326,10 +3212,8 @@ public class BasicTreeUI extends TreeUI
* Returns the path from node to the root. Package private for use in inner
* classes.
*
- * @param node
- * the node to get the path to
- * @param depth
- * the depth of the tree to return a path for
+ * @param node the node to get the path to
+ * @param depth the depth of the tree to return a path for
* @return an array of tree nodes that represent the path to node.
*/
Object[] getPathToRoot(Object node, int depth)
@@ -3349,47 +3233,13 @@ public class BasicTreeUI extends TreeUI
}
/**
- * Returns the level of the node in the tree.
- *
- * @param node -
- * current node
- * @return the number of the level
- */
- int getLevel(Object node)
- {
- int count = -1;
-
- Object current = node;
-
- if (treeModel != null)
- {
- Object root = treeModel.getRoot();
- if (!tree.isRootVisible() && tree.isExpanded(new TreePath(root)))
- count--;
-
- do
- {
- current = getParent(root, current);
- count++;
- }
- while (current != null);
- }
- return count;
- }
-
- /**
* Draws a vertical line using the given graphic context
*
- * @param g
- * is the graphic context
- * @param c
- * is the component the new line will belong to
- * @param x
- * is the horizonal position
- * @param top
- * specifies the top of the line
- * @param bottom
- * specifies the bottom of the line
+ * @param g is the graphic context
+ * @param c is the component the new line will belong to
+ * @param x is the horizonal position
+ * @param top specifies the top of the line
+ * @param bottom specifies the bottom of the line
*/
protected void paintVerticalLine(Graphics g, JComponent c, int x, int top,
int bottom)
@@ -3402,16 +3252,11 @@ public class BasicTreeUI extends TreeUI
/**
* Draws a horizontal line using the given graphic context
*
- * @param g
- * is the graphic context
- * @param c
- * is the component the new line will belong to
- * @param y
- * is the vertical position
- * @param left
- * specifies the left point of the line
- * @param right
- * specifies the right point of the line
+ * @param g is the graphic context
+ * @param c is the component the new line will belong to
+ * @param y is the vertical position
+ * @param left specifies the left point of the line
+ * @param right specifies the right point of the line
*/
protected void paintHorizontalLine(Graphics g, JComponent c, int y, int left,
int right)
@@ -3424,16 +3269,11 @@ public class BasicTreeUI extends TreeUI
/**
* Draws an icon at around a specific position
*
- * @param c
- * is the component the new line will belong to
- * @param g
- * is the graphic context
- * @param icon
- * is the icon which will be drawn
- * @param x
- * is the center position in x-direction
- * @param y
- * is the center position in y-direction
+ * @param c is the component the new line will belong to
+ * @param g is the graphic context
+ * @param icon is the icon which will be drawn
+ * @param x is the center position in x-direction
+ * @param y is the center position in y-direction
*/
protected void drawCentered(Component c, Graphics g, Icon icon, int x, int y)
{
@@ -3451,14 +3291,10 @@ public class BasicTreeUI extends TreeUI
/**
* Draws a dashed horizontal line.
*
- * @param g -
- * the graphics configuration.
- * @param y -
- * the y location to start drawing at
- * @param x1 -
- * the x location to start drawing at
- * @param x2 -
- * the x location to finish drawing at
+ * @param g - the graphics configuration.
+ * @param y - the y location to start drawing at
+ * @param x1 - the x location to start drawing at
+ * @param x2 - the x location to finish drawing at
*/
protected void drawDashedHorizontalLine(Graphics g, int y, int x1, int x2)
{
@@ -3470,14 +3306,10 @@ public class BasicTreeUI extends TreeUI
/**
* Draws a dashed vertical line.
*
- * @param g -
- * the graphics configuration.
- * @param x -
- * the x location to start drawing at
- * @param y1 -
- * the y location to start drawing at
- * @param y2 -
- * the y location to finish drawing at
+ * @param g - the graphics configuration.
+ * @param x - the x location to start drawing at
+ * @param y1 - the y location to start drawing at
+ * @param y2 - the y location to finish drawing at
*/
protected void drawDashedVerticalLine(Graphics g, int x, int y1, int y2)
{
@@ -3490,22 +3322,15 @@ public class BasicTreeUI extends TreeUI
* Paints the expand (toggle) part of a row. The receiver should NOT modify
* clipBounds, or insets.
*
- * @param g -
- * the graphics configuration
+ * @param g - the graphics configuration
* @param clipBounds -
* @param insets -
- * @param bounds -
- * bounds of expand control
- * @param path -
- * path to draw control for
- * @param row -
- * row to draw control for
- * @param isExpanded -
- * is the row expanded
- * @param hasBeenExpanded -
- * has the row already been expanded
- * @param isLeaf -
- * is the path a leaf
+ * @param bounds - bounds of expand control
+ * @param path - path to draw control for
+ * @param row - row to draw control for
+ * @param isExpanded - is the row expanded
+ * @param hasBeenExpanded - has the row already been expanded
+ * @param isLeaf - is the path a leaf
*/
protected void paintExpandControl(Graphics g, Rectangle clipBounds,
Insets insets, Rectangle bounds,
@@ -3516,9 +3341,7 @@ public class BasicTreeUI extends TreeUI
{
Icon icon = getCurrentControlIcon(path);
int iconW = icon.getIconWidth();
- int x = bounds.x - rightChildIndent + iconW / 2;
- if (x + iconW > bounds.x)
- x = bounds.x - rightChildIndent - gap;
+ int x = bounds.x - iconW - gap;
icon.paintIcon(tree, g, x, bounds.y + bounds.height / 2
- icon.getIconHeight() / 2);
}
@@ -3529,22 +3352,15 @@ public class BasicTreeUI extends TreeUI
* clipBounds, or insets. NOTE: parentRow can be -1 if the root is not
* visible.
*
- * @param g -
- * the graphics configuration
+ * @param g - the graphics configuration
* @param clipBounds -
* @param insets -
- * @param bounds -
- * bounds of the cell
- * @param path -
- * path to draw leg for
- * @param row -
- * row to start drawing at
- * @param isExpanded -
- * is the row expanded
- * @param hasBeenExpanded -
- * has the row already been expanded
- * @param isLeaf -
- * is the path a leaf
+ * @param bounds - bounds of the cell
+ * @param path - path to draw leg for
+ * @param row - row to start drawing at
+ * @param isExpanded - is the row expanded
+ * @param hasBeenExpanded - has the row already been expanded
+ * @param isLeaf - is the path a leaf
*/
protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds,
Insets insets, Rectangle bounds,
@@ -3554,45 +3370,32 @@ public class BasicTreeUI extends TreeUI
boolean isLeaf)
{
if (row != 0)
- paintHorizontalLine(g, tree, bounds.y + bounds.height / 2, bounds.x - gap
- - 2, bounds.x);
+ {
+ paintHorizontalLine(g, tree, bounds.y + bounds.height / 2,
+ bounds.x - leftChildIndent - gap, bounds.x - gap);
+ }
}
/**
* Paints the vertical part of the leg. The receiver should NOT modify
* clipBounds, insets.
*
- * @param g -
- * the graphics configuration.
+ * @param g - the graphics configuration.
* @param clipBounds -
* @param insets -
- * @param path -
- * the path to draw the vertical part for.
+ * @param path - the path to draw the vertical part for.
*/
protected void paintVerticalPartOfLeg(Graphics g, Rectangle clipBounds,
Insets insets, TreePath path)
{
- int max = tree.getVisibleRowCount();
- for (int i = 0; i < max; i++)
+ Rectangle bounds = getPathBounds(tree, path);
+ TreePath parent = path.getParentPath();
+ if (parent != null)
{
- Object curr = path.getPathComponent(i);
- TreePath currPath = new TreePath(getPathToRoot(curr, 0));
- int numChild = treeModel.getChildCount(curr);
- if (numChild > 0 && tree.isExpanded(currPath))
- {
- Rectangle bounds = getPathBounds(tree, currPath);
- Rectangle lastChildBounds = getPathBounds(
- tree,
- new TreePath(
- getPathToRoot(
- treeModel.getChild(
- curr,
- numChild - 1),
- 0)));
- paintVerticalLine(g, tree, bounds.x + gap + 2, bounds.y
- + bounds.height - 2,
- lastChildBounds.y + lastChildBounds.height / 2);
- }
+ Rectangle parentBounds = getPathBounds(tree, parent);
+ paintVerticalLine(g, tree, parentBounds.x + 2* gap,
+ parentBounds.y + parentBounds.height / 2,
+ bounds.y + bounds.height / 2);
}
}
@@ -3600,22 +3403,15 @@ public class BasicTreeUI extends TreeUI
* Paints the renderer part of a row. The receiver should NOT modify
* clipBounds, or insets.
*
- * @param g -
- * the graphics configuration
+ * @param g - the graphics configuration
* @param clipBounds -
* @param insets -
- * @param bounds -
- * bounds of expand control
- * @param path -
- * path to draw control for
- * @param row -
- * row to draw control for
- * @param isExpanded -
- * is the row expanded
- * @param hasBeenExpanded -
- * has the row already been expanded
- * @param isLeaf -
- * is the path a leaf
+ * @param bounds - bounds of expand control
+ * @param path - path to draw control for
+ * @param row - row to draw control for
+ * @param isExpanded - is the row expanded
+ * @param hasBeenExpanded - has the row already been expanded
+ * @param isLeaf - is the path a leaf
*/
protected void paintRow(Graphics g, Rectangle clipBounds, Insets insets,
Rectangle bounds, TreePath path, int row,
@@ -3626,26 +3422,21 @@ public class BasicTreeUI extends TreeUI
boolean hasIcons = false;
Object node = path.getLastPathComponent();
- if (tree.isVisible(path))
- {
- if (!validCachedPreferredSize)
- updateCachedPreferredSize();
-
- paintExpandControl(g, clipBounds, insets, bounds, path, row,
- isExpanded, hasBeenExpanded, isLeaf);
-
- if (row != 0)
- bounds.x += gap;
- bounds.width = preferredSize.width + bounds.x;
- TreeCellRenderer dtcr = tree.getCellRenderer();
- if (dtcr == null)
- dtcr = createDefaultCellRenderer();
-
- Component c = dtcr.getTreeCellRendererComponent(tree, node, selected,
- isExpanded, isLeaf,
- row, tree.hasFocus());
- rendererPane.paintComponent(g, c, c.getParent(), bounds);
- }
+ paintExpandControl(g, clipBounds, insets, bounds, path, row, isExpanded,
+ hasBeenExpanded, isLeaf);
+
+ TreeCellRenderer dtcr = currentCellRenderer;
+
+ boolean focused = false;
+ if (treeSelectionModel != null)
+ focused = treeSelectionModel.getLeadSelectionRow() == row
+ && tree.isFocusOwner();
+
+ Component c = dtcr.getTreeCellRendererComponent(tree, node, selected,
+ isExpanded, isLeaf, row,
+ focused);
+
+ rendererPane.paintComponent(g, c, c.getParent(), bounds);
}
/**
@@ -3660,16 +3451,11 @@ public class BasicTreeUI extends TreeUI
* Returns true if the expand (toggle) control should be drawn for the
* specified row.
*
- * @param path -
- * current path to check for.
- * @param row -
- * current row to check for.
- * @param isExpanded -
- * true if the path is expanded
- * @param hasBeenExpanded -
- * true if the path has been expanded already
- * @param isLeaf -
- * true if the row is a lead
+ * @param path - current path to check for.
+ * @param row - current row to check for.
+ * @param isExpanded - true if the path is expanded
+ * @param hasBeenExpanded - true if the path has been expanded already
+ * @param isLeaf - true if the row is a lead
*/
protected boolean shouldPaintExpandControl(TreePath path, int row,
boolean isExpanded,
@@ -3677,121 +3463,25 @@ public class BasicTreeUI extends TreeUI
boolean isLeaf)
{
Object node = path.getLastPathComponent();
- return (!isLeaf && getLevel(node) != 0 && hasControlIcons());
+ return (! isLeaf && hasControlIcons());
}
/**
- * Updates the cached current TreePath of all visible nodes in the tree.
+ * Finish the editing session.
*/
- void updateCurrentVisiblePath()
- {
- if (treeModel == null)
- return;
-
- Object next = treeModel.getRoot();
- if (next == null)
- return;
-
- TreePath rootPath = new TreePath(next);
- Rectangle bounds = getPathBounds(tree, rootPath);
-
- // If root is not a valid size to be visible, or is
- // not visible and the tree is expanded, then the next node acts
- // as the root
- if ((bounds.width == 0 && bounds.height == 0)
- || (!isRootVisible() && tree.isExpanded(new TreePath(next))))
- {
- next = getNextNode(next);
- rootPath = new TreePath(next);
- }
-
- Object root = next;
- TreePath current = null;
- while (next != null)
- {
- if (current == null)
- current = rootPath;
- else
- current = current.pathByAddingChild(next);
-
- do
- {
- TreePath path = new TreePath(getPathToRoot(next, 0));
- if ((tree.isVisible(path) && tree.isExpanded(path))
- || treeModel.isLeaf(next))
- next = getNextNode(next);
- else
- {
- Object pNext = next;
- next = getNextSibling(pNext);
- // if no next sibling, check parent's next sibling.
- if (next == null)
- {
- Object parent = getParent(root, pNext);
- while (next == null && parent != null)
- {
- next = getNextSibling(parent);
- if (next == null)
- parent = getParent(root, parent);
- }
- }
- }
- }
- while (next != null
- && !tree.isVisible(new TreePath(getPathToRoot(next, 0))));
- }
-
- currentVisiblePath = current;
- tree.setVisibleRowCount(getRowCount(tree));
-
- if (tree.getSelectionModel() != null && tree.getSelectionCount() == 0
- && currentVisiblePath != null)
- selectPath(
- tree,
- new TreePath(
- getPathToRoot(
- currentVisiblePath.getPathComponent(0),
- 0)));
- }
-
- /**
- * Get next visible node in the currentVisiblePath. Package private for use in
- * inner classes.
- *
- * @param node
- * current node
- * @return the next visible node in the JTree. Return null if there are no
- * more.
- */
- Object getNextVisibleNode(Object node)
- {
- if (currentVisiblePath != null)
- {
- Object[] nodes = currentVisiblePath.getPath();
- int i = 0;
- while (i < nodes.length && !node.equals(nodes[i]))
- i++;
- // return the next node
- if (i + 1 < nodes.length)
- return nodes[i + 1];
- }
- return null;
- }
-
- /**
- * Finish the editing session.
- */
void finish()
{
+ treeState.invalidatePathBounds(treeState.getPathForRow(editingRow));
editingPath = null;
- editingRow = -1;
+ editingRow = - 1;
stopEditingInCompleteEditing = false;
isEditing = false;
+ Rectangle bounds = editingComponent.getParent().getBounds();
tree.removeAll();
validCachedPreferredSize = false;
-
// Repaint the region, where was the editing component.
- tree.repaint(editingComponent.getParent().getBounds());
+ tree.repaint(bounds);
editingComponent = null;
+ tree.requestFocus();
}
} // BasicTreeUI
diff --git a/javax/swing/plaf/metal/MetalBorders.java b/javax/swing/plaf/metal/MetalBorders.java
index 77e684127..98a00ee0a 100644
--- a/javax/swing/plaf/metal/MetalBorders.java
+++ b/javax/swing/plaf/metal/MetalBorders.java
@@ -139,24 +139,59 @@ public class MetalBorders
if (MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme)
paintOceanButtonBorder(c, g, x, y, w, h);
else
- {
- ButtonModel bmodel = null;
-
- if (c instanceof AbstractButton)
- bmodel = ((AbstractButton) c).getModel();
+ paintDefaultButtonBorder(c, g, x, y, w, h);
+ }
- Color darkShadow = MetalLookAndFeel.getControlDarkShadow();
- Color shadow = MetalLookAndFeel.getControlShadow();
- Color light = MetalLookAndFeel.getControlHighlight();
- Color middle = MetalLookAndFeel.getControl();
+ /**
+ * Paints the button border for the DefaultMetalTheme.
+ *
+ * @param c the component (button)
+ * @param g the graphics object to use
+ * @param x the upper left corner of the component, X coordinate
+ * @param y the upper left corner of the component, Y coordinate
+ * @param w the width of the component
+ * @param h the height of the component
+ */
+ private void paintDefaultButtonBorder(Component c, Graphics g, int x,
+ int y, int w, int h)
+ {
+ ButtonModel bmodel = null;
- if (c.isEnabled())
- {
- // draw dark border
- g.setColor(darkShadow);
- g.drawRect(x, y, w - 2, h - 2);
+ if (c instanceof AbstractButton)
+ bmodel = ((AbstractButton) c).getModel();
+
+ Color darkShadow = MetalLookAndFeel.getControlDarkShadow();
+ Color shadow = MetalLookAndFeel.getControlShadow();
+ Color light = MetalLookAndFeel.getControlHighlight();
+ Color middle = MetalLookAndFeel.getControl();
- if (!bmodel.isPressed())
+ if (c.isEnabled())
+ {
+ // draw dark border
+ g.setColor(darkShadow);
+ g.drawRect(x, y, w - 2, h - 2);
+
+ // If the button is the default button, we paint a special border,
+ // regardless of the pressed state.
+ if (c instanceof JButton && ((JButton) c).isDefaultButton())
+ {
+ g.drawRect(x + 1, y + 1, w - 4, h - 4);
+ // Draw white highlight.
+ g.setColor(light);
+ g.drawLine(x + 2, y + 2, x + w - 4, y + 2);
+ g.drawLine(x + 2, y + 2, x + 2, y + h - 4);
+ g.drawLine(x + 2, y + h - 1, x + w - 1, y + h - 1);
+ g.drawLine(x + w - 1, y + 2, x + w - 1, y + h - 1);
+ // Draw crossing pixels.
+ g.setColor(middle);
+ g.fillRect(x + w - 2, y + 2, 1, 1);
+ g.fillRect(x + 2, y + h - 2, 1, 1);
+ }
+ else
+ {
+ // The normal border. This is used when the button is not
+ // pressed or the button is not armed.
+ if (! (bmodel.isPressed() && bmodel.isArmed()) )
{
// draw light border
g.setColor(light);
@@ -167,6 +202,8 @@ public class MetalBorders
g.drawLine(x + 1, y + h - 2, x + 1, y + h - 2);
g.drawLine(x + w - 2, y + 1, x + w - 2, y + 1);
}
+ // The pressed border. This border is painted only when
+ // the button is both pressed and armed.
else
{
// draw light border
@@ -185,12 +222,12 @@ public class MetalBorders
g.drawRect(x + w - 2, y + 1, 0, 0);
}
}
- else
- {
- // draw disabled border
- g.setColor(MetalLookAndFeel.getInactiveControlTextColor());
- g.drawRect(x, y, w - 2, h - 2);
- }
+ }
+ else
+ {
+ // draw disabled border
+ g.setColor(MetalLookAndFeel.getInactiveControlTextColor());
+ g.drawRect(x, y, w - 2, h - 2);
}
}
@@ -219,11 +256,16 @@ public class MetalBorders
if (c.isEnabled())
{
- if (bmodel.isPressed())
+ // Paint the pressed border if the button is pressed, or if
+ // the button is the default button. In the OceanTheme, the default
+ // button has the same border as a pressed button.
+ if (bmodel.isPressed() || ((c instanceof JButton)
+ && ((JButton) c).isDefaultButton()))
{
- // draw fat border
- g.drawLine(x + 1, y + 1, x + w - 2, y + 1);
- g.drawLine(x + 1, y + 1, x + 1, y + h - 2);
+ // Draw fat border.
+ g.setColor(darkShadow);
+ g.drawRect(x, y, w - 1, h - 1);
+ g.drawRect(x + 1, y + 1, w - 3, h - 3);
}
else if (bmodel.isRollover())
{
diff --git a/javax/swing/plaf/metal/MetalButtonUI.java b/javax/swing/plaf/metal/MetalButtonUI.java
index 485424cda..83cd33662 100644
--- a/javax/swing/plaf/metal/MetalButtonUI.java
+++ b/javax/swing/plaf/metal/MetalButtonUI.java
@@ -45,11 +45,13 @@ import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.AbstractButton;
+import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicButtonListener;
import javax.swing.plaf.basic.BasicButtonUI;
@@ -159,8 +161,8 @@ public class MetalButtonUI
}
/**
- * Paints the background of the button to indicate that it is in the "pressed"
- * state.
+ * Paints the background of the button to indicate that it is in the
+ * "pressed" state.
*
* @param g the graphics context.
* @param b the button.
@@ -233,9 +235,12 @@ public class MetalButtonUI
public void update(Graphics g, JComponent c)
{
AbstractButton b = (AbstractButton) c;
+ ButtonModel m = b.getModel();
if (b.isContentAreaFilled()
- && UIManager.get(getPropertyPrefix() + "gradient") != null
- && !b.getModel().isPressed() && b.isEnabled())
+ && (UIManager.get(getPropertyPrefix() + "gradient") != null)
+ && ! m.isPressed() && ! m.isArmed()
+ && b.isEnabled()
+ && (b.getBackground() instanceof UIResource))
{
MetalUtils.paintGradient(g, 0, 0, c.getWidth(), c.getHeight(),
SwingConstants.VERTICAL,
diff --git a/javax/swing/plaf/metal/MetalComboBoxButton.java b/javax/swing/plaf/metal/MetalComboBoxButton.java
index b8dd95098..3787a98c3 100644
--- a/javax/swing/plaf/metal/MetalComboBoxButton.java
+++ b/javax/swing/plaf/metal/MetalComboBoxButton.java
@@ -112,6 +112,7 @@ public class MetalComboBoxButton
iconOnly = onlyIcon;
listBox = list;
rendererPane = pane;
+ setRolloverEnabled(false);
setEnabled(comboBox.isEnabled());
setFocusable(comboBox.isEnabled());
}
@@ -187,7 +188,7 @@ public class MetalComboBoxButton
*/
public boolean isFocusTraversable()
{
- return !comboBox.isEditable() && comboBox.isEnabled();
+ return false;
}
/**
@@ -198,8 +199,16 @@ public class MetalComboBoxButton
public void setEnabled(boolean enabled)
{
super.setEnabled(enabled);
- // TODO: figure out what this might need to be used for
- // perhaps it has something to do with the button's icon and/or border?
+ if (enabled)
+ {
+ setBackground(comboBox.getBackground());
+ setForeground(comboBox.getForeground());
+ }
+ else
+ {
+ setBackground(UIManager.getColor("ComboBox.disabledBackground"));
+ setForeground(UIManager.getColor("ComboBox.disabledForeground"));
+ }
}
/**
diff --git a/javax/swing/plaf/metal/MetalComboBoxEditor.java b/javax/swing/plaf/metal/MetalComboBoxEditor.java
index fb25644fa..11e415103 100644
--- a/javax/swing/plaf/metal/MetalComboBoxEditor.java
+++ b/javax/swing/plaf/metal/MetalComboBoxEditor.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package javax.swing.plaf.metal;
import java.awt.Component;
+import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
@@ -79,16 +80,31 @@ public class MetalComboBoxEditor extends BasicComboBoxEditor
int h)
{
g.translate(x, y);
- g.setColor(MetalLookAndFeel.getControlDarkShadow());
- g.drawLine(0, 0, w - 1, 0);
- g.drawLine(0, 0, 0, h - 2);
- g.drawLine(0, h - 2, w - 1, h - 2);
- g.setColor(MetalLookAndFeel.getControlHighlight());
- g.drawLine(1, 1, w - 1, 1);
- g.drawLine(1, 1, 1, h - 1);
- g.drawLine(1, h - 1, w - 1, h - 1);
- g.setColor(MetalLookAndFeel.getControl());
- g.drawLine(1, h - 2, 1, h - 2);
+ if (MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme)
+ {
+ g.setColor(MetalLookAndFeel.getControlDarkShadow());
+ g.drawLine(0, 0, w - 1, 0);
+ g.drawLine(0, 0, 0, h - 1);
+ g.drawLine(0, h - 1, w - 1, h - 1);
+ g.setColor(MetalLookAndFeel.getControlShadow());
+ g.drawLine(1, 1, w - 2, 1);
+ g.drawLine(1, 1, 1, h - 2);
+ g.drawLine(1, h - 2, w - 1, h - 2);
+ g.drawLine(w - 1, 1, w - 1, h - 2);
+ }
+ else
+ {
+ g.setColor(MetalLookAndFeel.getControlDarkShadow());
+ g.drawLine(0, 0, w - 1, 0);
+ g.drawLine(0, 0, 0, h - 2);
+ g.drawLine(0, h - 2, w - 1, h - 2);
+ g.setColor(MetalLookAndFeel.getControlHighlight());
+ g.drawLine(1, 1, w - 1, 1);
+ g.drawLine(1, 1, 1, h - 1);
+ g.drawLine(1, h - 1, w - 1, h - 1);
+ g.setColor(MetalLookAndFeel.getControl());
+ g.drawLine(1, h - 2, 1, h - 2);
+ }
g.translate(-x, -y);
}
@@ -125,7 +141,40 @@ public class MetalComboBoxEditor extends BasicComboBoxEditor
// Nothing to do here.
}
}
-
+
+ /**
+ * A special textfield implementation for the MetalComboBoxEditor.
+ */
+ private class EditorTextField extends JTextField
+ {
+ EditorTextField(String s, int columns)
+ {
+ super(s, columns);
+ }
+
+ /**
+ * Tests seem to show that the textfield in MetalComboBoxEditors have
+ * a height + 4.
+ */
+ public Dimension getPreferredSize()
+ {
+ Dimension size = super.getPreferredSize();
+ size.height += 4;
+ return size;
+ }
+
+ /**
+ * Tests seem to show that the textfield in MetalComboBoxEditors have
+ * a height + 4.
+ */
+ public Dimension getMinimumSize()
+ {
+ Dimension size = super.getMinimumSize();
+ size.height += 4;
+ return size;
+ }
+ }
+
/** The editor's border insets. */
protected static Insets editorBorderInsets = new Insets(2, 2, 2, 0);
@@ -134,7 +183,7 @@ public class MetalComboBoxEditor extends BasicComboBoxEditor
*/
public MetalComboBoxEditor()
{
- super();
+ editor = new EditorTextField("", 9);
editor.setBorder(new MetalComboBoxEditorBorder());
}
diff --git a/javax/swing/plaf/metal/MetalComboBoxUI.java b/javax/swing/plaf/metal/MetalComboBoxUI.java
index 0266d34f8..c24c08505 100644
--- a/javax/swing/plaf/metal/MetalComboBoxUI.java
+++ b/javax/swing/plaf/metal/MetalComboBoxUI.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package javax.swing.plaf.metal;
+import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
@@ -130,7 +131,7 @@ public class MetalComboBoxUI extends BasicComboBoxUI
String name = e.getPropertyName();
if (name.equals("editable"))
editablePropertyChanged(e);
- if (name.equals("enabled"))
+ else if (name.equals("enabled"))
{
if (arrowButton instanceof MetalComboBoxButton)
{
@@ -139,6 +140,18 @@ public class MetalComboBoxUI extends BasicComboBoxUI
comboBox.repaint();
}
}
+ else if (name.equals("background"))
+ {
+ Color c = (Color) e.getNewValue();
+ arrowButton.setBackground(c);
+ listBox.setBackground(c);
+ }
+ else if (name.equals("foreground"))
+ {
+ Color c = (Color) e.getNewValue();
+ arrowButton.setForeground(c);
+ listBox.setForeground(c);
+ }
}
}
@@ -306,14 +319,8 @@ public class MetalComboBoxUI extends BasicComboBoxUI
{
d = super.getMinimumSize(c);
Insets arrowMargin = arrowButton.getMargin();
- Insets comboInsets = comboBox.getInsets();
- if (editor instanceof JComponent)
- {
- Insets editorInsets = ((JComponent) editor).getInsets();
- d.height += editorInsets.top + editorInsets.bottom;
- }
d.height += arrowMargin.top + arrowMargin.bottom;
- d.height += comboInsets.top + comboInsets.bottom;
+ d.width += arrowMargin.left + arrowMargin.right;
}
else
{
diff --git a/javax/swing/plaf/metal/MetalDesktopIconUI.java b/javax/swing/plaf/metal/MetalDesktopIconUI.java
index ecbb76e6e..0c1163a8e 100644
--- a/javax/swing/plaf/metal/MetalDesktopIconUI.java
+++ b/javax/swing/plaf/metal/MetalDesktopIconUI.java
@@ -1,5 +1,5 @@
/* MetalDesktopIconUI.java
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -50,10 +50,6 @@ public class MetalDesktopIconUI
extends BasicDesktopIconUI
{
- // FIXME: maybe replace by a Map of instances when this becomes stateful
- /** The shared UI instance for MetalDesktopIcons */
- private static MetalDesktopIconUI instance = null;
-
/**
* Constructs a new instance of <code>MetalDesktopIconUI</code>.
*/
@@ -63,16 +59,14 @@ public class MetalDesktopIconUI
}
/**
- * Returns a shared instance of <code>MetalDesktopIconUI</code>.
+ * Returns a new <code>MetalDesktopIconUI</code> instance.
*
- * @param component the component for which we return an UI instance
+ * @param component the component (ignored).
*
- * @return A shared instance of <code>MetalDesktopIconUI</code>.
+ * @return A new <code>MetalDesktopIconUI</code> instance.
*/
public static ComponentUI createUI(JComponent component)
{
- if (instance == null)
- instance = new MetalDesktopIconUI();
- return instance;
+ return new MetalDesktopIconUI();
}
}
diff --git a/javax/swing/plaf/metal/MetalInternalFrameTitlePane.java b/javax/swing/plaf/metal/MetalInternalFrameTitlePane.java
index 534f0ca34..f74828e56 100644
--- a/javax/swing/plaf/metal/MetalInternalFrameTitlePane.java
+++ b/javax/swing/plaf/metal/MetalInternalFrameTitlePane.java
@@ -93,7 +93,11 @@ public class MetalInternalFrameTitlePane extends BasicInternalFrameTitlePane
public void propertyChange(PropertyChangeEvent e)
{
String propName = e.getPropertyName();
- if (propName.equals("JInternalFrame.isPalette"))
+ if (e.getPropertyName().equals(JInternalFrame.FRAME_ICON_PROPERTY))
+ {
+ title.setIcon( frame.getFrameIcon() );
+ }
+ else if (propName.equals("JInternalFrame.isPalette"))
{
if (e.getNewValue().equals(Boolean.TRUE))
setPalette(true);
@@ -262,7 +266,7 @@ public class MetalInternalFrameTitlePane extends BasicInternalFrameTitlePane
paletteTitleHeight = UIManager.getInt("InternalFrame.paletteTitleHeight");
paletteCloseIcon = UIManager.getIcon("InternalFrame.paletteCloseIcon");
minIcon = MetalIconFactory.getInternalFrameAltMaximizeIcon(16);
-
+
title = new JLabel(frame.getTitle(),
MetalIconFactory.getInternalFrameDefaultMenuIcon(),
SwingConstants.LEFT);
@@ -383,8 +387,8 @@ public class MetalInternalFrameTitlePane extends BasicInternalFrameTitlePane
paintPalette(g);
else
{
- paintTitleBackground(g);
- paintChildren(g);
+ paintTitleBackground(g);
+ paintChildren(g);
Dimension d = getSize();
if (frame.isSelected())
g.setColor(MetalLookAndFeel.getPrimaryControlDarkShadow());
diff --git a/javax/swing/plaf/metal/MetalLookAndFeel.java b/javax/swing/plaf/metal/MetalLookAndFeel.java
index 38b357219..7a973d46e 100644
--- a/javax/swing/plaf/metal/MetalLookAndFeel.java
+++ b/javax/swing/plaf/metal/MetalLookAndFeel.java
@@ -1204,7 +1204,7 @@ public class MetalLookAndFeel extends BasicLookAndFeel
"Table.focusCellForeground", getControlTextColor(),
"Table.foreground", getControlTextColor(),
"Table.focusCellHighlightBorder",
- new BorderUIResource.LineBorderUIResource(getControlShadow()),
+ new BorderUIResource.LineBorderUIResource(getFocusColor()),
"Table.focusCellBackground", getWindowBackground(),
"Table.gridColor", getControlDarkShadow(),
"Table.selectionBackground", new ColorUIResource(204, 204, 255),
diff --git a/javax/swing/plaf/metal/MetalRootPaneUI.java b/javax/swing/plaf/metal/MetalRootPaneUI.java
index 23051e9bc..6cabc7e86 100644
--- a/javax/swing/plaf/metal/MetalRootPaneUI.java
+++ b/javax/swing/plaf/metal/MetalRootPaneUI.java
@@ -47,11 +47,11 @@ import java.awt.Graphics;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.LayoutManager2;
+import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.ActionEvent;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowFocusListener;
+import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import javax.swing.AbstractAction;
@@ -70,6 +70,7 @@ import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.AbstractBorder;
+import javax.swing.event.MouseInputAdapter;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicRootPaneUI;
@@ -191,6 +192,50 @@ public class MetalRootPaneUI
*/
private static class MetalTitlePane extends JComponent
{
+
+ /**
+ * Handles dragging of the title pane and moves the window accordingly.
+ */
+ private class MouseHandler
+ extends MouseInputAdapter
+ {
+ /**
+ * The point where the dragging started.
+ */
+ Point lastDragLocation;
+
+ /**
+ * Receives notification when the mouse gets pressed on the title pane.
+ * This updates the lastDragLocation.
+ *
+ * @param ev the mouse event
+ */
+ public void mousePressed(MouseEvent ev)
+ {
+ lastDragLocation = ev.getPoint();
+ }
+
+ /**
+ * Receives notification when the mouse is dragged on the title pane.
+ * This will move the nearest window accordingly.
+ *
+ * @param ev the mouse event
+ */
+ public void mouseDragged(MouseEvent ev)
+ {
+ Point dragLocation = ev.getPoint();
+ int deltaX = dragLocation.x - lastDragLocation.x;
+ int deltaY = dragLocation.y - lastDragLocation.y;
+ Window window = SwingUtilities.getWindowAncestor(rootPane);
+ Point loc = window.getLocation();
+ window.setLocation(loc.x + deltaX, loc.y + deltaY);
+ // Note that we do not update the lastDragLocation. This is because
+ // we move the underlying window while dragging the component, which
+ // results in having the same lastDragLocation under the mouse while
+ // dragging.
+ }
+ }
+
/**
* The Action responsible for closing the JInternalFrame.
*/
@@ -255,6 +300,45 @@ public class MetalRootPaneUI
}
/**
+ * This action is performed when the iconify button is pressed.
+ */
+ private class IconifyAction
+ extends AbstractAction
+ {
+
+ public void actionPerformed(ActionEvent event)
+ {
+ Window w = SwingUtilities.getWindowAncestor(rootPane);
+ if (w instanceof Frame)
+ {
+ Frame f = (Frame) w;
+ int state = f.getExtendedState();
+ f.setExtendedState(Frame.ICONIFIED);
+ }
+ }
+
+ }
+
+ /**
+ * This action is performed when the maximize button is pressed.
+ */
+ private class MaximizeAction
+ extends AbstractAction
+ {
+
+ public void actionPerformed(ActionEvent event)
+ {
+ Window w = SwingUtilities.getWindowAncestor(rootPane);
+ if (w instanceof Frame)
+ {
+ Frame f = (Frame) w;
+ int state = f.getExtendedState();
+ f.setExtendedState(Frame.MAXIMIZED_BOTH);
+ }
+ }
+ }
+
+ /**
* This helper class is used to create the minimize, maximize and close
* buttons in the top right corner of the Title Pane. These buttons are
* special since they cannot be given focus and have no border.
@@ -499,23 +583,16 @@ public class MetalRootPaneUI
private void installListeners()
{
- Window window = SwingUtilities.getWindowAncestor(rootPane);
- window.addWindowFocusListener(new WindowFocusListener()
- {
- public void windowGainedFocus(WindowEvent ev)
- {
- repaint();
- }
- public void windowLostFocus(WindowEvent ev)
- {
- repaint();
- }
- });
+ MouseInputAdapter mouseHandler = new MouseHandler();
+ addMouseListener(mouseHandler);
+ addMouseMotionListener(mouseHandler);
}
private void createActions()
{
closeAction = new CloseAction();
+ iconifyAction = new IconifyAction();
+ maximizeAction = new MaximizeAction();
}
private void assembleSystemMenu()
@@ -699,6 +776,21 @@ public class MetalRootPaneUI
*/
private Dimension prefSize;
+ /**
+ * The title pane for l&f decorated frames.
+ */
+ private MetalTitlePane titlePane;
+
+ /**
+ * Creates a new MetalRootLayout.
+ *
+ * @param tp the title pane
+ */
+ MetalRootLayout(MetalTitlePane tp)
+ {
+ titlePane = tp;
+ }
+
public void addLayoutComponent(Component component, Object constraints)
{
// Nothing to do here.
@@ -747,12 +839,8 @@ public class MetalRootPaneUI
{
JRootPane rp = (JRootPane) parent;
JLayeredPane layeredPane = rp.getLayeredPane();
- Component contentPane = layeredPane.getComponent(0);
- Component titlePane = layeredPane.getComponent(1);
- Component menuBar = null;
- if (layeredPane.getComponentCount() > 2
- && layeredPane.getComponent(2) instanceof JMenuBar)
- menuBar = layeredPane.getComponent(2);
+ Component contentPane = rp.getContentPane();
+ Component menuBar = rp.getJMenuBar();
// We must synchronize here, otherwise we cannot guarantee that the
// prefSize is still non-null when returning.
@@ -789,12 +877,8 @@ public class MetalRootPaneUI
{
JRootPane rp = (JRootPane) parent;
JLayeredPane layeredPane = rp.getLayeredPane();
- Component contentPane = layeredPane.getComponent(0);
- Component titlePane = layeredPane.getComponent(1);
- Component menuBar = null;
- if (layeredPane.getComponentCount() > 2
- && layeredPane.getComponent(2) instanceof JMenuBar)
- menuBar = layeredPane.getComponent(2);
+ Component contentPane = rp.getContentPane();
+ Component menuBar = rp.getJMenuBar();
Component glassPane = rp.getGlassPane();
if (glassPaneBounds == null || layeredPaneBounds == null
@@ -937,6 +1021,7 @@ public class MetalRootPaneUI
*/
public void propertyChange(PropertyChangeEvent ev)
{
+ super.propertyChange(ev);
String propertyName = ev.getPropertyName();
if (propertyName.equals("windowDecorationStyle"))
{
@@ -958,12 +1043,14 @@ public class MetalRootPaneUI
private void installWindowDecorations(JRootPane rp)
{
rp.setBorder(new MetalFrameBorder());
- rp.setLayout(new MetalRootLayout());
+ MetalTitlePane titlePane = new MetalTitlePane(rp);
+ rp.setLayout(new MetalRootLayout(titlePane));
// We should have a contentPane already.
- assert rp.getLayeredPane().getComponentCount() == 1
+ assert rp.getLayeredPane().getComponentCount() > 0
: "We should have a contentPane already";
- rp.getLayeredPane().add(new MetalTitlePane(rp),
- JLayeredPane.FRAME_CONTENT_LAYER);
+
+ rp.getLayeredPane().add(titlePane,
+ JLayeredPane.FRAME_CONTENT_LAYER, 1);
}
/**
@@ -975,6 +1062,14 @@ public class MetalRootPaneUI
private void uninstallWindowDecorations(JRootPane rp)
{
rp.setBorder(null);
- rp.getLayeredPane().remove(1);
+ JLayeredPane lp = rp.getLayeredPane();
+ for (int i = lp.getComponentCount() - 1; i >= 0; --i)
+ {
+ if (lp.getComponent(i) instanceof MetalTitlePane)
+ {
+ lp.remove(i);
+ break;
+ }
+ }
}
}
diff --git a/javax/swing/plaf/metal/MetalSliderUI.java b/javax/swing/plaf/metal/MetalSliderUI.java
index 9b2f45cc7..f97717f31 100644
--- a/javax/swing/plaf/metal/MetalSliderUI.java
+++ b/javax/swing/plaf/metal/MetalSliderUI.java
@@ -1,5 +1,5 @@
/* MetalSliderUI.java
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -210,7 +210,7 @@ public class MetalSliderUI extends BasicSliderUI
{
int trackX = trackRect.x;
int trackY = trackRect.y + (trackRect.height - getTrackWidth()) / 2;
- int trackW = trackRect.width - 1;
+ int trackW = trackRect.width;
int trackH = getTrackWidth();
// draw border
@@ -264,7 +264,7 @@ public class MetalSliderUI extends BasicSliderUI
int trackX = trackRect.x + (trackRect.width - getTrackWidth()) / 2;
int trackY = trackRect.y;
int trackW = getTrackWidth();
- int trackH = trackRect.height - 1;
+ int trackH = trackRect.height;
if (slider.isEnabled())
BasicGraphicsUtils.drawEtchedRect(g, trackX, trackY, trackW, trackH,
darkShadowColor, shadowColor, darkShadowColor, highlightColor);
diff --git a/javax/swing/plaf/metal/MetalTabbedPaneUI.java b/javax/swing/plaf/metal/MetalTabbedPaneUI.java
index c6c46ffe6..39dec3d66 100644
--- a/javax/swing/plaf/metal/MetalTabbedPaneUI.java
+++ b/javax/swing/plaf/metal/MetalTabbedPaneUI.java
@@ -47,6 +47,7 @@ import javax.swing.JComponent;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
/**
@@ -101,6 +102,17 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
// do nothing, because the selected tab does not have extra padding in
// the MetalLookAndFeel
}
+
+ /**
+ * Overridden because tab runs are only normalized for TOP and BOTTOM
+ * tab placement in the Metal L&F.
+ */
+ protected void normalizeTabRuns(int tabPlacement, int tabCount, int start,
+ int max)
+ {
+ if (tabPlacement == TOP || tabPlacement == BOTTOM)
+ super.normalizeTabRuns(tabPlacement, tabCount, start, max);
+ }
}
/**
@@ -125,7 +137,12 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
/** The graphics to draw the highlight below the tab. */
private Graphics hg;
-
+
+ /**
+ * Indicates if the tabs are having their background filled.
+ */
+ private boolean tabsOpaque;
+
/**
* Constructs a new instance of MetalTabbedPaneUI.
*/
@@ -153,7 +170,7 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
*/
protected LayoutManager createLayoutManager()
{
- return super.createLayoutManager();
+ return new TabbedPaneLayout();
}
/**
@@ -172,16 +189,24 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex,
int x, int y, int w, int h, boolean isSelected)
{
- if (tabPlacement == TOP)
- paintTopTabBorder(tabIndex, g, x, y, w, h, 0, 0, isSelected);
- else if (tabPlacement == LEFT)
- paintLeftTabBorder(tabIndex, g, x, y, w, h, 0, 0, isSelected);
- else if (tabPlacement == BOTTOM)
- paintBottomTabBorder(tabIndex, g, x, y, w, h, 0, 0, isSelected);
- else if (tabPlacement == RIGHT)
- paintRightTabBorder(tabIndex, g, x, y, w, h, 0, 0, isSelected);
- else
- throw new AssertionError("Unrecognised 'tabPlacement' argument.");
+ int bottom = y + h - 1;
+ int right = x + w - 1;
+
+ switch (tabPlacement)
+ {
+ case LEFT:
+ paintLeftTabBorder(tabIndex, g, x, y, w, h, bottom, right, isSelected);
+ break;
+ case BOTTOM:
+ paintBottomTabBorder(tabIndex, g, x, y, w, h, bottom, right, isSelected);
+ break;
+ case RIGHT:
+ paintRightTabBorder(tabIndex, g, x, y, w, h, bottom, right, isSelected);
+ break;
+ case TOP:
+ default:
+ paintTopTabBorder(tabIndex, g, x, y, w, h, bottom, right, isSelected);
+ }
}
/**
@@ -194,35 +219,90 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
* @param y the y-coordinate for the tab's bounding rectangle.
* @param w the width for the tab's bounding rectangle.
* @param h the height for the tab's bounding rectangle.
- * @param btm ???
- * @param rght ???
+ * @param btm the y coordinate of the bottom border
+ * @param rght the x coordinate of the right border
* @param isSelected indicates whether the tab is selected.
*/
protected void paintTopTabBorder(int tabIndex, Graphics g, int x, int y,
int w, int h, int btm, int rght, boolean isSelected)
{
- int currentRun = getRunForTab(tabPane.getTabCount(), tabIndex);
+ int tabCount = tabPane.getTabCount();
+ int currentRun = getRunForTab(tabCount, tabIndex);
+ int right = w - 1;
+ int bottom = h - 1;
+
+ // Paint gap.
if (shouldFillGap(currentRun, tabIndex, x, y))
{
g.translate(x, y);
- g.setColor(getColorForGap(currentRun, x, y));
+ g.setColor(getColorForGap(currentRun, x, y + 1));
g.fillRect(1, 0, 5, 3);
g.fillRect(1, 3, 2, 2);
g.translate(-x, -y);
}
-
- if (isSelected)
- {
- g.setColor(MetalLookAndFeel.getControlHighlight());
- g.drawLine(x + 1, y + h, x + 1, y + 6);
- g.drawLine(x + 1, y + 6, x + 6, y + 1);
- g.drawLine(x + 6, y + 1, x + w - 1, y + 1);
- }
- g.setColor(MetalLookAndFeel.getControlDarkShadow());
- g.drawLine(x, y + h - 1, x, y + 6);
- g.drawLine(x, y + 6, x + 6, y);
- g.drawLine(x + 6, y, x + w, y);
- g.drawLine(x + w, y, x + w, y + h - 1);
+
+ g.translate(x, y);
+
+ boolean isOcean = MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme;
+ Color oceanSelectedBorder =
+ UIManager.getColor("TabbedPane.borderHightlightColor");
+ if (isOcean && isSelected)
+ g.setColor(oceanSelectedBorder);
+ else
+ g.setColor(darkShadow);
+
+ // Slant
+ g.drawLine(1, 5, 6, 0);
+ // Top.
+ g.drawLine(6, 0, right, 0);
+ // Right.
+ int lastIndex = lastTabInRun(tabCount, currentRun);
+ if (tabIndex == lastIndex)
+ g.drawLine(right, 1, right, bottom);
+ // Left.
+ int selectedIndex = tabPane.getSelectedIndex();
+ if (isOcean && tabIndex - 1 == selectedIndex
+ && currentRun == getRunForTab(tabCount, selectedIndex))
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ if (tabIndex != tabRuns[runCount - 1])
+ {
+ if (isOcean && isSelected)
+ {
+ g.drawLine(0, 6, 0, bottom);
+ g.setColor(darkShadow);
+ g.drawLine(0, 0, 0, 5);
+ }
+ else
+ {
+ g.drawLine(0, 0, 0, bottom);
+ }
+ }
+ else
+ {
+ g.drawLine(0, 6, 0, bottom);
+ }
+
+ // Paint the highlight.
+ g.setColor(isSelected ? selectHighlight : highlight);
+ // Slant.
+ g.drawLine(1, 6, 6, 1);
+ // Top.
+ g.drawLine(6, 1, right, 1);
+ // Left.
+ g.drawLine(1, 6, 1, bottom);
+ int firstIndex = tabRuns[currentRun];
+ if (tabIndex == firstIndex && tabIndex != tabRuns[runCount - 1])
+ {
+ if (tabPane.getSelectedIndex() == tabRuns[currentRun + 1])
+ g.setColor(selectHighlight);
+ else
+ g.setColor(highlight);
+ g.drawLine(1, 0, 1, 4);
+ }
+
+ g.translate(-x, -y);
}
/**
@@ -242,18 +322,115 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
protected void paintLeftTabBorder(int tabIndex, Graphics g, int x, int y,
int w, int h, int btm, int rght, boolean isSelected)
{
- if (isSelected)
- {
- g.setColor(MetalLookAndFeel.getControlHighlight());
- g.drawLine(x + 1, y + h, x + 1, y + 6);
- g.drawLine(x + 1, y + 6, x + 6, y + 1);
- g.drawLine(x + 6, y + 1, x + w - 1, y + 1);
- }
- g.setColor(MetalLookAndFeel.getControlDarkShadow());
- g.drawLine(x, y + h, x, y + 6);
- g.drawLine(x, y + 6, x + 6, y);
- g.drawLine(x + 6, y, x + w - 1, y);
- g.drawLine(x, y + h, x + w - 1, y + h);
+ g.translate(x, y);
+ int bottom = h - 1;
+ int right = w - 1;
+
+
+ int tabCount = tabPane.getTabCount();
+ int currentRun = getRunForTab(tabCount, tabIndex);
+ int firstIndex = tabRuns[currentRun];
+
+ // Paint the part of the above tab.
+ if (tabIndex != firstIndex && tabIndex > 0 && tabsOpaque)
+ {
+ Color c;
+ if (tabPane.getSelectedIndex() == tabIndex - 1)
+ c = selectColor;
+ else
+ c = getUnselectedBackground(tabIndex - 1);
+ g.setColor(c);
+ g.fillRect(2, 0, 4, 3);
+ g.drawLine(2, 3, 2, 3);
+ }
+
+ // Paint the highlight.
+ boolean isOcean = MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme;
+ if (isOcean)
+ {
+ g.setColor(isSelected ? selectHighlight : MetalLookAndFeel.getWhite());
+ }
+ else
+ {
+ g.setColor(isSelected ? selectHighlight : highlight);
+ }
+ // Slant.
+ g.drawLine(1, 6, 6, 1);
+ // Left.
+ g.drawLine(1, 6, 1, bottom);
+ // Top.
+ g.drawLine(6, 1, right, 1);
+ if (tabIndex != firstIndex)
+ {
+ if (isOcean)
+ {
+ g.setColor(MetalLookAndFeel.getWhite());
+ }
+ g.drawLine(1, 0, 1, 4);
+ }
+
+ // Paint border.
+ Color oceanSelectedBorder =
+ UIManager.getColor("TabbedPane.borderHightlightColor");
+ if (isOcean && isSelected)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ else
+ {
+ g.setColor(darkShadow);
+ }
+
+ // Slant.
+ g.drawLine(1, 5, 6, 0);
+ // Top.
+ g.drawLine(6, 0, right, 0);
+ // Bottom.
+ int lastIndex = lastTabInRun(tabCount, currentRun);
+ if (tabIndex == lastIndex)
+ {
+ g.drawLine(0, bottom, right, bottom);
+ }
+ // Left.
+ if (isOcean)
+ {
+ if (tabPane.getSelectedIndex() == tabIndex - 1)
+ {
+ g.drawLine(0, 5, 0, bottom);
+ g.setColor(oceanSelectedBorder);
+ g.drawLine(0, 0, 0, 5);
+ }
+ else if (isSelected)
+ {
+ g.drawLine(0, 5, 0, bottom);
+ if (tabIndex != 0)
+ {
+ g.setColor(darkShadow);
+ g.drawLine(0, 0, 0, 5);
+ }
+ }
+ else if (tabIndex != firstIndex)
+ {
+ g.drawLine(0, 0, 0, bottom);
+ }
+ else
+ {
+ g.drawLine(0, 6, 0, bottom);
+ }
+ }
+ else
+ {
+ if (tabIndex != firstIndex)
+ {
+ g.drawLine(0, 0, 0, bottom);
+ }
+ else
+ {
+ g.drawLine(0, 6, 0, bottom);
+ }
+ }
+
+ g.translate(-x, -y);
}
/**
@@ -273,17 +450,92 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
protected void paintRightTabBorder(int tabIndex, Graphics g, int x, int y,
int w, int h, int btm, int rght, boolean isSelected)
{
- if (isSelected)
- {
- g.setColor(MetalLookAndFeel.getControlHighlight());
- g.drawLine(x, y + 1, x + w - 7, y + 1);
- g.drawLine(x + w - 7, y + 1, x + w - 1, y + 7);
- }
- g.setColor(MetalLookAndFeel.getControlDarkShadow());
- g.drawLine(x, y, x + w - 7, y);
- g.drawLine(x + w - 7, y, x + w - 1, y + 6);
- g.drawLine(x + w - 1, y + 6, x + w - 1, y + h - 1);
- g.drawLine(x + w - 1, y + h, x, y + h);
+ g.translate(x, y);
+ int bottom = h - 1;
+ int right = w - 1;
+
+ int tabCount = tabPane.getTabCount();
+ int currentRun = getRunForTab(tabCount, tabIndex);
+ int firstIndex = tabRuns[currentRun];
+
+ // Paint part of the above tab.
+ if (tabIndex != firstIndex && tabIndex > 0 && tabsOpaque)
+ {
+ Color c;
+ if (tabPane.getSelectedIndex() == tabIndex - 1)
+ c = UIManager.getColor("TabbedPane.tabAreaBackground");
+ else
+ c = getUnselectedBackground(tabIndex - 1);
+ g.fillRect(right - 5, 0, 5, 3);
+ g.fillRect(right - 2, 3, 2, 2);
+ }
+
+ // Paint highlight.
+ g.setColor(isSelected ? selectHighlight : highlight);
+
+ // Slant.
+ g.drawLine(right - 6, 1, right - 1, 6);
+ // Top.
+ g.drawLine(0, 1, right - 6, 1);
+ // Left.
+ if (! isSelected)
+ {
+ g.drawLine(0, 1, 0, bottom);
+ }
+
+ // Paint border.
+ boolean isOcean = MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme;
+ Color oceanSelectedBorder =
+ UIManager.getColor("TabbedPane.borderHightlightColor");
+ if (isOcean && isSelected)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ else
+ {
+ g.setColor(darkShadow);
+ }
+
+ // Bottom.
+ int lastIndex = lastTabInRun(tabCount, currentRun);
+ if (tabIndex == lastIndex)
+ {
+ g.drawLine(0, bottom, right, bottom);
+ }
+ // Slant.
+ if (isOcean && tabPane.getSelectedIndex() == tabIndex - 1)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ g.drawLine(right - 6, 0, right, 6);
+ // Top.
+ g.drawLine(0, 0, right - 6, 0);
+ // Right.
+ if (isOcean && isSelected)
+ {
+ g.drawLine(right, 6, right, bottom);
+ if (tabIndex != firstIndex)
+ {
+ g.setColor(darkShadow);
+ g.drawLine(right, 0, right, 5);
+ }
+ }
+ else if (isOcean && tabPane.getSelectedIndex() == tabIndex - 1)
+ {
+ g.setColor(oceanSelectedBorder);
+ g.drawLine(right, 0, right, 6);
+ g.setColor(darkShadow);
+ g.drawLine(right, 6, right, bottom);
+ }
+ else if (tabIndex != firstIndex)
+ {
+ g.drawLine(right, 0, right, bottom);
+ }
+ else
+ {
+ g.drawLine(right, 6, right, bottom);
+ }
+ g.translate(-x, -y);
}
/**
@@ -303,27 +555,94 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
protected void paintBottomTabBorder(int tabIndex, Graphics g, int x, int y,
int w, int h, int btm, int rght, boolean isSelected)
{
- int currentRun = getRunForTab(tabPane.getTabCount(), tabIndex);
+ int bottom = h - 1;
+ int right = w - 1;
+
+ int tabCount = tabPane.getTabCount();
+ int currentRun = getRunForTab(tabCount, tabIndex);
+ // Paint gap if necessary.
if (shouldFillGap(currentRun, tabIndex, x, y))
{
g.translate(x, y);
g.setColor(getColorForGap(currentRun, x, y));
- g.fillRect(1, h - 5, 3, 5);
- g.fillRect(4, h - 2, 2, 2);
+ g.fillRect(1, bottom - 4, 3, 5);
+ g.fillRect(4, bottom - 1, 2, 2);
g.translate(-x, -y);
}
-
- if (isSelected)
- {
- g.setColor(MetalLookAndFeel.getControlHighlight());
- g.drawLine(x + 1, y, x + 1, y + h - 7);
- g.drawLine(x + 1, y + h - 7, x + 7, y + h - 1);
- }
- g.setColor(MetalLookAndFeel.getControlDarkShadow());
- g.drawLine(x, y, x, y + h - 7);
- g.drawLine(x, y + h - 7, x + 6, y + h - 1);
- g.drawLine(x + 6, y + h - 1, x + w, y + h - 1);
- g.drawLine(x + w, y + h - 1, x + w, y);
+
+ g.translate(x, y);
+
+ // Paint border.
+ boolean isOcean = MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme;
+ Color oceanSelectedBorder =
+ UIManager.getColor("TabbedPane.borderHightlightColor");
+ if (isOcean && isSelected)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ else
+ {
+ g.setColor(darkShadow);
+ }
+ // Slant.
+ g.drawLine(1, bottom - 5, 6, bottom);
+ // Bottom.
+ g.drawLine(6, bottom, right, bottom);
+ // Right.
+ int lastIndex = lastTabInRun(tabCount, currentRun);
+ if (tabIndex == lastIndex)
+ {
+ g.drawLine(right, 0, right, bottom);
+ }
+ // Left.
+ if (isOcean && isSelected)
+ {
+ g.drawLine(0, 0, 0, bottom - 5);
+ if ((currentRun == 0 && tabIndex != 0)
+ || (currentRun > 0 && tabIndex != tabRuns[currentRun - 1]))
+ {
+ g.setColor(darkShadow);
+ g.drawLine(0, bottom - 5, 0, bottom);
+ }
+ }
+ else
+ {
+ if (isOcean && tabIndex == tabPane.getSelectedIndex()+ 1)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ if (tabIndex != tabRuns[runCount- 1])
+ {
+ g.drawLine(0, 0, 0, bottom);
+ }
+ else
+ {
+ g.drawLine(0, 0, 0, bottom - 6);
+ }
+ }
+
+ // Paint highlight.
+ g.setColor(isSelected ? selectHighlight : highlight);
+ // Slant.
+ g.drawLine(1, bottom - 6, 6, bottom - 1);
+ // Left.
+ g.drawLine(1, 0, 1, bottom - 6);
+
+ int firstIndex = tabRuns[currentRun];
+ if (tabIndex == firstIndex && tabIndex != tabRuns[runCount - 1])
+ {
+ if (tabPane.getSelectedIndex() == tabRuns[currentRun + 1])
+ {
+ g.setColor(selectHighlight);
+ }
+ else
+ {
+ g.setColor(highlight);
+ }
+ g.drawLine(1, bottom - 4, 1, bottom);
+ }
+
+ g.translate(-x, -y);
}
/**
@@ -343,42 +662,29 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
int tabIndex, int x, int y, int w, int h, boolean isSelected)
{
if (isSelected)
- g.setColor(UIManager.getColor("TabbedPane.selected"));
+ g.setColor(selectColor);
else
- {
- // This is only present in the OceanTheme, so we must check if it
- // is actually there
- Color background = UIManager.getColor("TabbedPane.unselectedBackground");
- if (background == null)
- background = UIManager.getColor("TabbedPane.background");
- g.setColor(background);
- }
- int[] px, py;
- if (tabPlacement == TOP)
- {
- px = new int[] {x + 6, x + w - 1, x + w -1, x + 2, x + 2};
- py = new int[] {y + 2, y + 2, y + h - 1, y + h -1, y + 6};
- }
- else if (tabPlacement == LEFT)
- {
- px = new int[] {x + 6, x + w - 1, x + w -1, x + 2, x + 2};
- py = new int[] {y + 2, y + 2, y + h - 1, y + h -1, y + 6};
- }
- else if (tabPlacement == BOTTOM)
- {
- px = new int[] {x + 2, x + w - 1, x + w -1, x + 8, x + 2};
- py = new int[] {y, y, y + h - 1, y + h -1, y + h - 7};
- }
- else if (tabPlacement == RIGHT)
- {
- px = new int[] {x + 2, x + w - 7, x + w - 1, x + w - 1, x + 2};
- py = new int[] {y + 2, y + 2, y + 7, y + h -1, y + h - 1};
- }
- else
- throw new AssertionError("Unrecognised 'tabPlacement' argument.");
- g.fillPolygon(px, py, 5);
- hg = g;
- paintHighlightBelowTab();
+ g.setColor(getUnselectedBackground(tabIndex));
+
+ switch (tabPlacement)
+ {
+ case LEFT:
+ g.fillRect(x + 5, y + 1, w - 5, h - 1);
+ g.fillRect(x + 2, y + 4, 3, h - 4);
+ break;
+ case BOTTOM:
+ g.fillRect(x + 2, y, w - 2, h - 3);
+ g.fillRect(x + 5, y + h - 4, w - 5, 3);
+ break;
+ case RIGHT:
+ g.fillRect(x, y + 1, w - 4, h - 1);
+ g.fillRect(x + w - 4, y + 5, 3, h - 5);
+ break;
+ case TOP:
+ default:
+ g.fillRect(x + 4, y + 2, w - 4, h - 2);
+ g.fillRect(x + 2, y + 5, 2, h - 5);
+ }
}
/**
@@ -408,6 +714,7 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
selectColor = UIManager.getColor("TabbedPane.selected");
selectHighlight = UIManager.getColor("TabbedPane.selectHighlight");
tabAreaBackground = UIManager.getColor("TabbedPane.tabAreaBackground");
+ tabsOpaque = UIManager.getBoolean("TabbedPane.tabsOpaque");
minTabWidth = 0;
}
@@ -487,4 +794,354 @@ public class MetalTabbedPaneUI extends BasicTabbedPaneUI
// false because tab runs are not rotated in the MetalLookAndFeel
return false;
}
+
+ protected int calculateMaxTabHeight(int tabPlacement)
+ {
+ // FIXME: Why is this overridden?
+ return super.calculateMaxTabHeight(tabPlacement);
+ }
+
+ /**
+ * Returns the amount of overlay among the tabs. In
+ * the Metal L&F the overlay for LEFT and RIGHT placement
+ * is half of the maxTabHeight. For TOP and BOTTOM placement
+ * the tabs do not overlay.
+ *
+ * @param tabPlacement the placement
+ *
+ * @return the amount of overlay among the tabs
+ */
+ protected int getTabRunOverlay(int tabPlacement)
+ {
+ int overlay = 0;
+ if (tabPlacement == LEFT || tabPlacement == RIGHT)
+ {
+ int maxHeight = calculateMaxTabHeight(tabPlacement);
+ overlay = maxTabHeight / 2;
+ }
+ return overlay;
+ }
+
+ /**
+ * Paints the upper edge of the content border.
+ *
+ * @param g the graphics to use for painting
+ * @param tabPlacement the tab placement
+ * @param selectedIndex the index of the selected tab
+ * @param x the upper left coordinate of the content area
+ * @param y the upper left coordinate of the content area
+ * @param w the width of the content area
+ * @param h the height of the content area
+ */
+ protected void paintContentBorderTopEdge(Graphics g, int tabPlacement,
+ int selectedIndex, int x, int y,
+ int w, int h)
+ {
+ Color oceanSelectedBorder =
+ UIManager.getColor("TabbedPane.borderHightlightColor");
+ boolean isOcean = MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme;
+ if (isOcean)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ else
+ {
+ g.setColor(selectHighlight);
+ }
+
+ Rectangle rect = selectedIndex < 0 ? null :
+ getTabBounds(selectedIndex, calcRect);
+
+ // If tabs are not placed on TOP, or if the selected tab is not in the
+ // run directly above the content or the selected tab is not visible,
+ // then we draw an unbroken line.
+ if (tabPlacement != TOP || selectedIndex < 0
+ || rect.y + rect.height + 1 < y || rect.x < x ||rect.x > x + w)
+ {
+ g.drawLine(x, y, x + w - 2, y);
+ if (isOcean && tabPlacement == TOP)
+ {
+ g.setColor(MetalLookAndFeel.getWhite());
+ g.drawLine(x, y + 1, x + w - 2, y + 1);
+ }
+ }
+ else
+ {
+ boolean isLast = isLastTabInRun(selectedIndex);
+ if (isLast)
+ {
+ g.drawLine(x, y, rect.x + 1, y);
+ }
+ else
+ {
+ g.drawLine(x, y, rect.x, y);
+ }
+
+ int right = x + w - 1;
+ if (rect.x + rect.width < right - 1)
+ {
+ if (isLast)
+ {
+ g.drawLine(rect.x + rect.width - 1, y, right - 1, y);
+ }
+ else
+ {
+ g.drawLine(rect.x + rect.width, y, right - 1, y);
+ }
+ }
+ else
+ {
+ g.setColor(shadow);
+ g.drawLine(x + w - 2, y, x + w - 2, y);
+ }
+
+ // When in OceanTheme, draw another white line.
+ if (isOcean)
+ {
+ g.setColor(MetalLookAndFeel.getWhite());
+ if (isLast)
+ {
+ g.drawLine(x, y + 1, rect.x + 1, y + 1);
+ }
+ else
+ {
+ g.drawLine(x, y + 1, rect.x, y + 1);
+ }
+
+ if (rect.x + rect.width < right - 1)
+ {
+ if (isLast)
+ {
+ g.drawLine(rect.x + rect.width - 1, y + 1, right - 1,
+ y + 1);
+ }
+ else
+ {
+ g.drawLine(rect.x + rect.width, y + 1, right - 1, y + 1);
+ }
+ }
+ else
+ {
+ g.setColor(shadow);
+ g.drawLine(x + w - 2, y + 1, x + w - 2, y + 1);
+ }
+ }
+ }
+ }
+
+ /**
+ * Paints the lower edge of the content border.
+ *
+ * @param g the graphics to use for painting
+ * @param tabPlacement the tab placement
+ * @param selectedIndex the index of the selected tab
+ * @param x the upper left coordinate of the content area
+ * @param y the upper left coordinate of the content area
+ * @param w the width of the content area
+ * @param h the height of the content area
+ */
+ protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement,
+ int selectedIndex, int x, int y,
+ int w, int h)
+ {
+ g.setColor(darkShadow);
+
+ // If tabs are not placed on BOTTOM, or if the selected tab is not in the
+ // run directly below the content or the selected tab is not visible,
+ // then we draw an unbroken line.
+ Rectangle rect = selectedIndex < 0 ? null :
+ getTabBounds(selectedIndex, calcRect);
+ boolean isOcean = MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme;
+ Color oceanSelectedBorder =
+ UIManager.getColor("TabbedPane.borderHightlightColor");
+ if (tabPlacement != BOTTOM || selectedIndex < 0 || rect.y - 1 > h
+ || rect.x < x || rect.x > x + w)
+ {
+ if (isOcean && tabPlacement == BOTTOM)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);
+ }
+ else
+ {
+ boolean isLast = isLastTabInRun(selectedIndex);
+ if (isOcean)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+
+ int bottom = y + h - 1;
+ int right = x + w - 1;
+ if (isLast)
+ {
+ g.drawLine(x, bottom, rect.x, bottom);
+ }
+ else
+ {
+ g.drawLine(x, bottom, rect.x - 1, bottom);
+ }
+
+ if (rect.x + rect.width < x + w - 2)
+ {
+ if (isLast)
+ {
+ g.drawLine(rect.x + rect.width - 1, bottom, right, bottom);
+ }
+ else
+ {
+ g.drawLine(rect.x + rect.width, bottom, right, bottom);
+ }
+ }
+ }
+ }
+
+ /**
+ * Paints the left edge of the content border.
+ *
+ * @param g the graphics to use for painting
+ * @param tabPlacement the tab placement
+ * @param selectedIndex the index of the selected tab
+ * @param x the upper left coordinate of the content area
+ * @param y the upper left coordinate of the content area
+ * @param w the width of the content area
+ * @param h the height of the content area
+ */
+ protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement,
+ int selectedIndex, int x, int y,
+ int w, int h)
+ {
+ boolean isOcean = MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme;
+ Color oceanSelectedBorder =
+ UIManager.getColor("TabbedPane.borderHightlightColor");
+ Rectangle rect = selectedIndex < 0 ? null :
+ getTabBounds(selectedIndex, calcRect);
+
+ if (isOcean)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ else
+ {
+ g.setColor(selectHighlight);
+ }
+
+ // If tabs are not placed on LEFT, or if the selected tab is not in the
+ // run directly left to the content or the selected tab is not visible,
+ // then we draw an unbroken line.
+ if (tabPlacement != LEFT || selectedIndex < 0
+ || rect.x + rect.width + 1 < x || rect.y < y || rect.y > y + h)
+ {
+ g.drawLine(x, y + 1, x, y + h - 2);
+ if (isOcean && tabPlacement == LEFT)
+ {
+ g.setColor(MetalLookAndFeel.getWhite());
+ g.drawLine(x, y + 1, x, y + h - 2);
+ }
+ }
+ else
+ {
+ g.drawLine(x, y, x, rect.y + 1);
+ if (rect.y + rect.height < y + h - 2)
+ {
+ g.drawLine(x, rect.y + rect.height + 1, x, y + h + 2);
+ }
+ if (isOcean)
+ {
+ g.setColor(MetalLookAndFeel.getWhite());
+ g.drawLine(x + 1, y + 1, x + 1, rect.y + 1);
+ if (rect.y + rect.height < y + h - 2)
+ {
+ g.drawLine(x + y, rect.y + rect.height + 1, x + 1, y + h + 2);
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Paints the right edge of the content border.
+ *
+ * @param g the graphics to use for painting
+ * @param tabPlacement the tab placement
+ * @param selectedIndex the index of the selected tab
+ * @param x the upper left coordinate of the content area
+ * @param y the upper left coordinate of the content area
+ * @param w the width of the content area
+ * @param h the height of the content area
+ */
+ protected void paintContentBorderRightEdge(Graphics g, int tabPlacement,
+ int selectedIndex, int x, int y,
+ int w, int h)
+ {
+ g.setColor(darkShadow);
+ Rectangle rect = selectedIndex < 0 ? null :
+ getTabBounds(selectedIndex, calcRect);
+ boolean isOcean = MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme;
+ Color oceanSelectedBorder =
+ UIManager.getColor("TabbedPane.borderHightlightColor");
+
+ // If tabs are not placed on RIGHT, or if the selected tab is not in the
+ // run directly right to the content or the selected tab is not visible,
+ // then we draw an unbroken line.
+ if (tabPlacement != RIGHT || selectedIndex < 0 || rect.x - 1 > w
+ || rect.y < y || rect.y > y + h)
+ {
+ if (isOcean && tabPlacement == RIGHT)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ g.drawLine(x + w - 1, y, x + w - 1, y + h - 1);
+ }
+ else
+ {
+ if (isOcean)
+ {
+ g.setColor(oceanSelectedBorder);
+ }
+ g.drawLine(x + w - 1, y, x + w - 1, rect.y);
+
+ if (rect.y + rect.height < y + h - 2)
+ {
+ g.drawLine(x + w - 1, rect.y + rect.height, x + w - 1, y + h - 2);
+ }
+ }
+ }
+
+ /**
+ * Determines if the specified tab is the last tab in its tab run.
+ *
+ * @param tabIndex the index of the tab
+ *
+ * @return if the specified tab is the last tab in its tab run
+ */
+ private boolean isLastTabInRun(int tabIndex)
+ {
+ int count = tabPane.getTabCount();
+ int run = getRunForTab(count, tabIndex);
+ int lastIndex = lastTabInRun(count, run);
+ return tabIndex == lastIndex;
+ }
+
+ /**
+ * Returns the background for an unselected tab. This first asks the
+ * JTabbedPane for the background at the specified tab index, if this
+ * is an UIResource (that means, it is inherited from the JTabbedPane)
+ * and the TabbedPane.unselectedBackground UI property is not null,
+ * this returns the value of the TabbedPane.unselectedBackground property,
+ * otherwise the value returned by the JTabbedPane.
+ *
+ * @param tabIndex the index of the tab for which we query the background
+ *
+ * @return the background for an unselected tab
+ */
+ private Color getUnselectedBackground(int tabIndex)
+ {
+ Color bg = tabPane.getBackgroundAt(tabIndex);
+ Color unselectedBackground =
+ UIManager.getColor("TabbedPane.unselectedBackground");
+ if (bg instanceof UIResource && unselectedBackground != null)
+ bg = unselectedBackground;
+ return bg;
+ }
}
diff --git a/javax/swing/plaf/metal/MetalToggleButtonUI.java b/javax/swing/plaf/metal/MetalToggleButtonUI.java
index b1ed33236..8c7a46e3a 100644
--- a/javax/swing/plaf/metal/MetalToggleButtonUI.java
+++ b/javax/swing/plaf/metal/MetalToggleButtonUI.java
@@ -45,12 +45,14 @@ import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.AbstractButton;
+import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicButtonUI;
import javax.swing.plaf.basic.BasicToggleButtonUI;
@@ -209,7 +211,12 @@ public class MetalToggleButtonUI
*/
public void update(Graphics g, JComponent c)
{
- if (c.isOpaque() && UIManager.get(getPropertyPrefix() + "gradient") != null)
+ AbstractButton b = (AbstractButton) c;
+ ButtonModel m = b.getModel();
+ if (b.getBackground() instanceof UIResource
+ && b.isContentAreaFilled()
+ && b.isEnabled() && ! m.isArmed() && ! m.isPressed()
+ && UIManager.get(getPropertyPrefix() + "gradient") != null)
{
MetalUtils.paintGradient(g, 0, 0, c.getWidth(), c.getHeight(),
SwingConstants.VERTICAL,
diff --git a/javax/swing/plaf/metal/MetalToolBarUI.java b/javax/swing/plaf/metal/MetalToolBarUI.java
index 797567d55..1848c1f16 100644
--- a/javax/swing/plaf/metal/MetalToolBarUI.java
+++ b/javax/swing/plaf/metal/MetalToolBarUI.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package javax.swing.plaf.metal;
+import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ContainerListener;
import java.awt.event.MouseEvent;
@@ -46,6 +47,7 @@ import java.beans.PropertyChangeListener;
import javax.swing.JComponent;
import javax.swing.JToolBar;
+import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.event.MouseInputListener;
@@ -259,4 +261,38 @@ public class MetalToolBarUI extends BasicToolBarUI
}
super.uninstallUI(c);
}
+
+ /**
+ * Paints the background of the component if necessary and then calls
+ * <code>paint(g, c)</code>.
+ *
+ * This is overridden to implement the OceanTheme gradient when an OceanTheme
+ * is installed.
+ *
+ * @param g the graphics to use
+ * @param c the component to paint.
+ *
+ * @since 1.5
+ */
+ public void update(Graphics g, JComponent c)
+ {
+ // TODO: Sun's implementation uses the MenuBar.gradient here.
+ // I would consider this a bug, but implement it like this
+ // for compatibility.
+ if (MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme
+ && UIManager.get("MenuBar.gradient") != null)
+ {
+ if (c.isOpaque())
+ {
+ MetalUtils.paintGradient(g, 0, 0, c.getWidth(), c.getHeight(),
+ SwingConstants.VERTICAL,
+ "MenuBar.gradient");
+ }
+ paint(g, c);
+ }
+ else
+ {
+ super.update(g, c);
+ }
+ }
}
diff --git a/javax/swing/plaf/metal/MetalTreeUI.java b/javax/swing/plaf/metal/MetalTreeUI.java
index 24432a2b5..3ea37c82f 100644
--- a/javax/swing/plaf/metal/MetalTreeUI.java
+++ b/javax/swing/plaf/metal/MetalTreeUI.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.metal;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
@@ -133,6 +135,7 @@ public class MetalTreeUI extends BasicTreeUI
* @param lineStyleFlag - String representation
*/
protected void decodeLineStyle(Object lineStyleFlag)
+ throws NotImplementedException
{
// FIXME: not implemented
}
@@ -176,6 +179,7 @@ public class MetalTreeUI extends BasicTreeUI
* @param c - the current component to draw
*/
protected void paintHorizontalSeparators(Graphics g, JComponent c)
+ throws NotImplementedException
{
// FIXME: not implemented
}
diff --git a/javax/swing/plaf/metal/OceanTheme.java b/javax/swing/plaf/metal/OceanTheme.java
index cfba4b5ff..9d76ff7e8 100644
--- a/javax/swing/plaf/metal/OceanTheme.java
+++ b/javax/swing/plaf/metal/OceanTheme.java
@@ -43,6 +43,7 @@ import java.util.Arrays;
import javax.swing.UIDefaults;
import javax.swing.plaf.ColorUIResource;
+import javax.swing.plaf.BorderUIResource.LineBorderUIResource;
/**
* A modern theme for the Metal Look &amp; Feel.
@@ -264,6 +265,10 @@ public class OceanTheme extends DefaultMetalTheme
defaults.put("ToolBar.borderColor", c3);
defaults.put("Tree.selectionBorderColor", PRIMARY1);
+ // Borders.
+ defaults.put("Table.focusCellHighlightBorder",
+ new LineBorderUIResource(getPrimary1()));
+
// Insets.
defaults.put("TabbedPane.contentBorderInsets", new Insets(4, 2, 3, 3));
defaults.put("TabbedPane.tabAreaInsets", new Insets(2, 2, 0, 6));
diff --git a/javax/swing/plaf/synth/ColorType.java b/javax/swing/plaf/synth/ColorType.java
index 954e309e1..ced1efc02 100644
--- a/javax/swing/plaf/synth/ColorType.java
+++ b/javax/swing/plaf/synth/ColorType.java
@@ -78,7 +78,12 @@ public class ColorType
/**
* The maximum number of color types.
*/
- public static final int MAX_COUNT = 5;
+ public static final int MAX_COUNT;
+ static
+ {
+ // This is not a constant in the JDK.
+ MAX_COUNT = 5;
+ }
/**
* A counter used to assign an ID to the created color types.
diff --git a/javax/swing/plaf/synth/SynthGraphicsUtils.java b/javax/swing/plaf/synth/SynthGraphicsUtils.java
index a68b6f6ec..1907d754f 100644
--- a/javax/swing/plaf/synth/SynthGraphicsUtils.java
+++ b/javax/swing/plaf/synth/SynthGraphicsUtils.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.synth;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
@@ -159,6 +161,7 @@ public class SynthGraphicsUtils
Icon icon, int hAlign, int vAlign,
int hTextPosition,int vTextPosition,
int iconTextGap,int mnemonicIndex)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return new Dimension(0, 0);
@@ -187,6 +190,7 @@ public class SynthGraphicsUtils
Icon icon, int hAlign, int vAlign,
int hTextPosition,int vTextPosition,
int iconTextGap,int mnemonicIndex)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return new Dimension(0, 0);
@@ -215,6 +219,7 @@ public class SynthGraphicsUtils
Icon icon, int hAlign, int vAlign,
int hTextPosition,int vTextPosition,
int iconTextGap,int mnemonicIndex)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return new Dimension(0, 0);
@@ -277,6 +282,7 @@ public class SynthGraphicsUtils
int hAlign, int vAlign, int hTextPosition,
int vTextPosition, int iconTextGap, int mnemonicIndex,
int textOffset)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
}
diff --git a/javax/swing/plaf/synth/SynthLookAndFeel.java b/javax/swing/plaf/synth/SynthLookAndFeel.java
index ed5a5b053..1a2489e7e 100644
--- a/javax/swing/plaf/synth/SynthLookAndFeel.java
+++ b/javax/swing/plaf/synth/SynthLookAndFeel.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.synth;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Component;
import java.io.InputStream;
import java.text.ParseException;
@@ -119,6 +121,7 @@ public class SynthLookAndFeel
* @param c the componenent for which to update the style
*/
public static void updateStyles(Component c)
+ throws NotImplementedException
{
// FIXME: Implement this properly.
}
@@ -131,6 +134,7 @@ public class SynthLookAndFeel
* @return the region for a given Swing component
*/
public static Region getRegion(JComponent c)
+ throws NotImplementedException
{
// FIXME: This can be implemented as soon as we have the component UI
// classes in place, since this region will be matched via the UI classes.
@@ -147,6 +151,7 @@ public class SynthLookAndFeel
* component
*/
public static ComponentUI createUI(JComponent c)
+ throws NotImplementedException
{
// FIXME: This can be implemented as soon as we have the component UI
// classes in place.
@@ -157,6 +162,7 @@ public class SynthLookAndFeel
* Initializes this look and feel.
*/
public void initialize()
+ throws NotImplementedException
{
super.initialize();
// TODO: Implement at least the following here:
@@ -168,6 +174,7 @@ public class SynthLookAndFeel
* Uninitializes the look and feel.
*/
public void uninitialize()
+ throws NotImplementedException
{
super.uninitialize();
// TODO: What to do here?
@@ -179,6 +186,7 @@ public class SynthLookAndFeel
* @return the UI defaults of this look and feel
*/
public UIDefaults getDefaults()
+ throws NotImplementedException
{
// FIXME: This is certainly wrong. The defaults should be fetched/merged
// from the file from which the l&f is loaded.
@@ -191,6 +199,7 @@ public class SynthLookAndFeel
* @return FIXME
*/
public boolean shouldUpdateStyleOnAncestorChanged()
+ throws NotImplementedException
{
return false;
}
@@ -210,7 +219,7 @@ public class SynthLookAndFeel
// FIXME: The signature in the JDK has a Class<?> here. Should be fixed as
// soon as we switch to the generics branch.
public void load(InputStream in, Class resourceBase)
- throws ParseException, IllegalArgumentException
+ throws ParseException, IllegalArgumentException, NotImplementedException
{
// FIXME: Implement this correctly.
}
diff --git a/javax/swing/plaf/synth/SynthPainter.java b/javax/swing/plaf/synth/SynthPainter.java
index 4d7f18ee4..fa1f6f572 100644
--- a/javax/swing/plaf/synth/SynthPainter.java
+++ b/javax/swing/plaf/synth/SynthPainter.java
@@ -1100,9 +1100,10 @@ public abstract class SynthPainter
* @param y the Y coordinate of the area to paint
* @param w the width of the area to paint
* @param h the height of the area to paint
+ * @param orientation orientation of the scrollbar
*/
public void paintScrollBarThumbBackground(SynthContext ctx, Graphics g, int x,
- int y, int w, int h)
+ int y, int w, int h, int orientation)
{
// Nothing to do here.
}
@@ -1117,9 +1118,10 @@ public abstract class SynthPainter
* @param y the Y coordinate of the area to paint
* @param w the width of the area to paint
* @param h the height of the area to paint
+ * @param orientation orientation of the scrollbar
*/
public void paintScrollBarThumbBorder(SynthContext ctx, Graphics g, int x,
- int y, int w, int h)
+ int y, int w, int h, int orientation)
{
// Nothing to do here.
}
@@ -1270,9 +1272,10 @@ public abstract class SynthPainter
* @param y the Y coordinate of the area to paint
* @param w the width of the area to paint
* @param h the height of the area to paint
+ * @param orientation orientation of the slider
*/
public void paintSliderThumbBackground(SynthContext ctx, Graphics g, int x,
- int y, int w, int h)
+ int y, int w, int h, int orientation)
{
// Nothing to do here.
}
@@ -1287,9 +1290,10 @@ public abstract class SynthPainter
* @param y the Y coordinate of the area to paint
* @param w the width of the area to paint
* @param h the height of the area to paint
+ * @param orientation orientation of the slider
*/
public void paintSliderThumbBorder(SynthContext ctx, Graphics g, int x,
- int y, int w, int h)
+ int y, int w, int h, int orientation)
{
// Nothing to do here.
}
@@ -1414,23 +1418,6 @@ public abstract class SynthPainter
}
/**
- * Paints the border of a split pane's divider.
- *
- * @param ctx the synth context identifying the component and region for
- * painting
- * @param g the graphics context to use for painting
- * @param x the X coordinate of the area to paint
- * @param y the Y coordinate of the area to paint
- * @param w the width of the area to paint
- * @param h the height of the area to paint
- */
- public void paintSplitPaneDividerBorder(SynthContext ctx, Graphics g, int x,
- int y, int w, int h)
- {
- // Nothing to do here.
- }
-
- /**
* Paints the background of a tabbed pane.
*
* @param ctx the synth context identifying the component and region for
@@ -1542,9 +1529,10 @@ public abstract class SynthPainter
* @param y the Y coordinate of the area to paint
* @param w the width of the area to paint
* @param h the height of the area to paint
+ * @param index the index of the tab to paint
*/
public void paintTabbedPaneTabBackground(SynthContext ctx, Graphics g, int x,
- int y, int w, int h)
+ int y, int w, int h, int index)
{
// Nothing to do here.
}
@@ -1559,9 +1547,10 @@ public abstract class SynthPainter
* @param y the Y coordinate of the area to paint
* @param w the width of the area to paint
* @param h the height of the area to paint
+ * @param index the index of the tab to paint
*/
public void paintTabbedPaneTabBorder(SynthContext ctx, Graphics g, int x,
- int y, int w, int h)
+ int y, int w, int h, int index)
{
// Nothing to do here.
}
diff --git a/javax/swing/plaf/synth/SynthStyle.java b/javax/swing/plaf/synth/SynthStyle.java
index e0a8dbcc7..f5ab3df3b 100644
--- a/javax/swing/plaf/synth/SynthStyle.java
+++ b/javax/swing/plaf/synth/SynthStyle.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.plaf.synth;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;
@@ -58,87 +60,144 @@ public abstract class SynthStyle
* Creates a new <code>SynthStyle</code> object.
*/
public SynthStyle()
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
}
public SynthGraphicsUtils getGraphicsUtils(SynthContext ctx)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return null;
}
public Color getColor(SynthContext ctx, ColorType type)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return null;
}
- public abstract Color getColorForState(SynthContext ctx, ColorType type);
+ protected abstract Color getColorForState(SynthContext ctx, ColorType type);
public Font getFont(SynthContext ctx)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return null;
}
- public abstract Font getFontForState(SynthContext ctx);
+ protected abstract Font getFontForState(SynthContext ctx);
- public Insets getInsets(SynthContext ctx)
+ public Insets getInsets(SynthContext ctx, Insets result)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return null;
}
- public SynthPainter getPainted(SynthContext ctx)
+ public SynthPainter getPainter(SynthContext ctx)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return null;
}
public boolean isOpaque(SynthContext ctx)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return true;
}
public Object get(SynthContext ctx, Object key)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
return null;
}
public void installDefaults(SynthContext ctx)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
}
public void uninstallDefaults(SynthContext ctx)
+ throws NotImplementedException
{
// FIXME: Implement this correctly.
}
+ /**
+ * A convenience method to fetch an integer property.
+ * If the property's value is a {@link Number}, then the
+ * integer value is returned. Otherwise, the default value
+ * is returned.
+ * @param ctx the context
+ * @param key the key to fetch
+ * @param defaultValue the default value
+ * @return the integer value of the property, or the default value
+ */
public int getInt(SynthContext ctx, Object key, int defaultValue)
{
- // FIXME: Implement this correctly.
- return -1;
+ Object obj = get(ctx, key);
+ if (obj instanceof Number)
+ return ((Number) obj).intValue();
+ return defaultValue;
}
- public boolean getBoolean(SynthContext ctx, Object key, boolean defaultValue)
+ /**
+ * A convenience method to fetch an integer property.
+ * If the property's value is a {@link Boolean}, then the
+ * value is returned. Otherwise, the default value
+ * is returned.
+ * @param ctx the context
+ * @param key the key to fetch
+ * @param defaultValue the default value
+ * @return the boolean value of the property, or the default value
+ */
+ public boolean getBoolean(SynthContext ctx, Object key,
+ boolean defaultValue)
{
- // FIXME: Implement this correctly.
- return false;
+ Object obj = get(ctx, key);
+ if (obj instanceof Boolean)
+ return ((Boolean) obj).booleanValue();
+ return defaultValue;
}
+ /**
+ * A convenience method to fetch an Icon-valued property.
+ * If the property's value is an {@link Icon}, then the
+ * value is returned. Otherwise, null is returned.
+ * @param ctx the context
+ * @param key the key to fetch
+ * @return the icon, or null
+ */
public Icon getIcon(SynthContext ctx, Object key)
{
- // FIXME: Implement this correctly.
+ Object obj = get(ctx, key);
+ if (key instanceof Icon)
+ return (Icon) obj;
return null;
}
+ /**
+ * A convenience method to fetch a String property.
+ * If the property's value is a {@link String}, then the
+ * value is returned. Otherwise, the default value
+ * is returned.
+ * @param ctx the context
+ * @param key the key to fetch
+ * @param defaultValue the default value
+ * @return the String value of the property, or the default value
+ */
public String getString(SynthContext ctx, Object key, String defaultValue)
{
- // FIXME: Implement this correctly.
- return null;
+ Object obj = get(ctx, key);
+ if (obj instanceof String)
+ return (String) obj;
+ return defaultValue;
}
}
diff --git a/javax/swing/table/DefaultTableCellRenderer.java b/javax/swing/table/DefaultTableCellRenderer.java
index 0d9b62567..a9bbe9a78 100644
--- a/javax/swing/table/DefaultTableCellRenderer.java
+++ b/javax/swing/table/DefaultTableCellRenderer.java
@@ -1,5 +1,5 @@
/* DefaultTableCellRenderer.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -49,7 +49,6 @@ import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
-import javax.swing.JTextField;
/**
* Class to display every cells.
@@ -59,7 +58,7 @@ public class DefaultTableCellRenderer extends JLabel
{
static final long serialVersionUID = 7878911414715528324L;
- protected static Border noFocusBorder = new EmptyBorder(0, 0, 0, 0);
+ protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
public static class UIResource extends DefaultTableCellRenderer
implements javax.swing.plaf.UIResource
@@ -164,17 +163,17 @@ public class DefaultTableCellRenderer extends JLabel
super.setForeground(table.getForeground());
}
+ Border b = null;
if (hasFocus)
{
- setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
- if (table.isCellEditable(row, column))
- {
- super.setBackground(UIManager.getColor("Table.focusCellBackground"));
- super.setForeground(UIManager.getColor("Table.focusCellForeground"));
- }
+ if (isSelected)
+ b = UIManager.getBorder("Table.focusSelectedCellHighlightBorder");
+ if (b == null)
+ b = UIManager.getBorder("Table.focusCellHighlightBorder");
}
else
- setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
+ b = noFocusBorder;
+ setBorder(b);
setFont(table.getFont());
diff --git a/javax/swing/table/DefaultTableColumnModel.java b/javax/swing/table/DefaultTableColumnModel.java
index 10871770d..24ac8fc9c 100644
--- a/javax/swing/table/DefaultTableColumnModel.java
+++ b/javax/swing/table/DefaultTableColumnModel.java
@@ -1,5 +1,5 @@
/* DefaultTableColumnModel.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,6 +46,7 @@ import java.util.EventListener;
import java.util.Vector;
import javax.swing.DefaultListSelectionModel;
+import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.EventListenerList;
@@ -55,9 +56,11 @@ import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
/**
- * DefaultTableColumnModel
+ * A model that stores information about the columns used in a {@link JTable}.
+ *
+ * @see JTable#setColumnModel(TableColumnModel)
+ *
* @author Andrew Selkirk
- * @version 1.0
*/
public class DefaultTableColumnModel
implements TableColumnModel, PropertyChangeListener, ListSelectionListener,
@@ -66,88 +69,116 @@ public class DefaultTableColumnModel
private static final long serialVersionUID = 6580012493508960512L;
/**
- * Columns that this model keeps track of.
+ * Storage for the table columns.
*/
protected Vector tableColumns;
/**
- * Selection Model that keeps track of columns selection
+ * A selection model that keeps track of column selections.
*/
protected ListSelectionModel selectionModel;
/**
- * Space between two columns. By default it is set to 1
+ * The space between the columns (the default value is <code>1</code>).
*/
protected int columnMargin;
/**
- * listenerList keeps track of all listeners registered with this model
+ * Storage for the listeners registered with the model.
*/
protected EventListenerList listenerList = new EventListenerList();
/**
- * changeEvent is fired when change occurs in one of the columns properties
+ * A change event used when notifying listeners of a change to the
+ * <code>columnMargin</code> field. This single event is reused for all
+ * notifications.
*/
+ // FIXME: use lazy instantiation
protected transient ChangeEvent changeEvent = new ChangeEvent(this);
/**
- * Indicates whether columns can be selected
+ * A flag that indicates whether or not columns can be selected.
*/
protected boolean columnSelectionAllowed;
/**
- * Total width of all the columns in this model
+ * The total width of all the columns in this model.
*/
protected int totalColumnWidth;
/**
- * Constructor DefaultTableColumnModel
+ * Creates a new table column model with zero columns. A default column
+ * selection model is created by calling {@link #createSelectionModel()}.
+ * The default value for <code>columnMargin</code> is <code>1</code> and
+ * the default value for <code>columnSelectionAllowed</code> is
+ * <code>false</code>.
*/
public DefaultTableColumnModel()
{
tableColumns = new Vector();
- setSelectionModel(createSelectionModel());
+ selectionModel = createSelectionModel();
+ selectionModel.addListSelectionListener(this);
columnMargin = 1;
columnSelectionAllowed = false;
}
/**
- * addColumn adds column to the model. This method fires ColumnAdded
- * event to model's registered TableColumnModelListeners.
+ * Adds a column to the model then calls
+ * {@link #fireColumnAdded(TableColumnModelEvent)} to notify the registered
+ * listeners. The model registers itself with the column as a
+ * {@link PropertyChangeListener} so that changes to the column width will
+ * invalidate the cached {@link #totalColumnWidth} value.
*
- * @param col column to add
+ * @param column the column (<code>null</code> not permitted).
+ *
+ * @throws IllegalArgumentException if <code>column</code> is
+ * <code>null</code>.
+ *
+ * @see #removeColumn(TableColumn)
*/
- public void addColumn(TableColumn col)
+ public void addColumn(TableColumn column)
{
- if (col == null)
+ if (column == null)
throw new IllegalArgumentException("Null 'col' argument.");
- tableColumns.add(col);
+ tableColumns.add(column);
+ column.addPropertyChangeListener(this);
invalidateWidthCache();
- fireColumnAdded(new TableColumnModelEvent(this, 0, tableColumns.size() - 1));
+ fireColumnAdded(new TableColumnModelEvent(this, 0,
+ tableColumns.size() - 1));
}
/**
- * removeColumn removes table column from the model. This method fires
- * ColumnRemoved event to model's registered TableColumnModelListeners.
+ * Removes a column from the model then calls
+ * {@link #fireColumnRemoved(TableColumnModelEvent)} to notify the registered
+ * listeners. If the specified column does not belong to the model, or is
+ * <code>null</code>, this method does nothing.
*
- * @param col column to be removed
+ * @param column the column to be removed (<code>null</code> permitted).
+ *
+ * @see #addColumn(TableColumn)
*/
- public void removeColumn(TableColumn col)
+ public void removeColumn(TableColumn column)
{
- int index = this.tableColumns.indexOf(col);
+ int index = this.tableColumns.indexOf(column);
if (index < 0)
return;
+ tableColumns.remove(column);
fireColumnRemoved(new TableColumnModelEvent(this, index, 0));
- tableColumns.remove(col);
+ column.removePropertyChangeListener(this);
invalidateWidthCache();
}
/**
- * moveColumn moves column at index i to index j. This method fires
- * ColumnMoved event to model's registered TableColumnModelListeners.
+ * Moves the column at index i to the position specified by index j, then
+ * calls {@link #fireColumnMoved(TableColumnModelEvent)} to notify registered
+ * listeners.
*
- * @param i index of the column that will be moved
- * @param j index of column's new location
+ * @param i index of the column that will be moved.
+ * @param j index of the column's new location.
+ *
+ * @throws IllegalArgumentException if <code>i</code> or <code>j</code> are
+ * outside the range <code>0</code> to <code>N-1</code>, where
+ * <code>N</code> is the column count.
*/
public void moveColumn(int i, int j)
{
@@ -158,22 +189,27 @@ public class DefaultTableColumnModel
throw new IllegalArgumentException("Index 'j' out of range.");
Object column = tableColumns.remove(i);
tableColumns.add(j, column);
- fireColumnAdded(new TableColumnModelEvent(this, i, j));
+ fireColumnMoved(new TableColumnModelEvent(this, i, j));
}
/**
- * setColumnMargin sets margin of the columns.
- * @param m new column margin
+ * Sets the column margin then calls {@link #fireColumnMarginChanged()} to
+ * notify the registered listeners.
+ *
+ * @param margin the column margin.
+ *
+ * @see #getColumnMargin()
*/
- public void setColumnMargin(int m)
+ public void setColumnMargin(int margin)
{
- columnMargin = m;
+ columnMargin = margin;
fireColumnMarginChanged();
}
/**
- * getColumnCount returns number of columns in the model
- * @return int number of columns in the model
+ * Returns the number of columns in the model.
+ *
+ * @return The column count.
*/
public int getColumnCount()
{
@@ -181,8 +217,9 @@ public class DefaultTableColumnModel
}
/**
- * getColumns
- * @return Enumeration
+ * Returns an enumeration of the columns in the model.
+ *
+ * @return An enumeration of the columns in the model.
*/
public Enumeration getColumns()
{
@@ -214,18 +251,28 @@ public class DefaultTableColumnModel
}
/**
- * getColumn returns column at the specified index
- * @param i index of the column
- * @return TableColumn column at the specified index
+ * Returns the column at the specified index.
+ *
+ * @param columnIndex the column index (in the range from <code>0</code> to
+ * <code>N-1</code>, where <code>N</code> is the number of columns in
+ * the model).
+ *
+ * @return The column at the specified index.
+ *
+ * @throws ArrayIndexOutOfBoundsException if <code>i</code> is not within
+ * the specified range.
*/
- public TableColumn getColumn(int i)
+ public TableColumn getColumn(int columnIndex)
{
- return (TableColumn) tableColumns.get(i);
+ return (TableColumn) tableColumns.get(columnIndex);
}
/**
- * getColumnMargin returns column margin
- * @return int column margin
+ * Returns the column margin.
+ *
+ * @return The column margin.
+ *
+ * @see #setColumnMargin(int)
*/
public int getColumnMargin()
{
@@ -233,16 +280,26 @@ public class DefaultTableColumnModel
}
/**
- * getColumnIndexAtX returns column that contains specified x-coordinate.
- * @param x x-coordinate that column should contain
- * @return int index of the column that contains specified x-coordinate relative
- * to this column model
+ * Returns the index of the column that contains the specified x-coordinate.
+ * This method assumes that:
+ * <ul>
+ * <li>column zero begins at position zero;</li>
+ * <li>all columns appear in order;</li>
+ * <li>individual column widths are taken into account, but the column margin
+ * is ignored.</li>
+ * </ul>
+ * If no column contains the specified position, this method returns
+ * <code>-1</code>.
+ *
+ * @param x the x-position.
+ *
+ * @return The column index, or <code>-1</code>.
*/
public int getColumnIndexAtX(int x)
{
for (int i = 0; i < tableColumns.size(); ++i)
{
- int w = ((TableColumn)tableColumns.get(i)).getWidth();
+ int w = ((TableColumn) tableColumns.get(i)).getWidth();
if (0 <= x && x < w)
return i;
else
@@ -252,10 +309,10 @@ public class DefaultTableColumnModel
}
/**
- * getTotalColumnWidth returns total width of all the columns including
- * column's margins.
+ * Returns total width of all the columns in the model, ignoring the
+ * {@link #columnMargin}.
*
- * @return total width of all the columns
+ * @return The total width of all the columns.
*/
public int getTotalColumnWidth()
{
@@ -265,24 +322,32 @@ public class DefaultTableColumnModel
}
/**
- * setSelectionModel sets selection model that will be used by this ColumnTableModel
- * to keep track of currently selected columns
+ * Sets the selection model that will be used to keep track of the selected
+ * columns.
*
- * @param model new selection model
- * @exception IllegalArgumentException if model is null
+ * @param model the selection model (<code>null</code> not permitted).
+ *
+ * @throws IllegalArgumentException if <code>model</code> is
+ * <code>null</code>.
+ *
+ * @see #getSelectionModel()
*/
public void setSelectionModel(ListSelectionModel model)
{
if (model == null)
throw new IllegalArgumentException();
+ selectionModel.removeListSelectionListener(this);
selectionModel = model;
selectionModel.addListSelectionListener(this);
}
/**
- * getSelectionModel returns selection model
- * @return ListSelectionModel selection model
+ * Returns the selection model used to track table column selections.
+ *
+ * @return The selection model.
+ *
+ * @see #setSelectionModel(ListSelectionModel)
*/
public ListSelectionModel getSelectionModel()
{
@@ -290,10 +355,11 @@ public class DefaultTableColumnModel
}
/**
- * setColumnSelectionAllowed sets whether column selection is allowed
- * or not.
+ * Sets the flag that indicates whether or not column selection is allowed.
*
- * @param flag true if column selection is allowed and false otherwise
+ * @param flag the new flag value.
+ *
+ * @see #getColumnSelectionAllowed()
*/
public void setColumnSelectionAllowed(boolean flag)
{
@@ -301,10 +367,12 @@ public class DefaultTableColumnModel
}
/**
- * getColumnSelectionAllowed indicates whether column selection is
- * allowed or not.
+ * Returns <code>true</code> if column selection is allowed, and
+ * <code>false</code> if column selection is not allowed.
*
- * @return boolean true if column selection is allowed and false otherwise.
+ * @return A boolean.
+ *
+ * @see #setColumnSelectionAllowed(boolean)
*/
public boolean getColumnSelectionAllowed()
{
@@ -312,10 +380,9 @@ public class DefaultTableColumnModel
}
/**
- * getSelectedColumns returns array containing indexes of currently
- * selected columns
+ * Returns an array containing the indices of the selected columns.
*
- * @return int[] array containing indexes of currently selected columns
+ * @return An array containing the indices of the selected columns.
*/
public int[] getSelectedColumns()
{
@@ -356,8 +423,11 @@ public class DefaultTableColumnModel
}
/**
- * getSelectedColumnCount returns number of currently selected columns
- * @return int number of currently selected columns
+ * Returns the number of selected columns in the model.
+ *
+ * @return The selected column count.
+ *
+ * @see #getSelectionModel()
*/
public int getSelectedColumnCount()
{
@@ -395,10 +465,10 @@ public class DefaultTableColumnModel
}
/**
- * addColumnModelListener adds specified listener to the model's
- * listener list
+ * Registers a listener with the model, so that it will receive
+ * {@link TableColumnModelEvent} notifications.
*
- * @param listener the listener to add
+ * @param listener the listener (<code>null</code> ignored).
*/
public void addColumnModelListener(TableColumnModelListener listener)
{
@@ -406,10 +476,10 @@ public class DefaultTableColumnModel
}
/**
- * removeColumnModelListener removes specified listener from the model's
- * listener list.
+ * Deregisters a listener so that it no longer receives notification of
+ * changes to this model.
*
- * @param listener the listener to remove
+ * @param listener the listener to remove
*/
public void removeColumnModelListener(TableColumnModelListener listener)
{
@@ -417,6 +487,13 @@ public class DefaultTableColumnModel
}
/**
+ * Returns an array containing the listeners that are registered with the
+ * model. If there are no listeners, an empty array is returned.
+ *
+ * @return An array containing the listeners that are registered with the
+ * model.
+ *
+ * @see #addColumnModelListener(TableColumnModelListener)
* @since 1.4
*/
public TableColumnModelListener[] getColumnModelListeners()
@@ -426,78 +503,97 @@ public class DefaultTableColumnModel
}
/**
- * fireColumnAdded fires TableColumnModelEvent to registered
- * TableColumnModelListeners to indicate that column was added
- *
- * @param e TableColumnModelEvent
+ * Sends the specified {@link TableColumnModelEvent} to all registered
+ * listeners, to indicate that a column has been added to the model. The
+ * event's <code>toIndex</code> attribute should contain the index of the
+ * added column.
+ *
+ * @param e the event.
+ *
+ * @see #addColumn(TableColumn)
*/
protected void fireColumnAdded(TableColumnModelEvent e)
{
TableColumnModelListener[] listeners = getColumnModelListeners();
- for (int i=0; i< listeners.length; i++)
+ for (int i = 0; i < listeners.length; i++)
listeners[i].columnAdded(e);
}
/**
- * fireColumnAdded fires TableColumnModelEvent to registered
- * TableColumnModelListeners to indicate that column was removed
- *
- * @param e TableColumnModelEvent
+ * Sends the specified {@link TableColumnModelEvent} to all registered
+ * listeners, to indicate that a column has been removed from the model. The
+ * event's <code>fromIndex</code> attribute should contain the index of the
+ * removed column.
+ *
+ * @param e the event.
+ *
+ * @see #removeColumn(TableColumn)
*/
protected void fireColumnRemoved(TableColumnModelEvent e)
{
TableColumnModelListener[] listeners = getColumnModelListeners();
- for (int i=0; i< listeners.length; i++)
+ for (int i = 0; i < listeners.length; i++)
listeners[i].columnRemoved(e);
}
/**
- * fireColumnAdded fires TableColumnModelEvent to registered
- * TableColumnModelListeners to indicate that column was moved
- *
- * @param e TableColumnModelEvent
+ * Sends the specified {@link TableColumnModelEvent} to all registered
+ * listeners, to indicate that a column in the model has been moved. The
+ * event's <code>fromIndex</code> attribute should contain the old column
+ * index, and the <code>toIndex</code> attribute should contain the new
+ * column index.
+ *
+ * @param e the event.
+ *
+ * @see #moveColumn(int, int)
*/
protected void fireColumnMoved(TableColumnModelEvent e)
{
TableColumnModelListener[] listeners = getColumnModelListeners();
- for (int i=0; i< listeners.length; i++)
+ for (int i = 0; i < listeners.length; i++)
listeners[i].columnMoved(e);
}
/**
- * fireColumnSelectionChanged fires TableColumnModelEvent to model's
- * registered TableColumnModelListeners to indicate that different column
- * was selected.
+ * Sends the specified {@link ListSelectionEvent} to all registered listeners,
+ * to indicate that the column selections have changed.
*
- * @param evt ListSelectionEvent
+ * @param e the event.
+ *
+ * @see #valueChanged(ListSelectionEvent)
*/
- protected void fireColumnSelectionChanged(ListSelectionEvent evt)
+ protected void fireColumnSelectionChanged(ListSelectionEvent e)
{
EventListener [] listeners = getListeners(TableColumnModelListener.class);
for (int i = 0; i < listeners.length; ++i)
- ((TableColumnModelListener)listeners[i]).columnSelectionChanged(evt);
+ ((TableColumnModelListener) listeners[i]).columnSelectionChanged(e);
}
/**
- * fireColumnMarginChanged fires TableColumnModelEvent to model's
- * registered TableColumnModelListeners to indicate that column margin
- * was changed.
+ * Sends a {@link ChangeEvent} to the model's registered listeners to
+ * indicate that the column margin was changed.
+ *
+ * @see #setColumnMargin(int)
*/
protected void fireColumnMarginChanged()
{
EventListener [] listeners = getListeners(TableColumnModelListener.class);
for (int i = 0; i < listeners.length; ++i)
- ((TableColumnModelListener)listeners[i]).columnMarginChanged(changeEvent);
+ ((TableColumnModelListener) listeners[i]).columnMarginChanged(changeEvent);
}
/**
- * getListeners returns currently registered listeners with this model.
- * @param listenerType type of listeners to return
+ * Returns an array containing the listeners (of the specified type) that
+ * are registered with this model.
+ *
+ * @param listenerType the listener type (must indicate a subclass of
+ * {@link EventListener}, <code>null</code> not permitted).
*
- * @return EventListener[] array of model's listeners of the specified type
+ * @return An array containing the listeners (of the specified type) that
+ * are registered with this model.
*/
public EventListener[] getListeners(Class listenerType)
{
@@ -505,20 +601,26 @@ public class DefaultTableColumnModel
}
/**
- * propertyChange handles changes occuring in the properties of the
- * model's columns.
+ * Receives notification of property changes for the columns in the model.
+ * If the <code>width</code> property for any column changes, we invalidate
+ * the {@link #totalColumnWidth} value here.
*
- * @param evt PropertyChangeEvent
+ * @param event the event.
*/
- public void propertyChange(PropertyChangeEvent evt)
+ public void propertyChange(PropertyChangeEvent event)
{
- if (evt.getPropertyName().equals(TableColumn.COLUMN_WIDTH_PROPERTY))
- invalidateWidthCache();
+ if (event.getPropertyName().equals("width"))
+ invalidateWidthCache();
}
/**
- * valueChanged handles changes in the selectionModel.
- * @param e ListSelectionEvent
+ * Receives notification of the change to the list selection model, and
+ * responds by calling
+ * {@link #fireColumnSelectionChanged(ListSelectionEvent)}.
+ *
+ * @param e the list selection event.
+ *
+ * @see #getSelectionModel()
*/
public void valueChanged(ListSelectionEvent e)
{
@@ -526,10 +628,11 @@ public class DefaultTableColumnModel
}
/**
- * createSelectionModel creates selection model that will keep track
- * of currently selected column(s)
+ * Creates a default selection model to track the currently selected
+ * column(s). This method is called by the constructor and returns a new
+ * instance of {@link DefaultListSelectionModel}.
*
- * @return ListSelectionModel selection model of the columns
+ * @return A new default column selection model.
*/
protected ListSelectionModel createSelectionModel()
{
@@ -537,9 +640,10 @@ public class DefaultTableColumnModel
}
/**
- * recalcWidthCache calculates total width of the columns.
- * If the current cache of the total width is in invalidated state,
- * then width is recalculated. Otherwise nothing is done.
+ * Recalculates the total width of the columns, if the cached value is
+ * <code>-1</code>. Otherwise this method does nothing.
+ *
+ * @see #getTotalColumnWidth()
*/
protected void recalcWidthCache()
{
@@ -548,13 +652,15 @@ public class DefaultTableColumnModel
totalColumnWidth = 0;
for (int i = 0; i < tableColumns.size(); ++i)
{
- totalColumnWidth += ((TableColumn)tableColumns.get(i)).getWidth();
+ totalColumnWidth += ((TableColumn) tableColumns.get(i)).getWidth();
}
}
}
/**
- * invalidateWidthCache
+ * Sets the {@link #totalColumnWidth} field to <code>-1</code>.
+ *
+ * @see #recalcWidthCache()
*/
private void invalidateWidthCache()
{
diff --git a/javax/swing/table/DefaultTableModel.java b/javax/swing/table/DefaultTableModel.java
index c281caa07..09be2f752 100644
--- a/javax/swing/table/DefaultTableModel.java
+++ b/javax/swing/table/DefaultTableModel.java
@@ -294,12 +294,7 @@ public class DefaultTableModel extends AbstractTableModel
else
{
int rowsToAdd = rowCount - existingRowCount;
- for (int i = 0; i < rowsToAdd; i++)
- {
- Vector tmp = new Vector();
- tmp.setSize(columnIdentifiers.size());
- dataVector.add(tmp);
- }
+ addExtraRows(rowsToAdd, columnIdentifiers.size());
fireTableRowsInserted(existingRowCount,rowCount-1);
}
}
@@ -366,12 +361,7 @@ public class DefaultTableModel extends AbstractTableModel
if (columnData.length > dataVector.size())
{
int rowsToAdd = columnData.length - dataVector.size();
- for (int i = 0; i < rowsToAdd; i++)
- {
- Vector tmp = new Vector();
- tmp.setSize(columnIdentifiers.size());
- dataVector.add(tmp);
- }
+ addExtraRows(rowsToAdd, columnIdentifiers.size());
}
else if (columnData.length < dataVector.size())
{
@@ -502,7 +492,8 @@ public class DefaultTableModel extends AbstractTableModel
else
{
if (column < getColumnCount())
- {
+ {
+ checkSize();
Object id = columnIdentifiers.get(column);
if (id != null)
result = id.toString();
@@ -588,4 +579,41 @@ public class DefaultTableModel extends AbstractTableModel
vector.add(convertToVector(data[i]));
return vector;
}
+
+ /**
+ * This method adds some rows to <code>dataVector</code>.
+ *
+ * @param rowsToAdd number of rows to add
+ * @param nbColumns size of the added rows
+ */
+ private void addExtraRows(int rowsToAdd, int nbColumns)
+ {
+ for (int i = 0; i < rowsToAdd; i++)
+ {
+ Vector tmp = new Vector();
+ tmp.setSize(columnIdentifiers.size());
+ dataVector.add(tmp);
+ }
+ }
+
+ /**
+ * Checks the real columns/rows sizes against the ones returned by
+ * <code>getColumnCount()</code> and <code>getRowCount()</code>.
+ * If the supposed one are bigger, then we grow <code>columIdentifiers</code>
+ * and <code>dataVector</code> to their expected size.
+ */
+ private void checkSize()
+ {
+ int columnCount = getColumnCount();
+ int rowCount = getRowCount();
+
+ if (columnCount > columnIdentifiers.size())
+ columnIdentifiers.setSize(columnCount);
+
+ if (rowCount > dataVector.size())
+ {
+ int rowsToAdd = rowCount - dataVector.size();
+ addExtraRows(rowsToAdd, columnCount);
+ }
+ }
}
diff --git a/javax/swing/table/JTableHeader.java b/javax/swing/table/JTableHeader.java
index 4e8dcd7b7..f7c1e1cd5 100644
--- a/javax/swing/table/JTableHeader.java
+++ b/javax/swing/table/JTableHeader.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.table;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
@@ -80,232 +82,278 @@ public class JTableHeader extends JComponent
protected class AccessibleJTableHeaderEntry extends AccessibleContext
implements Accessible, AccessibleComponent
{
- public AccessibleJTableHeaderEntry(int c, JTableHeader p, JTable t)
+ public AccessibleJTableHeaderEntry(int c, JTableHeader p, JTable t)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void addFocusListener(FocusListener l)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void addPropertyChangeListener(PropertyChangeListener l)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public boolean contains(Point p)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public AccessibleAction getAccessibleAction()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Accessible getAccessibleAt(Point p)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Accessible getAccessibleChild(int i)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public int getAccessibleChildrenCount()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public AccessibleComponent getAccessibleComponent()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public AccessibleContext getAccessibleContext()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public String getAccessibleDescription()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public int getAccessibleIndexInParent()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public String getAccessibleName()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public AccessibleRole getAccessibleRole()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public AccessibleSelection getAccessibleSelection()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public AccessibleStateSet getAccessibleStateSet()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public AccessibleText getAccessibleText()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public AccessibleValue getAccessibleValue()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Color getBackground()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Rectangle getBounds()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Cursor getCursor()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Font getFont()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public FontMetrics getFontMetrics(Font f)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Color getForeground()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Locale getLocale()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Point getLocation()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Point getLocationOnScreen()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public Dimension getSize()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public boolean isEnabled()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public boolean isFocusTraversable()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public boolean isShowing()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public boolean isVisible()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void removeFocusListener(FocusListener l)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void removePropertyChangeListener(PropertyChangeListener l)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void requestFocus()
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setAccessibleDescription(String s)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setAccessibleName(String s)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setBackground(Color c)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setBounds(Rectangle r)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setCursor(Cursor c)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setEnabled(boolean b)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setFont(Font f)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setForeground(Color c)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setLocation(Point p)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setSize(Dimension d)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
public void setVisible(boolean b)
+ throws NotImplementedException
{
throw new Error("not implemented");
}
diff --git a/javax/swing/table/TableColumnModel.java b/javax/swing/table/TableColumnModel.java
index b006f9ad4..986c02533 100644
--- a/javax/swing/table/TableColumnModel.java
+++ b/javax/swing/table/TableColumnModel.java
@@ -1,5 +1,5 @@
/* TableColumnModel.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -42,6 +42,8 @@ import java.util.Enumeration;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
/**
@@ -50,7 +52,6 @@ import javax.swing.event.TableColumnModelListener;
*
* @author Andrew Selkirk
*/
-// FIXME: The API documentation in this class is incomplete.
public interface TableColumnModel
{
/**
@@ -80,21 +81,26 @@ public interface TableColumnModel
void moveColumn(int columnIndex, int newIndex);
/**
- * setColumnMargin
- * @param margin Margin of column
+ * Sets the column margin and sends a {@link ChangeEvent} to all registered
+ * {@link TableColumnModelListener}s registered with the model.
+ *
+ * @param margin the column margin.
+ *
+ * @see #getColumnMargin()
*/
void setColumnMargin(int margin);
/**
* Returns the number of columns in the model.
*
- * @return The column count
+ * @return The column count.
*/
int getColumnCount();
/**
- * getColumns
- * @return Enumeration of columns
+ * Returns an enumeration of the columns in the model.
+ *
+ * @return An enumeration of the columns in the model.
*/
Enumeration getColumns();
@@ -123,30 +129,53 @@ public interface TableColumnModel
* Returns the column margin.
*
* @return The column margin.
+ *
+ * @see #setColumnMargin(int)
*/
int getColumnMargin();
/**
- * getColumnIndexAtX
- * @return Column index as position x
+ * Returns the index of the column that contains the specified x-coordinate,
+ * assuming that:
+ * <ul>
+ * <li>column zero begins at position zero;</li>
+ * <li>all columns appear in order;</li>
+ * <li>individual column widths are taken into account, but the column margin
+ * is ignored.</li>
+ * </ul>
+ * If no column contains the specified position, this method returns
+ * <code>-1</code>.
+ *
+ * @param xPosition the x-position.
+ *
+ * @return The column index, or <code>-1</code>.
*/
int getColumnIndexAtX(int xPosition);
/**
- * getTotalColumnWidth
- * @return Total column width
+ * Returns total width of all the columns in the model, ignoring the
+ * column margin (see {@link #getColumnMargin()}).
+ *
+ * @return The total width of all the columns.
*/
int getTotalColumnWidth();
/**
- * setColumnSelectionAllowed
- * @param value Set column selection
+ * Sets the flag that indicates whether or not column selection is allowed.
+ *
+ * @param allowed the new flag value.
+ *
+ * @see #getColumnSelectionAllowed()
*/
- void setColumnSelectionAllowed(boolean value);
+ void setColumnSelectionAllowed(boolean allowed);
/**
- * getColumnSelectionAllowed
- * @return true if column selection allowed, false otherwise
+ * Returns <code>true</code> if column selection is allowed, and
+ * <code>false</code> if column selection is not allowed.
+ *
+ * @return A boolean.
+ *
+ * @see #setColumnSelectionAllowed(boolean)
*/
boolean getColumnSelectionAllowed();
@@ -157,31 +186,47 @@ public interface TableColumnModel
int[] getSelectedColumns();
/**
- * getSelectedColumnCount
- * @return Count of selected columns
+ * Returns the number of selected columns in the model.
+ *
+ * @return The selected column count.
+ *
+ * @see #getSelectionModel()
*/
int getSelectedColumnCount();
/**
- * setSelectionModel
- * @param model ListSelectionModel
+ * Sets the selection model that will be used to keep track of the selected
+ * columns.
+ *
+ * @param model the selection model (<code>null</code> not permitted).
+ *
+ * @throws IllegalArgumentException if <code>model</code> is
+ * <code>null</code>.
*/
void setSelectionModel(ListSelectionModel model);
/**
- * getSelectionModel
+ * Returns the selection model used to track table column selections.
+ *
+ * @return The selection model.
+ *
+ * @see #setSelectionModel(ListSelectionModel)
*/
ListSelectionModel getSelectionModel();
/**
- * addColumnModelListener
- * @param listener TableColumnModelListener
+ * Registers a listener with the model, so that it will receive
+ * {@link TableColumnModelEvent} notifications.
+ *
+ * @param listener the listener (<code>null</code> ignored).
*/
void addColumnModelListener(TableColumnModelListener listener);
/**
- * removeColumnModelListener
- * @param listener TableColumnModelListener
+ * Deregisters a listener, so that it will no longer receive
+ * {@link TableColumnModelEvent} notifications.
+ *
+ * @param listener the listener.
*/
void removeColumnModelListener(TableColumnModelListener listener);
}
diff --git a/javax/swing/text/AbstractDocument.java b/javax/swing/text/AbstractDocument.java
index a3e8c463b..881b4d7f2 100644
--- a/javax/swing/text/AbstractDocument.java
+++ b/javax/swing/text/AbstractDocument.java
@@ -51,6 +51,7 @@ import javax.swing.event.DocumentListener;
import javax.swing.event.EventListenerList;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
+import javax.swing.text.DocumentFilter;
import javax.swing.tree.TreeNode;
import javax.swing.undo.AbstractUndoableEdit;
import javax.swing.undo.CompoundEdit;
@@ -148,6 +149,11 @@ public abstract class AbstractDocument implements Document, Serializable
*/
Object documentCV = new Object();
+ /** An instance of a DocumentFilter.FilterBypass which allows calling
+ * the insert, remove and replace method without checking for an installed
+ * document filter.
+ */
+ DocumentFilter.FilterBypass bypass;
/**
* Creates a new <code>AbstractDocument</code> with the specified
@@ -180,6 +186,19 @@ public abstract class AbstractDocument implements Document, Serializable
content = doc;
context = ctx;
}
+
+ /** Returns the DocumentFilter.FilterBypass instance for this
+ * document and create it if it does not exist yet.
+ *
+ * @return This document's DocumentFilter.FilterBypass instance.
+ */
+ private DocumentFilter.FilterBypass getBypass()
+ {
+ if (bypass == null)
+ bypass = new Bypass();
+
+ return bypass;
+ }
/**
* Returns the paragraph {@link Element} that holds the specified position.
@@ -329,7 +348,7 @@ public abstract class AbstractDocument implements Document, Serializable
*
* @return the {@link AttributeContext} used in this <code>Document</code>
*/
- protected AttributeContext getAttributeContext()
+ protected final AttributeContext getAttributeContext()
{
return context;
}
@@ -366,7 +385,7 @@ public abstract class AbstractDocument implements Document, Serializable
* @return the thread that currently modifies this <code>Document</code>
* if there is one, otherwise <code>null</code>
*/
- protected Thread getCurrentWriter()
+ protected final Thread getCurrentWriter()
{
return currentWriter;
}
@@ -392,7 +411,7 @@ public abstract class AbstractDocument implements Document, Serializable
* @return a {@link Position} which will always mark the end of the
* <code>Document</code>
*/
- public Position getEndPosition()
+ public final Position getEndPosition()
{
// FIXME: Properly implement this by calling Content.createPosition().
return new Position()
@@ -437,7 +456,7 @@ public abstract class AbstractDocument implements Document, Serializable
* @return the property for <code>key</code> or <code>null</code> if there
* is no such property stored
*/
- public Object getProperty(Object key)
+ public final Object getProperty(Object key)
{
// FIXME: make me thread-safe
Object value = null;
@@ -470,7 +489,7 @@ public abstract class AbstractDocument implements Document, Serializable
* @return a {@link Position} which will always mark the beginning of the
* <code>Document</code>
*/
- public Position getStartPosition()
+ public final Position getStartPosition()
{
// FIXME: Properly implement this using Content.createPosition().
return new Position()
@@ -521,6 +540,9 @@ public abstract class AbstractDocument implements Document, Serializable
/**
* Inserts a String into this <code>Document</code> at the specified
* position and assigning the specified attributes to it.
+ *
+ * <p>If a {@link DocumentFilter} is installed in this document, the
+ * corresponding method of the filter object is called.</p>
*
* @param offset the location at which the string should be inserted
* @param text the content to be inserted
@@ -532,6 +554,15 @@ public abstract class AbstractDocument implements Document, Serializable
public void insertString(int offset, String text, AttributeSet attributes)
throws BadLocationException
{
+ if (documentFilter != null)
+ documentFilter.insertString(getBypass(), offset, text, attributes);
+ else
+ insertStringImpl(offset, text, attributes);
+ }
+
+ void insertStringImpl(int offset, String text, AttributeSet attributes)
+ throws BadLocationException
+ {
// Just return when no text to insert was given.
if (text == null || text.length() == 0)
return;
@@ -589,7 +620,7 @@ public abstract class AbstractDocument implements Document, Serializable
* @param key the key of the property to be stored
* @param value the value of the property to be stored
*/
- public void putProperty(Object key, Object value)
+ public final void putProperty(Object key, Object value)
{
// FIXME: make me thread-safe
if (properties == null)
@@ -602,7 +633,7 @@ public abstract class AbstractDocument implements Document, Serializable
* Blocks until a read lock can be obtained. Must block if there is
* currently a writer modifying the <code>Document</code>.
*/
- public void readLock()
+ public final void readLock()
{
if (currentWriter != null && currentWriter.equals(Thread.currentThread()))
return;
@@ -627,7 +658,7 @@ public abstract class AbstractDocument implements Document, Serializable
* Releases the read lock. If this was the only reader on this
* <code>Document</code>, writing may begin now.
*/
- public void readUnlock()
+ public final void readUnlock()
{
// Note we could have a problem here if readUnlock was called without a
// prior call to readLock but the specs simply warn users to ensure that
@@ -673,6 +704,9 @@ public abstract class AbstractDocument implements Document, Serializable
/**
* Removes a piece of content from this <code>Document</code>.
+ *
+ * <p>If a {@link DocumentFilter} is installed in this document, the
+ * corresponding method of the filter object is called.</p>
*
* @param offset the start offset of the fragment to be removed
* @param length the length of the fragment to be removed
@@ -683,6 +717,14 @@ public abstract class AbstractDocument implements Document, Serializable
*/
public void remove(int offset, int length) throws BadLocationException
{
+ if (documentFilter != null)
+ documentFilter.remove(getBypass(), offset, length);
+ else
+ removeImpl(offset, length);
+ }
+
+ void removeImpl(int offset, int length) throws BadLocationException
+ {
DefaultDocumentEvent event =
new DefaultDocumentEvent(offset, length,
DocumentEvent.EventType.REMOVE);
@@ -707,6 +749,9 @@ public abstract class AbstractDocument implements Document, Serializable
/**
* Replaces a piece of content in this <code>Document</code> with
* another piece of content.
+ *
+ * <p>If a {@link DocumentFilter} is installed in this document, the
+ * corresponding method of the filter object is called.</p>
*
* @param offset the start offset of the fragment to be removed
* @param length the length of the fragment to be removed
@@ -720,11 +765,21 @@ public abstract class AbstractDocument implements Document, Serializable
* @since 1.4
*/
public void replace(int offset, int length, String text,
+ AttributeSet attributes)
+ throws BadLocationException
+ {
+ if (documentFilter != null)
+ documentFilter.replace(getBypass(), offset, length, text, attributes);
+ else
+ replaceImpl(offset, length, text, attributes);
+ }
+
+ void replaceImpl(int offset, int length, String text,
AttributeSet attributes)
throws BadLocationException
{
- remove(offset, length);
- insertString(offset, text, attributes);
+ removeImpl(offset, length);
+ insertStringImpl(offset, text, attributes);
}
/**
@@ -854,7 +909,7 @@ public abstract class AbstractDocument implements Document, Serializable
* Blocks until a write lock can be obtained. Must wait if there are
* readers currently reading or another thread is currently writing.
*/
- protected void writeLock()
+ protected final void writeLock()
{
if (currentWriter != null && currentWriter.equals(Thread.currentThread()))
return;
@@ -881,7 +936,7 @@ public abstract class AbstractDocument implements Document, Serializable
* Releases the write lock. This allows waiting readers or writers to
* obtain the lock.
*/
- protected void writeUnlock()
+ protected final void writeUnlock()
{
synchronized (documentCV)
{
@@ -2239,4 +2294,37 @@ public abstract class AbstractDocument implements Document, Serializable
+ getStartOffset() + "," + getEndOffset() + "\n");
}
}
+
+ /** A class whose methods delegate to the insert, remove and replace methods
+ * of this document which do not check for an installed DocumentFilter.
+ */
+ class Bypass extends DocumentFilter.FilterBypass
+ {
+
+ public Document getDocument()
+ {
+ return AbstractDocument.this;
+ }
+
+ public void insertString(int offset, String string, AttributeSet attr)
+ throws BadLocationException
+ {
+ AbstractDocument.this.insertStringImpl(offset, string, attr);
+ }
+
+ public void remove(int offset, int length)
+ throws BadLocationException
+ {
+ AbstractDocument.this.removeImpl(offset, length);
+ }
+
+ public void replace(int offset, int length, String string,
+ AttributeSet attrs)
+ throws BadLocationException
+ {
+ AbstractDocument.this.replaceImpl(offset, length, string, attrs);
+ }
+
+ }
+
}
diff --git a/javax/swing/text/AsyncBoxView.java b/javax/swing/text/AsyncBoxView.java
index 1988bbadc..90447f86e 100644
--- a/javax/swing/text/AsyncBoxView.java
+++ b/javax/swing/text/AsyncBoxView.java
@@ -1030,7 +1030,7 @@ public class AsyncBoxView
*
* @since 1.4
*/
- public void setEstimatedMajorSpan(boolean estimated)
+ protected void setEstimatedMajorSpan(boolean estimated)
{
estimatedMajorSpan = estimated;
}
@@ -1045,7 +1045,7 @@ public class AsyncBoxView
*
* @since 1.4
*/
- public boolean getEstimatedMajorSpan()
+ protected boolean getEstimatedMajorSpan()
{
return estimatedMajorSpan;
}
@@ -1367,7 +1367,7 @@ public class AsyncBoxView
/**
* Updates the layout for this view. This is implemented to trigger
- * {link ChildLocator#childChanged} for the changed view, if there is
+ * {@link ChildLocator#childChanged} for the changed view, if there is
* any.
*
* @param ec the element change, may be <code>null</code> if there were
diff --git a/javax/swing/text/BoxView.java b/javax/swing/text/BoxView.java
index b5907dcbb..a184a8131 100644
--- a/javax/swing/text/BoxView.java
+++ b/javax/swing/text/BoxView.java
@@ -1,5 +1,5 @@
/* BoxView.java -- An composite view
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -591,9 +591,12 @@ public class BoxView
for (int i = 0; i < count; ++i)
{
copy.setBounds(r);
- childAllocation(i, r);
+ // The next call modifies copy.
+ childAllocation(i, copy);
if (copy.contains(x, y))
{
+ // Modify r on success.
+ r.setBounds(copy);
result = getView(i);
break;
}
@@ -919,7 +922,7 @@ public class BoxView
return super.viewToModel(x, y, a, bias);
}
- protected boolean flipEastAndWestEnds(int position, Position.Bias bias)
+ protected boolean flipEastAndWestAtEnds(int position, Position.Bias bias)
{
// FIXME: What to do here?
return super.flipEastAndWestAtEnds(position, bias);
diff --git a/javax/swing/text/CompositeView.java b/javax/swing/text/CompositeView.java
index a10aca7e6..17f13dbed 100644
--- a/javax/swing/text/CompositeView.java
+++ b/javax/swing/text/CompositeView.java
@@ -1,5 +1,5 @@
/* CompositeView.java -- An abstract view that manages child views
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -218,21 +218,24 @@ public abstract class CompositeView
throws BadLocationException
{
int childIndex = getViewIndex(pos, bias);
+ if (childIndex == -1)
+ throw new BadLocationException("Position " + pos + " is not represented by view.", pos);
+
Shape ret = null;
- if (childIndex != -1)
- {
- View child = getView(childIndex);
- Shape childAlloc = getChildAllocation(childIndex, a);
- if (childAlloc == null)
- ret = createDefaultLocation(a, bias);
- Shape result = child.modelToView(pos, childAlloc, bias);
- if (result != null)
- ret = result;
- else
- ret = createDefaultLocation(a, bias);
- }
- else
+
+ View child = getView(childIndex);
+ Shape childAlloc = getChildAllocation(childIndex, a);
+
+ if (childAlloc == null)
ret = createDefaultLocation(a, bias);
+
+ Shape result = child.modelToView(pos, childAlloc, bias);
+
+ if (result != null)
+ ret = result;
+ else
+ ret = createDefaultLocation(a, bias);
+
return ret;
}
@@ -301,7 +304,7 @@ public abstract class CompositeView
{
Rectangle r = getInsideAllocation(a);
View view = getViewAtPoint((int) x, (int) y, r);
- return view.viewToModel(x, y, a, b);
+ return view.viewToModel(x, y, r, b);
}
return 0;
}
@@ -630,8 +633,51 @@ public abstract class CompositeView
Position.Bias[] biasRet)
throws BadLocationException
{
- // FIXME: Implement this correctly.
- return pos;
+ // TODO: It is unknown to me how this method has to be implemented and
+ // there is no specification telling me how to do it properly. Therefore
+ // the implementation was done for cases that are known.
+ //
+ // If this method ever happens to act silly for your particular case then
+ // it is likely that it is a cause of not knowing about your case when it
+ // was implemented first. You are free to fix the behavior.
+ //
+ // Here are the assumptions that lead to the implementation:
+ // If direction is NORTH chose the View preceding the one that contains the
+ // offset 'pos' (imagine the views are stacked on top of each other where
+ // the top is 0 and the bottom is getViewCount()-1.
+ // Consecutively when the direction is SOUTH the View following the one
+ // the offset 'pos' lies in is questioned.
+ //
+ // This limitation is described as PR 27345.
+ int index = getViewIndex(pos, b);
+ View v = null;
+
+ if (index == -1)
+ return pos;
+
+ switch (direction)
+ {
+ case NORTH:
+ // If we cannot calculate a proper offset return the one that was
+ // provided.
+ if (index <= 0)
+ return pos;
+
+ v = getView(index - 1);
+ break;
+ case SOUTH:
+ // If we cannot calculate a proper offset return the one that was
+ // provided.
+ if (index >= getViewCount() - 1)
+ return pos;
+
+ v = getView(index + 1);
+ break;
+ default:
+ throw new IllegalArgumentException();
+ }
+
+ return v.getNextVisualPositionFrom(pos, b, a, direction, biasRet);
}
/**
@@ -664,8 +710,55 @@ public abstract class CompositeView
Position.Bias[] biasRet)
throws BadLocationException
{
- // FIXME: Implement this correctly.
- return pos;
+ // TODO: It is unknown to me how this method has to be implemented and
+ // there is no specification telling me how to do it properly. Therefore
+ // the implementation was done for cases that are known.
+ //
+ // If this method ever happens to act silly for your particular case then
+ // it is likely that it is a cause of not knowing about your case when it
+ // was implemented first. You are free to fix the behavior.
+ //
+ // Here are the assumptions that lead to the implementation:
+ // If direction is EAST increase the offset by one and ask the View to
+ // which that index belong to calculate the 'next visual position'.
+ // If the direction is WEST do the same with offset 'pos' being decreased
+ // by one.
+ // This behavior will fail in a right-to-left or bidi environment!
+ //
+ // This limitation is described as PR 27346.
+ int index;
+
+ View v = null;
+
+ switch (direction)
+ {
+ case EAST:
+ index = getViewIndex(pos + 1, b);
+ // If we cannot calculate a proper offset return the one that was
+ // provided.
+ if (index == -1)
+ return pos;
+
+ v = getView(index);
+ break;
+ case WEST:
+ index = getViewIndex(pos - 1, b);
+ // If we cannot calculate a proper offset return the one that was
+ // provided.
+ if (index == -1)
+ return pos;
+
+ v = getView(index);
+ break;
+ default:
+ throw new IllegalArgumentException();
+ }
+
+ return v.getNextVisualPositionFrom(pos,
+ b,
+ a,
+ direction,
+ biasRet);
}
/**
diff --git a/javax/swing/text/DefaultCaret.java b/javax/swing/text/DefaultCaret.java
index 7bfb42688..c9369af20 100644
--- a/javax/swing/text/DefaultCaret.java
+++ b/javax/swing/text/DefaultCaret.java
@@ -59,17 +59,48 @@ import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.EventListenerList;
+import javax.swing.text.Position.Bias;
/**
* The default implementation of the {@link Caret} interface.
*
- * @author orgininal author unknown
+ * @author original author unknown
* @author Roman Kennke (roman@kennke.org)
*/
public class DefaultCaret extends Rectangle
implements Caret, FocusListener, MouseListener, MouseMotionListener
{
+
+ /** A text component in the current VM which currently has a
+ * text selection or <code>null</code>.
+ */
+ static JTextComponent componentWithSelection;
+
+ /** An implementation of NavigationFilter.FilterBypass which delegates
+ * to the corresponding methods of the <code>DefaultCaret</code>.
+ *
+ * @author Robert Schuster (robertschuster@fsfe.org)
+ */
+ class Bypass extends NavigationFilter.FilterBypass
+ {
+
+ public Caret getCaret()
+ {
+ return DefaultCaret.this;
+ }
+
+ public void moveDot(int dot, Bias bias)
+ {
+ DefaultCaret.this.moveDotImpl(dot);
+ }
+ public void setDot(int dot, Bias bias)
+ {
+ DefaultCaret.this.setDotImpl(dot);
+ }
+
+ }
+
/**
* Controls the blinking of the caret.
*
@@ -294,12 +325,29 @@ public class DefaultCaret extends Rectangle
private BlinkTimerListener blinkListener;
/**
+ * A <code>NavigationFilter.FilterBypass</code> instance which
+ * is provided to the a <code>NavigationFilter</code> to
+ * unconditionally set or move the caret.
+ */
+ NavigationFilter.FilterBypass bypass;
+
+ /**
* Creates a new <code>DefaultCaret</code> instance.
*/
public DefaultCaret()
{
// Nothing to do here.
}
+
+ /** Returns the caret's <code>NavigationFilter.FilterBypass</code> instance
+ * and creates it if it does not yet exist.
+ *
+ * @return The caret's <code>NavigationFilter.FilterBypass</code> instance.
+ */
+ private NavigationFilter.FilterBypass getBypass()
+ {
+ return (bypass == null) ? bypass = new Bypass() : bypass;
+ }
/**
* Sets the Caret update policy.
@@ -346,7 +394,8 @@ public class DefaultCaret extends Rectangle
*/
public void mouseDragged(MouseEvent event)
{
- moveCaret(event);
+ if (event.getButton() == MouseEvent.BUTTON1)
+ moveCaret(event);
}
/**
@@ -379,7 +428,7 @@ public class DefaultCaret extends Rectangle
{
int count = event.getClickCount();
- if (count >= 2)
+ if (event.getButton() == MouseEvent.BUTTON1 && count >= 2)
{
int newDot = getComponent().viewToModel(event.getPoint());
JTextComponent t = getComponent();
@@ -393,19 +442,20 @@ public class DefaultCaret extends Rectangle
}
else
{
- int nextWord = Utilities.getNextWord(t, newDot);
+ int wordStart = Utilities.getWordStart(t, newDot);
// When the mouse points at the offset of the first character
// in a word Utilities().getPreviousWord will not return that
// word but we want to select that. We have to use
- // Utilities.nextWord() to get it.
- if (newDot == nextWord)
+ // Utilities.getWordStart() to get it.
+ if (newDot == wordStart)
{
- setDot(nextWord);
- moveDot(Utilities.getNextWord(t, nextWord));
+ setDot(wordStart);
+ moveDot(Utilities.getWordEnd(t, wordStart));
}
else
{
+ int nextWord = Utilities.getNextWord(t, newDot);
int previousWord = Utilities.getPreviousWord(t, newDot);
int previousWordEnd = Utilities.getWordEnd(t, previousWord);
@@ -465,10 +515,35 @@ public class DefaultCaret extends Rectangle
*/
public void mousePressed(MouseEvent event)
{
- if (event.isShiftDown())
- moveCaret(event);
- else
- positionCaret(event);
+ int button = event.getButton();
+
+ // The implementation assumes that consuming the event makes the AWT event
+ // mechanism forget about this event instance and not transfer focus.
+ // By observing how the RI reacts the following behavior has been
+ // implemented (in regard to text components):
+ // - a left-click moves the caret
+ // - a left-click when shift is held down expands the selection
+ // - a right-click or click with any additionaly mouse button
+ // on a text component is ignored
+ // - a middle-click positions the caret and pastes the clipboard
+ // contents.
+ // - a middle-click when shift is held down is ignored
+
+ if (button == MouseEvent.BUTTON1)
+ if (event.isShiftDown())
+ moveCaret(event);
+ else
+ positionCaret(event);
+ else if(button == MouseEvent.BUTTON2)
+ if (event.isShiftDown())
+ event.consume();
+ else
+ {
+ positionCaret(event);
+ textComponent.paste();
+ }
+ else
+ event.consume();
}
/**
@@ -646,10 +721,13 @@ public class DefaultCaret extends Rectangle
{
try
{
- if (highlightEntry == null)
- highlightEntry = highlighter.addHighlight(0, 0, getSelectionPainter());
- else
+ if (highlightEntry != null)
highlighter.changeHighlight(highlightEntry, 0, 0);
+
+ // Free the global variable which stores the text component with an active
+ // selection.
+ if (componentWithSelection == textComponent)
+ componentWithSelection = null;
}
catch (BadLocationException e)
{
@@ -685,6 +763,17 @@ public class DefaultCaret extends Rectangle
highlightEntry = highlighter.addHighlight(p0, p1, getSelectionPainter());
else
highlighter.changeHighlight(highlightEntry, p0, p1);
+
+ // If another component currently has a text selection clear that selection
+ // first.
+ if (componentWithSelection != null)
+ if (componentWithSelection != textComponent)
+ {
+ Caret c = componentWithSelection.getCaret();
+ c.setDot(c.getDot());
+ }
+ componentWithSelection = textComponent;
+
}
catch (BadLocationException e)
{
@@ -786,7 +875,7 @@ public class DefaultCaret extends Rectangle
if (visible)
{
g.setColor(textComponent.getCaretColor());
- g.drawLine(rect.x, rect.y, rect.x, rect.y + rect.height);
+ g.drawLine(rect.x, rect.y, rect.x, rect.y + rect.height - 1);
}
}
@@ -898,12 +987,24 @@ public class DefaultCaret extends Rectangle
* Moves the <code>dot</code> location without touching the
* <code>mark</code>. This is used when making a selection.
*
+ * <p>If the underlying text component has a {@link NavigationFilter}
+ * installed the caret will call the corresponding method of that object.</p>
+ *
* @param dot the location where to move the dot
*
* @see #setDot(int)
*/
public void moveDot(int dot)
{
+ NavigationFilter filter = textComponent.getNavigationFilter();
+ if (filter != null)
+ filter.moveDot(getBypass(), dot, Bias.Forward);
+ else
+ moveDotImpl(dot);
+ }
+
+ void moveDotImpl(int dot)
+ {
if (dot >= 0)
{
Document doc = textComponent.getDocument();
@@ -912,8 +1013,8 @@ public class DefaultCaret extends Rectangle
this.dot = Math.max(this.dot, 0);
handleHighlight();
- adjustVisibility(this);
appear();
+ adjustVisibility(this);
}
}
@@ -922,12 +1023,24 @@ public class DefaultCaret extends Rectangle
* <code>Document</code>. This also sets the <code>mark</code> to the new
* location.
*
+ * <p>If the underlying text component has a {@link NavigationFilter}
+ * installed the caret will call the corresponding method of that object.</p>
+ *
* @param dot
* the new position to be set
* @see #moveDot(int)
*/
public void setDot(int dot)
{
+ NavigationFilter filter = textComponent.getNavigationFilter();
+ if (filter != null)
+ filter.setDot(getBypass(), dot, Bias.Forward);
+ else
+ setDotImpl(dot);
+ }
+
+ void setDotImpl(int dot)
+ {
if (dot >= 0)
{
Document doc = textComponent.getDocument();
@@ -937,8 +1050,8 @@ public class DefaultCaret extends Rectangle
this.mark = this.dot;
clearHighlight();
- adjustVisibility(this);
appear();
+ adjustVisibility(this);
}
}
@@ -1053,7 +1166,16 @@ public class DefaultCaret extends Rectangle
// must set a valid value here, since otherwise the painting mechanism
// sets a zero clip and never calls paint.
if (height <= 0)
- height = getComponent().getHeight();
+ try
+ {
+ height = textComponent.modelToView(dot).height;
+ }
+ catch (BadLocationException ble)
+ {
+ // Should not happen.
+ throw new InternalError("Caret location not within document range.");
+ }
+
repaint();
}
@@ -1078,4 +1200,5 @@ public class DefaultCaret extends Rectangle
blinkTimer = new Timer(getBlinkRate(), blinkListener);
blinkTimer.setRepeats(true);
}
+
}
diff --git a/javax/swing/text/DefaultHighlighter.java b/javax/swing/text/DefaultHighlighter.java
index 33b5fcab8..59f77316e 100644
--- a/javax/swing/text/DefaultHighlighter.java
+++ b/javax/swing/text/DefaultHighlighter.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.text;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Insets;
@@ -45,6 +47,7 @@ import java.awt.Rectangle;
import java.awt.Shape;
import java.util.ArrayList;
+import javax.swing.SwingUtilities;
import javax.swing.plaf.TextUI;
public class DefaultHighlighter extends LayeredHighlighter
@@ -71,60 +74,102 @@ public class DefaultHighlighter extends LayeredHighlighter
}
public void paint(Graphics g, int p0, int p1, Shape bounds,
- JTextComponent c)
+ JTextComponent t)
{
- Rectangle r0 = null;
- Rectangle r1 = null;
- Rectangle rect = bounds.getBounds();
-
- try
- {
- r0 = c.modelToView(p0);
- r1 = c.modelToView(p1);
- }
- catch (BadLocationException e)
- {
- // This should never occur.
- return;
- }
+ if (p0 == p1)
+ return;
- if (r0 == null || r1 == null)
- return;
+ Rectangle rect = bounds.getBounds();
if (color == null)
- g.setColor(c.getSelectionColor());
+ g.setColor(t.getSelectionColor());
else
- g.setColor(color);
-
- // Check if only one line to highlight.
- if (r0.y == r1.y)
- {
- r0.width = r1.x - r0.x;
- paintHighlight(g, r0);
- return;
- }
-
- // First line, from p0 to end-of-line.
- r0.width = rect.x + rect.width - r0.x;
- paintHighlight(g, r0);
-
- // FIXME: All the full lines in between, if any (assumes that all lines
- // have the same height -- not a good assumption with JEditorPane/JTextPane).
- r0.y += r0.height;
- r0.x = rect.x;
- r0.width = rect.width;
+ g.setColor(color);
+
+ TextUI ui = t.getUI();
- while (r0.y < r1.y)
- {
- paintHighlight(g, r0);
- r0.y += r0.height;
- }
-
- // Last line, from beginning-of-line to p1.
- // The "-1" is neccessary else we would paint one pixel column more
- // than in the case where the selection is only on one line.
- r0.width = r1.x + r1.width - 1;
- paintHighlight(g, r0);
+ try
+ {
+
+ Rectangle l0 = ui.modelToView(t, p0, null);
+ Rectangle l1 = ui.modelToView(t, p1, null);
+
+ // Note: The computed locations may lie outside of the allocation
+ // area if the text is scrolled.
+
+ if (l0.y == l1.y)
+ {
+ SwingUtilities.computeUnion(l0.x, l0.y, l0.width, l0.height, l1);
+
+ // Paint only inside the allocation area.
+ SwingUtilities.computeIntersection(rect.x, rect.y, rect.width, rect.height, l1);
+
+ paintHighlight(g, l1);
+ }
+ else
+ {
+ // 1. The line of p0 is painted from the position of p0
+ // to the right border.
+ // 2. All lines between the ones where p0 and p1 lie on
+ // are completely highlighted. The allocation area is used to find
+ // out the bounds.
+ // 3. The final line is painted from the left border to the
+ // position of p1.
+
+ // Highlight first line until the end.
+ // If rect.x is non-zero the calculation will properly adjust the
+ // area to be painted.
+ l0.x -= rect.x;
+ l0.width = rect.width - l0.x - rect.x;
+
+ paintHighlight(g, l0);
+
+ int posBelow = Utilities.getPositionBelow(t, p0, l0.x);
+ int p1RowStart = Utilities.getRowStart(t, p1);
+ if (posBelow != -1
+ && posBelow != p0
+ && Utilities.getRowStart(t, posBelow)
+ != p1RowStart)
+ {
+ Rectangle grow = ui.modelToView(t, posBelow);
+ grow.x = rect.x;
+ grow.width = rect.width;
+
+ // Find further lines which have to be highlighted completely.
+ int nextPosBelow = posBelow;
+ while (nextPosBelow != -1
+ && Utilities.getRowStart(t, nextPosBelow) != p1RowStart)
+ {
+ posBelow = nextPosBelow;
+ nextPosBelow = Utilities.getPositionBelow(t, posBelow, l0.x);
+
+ if (nextPosBelow == posBelow)
+ break;
+ }
+ // Now posBelow is an offset on the last line which has to be painted
+ // completely. (newPosBelow is on the same line as p1)
+
+ // Retrieve the rectangle of posBelow and use its y and height
+ // value to calculate the final height of the multiple line
+ // spanning rectangle.
+ Rectangle end = ui.modelToView(t, posBelow);
+ grow.height = end.y + end.height - grow.y;
+
+ paintHighlight(g, grow);
+ }
+
+ // Paint last line from its beginning to the position of p1.
+ l1.width = l1.x + l1.width - rect.x;
+ l1.x = rect.x;
+ paintHighlight(g, l1);
+ }
+ }
+ catch (BadLocationException ex)
+ {
+ AssertionError err = new AssertionError("Unexpected bad location exception");
+ err.initCause(ex);
+ throw err;
+ }
}
public Shape paintLayer(Graphics g, int p0, int p1, Shape bounds,
@@ -330,6 +375,7 @@ public class DefaultHighlighter extends LayeredHighlighter
public void paintLayeredHighlights(Graphics g, int p0, int p1,
Shape viewBounds, JTextComponent editor,
View view)
+ throws NotImplementedException
{
// TODO: Implement this properly.
}
diff --git a/javax/swing/text/FieldView.java b/javax/swing/text/FieldView.java
index b5b6f5214..0c2f0fef1 100644
--- a/javax/swing/text/FieldView.java
+++ b/javax/swing/text/FieldView.java
@@ -1,5 +1,5 @@
/* FieldView.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,20 +39,86 @@ exception statement from your version. */
package javax.swing.text;
import java.awt.Component;
-import java.awt.ComponentOrientation;
+import java.awt.Container;
import java.awt.FontMetrics;
import java.awt.Graphics;
+import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Shape;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.BoundedRangeModel;
import javax.swing.JTextField;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
public class FieldView extends PlainView
{
+ BoundedRangeModel horizontalVisibility;
+
+ /** Caches the preferred span of the X axis. It is invalidated by
+ * setting it to -1f. This is done when text in the document
+ * is inserted, removed or changed. The value is corrected as
+ * soon as calculateHorizontalSpan() is called.
+ */
+ float cachedSpan = -1f;
+
public FieldView(Element elem)
{
super(elem);
+
+ }
+
+ /** Checks whether the given container is a JTextField. If so
+ * it retrieves the textfield's horizontalVisibility instance.
+ *
+ * <p>This method should be only called when the view's container
+ * is valid. Naturally that would be the setParent() method however
+ * that method is not overridden in the RI and that is why we chose
+ * paint() instead.</p>
+ */
+ private void checkContainer()
+ {
+ Container c = getContainer();
+
+ if (c instanceof JTextField)
+ {
+ horizontalVisibility = ((JTextField) c).getHorizontalVisibility();
+
+ // Provokes a repaint when the BoundedRangeModel's values change
+ // (which is what the RI does).
+ horizontalVisibility.addChangeListener(new ChangeListener(){
+ public void stateChanged(ChangeEvent event) {
+ getContainer().repaint();
+ };
+ });
+
+ // It turned out that the span calculated at this point is wrong
+ // and needs to be recalculated (e.g. a different font setting is
+ // not taken into account).
+ calculateHorizontalSpan();
+
+ // Initializes the BoundedRangeModel properly.
+ updateVisibility();
+ }
+
+ }
+
+ private void updateVisibility()
+ {
+ JTextField tf = (JTextField) getContainer();
+ Insets insets = tf.getInsets();
+
+ int width = tf.getWidth() - insets.left - insets.right;
+
+ horizontalVisibility.setMaximum(Math.max((int) ((cachedSpan != -1f)
+ ? cachedSpan
+ : calculateHorizontalSpan()),
+ width));
+
+ horizontalVisibility.setExtent(width - 1);
}
protected FontMetrics getFontMetrics()
@@ -72,41 +138,47 @@ public class FieldView extends PlainView
*/
protected Shape adjustAllocation(Shape shape)
{
+ // Return null when the original allocation is null (like the RI).
+ if (shape == null)
+ return null;
+
Rectangle rectIn = shape.getBounds();
// vertical adjustment
int height = (int) getPreferredSpan(Y_AXIS);
int y = rectIn.y + (rectIn.height - height) / 2;
// horizontal adjustment
JTextField textField = (JTextField) getContainer();
- int halign = textField.getHorizontalAlignment();
- int width = (int) getPreferredSpan(X_AXIS);
+ int width = (int) ((cachedSpan != -1f) ? cachedSpan : calculateHorizontalSpan());
int x;
- ComponentOrientation orientation = textField.getComponentOrientation();
- switch (halign)
- {
- case JTextField.CENTER:
- x = rectIn.x + (rectIn.width - width) / 2;
- break;
- case JTextField.RIGHT:
- x = rectIn.x + (rectIn.width - width);
- break;
- case JTextField.TRAILING:
- if (orientation.isLeftToRight())
- x = rectIn.x + (rectIn.width - width);
- else
- x = rectIn.x;
- break;
- case JTextField.LEADING:
- if (orientation.isLeftToRight())
+ if (horizontalVisibility != null && horizontalVisibility.getExtent() < width)
+ x = rectIn.x - horizontalVisibility.getValue();
+ else
+ switch (textField.getHorizontalAlignment())
+ {
+ case JTextField.CENTER:
+ x = rectIn.x + (rectIn.width - width) / 2;
+ break;
+ case JTextField.RIGHT:
+ x = rectIn.x + (rectIn.width - width - 1);
+ break;
+ case JTextField.TRAILING:
+ if (textField.getComponentOrientation().isLeftToRight())
+ x = rectIn.x + (rectIn.width - width - 1);
+ else
+ x = rectIn.x;
+ break;
+ case JTextField.LEADING:
+ if (textField.getComponentOrientation().isLeftToRight())
+ x = rectIn.x;
+ else
+ x = rectIn.x + (rectIn.width - width - 1);
+ break;
+ case JTextField.LEFT:
+ default:
x = rectIn.x;
- else
- x = rectIn.x + (rectIn.width - width);
- break;
- case JTextField.LEFT:
- default:
- x = rectIn.x;
- break;
- }
+ break;
+ }
+
return new Rectangle(x, y, width, height);
}
@@ -115,18 +187,31 @@ public class FieldView extends PlainView
if (axis != X_AXIS && axis != Y_AXIS)
throw new IllegalArgumentException();
- FontMetrics fm = getFontMetrics();
if (axis == Y_AXIS)
return super.getPreferredSpan(axis);
- String text;
+ if (cachedSpan != -1f)
+ return cachedSpan;
+
+ return calculateHorizontalSpan();
+ }
+
+ /** Calculates and sets the horizontal span and stores the value
+ * in cachedSpan.
+ */
+ private float calculateHorizontalSpan()
+ {
+ Segment s = getLineBuffer();
Element elem = getElement();
try
{
- text = elem.getDocument().getText(elem.getStartOffset(),
- elem.getEndOffset());
+ elem.getDocument().getText(elem.getStartOffset(),
+ elem.getEndOffset() - 1,
+ s);
+
+ return cachedSpan = Utilities.getTabbedTextWidth(s, getFontMetrics(), 0, this, s.offset);
}
catch (BadLocationException e)
{
@@ -135,8 +220,6 @@ public class FieldView extends PlainView
ae.initCause(e);
throw ae;
}
-
- return fm.stringWidth(text);
}
public int getResizeWeight(int axis)
@@ -153,19 +236,39 @@ public class FieldView extends PlainView
public void paint(Graphics g, Shape s)
{
+ if (horizontalVisibility == null)
+ checkContainer();
+
Shape newAlloc = adjustAllocation(s);
+
+ // Set a clip to prevent drawing outside of the allocation area.
+ // TODO: Is there a better way to achieve this?
+ Shape clip = g.getClip();
+ g.setClip(s);
super.paint(g, newAlloc);
+ g.setClip(clip);
}
public void insertUpdate(DocumentEvent ev, Shape shape, ViewFactory vf)
{
+ cachedSpan = -1f;
+
+ if (horizontalVisibility != null)
+ updateVisibility();
+
Shape newAlloc = adjustAllocation(shape);
+
super.insertUpdate(ev, newAlloc, vf);
getContainer().repaint();
}
public void removeUpdate(DocumentEvent ev, Shape shape, ViewFactory vf)
{
+ cachedSpan = -1f;
+
+ if (horizontalVisibility != null)
+ updateVisibility();
+
Shape newAlloc = adjustAllocation(shape);
super.removeUpdate(ev, newAlloc, vf);
getContainer().repaint();
@@ -173,8 +276,13 @@ public class FieldView extends PlainView
public void changedUpdate(DocumentEvent ev, Shape shape, ViewFactory vf)
{
+ cachedSpan = -1f;
+
+ if (horizontalVisibility != null)
+ updateVisibility();
+
Shape newAlloc = adjustAllocation(shape);
- super.removeUpdate(ev, newAlloc, vf);
+ super.changedUpdate(ev, newAlloc, vf);
getContainer().repaint();
}
diff --git a/javax/swing/text/FlowView.java b/javax/swing/text/FlowView.java
index 8be8f41e9..8ca55d834 100644
--- a/javax/swing/text/FlowView.java
+++ b/javax/swing/text/FlowView.java
@@ -433,7 +433,7 @@ public abstract class FlowView extends BoxView
/**
* Loads the children of this view. The <code>FlowView</code> does not
* directly load its children. Instead it creates a logical view
- * (@{link #layoutPool}) which is filled by the logical child views.
+ * ({@link #layoutPool}) which is filled by the logical child views.
* The real children are created at layout time and each represent one
* row.
*
diff --git a/javax/swing/text/GapContent.java b/javax/swing/text/GapContent.java
index 28d1d6ee0..219accb40 100644
--- a/javax/swing/text/GapContent.java
+++ b/javax/swing/text/GapContent.java
@@ -289,6 +289,7 @@ public class GapContent
*/
public GapContent(int size)
{
+ size = Math.max(size, 2);
buffer = (char[]) allocateArray(size);
gapStart = 1;
gapEnd = size;
@@ -351,7 +352,7 @@ public class GapContent
throw new BadLocationException("The where argument cannot be smaller"
+ " than the zero", where);
- if (where >= length)
+ if (where > length)
throw new BadLocationException("The where argument cannot be greater"
+ " than the content length", where);
@@ -375,14 +376,11 @@ public class GapContent
{
// check arguments
int length = length();
-
- if (where >= length)
- throw new BadLocationException("the where argument cannot be greater"
- + " than the content length", where);
- if ((where + nitems) > length)
+
+ if ((where + nitems) >= length)
throw new BadLocationException("where + nitems cannot be greater"
+ " than the content length", where + nitems);
-
+
String removedText = getString(where, nitems);
replace(where, nitems, null, 0);
@@ -439,6 +437,8 @@ public class GapContent
{
// check arguments
int length = length();
+ if (where < 0)
+ throw new BadLocationException("the where argument may not be below zero", where);
if (where >= length)
throw new BadLocationException("the where argument cannot be greater"
+ " than the content length", where);
@@ -642,6 +642,10 @@ public class GapContent
if (addItems != null)
{
System.arraycopy(addItems, 0, buffer, gapStart, addSize);
+
+
+ resetMarksAtZero();
+
gapStart += addSize;
}
}
diff --git a/javax/swing/text/InternationalFormatter.java b/javax/swing/text/InternationalFormatter.java
index ba3cffaba..8db435c18 100644
--- a/javax/swing/text/InternationalFormatter.java
+++ b/javax/swing/text/InternationalFormatter.java
@@ -350,7 +350,7 @@ public class InternationalFormatter
* There is no such method in the whole API! So we just call
* super.getActions here.
*/
- public Action[] getActions()
+ protected Action[] getActions()
{
return super.getActions();
}
diff --git a/javax/swing/text/JTextComponent.java b/javax/swing/text/JTextComponent.java
index 8492d8b90..1103de9b4 100644
--- a/javax/swing/text/JTextComponent.java
+++ b/javax/swing/text/JTextComponent.java
@@ -1191,6 +1191,7 @@ public abstract class JTextComponent extends JComponent
catch (BadLocationException e)
{
// This can never happen.
+ throw (InternalError) new InternalError().initCause(e);
}
}
diff --git a/javax/swing/text/PlainView.java b/javax/swing/text/PlainView.java
index 61bdb5dc8..18818c0ba 100644
--- a/javax/swing/text/PlainView.java
+++ b/javax/swing/text/PlainView.java
@@ -164,7 +164,7 @@ public class PlainView extends View implements TabExpander
{
Element line = getElement().getElement(lineIndex);
int startOffset = line.getStartOffset();
- int endOffset = line.getEndOffset();
+ int endOffset = line.getEndOffset() - 1;
if (selectionStart <= startOffset)
// Selection starts before the line ...
@@ -198,7 +198,7 @@ public class PlainView extends View implements TabExpander
// and ends behind the line: First part unselected, second
// part selected.
x = drawUnselectedText(g, x, y, startOffset, selectionStart);
- drawSelectedText(g, x, y, selectionStart, selectionEnd);
+ drawSelectedText(g, x, y, selectionStart, endOffset);
}
else
// Selection is behind this line: Draw completely unselected text.
@@ -325,7 +325,7 @@ public class PlainView extends View implements TabExpander
{
Element child = el.getElement(i);
int start = child.getStartOffset();
- int end = child.getEndOffset();
+ int end = child.getEndOffset() - 1;
try
{
el.getDocument().getText(start, end - start, seg);
@@ -437,6 +437,11 @@ public class PlainView extends View implements TabExpander
*/
protected void updateDamage(DocumentEvent changes, Shape a, ViewFactory f)
{
+ // Return early and do no updates if the allocation area is null
+ // (like the RI).
+ if (a == null)
+ return;
+
float oldMaxLineLength = maxLineLength;
Rectangle alloc = a.getBounds();
Element el = getElement();
@@ -518,7 +523,7 @@ public class PlainView extends View implements TabExpander
{
Element child = newElements[i];
int start = child.getStartOffset();
- int end = child.getEndOffset();
+ int end = child.getEndOffset() - 1;
try
{
el.getDocument().getText(start, end - start, seg);
@@ -637,7 +642,7 @@ public class PlainView extends View implements TabExpander
* @returna {@link Segment} object, that can be used to fetch text from
* the document
*/
- protected Segment getLineBuffer()
+ protected final Segment getLineBuffer()
{
if (lineBuffer == null)
lineBuffer = new Segment();
diff --git a/javax/swing/text/Position.java b/javax/swing/text/Position.java
index a9d3d09d7..bb1449e18 100644
--- a/javax/swing/text/Position.java
+++ b/javax/swing/text/Position.java
@@ -40,7 +40,7 @@ package javax.swing.text;
public interface Position
{
- static class Bias
+ static final class Bias
{
public static final Bias Backward = new Bias("backward");
public static final Bias Forward = new Bias("forward");
diff --git a/javax/swing/text/Segment.java b/javax/swing/text/Segment.java
index 875d9966c..d2364e05a 100644
--- a/javax/swing/text/Segment.java
+++ b/javax/swing/text/Segment.java
@@ -245,7 +245,8 @@ public class Segment implements Cloneable, CharacterIterator
|| position > getEndIndex())
throw new IllegalArgumentException("position: " + position
+ ", beginIndex: " + getBeginIndex()
- + ", endIndex: " + getEndIndex());
+ + ", endIndex: " + getEndIndex()
+ + ", text: " + toString());
current = position;
@@ -264,7 +265,7 @@ public class Segment implements Cloneable, CharacterIterator
*/
public String toString()
{
- return new String(array, offset, count);
+ return (array != null) ? new String(array, offset, count) : "";
}
/**
diff --git a/javax/swing/text/StyleContext.java b/javax/swing/text/StyleContext.java
index e2643a2aa..8ef34400d 100644
--- a/javax/swing/text/StyleContext.java
+++ b/javax/swing/text/StyleContext.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.text;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
@@ -711,35 +713,37 @@ public class StyleContext
// have left incomplete; I'm not sure I understand the intent properly.
public static Object getStaticAttribute(Object key)
+ throws NotImplementedException
{
throw new InternalError("not implemented");
}
public static Object getStaticAttributeKey(Object key)
+ throws NotImplementedException
{
throw new InternalError("not implemented");
}
public static void readAttributeSet(ObjectInputStream in, MutableAttributeSet a)
- throws ClassNotFoundException, IOException
+ throws ClassNotFoundException, IOException, NotImplementedException
{
throw new InternalError("not implemented");
}
public static void writeAttributeSet(ObjectOutputStream out, AttributeSet a)
- throws IOException
+ throws IOException, NotImplementedException
{
throw new InternalError("not implemented");
}
public void readAttributes(ObjectInputStream in, MutableAttributeSet a)
- throws ClassNotFoundException, IOException
+ throws ClassNotFoundException, IOException, NotImplementedException
{
throw new InternalError("not implemented");
}
public void writeAttributes(ObjectOutputStream out, AttributeSet a)
- throws IOException
+ throws IOException, NotImplementedException
{
throw new InternalError("not implemented");
}
diff --git a/javax/swing/text/Utilities.java b/javax/swing/text/Utilities.java
index da1ccdd4c..f154e55aa 100644
--- a/javax/swing/text/Utilities.java
+++ b/javax/swing/text/Utilities.java
@@ -1,5 +1,5 @@
/* Utilities.java --
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,6 +48,7 @@ import java.text.BreakIterator;
* inside this package.
*
* @author Roman Kennke (roman@ontographics.com)
+ * @author Robert Schuster (robertschuster@fsfe.org)
*/
public class Utilities
{
@@ -238,35 +239,39 @@ public class Utilities
// At the end of the for loop, this holds the requested model location
int pos;
int currentX = x0;
-
+ int width = 0;
+
for (pos = 0; pos < s.count; pos++)
{
char nextChar = s.array[s.offset+pos];
if (nextChar == 0)
- {
- if (! round)
- pos--;
break;
- }
+
if (nextChar != '\t')
- currentX += fm.charWidth(nextChar);
+ width = fm.charWidth(nextChar);
else
{
if (te == null)
- currentX += fm.charWidth(' ');
+ width = fm.charWidth(' ');
else
- currentX = (int) te.nextTabStop(currentX, pos);
+ width = ((int) te.nextTabStop(currentX, pos)) - currentX;
}
- if (currentX > x)
+ if (round)
{
- if (! round)
- pos--;
- break;
+ if (currentX + (width>>1) > x)
+ break;
}
+ else
+ {
+ if (currentX + width > x)
+ break;
+ }
+
+ currentX += width;
}
-
+
return pos + p0;
}
@@ -317,21 +322,31 @@ public class Utilities
String text = c.getText();
BreakIterator wb = BreakIterator.getWordInstance();
wb.setText(text);
+
int last = wb.following(offs);
int current = wb.next();
+ int cp;
+
while (current != BreakIterator.DONE)
{
for (int i = last; i < current; i++)
{
- // FIXME: Should use isLetter(int) and text.codePointAt(int)
- // instead, but isLetter(int) isn't implemented yet
- if (Character.isLetter(text.charAt(i)))
+ cp = text.codePointAt(i);
+
+ // Return the last found bound if there is a letter at the current
+ // location or is not whitespace (meaning it is a number or
+ // punctuation). The first case means that 'last' denotes the
+ // beginning of a word while the second case means it is the start
+ // of some else.
+ if (Character.isLetter(cp)
+ || !Character.isWhitespace(cp))
return last;
}
last = current;
current = wb.next();
}
- return BreakIterator.DONE;
+
+ throw new BadLocationException("no more word", offs);
}
/**
@@ -360,9 +375,7 @@ public class Utilities
{
for (int i = last; i < offs; i++)
{
- // FIXME: Should use isLetter(int) and text.codePointAt(int)
- // instead, but isLetter(int) isn't implemented yet
- if (Character.isLetter(text.charAt(i)))
+ if (Character.isLetter(text.codePointAt(i)))
return last;
}
last = current;
@@ -512,24 +525,28 @@ public class Utilities
int x0, int x, TabExpander e,
int startOffset)
{
- int mark = Utilities.getTabbedTextOffset(s, metrics, x0, x, e, startOffset);
+ int mark = Utilities.getTabbedTextOffset(s, metrics, x0, x, e, startOffset, false);
BreakIterator breaker = BreakIterator.getWordInstance();
breaker.setText(s);
- // If mark is equal to the end of the string, just use that position
- if (mark >= s.count)
+ // If startOffset and s.offset differ then we need to use
+ // that difference two convert the offset between the two metrics.
+ int shift = startOffset - s.offset;
+
+ // If mark is equal to the end of the string, just use that position.
+ if (mark >= shift + s.count)
return mark;
// Try to find a word boundary previous to the mark at which we
- // can break the text
- int preceding = breaker.preceding(mark + 1);
+ // can break the text.
+ int preceding = breaker.preceding(mark + 1 - shift);
if (preceding != 0)
- return preceding;
- else
- // If preceding is 0 we couldn't find a suitable word-boundary so
- // just break it on the character boundary
- return mark;
+ return preceding + shift;
+
+ // If preceding is 0 we couldn't find a suitable word-boundary so
+ // just break it on the character boundary
+ return mark;
}
/**
@@ -621,8 +638,22 @@ public class Utilities
if(offs == -1)
return -1;
- // Effectively calculates the y value of the previous line.
- Point pt = c.modelToView(offs+1).getLocation();
+ Point pt = null;
+
+ // Note: Some views represent the position after the last
+ // typed character others do not. Converting offset 3 in "a\nb"
+ // in a PlainView will return a valid rectangle while in a
+ // WrappedPlainView this will throw a BadLocationException.
+ // This behavior has been observed in the RI.
+ try
+ {
+ // Effectively calculates the y value of the next line.
+ pt = c.modelToView(offs+1).getLocation();
+ }
+ catch(BadLocationException ble)
+ {
+ return offset;
+ }
pt.x = x;
diff --git a/javax/swing/text/View.java b/javax/swing/text/View.java
index 2feaf29a4..d8ad5f585 100644
--- a/javax/swing/text/View.java
+++ b/javax/swing/text/View.java
@@ -1,5 +1,5 @@
/* View.java --
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -733,23 +733,38 @@ public abstract class View implements SwingConstants
throws BadLocationException
{
int ret = pos;
+ Rectangle r;
+ View parent;
+
switch (d)
{
- case WEST:
- ret = pos - 1;
- break;
case EAST:
- ret = pos + 1;
+ // TODO: take component orientation into account?
+ // Note: If pos is below zero the implementation will return
+ // pos + 1 regardless of whether that value is a correct offset
+ // in the document model. However this is what the RI does.
+ ret = Math.min(pos + 1, getEndOffset());
+ break;
+ case WEST:
+ // TODO: take component orientation into account?
+ ret = Math.max(pos - 1, getStartOffset());
break;
case NORTH:
- // TODO: Implement this
+ // Try to find a suitable offset by examining the area above.
+ parent = getParent();
+ r = parent.modelToView(pos, a, b).getBounds();
+ ret = parent.viewToModel(r.x, r.y - 1, a, biasRet);
break;
case SOUTH:
- // TODO: Implement this
+ // Try to find a suitable offset by examining the area below.
+ parent = getParent();
+ r = parent.modelToView(pos, a, b).getBounds();
+ ret = parent.viewToModel(r.x + r.width, r.y + r.height, a, biasRet);
break;
default:
throw new IllegalArgumentException("Illegal value for d");
}
+
return ret;
}
}
diff --git a/javax/swing/text/WrappedPlainView.java b/javax/swing/text/WrappedPlainView.java
index 3f65dd407..a6c369a4c 100644
--- a/javax/swing/text/WrappedPlainView.java
+++ b/javax/swing/text/WrappedPlainView.java
@@ -1,5 +1,5 @@
/* WrappedPlainView.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -81,6 +81,9 @@ public class WrappedPlainView extends BoxView implements TabExpander
/** The end of the selected text **/
int selectionEnd;
+ /** The height of the line (used while painting) **/
+ int lineHeight;
+
/**
* The instance returned by {@link #getLineBuffer()}.
*/
@@ -272,8 +275,20 @@ public class WrappedPlainView extends BoxView implements TabExpander
protected int calculateBreakPosition(int p0, int p1)
{
Container c = getContainer();
- Rectangle alloc = new Rectangle(0, 0, getWidth(), getHeight());
+
+ int li = getLeftInset();
+ int ti = getTopInset();
+
+ Rectangle alloc = new Rectangle(li, ti,
+ getWidth()-getRightInset()-li,
+ getHeight()-getBottomInset()-ti);
+
+ // Mimic a behavior observed in the RI.
+ if (alloc.isEmpty())
+ return 0;
+
updateMetrics();
+
try
{
getDocument().getText(p0, p1 - p0, getLineBuffer());
@@ -281,18 +296,16 @@ public class WrappedPlainView extends BoxView implements TabExpander
catch (BadLocationException ble)
{
// this shouldn't happen
+ throw new InternalError("Invalid offsets p0: " + p0 + " - p1: " + p1);
}
- // FIXME: Should we account for the insets of the container?
+
if (wordWrap)
- return p0
- + Utilities.getBreakLocation(lineBuffer, metrics, alloc.x,
- alloc.x + alloc.width, this, 0);
+ return Utilities.getBreakLocation(lineBuffer, metrics, alloc.x,
+ alloc.x + alloc.width, this, p0);
else
- {
- return p0
- + Utilities.getTabbedTextOffset(lineBuffer, metrics, alloc.x,
- alloc.x + alloc.width, this, 0);
- }
+ return p0 + Utilities.getTabbedTextOffset(lineBuffer, metrics, alloc.x,
+ alloc.x + alloc.width, this, 0,
+ true);
}
void updateMetrics()
@@ -338,8 +351,8 @@ public class WrappedPlainView extends BoxView implements TabExpander
public void insertUpdate (DocumentEvent e, Shape a, ViewFactory f)
{
super.insertUpdate(e, a, viewFactory);
- // FIXME: could improve performance by repainting only the necessary area
- getContainer().repaint();
+
+ // No repaint needed, as this is done by the WrappedLine instances.
}
/**
@@ -349,8 +362,8 @@ public class WrappedPlainView extends BoxView implements TabExpander
public void removeUpdate (DocumentEvent e, Shape a, ViewFactory f)
{
super.removeUpdate(e, a, viewFactory);
- // FIXME: could improve performance by repainting only the necessary area
- getContainer().repaint();
+
+ // No repaint needed, as this is done by the WrappedLine instances.
}
/**
@@ -361,8 +374,8 @@ public class WrappedPlainView extends BoxView implements TabExpander
public void changedUpdate (DocumentEvent e, Shape a, ViewFactory f)
{
super.changedUpdate(e, a, viewFactory);
- // FIXME: could improve performance by repainting only the necessary area
- getContainer().repaint();
+
+ // No repaint needed, as this is done by the WrappedLine instances.
}
class WrappedLineCreator implements ViewFactory
@@ -385,9 +398,19 @@ public class WrappedPlainView extends BoxView implements TabExpander
public void paint(Graphics g, Shape a)
{
JTextComponent comp = (JTextComponent)getContainer();
+ // Ensure metrics are up-to-date.
+ updateMetrics();
+
selectionStart = comp.getSelectionStart();
selectionEnd = comp.getSelectionEnd();
- updateMetrics();
+
+ selectedColor = comp.getSelectedTextColor();
+ unselectedColor = comp.getForeground();
+ disabledColor = comp.getDisabledTextColor();
+ selectedColor = comp.getSelectedTextColor();
+ lineHeight = metrics.getHeight();
+ g.setFont(comp.getFont());
+
super.paint(g, a);
}
@@ -406,7 +429,7 @@ public class WrappedPlainView extends BoxView implements TabExpander
class WrappedLine extends View
{
/** Used to cache the number of lines for this View **/
- int numLines;
+ int numLines = 1;
public WrappedLine(Element elem)
{
@@ -420,48 +443,47 @@ public class WrappedPlainView extends BoxView implements TabExpander
*/
public void paint(Graphics g, Shape s)
{
- // Ensure metrics are up-to-date.
- updateMetrics();
- JTextComponent textComponent = (JTextComponent) getContainer();
-
- g.setFont(textComponent.getFont());
- selectedColor = textComponent.getSelectedTextColor();
- unselectedColor = textComponent.getForeground();
- disabledColor = textComponent.getDisabledTextColor();
-
- // FIXME: this is a hack, for some reason textComponent.getSelectedColor
- // was returning black, which is not visible against a black background
- selectedColor = Color.WHITE;
-
Rectangle rect = s.getBounds();
- int lineHeight = metrics.getHeight();
int end = getEndOffset();
int currStart = getStartOffset();
- int currEnd;
+ int currEnd;
+ int count = 0;
while (currStart < end)
{
currEnd = calculateBreakPosition(currStart, end);
+
drawLine(currStart, currEnd, g, rect.x, rect.y + metrics.getAscent());
+
rect.y += lineHeight;
if (currEnd == currStart)
currStart ++;
else
- currStart = currEnd;
+ currStart = currEnd;
+
+ count++;
+
}
+
+ if (count != numLines)
+ {
+ numLines = count;
+ preferenceChanged(this, false, true);
+ }
+
}
/**
- * Determines the number of logical lines that the Element
- * needs to be displayed
- * @return the number of lines needed to display the Element
+ * Calculates the number of logical lines that the Element
+ * needs to be displayed and updates the variable numLines
+ * accordingly.
*/
- int determineNumLines()
+ void determineNumLines()
{
numLines = 0;
int end = getEndOffset();
if (end == 0)
- return 0;
+ return;
int breakPoint;
for (int i = getStartOffset(); i < end;)
@@ -470,12 +492,17 @@ public class WrappedPlainView extends BoxView implements TabExpander
// careful: check that there's no off-by-one problem here
// depending on which position calculateBreakPosition returns
breakPoint = calculateBreakPosition(i, end);
+
+ if (breakPoint == 0)
+ return;
+
+ // If breakPoint is equal to the current index no further
+ // line is needed and we can end the loop.
if (breakPoint == i)
- i ++;
+ break;
else
i = breakPoint;
}
- return numLines;
}
/**
@@ -491,7 +518,11 @@ public class WrappedPlainView extends BoxView implements TabExpander
if (axis == X_AXIS)
return getWidth();
else if (axis == Y_AXIS)
- return numLines * metrics.getHeight();
+ {
+ if (metrics == null)
+ updateMetrics();
+ return numLines * metrics.getHeight();
+ }
throw new IllegalArgumentException("Invalid axis for getPreferredSpan: "
+ axis);
@@ -511,9 +542,15 @@ public class WrappedPlainView extends BoxView implements TabExpander
public Shape modelToView(int pos, Shape a, Bias b)
throws BadLocationException
{
+ Rectangle rect = a.getBounds();
+
+ // Throwing a BadLocationException is an observed behavior of the RI.
+ if (rect.isEmpty())
+ throw new BadLocationException("Unable to calculate view coordinates "
+ + "when allocation area is empty.", 5);
+
Segment s = getLineBuffer();
int lineHeight = metrics.getHeight();
- Rectangle rect = a.getBounds();
// Return a rectangle with width 1 and height equal to the height
// of the text
@@ -532,7 +569,7 @@ public class WrappedPlainView extends BoxView implements TabExpander
// If pos is between currLineStart and currLineEnd then just find
// the width of the text from currLineStart to pos and add that
// to rect.x
- if (pos >= currLineStart && pos < currLineEnd || pos == end - 1)
+ if (pos >= currLineStart && pos < currLineEnd)
{
try
{
@@ -576,68 +613,93 @@ public class WrappedPlainView extends BoxView implements TabExpander
Segment s = getLineBuffer();
Rectangle rect = a.getBounds();
int currLineStart = getStartOffset();
+
+ // Although calling modelToView with the last possible offset will
+ // cause a BadLocationException in CompositeView it is allowed
+ // to return that offset in viewToModel.
int end = getEndOffset();
+
int lineHeight = metrics.getHeight();
if (y < rect.y)
return currLineStart;
+
if (y > rect.y + rect.height)
- return end - 1;
+ return end;
+
+ // Note: rect.x and rect.width do not represent the width of painted
+ // text but the area where text *may* be painted. This means the width
+ // is most of the time identical to the component's width.
- while (true)
+ while (currLineStart != end)
{
int currLineEnd = calculateBreakPosition(currLineStart, end);
+
// If we're at the right y-position that means we're on the right
// logical line and we should look for the character
if (y >= rect.y && y < rect.y + lineHeight)
{
- // Check if the x position is to the left or right of the text
- if (x < rect.x)
- return currLineStart;
- if (x > rect.x + rect.width)
- return currLineEnd - 1;
-
try
{
- getDocument().getText(currLineStart, end - currLineStart, s);
+ getDocument().getText(currLineStart, currLineEnd - currLineStart, s);
}
catch (BadLocationException ble)
{
// Shouldn't happen
}
- int mark = Utilities.getTabbedTextOffset(s, metrics, rect.x,
- (int) x,
- WrappedPlainView.this,
- currLineStart);
- return currLineStart + mark;
+
+ int offset = Utilities.getTabbedTextOffset(s, metrics, rect.x,
+ (int) x,
+ WrappedPlainView.this,
+ currLineStart);
+ // If the calculated offset is the end of the line (in the
+ // document (= start of the next line) return the preceding
+ // offset instead. This makes sure that clicking right besides
+ // the last character in a line positions the cursor after the
+ // last character and not in the beginning of the next line.
+ return (offset == currLineEnd) ? offset - 1 : offset;
}
// Increment rect.y so we're checking the next logical line
rect.y += lineHeight;
// Increment currLineStart to the model position of the start
- // of the next logical line
- if (currLineEnd == currLineStart)
- currLineStart = end;
- else
- currLineStart = currLineEnd;
+ // of the next logical line.
+ currLineStart = currLineEnd;
+
}
+
+ return end;
}
/**
- * This method is called from insertUpdate and removeUpdate.
- * If the number of lines in the document has changed, just repaint
+ * <p>This method is called from insertUpdate and removeUpdate.</p>
+ *
+ * <p>If the number of lines in the document has changed, just repaint
* the whole thing (note, could improve performance by not repainting
* anything above the changes). If the number of lines hasn't changed,
- * just repaint the given Rectangle.
+ * just repaint the given Rectangle.</p>
+ *
+ * <p>Note that the <code>Rectangle</code> argument may be <code>null</code>
+ * when the allocation area is empty.</code>
+ *
* @param a the Rectangle to repaint if the number of lines hasn't changed
*/
void updateDamage (Rectangle a)
{
- int newNumLines = determineNumLines();
- if (numLines != newNumLines)
+ // If the allocation area is empty we can't do anything useful.
+ // As determining the number of lines is impossible in that state we
+ // reset it to an invalid value which can then be recalculated at a
+ // later point.
+ if (a == null || a.isEmpty())
{
- numLines = newNumLines;
- getContainer().repaint();
+ numLines = 1;
+ return;
}
+
+ int oldNumLines = numLines;
+ determineNumLines();
+
+ if (numLines != oldNumLines)
+ preferenceChanged(this, false, true);
else
getContainer().repaint(a.x, a.y, a.width, a.height);
}
@@ -665,6 +727,15 @@ public class WrappedPlainView extends BoxView implements TabExpander
*/
public void removeUpdate (DocumentEvent changes, Shape a, ViewFactory f)
{
+ // Note: This method is not called when characters from the
+ // end of the document are removed. The reason for this
+ // can be found in the implementation of View.forwardUpdate:
+ // The document event will denote offsets which do not exist
+ // any more, getViewIndex() will therefore return -1 and this
+ // makes View.forwardUpdate() skip this method call.
+ // However this seems to cause no trouble and as it reduces the
+ // number of method calls it can stay this way.
+
updateDamage((Rectangle)a);
}
}
diff --git a/javax/swing/text/html/FormView.java b/javax/swing/text/html/FormView.java
index b85c69434..d54021066 100644
--- a/javax/swing/text/html/FormView.java
+++ b/javax/swing/text/html/FormView.java
@@ -39,8 +39,11 @@ exception statement from your version. */
package javax.swing.text.html;
import java.awt.Component;
+import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JCheckBox;
@@ -83,6 +86,24 @@ public class FormView
implements ActionListener
{
+ protected class MouseEventListener
+ extends MouseAdapter
+ {
+ /**
+ * Creates a new <code>MouseEventListener</code>.
+ */
+ protected MouseEventListener()
+ {
+ // Nothing to do here.
+ }
+
+ public void mouseReleased(MouseEvent ev)
+ {
+ String data = getImageData(ev.getPoint());
+ imageSubmit(data);
+ }
+ }
+
/**
* If the value attribute of an <code>&lt;input type=&quot;submit&quot;&gt>
* tag is not specified, then this string is used.
@@ -227,4 +248,28 @@ public class FormView
{
// FIXME: Implement this.
}
+
+ /**
+ * Determines the image data that should be submitted in response to a
+ * mouse click on a image. This is either 'x=<p.x>&y=<p.y>' if the name
+ * attribute of the element is null or '' or
+ * <name>.x=<p.x>&<name>.y=<p.y>' when the name attribute is not empty.
+ *
+ * @param p the coordinates of the mouseclick
+ */
+ String getImageData(Point p)
+ {
+ String name = (String) getElement().getAttributes()
+ .getAttribute(HTML.Attribute.NAME);
+ String data;
+ if (name == null || name.equals(""))
+ {
+ data = "x=" + p.x + "&y=" + p.y;
+ }
+ else
+ {
+ data = name + ".x=" + p.x + "&" + name + ".y=" + p.y;
+ }
+ return data;
+ }
}
diff --git a/javax/swing/text/html/HTML.java b/javax/swing/text/html/HTML.java
index 2b521cd22..2c908f6fc 100644
--- a/javax/swing/text/html/HTML.java
+++ b/javax/swing/text/html/HTML.java
@@ -292,7 +292,7 @@ public class HTML
/**
* The media attribute
*/
- public static final Attribute MEDIA = new Attribute("media");
+ static final Attribute MEDIA = new Attribute("media");
/**
* The method attribute
@@ -758,7 +758,7 @@ public class HTML
/**
* The &lt;nobr&gt; tag
*/
- public static final Tag NOBR = new Tag("nobr");
+ static final Tag NOBR = new Tag("nobr");
/**
* The &lt;noframes&gt; tag , breaks flow, block tag.
diff --git a/javax/swing/text/html/HTMLDocument.java b/javax/swing/text/html/HTMLDocument.java
index 2a96953ee..fba6cad12 100644
--- a/javax/swing/text/html/HTMLDocument.java
+++ b/javax/swing/text/html/HTMLDocument.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package javax.swing.text.html;
+import gnu.classpath.NotImplementedException;
+
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
@@ -667,6 +669,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("FormAction.start not implemented");
@@ -677,6 +680,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("FormAction.end not implemented");
@@ -690,6 +694,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("HiddenAction.start not implemented");
@@ -700,6 +705,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("HiddenAction.end not implemented");
@@ -713,6 +719,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("IsindexAction.start not implemented");
@@ -723,6 +730,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("IsindexAction.end not implemented");
@@ -759,6 +767,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("PreAction.start not implemented");
@@ -769,6 +778,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("PreAction.end not implemented");
@@ -782,6 +792,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("SpecialAction.start not implemented");
@@ -792,6 +803,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("SpecialAction.end not implemented");
@@ -805,6 +817,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("AreaAction.start not implemented");
@@ -815,6 +828,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("AreaAction.end not implemented");
@@ -828,6 +842,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("BaseAction.start not implemented");
@@ -838,6 +853,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("BaseAction.end not implemented");
@@ -851,6 +867,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("HeadAction.start not implemented: "+t);
@@ -862,6 +879,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("HeadAction.end not implemented: "+t);
@@ -876,6 +894,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("LinkAction.start not implemented");
@@ -886,6 +905,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("LinkAction.end not implemented");
@@ -899,6 +919,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("MapAction.start not implemented");
@@ -909,6 +930,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("MapAction.end not implemented");
@@ -922,6 +944,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("MetaAction.start not implemented");
@@ -932,6 +955,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("MetaAction.end not implemented");
@@ -945,6 +969,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("StyleAction.start not implemented");
@@ -955,6 +980,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("StyleAction.end not implemented");
@@ -968,6 +994,7 @@ public class HTMLDocument extends DefaultStyledDocument
* of tags associated with this Action.
*/
public void start(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("TitleAction.start not implemented");
@@ -978,6 +1005,7 @@ public class HTMLDocument extends DefaultStyledDocument
* with this Action.
*/
public void end(HTML.Tag t)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("TitleAction.end not implemented");
@@ -1253,6 +1281,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @since 1.3
*/
public void handleEndOfLineString(String eol)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("HTMLReader.handleEndOfLineString not implemented yet");
@@ -1265,6 +1294,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @param data the text to add to the textarea
*/
protected void textAreaContent(char[] data)
+ throws NotImplementedException
{
// FIXME: Implement.
print ("HTMLReader.textAreaContent not implemented yet");
@@ -1276,6 +1306,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @param data the text
*/
protected void preContent(char[] data)
+ throws NotImplementedException
{
// FIXME: Implement
print ("HTMLReader.preContent not implemented yet");
@@ -1447,6 +1478,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @param a the attribute set specifying the special content
*/
protected void addSpecialElement(HTML.Tag t, MutableAttributeSet a)
+ throws NotImplementedException
{
// FIXME: Implement
print ("HTMLReader.addSpecialElement not implemented yet");
@@ -1550,7 +1582,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @throws IllegalStateException - if an HTMLEditorKit.Parser has not been set
*/
public void setInnerHTML(Element elem, String htmlText)
- throws BadLocationException, IOException
+ throws BadLocationException, IOException, NotImplementedException
{
if (elem.isLeaf())
throw new IllegalArgumentException("Element is a leaf");
@@ -1574,7 +1606,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @throws IllegalStateException - if parser is not set
*/
public void setOuterHTML(Element elem, String htmlText)
- throws BadLocationException, IOException
+ throws BadLocationException, IOException, NotImplementedException
{
if (parser == null)
throw new IllegalStateException("Parser has not been set");
@@ -1593,7 +1625,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @throws IllegalStateException - if parser has not been set
*/
public void insertBeforeStart(Element elem, String htmlText)
- throws BadLocationException, IOException
+ throws BadLocationException, IOException, NotImplementedException
{
if (parser == null)
throw new IllegalStateException("Parser has not been set");
@@ -1613,7 +1645,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @throws IllegalStateException - if parser is not set
*/
public void insertBeforeEnd(Element elem, String htmlText)
- throws BadLocationException, IOException
+ throws BadLocationException, IOException, NotImplementedException
{
if (parser == null)
throw new IllegalStateException("Parser has not been set");
@@ -1632,7 +1664,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @throws IllegalStateException - if parser is not set
*/
public void insertAfterEnd(Element elem, String htmlText)
- throws BadLocationException, IOException
+ throws BadLocationException, IOException, NotImplementedException
{
if (parser == null)
throw new IllegalStateException("Parser has not been set");
@@ -1651,7 +1683,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @throws IllegalStateException - if parser is not set
*/
public void insertAfterStart(Element elem, String htmlText)
- throws BadLocationException, IOException
+ throws BadLocationException, IOException, NotImplementedException
{
if (parser == null)
throw new IllegalStateException("Parser has not been set");
@@ -1676,6 +1708,7 @@ public class HTMLDocument extends DefaultStyledDocument
*/
public void setParagraphAttributes(int offset, int length, AttributeSet s,
boolean replace)
+ throws NotImplementedException
{
// FIXME: Not implemented.
System.out.println("setParagraphAttributes not implemented");
@@ -1688,6 +1721,7 @@ public class HTMLDocument extends DefaultStyledDocument
* @param e - the Document event
*/
protected void fireChangedUpdate(DocumentEvent e)
+ throws NotImplementedException
{
// FIXME: Not implemented.
System.out.println("fireChangedUpdate not implemented");
diff --git a/javax/swing/text/html/HTMLEditorKit.java b/javax/swing/text/html/HTMLEditorKit.java
index 2d5d1eb79..92d9de938 100644
--- a/javax/swing/text/html/HTMLEditorKit.java
+++ b/javax/swing/text/html/HTMLEditorKit.java
@@ -39,6 +39,8 @@ exception statement from your version. */
package javax.swing.text.html;
+import gnu.classpath.NotImplementedException;
+
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
@@ -298,6 +300,7 @@ public class HTMLEditorKit
Element insertElement,
String html, HTML.Tag parentTag,
HTML.Tag addTag)
+ throws NotImplementedException
{
/*
As its name implies, this protected method is used when HTML is inserted at a
diff --git a/javax/swing/text/html/ListView.java b/javax/swing/text/html/ListView.java
new file mode 100644
index 000000000..c07d3598c
--- /dev/null
+++ b/javax/swing/text/html/ListView.java
@@ -0,0 +1,131 @@
+/* ListView.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package javax.swing.text.html;
+
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Shape;
+
+import javax.swing.text.Element;
+
+/**
+ * A View to render HTML lists, like the <code>&lt;ul&gt;</code> and
+ * <code>&lt;ol&gt;</code> tags.
+ *
+ * @author Roman Kennke (kennke@aicas.com)
+ */
+public class ListView
+ extends BlockView
+{
+
+ /**
+ * The painter used to paint the list items.
+ */
+ private StyleSheet.ListPainter painter;
+
+ /**
+ * Creates a new <code>ListView</code> for the specified element.
+ *
+ * @param el the element to create a list view for
+ */
+ public ListView(Element el)
+ {
+ super(el, Y_AXIS);
+ }
+
+ /**
+ * Returns the alignment of this view along the specified axis.
+ *
+ * This returns <code>0.5</code> unconditionally.
+ *
+ * @param axis the axis
+ *
+ * @return the alignment of this view along the specified axis
+ */
+ public float getAlignment(int axis)
+ {
+ if (axis != X_AXIS && axis != Y_AXIS)
+ throw new IllegalArgumentException("Illegal axis parameter: " + axis);
+
+ return 0.5F;
+ }
+
+ /**
+ * Paints the <code>ListView</code>.
+ *
+ * @param g the graphics context to use for painting
+ * @param allocation the allocation given to this view
+ */
+ public void paint(Graphics g, Shape allocation)
+ {
+ super.paint(g, allocation);
+ // FIXME: Why is this overridden? I think that painting would be done
+ // by the superclass and the stylesheet... Maybe find out when this
+ // stuff is implemented properly.
+ }
+
+ /**
+ * Paints the child with the specified index into the specified allocation.
+ *
+ * This implementation forwards to the list painter fetched from the
+ * {@link StyleSheet} and then calls
+ * <code>super.paintChild(g, a, index)</code>.
+ *
+ * @param g the graphics context to use
+ * @param a the allocation for the child
+ * @param index the child index
+ */
+ protected void paintChild(Graphics g, Rectangle a, int index)
+ {
+ painter.paint(g, a.x, a.y, a.width, a.height, this, index);
+ super.paintChild(g, a, index);
+ }
+
+ /**
+ * Fetches this view's properties from the style attributes of this view's
+ * element.
+ *
+ * This forwards to super and then fetches a {@link StyleSheet.ListPainter}
+ * from the stylesheet suitable for painting the list.
+ */
+ protected void setPropertiesFromAttributes()
+ {
+ super.setPropertiesFromAttributes();
+ painter = getStyleSheet().getListPainter(getAttributes());
+ }
+}
diff --git a/javax/swing/text/html/NullView.java b/javax/swing/text/html/NullView.java
index 4b66c5ad8..86ce0c10f 100644
--- a/javax/swing/text/html/NullView.java
+++ b/javax/swing/text/html/NullView.java
@@ -52,8 +52,8 @@ import javax.swing.text.Position.Bias;
*
* @author Roman Kennke (kennke@aicas.com)
*/
-public class NullView
- extends View
+class NullView
+ extends View
{
/**
diff --git a/javax/swing/text/html/parser/Entity.java b/javax/swing/text/html/parser/Entity.java
index 766984f9c..cf294c748 100644
--- a/javax/swing/text/html/parser/Entity.java
+++ b/javax/swing/text/html/parser/Entity.java
@@ -54,7 +54,7 @@ import java.io.Serializable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public final class Entity
- implements DTDConstants, Serializable
+ implements DTDConstants
{
/**
* Package level mapper between type names and they string values.
diff --git a/javax/swing/tree/AbstractLayoutCache.java b/javax/swing/tree/AbstractLayoutCache.java
index adece101d..8dbdd2f5e 100644
--- a/javax/swing/tree/AbstractLayoutCache.java
+++ b/javax/swing/tree/AbstractLayoutCache.java
@@ -38,10 +38,13 @@ exception statement from your version. */
package javax.swing.tree;
+import gnu.classpath.NotImplementedException;
+
import java.awt.Rectangle;
import java.util.Enumeration;
import javax.swing.event.TreeModelEvent;
+import javax.swing.tree.VariableHeightLayoutCache.NodeRecord;
/**
* class AbstractLayoutCache
@@ -49,361 +52,397 @@ import javax.swing.event.TreeModelEvent;
* @author Andrew Selkirk
*/
public abstract class AbstractLayoutCache
- implements RowMapper
+ implements RowMapper
{
- /**
- * class NodeDimensions
- */
- public abstract static class NodeDimensions
- {
- /**
- * Creates <code>NodeDimensions</code> object.
- */
- public NodeDimensions()
- {
- // Do nothing here.
- }
-
- /**
- * getNodeDimensions
- *
- * @param value0 TODO
- * @param value1 TODO
- * @param value2 TODO
- * @param value3 TODO
- * @param value4 TODO
- * @return Rectangle
- */
- public abstract Rectangle getNodeDimensions(Object value0, int value1,
- int value2, boolean value3, Rectangle value4);
- }
-
- /**
- * nodeDimensions
- */
- protected NodeDimensions nodeDimensions;
-
- /**
- * treeModel
- */
- protected TreeModel treeModel;
-
- /**
- * treeSelectionModel
- */
- protected TreeSelectionModel treeSelectionModel;
-
- /**
- * rootVisible
- */
- protected boolean rootVisible;
-
- /**
- * rowHeight
- */
- protected int rowHeight;
-
- /**
- * Constructor AbstractLayoutCache
- */
- public AbstractLayoutCache()
- {
- // Do nothing here.
- }
-
- /**
- * setNodeDimensions
- *
- * @param dimensions TODO
- */
- public void setNodeDimensions(NodeDimensions dimensions)
- {
- nodeDimensions = dimensions;
- }
-
- /**
- * getNodeDimensions
- *
- * @return NodeDimensions
- */
- public NodeDimensions getNodeDimensions()
- {
- return nodeDimensions;
- }
-
- /**
- * getNodeDimensions
- *
- * @param value TODO
- * @param row TODO
- * @param depth TODO
- * @param expanded TODO
- * @param bounds TODO
- *
- * @return Rectangle
- */
- protected Rectangle getNodeDimensions(Object value, int row, int depth,
- boolean expanded, Rectangle bounds)
- {
- if (bounds == null)
- return new Rectangle();
- return null;
- // TODO
- }
-
- /**
- * Sets the model that provides the tree data.
- *
- * @param model the model
- */
- public void setModel(TreeModel model)
- {
- treeModel = model;
- }
-
- /**
- * Returns the model that provides the tree data.
- *
- * @return the model
- */
- public TreeModel getModel()
- {
- return treeModel;
- }
-
- /**
- * setRootVisible
- *
- * @param visible <code>true</code> if root should be visible,
- * <code>false</code> otherwise
- */
- public void setRootVisible(boolean visible)
- {
- rootVisible = visible;
- }
-
- /**
- * isRootVisible
- *
- * @return <code>true</code> if root is visible,
- * <code>false</code> otherwise
- */
- public boolean isRootVisible()
- {
- return rootVisible;
- }
-
- /**
- * setRowHeight
- *
- * @param height the row height
- */
- public void setRowHeight(int height)
- {
- rowHeight = height;
- }
-
- /**
- * getRowHeight
- *
- * @return the row height
- */
- public int getRowHeight()
- {
- return rowHeight;
- }
-
- /**
- * setSelectionModel
- *
- * @param model the model
- */
- public void setSelectionModel(TreeSelectionModel model)
- {
- treeSelectionModel = model;
- }
-
- /**
- * getSelectionModel
- *
- * @return the model
- */
- public TreeSelectionModel getSelectionModel()
- {
- return treeSelectionModel;
- }
-
- /**
- * getPreferredHeight
- *
- * @return int
- */
- public int getPreferredHeight()
- {
- return 0; // TODO
- }
-
- /**
- * getPreferredWidth
- *
- * @param value0 TODO
- *
- * @return int
- */
- public int getPreferredWidth(Rectangle value0)
- {
- return 0; // TODO
- }
-
- /**
- * isExpanded
- *
- * @param value0 TODO
- *
- * @return boolean
- */
- public abstract boolean isExpanded(TreePath value0);
-
- /**
- * getBounds
- *
- * @param value0 TODO
- * @param value1 TODO
- *
- * @return Rectangle
- */
- public abstract Rectangle getBounds(TreePath value0, Rectangle value1);
-
- /**
- * getPathForRow
- *
- * @param row the row
- *
- * @return the tree path
- */
- public abstract TreePath getPathForRow(int row);
-
- /**
- * getRowForPath
- *
- * @param path the tree path
- *
- * @return the row
- */
- public abstract int getRowForPath(TreePath path);
-
- /**
- * getPathClosestTo
- *
- * @param value0 TODO
- * @param value1 TODO
- *
- * @return the tree path
- */
- public abstract TreePath getPathClosestTo(int value0, int value1);
-
- /**
- * getVisiblePathsFrom
- *
- * @param path the tree path
- *
- * @return Enumeration
- */
- public abstract Enumeration getVisiblePathsFrom(TreePath path);
-
- /**
- * getVisibleChildCount
- *
- * @param path the tree path
- *
- * @return int
- */
- public abstract int getVisibleChildCount(TreePath path);
-
- /**
- * setExpandedState
- *
- * @param value0 TODO
- *
- * @param value1 TODO
- */
- public abstract void setExpandedState(TreePath value0, boolean value1);
-
- /**
- * getExpandedState
- *
- * @param path the tree path
- *
- * @return boolean
- */
- public abstract boolean getExpandedState(TreePath path);
-
- /**
- * getRowCount
- *
- * @return the number of rows
- */
- public abstract int getRowCount();
-
- /**
- * invalidateSizes
- */
- public abstract void invalidateSizes();
-
- /**
- * invalidatePathBounds
- *
- * @param path the tree path
- */
- public abstract void invalidatePathBounds(TreePath path);
-
- /**
- * treeNodesChanged
- *
- * @param event the event to send
- */
- public abstract void treeNodesChanged(TreeModelEvent event);
-
- /**
- * treeNodesInserted
- *
- * @param event the event to send
- */
- public abstract void treeNodesInserted(TreeModelEvent event);
-
- /**
- * treeNodesRemoved
- *
- * @param event the event to send
- */
- public abstract void treeNodesRemoved(TreeModelEvent event);
-
- /**
- * treeStructureChanged
- *
- * @param event the event to send
- */
- public abstract void treeStructureChanged(TreeModelEvent event);
-
- /**
- * getRowsForPaths
- *
- * @param paths the tree paths
- *
- * @return an array of rows
- */
- public int[] getRowsForPaths(TreePath[] paths)
- {
- return null; // TODO
- }
-
- /**
- * isFixedRowHeight
- *
- * @return boolean
- */
- protected boolean isFixedRowHeight()
- {
- return false; // TODO
- }
+ /**
+ * class NodeDimensions
+ */
+ public abstract static class NodeDimensions
+ {
+ /**
+ * Creates <code>NodeDimensions</code> object.
+ */
+ public NodeDimensions()
+ {
+ // Do nothing here.
+ }
+
+ /**
+ * Get the node dimensions. The NodeDimensions property must be set (unless
+ * the method is overridden, like if {@link FixedHeightLayoutCache}. If the
+ * method is not overridden and the property is not set, the InternalError is
+ * thrown.
+ *
+ * @param value the last node in the path
+ * @param row the node row
+ * @param depth the indentation depth
+ * @param expanded true if this node is expanded, false otherwise
+ * @param bounds the area where the tree is displayed
+ */
+ public abstract Rectangle getNodeDimensions(Object value, int row,
+ int depth, boolean expanded,
+ Rectangle bounds);
+ }
+
+ /**
+ * nodeDimensions
+ */
+ protected NodeDimensions nodeDimensions;
+
+ /**
+ * treeModel
+ */
+ protected TreeModel treeModel;
+
+ /**
+ * treeSelectionModel
+ */
+ protected TreeSelectionModel treeSelectionModel;
+
+ /**
+ * rootVisible
+ */
+ protected boolean rootVisible;
+
+ /**
+ * rowHeight
+ */
+ protected int rowHeight;
+
+ /**
+ * Constructor AbstractLayoutCache
+ */
+ public AbstractLayoutCache()
+ {
+ // Do nothing here.
+ }
+
+ /**
+ * setNodeDimensions
+ *
+ * @param dimensions TODO
+ */
+ public void setNodeDimensions(NodeDimensions dimensions)
+ {
+ nodeDimensions = dimensions;
+ }
+
+ /**
+ * getNodeDimensions
+ *
+ * @return NodeDimensions
+ */
+ public NodeDimensions getNodeDimensions()
+ {
+ return nodeDimensions;
+ }
+
+ /**
+ * Get the node dimensions. The NodeDimensions property must be set
+ * (unless the method is overridden, like if
+ * {@link FixedHeightLayoutCache}. If the method is not overridden and
+ * the property is not set, the InternalError is thrown.
+ *
+ * @param value the last node in the path
+ * @param row the node row
+ * @param depth the indentation depth
+ * @param expanded true if this node is expanded, false otherwise
+ * @param bounds the area where the tree is displayed
+ */
+ protected Rectangle getNodeDimensions(Object value, int row, int depth,
+ boolean expanded, Rectangle bounds)
+ {
+ if (nodeDimensions == null)
+ throw new InternalError("The NodeDimensions are not set");
+ return nodeDimensions.getNodeDimensions(value, row, depth, expanded, bounds);
+ }
+
+ /**
+ * Sets the model that provides the tree data.
+ *
+ * @param model the model
+ */
+ public void setModel(TreeModel model)
+ {
+ treeModel = model;
+ }
+
+ /**
+ * Returns the model that provides the tree data.
+ *
+ * @return the model
+ */
+ public TreeModel getModel()
+ {
+ return treeModel;
+ }
+
+ /**
+ * setRootVisible
+ *
+ * @param visible <code>true</code> if root should be visible,
+ * <code>false</code> otherwise
+ */
+ public void setRootVisible(boolean visible)
+ {
+ rootVisible = visible;
+ }
+
+ /**
+ * isRootVisible
+ *
+ * @return <code>true</code> if root is visible,
+ * <code>false</code> otherwise
+ */
+ public boolean isRootVisible()
+ {
+ return rootVisible;
+ }
+
+ /**
+ * setRowHeight
+ *
+ * @param height the row height
+ */
+ public void setRowHeight(int height)
+ {
+ rowHeight = height;
+ invalidateSizes();
+ }
+
+ /**
+ * getRowHeight
+ *
+ * @return the row height
+ */
+ public int getRowHeight()
+ {
+ return rowHeight;
+ }
+
+ /**
+ * setSelectionModel
+ *
+ * @param model the model
+ */
+ public void setSelectionModel(TreeSelectionModel model)
+ {
+ treeSelectionModel = model;
+ }
+
+ /**
+ * getSelectionModel
+ *
+ * @return the model
+ */
+ public TreeSelectionModel getSelectionModel()
+ {
+ return treeSelectionModel;
+ }
+
+ /**
+ * Get the sum of heights for all rows. This class provides a general not
+ * optimized implementation that is overridded in derived classes
+ * ({@link VariableHeightLayoutCache}, {@link FixedHeightLayoutCache}) for
+ * the better performance.
+ */
+ public int getPreferredHeight()
+ {
+ int height = 0;
+ int n = getRowCount();
+ Rectangle r = new Rectangle();
+ for (int i = 0; i < n; i++)
+ {
+ TreePath path = getPathForRow(i);
+ height += getBounds(path, r).height;
+ }
+ return height;
+ }
+
+ /**
+ * Get the maximal width. This class provides a general not
+ * optimized implementation that is overridded in derived classes
+ * ({@link VariableHeightLayoutCache}, {@link FixedHeightLayoutCache}) for
+ * the better performance.
+ *
+ * @param rect the rectangle that is used during the method work
+ */
+ public int getPreferredWidth(Rectangle rect)
+ {
+ int maximalWidth = 0;
+ Rectangle r = new Rectangle();
+ int n = getRowCount();
+ for (int i = 0; i < n; i++)
+ {
+ TreePath path = getPathForRow(i);
+ r.setBounds(0,0,0,0);
+ r = getBounds(path, r);
+ if (r.x + r.width > maximalWidth)
+ maximalWidth = r.x + r.width;
+ // Invalidate the cached value as this may be the very early call
+ // before the heigth is properly set (the vertical coordinate may
+ // not be correct).
+ invalidatePathBounds(path);
+ }
+ return maximalWidth;
+ }
+ /**
+ * isExpanded
+ *
+ * @param value0 TODO
+ *
+ * @return boolean
+ */
+ public abstract boolean isExpanded(TreePath value0);
+
+ /**
+ * getBounds
+ *
+ * @param value0 TODO
+ * @param value1 TODO
+ *
+ * @return Rectangle
+ */
+ public abstract Rectangle getBounds(TreePath value0, Rectangle value1);
+
+ /**
+ * getPathForRow
+ *
+ * @param row the row
+ *
+ * @return the tree path
+ */
+ public abstract TreePath getPathForRow(int row);
+
+ /**
+ * getRowForPath
+ *
+ * @param path the tree path
+ *
+ * @return the row
+ */
+ public abstract int getRowForPath(TreePath path);
+
+ /**
+ * getPathClosestTo
+ *
+ * @param value0 TODO
+ * @param value1 TODO
+ *
+ * @return the tree path
+ */
+ public abstract TreePath getPathClosestTo(int value0, int value1);
+
+ /**
+ * getVisiblePathsFrom
+ *
+ * @param path the tree path
+ *
+ * @return Enumeration
+ */
+ public abstract Enumeration getVisiblePathsFrom(TreePath path);
+
+ /**
+ * getVisibleChildCount
+ *
+ * @param path the tree path
+ *
+ * @return int
+ */
+ public abstract int getVisibleChildCount(TreePath path);
+
+ /**
+ * setExpandedState
+ *
+ * @param value0 TODO
+ *
+ * @param value1 TODO
+ */
+ public abstract void setExpandedState(TreePath value0, boolean value1);
+
+ /**
+ * getExpandedState
+ *
+ * @param path the tree path
+ *
+ * @return boolean
+ */
+ public abstract boolean getExpandedState(TreePath path);
+
+ /**
+ * getRowCount
+ *
+ * @return the number of rows
+ */
+ public abstract int getRowCount();
+
+ /**
+ * invalidateSizes
+ */
+ public abstract void invalidateSizes();
+
+ /**
+ * invalidatePathBounds
+ *
+ * @param path the tree path
+ */
+ public abstract void invalidatePathBounds(TreePath path);
+
+ /**
+ * treeNodesChanged
+ *
+ * @param event the event to send
+ */
+ public abstract void treeNodesChanged(TreeModelEvent event);
+
+ /**
+ * treeNodesInserted
+ *
+ * @param event the event to send
+ */
+ public abstract void treeNodesInserted(TreeModelEvent event);
+
+ /**
+ * treeNodesRemoved
+ *
+ * @param event the event to send
+ */
+ public abstract void treeNodesRemoved(TreeModelEvent event);
+
+ /**
+ * treeStructureChanged
+ *
+ * @param event the event to send
+ */
+ public abstract void treeStructureChanged(TreeModelEvent event);
+
+ /**
+ * Get the tree row numbers for the given pathes. This method performs
+ * the "bulk" conversion that may be faster than mapping pathes one by
+ * one. To have the benefit from the bulk conversion, the method must be
+ * overridden in the derived classes. The default method delegates work
+ * to the {@link #getRowForPath(TreePath)}.
+ *
+ * @param paths the tree paths the array of the tree pathes.
+ * @return the array of the matching tree rows.
+ */
+ public int[] getRowsForPaths(TreePath[] paths)
+ {
+ int[] rows = new int[paths.length];
+ for (int i = 0; i < rows.length; i++)
+ rows[i] = getRowForPath(paths[i]);
+ return rows;
+ }
+
+ /**
+ * Returns true if this layout supposes that all rows have the fixed
+ * height.
+ *
+ * @return boolean true if all rows in the tree must have the fixed
+ * height (false by default).
+ */
+ protected boolean isFixedRowHeight()
+ {
+ return false;
+ }
}
diff --git a/javax/swing/tree/DefaultMutableTreeNode.java b/javax/swing/tree/DefaultMutableTreeNode.java
index 9e6817351..be8317f97 100644
--- a/javax/swing/tree/DefaultMutableTreeNode.java
+++ b/javax/swing/tree/DefaultMutableTreeNode.java
@@ -154,6 +154,8 @@ public class DefaultMutableTreeNode
/**
* Adds a new child node to this node and sets this node as the parent of
* the child node. The child node must not be an ancestor of this node.
+ * If the tree uses the {@link DefaultTreeModel}, you must subsequently
+ * call {@link DefaultTreeModel#reload(TreeNode)}.
*
* @param child the child node (<code>null</code> not permitted).
*
diff --git a/javax/swing/tree/DefaultTreeCellEditor.java b/javax/swing/tree/DefaultTreeCellEditor.java
index e28c9261b..cc19501d2 100644
--- a/javax/swing/tree/DefaultTreeCellEditor.java
+++ b/javax/swing/tree/DefaultTreeCellEditor.java
@@ -77,17 +77,6 @@ public class DefaultTreeCellEditor
implements ActionListener, TreeCellEditor, TreeSelectionListener
{
/**
- * The gap between the icon and editing component during editing.
- */
- static int ICON_TEXT_GAP = 3;
-
- /**
- * The left margin of the editing container (the gap between the tree and
- * the editing component of the editing icon.
- */
- static int TREE_ICON_GAP = ICON_TEXT_GAP;
-
- /**
* The number of the fast mouse clicks, required to start the editing
* session.
*/
@@ -141,7 +130,7 @@ public class DefaultTreeCellEditor
{
// From the previous version, the left margin is taken as half
// of the icon width.
- editingIcon.paintIcon(this, g, TREE_ICON_GAP, 0);
+ editingIcon.paintIcon(this, g, 0, 0);
}
super.paint(g);
}
@@ -157,7 +146,7 @@ public class DefaultTreeCellEditor
// Move the component to the left, leaving room for the editing icon:
if (editingIcon != null)
- eOffset = TREE_ICON_GAP + editingIcon.getIconWidth() + ICON_TEXT_GAP;
+ eOffset = editingIcon.getIconWidth();
else
eOffset = 0;
@@ -166,7 +155,7 @@ public class DefaultTreeCellEditor
c.setLocation(eOffset, 0);
// Span the editing component near over all window width.
- c.setSize(bounds.width - eOffset - TREE_ICON_GAP, bounds.height);
+ c.setSize(bounds.width - eOffset, bounds.height);
/*
* @specnote the Sun sets some more narrow editing component width (it is
* not documented how does it is calculated). However as our text field is
@@ -542,7 +531,8 @@ public class DefaultTreeCellEditor
* If the realEditor returns true to this message, prepareForEditing
* is messaged and true is returned.
*
- * @param event - the event the editor should use to consider whether to begin editing or not
+ * @param event - the event the editor should use to consider whether to
+ * begin editing or not
* @return true if editing can be started
*/
public boolean isCellEditable(EventObject event)
diff --git a/javax/swing/tree/DefaultTreeCellRenderer.java b/javax/swing/tree/DefaultTreeCellRenderer.java
index df70ba7fb..5e93145ae 100644
--- a/javax/swing/tree/DefaultTreeCellRenderer.java
+++ b/javax/swing/tree/DefaultTreeCellRenderer.java
@@ -407,7 +407,7 @@ public class DefaultTreeCellRenderer
this.hasFocus = hasFocus;
setHorizontalAlignment(LEFT);
setOpaque(false);
- setVerticalAlignment(TOP);
+ setVerticalAlignment(CENTER);
setEnabled(true);
super.setFont(UIManager.getFont("Tree.font"));
@@ -445,8 +445,7 @@ public class DefaultTreeCellRenderer
/**
* Paints the value. The background is filled based on selected.
*
- * @param g
- * the graphics device.
+ * @param g the graphics device.
*/
public void paint(Graphics g)
{
@@ -468,17 +467,27 @@ public class DefaultTreeCellRenderer
getHorizontalTextPosition(), vr, ir, tr,
getIconTextGap());
+ // Reusing one rectangle.
+ Rectangle bounds = getBounds(ir);
+
+ bounds.x = tr.x - insets.left;
+ bounds.width = tr.width + insets.left+insets.right;
+
g.setColor(super.getBackground());
- g.fillRect(tr.x, tr.y, tr.width, tr.height - insets.top - insets.bottom);
+ g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
- // paint border
- Color b = getBorderSelectionColor();
- if (b != null)
+ super.paint(g);
+
+ // Paint the border of the focused element only (lead selection)
+ if (hasFocus)
{
- g.setColor(b);
- g.drawRect(tr.x, tr.y, tr.width, tr.height - insets.top - insets.bottom);
+ Color b = getBorderSelectionColor();
+ if (b != null)
+ {
+ g.setColor(b);
+ g.drawRect(bounds.x, bounds.y, bounds.width, bounds.height - 1);
+ }
}
- super.paint(g);
}
/**
diff --git a/javax/swing/tree/DefaultTreeModel.java b/javax/swing/tree/DefaultTreeModel.java
index 818f548a7..c1ca679d0 100644
--- a/javax/swing/tree/DefaultTreeModel.java
+++ b/javax/swing/tree/DefaultTreeModel.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package javax.swing.tree;
+import gnu.classpath.NotImplementedException;
+
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
@@ -46,7 +48,6 @@ import java.util.EventListener;
import javax.swing.event.EventListenerList;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
-import javax.swing.tree.DefaultMutableTreeNode;
/**
* DefaultTreeModel
@@ -74,26 +75,29 @@ public class DefaultTreeModel
protected boolean asksAllowsChildren;
/**
- * Constructor DefaultTreeModel
+ * Constructor DefaultTreeModel where any node can have children.
*
* @param root the tree root.
*/
public DefaultTreeModel(TreeNode root)
{
- if (root == null)
- root = new DefaultMutableTreeNode();
- setRoot(root);
+ this (root, false);
}
/**
- * Constructor DefaultTreeModel
+ * Create the DefaultTreeModel that may check if the nodes can have
+ * children or not.
*
- * @param root the tree root.
- * @param asksAllowsChildren TODO
+ * @param aRoot the tree root.
+ * @param asksAllowsChildren if true, each node is asked if it can have
+ * children. If false, the model does not care about this, supposing, that
+ * any node can have children.
*/
- public DefaultTreeModel(TreeNode root, boolean asksAllowsChildren)
+ public DefaultTreeModel(TreeNode aRoot, boolean asksAllowsChildren)
{
- setRoot(root);
+ if (aRoot == null)
+ aRoot = new DefaultMutableTreeNode();
+ this.root = aRoot;
this.asksAllowsChildren = asksAllowsChildren;
}
@@ -222,25 +226,60 @@ public class DefaultTreeModel
}
/**
- * Invoke this method if you've modified the TreeNodes upon
- * which this model depends. The model will notify all of its
- * listeners that the model has changed.
+ * <p>
+ * Invoke this method if you've modified the TreeNodes upon which this model
+ * depends. The model will notify all of its listeners that the model has
+ * changed. It will fire the events, necessary to update the layout caches and
+ * repaint the tree. The tree will <i>not</i> be properly refreshed if you
+ * call the JTree.repaint instead.
+ * </p>
+ * <p>
+ * This method will refresh the information about whole tree from the root. If
+ * only part of the tree should be refreshed, it is more effective to call
+ * {@link #reload(TreeNode)}.
+ * </p>
*/
public void reload()
{
- // TODO
+ // Need to duplicate the code because the root can formally be
+ // no an instance of the TreeNode.
+ int n = getChildCount(root);
+ int[] childIdx = new int[n];
+ Object[] children = new Object[n];
+
+ for (int i = 0; i < n; i++)
+ {
+ childIdx[i] = i;
+ children[i] = getChild(root, i);
+ }
+
+ fireTreeStructureChanged(this, new Object[] { root }, childIdx, children);
}
/**
- * Invoke this method if you've modified the TreeNodes upon
- * which this model depends. The model will notify all of its
- * listeners that the model has changed.
+ * Invoke this method if you've modified the TreeNodes upon which this model
+ * depends. The model will notify all of its listeners that the model has
+ * changed. It will fire the events, necessary to update the layout caches and
+ * repaint the tree. The tree will <i>not</i> be properly refreshed if you
+ * call the JTree.repaint instead.
*
- * @param node - TODO
+ * @param node - the tree node, from which the tree nodes have changed
+ * (inclusive). If you do not know this node, call {@link #reload()}
+ * instead.
*/
public void reload(TreeNode node)
{
- // TODO
+ int n = getChildCount(node);
+ int[] childIdx = new int[n];
+ Object[] children = new Object[n];
+
+ for (int i = 0; i < n; i++)
+ {
+ childIdx[i] = i;
+ children[i] = getChild(node, i);
+ }
+
+ fireTreeStructureChanged(this, getPathToRoot(node), childIdx, children);
}
/**
@@ -390,7 +429,17 @@ public class DefaultTreeModel
*/
public void nodeStructureChanged(TreeNode node)
{
- // TODO
+ int n = getChildCount(root);
+ int[] childIdx = new int[n];
+ Object[] children = new Object[n];
+
+ for (int i = 0; i < n; i++)
+ {
+ childIdx[i] = i;
+ children[i] = getChild(root, i);
+ }
+
+ fireTreeStructureChanged(this, new Object[] { root }, childIdx, children);
}
/**
diff --git a/javax/swing/tree/DefaultTreeSelectionModel.java b/javax/swing/tree/DefaultTreeSelectionModel.java
index de27dad04..e47f42cab 100644
--- a/javax/swing/tree/DefaultTreeSelectionModel.java
+++ b/javax/swing/tree/DefaultTreeSelectionModel.java
@@ -1,5 +1,5 @@
/* DefaultTreeSelectionModel.java
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -35,6 +35,7 @@ this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
+
package javax.swing.tree;
import java.beans.PropertyChangeListener;
@@ -42,7 +43,10 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
+import java.util.Arrays;
import java.util.EventListener;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.Vector;
import javax.swing.DefaultListSelectionModel;
@@ -52,703 +56,968 @@ import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
/**
- * DefaultTreeSelectionModel
+ * The implementation of the default tree selection model. The installed
+ * listeners are notified about the path and not the row changes. If you
+ * specifically need to track the row changes, register the listener for the
+ * expansion events.
*
* @author Andrew Selkirk
+ * @author Audrius Meskauskas
*/
public class DefaultTreeSelectionModel
- implements Cloneable, Serializable, TreeSelectionModel
+ implements Cloneable, Serializable, TreeSelectionModel
{
- static final long serialVersionUID = 3288129636638950196L;
-
- /**
- * SELECTION_MODE_PROPERTY
- */
- public static final String SELECTION_MODE_PROPERTY = "selectionMode";
-
- /**
- * Our Swing property change support.
- */
- protected SwingPropertyChangeSupport changeSupport;
-
- /**
- * The current selection.
- */
- protected TreePath[] selection;
-
- /**
- * Our TreeSelectionListeners.
- */
- protected EventListenerList listenerList;
-
- /**
- * The current RowMapper.
- */
- protected transient RowMapper rowMapper;
-
- /**
- * The current listSelectionModel.
- */
- protected DefaultListSelectionModel listSelectionModel;
-
- /**
- * The current selection mode.
- */
- protected int selectionMode;
-
- /**
- * The path that has been added last.
- */
- protected TreePath leadPath;
-
- /**
- * The index of the last added path.
- */
- protected int leadIndex;
-
- /**
- * The row of the last added path according to the RowMapper.
- */
- protected int leadRow;
-
- /**
- * Constructs a new DefaultTreeSelectionModel.
- */
- public DefaultTreeSelectionModel()
- {
- setSelectionMode(DISCONTIGUOUS_TREE_SELECTION);
- listenerList = new EventListenerList();
- }
-
- /**
- * Creates a clone of this DefaultTreeSelectionModel with the same
- * selection.
- *
- * @exception CloneNotSupportedException should not be thrown here
- *
- * @return a clone of this DefaultTreeSelectionModel
- */
- public Object clone() throws CloneNotSupportedException
- {
- return null; // TODO
- }
-
- /**
- * Returns a string that shows this object's properties.
- *
- * @return a string that shows this object's properties
- */
- public String toString()
- {
- return null; // TODO
- }
-
- /**
- * writeObject
- *
- * @param value0 TODO
- * @exception IOException TODO
- */
- private void writeObject(ObjectOutputStream value0) throws IOException
- {
- // TODO
- }
-
- /**
- * readObject
- *
- * @param value0 TODO
- * @exception IOException TODO
- * @exception ClassNotFoundException TODO
- */
- private void readObject(ObjectInputStream value0) throws IOException,
- ClassNotFoundException
- {
- // TODO
- }
-
- /**
- * Sets the RowMapper that should be used to map between paths and their
- * rows.
- *
- * @param rowMapper the RowMapper to set
- *
- * @see RowMapper
- */
- public void setRowMapper(RowMapper rowMapper)
- {
- // TODO
- }
-
- /**
- * Returns the RowMapper that is currently used to map between paths and
- * their rows.
- *
- * @return the current RowMapper
- *
- * @see RowMapper
- */
- public RowMapper getRowMapper()
- {
- return rowMapper;
- }
-
- /**
- * Sets the current selection mode. Possible values are
- * {@link #SINGLE_TREE_SELECTION}, {@link #CONTIGUOUS_TREE_SELECTION} and
- * {@link #DISCONTIGUOUS_TREE_SELECTION}.
- *
- * @param mode the selection mode to be set
- *
- * @see #getSelectionMode
- * @see #SINGLE_TREE_SELECTION
- * @see #CONTIGUOUS_TREE_SELECTION
- * @see #DISCONTIGUOUS_TREE_SELECTION
- */
- public void setSelectionMode(int mode)
- {
- selectionMode = mode;
- }
-
- /**
- * Returns the current selection mode.
- *
- * @return the current selection mode
- *
- * @see #setSelectionMode
- * @see #SINGLE_TREE_SELECTION
- * @see #CONTIGUOUS_TREE_SELECTION
- * @see #DISCONTIGUOUS_TREE_SELECTION
- */
- public int getSelectionMode()
- {
- return selectionMode;
- }
-
- /**
- * Sets this path as the only selection.
- *
- * If this changes the selection the registered TreeSelectionListeners are
- * notified.
- *
- * @param path the path to set as selection
- */
- public void setSelectionPath(TreePath path)
- {
- selection = new TreePath[] {
- path };
- }
-
- /**
- * Sets the paths as selection. This method checks for duplicates and
- * removes them.
- *
- * If this changes the selection the registered TreeSelectionListeners are
- * notified.
- *
- * @param paths the paths to set as selection
- */
- public void setSelectionPaths(TreePath[] paths)
- {
- // TODO
- }
-
- /**
- * Adds a path to the list of selected paths. This method checks if the path
- * is already selected and doesn't add the same path twice.
- *
- * If this changes the selection the registered TreeSelectionListeners are
- * notified.
- *
- * @param path the path to add to the selection
- */
- public void addSelectionPath(TreePath path)
- {
- if (!isPathSelected(path))
- {
- if (isSelectionEmpty())
- setSelectionPath(path);
- else
- {
- TreePath[] temp = new TreePath[selection.length + 1];
- System.arraycopy(selection, 0, temp, 0, selection.length);
- temp[temp.length - 1] = path;
- selection = new TreePath[temp.length];
- System.arraycopy(temp, 0, selection, 0, temp.length);
- }
- leadPath = path;
- fireValueChanged(new TreeSelectionEvent(this, path, true,
- leadPath, path));
- }
- }
-
- /**
- * Adds the paths to the list of selected paths. This method checks if the
- * paths are already selected and doesn't add the same path twice.
- *
- * If this changes the selection the registered TreeSelectionListeners are
- * notified.
- *
- * @param paths the paths to add to the selection
- */
- public void addSelectionPaths(TreePath[] paths)
- {
- if (paths != null)
- {
- TreePath v0 = null;
- for (int i = 0; i < paths.length; i++)
- {
- v0 = paths[i];
- if (!isPathSelected(v0))
- {
- if (isSelectionEmpty())
- setSelectionPath(v0);
- else
- {
- TreePath[] temp = new TreePath[selection.length + 1];
- System.arraycopy(selection, 0, temp, 0,
- selection.length);
- temp[temp.length - 1] = v0;
- selection = new TreePath[temp.length];
- System.arraycopy(temp, 0, selection, 0, temp.length);
- }
- leadPath = paths[paths.length - 1];
- fireValueChanged(new TreeSelectionEvent(this, v0, true,
- leadPath, paths[0]));
- }
- }
- }
- }
-
- /**
- * Removes the path from the selection.
- *
- * If this changes the selection the registered TreeSelectionListeners are
- * notified.
- *
- * @param path the path to remove
- */
- public void removeSelectionPath(TreePath path)
- {
- int index = -1;
- if (isPathSelected(path))
- {
- for (int i = 0; i < selection.length; i++)
- {
- if (selection[i].equals(path))
- {
- index = i;
- break;
- }
- }
- TreePath[] temp = new TreePath[selection.length - 1];
- System.arraycopy(selection, 0, temp, 0, index);
- System.arraycopy(selection, index + 1, temp, index,
- selection.length - index - 1);
- selection = new TreePath[temp.length];
- System.arraycopy(temp, 0, selection, 0, temp.length);
-
- fireValueChanged(new TreeSelectionEvent(this, path, false,
- leadPath, path));
- }
- }
-
- /**
- * Removes the paths from the selection.
- *
- * If this changes the selection the registered TreeSelectionListeners are
- * notified.
- *
- * @param paths the paths to remove
- */
- public void removeSelectionPaths(TreePath[] paths)
- {
- if (paths != null)
- {
- int index = -1;
- TreePath v0 = null;
- for (int i = 0; i < paths.length; i++)
- {
- v0 = paths[i];
- if (isPathSelected(v0))
- {
- for (int x = 0; x < selection.length; x++)
- {
- if (selection[i].equals(v0))
- {
- index = x;
- break;
- }
- }
- TreePath[] temp = new TreePath[selection.length - 1];
- System.arraycopy(selection, 0, temp, 0, index);
- System.arraycopy(selection, index + 1, temp, index,
- selection.length - index - 1);
- selection = new TreePath[temp.length];
- System.arraycopy(temp, 0, selection, 0, temp.length);
-
- fireValueChanged(new TreeSelectionEvent(this, v0, false,
- leadPath, paths[0]));
- }
- }
- }
- }
-
- /**
- * Returns the first path in the selection. This is especially useful when
- * the selectionMode is {@link #SINGLE_TREE_SELECTION}.
- *
- * @return the first path in the selection
- */
- public TreePath getSelectionPath()
- {
- if ((selection == null) || (selection.length == 0))
- return null;
- else
- return selection[0];
- }
-
- /**
- * Returns the complete selection.
- *
- * @return the complete selection
- */
- public TreePath[] getSelectionPaths()
- {
- return selection;
- }
-
- /**
- * Returns the number of paths in the selection.
- *
- * @return the number of paths in the selection
- */
- public int getSelectionCount()
- {
- if (selection == null)
- return 0;
- else
- return selection.length;
- }
-
- /**
- * Checks if a given path is in the selection.
- *
- * @param path the path to check
- *
- * @return <code>true</code> if the path is in the selection,
- * <code>false</code> otherwise
- */
- public boolean isPathSelected(TreePath path)
- {
- if (selection == null)
- return false;
-
- for (int i = 0; i < selection.length; i++)
- {
- if (selection[i].equals(path))
- return true;
- }
- return false;
- }
-
- /**
- * Checks if the selection is empty.
- *
- * @return <code>true</code> if the selection is empty, <code>false</code>
- * otherwise
- */
- public boolean isSelectionEmpty()
- {
- return ((selection == null) || (selection.length == 0));
- }
-
- /**
- * Removes all paths from the selection.
- */
- public void clearSelection()
- {
- leadPath = null;
- selection = null;
- }
-
- /**
- * Adds a <code>TreeSelectionListener</code> object to this model.
- *
- * @param listener the listener to add
- */
- public void addTreeSelectionListener(TreeSelectionListener listener)
- {
- listenerList.add(TreeSelectionListener.class, listener);
- }
-
- /**
- * Removes a <code>TreeSelectionListener</code> object from this model.
- *
- * @param listener the listener to remove
- */
- public void removeTreeSelectionListener(TreeSelectionListener listener)
- {
- listenerList.remove(TreeSelectionListener.class, listener);
- }
-
- /**
- * Returns all <code>TreeSelectionListener</code> added to this model.
- *
- * @return an array of listeners
- *
- * @since 1.4
- */
- public TreeSelectionListener[] getTreeSelectionListeners()
- {
- return (TreeSelectionListener[])
- getListeners(TreeSelectionListener.class);
- }
-
- /**
- * fireValueChanged
- *
- * @param event the event to fire.
- */
- protected void fireValueChanged(TreeSelectionEvent event)
- {
- TreeSelectionListener[] listeners = getTreeSelectionListeners();
-
- for (int i = 0; i < listeners.length; ++i)
- listeners[i].valueChanged(event);
- }
-
- /**
- * Returns all added listeners of a special type.
- *
- * @param listenerType the listener type
- *
- * @return an array of listeners
- *
- * @since 1.3
- */
- public EventListener[] getListeners(Class listenerType)
- {
- return listenerList.getListeners(listenerType);
- }
-
- /**
- * Returns the currently selected rows.
- *
- * @return the currently selected rows
- */
- public int[] getSelectionRows()
- {
- if (rowMapper == null)
- return null;
- else
- return rowMapper.getRowsForPaths(selection);
- }
-
- /**
- * Returns the smallest row index from the selection.
- *
- * @return the smallest row index from the selection
- */
- public int getMinSelectionRow()
- {
- if ((rowMapper == null) || (selection == null)
- || (selection.length == 0))
- return -1;
- else
- {
- int[] rows = rowMapper.getRowsForPaths(selection);
- int minRow = Integer.MAX_VALUE;
- for (int index = 0; index < rows.length; index++)
- minRow = Math.min(minRow, rows[index]);
- return minRow;
- }
- }
-
- /**
- * Returns the largest row index from the selection.
- *
- * @return the largest row index from the selection
- */
- public int getMaxSelectionRow()
- {
- if ((rowMapper == null) || (selection == null)
- || (selection.length == 0))
- return -1;
- else
- {
- int[] rows = rowMapper.getRowsForPaths(selection);
- int maxRow = -1;
- for (int index = 0; index < rows.length; index++)
- maxRow = Math.max(maxRow, rows[index]);
- return maxRow;
- }
- }
-
- /**
- * Checks if a particular row is selected.
- *
- * @param row the index of the row to check
- *
- * @return <code>true</code> if the row is in this selection,
- * <code>false</code> otherwise
- */
- public boolean isRowSelected(int row)
- {
- return false; // TODO
- }
-
- /**
- * Updates the mappings from TreePaths to row indices.
- */
- public void resetRowSelection()
- {
- // TODO
- }
-
- /**
- * getLeadSelectionRow
- *
- * @return int
- */
- public int getLeadSelectionRow()
- {
- if ((rowMapper == null) || (leadPath == null))
- return -1;
- else
- return rowMapper.getRowsForPaths(new TreePath[] {
- leadPath })[0];
- }
-
- /**
- * getLeadSelectionPath
- *
- * @return TreePath
- */
- public TreePath getLeadSelectionPath()
- {
- return leadPath;
- }
-
- /**
- * Adds a <code>PropertyChangeListener</code> object to this model.
- *
- * @param listener the listener to add.
- */
- public void addPropertyChangeListener(PropertyChangeListener listener)
- {
- changeSupport.addPropertyChangeListener(listener);
- }
-
- /**
- * Removes a <code>PropertyChangeListener</code> object from this model.
- *
- * @param listener the listener to remove.
- */
- public void removePropertyChangeListener(PropertyChangeListener listener)
- {
- changeSupport.removePropertyChangeListener(listener);
- }
-
- /**
- * Returns all added <code>PropertyChangeListener</code> objects.
- *
- * @return an array of listeners.
- *
- * @since 1.4
- */
- public PropertyChangeListener[] getPropertyChangeListeners()
- {
- return changeSupport.getPropertyChangeListeners();
- }
-
- /**
- * Makes sure the currently selected paths are valid according to the
- * current selectionMode.
- *
- * If the selectionMode is set to {@link #CONTIGUOUS_TREE_SELECTION} and the
- * selection isn't contiguous then the selection is reset to the first set
- * of contguous paths.
- *
- * If the selectionMode is set to {@link #SINGLE_TREE_SELECTION} and the
- * selection has more than one path, the selection is reset to the contain
- * only the first path.
- */
- protected void insureRowContinuity()
- {
- // TODO
- }
-
- /**
- * Returns <code>true</code> if the paths are contiguous or we have no
- * RowMapper assigned.
- *
- * @param paths the paths to check for continuity
- * @return <code>true</code> if the paths are contiguous or we have no
- * RowMapper assigned
- */
- protected boolean arePathsContiguous(TreePath[] paths)
- {
- return false; // TODO
- }
-
- /**
- * Checks if the paths can be added. This returns <code>true</code> if:
- * <ul>
- * <li><code>paths</code> is <code>null</code> or empty</li>
- * <li>we have no RowMapper assigned</li>
- * <li>nothing is currently selected</li>
- * <li>selectionMode is {@link #DISCONTIGUOUS_TREE_SELECTION}</li>
- * <li>adding the paths to the selection still results in a contiguous set
- * of paths</li>
- *
- * @param paths the paths to check
- *
- * @return <code>true</code> if the paths can be added with respect to the
- * selectionMode
- */
- protected boolean canPathsBeAdded(TreePath[] paths)
- {
- return false; // TODO
- }
-
- /**
- * Checks if the paths can be removed without breaking the continuity of the
- * selection according to selectionMode.
- *
- * @param paths the paths to check
- * @return <code>true</code> if the paths can be removed with respect to
- * the selectionMode
- */
- protected boolean canPathsBeRemoved(TreePath[] paths)
- {
- return false; // TODO
- }
-
- /**
- * notifyPathChange
- *
- * @param value0 TODO
- * @param value1 TODO
- */
- protected void notifyPathChange(Vector value0, TreePath value1)
- {
- // TODO
- }
-
- /**
- * Updates the lead index instance field.
- */
- protected void updateLeadIndex()
- {
- // TODO
- }
-
- /**
- * Deprecated and not used.
- */
- protected void insureUniqueness()
- {
- // TODO
- }
+
+ /**
+ * Use serialVersionUID for interoperability.
+ */
+ static final long serialVersionUID = 3288129636638950196L;
+
+ /**
+ * The name of the selection mode property.
+ */
+ public static final String SELECTION_MODE_PROPERTY = "selectionMode";
+
+ /**
+ * Our Swing property change support.
+ */
+ protected SwingPropertyChangeSupport changeSupport;
+
+ /**
+ * The current selection.
+ */
+ protected TreePath[] selection;
+
+ /**
+ * Our TreeSelectionListeners.
+ */
+ protected EventListenerList listenerList;
+
+ /**
+ * The current RowMapper.
+ */
+ protected transient RowMapper rowMapper;
+
+ /**
+ * The current listSelectionModel.
+ */
+ protected DefaultListSelectionModel listSelectionModel;
+
+ /**
+ * The current selection mode.
+ */
+ protected int selectionMode;
+
+ /**
+ * The path that has been added last.
+ */
+ protected TreePath leadPath;
+
+ /**
+ * The index of the last added path.
+ */
+ protected int leadIndex;
+
+ /**
+ * The row of the last added path according to the RowMapper.
+ */
+ protected int leadRow;
+
+ /**
+ * Constructs a new DefaultTreeSelectionModel.
+ */
+ public DefaultTreeSelectionModel()
+ {
+ setSelectionMode(DISCONTIGUOUS_TREE_SELECTION);
+ listenerList = new EventListenerList();
+ }
+
+ /**
+ * Creates a clone of this DefaultTreeSelectionModel with the same selection.
+ * The cloned instance will have the same registered listeners, the listeners
+ * themselves will not be cloned. The selection will be cloned.
+ *
+ * @exception CloneNotSupportedException should not be thrown here
+ * @return a copy of this DefaultTreeSelectionModel
+ */
+ public Object clone() throws CloneNotSupportedException
+ {
+ DefaultTreeSelectionModel cloned =
+ (DefaultTreeSelectionModel) super.clone();
+
+ // Clone the selection and the list selection model.
+ cloned.selection = (TreePath[]) selection.clone();
+ if (listSelectionModel!=null)
+ cloned.listSelectionModel =
+ (DefaultListSelectionModel) listSelectionModel.clone();
+ return cloned;
+ }
+
+ /**
+ * Returns a string that shows this object's properties.
+ * The returned string lists the selected tree rows, if any.
+ *
+ * @return a string that shows this object's properties
+ */
+ public String toString()
+ {
+ if (isSelectionEmpty())
+ return "[selection empty]";
+ else
+ {
+ StringBuffer b = new StringBuffer("selected rows: [");
+ for (int i = 0; i < selection.length; i++)
+ {
+ b.append(getRow(selection[i]));
+ b.append(' ');
+ }
+ b.append(", lead "+getLeadSelectionRow());
+ return b.toString();
+ }
+ }
+
+ /**
+ * writeObject
+ *
+ * @param value0 TODO
+ * @exception IOException TODO
+ */
+ private void writeObject(ObjectOutputStream value0) throws IOException
+ {
+ // TODO
+ }
+
+ /**
+ * readObject
+ *
+ * @param value0 TODO
+ * @exception IOException TODO
+ * @exception ClassNotFoundException TODO
+ */
+ private void readObject(ObjectInputStream value0) throws IOException,
+ ClassNotFoundException
+ {
+ // TODO
+ }
+
+ /**
+ * Sets the RowMapper that should be used to map between paths and their rows.
+ *
+ * @param mapper the RowMapper to set
+ * @see RowMapper
+ */
+ public void setRowMapper(RowMapper mapper)
+ {
+ rowMapper = mapper;
+ }
+
+ /**
+ * Returns the RowMapper that is currently used to map between paths and their
+ * rows.
+ *
+ * @return the current RowMapper
+ * @see RowMapper
+ */
+ public RowMapper getRowMapper()
+ {
+ return rowMapper;
+ }
+
+ /**
+ * Sets the current selection mode. Possible values are
+ * {@link #SINGLE_TREE_SELECTION}, {@link #CONTIGUOUS_TREE_SELECTION} and
+ * {@link #DISCONTIGUOUS_TREE_SELECTION}.
+ *
+ * @param mode the selection mode to be set
+ * @see #getSelectionMode
+ * @see #SINGLE_TREE_SELECTION
+ * @see #CONTIGUOUS_TREE_SELECTION
+ * @see #DISCONTIGUOUS_TREE_SELECTION
+ */
+ public void setSelectionMode(int mode)
+ {
+ selectionMode = mode;
+ insureRowContinuity();
+ }
+
+ /**
+ * Returns the current selection mode.
+ *
+ * @return the current selection mode
+ * @see #setSelectionMode
+ * @see #SINGLE_TREE_SELECTION
+ * @see #CONTIGUOUS_TREE_SELECTION
+ * @see #DISCONTIGUOUS_TREE_SELECTION
+ */
+ public int getSelectionMode()
+ {
+ return selectionMode;
+ }
+
+ /**
+ * Sets this path as the only selection. If this changes the selection the
+ * registered TreeSelectionListeners are notified.
+ *
+ * @param path the path to set as selection
+ */
+ public void setSelectionPath(TreePath path)
+ {
+ // The most frequently only one cell in the tree is selected.
+ TreePath[] ose = selection;
+ selection = new TreePath[] { path };
+ TreePath oldLead = leadPath;
+ leadIndex = 0;
+ leadRow = getRow(path);
+ leadPath = path;
+
+ TreeSelectionEvent event;
+
+ if (ose != null && ose.length > 0)
+ {
+ // The first item in the path list is the selected path.
+ // The remaining items are unselected pathes.
+ TreePath[] changed = new TreePath[ose.length + 1];
+ boolean[] news = new boolean[changed.length];
+ news[0] = true;
+ changed[0] = path;
+ System.arraycopy(ose, 0, changed, 1, ose.length);
+ event = new TreeSelectionEvent(this, changed, news, oldLead, path);
+ }
+ else
+ {
+ event = new TreeSelectionEvent(this, path, true, oldLead, path);
+ }
+ fireValueChanged(event);
+ }
+
+ /**
+ * Get the number of the tree row for the given path.
+ *
+ * @param path the tree path
+ * @return the tree row for this path or -1 if the path is not visible.
+ */
+ int getRow(TreePath path)
+ {
+ RowMapper mapper = getRowMapper();
+
+ if (mapper instanceof AbstractLayoutCache)
+ {
+ // The absolute majority of cases, unless the TreeUI is very
+ // seriously rewritten
+ AbstractLayoutCache ama = (AbstractLayoutCache) mapper;
+ return ama.getRowForPath(path);
+ }
+ else
+ {
+ // Generic non optimized implementation.
+ int[] rows = mapper.getRowsForPaths(new TreePath[] { path });
+ if (rows.length == 0)
+ return - 1;
+ else
+ return rows[0];
+ }
+ }
+
+ /**
+ * Sets the paths as selection. This method checks for duplicates and removes
+ * them. If this changes the selection the registered TreeSelectionListeners
+ * are notified.
+ *
+ * @param paths the paths to set as selection
+ */
+ public void setSelectionPaths(TreePath[] paths)
+ {
+ // Must be called, as defined in JDK API 1.4.
+ insureUniqueness();
+ clearSelection();
+ addSelectionPaths(paths);
+ }
+
+ /**
+ * Adds a path to the list of selected paths. This method checks if the path
+ * is already selected and doesn't add the same path twice. If this changes
+ * the selection the registered TreeSelectionListeners are notified.
+ *
+ * The lead path is changed to the added path. This also happen if the
+ * passed path was already selected before.
+ *
+ * @param path the path to add to the selection
+ */
+ public void addSelectionPath(TreePath path)
+ {
+ if (! isPathSelected(path))
+ {
+ if (selectionMode == SINGLE_TREE_SELECTION || isSelectionEmpty()
+ || ! canPathBeAdded(path))
+ setSelectionPath(path);
+ else
+ {
+ TreePath[] temp = new TreePath[selection.length + 1];
+ System.arraycopy(selection, 0, temp, 0, selection.length);
+ temp[temp.length - 1] = path;
+ selection = new TreePath[temp.length];
+ System.arraycopy(temp, 0, selection, 0, temp.length);
+ }
+ }
+
+ if (path!=leadPath)
+ {
+ TreePath oldLead = leadPath;
+ leadPath = path;
+ leadRow = getRow(path);
+ leadIndex = selection.length - 1;
+ fireValueChanged(new TreeSelectionEvent(this, path, true, oldLead,
+ leadPath));
+ }
+ }
+
+ /**
+ * Adds the paths to the list of selected paths. This method checks if the
+ * paths are already selected and doesn't add the same path twice. If this
+ * changes the selection the registered TreeSelectionListeners are notified.
+ *
+ * @param paths the paths to add to the selection
+ */
+ public void addSelectionPaths(TreePath[] paths)
+ {
+ // Must be called, as defined in JDK API 1.4.
+ insureUniqueness();
+
+ if (paths != null)
+ {
+ TreePath v0 = null;
+ for (int i = 0; i < paths.length; i++)
+ {
+ v0 = paths[i];
+ if (! isPathSelected(v0))
+ {
+ if (isSelectionEmpty())
+ setSelectionPath(v0);
+ else
+ {
+ TreePath[] temp = new TreePath[selection.length + 1];
+ System.arraycopy(selection, 0, temp, 0, selection.length);
+ temp[temp.length - 1] = v0;
+ selection = new TreePath[temp.length];
+ System.arraycopy(temp, 0, selection, 0, temp.length);
+ }
+ TreePath oldLead = leadPath;
+ leadPath = paths[paths.length - 1];
+ leadRow = getRow(leadPath);
+ leadIndex = selection.length - 1;
+
+ fireValueChanged(new TreeSelectionEvent(this, v0, true,
+ oldLead, leadPath));
+ }
+ }
+ insureRowContinuity();
+ }
+ }
+
+ /**
+ * Removes the path from the selection. If this changes the selection the
+ * registered TreeSelectionListeners are notified.
+ *
+ * @param path the path to remove
+ */
+ public void removeSelectionPath(TreePath path)
+ {
+ if (isSelectionEmpty())
+ return;
+
+ int index = - 1;
+ if (isPathSelected(path))
+ {
+ for (int i = 0; i < selection.length; i++)
+ {
+ if (selection[i].equals(path))
+ {
+ index = i;
+ break;
+ }
+ }
+ TreePath[] temp = new TreePath[selection.length - 1];
+ System.arraycopy(selection, 0, temp, 0, index);
+ System.arraycopy(selection, index + 1, temp, index, selection.length
+ - index - 1);
+ selection = new TreePath[temp.length];
+ System.arraycopy(temp, 0, selection, 0, temp.length);
+
+ // If the removed path was the lead path, set the lead path to null.
+ TreePath oldLead = leadPath;
+ if (path!=null && leadPath!=null && path.equals(leadPath))
+ leadPath = null;
+
+ fireValueChanged(new TreeSelectionEvent(this, path, false, oldLead,
+ leadPath));
+ insureRowContinuity();
+ }
+ }
+
+ /**
+ * Removes the paths from the selection. If this changes the selection the
+ * registered TreeSelectionListeners are notified.
+ *
+ * @param paths the paths to remove
+ */
+ public void removeSelectionPaths(TreePath[] paths)
+ {
+ if (isSelectionEmpty())
+ return;
+ if (paths != null)
+ {
+ int index = - 1;
+ TreePath v0 = null;
+ TreePath oldLead = leadPath;
+ for (int i = 0; i < paths.length; i++)
+ {
+ v0 = paths[i];
+ if (isPathSelected(v0))
+ {
+ for (int x = 0; x < selection.length; x++)
+ {
+ if (selection[i].equals(v0))
+ {
+ index = x;
+ break;
+ }
+ if (leadPath != null && leadPath.equals(v0))
+ leadPath = null;
+ }
+ TreePath[] temp = new TreePath[selection.length - 1];
+ System.arraycopy(selection, 0, temp, 0, index);
+ System.arraycopy(selection, index + 1, temp, index,
+ selection.length - index - 1);
+ selection = new TreePath[temp.length];
+ System.arraycopy(temp, 0, selection, 0, temp.length);
+
+ fireValueChanged(new TreeSelectionEvent(this, v0, false,
+ oldLead, leadPath));
+ }
+ }
+ insureRowContinuity();
+ }
+ }
+
+ /**
+ * Returns the first path in the selection. This is especially useful when the
+ * selectionMode is {@link #SINGLE_TREE_SELECTION}.
+ *
+ * @return the first path in the selection
+ */
+ public TreePath getSelectionPath()
+ {
+ if ((selection == null) || (selection.length == 0))
+ return null;
+ else
+ return selection[0];
+ }
+
+ /**
+ * Returns the complete selection.
+ *
+ * @return the complete selection
+ */
+ public TreePath[] getSelectionPaths()
+ {
+ return selection;
+ }
+
+ /**
+ * Returns the number of paths in the selection.
+ *
+ * @return the number of paths in the selection
+ */
+ public int getSelectionCount()
+ {
+ if (selection == null)
+ return 0;
+ else
+ return selection.length;
+ }
+
+ /**
+ * Checks if a given path is in the selection.
+ *
+ * @param path the path to check
+ * @return <code>true</code> if the path is in the selection,
+ * <code>false</code> otherwise
+ */
+ public boolean isPathSelected(TreePath path)
+ {
+ if (selection == null)
+ return false;
+
+ for (int i = 0; i < selection.length; i++)
+ {
+ if (selection[i].equals(path))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Checks if the selection is empty.
+ *
+ * @return <code>true</code> if the selection is empty, <code>false</code>
+ * otherwise
+ */
+ public boolean isSelectionEmpty()
+ {
+ return ((selection == null) || (selection.length == 0));
+ }
+
+ /**
+ * Removes all paths from the selection. Fire the unselection event.
+ */
+ public void clearSelection()
+ {
+ if (! isSelectionEmpty())
+ {
+ TreeSelectionEvent event = new TreeSelectionEvent(
+ this, selection, new boolean[selection.length], leadPath, null);
+ leadPath = null;
+ selection = null;
+ fireValueChanged(event);
+ }
+ else
+ {
+ leadPath = null;
+ selection = null;
+ }
+ }
+
+ /**
+ * Adds a <code>TreeSelectionListener</code> object to this model.
+ *
+ * @param listener the listener to add
+ */
+ public void addTreeSelectionListener(TreeSelectionListener listener)
+ {
+ listenerList.add(TreeSelectionListener.class, listener);
+ }
+
+ /**
+ * Removes a <code>TreeSelectionListener</code> object from this model.
+ *
+ * @param listener the listener to remove
+ */
+ public void removeTreeSelectionListener(TreeSelectionListener listener)
+ {
+ listenerList.remove(TreeSelectionListener.class, listener);
+ }
+
+ /**
+ * Returns all <code>TreeSelectionListener</code> added to this model.
+ *
+ * @return an array of listeners
+ * @since 1.4
+ */
+ public TreeSelectionListener[] getTreeSelectionListeners()
+ {
+ return (TreeSelectionListener[]) getListeners(TreeSelectionListener.class);
+ }
+
+ /**
+ * fireValueChanged
+ *
+ * @param event the event to fire.
+ */
+ protected void fireValueChanged(TreeSelectionEvent event)
+ {
+ TreeSelectionListener[] listeners = getTreeSelectionListeners();
+
+ for (int i = 0; i < listeners.length; ++i)
+ listeners[i].valueChanged(event);
+ }
+
+ /**
+ * Returns all added listeners of a special type.
+ *
+ * @param listenerType the listener type
+ * @return an array of listeners
+ * @since 1.3
+ */
+ public EventListener[] getListeners(Class listenerType)
+ {
+ return listenerList.getListeners(listenerType);
+ }
+
+ /**
+ * Returns the currently selected rows.
+ *
+ * @return the currently selected rows
+ */
+ public int[] getSelectionRows()
+ {
+ if (rowMapper == null)
+ return null;
+ else
+ return rowMapper.getRowsForPaths(selection);
+ }
+
+ /**
+ * Returns the smallest row index from the selection.
+ *
+ * @return the smallest row index from the selection
+ */
+ public int getMinSelectionRow()
+ {
+ if ((rowMapper == null) || (selection == null) || (selection.length == 0))
+ return - 1;
+ else
+ {
+ int[] rows = rowMapper.getRowsForPaths(selection);
+ int minRow = Integer.MAX_VALUE;
+ for (int index = 0; index < rows.length; index++)
+ minRow = Math.min(minRow, rows[index]);
+ return minRow;
+ }
+ }
+
+ /**
+ * Returns the largest row index from the selection.
+ *
+ * @return the largest row index from the selection
+ */
+ public int getMaxSelectionRow()
+ {
+ if ((rowMapper == null) || (selection == null) || (selection.length == 0))
+ return - 1;
+ else
+ {
+ int[] rows = rowMapper.getRowsForPaths(selection);
+ int maxRow = - 1;
+ for (int index = 0; index < rows.length; index++)
+ maxRow = Math.max(maxRow, rows[index]);
+ return maxRow;
+ }
+ }
+
+ /**
+ * Checks if a particular row is selected.
+ *
+ * @param row the index of the row to check
+ * @return <code>true</code> if the row is in this selection,
+ * <code>false</code> otherwise
+ * @throws NullPointerException if the row mapper is not set (can only happen
+ * if the user has plugged in the custom incorrect TreeUI
+ * implementation.
+ */
+ public boolean isRowSelected(int row)
+ {
+ // Return false if nothing is selected.
+ if (isSelectionEmpty())
+ return false;
+
+ RowMapper mapper = getRowMapper();
+
+ if (mapper instanceof AbstractLayoutCache)
+ {
+ // The absolute majority of cases, unless the TreeUI is very
+ // seriously rewritten
+ AbstractLayoutCache ama = (AbstractLayoutCache) mapper;
+ TreePath path = ama.getPathForRow(row);
+ return isPathSelected(path);
+ }
+ else
+ {
+ // Generic non optimized implementation.
+ int[] rows = mapper.getRowsForPaths(selection);
+ for (int i = 0; i < rows.length; i++)
+ if (rows[i] == row)
+ return true;
+ return false;
+ }
+ }
+
+ /**
+ * Updates the mappings from TreePaths to row indices.
+ */
+ public void resetRowSelection()
+ {
+ // Nothing to do here.
+ }
+
+ /**
+ * getLeadSelectionRow
+ *
+ * @return int
+ */
+ public int getLeadSelectionRow()
+ {
+ return leadRow;
+ }
+
+ /**
+ * getLeadSelectionPath
+ *
+ * @return TreePath
+ */
+ public TreePath getLeadSelectionPath()
+ {
+ return leadPath;
+ }
+
+ /**
+ * Adds a <code>PropertyChangeListener</code> object to this model.
+ *
+ * @param listener the listener to add.
+ */
+ public void addPropertyChangeListener(PropertyChangeListener listener)
+ {
+ changeSupport.addPropertyChangeListener(listener);
+ }
+
+ /**
+ * Removes a <code>PropertyChangeListener</code> object from this model.
+ *
+ * @param listener the listener to remove.
+ */
+ public void removePropertyChangeListener(PropertyChangeListener listener)
+ {
+ changeSupport.removePropertyChangeListener(listener);
+ }
+
+ /**
+ * Returns all added <code>PropertyChangeListener</code> objects.
+ *
+ * @return an array of listeners.
+ * @since 1.4
+ */
+ public PropertyChangeListener[] getPropertyChangeListeners()
+ {
+ return changeSupport.getPropertyChangeListeners();
+ }
+
+ /**
+ * Makes sure the currently selected paths are valid according to the current
+ * selectionMode. If the selectionMode is set to
+ * {@link #CONTIGUOUS_TREE_SELECTION} and the selection isn't contiguous then
+ * the selection is reset to the first set of contguous paths. If the
+ * selectionMode is set to {@link #SINGLE_TREE_SELECTION} and the selection
+ * has more than one path, the selection is reset to the contain only the
+ * first path.
+ */
+ protected void insureRowContinuity()
+ {
+ if (selection == null || selection.length < 2)
+ return;
+ else if (selectionMode == CONTIGUOUS_TREE_SELECTION)
+ {
+ if (rowMapper == null)
+ // This is the best we can do without the row mapper:
+ selectOne();
+ else
+ {
+ int[] rows = rowMapper.getRowsForPaths(selection);
+ Arrays.sort(rows);
+ int i;
+ for (i = 1; i < rows.length; i++)
+ {
+ if (rows[i - 1] != rows[i] - 1)
+ // Break if no longer continuous.
+ break;
+ }
+
+ if (i < rows.length)
+ {
+ TreePath[] ns = new TreePath[i];
+ for (int j = 0; j < ns.length; j++)
+ ns[i] = getPath(j);
+ setSelectionPaths(ns);
+ }
+ }
+ }
+ else if (selectionMode == SINGLE_TREE_SELECTION)
+ selectOne();
+ }
+
+ /**
+ * Keep only one (normally last or leading) path in the selection.
+ */
+ private void selectOne()
+ {
+ if (leadIndex > 0 && leadIndex < selection.length)
+ setSelectionPath(selection[leadIndex]);
+ else
+ setSelectionPath(selection[selection.length -1]);
+ }
+
+ /**
+ * Get path for the given row that must be in the current selection.
+ */
+ private TreePath getPath(int row)
+ {
+ if (rowMapper instanceof AbstractLayoutCache)
+ return ((AbstractLayoutCache) rowMapper).getPathForRow(row);
+ else
+ {
+ int[] rows = rowMapper.getRowsForPaths(selection);
+ for (int i = 0; i < rows.length; i++)
+ if (rows[i] == row)
+ return selection[i];
+ }
+ throw new InternalError(row + " not in selection");
+ }
+
+ /**
+ * Returns <code>true</code> if the paths are contiguous (take subsequent
+ * rows in the diplayed tree view. The method returns <code>true</code> if
+ * we have no RowMapper assigned.
+ *
+ * @param paths the paths to check for continuity
+ * @return <code>true</code> if the paths are contiguous or we have no
+ * RowMapper assigned
+ */
+ protected boolean arePathsContiguous(TreePath[] paths)
+ {
+ if (rowMapper == null || paths.length < 2)
+ return true;
+
+ int[] rows = rowMapper.getRowsForPaths(paths);
+
+ // The patches may not be sorted.
+ Arrays.sort(rows);
+
+ for (int i = 1; i < rows.length; i++)
+ {
+ if (rows[i-1] != rows[i] - 1)
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Checks if the paths can be added. This returns <code>true</code> if:
+ * <ul>
+ * <li><code>paths</code> is <code>null</code> or empty</li>
+ * <li>we have no RowMapper assigned</li>
+ * <li>nothing is currently selected</li>
+ * <li>selectionMode is {@link #DISCONTIGUOUS_TREE_SELECTION}</li>
+ * <li>adding the paths to the selection still results in a contiguous set of
+ * paths</li>
+ *
+ * @param paths the paths to check
+ * @return <code>true</code> if the paths can be added with respect to the
+ * selectionMode
+ */
+ protected boolean canPathsBeAdded(TreePath[] paths)
+ {
+ if (rowMapper == null || isSelectionEmpty()
+ || selectionMode == DISCONTIGUOUS_TREE_SELECTION)
+ return true;
+
+ TreePath [] all = new TreePath[paths.length + selection.length];
+ System.arraycopy(paths, 0, all, 0, paths.length);
+ System.arraycopy(selection, 0, all, paths.length, selection.length);
+
+ return arePathsContiguous(all);
+ }
+
+ /**
+ * Checks if the single path can be added to selection.
+ */
+ private boolean canPathBeAdded(TreePath path)
+ {
+ if (rowMapper == null || isSelectionEmpty()
+ || selectionMode == DISCONTIGUOUS_TREE_SELECTION)
+ return true;
+
+ TreePath[] all = new TreePath[selection.length + 1];
+ System.arraycopy(selection, 0, all, 0, selection.length);
+ all[all.length - 1] = path;
+
+ return arePathsContiguous(all);
+ }
+
+ /**
+ * Checks if the paths can be removed without breaking the continuity of the
+ * selection according to selectionMode.
+ *
+ * @param paths the paths to check
+ * @return <code>true</code> if the paths can be removed with respect to the
+ * selectionMode
+ */
+ protected boolean canPathsBeRemoved(TreePath[] paths)
+ {
+ if (rowMapper == null || isSelectionEmpty()
+ || selectionMode == DISCONTIGUOUS_TREE_SELECTION)
+ return true;
+
+ HashSet set = new HashSet();
+ for (int i = 0; i < selection.length; i++)
+ set.add(selection[i]);
+
+ for (int i = 0; i < paths.length; i++)
+ set.remove(paths[i]);
+
+ TreePath[] remaining = new TreePath[set.size()];
+ Iterator iter = set.iterator();
+
+ for (int i = 0; i < remaining.length; i++)
+ remaining[i] = (TreePath) iter.next();
+
+ return arePathsContiguous(remaining);
+ }
+
+ /**
+ * Notify the installed listeners that the given patches have changed. This
+ * method will call listeners if invoked, but it is not called from the
+ * implementation of this class.
+ *
+ * @param vPathes the vector of the changed patches
+ * @param oldLeadSelection the old selection index
+ */
+ protected void notifyPathChange(Vector vPathes, TreePath oldLeadSelection)
+ {
+ TreePath[] pathes = new TreePath[vPathes.size()];
+ for (int i = 0; i < pathes.length; i++)
+ pathes[i] = (TreePath) vPathes.get(i);
+
+ boolean[] news = new boolean[pathes.length];
+ for (int i = 0; i < news.length; i++)
+ news[i] = isPathSelected(pathes[i]);
+
+ TreeSelectionEvent event = new TreeSelectionEvent(this, pathes, news,
+ oldLeadSelection,
+ leadPath);
+ fireValueChanged(event);
+ }
+
+ /**
+ * Updates the lead selection row number after changing the lead selection
+ * path.
+ */
+ protected void updateLeadIndex()
+ {
+ if (isSelectionEmpty())
+ {
+ leadRow = leadIndex = - 1;
+ }
+ else
+ {
+ leadRow = getRow(leadPath);
+ for (int i = 0; i < selection.length; i++)
+ {
+ if (selection[i].equals(leadPath))
+ {
+ leadIndex = i;
+ break;
+ }
+ }
+ leadIndex = leadRow;
+ }
+ }
+
+ /**
+ * This method exists due historical reasons and returns without action
+ * (unless overridden). For compatibility with the applications that override
+ * it, it is still called from the {@link #setSelectionPaths(TreePath[])} and
+ * {@link #addSelectionPaths(TreePath[])}.
+ */
+ protected void insureUniqueness()
+ {
+ // Following the API 1.4, the method should return without action.
+ }
}
diff --git a/javax/swing/tree/FixedHeightLayoutCache.java b/javax/swing/tree/FixedHeightLayoutCache.java
index 307eb5565..96655ce75 100644
--- a/javax/swing/tree/FixedHeightLayoutCache.java
+++ b/javax/swing/tree/FixedHeightLayoutCache.java
@@ -1,4 +1,4 @@
-/* FixedHeightLayoutCache.java --
+/* FixedHeightLayoutCache.java -- Fixed cell height tree layout cache
Copyright (C) 2002, 2004, 2006, Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,196 +37,592 @@ exception statement from your version. */
package javax.swing.tree;
+import gnu.javax.swing.tree.GnuPath;
+
import java.awt.Rectangle;
import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.Vector;
import javax.swing.event.TreeModelEvent;
+
/**
- * FixedHeightLayoutCache
+ * The fixed height tree layout. This class assumes that all cells in the tree
+ * have the same fixed height. This may be not the case, for instance, if leaves
+ * and branches have different height, of if the tree rows may have arbitrary
+ * variable height. This class will also work if the NodeDimensions are not
+ * set.
*
- * @author Andrew Selkirk
+ * @author Audrius Meskauskas
+ * @author Andrew Selkirk
*/
public class FixedHeightLayoutCache
- extends AbstractLayoutCache
+ extends VariableHeightLayoutCache
{
+ /**
+ * The cached node record.
+ */
+ class NodeRecord
+ {
+ NodeRecord(int aRow, int aDepth, Object aNode, Object aParent)
+ {
+ row = aRow;
+ depth = aDepth;
+ parent = aParent;
+ node = aNode;
+
+ isExpanded = expanded.contains(aNode);
+ }
+
+ /**
+ * The row, where the tree node is displayed.
+ */
+ final int row;
+
+ /**
+ * The nesting depth
+ */
+ final int depth;
+
+ /**
+ * The parent of the given node, null for the root node.
+ */
+ final Object parent;
+
+ /**
+ * This node.
+ */
+ final Object node;
+
+ /**
+ * True for the expanded nodes. The value is calculated in constructor.
+ * Using this field saves one hashtable access operation.
+ */
+ final boolean isExpanded;
+
+ /**
+ * The cached bounds of the tree row.
+ */
+ Rectangle bounds;
+
+ /**
+ * The path from the tree top to the given node (computed under first
+ * demand)
+ */
+ private TreePath path;
+
+ /**
+ * Get the path for this node. The derived class is returned,
+ * making check for the last child of some parent easier.
+ */
+ TreePath getPath()
+ {
+ if (path == null)
+ {
+ boolean lastChild = false;
+ if (parent != null)
+ {
+ int nc = treeModel.getChildCount(parent);
+ if (nc > 0)
+ {
+ int n = treeModel.getIndexOfChild(parent, node);
+ if (n == nc - 1)
+ lastChild = true;
+ }
+ }
+ LinkedList lpath = new LinkedList();
+ NodeRecord rp = this;
+ while (rp != null)
+ {
+ lpath.addFirst(rp.node);
+ if (rp.parent != null)
+ {
+ Object parent = rp.parent;
+ rp = (NodeRecord) nodes.get(parent);
+ // Add the root node, even if it is not visible.
+ if (rp == null)
+ lpath.addFirst(parent);
+ }
+ else
+ rp = null;
+ }
+ path = new GnuPath(lpath.toArray(), lastChild);
+ }
+ return path;
+ }
+
+ /**
+ * Get the rectangle bounds (compute, if required).
+ */
+ Rectangle getBounds()
+ {
+ // This method may be called in the context when the tree rectangle is
+ // not known. To work around this, it is assumed near infinitely large.
+ if (bounds==null)
+ bounds = getNodeDimensions(node, row, depth, isExpanded,
+ new Rectangle());
+ return bounds;
+ }
+ }
+
+ /**
+ * The set of all expanded tree nodes.
+ */
+ Set expanded = new HashSet();
+
+ /**
+ * Maps nodes to the row numbers.
+ */
+ Hashtable nodes = new Hashtable();
+
+ /**
+ * Maps row numbers to nodes.
+ */
+ Hashtable row2node = new Hashtable();
+
+ /**
+ * If true, the row map must be recomputed before using.
+ */
+ boolean dirty;
+
/**
- * Constructor FixedHeightLayoutCache
+ * The cumulative height of all rows.
+ */
+ int totalHeight;
+
+ /**
+ * The maximal width.
+ */
+ int maximalWidth;
+
+ /**
+ * Creates the unitialised instance. Before using the class, the row height
+ * must be set with the {@link #setRowHeight(int)} and the model must be set
+ * with {@link #setModel(TreeModel)}. The node dimensions may not be set.
*/
public FixedHeightLayoutCache()
{
- // TODO
+ // Nothing to do here.
}
/**
- * getRowCount
+ * Get the total number of rows in the tree. Every displayed node occupies the
+ * single row. The root node row is included if the root node is set as
+ * visible (false by default).
*
- * @return int
+ * @return int the number of the displayed rows.
+ */
+ public int getRowCount()
+ {
+ if (dirty) update();
+ return row2node.size();
+ }
+
+ /**
+ * Refresh the row map.
*/
- public int getRowCount()
+ private final void update()
{
- return 0; // TODO
- }
+ nodes.clear();
+ row2node.clear();
+
+ totalHeight = maximalWidth = 0;
+ Object root = treeModel.getRoot();
+
+ if (rootVisible)
+ {
+ countRows(root, null, 0);
+ }
+ else
+ {
+ int sc = treeModel.getChildCount(root);
+ for (int i = 0; i < sc; i++)
+ {
+ Object child = treeModel.getChild(root, i);
+ countRows(child, root, 0);
+ }
+ }
+ dirty = false;
+ }
+
/**
- * invalidatePathBounds
+ * Recursively counts all rows in the tree.
+ */
+ private final void countRows(Object node, Object parent, int depth)
+ {
+ Integer n = new Integer(row2node.size());
+ row2node.put(n, node);
+
+ NodeRecord nr = new NodeRecord(n.intValue(), depth, node, parent);
+ nodes.put(node, nr);
+
+ // For expanded nodes and for the root node.
+ if (expanded.contains(node))
+ {
+ int sc = treeModel.getChildCount(node);
+ int deeper = depth+1;
+ for (int i = 0; i < sc; i++)
+ {
+ Object child = treeModel.getChild(node, i);
+ countRows(child, node, deeper);
+ }
+ }
+ }
+
+ /**
+ * Discard the bound information for the given path.
*
- * @param value0 TODO
+ * @param path the path, for that the bound information must be recomputed.
*/
- public void invalidatePathBounds(TreePath value0)
+ public void invalidatePathBounds(TreePath path)
{
- // TODO
+ NodeRecord r = (NodeRecord) nodes.get(path.getLastPathComponent());
+ if (r!=null)
+ r.bounds = null;
}
/**
- * invalidateSizes
+ * Mark all cached information as invalid.
*/
public void invalidateSizes()
{
- // TODO
+ dirty = true;
}
/**
- * isExpanded
+ * Set the expanded state of the given path. The expansion states must be
+ * always updated when expanding and colapsing the tree nodes. Otherwise
+ * other methods will not work correctly after the nodes are collapsed or
+ * expanded.
+ *
+ * @param path the tree path, for that the state is being set.
+ * @param isExpanded the expanded state of the given path.
+ */
+ public void setExpandedState(TreePath path, boolean isExpanded)
+ {
+ if (isExpanded)
+ expanded.add(path.getLastPathComponent());
+ else
+ expanded.remove(path.getLastPathComponent());
+
+ dirty = true;
+ }
+
+ /**
+ * Get the expanded state for the given tree path.
*
- * @param value0 TODO
- * @return boolean
+ * @return true if the given path is expanded, false otherwise.
*/
- public boolean isExpanded(TreePath value0)
+ public boolean isExpanded(TreePath path)
{
- return false; // TODO
+ return expanded.contains(path.getLastPathComponent());
}
/**
- * getBounds
+ * Get bounds for the given tree path.
*
- * @param value0 TODO
- * @param value1 TODO
- * @return Rectangle
+ * @param path the tree path
+ * @param rect the rectangle that will be reused to return the result.
+ * @return Rectangle the bounds of the last line, defined by the given path.
*/
- public Rectangle getBounds(TreePath value0, Rectangle value1)
+ public Rectangle getBounds(TreePath path, Rectangle rect)
{
- return null; // TODO
+ if (path == null)
+ return null;
+ if (dirty)
+ update();
+ Object last = path.getLastPathComponent();
+ NodeRecord r = (NodeRecord) nodes.get(last);
+ if (r == null)
+ // This node is not visible.
+ {
+ rect.x = rect.y = rect.width = rect.height = 0;
+ }
+ else
+ {
+ if (r.bounds == null)
+ {
+ Rectangle dim = getNodeDimensions(last, r.row, r.depth,
+ r.isExpanded, rect);
+ r.bounds = dim;
+ }
+
+ rect.setRect(r.bounds);
+ }
+ return rect;
}
/**
- * getPathForRow
+ * Get the path, the last element of that is displayed in the given row.
*
- * @param row TODO
- * @return TreePath
+ * @param row the row
+ * @return TreePath the path
*/
public TreePath getPathForRow(int row)
{
- //TODO
- return null;
+ if (dirty)
+ update();
+ Object last = row2node.get(new Integer(row));
+ if (last == null)
+ return null;
+ else
+ {
+ NodeRecord r = (NodeRecord) nodes.get(last);
+ return r.getPath();
+ }
}
/**
- * getRowForPath
+ * Get the row, displaying the last node of the given path.
*
- * @param value0 TODO
- * @return int
+ * @param path the path
+ * @return int the row number or -1 if the end of the path is not visible.
*/
- public int getRowForPath(TreePath value0)
+ public int getRowForPath(TreePath path)
{
- return 0;
+ if (path == null)
+ return -1;
+
+ if (dirty) update();
+
+ NodeRecord r = (NodeRecord) nodes.get(path.getLastPathComponent());
+ if (r == null)
+ return - 1;
+ else
+ return r.row;
}
/**
- * getPathClosestTo
+ * Get the path, closest to the given point.
*
- * @param value0 TODO
- * @param value1 TODO
- * @return TreePath
+ * @param x the point x coordinate
+ * @param y the point y coordinate
+ * @return the tree path, closest to the the given point
*/
- public TreePath getPathClosestTo(int value0, int value1)
+ public TreePath getPathClosestTo(int x, int y)
{
- return null; // TODO
+ if (dirty)
+ update();
+
+ // As the rows have arbitrary height, we need to iterate.
+ NodeRecord best = null;
+ NodeRecord r;
+ Enumeration en = nodes.elements();
+
+ int dist = Integer.MAX_VALUE;
+
+ while (en.hasMoreElements() && dist > 0)
+ {
+ r = (NodeRecord) en.nextElement();
+ if (best == null)
+ {
+ best = r;
+ dist = distance(r.getBounds(), x, y);
+ }
+ else
+ {
+ int rr = distance(r.getBounds(), x, y);
+ if (rr < dist)
+ {
+ best = r;
+ dist = rr;
+ }
+ }
+ }
+
+ if (best == null)
+ return null;
+ else
+ return best.getPath();
}
+
+ /**
+ * Get the closest distance from this point till the given rectangle. Only
+ * vertical distance is taken into consideration.
+ */
+ int distance(Rectangle r, int x, int y)
+ {
+ if (y < r.y)
+ return r.y - y;
+ else if (y > r.y + r.height)
+ return y - (r.y + r.height);
+ else
+ return 0;
+ }
/**
- * getVisibleChildCount
+ * Get the number of the visible childs for the given tree path. If the node
+ * is not expanded, 0 is returned. Otherwise, the number of children is
+ * obtained from the model as the number of children for the last path
+ * component.
*
- * @param value0 TODO
- * @return int
+ * @param path the tree path
+ * @return int the number of the visible childs (for row).
*/
- public int getVisibleChildCount(TreePath value0)
+ public int getVisibleChildCount(TreePath path)
{
- return 0; // TODO
+ if (isExpanded(path))
+ return 0;
+ else
+ return treeModel.getChildCount(path.getLastPathComponent());
}
/**
- * getVisiblePathsFrom
+ * Get the enumeration over all visible pathes that start from the given
+ * parent path.
*
- * @param value0 TODO
- * @return Enumeration
+ * @param parentPath the parent path
+ * @return the enumeration over pathes
*/
- public Enumeration getVisiblePathsFrom(TreePath value0)
+ public Enumeration getVisiblePathsFrom(TreePath parentPath)
{
- return null; // TODO
+ if (dirty)
+ update();
+ Vector p = new Vector(parentPath.getPathCount());
+ Object node;
+ NodeRecord nr;
+
+ for (int i = 0; i < parentPath.getPathCount(); i++)
+ {
+ node = parentPath.getPathComponent(i);
+ nr = (NodeRecord) nodes.get(node);
+ if (nr.row >= 0)
+ p.add(node);
+ }
+ return p.elements();
}
/**
- * setExpandedState
+ * Return the expansion state of the given tree path. The expansion state
+ * must be previously set with the
+ * {@link #setExpandedState(TreePath, boolean)}
*
- * @param value0 TODO
- * @param value1 TODO
+ * @param path the path being checked
+ * @return true if the last node of the path is expanded, false otherwise.
*/
- public void setExpandedState(TreePath value0, boolean value1)
+ public boolean getExpandedState(TreePath path)
{
- // TODO
- }
+ return expanded.contains(path.getLastPathComponent());
+ }
/**
- * getExpandedState
+ * The listener method, called when the tree nodes are changed.
*
- * @param value0 TODO
- * @return boolean
+ * @param event the change event
*/
- public boolean getExpandedState(TreePath value0)
+ public void treeNodesChanged(TreeModelEvent event)
{
- return false; // TODO
- }
+ dirty = true;
+ }
/**
- * treeNodesChanged
+ * The listener method, called when the tree nodes are inserted.
*
- * @param value0 TODO
+ * @param event the change event
*/
- public void treeNodesChanged(TreeModelEvent value0)
+ public void treeNodesInserted(TreeModelEvent event)
{
- // TODO
+ dirty = true;
}
/**
- * treeNodesInserted
+ * The listener method, called when the tree nodes are removed.
*
- * @param value0 TODO
+ * @param event the change event
*/
- public void treeNodesInserted(TreeModelEvent value0)
+ public void treeNodesRemoved(TreeModelEvent event)
{
- // TODO
+ dirty = true;
}
/**
- * treeNodesRemoved
+ * Called when the tree structure has been changed.
*
- * @param value0 TODO
+ * @param event the change event
*/
- public void treeNodesRemoved(TreeModelEvent value0)
+ public void treeStructureChanged(TreeModelEvent event)
{
- // TODO
+ dirty = true;
}
-
+
+ /**
+ * Set the tree model that will provide the data.
+ */
+ public void setModel(TreeModel newModel)
+ {
+ treeModel = newModel;
+ // The root node is expanded by default.
+ expanded.add(treeModel.getRoot());
+ dirty = true;
+ }
+
/**
- * treeStructureChanged
+ * Inform the instance if the tree root node is visible. If this method
+ * is not called, it is assumed that the tree root node is not visible.
*
- * @param value0 TODO
+ * @param visible true if the tree root node is visible, false
+ * otherwise.
*/
- public void treeStructureChanged(TreeModelEvent value0)
+ public void setRootVisible(boolean visible)
{
- // TODO
- }
+ rootVisible = visible;
+ dirty = true;
+ }
+ /**
+ * Get the sum of heights for all rows.
+ */
+ public int getPreferredHeight()
+ {
+ if (dirty)
+ update();
+ totalHeight = 0;
+ Enumeration en = nodes.elements();
+ while (en.hasMoreElements())
+ {
+ NodeRecord nr = (NodeRecord) en.nextElement();
+ Rectangle r = nr.getBounds();
+ totalHeight += r.height;
+ }
+ return totalHeight;
+ }
+
+ /**
+ * Get the maximal width.
+ */
+ public int getPreferredWidth(Rectangle value)
+ {
+ if (dirty)
+ update();
+
+ maximalWidth = 0;
+ Enumeration en = nodes.elements();
+ while (en.hasMoreElements())
+ {
+ NodeRecord nr = (NodeRecord) en.nextElement();
+ Rectangle r = nr.getBounds();
+ if (r.x + r.width > maximalWidth)
+ maximalWidth = r.x + r.width;
+ }
+ return maximalWidth;
+ }
+
+ /**
+ * Returns true if this layout supposes that all rows have the fixed
+ * height.
+ *
+ * @return boolean true if all rows in the tree must have the fixed
+ * height (true by default).
+ */
+ protected boolean isFixedRowHeight()
+ {
+ return true;
+ }
+
}
diff --git a/javax/swing/tree/TreePath.java b/javax/swing/tree/TreePath.java
index 38344acee..4671c4be5 100644
--- a/javax/swing/tree/TreePath.java
+++ b/javax/swing/tree/TreePath.java
@@ -53,9 +53,15 @@ public class TreePath implements Serializable
static final long serialVersionUID = 4380036194768077479L;
/**
- * path
+ * The actual patch. The {@link DefaultTreeSelectionModel#clone()}
+ * assumes that the TreePath is immutable, so it is marked final here.
*/
- private Object[] path = null;
+ private final Object[] path;
+
+ /**
+ * The parent path (to be reused).
+ */
+ private transient TreePath parentPath;
/**
@@ -293,7 +299,12 @@ public class TreePath implements Serializable
// is what the JDK does.
if (path.length <= 1)
return null;
-
- return new TreePath(this.getPath(), path.length - 1);
+
+ // Reuse the parent path, if possible. The parent path is requested
+ // during the tree repainting, so reusing generates a lot less garbage.
+ if (parentPath == null)
+ parentPath = new TreePath(this.getPath(), path.length - 1);
+
+ return parentPath;
}
}
diff --git a/javax/swing/tree/VariableHeightLayoutCache.java b/javax/swing/tree/VariableHeightLayoutCache.java
index 60a8c9fe7..a9ed552e6 100644
--- a/javax/swing/tree/VariableHeightLayoutCache.java
+++ b/javax/swing/tree/VariableHeightLayoutCache.java
@@ -35,227 +35,579 @@ this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
-
package javax.swing.tree;
+import gnu.javax.swing.tree.GnuPath;
+
import java.awt.Rectangle;
import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.Vector;
import javax.swing.event.TreeModelEvent;
/**
- * VariableHeightLayoutCache
- * @author Andrew Selkirk
+ * The fixed height tree layout. This class requires the NodeDimensions to be
+ * set and ignores the row height property.
+ *
+ * @specnote the methods, of this class, returning TreePath, actually returns
+ * the derived class GnuPath that provides additional information for optimized
+ * painting. See the GnuPath code for details.
+ *
+ * @author Audrius Meskauskas
*/
-public class VariableHeightLayoutCache extends AbstractLayoutCache
+public class VariableHeightLayoutCache
+ extends AbstractLayoutCache
{
-
/**
- * Constructor VariableHeightLayoutCache
+ * The cached node record.
*/
- public VariableHeightLayoutCache()
+ class NodeRecord
{
- // TODO
- }
+ NodeRecord(int aRow, int aDepth, Object aNode, Object aParent)
+ {
+ row = aRow;
+ depth = aDepth;
+ parent = aParent;
+ node = aNode;
+
+ isExpanded = expanded.contains(aNode);
+ }
+
+ /**
+ * The row, where the tree node is displayed.
+ */
+ final int row;
+
+ /**
+ * The nesting depth
+ */
+ final int depth;
+
+ /**
+ * The parent of the given node, null for the root node.
+ */
+ final Object parent;
+
+ /**
+ * This node.
+ */
+ final Object node;
+
+ /**
+ * True for the expanded nodes. The value is calculated in constructor.
+ * Using this field saves one hashtable access operation.
+ */
+ final boolean isExpanded;
+
+ /**
+ * The cached bounds of the tree row.
+ */
+ Rectangle bounds;
+
+ /**
+ * The path from the tree top to the given node (computed under first
+ * demand)
+ */
+ private TreePath path;
+
+ /**
+ * Get the path for this node. The derived class is returned, making check
+ * for the last child of some parent easier.
+ */
+ TreePath getPath()
+ {
+ if (path == null)
+ {
+ boolean lastChild = false;
+ if (parent != null)
+ {
+ int nc = treeModel.getChildCount(parent);
+ if (nc > 0)
+ {
+ int n = treeModel.getIndexOfChild(parent, node);
+ if (n == nc - 1)
+ lastChild = true;
+ }
+ }
+
+ LinkedList lpath = new LinkedList();
+ NodeRecord rp = this;
+ while (rp != null)
+ {
+ lpath.addFirst(rp.node);
+ if (rp.parent != null)
+ {
+ Object parent = rp.parent;
+ rp = (NodeRecord) nodes.get(parent);
+ // Add the root node, even if it is not visible.
+ if (rp == null)
+ lpath.addFirst(parent);
+ }
+ else
+ rp = null;
+ }
+ path = new GnuPath(lpath.toArray(), lastChild);
+ }
+ return path;
+ }
+
+ /**
+ * Get the rectangle bounds (compute, if required).
+ */
+ Rectangle getBounds()
+ {
+ // This method may be called in the context when the tree rectangle is
+ // not known. To work around this, it is assumed near infinitely large.
+ if (bounds==null)
+ bounds = getNodeDimensions(node, row, depth, isExpanded,
+ new Rectangle());
+ return bounds;
+ }
+ }
+
+ /**
+ * The set of all expanded tree nodes.
+ */
+ Set expanded = new HashSet();
+
+ /**
+ * Maps nodes to the row numbers.
+ */
+ Hashtable nodes = new Hashtable();
+
+ /**
+ * Maps row numbers to nodes.
+ */
+ Hashtable row2node = new Hashtable();
+
+ /**
+ * If true, the row map must be recomputed before using.
+ */
+ boolean dirty;
+
+ /**
+ * The cumulative height of all rows.
+ */
+ int totalHeight;
+
+ /**
+ * The maximal width.
+ */
+ int maximalWidth;
/**
- * setModel
- * @param value0 TODO
+ * Creates the unitialised instance. Before using the class, the row height
+ * must be set with the {@link #setRowHeight(int)} and the model must be set
+ * with {@link #setModel(TreeModel)}. The node dimensions may not be set.
*/
- public void setModel(TreeModel value0)
+ public VariableHeightLayoutCache()
{
- // TODO
+ // Nothing to do here.
}
/**
- * setRootVisible
- * @param value0 TODO
+ * Get the total number of rows in the tree. Every displayed node occupies the
+ * single row. The root node row is included if the root node is set as
+ * visible (false by default).
+ *
+ * @return int the number of the displayed rows.
*/
- public void setRootVisible(boolean value0)
+ public int getRowCount()
{
- // TODO
+ if (dirty) update();
+ return row2node.size();
}
-
+
/**
- * setNodeDimensions
- * @param value0 TODO
+ * Refresh the row map.
*/
- public void setNodeDimensions(NodeDimensions value0)
+ private final void update()
{
- // TODO
- }
-
+ nodes.clear();
+ row2node.clear();
+
+ totalHeight = maximalWidth = 0;
+
+ Object root = treeModel.getRoot();
+
+ if (rootVisible)
+ {
+ countRows(root, null, 0);
+ }
+ else
+ {
+ int sc = treeModel.getChildCount(root);
+ for (int i = 0; i < sc; i++)
+ {
+ Object child = treeModel.getChild(root, i);
+ countRows(child, root, 0);
+ }
+ }
+ dirty = false;
+ }
+
/**
- * setExpandedState
- * @param value0 TODO
- * @param value1 TODO
+ * Recursively counts all rows in the tree.
*/
- public void setExpandedState(TreePath value0, boolean value1)
+ private final void countRows(Object node, Object parent, int depth)
{
- // TODO
- }
+ Integer n = new Integer(row2node.size());
+ row2node.put(n, node);
+
+ NodeRecord nr = new NodeRecord(n.intValue(), depth, node, parent);
+ nodes.put(node, nr);
+
+ // For expanded nodes
+ if (expanded.contains(node))
+ {
+ int sc = treeModel.getChildCount(node);
+ int deeper = depth+1;
+ for (int i = 0; i < sc; i++)
+ {
+ Object child = treeModel.getChild(node, i);
+ countRows(child, node, deeper);
+ }
+ }
+ }
/**
- * getExpandedState
- * @param value0 TODO
- * @return boolean
+ * Discard the bound information for the given path.
+ *
+ * @param path the path, for that the bound information must be recomputed.
*/
- public boolean getExpandedState(TreePath value0)
+ public void invalidatePathBounds(TreePath path)
{
- return false; // TODO
+ NodeRecord r = (NodeRecord) nodes.get(path.getLastPathComponent());
+ if (r!=null)
+ r.bounds = null;
}
/**
- * getBounds
- * @param value0 TODO
- * @param value1 TODO
- * @return Rectangle
+ * Mark all cached information as invalid.
*/
- public Rectangle getBounds(TreePath value0, Rectangle value1)
+ public void invalidateSizes()
{
- return null; // TODO
+ dirty = true;
}
/**
- * getPathForRow
- * @param value0 TODO
- * @return TreePath
+ * Set the expanded state of the given path. The expansion states must be
+ * always updated when expanding and colapsing the tree nodes. Otherwise
+ * other methods will not work correctly after the nodes are collapsed or
+ * expanded.
+ *
+ * @param path the tree path, for that the state is being set.
+ * @param isExpanded the expanded state of the given path.
*/
- public TreePath getPathForRow(int value0)
+ public void setExpandedState(TreePath path, boolean isExpanded)
{
- return null; // TODO
- }
-
+ if (isExpanded)
+ expanded.add(path.getLastPathComponent());
+ else
+ expanded.remove(path.getLastPathComponent());
+
+ dirty = true;
+ }
+
/**
- * getRowForPath
- * @param value0 TODO
- * @return int
+ * Get the expanded state for the given tree path.
+ *
+ * @return true if the given path is expanded, false otherwise.
*/
- public int getRowForPath(TreePath value0)
+ public boolean isExpanded(TreePath path)
{
- return 0; // TODO
+ return expanded.contains(path.getLastPathComponent());
}
/**
- * getRowCount
- * @return int
+ * Get bounds for the given tree path.
+ *
+ * @param path the tree path
+ * @param rect the rectangle that will be reused to return the result.
+ * @return Rectangle the bounds of the last line, defined by the given path.
*/
- public int getRowCount()
+ public Rectangle getBounds(TreePath path, Rectangle rect)
{
- return 0; // TODO
+ if (path == null)
+ return null;
+ if (dirty)
+ update();
+ Object last = path.getLastPathComponent();
+ NodeRecord r = (NodeRecord) nodes.get(last);
+ if (r == null)
+ // This node is not visible.
+ {
+ rect.x = rect.y = rect.width = rect.height = 0;
+ }
+ else
+ {
+ if (r.bounds == null)
+ {
+ Rectangle dim = getNodeDimensions(last, r.row, r.depth,
+ r.isExpanded, rect);
+ r.bounds = dim;
+ }
+
+ rect.setRect(r.bounds);
+ }
+ return rect;
}
/**
- * invalidatePathBounds
- * @param value0 TODO
+ * Get the path, the last element of that is displayed in the given row.
+ *
+ * @param row the row
+ * @return TreePath the path
*/
- public void invalidatePathBounds(TreePath value0)
+ public TreePath getPathForRow(int row)
{
- // TODO
+ if (dirty)
+ update();
+ Object last = row2node.get(new Integer(row));
+ if (last == null)
+ return null;
+ else
+ {
+ NodeRecord r = (NodeRecord) nodes.get(last);
+ return r.getPath();
+ }
}
/**
- * getPreferredHeight
- * @return int
+ * Get the row, displaying the last node of the given path.
+ *
+ * @param path the path
+ * @return int the row number or -1 if the end of the path is not visible.
*/
- public int getPreferredHeight()
+ public int getRowForPath(TreePath path)
{
- return 0; // TODO
- }
+ if (path == null)
+ return -1;
+ if (dirty) update();
+
+ NodeRecord r = (NodeRecord) nodes.get(path.getLastPathComponent());
+ if (r == null)
+ return - 1;
+ else
+ return r.row;
+ }
/**
- * getPreferredWidth
- * @param value0 TODO
- * @return int
+ * Get the path, closest to the given point.
+ *
+ * @param x the point x coordinate
+ * @param y the point y coordinate
+ * @return the tree path, closest to the the given point
*/
- public int getPreferredWidth(Rectangle value0)
+ public TreePath getPathClosestTo(int x, int y)
{
- return 0; // TODO
+ if (dirty)
+ update();
+
+ // As the rows have arbitrary height, we need to iterate.
+ NodeRecord best = null;
+ NodeRecord r;
+ Enumeration en = nodes.elements();
+
+ int dist = Integer.MAX_VALUE;
+
+ while (en.hasMoreElements() && dist > 0)
+ {
+ r = (NodeRecord) en.nextElement();
+ if (best == null)
+ {
+ best = r;
+ dist = distance(r.getBounds(), x, y);
+ }
+ else
+ {
+ int rr = distance(r.getBounds(), x, y);
+ if (rr < dist)
+ {
+ best = r;
+ dist = rr;
+ }
+ }
+ }
+
+ if (best == null)
+ return null;
+ else
+ return best.getPath();
}
-
+
/**
- * getPathClosestTo
- * @param value0 TODO
- * @param value1 TODO
- * @return TreePath
+ * Get the closest distance from this point till the given rectangle. Only
+ * vertical distance is taken into consideration.
*/
- public TreePath getPathClosestTo(int value0, int value1)
+ int distance(Rectangle r, int x, int y)
{
- return null; // TODO
- }
+ if (y < r.y)
+ return r.y - y;
+ else if (y > r.y + r.height)
+ return y - (r.y + r.height);
+ else
+ return 0;
+ }
/**
- * getVisiblePathsFrom
- * @param value0 TODO
- * @return Enumeration
+ * Get the number of the visible childs for the given tree path. If the node
+ * is not expanded, 0 is returned. Otherwise, the number of children is
+ * obtained from the model as the number of children for the last path
+ * component.
+ *
+ * @param path the tree path
+ * @return int the number of the visible childs (for row).
*/
- public Enumeration getVisiblePathsFrom(TreePath value0)
+ public int getVisibleChildCount(TreePath path)
{
- return null; // TODO
+ if (isExpanded(path))
+ return 0;
+ else
+ return treeModel.getChildCount(path.getLastPathComponent());
}
/**
- * getVisibleChildCount
- * @param value0 TODO
- * @return int
+ * Get the enumeration over all visible pathes that start from the given
+ * parent path.
+ *
+ * @param parentPath the parent path
+ * @return the enumeration over pathes
*/
- public int getVisibleChildCount(TreePath value0)
+ public Enumeration getVisiblePathsFrom(TreePath parentPath)
{
- return 0; // TODO
- }
+ if (dirty)
+ update();
+ Vector p = new Vector(parentPath.getPathCount());
+ Object node;
+ NodeRecord nr;
+
+ for (int i = 0; i < parentPath.getPathCount(); i++)
+ {
+ node = parentPath.getPathComponent(i);
+ nr = (NodeRecord) nodes.get(node);
+ if (nr.row >= 0)
+ p.add(node);
+ }
+ return p.elements();
+ }
/**
- * invalidateSizes
+ * Return the expansion state of the given tree path. The expansion state
+ * must be previously set with the
+ * {@link #setExpandedState(TreePath, boolean)}
+ *
+ * @param path the path being checked
+ * @return true if the last node of the path is expanded, false otherwise.
*/
- public void invalidateSizes()
+ public boolean getExpandedState(TreePath path)
{
- // TODO
+ return expanded.contains(path.getLastPathComponent());
}
/**
- * isExpanded
- * @param value0 TODO
- * @return boolean
+ * The listener method, called when the tree nodes are changed.
+ *
+ * @param event the change event
*/
- public boolean isExpanded(TreePath value0)
+ public void treeNodesChanged(TreeModelEvent event)
{
- return false; // TODO
+ dirty = true;
}
/**
- * treeNodesChanged
- * @param value0 TODO
+ * The listener method, called when the tree nodes are inserted.
+ *
+ * @param event the change event
*/
- public void treeNodesChanged(TreeModelEvent value0)
+ public void treeNodesInserted(TreeModelEvent event)
{
- // TODO
+ dirty = true;
}
/**
- * treeNodesInserted
- * @param value0 TODO
+ * The listener method, called when the tree nodes are removed.
+ *
+ * @param event the change event
*/
- public void treeNodesInserted(TreeModelEvent value0)
+ public void treeNodesRemoved(TreeModelEvent event)
{
- // TODO
+ dirty = true;
}
/**
- * treeNodesRemoved
- * @param value0 TODO
+ * Called when the tree structure has been changed.
+ *
+ * @param event the change event
*/
- public void treeNodesRemoved(TreeModelEvent value0)
+ public void treeStructureChanged(TreeModelEvent event)
{
- // TODO
+ dirty = true;
}
+
+ /**
+ * Set the tree model that will provide the data.
+ */
+ public void setModel(TreeModel newModel)
+ {
+ treeModel = newModel;
+ // The root node is expanded by default.
+ expanded.add(treeModel.getRoot());
+ dirty = true;
+ }
+
+ /**
+ * Inform the instance if the tree root node is visible. If this method
+ * is not called, it is assumed that the tree root node is not visible.
+ *
+ * @param visible true if the tree root node is visible, false
+ * otherwise.
+ */
+ public void setRootVisible(boolean visible)
+ {
+ rootVisible = visible;
+ dirty = true;
+ }
/**
- * treeStructureChanged
- * @param value0 TODO
+ * Get the sum of heights for all rows.
*/
- public void treeStructureChanged(TreeModelEvent value0)
+ public int getPreferredHeight()
{
- // TODO
- }
+ if (dirty)
+ update();
+ totalHeight = 0;
+ Enumeration en = nodes.elements();
+ while (en.hasMoreElements())
+ {
+ NodeRecord nr = (NodeRecord) en.nextElement();
+ Rectangle r = nr.getBounds();
+ totalHeight += r.height;
+ }
+ return totalHeight;
+ }
+ /**
+ * Get the maximal width.
+ */
+ public int getPreferredWidth(Rectangle value)
+ {
+ if (dirty)
+ update();
+
+ maximalWidth = 0;
+ Enumeration en = nodes.elements();
+ while (en.hasMoreElements())
+ {
+ NodeRecord nr = (NodeRecord) en.nextElement();
+ Rectangle r = nr.getBounds();
+ if (r.x + r.width > maximalWidth)
+ maximalWidth = r.x + r.width;
+ }
+ return maximalWidth;
+ }
}
diff --git a/javax/xml/XMLConstants.java b/javax/xml/XMLConstants.java
index 735620755..0d4a65ff9 100644
--- a/javax/xml/XMLConstants.java
+++ b/javax/xml/XMLConstants.java
@@ -1,5 +1,5 @@
/* XMLConstants.java --
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,10 +41,15 @@ package javax.xml;
* Repository for well-known XML constants.
*
* @author (a href='mailto:dog@gnu.org'>Chris Burdess</a)
- * @since 1.3
+ * @since 1.5
*/
public final class XMLConstants
{
+
+ private XMLConstants()
+ {
+ // to prevent instantiation
+ }
/**
* Dummy namespace URI indicating that there is no namespace.
diff --git a/javax/xml/datatype/DatatypeConstants.java b/javax/xml/datatype/DatatypeConstants.java
index 3919d03da..6098e084b 100644
--- a/javax/xml/datatype/DatatypeConstants.java
+++ b/javax/xml/datatype/DatatypeConstants.java
@@ -1,5 +1,5 @@
/* DatatypeConstants.java --
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -43,11 +43,16 @@ import javax.xml.namespace.QName;
* Basic data type constants.
*
* @author (a href='mailto:dog@gnu.org'>Chris Burdess</a)
- * @since 1.3
+ * @since 1.5
*/
public final class DatatypeConstants
{
+ private DatatypeConstants()
+ {
+ // to prevent instantiation
+ }
+
/**
* Typesafe enumerated class representing the six fields of the
* <a href='Duration.html'>Duration</a> class.
diff --git a/javax/xml/datatype/DatatypeFactory.java b/javax/xml/datatype/DatatypeFactory.java
index 98a5690e8..14f507416 100644
--- a/javax/xml/datatype/DatatypeFactory.java
+++ b/javax/xml/datatype/DatatypeFactory.java
@@ -1,5 +1,5 @@
/* DatatypeFactory.java --
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,16 +37,24 @@ exception statement from your version. */
package javax.xml.datatype;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.GregorianCalendar;
+import java.util.Iterator;
+import java.util.Properties;
+import gnu.classpath.ServiceFactory;
/**
* Factory class to create new datatype objects mapping XML to and from Java
* objects.
*
- * @author (a href='mailto:dog@gnu.org'>Chris Burdess</a)
- * @since 1.3
+ * @author Chris Burdess
+ * @since 1.5
*/
public abstract class DatatypeFactory
{
@@ -59,7 +67,7 @@ public abstract class DatatypeFactory
/**
* JAXP 1.3 default implementation class name.
*/
- public static final java.lang.String DATATYPEFACTORY_IMPLEMENTATION_CLASS = "gnu.xml.datatype.JAXPDatatypeFactory";
+ public static final String DATATYPEFACTORY_IMPLEMENTATION_CLASS = "gnu.xml.datatype.JAXPDatatypeFactory";
protected DatatypeFactory()
{
@@ -73,12 +81,35 @@ public abstract class DatatypeFactory
{
try
{
+ // 1. system property
+ String className = System.getProperty(DATATYPEFACTORY_PROPERTY);
+ if (className != null)
+ return (DatatypeFactory) Class.forName(className).newInstance();
+ // 2. jaxp.properties property
+ File javaHome = new File(System.getProperty("java.home"));
+ File javaHomeLib = new File(javaHome, "lib");
+ File jaxpProperties = new File(javaHomeLib, "jaxp.properties");
+ if (jaxpProperties.exists())
+ {
+ FileInputStream in = new FileInputStream(jaxpProperties);
+ Properties p = new Properties();
+ p.load(in);
+ in.close();
+ className = p.getProperty(DATATYPEFACTORY_PROPERTY);
+ if (className != null)
+ return (DatatypeFactory) Class.forName(className).newInstance();
+ }
+ // 3. services
+ Iterator i = ServiceFactory.lookupProviders(DatatypeFactory.class);
+ if (i.hasNext())
+ return (DatatypeFactory) i.next();
+ // 4. fallback
Class t = Class.forName(DATATYPEFACTORY_IMPLEMENTATION_CLASS);
return (DatatypeFactory) t.newInstance();
}
catch (Exception e)
{
- throw new DatatypeConfigurationException (e);
+ throw new DatatypeConfigurationException(e);
}
}
@@ -172,7 +203,7 @@ public abstract class DatatypeFactory
BigInteger days,
BigInteger hours,
BigInteger minutes,
- BigDecimal seconds)
+ BigInteger seconds)
{
return newDuration(isPositive,
null,
@@ -180,7 +211,7 @@ public abstract class DatatypeFactory
days,
hours,
minutes,
- seconds);
+ new BigDecimal(seconds));
}
/**
diff --git a/javax/xml/datatype/Duration.java b/javax/xml/datatype/Duration.java
index fb1d65537..96390fde4 100644
--- a/javax/xml/datatype/Duration.java
+++ b/javax/xml/datatype/Duration.java
@@ -1,5 +1,5 @@
/* Duration.java --
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,7 @@ import javax.xml.namespace.QName;
* An immutable time space as specified in XML Schema 1.0.
*
* @author (a href='mailto:dog@gnu.org'>Chris Burdess</a)
- * @since 1.3
+ * @since 1.5
*/
public abstract class Duration
{
@@ -240,11 +240,7 @@ public abstract class Duration
/**
* Returns the result of multiplying this duration by the given factor.
*/
- public Duration multiply(BigDecimal factor)
- {
- // TODO
- throw new UnsupportedOperationException();
- }
+ public abstract Duration multiply(BigDecimal factor);
/**
* Returns the unary negative of this duration.
diff --git a/javax/xml/validation/SchemaFactory.java b/javax/xml/validation/SchemaFactory.java
index f33c1c629..0042ea323 100644
--- a/javax/xml/validation/SchemaFactory.java
+++ b/javax/xml/validation/SchemaFactory.java
@@ -1,5 +1,5 @@
/* SchemaFactory.java --
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -52,13 +52,10 @@ import org.xml.sax.SAXNotSupportedException;
* Factory for obtaining schemata.
*
* @author Chris Burdess (dog@gnu.org)
- * @since 1.3
+ * @since 1.5
*/
public abstract class SchemaFactory
{
-
- ErrorHandler errorHandler;
-
protected SchemaFactory()
{
}
@@ -109,15 +106,9 @@ public abstract class SchemaFactory
throw new SAXNotRecognizedException(name);
}
- public ErrorHandler getErrorHandler()
- {
- return errorHandler;
- }
+ public abstract ErrorHandler getErrorHandler();
- public void setErrorHandler(ErrorHandler errorHandler)
- {
- this.errorHandler = errorHandler;
- }
+ public abstract void setErrorHandler(ErrorHandler errorHandler);
public abstract LSResourceResolver getResourceResolver();
diff --git a/javax/xml/validation/SchemaFactoryLoader.java b/javax/xml/validation/SchemaFactoryLoader.java
new file mode 100644
index 000000000..dc80a33cc
--- /dev/null
+++ b/javax/xml/validation/SchemaFactoryLoader.java
@@ -0,0 +1,52 @@
+/* SchemaFactory.java --
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package javax.xml.validation;
+
+/**
+ * API compatibility class. Do not use.
+ */
+public abstract class SchemaFactoryLoader
+{
+
+ protected SchemaFactoryLoader()
+ {
+ }
+
+ public abstract SchemaFactory newFactory(String schemaLanguage);
+
+}
diff --git a/javax/xml/xpath/XPathConstants.java b/javax/xml/xpath/XPathConstants.java
index 3b2d5d2d9..fbfb99981 100644
--- a/javax/xml/xpath/XPathConstants.java
+++ b/javax/xml/xpath/XPathConstants.java
@@ -1,5 +1,5 @@
/* XPathConstants.java --
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -43,10 +43,14 @@ import javax.xml.namespace.QName;
* XPath constants.
*
* @author (a href='mailto:dog@gnu.org'>Chris Burdess</a)
- * @since 1.3
+ * @since 1.5
*/
public class XPathConstants
{
+ private XPathConstants()
+ {
+ // to prevent instantiation
+ }
/**
* The XPath 1.0 number data type.
diff --git a/lib/.cvsignore b/lib/.cvsignore
index 692dbbcc0..ae29f7417 100644
--- a/lib/.cvsignore
+++ b/lib/.cvsignore
@@ -32,3 +32,4 @@ META-INF
Makefile.deps
lists
copy-vmresources.sh
+classes.2
diff --git a/lib/Makefile.am b/lib/Makefile.am
index e2c495714..db826d637 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -5,8 +5,8 @@ JAVA_DEPEND = java.dep
## this file and restart the make process again
sinclude $(JAVA_DEPEND)
-propertydirs := $(shell cd $(top_srcdir)/resource && $(FIND) gnu java org META-INF -type d ! -name CVS -print)
-propertyfiles := $(shell cd $(top_srcdir)/resource && $(FIND) gnu java org -name \*\.properties -print)
+propertydirs := $(shell cd $(top_srcdir)/resource && $(FIND) gnu java javax org META-INF -type d ! -name CVS -print)
+propertyfiles := $(shell cd $(top_srcdir)/resource && $(FIND) gnu java javax org -name \*\.properties -print)
metafiles := $(shell cd $(top_srcdir)/resource && $(FIND) META-INF -name CVS -prune -o -type f -print)
iconfiles := $(shell cd $(top_srcdir) && $(FIND) gnu/javax/swing/plaf/gtk/icons -name *.png -type f -print)
@@ -87,10 +87,19 @@ endif # INSTALL_CLASS_FILES
.PHONY: genclasses
+if USE_PREBUILT_GLIBJ_ZIP
+
+glibj.zip:
+ cp $(PATH_TO_GLIBJ_ZIP) .
+
+else
+
glibj.zip: classes compile-classes resources
if test "$(ZIP)" != ""; then $(ZIP) -r -D glibj.zip gnu java javax org META-INF > /dev/null; fi
if test "$(FASTJAR)" != ""; then $(FASTJAR) cf glibj.zip gnu java javax org META-INF; fi
+endif # USE_PREBUILT_GLIBJ_ZIP
+
resources: copy-vmresources.sh
if ! [ -e gnu ]; then mkdir gnu; fi
if ! [ -e gnu/java ]; then mkdir gnu/java; fi
@@ -113,11 +122,11 @@ resources: copy-vmresources.sh
classes: genclasses
-$(top_builddir)/java/util/LocaleData.java: $(top_srcdir)/scripts/generate-locale-list.sh
- mkdir -p $(top_builddir)/java/util
- $(top_srcdir)/scripts/generate-locale-list.sh > $(top_builddir)/java/util/LocaleData.java
+$(top_builddir)/gnu/java/locale/LocaleData.java: $(top_srcdir)/scripts/generate-locale-list.sh
+ mkdir -p $(top_builddir)/gnu/java/locale
+ $(top_srcdir)/scripts/generate-locale-list.sh > $(top_builddir)/gnu/java/locale/LocaleData.java
-genclasses: gen-classlist.sh standard.omit $(top_builddir)/java/util/LocaleData.java gen-xpath-parser
+genclasses: gen-classlist.sh standard.omit $(top_builddir)/gnu/java/locale/LocaleData.java gen-xpath-parser
top_builddir=$(top_builddir) top_srcdir=$(top_srcdir) $(SHELL) ./gen-classlist.sh standard
# Only rebuild parsers when explicitly asked to.
@@ -147,6 +156,7 @@ compile-classes: classes $(JAVA_SRCS) Makefile
GCJ='$(GCJ)' \
compile_classpath='$(top_builddir):$(compile_classpath)' \
top_srcdir=$(top_srcdir)
+ touch compile-classes
else
compile-classes: classes $(JAVA_SRCS) Makefile
$(JAVAC)
@@ -155,8 +165,8 @@ endif
EXTRA_DIST = standard.omit mkcollections.pl.in Makefile.gcj split-for-gcj.sh
CLEANFILES = compile-classes resources classes \
- glibj.zip classes.1 \
- $(top_builddir)/java/util/LocaleData.java \
+ glibj.zip classes.1 classes.2 \
+ $(top_builddir)/gnu/java/locale/LocaleData.java \
$(JAVA_DEPEND)
clean-local:
@@ -177,4 +187,4 @@ dist-hook:
$(FIND) $(distdir)/../gnu $(distdir)/../java $(distdir)/../javax $(distdir)/../org $(distdir)/../vm $(distdir)/../resource -name .cvsignore -print | xargs rm -f
$(FIND) $(distdir)/../gnu $(distdir)/../java $(distdir)/../javax $(distdir)/../org $(distdir)/../vm -name class-dependencies.conf -print | xargs rm -f
rm -f $(distdir)/../gnu/classpath/Configuration.java
- rm -f $(distdir)/../java/util/LocaleData.java
+ rm -f $(distdir)/../gnu/java/locale/LocaleData.java
diff --git a/lib/gen-classlist.sh.in b/lib/gen-classlist.sh.in
index 4c3a836eb..5f7055ffd 100755
--- a/lib/gen-classlist.sh.in
+++ b/lib/gen-classlist.sh.in
@@ -7,16 +7,34 @@
LC_ALL=C; export LC_ALL
LANG=C; export LANG
-# We use this to decide whether we need to invoke the split script.
-GCJ="@GCJ@"
-
echo "Adding java source files from srcdir '@top_srcdir@'."
-@FIND@ @top_srcdir@/java @top_srcdir@/javax @top_srcdir@/gnu \
- @top_srcdir@/org \
- @top_srcdir@/external/w3c_dom @top_srcdir@/external/sax \
- @top_srcdir@/external/relaxngDatatype \
- -follow -type f -print | sort -r | grep '\.java$' \
- > ${top_builddir}/lib/classes.1
+# We construct 'classes.1' as a series of lines. Each line
+# has three fields, which are separated by spaces. The first
+# field is the package of this class (separated by "/"s).
+# The second field is the name of the top-level directory for
+# this file, relative to the build directory. E.g., it might
+# look like "../../classpath/vm/reference".
+# The third field is the file name, like "java/lang/Object.java".
+# We do this because it makes splitting for the gcj build much
+# cheaper.
+(cd @top_srcdir@
+ @FIND@ java javax gnu org -follow -name '*.java' -print |
+ sort -r | sed -e 's,/\([^/]*\)$, \1,' |
+ while read pkg file; do
+ echo $pkg @top_srcdir@ $pkg/$file
+ done) > ${top_builddir}/lib/classes.1
+
+# The same, but for the external code.
+# Right now all external code is in org/.
+for dir in @top_srcdir@/external/w3c_dom \
+ @top_srcdir@/external/sax @top_srcdir@/external/relaxngDatatype; do
+ (cd $dir
+ @FIND@ org -follow -name '*.java' -print |
+ sort -r | sed -e 's,/\([^/]*\)$, \1,' |
+ while read pkg file; do
+ echo $pkg $dir $pkg/$file
+ done)
+done >> ${top_builddir}/lib/classes.1
# Generate files for the VM classes.
: > vm.omit
@@ -29,18 +47,22 @@ for dir in $vm_dirlist; do
if test -d $subdir; then
@FIND@ $subdir -name '*.java' -print
fi
- done) |
- while read f; do
- echo $dir/$f >> vm.add
- echo $f >> vm.omit
+ done) | sed -e 's,/\([^/]*\)$, \1,' |
+ while read pkg file; do
+ echo $pkg $dir $pkg/$file >> vm.add
+ echo $pkg/$file >> vm.omit
done
done
# Only include generated files once.
if test ! "${top_builddir}" -ef "@top_srcdir@"; then
echo "Adding generated files in builddir '${top_builddir}'."
- @FIND@ ${top_builddir}/gnu ${top_builddir}/java -follow -type f -print \
- | sort | grep '\.java$' >> ${top_builddir}/lib/classes.1
+ # Currently the only generated files are in gnu.*.
+ (cd ${top_builddir}; @FIND@ gnu -follow -name '*.java' -print) |
+ sort | sed -e 's,/\([^/]*\)$, \1,' |
+ while read pkg file; do
+ echo $pkg $top_builddir $pkg/$file
+ done >> ${top_builddir}/lib/classes.1
fi
@@ -51,9 +73,10 @@ for dir in $vm_dirlist; do
fi
done
+# FIXME: could be more efficient by constructing a series of greps.
for filexp in `cat tmp.omit`; do
- grep -v ${filexp} < ${top_builddir}/lib/classes.1 > ${top_builddir}/lib/classes.2
- mv ${top_builddir}/lib/classes.2 ${top_builddir}/lib/classes.1
+ grep -v ${filexp} < ${top_builddir}/lib/classes.1 > ${top_builddir}/lib/classes.tmp
+ mv ${top_builddir}/lib/classes.tmp ${top_builddir}/lib/classes.1
done
@@ -72,18 +95,20 @@ rm vm.add
rm tmp.omit
new=
-if test -e ${top_builddir}/lib/classes; then
- p=`diff ${top_builddir}/lib/classes ${top_builddir}/lib/classes.1`
+if test -e ${top_builddir}/lib/classes.2; then
+ p=`diff ${top_builddir}/lib/classes.2 ${top_builddir}/lib/classes.1`
if test "$p" != ""; then
new="true"
- cp ${top_builddir}/lib/classes.1 ${top_builddir}/lib/classes
fi
else
new="true"
- cp ${top_builddir}/lib/classes.1 ${top_builddir}/lib/classes
fi
if test "$new" = "true"; then
+ cp ${top_builddir}/lib/classes.1 ${top_builddir}/lib/classes.2
+ # Strip the package part.
+ sed -e 's/^[^ ]* //' -e 's, ,/,' < ${top_builddir}/lib/classes.1 \
+ > ${top_builddir}/lib/classes
echo "JAVA_SRCS = \\" > ${top_builddir}/lib/java.dep
for i in `cat ${top_builddir}/lib/classes` ; do
echo $i "\\" >> ${top_builddir}/lib/java.dep
diff --git a/lib/split-for-gcj.sh b/lib/split-for-gcj.sh
index f69b79797..4130d5664 100755
--- a/lib/split-for-gcj.sh
+++ b/lib/split-for-gcj.sh
@@ -22,22 +22,24 @@
# java/awt/BitwiseXORComposite.class: lists/java-awt.stamp
# lists/java-awt.list: /home/aph/gcc/gcc/libjava/classpath/gnu/java/awt/BitwiseXORComposite.java
-# This uses a somewhat hacky procedure for finding the package of a
-# given file.
-
echo "Splitting for gcj"
rm -f Makefile.dtmp > /dev/null 2>&1
test -d lists || mkdir lists
-for dir in java javax gnu org; do
- fgrep /$dir/ classes | while read file; do
- pkg=`echo "$file " | sed -n -e "s,^.*/\($dir/.*\)/[^/]*$,\1,p"`
- list=lists/`echo $pkg | sed -e 's,/,-,g' | cut -f1-3 -d-`
- echo "$file" >> ${list}.list.1
- f2=`echo "$file" | sed -n -e "s,^.*/\($dir/.*\)$,\1,p"`
- f2=`echo "$f2" | sed -e 's/.java$//'`.class
- echo "$f2: ${list}.stamp" >> Makefile.dtmp
- echo "${list}.list: $file" >> Makefile.dtmp
- done
+# Much more efficient to do processing outside the loop...
+# The first expression computes the .class file name.
+# We only want the first three package components, and
+# we want them separated by '-'; this is the remaining expressions.
+sed -e 's, \(.*\)[.]java$, \1.java \1.class,' \
+ -e 's,^\([^/ ]*\)/\([^/ ]*\) ,\1-\2 ,' \
+ -e 's,^\([^/ ]*\)/\([^/ ]*\)/\([^/ ]*\) ,\1-\2-\3 ,' \
+ -e 's,^\([^/ ]*\)/\([^/ ]*\)/\([^/ ]*\)/[^ ]* ,\1-\2-\3 ,' \
+ classes.2 |
+while read pkg dir file f2; do
+ list=lists/$pkg
+ echo "$dir/$file" >> ${list}.list.1
+
+ echo "$f2: ${list}.stamp" >> Makefile.dtmp
+ echo "${list}.list: $dir/$file" >> Makefile.dtmp
done
# Only update a .list file if it changed.
diff --git a/m4/acinclude.m4 b/m4/acinclude.m4
index 1c5f9c70f..30ae333b5 100644
--- a/m4/acinclude.m4
+++ b/m4/acinclude.m4
@@ -24,9 +24,7 @@ AC_DEFUN([CLASSPATH_FIND_JAVAC],
AM_CONDITIONAL(FOUND_GCJX, test "x${user_specified_javac}" = xgcjx)
if test "x${GCJ}" = x && test "x${JIKES}" = x && test "x${user_specified_javac}" != xkjc && test "x${user_specified_javac}" != xgcjx && test "x${user_specified_javac}" != xecj; then
- # FIXME: use autoconf error function
- echo "configure: cannot find javac, try --with-gcj, --with-jikes, --with-kjc, --with-ecj, or --with-gcjx" 1>&2
- exit 1
+ AC_MSG_ERROR([cannot find javac, try --with-gcj, --with-jikes, --with-kjc, --with-ecj, or --with-gcjx])
fi
])
diff --git a/native/fdlibm/Makefile.am b/native/fdlibm/Makefile.am
index 64b3b3936..09d868106 100644
--- a/native/fdlibm/Makefile.am
+++ b/native/fdlibm/Makefile.am
@@ -58,7 +58,7 @@ libfdlibm_la_SOURCES = \
w_sqrt.c \
namespace.h
-AM_LDFLAGS = @CLASSPATH_MODULE@
+AM_LDFLAGS = @CLASSPATH_CONVENIENCE@
# We just want the standard flags for fdlibm since it is an upstream lib
# and our normal -pedantic -Wall -Werror breaks this lib. So no AM_CFLAGS.
diff --git a/native/fdlibm/fdlibm.h b/native/fdlibm/fdlibm.h
index 5dbcdb523..bf9f56991 100644
--- a/native/fdlibm/fdlibm.h
+++ b/native/fdlibm/fdlibm.h
@@ -158,7 +158,7 @@ extern double erfc __P((double));
extern double gamma __P((double));
extern double hypot __P((double, double));
-#if !defined(isnan) && !defined(HAVE_ISNAN)
+#if !defined(isnan)
#define isnan(x) ((x) != (x))
#endif
diff --git a/native/fdlibm/ieeefp.h b/native/fdlibm/ieeefp.h
index 1dda99b32..1a9740f66 100644
--- a/native/fdlibm/ieeefp.h
+++ b/native/fdlibm/ieeefp.h
@@ -123,7 +123,7 @@
#define __IEEE_LITTLE_ENDIAN
#endif
-#if defined (__PPC__) || defined (__ppc__) || defined (__powerpc__) || defined (__ppc64__)
+#if defined (__PPC__) || defined (__ppc__) || defined (__powerpc__) || defined (__ppc64__) || defined (_POWER) || defined (_IBMR2)
#if (defined(_BIG_ENDIAN) && _BIG_ENDIAN) || (defined(_AIX) && _AIX) || defined (__BIG_ENDIAN__)|| defined (__APPLE__)
#define __IEEE_BIG_ENDIAN
#else
diff --git a/native/jni/classpath/Makefile.am b/native/jni/classpath/Makefile.am
index a26ab832b..d996df636 100644
--- a/native/jni/classpath/Makefile.am
+++ b/native/jni/classpath/Makefile.am
@@ -7,6 +7,6 @@ libclasspath_la_SOURCES = jcl.c jcl.h \
jnilink.c jnilink.h \
native_state.c native_state.h
-AM_LDFLAGS = @CLASSPATH_MODULE@
+AM_LDFLAGS = @CLASSPATH_CONVENIENCE@
AM_CPPFLAGS = @CLASSPATH_INCLUDES@
AM_CFLAGS = @WARNING_CFLAGS@ @STRICT_WARNING_CFLAGS@ @ERROR_CFLAGS@
diff --git a/native/jni/classpath/jcl.c b/native/jni/classpath/jcl.c
index dd6ca06a7..e28c6631b 100644
--- a/native/jni/classpath/jcl.c
+++ b/native/jni/classpath/jcl.c
@@ -68,9 +68,9 @@ JCL_ThrowException (JNIEnv * env, const char *className, const char *errMsg)
if (errExcClass == NULL)
{
fprintf (stderr, "JCL: Utterly failed to throw exeption ");
- fprintf (stderr, className);
+ fprintf (stderr, "%s", className);
fprintf (stderr, " with message ");
- fprintf (stderr, errMsg);
+ fprintf (stderr, "%s", errMsg);
return;
}
}
diff --git a/native/jni/classpath/jcl.h b/native/jni/classpath/jcl.h
index 25662c06b..514b78262 100644
--- a/native/jni/classpath/jcl.h
+++ b/native/jni/classpath/jcl.h
@@ -71,9 +71,20 @@ JNIEXPORT void * JNICALL JCL_GetRawData (JNIEnv * env, jobject rawdata);
/* Simple debug macro */
#ifdef DEBUG
-#define DBG(x) fprintf(stderr, (x));
+#define DBG(x) fprintf(stderr, "%s", (x));
#else
#define DBG(x)
#endif
+/* Some O/S's don't declare 'environ' */
+#if HAVE_CRT_EXTERNS_H
+/* Darwin does not have a variable named environ
+ but has a function which you can get the environ
+ variable with. */
+#include <crt_externs.h>
+#define environ (*_NSGetEnviron())
+#else
+extern char **environ;
+#endif /* HAVE_CRT_EXTERNS_H */
+
#endif
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
index 8910bf3ec..0726fb531 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
@@ -217,10 +217,10 @@ Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector
}
(*env)->ReleaseStringUTFChars (env, chars, str);
-
+
for (i = g_list_first (items); i != NULL; i = g_list_next (i))
- g_free (i->data);
-
+ pango_item_free(i->data);
+
g_list_free (items);
gdk_threads_leave ();
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
index d23d7edc6..29bc1855b 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
@@ -160,7 +160,8 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_nativeCopyState
else /* GDK_IS_WINDOW (g->drawable) */
g_object_ref (g->drawable);
- g_object_ref (g->cm);
+ if (g->cm != NULL)
+ g_object_ref (g->cm);
NSA_SET_G_PTR (env, obj, g);
@@ -181,7 +182,9 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__II
g->drawable = (GdkDrawable *) gdk_pixmap_new (NULL, width, height,
gdk_rgb_get_visual ()->depth);
g->cm = gdk_rgb_get_colormap ();
- g_object_ref (g->cm);
+
+ if (g->cm != NULL)
+ g_object_ref (g->cm);
g->gc = gdk_gc_new (g->drawable);
NSA_SET_G_PTR (env, obj, g);
@@ -208,7 +211,9 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_initFromImage
g->drawable = (GdkDrawable *)pixmap;
g->cm = gdk_drawable_get_colormap (g->drawable);
- g_object_ref (g->cm);
+
+ if (g->cm != NULL)
+ g_object_ref (g->cm);
g->gc = gdk_gc_new (g->drawable);
NSA_SET_G_PTR (env, obj, g);
@@ -235,7 +240,10 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_initStateUnlocked
g_object_ref (g->drawable);
g->cm = gtk_widget_get_colormap (widget);
- g_object_ref (g->cm);
+
+ if (g->cm != NULL)
+ g_object_ref (g->cm);
+
g->gc = gdk_gc_new (g->drawable);
gdk_gc_copy (g->gc, widget->style->fg_gc[GTK_STATE_NORMAL]);
color = widget->style->fg[GTK_STATE_NORMAL];
@@ -293,15 +301,17 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_nativeDispose
}
XFlush (GDK_DISPLAY ());
-
- g_object_unref (g->gc);
+
+ if (g->gc != NULL)
+ g_object_unref (g->gc);
if (GDK_STABLE_IS_PIXMAP (g->drawable))
g_object_unref (g->drawable);
- else /* GDK_IS_WINDOW (g->drawable) */
+ else if (g->drawable != NULL)
g_object_unref (g->drawable);
- g_object_unref (g->cm);
+ if (g->cm != NULL)
+ g_object_unref (g->cm);
g_free (g);
@@ -495,7 +505,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_clearRect
else
{
gdk_gc_get_values (g->gc, &saved);
- gdk_gc_set_foreground (g->gc, &(saved.background));
+ gdk_gc_set_background (g->gc, &(saved.background));
gdk_draw_rectangle (g->drawable, g->gc, TRUE,
x + g->x_offset, y + g->y_offset, width, height);
gdk_gc_set_foreground (g->gc, &(saved.foreground));
@@ -536,10 +546,12 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics_setFGColor
color.blue = blue << 8;
g = (struct graphics *) NSA_GET_G_PTR (env, obj);
-
- gdk_colormap_alloc_color (g->cm, &color, TRUE, TRUE);
+
+ if (g->cm != NULL)
+ gdk_colormap_alloc_color (g->cm, &color, TRUE, TRUE);
+
gdk_gc_set_foreground (g->gc, &color);
-
+
gdk_threads_leave ();
}
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
index 4d6169b85..eba00fb68 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
@@ -1,5 +1,5 @@
/* gdkpixbufdecoder.c
- Copyright (C) 1999, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -191,8 +191,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initState
GdkPixbufLoader *loader = NULL;
jobject *decoder = NULL;
- gdk_threads_enter ();
-
decoder = (jobject *) g_malloc (sizeof (jobject));
g_assert (decoder != NULL);
*decoder = (*env)->NewGlobalRef (env, obj);
@@ -204,8 +202,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initState
g_signal_connect (loader, "closed", G_CALLBACK (closed_cb), decoder);
NSA_SET_PB_PTR (env, obj, loader);
-
- gdk_threads_leave ();
}
static void
@@ -317,8 +313,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_finish
{
GdkPixbufLoader *loader = NULL;
- gdk_threads_enter ();
-
loader = (GdkPixbufLoader *)NSA_DEL_PB_PTR (env, obj);
if (loader == NULL)
return;
@@ -326,8 +320,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_finish
if (needs_close)
gdk_pixbuf_loader_close (loader, NULL);
g_object_unref (loader);
-
- gdk_threads_leave ();
}
JNIEXPORT void JNICALL
@@ -337,8 +329,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpDone
GError *err = NULL;
GdkPixbufLoader *loader = NULL;
- gdk_threads_enter ();
-
loader = (GdkPixbufLoader *)NSA_GET_PB_PTR (env, obj);
g_assert (loader != NULL);
@@ -349,8 +339,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpDone
JCL_ThrowException (env, "java/io/IOException", err->message);
g_error_free (err);
}
-
- gdk_threads_leave ();
}
struct stream_save_request
@@ -370,6 +358,9 @@ save_to_stream(const gchar *buf,
jbyteArray jbuf;
jbyte *cbuf;
+ /* FIXME. Don't call user code directly on this thread.
+ Store bytes and signal a "pump" thread to deliver to user code.
+ Then we don't have to drop/acquire any locks. */
gdk_threads_leave ();
jbuf = (*(ssr->env))->NewByteArray ((ssr->env), count);
@@ -400,8 +391,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage
int i;
struct stream_save_request ssr;
- gdk_threads_enter ();
-
ssr.stream = &stream;
ssr.env = env;
@@ -465,8 +454,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage
(*env)->ReleaseStringUTFChars (env, jenctype, enctype);
(*env)->ReleaseIntArrayElements (env, jarr, ints, 0);
-
- gdk_threads_leave ();
}
@@ -478,8 +465,6 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpBytes
jbyte *bytes = NULL;
GError *err = NULL;
- gdk_threads_enter ();
-
g_assert (len >= 1);
g_assert (jarr != NULL);
@@ -497,6 +482,4 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpBytes
JCL_ThrowException (env, "java/io/IOException", err->message);
g_error_free (err);
}
-
- gdk_threads_leave ();
}
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
index ef9ac1207..f44361972 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
@@ -56,3 +56,17 @@ Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_create
gdk_threads_leave ();
}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_realize (JNIEnv *env, jobject obj)
+{
+ void *ptr;
+
+ gdk_threads_enter ();
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ gtk_widget_realize (GTK_WIDGET (ptr));
+
+ gdk_threads_leave ();
+}
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
index 6839f684b..b0d4ab9b0 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
@@ -1,5 +1,5 @@
/* gtkcomponentpeer.c -- Native implementation of GtkComponentPeer
- Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -67,6 +67,9 @@ exception statement from your version. */
#define AWT_MOUSE_ENTERED 504
#define AWT_MOUSE_EXITED 505
#define AWT_MOUSE_DRAGGED 506
+#define AWT_MOUSE_WHEEL 507
+
+#define AWT_WHEEL_UNIT_SCROLL 0
#define AWT_FOCUS_GAINED 1004
#define AWT_FOCUS_LOST 1005
@@ -76,7 +79,7 @@ static GtkWidget *find_bg_color_widget (GtkWidget *widget);
static GtkWidget *get_widget (GtkWidget *widget);
static jmethodID postMouseEventID;
-static jmethodID setCursorID;
+static jmethodID postMouseWheelEventID;
static jmethodID postExposeEventID;
static jmethodID postFocusEventID;
@@ -91,8 +94,10 @@ cp_gtk_component_init_jni (void)
postMouseEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
"postMouseEvent", "(IJIIIIZ)V");
- setCursorID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
- "setCursor", "()V");
+ postMouseWheelEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(),
+ gtkcomponentpeer,
+ "postMouseWheelEvent",
+ "(IJIIIIZIII)V");
postExposeEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcomponentpeer,
"postExposeEvent", "(IIII)V");
@@ -110,6 +115,9 @@ static gboolean component_button_release_cb (GtkWidget *widget,
static gboolean component_motion_notify_cb (GtkWidget *widget,
GdkEventMotion *event,
jobject peer);
+static gboolean component_scroll_cb (GtkWidget *widget,
+ GdkEventScroll *event,
+ jobject peer);
static gboolean component_enter_notify_cb (GtkWidget *widget,
GdkEventCrossing *event,
jobject peer);
@@ -180,19 +188,19 @@ state_to_awt_mods_with_button_states (guint state)
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor
- (JNIEnv *env, jobject obj, jint type)
+ (JNIEnv *env, jobject obj, jint type, jobject image, jint x, jint y)
{
gdk_threads_enter ();
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked
- (env, obj, type);
+ (env, obj, type, image, x, y);
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked
- (JNIEnv *env, jobject obj, jint type)
+ (JNIEnv *env, jobject obj, jint type, jobject image, jint x, jint y)
{
void *ptr;
GtkWidget *widget;
@@ -248,9 +256,19 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursorUnlocked
widget = get_widget(GTK_WIDGET(ptr));
- gdk_cursor = gdk_cursor_new (gdk_cursor_type);
+ if (image == NULL)
+ gdk_cursor = gdk_cursor_new (gdk_cursor_type);
+ else
+ gdk_cursor
+ = gdk_cursor_new_from_pixbuf (gdk_drawable_get_display (widget->window),
+ cp_gtk_image_get_pixbuf (env, image),
+ x, y);
+
gdk_window_set_cursor (widget->window, gdk_cursor);
gdk_cursor_unref (gdk_cursor);
+
+ /* Make sure the cursor is replaced on screen. */
+ gdk_flush();
}
JNIEXPORT void JNICALL
@@ -932,6 +950,9 @@ cp_gtk_component_connect_mouse_signals (GObject *ptr, jobject *gref)
g_signal_connect (G_OBJECT (ptr), "motion-notify-event",
G_CALLBACK (component_motion_notify_cb), *gref);
+
+ g_signal_connect (G_OBJECT (ptr), "scroll-event",
+ G_CALLBACK (component_scroll_cb), *gref);
}
void
@@ -944,11 +965,11 @@ cp_gtk_component_connect_signals (GObject *ptr, jobject *gref)
/* These variables are used to keep track of click counts. The AWT
allows more than a triple click to occur but GTK doesn't report
- more-than-triple clicks. */
+ more-than-triple clicks. Also used for keeping track of scroll events.*/
static jint click_count = 1;
static guint32 button_click_time = 0;
static GdkWindow *button_window = NULL;
-static guint button_number = -1;
+static guint button_number_direction = -1;
static int hasBeenDragged;
static gboolean
@@ -963,14 +984,14 @@ component_button_press_cb (GtkWidget *widget __attribute__((unused)),
if ((event->time < (button_click_time + MULTI_CLICK_TIME))
&& (event->window == button_window)
- && (event->button == button_number))
+ && (event->button == button_number_direction))
click_count++;
else
click_count = 1;
button_click_time = event->time;
button_window = event->window;
- button_number = event->button;
+ button_number_direction = event->button;
(*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
postMouseEventID,
@@ -1069,6 +1090,45 @@ component_motion_notify_cb (GtkWidget *widget __attribute__((unused)),
}
static gboolean
+component_scroll_cb (GtkWidget *widget __attribute__((unused)),
+ GdkEventScroll *event,
+ jobject peer)
+{
+ int rotation;
+ /** Record click count for specific direction. */
+ if ((event->time < (button_click_time + MULTI_CLICK_TIME))
+ && (event->window == button_window)
+ && (event->direction == button_number_direction))
+ click_count++;
+ else
+ click_count = 1;
+
+ button_click_time = event->time;
+ button_window = event->window;
+ button_number_direction = event->direction;
+
+ if (event->direction == GDK_SCROLL_UP
+ || event->direction == GDK_SCROLL_LEFT)
+ rotation = -1;
+ else
+ rotation = 1;
+
+ (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer,
+ postMouseWheelEventID,
+ AWT_MOUSE_WHEEL,
+ (jlong)event->time,
+ cp_gtk_state_to_awt_mods (event->state),
+ (jint)event->x,
+ (jint)event->y,
+ click_count,
+ JNI_FALSE,
+ AWT_WHEEL_UNIT_SCROLL,
+ 1 /* amount */,
+ rotation);
+ return FALSE;
+}
+
+static gboolean
component_enter_notify_cb (GtkWidget *widget __attribute__((unused)),
GdkEventCrossing *event,
jobject peer)
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
index ae0657636..92bc09edd 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
@@ -1,5 +1,5 @@
/* gtkimage.c
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -65,23 +65,17 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadPixbuf
int width, height;
GdkPixbuf *pixbuf;
- gdk_threads_enter ();
-
/* Don't use the JCL convert function because it throws an exception
on failure */
filename = (*env)->GetStringUTFChars (env, name, 0);
if (filename == NULL)
- {
- gdk_threads_leave ();
- return JNI_FALSE;
- }
+ return JNI_FALSE;
pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
if (pixbuf == NULL)
{
(*env)->ReleaseStringUTFChars (env, name, filename);
- gdk_threads_leave ();
return JNI_FALSE;
}
@@ -92,8 +86,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadPixbuf
setWidthHeight(env, obj, width, height);
(*env)->ReleaseStringUTFChars (env, name, filename);
- gdk_threads_leave ();
-
return JNI_TRUE;
}
@@ -111,8 +103,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadImageFromData
int width;
int height;
- gdk_threads_enter ();
-
src = (*env)->GetByteArrayElements (env, data, NULL);
len = (*env)->GetArrayLength (env, data);
@@ -128,9 +118,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadImageFromData
if (pixbuf == NULL)
{
createRawData (env, obj, NULL);
-
- gdk_threads_leave ();
-
return JNI_FALSE;
}
@@ -140,8 +127,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadImageFromData
createRawData (env, obj, pixbuf);
setWidthHeight(env, obj, width, height);
- gdk_threads_leave ();
-
return JNI_TRUE;
}
@@ -151,10 +136,8 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createFromPixbuf
{
int width, heigth;
GdkPixbuf *pixbuf = (GdkPixbuf *) getData (env, obj);
- gdk_threads_enter ();
width = gdk_pixbuf_get_width (pixbuf);
heigth = gdk_pixbuf_get_height (pixbuf);
- gdk_threads_leave ();
setWidthHeight(env, obj, width, heigth);
}
@@ -171,8 +154,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_getPixels(JNIEnv *env, jobject obj)
jint *result_array_iter, *dst;
int i,j;
- gdk_threads_enter ();
-
pixbuf = cp_gtk_image_get_pixbuf (env, obj);
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
@@ -214,8 +195,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_getPixels(JNIEnv *env, jobject obj)
(*env)->ReleaseIntArrayElements (env, result_array, result_array_iter, 0);
- gdk_threads_leave ();
-
return result_array;
}
@@ -233,8 +212,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_setPixels(JNIEnv *env, jobject obj,
jint *src_array_iter, *src;
int i;
- gdk_threads_enter ();
-
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
@@ -251,8 +228,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_setPixels(JNIEnv *env, jobject obj,
}
(*env)->ReleaseIntArrayElements (env, pixels, src_array_iter, 0);
-
- gdk_threads_leave ();
}
/**
@@ -265,8 +240,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createPixmap(JNIEnv *env, jobject obj)
jclass cls;
jfieldID field;
- gdk_threads_enter ();
-
cls = (*env)->GetObjectClass (env, obj);
field = (*env)->GetFieldID (env, cls, "width", "I");
g_assert (field != 0);
@@ -285,8 +258,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createPixmap(JNIEnv *env, jobject obj)
else
createRawData (env, obj, gdk_pixmap_new (NULL, width, height,
gdk_rgb_get_visual ()->depth));
-
- gdk_threads_leave ();
}
/**
@@ -295,13 +266,10 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createPixmap(JNIEnv *env, jobject obj)
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkImage_freePixmap(JNIEnv *env, jobject obj)
{
- gdk_threads_enter ();
if (offScreen (env, obj) == JNI_FALSE)
gdk_pixbuf_unref ((GdkPixbuf *)getData (env, obj));
else
g_object_unref ((GdkPixmap *)getData (env, obj));
-
- gdk_threads_leave ();
}
/**
@@ -321,8 +289,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createScaledPixmap(JNIEnv *env,
GdkPixbuf *pixbuf;
- gdk_threads_enter ();
-
cls = (*env)->GetObjectClass (env, destination);
field = (*env)->GetFieldID (env, cls, "width", "I");
g_assert (field != 0);
@@ -342,8 +308,6 @@ Java_gnu_java_awt_peer_gtk_GtkImage_createScaledPixmap(JNIEnv *env,
gdk_pixbuf_unref (pixbuf);
createRawData (env, destination, (void *)dst);
-
- gdk_threads_leave ();
}
/**
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
index a3cea8c4a..1c858faf5 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
@@ -1424,6 +1424,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBoundsUnlocked
(JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
{
void *ptr;
+ gint current_width;
+ gint current_height;
ptr = NSA_GET_PTR (env, obj);
@@ -1447,12 +1449,19 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBoundsUnlocked
if (GTK_WIDGET (ptr)->window != NULL)
gdk_window_move (GTK_WIDGET (ptr)->window, x, y);
- /* Need to change the widget's request size. */
- gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);
- /* Also need to call gtk_window_resize. If the resize is requested
- by the program and the window's "resizable" property is true then
- the size request will not be honoured. */
- gtk_window_resize (GTK_WINDOW (ptr), width, height);
+ /* Only request resizing if the actual width or height change, otherwise
+ * we get unnecessary flickers because resizing causes GTK to clear the
+ * window content, even if the actual size doesn't change. */
+ gtk_window_get_size(GTK_WINDOW(ptr), &current_width, &current_height);
+ if (current_width != width || current_height != height)
+ {
+ /* Need to change the widget's request size. */
+ gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);
+ /* Also need to call gtk_window_resize. If the resize is requested
+ by the program and the window's "resizable" property is true then
+ the size request will not be honoured. */
+ gtk_window_resize (GTK_WINDOW (ptr), width, height);
+ }
}
static void
diff --git a/native/jni/java-lang/Makefile.am b/native/jni/java-lang/Makefile.am
index a9a71924d..366d72e4c 100644
--- a/native/jni/java-lang/Makefile.am
+++ b/native/jni/java-lang/Makefile.am
@@ -10,7 +10,7 @@ libjavalang_la_LIBADD = $(wildcard $(top_builddir)/native/fdlibm/*.lo) \
$(top_builddir)/native/jni/classpath/jcl.lo \
$(top_builddir)/native/jni/native-lib/libclasspathnative.la
-libjavalangreflect_la_SOURCES = java_lang_reflect_Array.c
+libjavalangreflect_la_SOURCES = java_lang_reflect_VMArray.c
AM_LDFLAGS = @CLASSPATH_MODULE@
AM_CPPFLAGS = @CLASSPATH_INCLUDES@ -I$(top_srcdir)/native/fdlibm
diff --git a/native/jni/java-lang/java_lang_VMProcess.c b/native/jni/java-lang/java_lang_VMProcess.c
index 7eead36a3..16793287a 100644
--- a/native/jni/java-lang/java_lang_VMProcess.c
+++ b/native/jni/java-lang/java_lang_VMProcess.c
@@ -38,6 +38,8 @@ exception statement from your version. */
#include <config.h>
#include "java_lang_VMProcess.h"
+#include "gnu_java_nio_channels_FileChannelImpl.h"
+
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
@@ -55,17 +57,6 @@ exception statement from your version. */
static char *copy_string (JNIEnv * env, jobject string);
static char *copy_elem (JNIEnv * env, jobject stringArray, jint i);
-/* Some O/S's don't declare 'environ' */
-#if HAVE_CRT_EXTERNS_H
-/* Darwin does not have a variable named environ
- but has a function which you can get the environ
- variable with. */
-#include <crt_externs.h>
-#define environ (*_NSGetEnviron())
-#else
-extern char **environ;
-#endif /* HAVE_CRT_EXTERNS_H */
-
/*
* Internal helper function to copy a String in UTF-8 format.
*/
@@ -132,10 +123,11 @@ copy_elem (JNIEnv * env, jobject stringArray, jint i)
JNIEXPORT void JNICALL
Java_java_lang_VMProcess_nativeSpawn (JNIEnv * env, jobject this,
jobjectArray cmdArray,
- jobjectArray envArray, jobject dirFile)
+ jobjectArray envArray, jobject dirFile,
+ jboolean redirect)
{
- int fds[3];
- jobject streams[3] = { NULL, NULL, NULL };
+ int fds[CPIO_EXEC_NUM_PIPES];
+ jobject streams[CPIO_EXEC_NUM_PIPES] = { NULL, NULL, NULL };
jobject dirString = NULL;
char **newEnviron = NULL;
jsize cmdArrayLen = 0;
@@ -226,7 +218,7 @@ Java_java_lang_VMProcess_nativeSpawn (JNIEnv * env, jobject this,
method = (*env)->GetMethodID (env, clazz, "<init>", "(II)V");
if ((*env)->ExceptionOccurred (env))
goto done;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < CPIO_EXEC_NUM_PIPES; i++)
{
/* Mode is WRITE (2) for in and READ (1) for out and err. */
const int fd = fds[i];
@@ -238,7 +230,7 @@ Java_java_lang_VMProcess_nativeSpawn (JNIEnv * env, jobject this,
if ((*env)->ExceptionOccurred (env))
goto done;
- if (mode == 2)
+ if (mode == gnu_java_nio_channels_FileChannelImpl_WRITE)
sclazz = (*env)->FindClass (env, "java/io/FileOutputStream");
else
sclazz = (*env)->FindClass (env, "java/io/FileInputStream");
@@ -266,7 +258,7 @@ Java_java_lang_VMProcess_nativeSpawn (JNIEnv * env, jobject this,
if ((*env)->ExceptionOccurred (env))
goto done;
(*env)->CallVoidMethod (env, this, method,
- streams[0], streams[1], streams[2], (jlong) pid);
+ streams[CPIO_EXEC_STDIN], streams[CPIO_EXEC_STDOUT], streams[CPIO_EXEC_STDERR], (jlong) pid);
if ((*env)->ExceptionOccurred (env))
goto done;
@@ -282,7 +274,7 @@ done:
* was created for a file descriptor, we don't close it because it
* will get closed when the Stream object is finalized.
*/
- for (i = 0; i < 3; i++)
+ for (i = 0; i < CPIO_EXEC_NUM_PIPES; i++)
{
const int fd = fds[i];
diff --git a/native/jni/java-lang/java_lang_VMSystem.c b/native/jni/java-lang/java_lang_VMSystem.c
index 0edbb2e96..05b0d960e 100644
--- a/native/jni/java-lang/java_lang_VMSystem.c
+++ b/native/jni/java-lang/java_lang_VMSystem.c
@@ -154,3 +154,35 @@ Java_java_lang_VMSystem_getenv (JNIEnv * env,
JCL_free_cstring (env, jname, cname);
return (*env)->NewStringUTF (env, envname);
}
+
+JNIEXPORT jobject JNICALL
+Java_java_lang_VMSystem_environ (JNIEnv *env,
+ jclass klass __attribute__((__unused__)))
+{
+ char **env_pointer;
+ jobject variables;
+ jclass list_class;
+ jmethodID list_constructor;
+ jmethodID add;
+
+ list_class = (*env)->FindClass(env, "java/util/LinkedList");
+ if (list_class == NULL)
+ return NULL;
+ list_constructor = (*env)->GetMethodID(env, list_class, "<init>", "()V");
+ if (list_constructor == NULL)
+ return NULL;
+ variables = (*env)->NewObject(env, list_class, list_constructor);
+ if (variables == NULL)
+ return NULL;
+ add = (*env)->GetMethodID(env, list_class, "add", "(Ljava/lang/Object;)Z");
+ if (add == NULL)
+ return NULL;
+ env_pointer = environ;
+ while (*env_pointer != NULL)
+ {
+ jstring string = (*env)->NewStringUTF(env, *env_pointer);
+ (*env)->CallBooleanMethod(env, variables, add, string);
+ ++env_pointer;
+ }
+ return variables;
+}
diff --git a/native/jni/java-lang/java_lang_reflect_Array.c b/native/jni/java-lang/java_lang_reflect_VMArray.c
index 64ad202db..2db68ebf9 100644
--- a/native/jni/java-lang/java_lang_reflect_Array.c
+++ b/native/jni/java-lang/java_lang_reflect_VMArray.c
@@ -45,7 +45,7 @@ exception statement from your version. */
#include <config.h>
#include <stddef.h>
-#include "java_lang_reflect_Array.h"
+#include "java_lang_reflect_VMArray.h"
/*
* Class: java_lang_reflect_Array
@@ -53,7 +53,7 @@ exception statement from your version. */
* Signature: (Ljava/lang/Class;I)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL
-Java_java_lang_reflect_Array_createObjectArray
+Java_java_lang_reflect_VMArray_createObjectArray
(JNIEnv * env,
jclass thisClass __attribute__ ((__unused__)),
jclass arrayType, jint arrayLength)
diff --git a/native/jni/java-net/Makefile.am b/native/jni/java-net/Makefile.am
index d8f70b8ee..854c624d1 100644
--- a/native/jni/java-net/Makefile.am
+++ b/native/jni/java-net/Makefile.am
@@ -1,11 +1,20 @@
nativeexeclib_LTLIBRARIES = libjavanet.la
+if ENABLE_LOCAL_SOCKETS
+local_sources = gnu_java_net_local_LocalSocketImpl.c \
+ local.c \
+ local.h
+else
+local_sources = gnu_java_net_local_LocalSocketImpl.c
+endif
+
libjavanet_la_SOURCES = javanet.c \
javanet.h \
java_net_VMInetAddress.c \
java_net_VMNetworkInterface.c \
gnu_java_net_VMPlainDatagramSocketImpl.c \
- gnu_java_net_VMPlainSocketImpl.c
+ gnu_java_net_VMPlainSocketImpl.c \
+ $(local_sources)
libjavanet_la_LIBADD = $(top_builddir)/native/jni/classpath/jcl.lo \
$(top_builddir)/native/jni/native-lib/libclasspathnative.la
diff --git a/native/jni/java-net/gnu_java_net_local_LocalSocketImpl.c b/native/jni/java-net/gnu_java_net_local_LocalSocketImpl.c
new file mode 100644
index 000000000..3b29001a7
--- /dev/null
+++ b/native/jni/java-net/gnu_java_net_local_LocalSocketImpl.c
@@ -0,0 +1,538 @@
+/* gnu_java_net_local_LocalSocketImpl.c -- native local socket implementation.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is a part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+#define _GNU_SOURCE
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <gnu_java_net_local_LocalSocketImpl.h>
+
+#include <stddef.h>
+#include "local.h"
+
+#ifdef DEBUG
+#define TRACE(msg) fprintf (stderr, "%s(%s:%d) -- %s\n", __FUNCTION__, __FILE__, __LINE__, msg)
+#else
+#define TRACE(msg)
+#endif
+
+static void
+_throw (JNIEnv *env, const char *exception, const char *msg)
+{
+ jclass _theclass = (*env)->FindClass (env, exception);
+ TRACE("begin");
+ if (!_theclass)
+ {
+ (*env)->FatalError (env, "exception class not found");
+ }
+ (*env)->ThrowNew (env, _theclass, msg);
+ TRACE("end");
+}
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_create (JNIEnv *env, jobject this, jboolean stream)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd, created;
+ jclass clazz;
+ jint fd = (jint) local_create ((int) stream);
+
+ TRACE("begin");
+
+ if (fd < 0)
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ return;
+ }
+ clazz = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return;
+ }
+ created = (*env)->GetFieldID (env, clazz, "created", "Z");
+ if (!created)
+ {
+ return;
+ }
+ (*env)->SetIntField (env, this, socket_fd, fd);
+ (*env)->SetBooleanField (env, this, created, JNI_TRUE);
+
+ TRACE("end");
+#else
+ (void) this;
+ (void) stream;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_listen (JNIEnv *env, jobject this, jint backlog)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd;
+ jclass clazz;
+ int fd;
+
+ TRACE("begin");
+
+ clazz = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return;
+ }
+ fd = (int) (*env)->GetIntField (env, this, socket_fd);
+ if (local_listen (fd, (int) backlog))
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ return;
+ }
+
+ TRACE("end");
+#else
+ (void) this;
+ (void) backlog;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_accept (JNIEnv *env, jobject this, jobject socket)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jmethodID addr_init;
+ jfieldID socket_fd, remote_addr, local_addr;
+ jclass clazz1, clazz2;
+ jobject remote, local;
+ jint fd;
+ char path[108];
+
+ TRACE("begin");
+
+ clazz1 = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz1, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return;
+ }
+ fd = (*env)->GetIntField (env, this, socket_fd);
+ fd = (jint) local_accept ((int) fd, path);
+ if (fd < 0)
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ return;
+ }
+
+ clazz2 = (*env)->FindClass (env, "gnu/java/net/local/LocalSocketAddress");
+ if (!clazz2)
+ {
+ return;
+ }
+ addr_init = (*env)->GetMethodID (env, clazz2, "<init>", "(Ljava/lang/String;)V");
+ if (!addr_init)
+ {
+ return;
+ }
+ remote = (*env)->NewObject (env, clazz2, addr_init, (*env)->NewStringUTF (env, path));
+
+ remote_addr = (*env)->GetFieldID (env, clazz1, "remote", "Lgnu/java/net/local/LocalSocketAddress;");
+ if (!remote_addr)
+ {
+ return;
+ }
+ local_addr = (*env)->GetFieldID (env, clazz1, "local", "Lgnu/java/net/local/LocalSocketAddress;");
+ if (!local_addr)
+ {
+ return;
+ }
+ local = (*env)->GetObjectField (env, this, local_addr);
+ (*env)->SetIntField (env, socket, socket_fd, fd);
+ (*env)->SetObjectField (env, socket, remote_addr, remote);
+ (*env)->SetObjectField (env, socket, local_addr, local);
+
+ TRACE("end");
+#else
+ (void) this;
+ (void) socket;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+jint
+Java_gnu_java_net_local_LocalSocketImpl_available (JNIEnv *env, jobject this)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd;
+ jclass clazz;
+ jint avail;
+
+ TRACE("begin");
+
+ clazz = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return 0;
+ }
+ avail = (jint) local_available ((int) (*env)->GetIntField (env, this, socket_fd));
+ if (avail < 0)
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ return 0;
+ }
+
+ TRACE("end");
+
+ return avail;
+#else
+ (void) this;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+ return -1;
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_close (JNIEnv *env, jobject this)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd;
+ jclass clazz;
+ int fd;
+
+ TRACE("begin");
+
+ clazz = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return;
+ }
+ fd = (int) (*env)->GetIntField (env, this, socket_fd);
+ if (local_close (fd))
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ }
+
+ TRACE("end");
+#else
+ (void) this;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_unlink (JNIEnv *env, jobject this)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID local;
+ jmethodID get_path;
+ jclass clazz1, clazz2;
+ jobject local_ref, path;
+ char *addr_path;
+
+ TRACE("begin");
+
+ clazz1 = (*env)->GetObjectClass (env, this);
+ local = (*env)->GetFieldID (env, clazz1, "local", "Lgnu/java/net/local/LocalSocketAddress;");
+ if (!local)
+ {
+ return;
+ }
+ local_ref = (*env)->GetObjectField (env, this, local);
+ clazz2 = (*env)->GetObjectClass (env, local_ref);
+ get_path = (*env)->GetMethodID (env, clazz2, "getPath", "()Ljava/lang/String;");
+ if (!get_path)
+ {
+ return;
+ }
+ path = (*env)->CallObjectMethod (env, local_ref, get_path);
+ addr_path = (char *) (*env)->GetStringUTFChars (env, (jstring) path, NULL);
+ if (local_unlink (addr_path))
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ }
+ (*env)->ReleaseStringUTFChars (env, (jstring) path, addr_path);
+
+ TRACE("end");
+#else
+ (void) this;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_sendUrgentData (JNIEnv *env, jobject this __attribute__((unused)), jint data __attribute__((unused)))
+{
+ /* XXX I don't remember why I have this. Probably should just
+ remove. */
+ (*env)->FatalError (env, "Java_gnu_java_net_local_LocalSocketImpl_shutdownInput (JNIEnv *env, jobject) not implemented");
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_shutdownInput (JNIEnv *env, jobject this)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd;
+ jclass clazz;
+ int fd;
+
+ TRACE("begin");
+
+ clazz = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return;
+ }
+ fd = (*env)->GetIntField (env, this, socket_fd);
+ if (local_shutdown_input (fd))
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ }
+
+ TRACE("end");
+#else
+ (void) this;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_shutdownOutput (JNIEnv *env, jobject this)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd;
+ jclass clazz;
+ int fd;
+
+ TRACE("begin");
+
+ clazz = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return;
+ }
+ fd = (*env)->GetIntField (env, this, socket_fd);
+ if (local_shutdown_output (fd))
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ }
+
+ TRACE("end");
+#else
+ (void) this;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_localBind (JNIEnv *env, jobject this, jobject address)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd;
+ jmethodID get_path;
+ jobject path;
+ jclass clazz1, clazz2;
+ const char *addr_path;
+ int fd;
+
+ TRACE("begin");
+
+ clazz1 = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz1, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return;
+ }
+ fd = (int) (*env)->GetIntField (env, this, socket_fd);
+ clazz2 = (*env)->GetObjectClass (env, address);
+ get_path = (*env)->GetMethodID (env, clazz2, "getPath", "()Ljava/lang/String;");
+ path = (*env)->CallObjectMethod (env, address, get_path);
+ addr_path = (*env)->GetStringUTFChars (env, (jstring) path, NULL);
+ if (local_bind (fd, addr_path))
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ }
+ (*env)->ReleaseStringUTFChars (env, (jstring) path, addr_path);
+
+ TRACE("end");
+#else
+ (void) this;
+ (void) address;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_localConnect (JNIEnv *env, jobject this, jobject address)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd;
+ jmethodID get_path;
+ jobject path;
+ jclass clazz1, clazz2;
+ char *addr_path;
+ int fd;
+
+ TRACE("begin");
+
+ clazz1 = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz1, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return;
+ }
+ fd = (int) (*env)->GetIntField (env, this, socket_fd);
+ clazz2 = (*env)->GetObjectClass (env, address);
+ get_path = (*env)->GetMethodID (env, clazz2, "getPath", "()Ljava/lang/String;");
+ path = (*env)->CallObjectMethod (env, address, get_path);
+ addr_path = (char *) (*env)->GetStringUTFChars (env, (jstring) path, NULL);
+ if (local_connect (fd, addr_path))
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ }
+ (*env)->ReleaseStringUTFChars (env, (jstring) path, addr_path);
+
+ TRACE("end");
+#else
+ (void) this;
+ (void) address;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+jint
+Java_gnu_java_net_local_LocalSocketImpl_read (JNIEnv *env, jobject this, jbyteArray buf, jint off, jint len)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd;
+ jclass clazz;
+ jbyte *buffer;
+ jint count;
+ int fd;
+
+ TRACE("begin");
+
+ if (off < 0 || len < 0 || off + len > (*env)->GetArrayLength (env, buf))
+ {
+ _throw (env, "java/lang/ArrayIndexOutOfBoundsException", "");
+ }
+
+ clazz = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return 0;
+ }
+ fd = (int) (*env)->GetIntField (env, this, socket_fd);
+ buffer = (*env)->GetByteArrayElements (env, buf, NULL);
+ count = (jint) local_read (fd, (void *) (buffer + off), (int) len);
+ if (count < 0)
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ }
+ (*env)->ReleaseByteArrayElements (env, buf, buffer, 0);
+
+ TRACE("end");
+
+ return count;
+#else
+ (void) this;
+ (void) buf;
+ (void) off;
+ (void) len;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+ return -1;
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
+
+
+void
+Java_gnu_java_net_local_LocalSocketImpl_write (JNIEnv *env, jobject this, jbyteArray buf, jint off, jint len)
+{
+#ifdef ENABLE_LOCAL_SOCKETS
+ jfieldID socket_fd;
+ jclass clazz;
+ jbyte *buffer;
+ int fd;
+
+ TRACE("begin");
+
+ if (off < 0 || len < 0 || off + len > (*env)->GetArrayLength (env, buf))
+ {
+ _throw (env, "java/lang/ArrayIndexOutOfBoundsException", "");
+ }
+
+ clazz = (*env)->GetObjectClass (env, this);
+ socket_fd = (*env)->GetFieldID (env, clazz, "socket_fd", "I");
+ if (!socket_fd)
+ {
+ return;
+ }
+ fd = (int) (*env)->GetIntField (env, this, socket_fd);
+ buffer = (*env)->GetByteArrayElements (env, buf, NULL);
+ if (local_write (fd, (void *) (buffer + off), (int) len) < 0)
+ {
+ _throw (env, "java/io/IOException", local_error ());
+ }
+ (*env)->ReleaseByteArrayElements (env, buf, buffer, JNI_ABORT);
+
+ TRACE("end");
+#else
+ (void) this;
+ (void) buf;
+ (void) off;
+ (void) len;
+ _throw (env, "java/lang/Error", "support for local sockets not available");
+#endif /* ENABLE_LOCAL_SOCKETS */
+}
diff --git a/native/jni/java-net/javanet.h b/native/jni/java-net/javanet.h
index ae0fd50d8..3f9c9d57c 100644
--- a/native/jni/java-net/javanet.h
+++ b/native/jni/java-net/javanet.h
@@ -40,7 +40,8 @@ exception statement from your version. */
#define _JAVANET_LOADED
#include <jni.h>
-#include <cpnet.h>
+#include "jcl.h"
+#include "cpnet.h"
/*************************************************************************/
@@ -74,19 +75,6 @@ exception statement from your version. */
/*************************************************************************/
/*
- * Macros
- */
-
-/* Simple debug macro */
-#ifdef DEBUG
-#define DBG(x) fprintf(stderr, (x));
-#else
-#define DBG(x)
-#endif
-
-/*************************************************************************/
-
-/*
* Function Prototypes
*/
diff --git a/native/jni/java-net/local.c b/native/jni/java-net/local.c
new file mode 100644
index 000000000..cdddd89ef
--- /dev/null
+++ b/native/jni/java-net/local.c
@@ -0,0 +1,193 @@
+/* local.c -- implementation of unix-domain sockets.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is a part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifdef ENABLE_LOCAL_SOCKETS
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include <stdio.h>
+
+#include "local.h"
+
+const char *
+local_error (void)
+{
+ return strerror (errno);
+}
+
+int
+local_create (int stream)
+{
+ return socket (PF_UNIX, stream ? SOCK_STREAM : SOCK_DGRAM, 0);
+}
+
+static int gcc_sucks = 0;
+
+int
+local_bind (int fd, const char *addr)
+{
+ struct sockaddr_un saddr;
+
+ /* For some reason, GCC 4.0.1 on Darwin/x86 MODIFIES the `addr'
+ pointer in the CALLER's STACK FRAME after calling this function,
+ but if we add this statement below, it doesn't! */
+ if (gcc_sucks)
+ fprintf (stderr, "bind %p\n", addr);
+
+ if (strlen (addr) > sizeof (saddr.sun_path))
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+
+ strncpy (saddr.sun_path, addr, sizeof (saddr.sun_path));
+ saddr.sun_path[sizeof (saddr.sun_path)] = '\0';
+ saddr.sun_family = AF_LOCAL;
+
+ return bind (fd, (struct sockaddr *) &saddr, SUN_LEN (&saddr));
+}
+
+int
+local_listen (int fd, int backlog)
+{
+ return listen (fd, backlog);
+}
+
+int
+local_accept (int fd, char *path)
+{
+ int newfd;
+ struct sockaddr_un addr;
+ socklen_t sz = SUN_LEN(&addr);
+
+ newfd = accept (fd, (struct sockaddr *) &addr, &sz);
+ if (newfd >= 0)
+ {
+ /** sun_path is some crazy statically-sized buffer, and it's
+ size is different on different OSes. */
+ int n = sizeof (addr.sun_path);
+ strncpy (path, addr.sun_path, n);
+ path[n] = '\0';
+ }
+ return newfd;
+}
+
+int
+local_available (int fd)
+{
+ int val;
+ if (ioctl (fd, FIONREAD, &val))
+ {
+ return -1;
+ }
+ return val;
+}
+
+int
+local_close (int fd)
+{
+ return close (fd);
+}
+
+int
+local_unlink (char *path)
+{
+ return unlink (path);
+}
+
+int
+local_shutdown_input (int fd)
+{
+ return shutdown (fd, 0);
+}
+
+int
+local_shutdown_output (int fd)
+{
+ return shutdown (fd, 1);
+}
+
+int
+local_connect (int fd, char *path)
+{
+ struct sockaddr_un saddr;
+
+ strncpy (saddr.sun_path, path, sizeof (saddr.sun_path));
+ saddr.sun_path[sizeof (saddr.sun_path) - 1] = '\0';
+ saddr.sun_family = AF_UNIX;
+
+ return connect (fd, (struct sockaddr *) &saddr, SUN_LEN(&saddr));
+}
+
+int
+local_read (int fd, void *buf, int len)
+{
+ int count = -1;
+ do
+ {
+ count = read (fd, buf, len);
+ }
+ while (count == -1 && errno == EINTR);
+ return count;
+}
+
+int
+local_write (int fd, void *buf, int len)
+{
+ int count = -1;
+ do
+ {
+ count = write (fd, buf, len);
+ }
+ while (count == -1 && errno == EINTR);
+ return count;
+}
+
+#endif /* ENABLE_LOCAL_SOCKETS */
diff --git a/native/jni/java-net/local.h b/native/jni/java-net/local.h
new file mode 100644
index 000000000..035996a80
--- /dev/null
+++ b/native/jni/java-net/local.h
@@ -0,0 +1,28 @@
+#ifndef __LOCAL_H__
+#define __LOCAL_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+#define __EMACSEN__ }
+
+extern const char *local_error (void);
+extern int local_create (int);
+extern int local_bind (int, const char *);
+extern int local_listen (int, int);
+extern int local_accept (int, char *);
+extern int local_available (int);
+extern int local_close (int);
+extern int local_shutdown_input (int);
+extern int local_shutdown_output (int);
+extern int local_connect (int, char *);
+extern int local_unlink (char *);
+extern int local_read (int, void *, int);
+extern int local_write (int, void *, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __LOCAL_H__ */
diff --git a/native/jni/native-lib/cpproc.h b/native/jni/native-lib/cpproc.h
index 32da1dad1..cfe82ab08 100644
--- a/native/jni/native-lib/cpproc.h
+++ b/native/jni/native-lib/cpproc.h
@@ -42,6 +42,7 @@ exception statement from your version. */
#define CPIO_EXEC_STDIN 0
#define CPIO_EXEC_STDOUT 1
#define CPIO_EXEC_STDERR 2
+#define CPIO_EXEC_NUMPIPES 3
JNIEXPORT int cpproc_forkAndExec (char * const *commandLine, char * const * newEnviron, int *fds, pid_t *pid, const char *wd);
JNIEXPORT int cpproc_waitpid (pid_t pid, int *status, pid_t *outpid, int options);
diff --git a/org/omg/CORBA/ACTIVITY_COMPLETED.java b/org/omg/CORBA/ACTIVITY_COMPLETED.java
index ea234e620..5fb03533a 100644
--- a/org/omg/CORBA/ACTIVITY_COMPLETED.java
+++ b/org/omg/CORBA/ACTIVITY_COMPLETED.java
@@ -1,5 +1,5 @@
/* ACTIVITY_COMPLETED.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -51,7 +51,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class ACTIVITY_COMPLETED
+public final class ACTIVITY_COMPLETED
extends SystemException
implements Serializable
{
@@ -63,7 +63,7 @@ public class ACTIVITY_COMPLETED
/**
* Creates ACTIVITY_COMPLETED with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reason the explaining message.
+ * @param message the explaining message.
*/
public ACTIVITY_COMPLETED(String message)
{
diff --git a/org/omg/CORBA/ACTIVITY_REQUIRED.java b/org/omg/CORBA/ACTIVITY_REQUIRED.java
index c0c72b524..eeec38254 100644
--- a/org/omg/CORBA/ACTIVITY_REQUIRED.java
+++ b/org/omg/CORBA/ACTIVITY_REQUIRED.java
@@ -1,5 +1,5 @@
/* ACTIVITY_REQUIRED.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -49,7 +49,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class ACTIVITY_REQUIRED
+public final class ACTIVITY_REQUIRED
extends SystemException
implements Serializable
{
@@ -61,7 +61,7 @@ public class ACTIVITY_REQUIRED
/**
* Creates ACTIVITY_REQUIRED with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reason the explaining message.
+ * @param message the explaining message.
*/
public ACTIVITY_REQUIRED(String message)
{
diff --git a/org/omg/CORBA/BAD_CONTEXT.java b/org/omg/CORBA/BAD_CONTEXT.java
index 139262d64..398da9e59 100644
--- a/org/omg/CORBA/BAD_CONTEXT.java
+++ b/org/omg/CORBA/BAD_CONTEXT.java
@@ -1,5 +1,5 @@
/* BAD_CONTEXT.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,7 +46,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class BAD_CONTEXT
+public final class BAD_CONTEXT
extends SystemException
implements Serializable
{
@@ -58,7 +58,7 @@ public class BAD_CONTEXT
/**
* Creates a BAD_CONTEXT with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public BAD_CONTEXT(String message)
{
diff --git a/org/omg/CORBA/BAD_INV_ORDER.java b/org/omg/CORBA/BAD_INV_ORDER.java
index 0f585cd91..9390600b7 100644
--- a/org/omg/CORBA/BAD_INV_ORDER.java
+++ b/org/omg/CORBA/BAD_INV_ORDER.java
@@ -1,5 +1,5 @@
/* BAD_INV_ORDER.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class BAD_INV_ORDER
+public final class BAD_INV_ORDER
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class BAD_INV_ORDER
/**
* Creates a BAD_INV_ORDER with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public BAD_INV_ORDER(String message)
{
diff --git a/org/omg/CORBA/BAD_OPERATION.java b/org/omg/CORBA/BAD_OPERATION.java
index 2649f2a6d..b84890724 100755
--- a/org/omg/CORBA/BAD_OPERATION.java
+++ b/org/omg/CORBA/BAD_OPERATION.java
@@ -1,5 +1,5 @@
/* BAD_OPERATION.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -114,7 +114,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class BAD_OPERATION
+public final class BAD_OPERATION
extends SystemException
implements Serializable
{
@@ -127,7 +127,7 @@ public class BAD_OPERATION
* Creates a BAD_OPERATION with the default minor code of 0, completion state
* COMPLETED_NO and the given explaining message.
*
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public BAD_OPERATION(String message)
{
diff --git a/org/omg/CORBA/BAD_PARAM.java b/org/omg/CORBA/BAD_PARAM.java
index 848f43b43..2102193e5 100644
--- a/org/omg/CORBA/BAD_PARAM.java
+++ b/org/omg/CORBA/BAD_PARAM.java
@@ -1,5 +1,5 @@
/* BAD_PARAM.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,14 +45,14 @@ import java.io.Serializable;
* illegal.
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class BAD_PARAM
+public final class BAD_PARAM
extends SystemException
implements Serializable
{
/**
* Creates BAD_PARAM with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public BAD_PARAM(String message)
{
diff --git a/org/omg/CORBA/BAD_QOS.java b/org/omg/CORBA/BAD_QOS.java
index ba8a0df32..c7ceb6924 100644
--- a/org/omg/CORBA/BAD_QOS.java
+++ b/org/omg/CORBA/BAD_QOS.java
@@ -1,5 +1,5 @@
/* BAD_QOS.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class BAD_QOS
+public final class BAD_QOS
extends SystemException
implements Serializable
{
@@ -60,7 +60,7 @@ public class BAD_QOS
/**
* Creates BAD_QOS with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reason the explaining message.
+ * @param message the explaining message.
*/
public BAD_QOS(String message)
{
diff --git a/org/omg/CORBA/BAD_TYPECODE.java b/org/omg/CORBA/BAD_TYPECODE.java
index 96ad21ef9..8aa5eb59c 100644
--- a/org/omg/CORBA/BAD_TYPECODE.java
+++ b/org/omg/CORBA/BAD_TYPECODE.java
@@ -1,5 +1,5 @@
/* BAD_TYPECODE.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,7 +46,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class BAD_TYPECODE
+public final class BAD_TYPECODE
extends SystemException
implements Serializable
{
@@ -58,7 +58,7 @@ public class BAD_TYPECODE
/**
* Creates a BAD_TYPECODE with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public BAD_TYPECODE(String message)
{
diff --git a/org/omg/CORBA/CODESET_INCOMPATIBLE.java b/org/omg/CORBA/CODESET_INCOMPATIBLE.java
index 41ccaf492..fc285baff 100644
--- a/org/omg/CORBA/CODESET_INCOMPATIBLE.java
+++ b/org/omg/CORBA/CODESET_INCOMPATIBLE.java
@@ -1,5 +1,5 @@
/* CODESET_INCOMPATIBLE.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -43,16 +43,16 @@ import java.io.Serializable;
/**
* Raised when client and server are unable to reach any consensus on which
* code set should be used to represent the characters. This happens when
- * neither server nor client cannot convert from the native code set of the
+ * neither server nor client can convert from the native code set of the
* corresponding side, there is no shared codeset from that both sides could
- * convert and additionally the client and server* native sets are too
- * different to communicate anyway without the massive data loss.
+ * convert and additionally the client and server native code sets are too
+ * different to communicate anyway without massive data loss.
*
* @since 1.5
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class CODESET_INCOMPATIBLE
+public final class CODESET_INCOMPATIBLE
extends SystemException
implements Serializable
{
@@ -64,7 +64,7 @@ public class CODESET_INCOMPATIBLE
/**
* Creates CODESET_INCOMPATIBLE with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reason the explaining message.
+ * @param message the explaining message.
*/
public CODESET_INCOMPATIBLE(String message)
{
diff --git a/org/omg/CORBA/COMM_FAILURE.java b/org/omg/CORBA/COMM_FAILURE.java
index 3c5044132..047d20e6c 100644
--- a/org/omg/CORBA/COMM_FAILURE.java
+++ b/org/omg/CORBA/COMM_FAILURE.java
@@ -1,5 +1,5 @@
/* COMM_FAILURE.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,7 +46,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class COMM_FAILURE
+public final class COMM_FAILURE
extends SystemException
implements Serializable
{
@@ -58,7 +58,7 @@ public class COMM_FAILURE
/**
* Creates a COMM_FAILURE with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public COMM_FAILURE(String message)
{
diff --git a/org/omg/CORBA/CompletionStatus.java b/org/omg/CORBA/CompletionStatus.java
index 1ddcca287..52f6f078d 100644
--- a/org/omg/CORBA/CompletionStatus.java
+++ b/org/omg/CORBA/CompletionStatus.java
@@ -1,5 +1,5 @@
/* CompletionStatus.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -49,7 +49,7 @@ import org.omg.CORBA.portable.IDLEntity;
* when the exception has been thrown.
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class CompletionStatus
+public final class CompletionStatus
implements Serializable, IDLEntity
{
/**
diff --git a/org/omg/CORBA/CurrentHolder.java b/org/omg/CORBA/CurrentHolder.java
index 83e5365d6..c7c1b32d2 100644
--- a/org/omg/CORBA/CurrentHolder.java
+++ b/org/omg/CORBA/CurrentHolder.java
@@ -1,5 +1,5 @@
/* CurrentHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class CurrentHolder
+public final class CurrentHolder
implements Streamable
{
/**
@@ -56,7 +56,7 @@ public class CurrentHolder
public Current value;
/**
- * Create the unitialised instance, leaving the value field
+ * Create the uninitialised instance, leaving the value field
* with default <code>null</code> value.
*/
public CurrentHolder()
@@ -74,7 +74,7 @@ public class CurrentHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/CORBA/DATA_CONVERSION.java b/org/omg/CORBA/DATA_CONVERSION.java
index 7261aae46..7ca83f3c2 100644
--- a/org/omg/CORBA/DATA_CONVERSION.java
+++ b/org/omg/CORBA/DATA_CONVERSION.java
@@ -1,5 +1,5 @@
/* DATA_CONVERSION.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -66,7 +66,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class DATA_CONVERSION
+public final class DATA_CONVERSION
extends SystemException
implements Serializable
{
@@ -78,7 +78,7 @@ public class DATA_CONVERSION
/**
* Creates a DATA_CONVERSION with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public DATA_CONVERSION(String message)
{
diff --git a/org/omg/CORBA/FREE_MEM.java b/org/omg/CORBA/FREE_MEM.java
index 5de665cb8..ec1aa0829 100644
--- a/org/omg/CORBA/FREE_MEM.java
+++ b/org/omg/CORBA/FREE_MEM.java
@@ -1,5 +1,5 @@
/* FREE_MEM.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,11 +41,11 @@ package org.omg.CORBA;
import java.io.Serializable;
/**
- * Means errors, related to freing the allocated memory.
+ * Means errors, related to freeing the allocated memory.
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class FREE_MEM
+public final class FREE_MEM
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class FREE_MEM
/**
* Creates a FREE_MEM with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public FREE_MEM(String message)
{
diff --git a/org/omg/CORBA/IMP_LIMIT.java b/org/omg/CORBA/IMP_LIMIT.java
index e61681c32..b36d69e0c 100644
--- a/org/omg/CORBA/IMP_LIMIT.java
+++ b/org/omg/CORBA/IMP_LIMIT.java
@@ -1,5 +1,5 @@
/* IMP_LIMIT.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,12 +41,12 @@ package org.omg.CORBA;
import java.io.Serializable;
/**
- * Means that the server have reached some implementation limit
+ * Means that the server has reached some implementation limit
* (too many clients, too many references, too long parameters and so on).
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class IMP_LIMIT
+public final class IMP_LIMIT
extends SystemException
implements Serializable
{
@@ -58,7 +58,7 @@ public class IMP_LIMIT
/**
* Creates a IMP_LIMIT with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public IMP_LIMIT(String message)
{
diff --git a/org/omg/CORBA/INITIALIZE.java b/org/omg/CORBA/INITIALIZE.java
index f697e5833..b42739acc 100644
--- a/org/omg/CORBA/INITIALIZE.java
+++ b/org/omg/CORBA/INITIALIZE.java
@@ -1,5 +1,5 @@
/* INITIALIZE.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,11 +41,11 @@ package org.omg.CORBA;
import java.io.Serializable;
/**
- * Mans that the server cannot be initialized because of the some reason.
+ * Means that the server cannot be initialized because of the some reason.
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class INITIALIZE
+public final class INITIALIZE
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class INITIALIZE
/**
* Creates a INITIALIZE with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public INITIALIZE(String message)
{
diff --git a/org/omg/CORBA/INTERNAL.java b/org/omg/CORBA/INTERNAL.java
index a49041e57..b8be63835 100644
--- a/org/omg/CORBA/INTERNAL.java
+++ b/org/omg/CORBA/INTERNAL.java
@@ -1,5 +1,5 @@
/* INTERNAL.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,11 +41,11 @@ package org.omg.CORBA;
import java.io.Serializable;
/**
- * Means the internal failure in ORB.
+ * Means an internal failure in the ORB.
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class INTERNAL
+public final class INTERNAL
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class INTERNAL
/**
* Creates a INTERNAL with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public INTERNAL(String message)
{
diff --git a/org/omg/CORBA/INTF_REPOS.java b/org/omg/CORBA/INTF_REPOS.java
index e879c0b1e..b7b6fe3fd 100644
--- a/org/omg/CORBA/INTF_REPOS.java
+++ b/org/omg/CORBA/INTF_REPOS.java
@@ -1,5 +1,5 @@
/* INTF_REPOS.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class INTF_REPOS
+public final class INTF_REPOS
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class INTF_REPOS
/**
* Creates a INTF_REPOS with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public INTF_REPOS(String message)
{
diff --git a/org/omg/CORBA/INVALID_ACTIVITY.java b/org/omg/CORBA/INVALID_ACTIVITY.java
index ae1d92dd7..eb4f69af1 100644
--- a/org/omg/CORBA/INVALID_ACTIVITY.java
+++ b/org/omg/CORBA/INVALID_ACTIVITY.java
@@ -1,5 +1,5 @@
/* INVALID_ACTIVITY.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -49,7 +49,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class INVALID_ACTIVITY
+public final class INVALID_ACTIVITY
extends SystemException
implements Serializable
{
@@ -61,7 +61,7 @@ public class INVALID_ACTIVITY
/**
* Creates INVALID_ACTIVITY with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reason the explaining message.
+ * @param message the explaining message.
*/
public INVALID_ACTIVITY(String message)
{
diff --git a/org/omg/CORBA/INVALID_TRANSACTION.java b/org/omg/CORBA/INVALID_TRANSACTION.java
index 98cef8304..08082d1f5 100644
--- a/org/omg/CORBA/INVALID_TRANSACTION.java
+++ b/org/omg/CORBA/INVALID_TRANSACTION.java
@@ -1,5 +1,5 @@
/* INVALID_TRANSACTION.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class INVALID_TRANSACTION
+public final class INVALID_TRANSACTION
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class INVALID_TRANSACTION
/**
* Creates a INVALID_TRANSACTION with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public INVALID_TRANSACTION(String message)
{
diff --git a/org/omg/CORBA/INV_FLAG.java b/org/omg/CORBA/INV_FLAG.java
index 7766a3cd0..92b1cd12f 100644
--- a/org/omg/CORBA/INV_FLAG.java
+++ b/org/omg/CORBA/INV_FLAG.java
@@ -1,5 +1,5 @@
/* INV_FLAG.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class INV_FLAG
+public final class INV_FLAG
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class INV_FLAG
/**
* Creates a INV_FLAG with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public INV_FLAG(String message)
{
diff --git a/org/omg/CORBA/INV_IDENT.java b/org/omg/CORBA/INV_IDENT.java
index ca61a0a24..89a59448d 100644
--- a/org/omg/CORBA/INV_IDENT.java
+++ b/org/omg/CORBA/INV_IDENT.java
@@ -1,5 +1,5 @@
/* INV_IDENT.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class INV_IDENT
+public final class INV_IDENT
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class INV_IDENT
/**
* Creates a INV_IDENT with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public INV_IDENT(String message)
{
diff --git a/org/omg/CORBA/INV_OBJREF.java b/org/omg/CORBA/INV_OBJREF.java
index ca8e059d4..8b6368b77 100644
--- a/org/omg/CORBA/INV_OBJREF.java
+++ b/org/omg/CORBA/INV_OBJREF.java
@@ -1,5 +1,5 @@
/* INV_OBJREF.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class INV_OBJREF
+public final class INV_OBJREF
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class INV_OBJREF
/**
* Creates a INV_OBJREF with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public INV_OBJREF(String message)
{
diff --git a/org/omg/CORBA/INV_POLICY.java b/org/omg/CORBA/INV_POLICY.java
index f4ff245cf..5b74e500a 100644
--- a/org/omg/CORBA/INV_POLICY.java
+++ b/org/omg/CORBA/INV_POLICY.java
@@ -1,5 +1,5 @@
/* INV_POLICY.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class INV_POLICY
+public final class INV_POLICY
extends SystemException
implements Serializable
{
@@ -59,7 +59,7 @@ public class INV_POLICY
/**
* Creates a INV_POLICY with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public INV_POLICY(String message)
{
diff --git a/org/omg/CORBA/MARSHAL.java b/org/omg/CORBA/MARSHAL.java
index 2cd92f5a6..b031acfd3 100644
--- a/org/omg/CORBA/MARSHAL.java
+++ b/org/omg/CORBA/MARSHAL.java
@@ -1,5 +1,5 @@
/* MARSHAL.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -268,7 +268,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class MARSHAL
+public final class MARSHAL
extends SystemException
implements Serializable
{
@@ -281,7 +281,7 @@ public class MARSHAL
* Creates a MARSHAL with the default minor code of 0, completion state
* COMPLETED_NO and the given explaining message.
*
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public MARSHAL(String message)
{
diff --git a/org/omg/CORBA/NO_IMPLEMENT.java b/org/omg/CORBA/NO_IMPLEMENT.java
index 7ffbca49d..1041f2007 100644
--- a/org/omg/CORBA/NO_IMPLEMENT.java
+++ b/org/omg/CORBA/NO_IMPLEMENT.java
@@ -1,5 +1,5 @@
/* NO_IMPLEMENT.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,7 +46,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class NO_IMPLEMENT
+public final class NO_IMPLEMENT
extends SystemException
implements Serializable
{
@@ -58,7 +58,7 @@ public class NO_IMPLEMENT
/**
* Creates a NO_IMPLEMENT with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public NO_IMPLEMENT(String message)
{
diff --git a/org/omg/CORBA/NO_MEMORY.java b/org/omg/CORBA/NO_MEMORY.java
index e09b4f1af..276cb54f5 100644
--- a/org/omg/CORBA/NO_MEMORY.java
+++ b/org/omg/CORBA/NO_MEMORY.java
@@ -1,5 +1,5 @@
/* NO_MEMORY.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class NO_MEMORY
+public final class NO_MEMORY
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class NO_MEMORY
/**
* Creates a NO_MEMORY with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public NO_MEMORY(String message)
{
diff --git a/org/omg/CORBA/NO_PERMISSION.java b/org/omg/CORBA/NO_PERMISSION.java
index dbeaa33eb..8e781842d 100644
--- a/org/omg/CORBA/NO_PERMISSION.java
+++ b/org/omg/CORBA/NO_PERMISSION.java
@@ -1,5 +1,5 @@
/* NO_PERMISSION.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class NO_PERMISSION
+public final class NO_PERMISSION
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class NO_PERMISSION
/**
* Creates a NO_PERMISSION with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public NO_PERMISSION(String message)
{
diff --git a/org/omg/CORBA/NO_RESOURCES.java b/org/omg/CORBA/NO_RESOURCES.java
index 013bdb674..14981b3aa 100644
--- a/org/omg/CORBA/NO_RESOURCES.java
+++ b/org/omg/CORBA/NO_RESOURCES.java
@@ -1,5 +1,5 @@
/* NO_RESOURCES.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -76,7 +76,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class NO_RESOURCES
+public final class NO_RESOURCES
extends SystemException
implements Serializable
{
@@ -89,7 +89,7 @@ public class NO_RESOURCES
* Creates a NO_RESOURCES with the default minor code of 0, completion state
* COMPLETED_NO and the given explaining message.
*
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public NO_RESOURCES(String message)
{
diff --git a/org/omg/CORBA/NO_RESPONSE.java b/org/omg/CORBA/NO_RESPONSE.java
index 0c31cfbee..afed98852 100644
--- a/org/omg/CORBA/NO_RESPONSE.java
+++ b/org/omg/CORBA/NO_RESPONSE.java
@@ -1,5 +1,5 @@
/* NO_RESPONSE.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,7 +46,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class NO_RESPONSE
+public final class NO_RESPONSE
extends SystemException
implements Serializable
{
@@ -58,7 +58,7 @@ public class NO_RESPONSE
/**
* Creates a NO_RESPONSE with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public NO_RESPONSE(String message)
{
diff --git a/org/omg/CORBA/OBJECT_NOT_EXIST.java b/org/omg/CORBA/OBJECT_NOT_EXIST.java
index aa8571dcb..549ac64d1 100644
--- a/org/omg/CORBA/OBJECT_NOT_EXIST.java
+++ b/org/omg/CORBA/OBJECT_NOT_EXIST.java
@@ -1,5 +1,5 @@
/* OBJECT_NOT_EXIST.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -41,10 +41,10 @@ package org.omg.CORBA;
import java.io.Serializable;
/**
- * Means an attempt to perform some operation of the deleted object.
+ * Means an attempt to perform some operation on a deleted object.
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class OBJECT_NOT_EXIST
+public final class OBJECT_NOT_EXIST
extends SystemException
implements Serializable
{
@@ -56,7 +56,7 @@ public class OBJECT_NOT_EXIST
/**
* Creates a OBJECT_NOT_EXIST with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public OBJECT_NOT_EXIST(String message)
{
diff --git a/org/omg/CORBA/OBJ_ADAPTER.java b/org/omg/CORBA/OBJ_ADAPTER.java
index 36c54b286..f1b25a4c4 100644
--- a/org/omg/CORBA/OBJ_ADAPTER.java
+++ b/org/omg/CORBA/OBJ_ADAPTER.java
@@ -1,5 +1,5 @@
/* OBJ_ADAPTER.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class OBJ_ADAPTER
+public final class OBJ_ADAPTER
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class OBJ_ADAPTER
/**
* Creates a OBJ_ADAPTER with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public OBJ_ADAPTER(String message)
{
diff --git a/org/omg/CORBA/ORB.java b/org/omg/CORBA/ORB.java
index 06259fafa..af0548828 100644
--- a/org/omg/CORBA/ORB.java
+++ b/org/omg/CORBA/ORB.java
@@ -673,17 +673,7 @@ public abstract class ORB
* @see #create_recursive_tc(String)
* @see #create_sequence_tc(int, TypeCode)
*/
- public TypeCode create_recursive_sequence_tc(int bound, int offset)
- {
- RecordTypeCode r = new RecordTypeCode(TCKind.tk_struct);
- for (int i = 0; i < offset; i++)
- r.add(new StructMember());
-
- TypeCode recurs = new PrimitiveTypeCode(TCKind.tk_sequence);
-
- r.add(new StructMember("", recurs, null));
- return r;
- }
+ public abstract TypeCode create_recursive_sequence_tc(int bound, int offset);
/**
* Create a typecode which serves as a placeholder for typcode, containing
@@ -789,10 +779,7 @@ public abstract class ORB
* @throws NO_IMPLEMENT for the Singleton ORB, returned by
* the parameterless {@link #init()}.
*/
- public Context get_default_context()
- {
- return new gnuContext("", null);
- }
+ public abstract Context get_default_context();
/**
* Return thg typecode, representing the given primitive object type.
diff --git a/org/omg/CORBA/PERSIST_STORE.java b/org/omg/CORBA/PERSIST_STORE.java
index df17cefa9..1fdddf1d0 100644
--- a/org/omg/CORBA/PERSIST_STORE.java
+++ b/org/omg/CORBA/PERSIST_STORE.java
@@ -1,5 +1,5 @@
/* PERSIST_STORE.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class PERSIST_STORE
+public final class PERSIST_STORE
extends SystemException
implements Serializable
{
diff --git a/org/omg/CORBA/ParameterMode.java b/org/omg/CORBA/ParameterMode.java
index 73c6f574f..931a2e927 100644
--- a/org/omg/CORBA/ParameterMode.java
+++ b/org/omg/CORBA/ParameterMode.java
@@ -1,5 +1,5 @@
/* ParameterMode.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -78,17 +78,17 @@ public class ParameterMode
/**
* This value means that the parameter is an IN parameter.
*/
- public static ParameterMode PARAM_IN = new ParameterMode(_PARAM_IN);
+ public static final ParameterMode PARAM_IN = new ParameterMode(_PARAM_IN);
/**
* This value means that the parameter is an OUT parameter.
*/
- public static ParameterMode PARAM_OUT = new ParameterMode(_PARAM_OUT);
+ public static final ParameterMode PARAM_OUT = new ParameterMode(_PARAM_OUT);
/**
* This value means that the parameter is an INOUT parameter.
*/
- public static ParameterMode PARAM_INOUT = new ParameterMode(_PARAM_INOUT);
+ public static final ParameterMode PARAM_INOUT = new ParameterMode(_PARAM_INOUT);
/**
* The value of this parameter mode instance.
diff --git a/org/omg/CORBA/ParameterModeHolder.java b/org/omg/CORBA/ParameterModeHolder.java
index 5c932b7d0..b6dc8fae7 100644
--- a/org/omg/CORBA/ParameterModeHolder.java
+++ b/org/omg/CORBA/ParameterModeHolder.java
@@ -1,5 +1,5 @@
/* ParameterModeHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -43,7 +43,7 @@ package org.omg.CORBA;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class ParameterModeHolder
+public final class ParameterModeHolder
implements org.omg.CORBA.portable.Streamable
{
/**
@@ -52,7 +52,7 @@ public class ParameterModeHolder
public ParameterMode value;
/**
- * Create the unitialised instance.
+ * Create the uninitialised instance.
*/
public ParameterModeHolder()
{
@@ -68,7 +68,7 @@ public class ParameterModeHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*/
public void _read(org.omg.CORBA.portable.InputStream in)
{
diff --git a/org/omg/CORBA/PolicyError.java b/org/omg/CORBA/PolicyError.java
index 749868a99..98d6079d8 100644
--- a/org/omg/CORBA/PolicyError.java
+++ b/org/omg/CORBA/PolicyError.java
@@ -1,5 +1,5 @@
/* PolicyError.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -51,7 +51,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class PolicyError
+public final class PolicyError
extends UserException
implements IDLEntity, Serializable
{
@@ -69,7 +69,7 @@ public class PolicyError
private static final long serialVersionUID = -9196809779974700103L;
/**
- * Constructs an unitialised instance of the policy error.
+ * Constructs an uninitialised instance of the policy error.
*/
public PolicyError()
{
diff --git a/org/omg/CORBA/PolicyErrorHolder.java b/org/omg/CORBA/PolicyErrorHolder.java
index 8e2c9a8d3..cc3cf6868 100644
--- a/org/omg/CORBA/PolicyErrorHolder.java
+++ b/org/omg/CORBA/PolicyErrorHolder.java
@@ -1,5 +1,5 @@
/* PolicyErrorHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,7 @@ import org.omg.CORBA.portable.Streamable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class PolicyErrorHolder implements Streamable
+public final class PolicyErrorHolder implements Streamable
{
/**
* The stored PolicyError value.
@@ -56,7 +56,7 @@ public class PolicyErrorHolder implements Streamable
public PolicyError value;
/**
- * Create the unitialised instance, leaving the value field
+ * Create the uninitialised instance, leaving the value field
* with default <code>null</code> value.
*/
public PolicyErrorHolder()
@@ -74,7 +74,7 @@ public class PolicyErrorHolder implements Streamable
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/CORBA/PolicyHolder.java b/org/omg/CORBA/PolicyHolder.java
index e398cc14d..7dafbca6f 100644
--- a/org/omg/CORBA/PolicyHolder.java
+++ b/org/omg/CORBA/PolicyHolder.java
@@ -1,5 +1,5 @@
/* PolicyHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class PolicyHolder
+public final class PolicyHolder
implements Streamable
{
/**
@@ -56,7 +56,7 @@ public class PolicyHolder
public Policy value;
/**
- * Create the unitialised instance, leaving the value field
+ * Create the uninitialised instance, leaving the value field
* with default <code>null</code> value.
*/
public PolicyHolder()
@@ -74,7 +74,7 @@ public class PolicyHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
* Delegates work to {@link PolicyHelper}.
*
* @param input the org.omg.CORBA.portable stream to read.
diff --git a/org/omg/CORBA/PolicyListHolder.java b/org/omg/CORBA/PolicyListHolder.java
index 6c1b1cc97..1b1d9da72 100644
--- a/org/omg/CORBA/PolicyListHolder.java
+++ b/org/omg/CORBA/PolicyListHolder.java
@@ -1,5 +1,5 @@
/* PolicyListHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -43,11 +43,11 @@ import org.omg.CORBA.portable.OutputStream;
import org.omg.CORBA.portable.Streamable;
/**
-* A holder for the object {@link Policy[]}.
+* A holder for the object <code>Policy[]</code>.
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class PolicyListHolder
+public final class PolicyListHolder
implements Streamable
{
/**
@@ -56,7 +56,7 @@ public class PolicyListHolder
public Policy[] value;
/**
- * Create the unitialised instance, leaving the value field
+ * Create the uninitialised instance, leaving the value field
* with default <code>null</code> value.
*/
public PolicyListHolder()
@@ -74,7 +74,7 @@ public class PolicyListHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
* Uses {@link PolicyListHelper}.
*
* @param input the org.omg.CORBA.portable stream to read.
diff --git a/org/omg/CORBA/REBIND.java b/org/omg/CORBA/REBIND.java
index 9480906cc..48a3ea42f 100644
--- a/org/omg/CORBA/REBIND.java
+++ b/org/omg/CORBA/REBIND.java
@@ -1,5 +1,5 @@
/* REBIND.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class REBIND
+public final class REBIND
extends SystemException
implements Serializable
{
@@ -60,7 +60,7 @@ public class REBIND
/**
* Creates REBIND with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reason the explaining message.
+ * @param message the explaining message.
*/
public REBIND(String message)
{
diff --git a/org/omg/CORBA/SystemException.java b/org/omg/CORBA/SystemException.java
index dd1936279..127b918d3 100644
--- a/org/omg/CORBA/SystemException.java
+++ b/org/omg/CORBA/SystemException.java
@@ -1,5 +1,5 @@
/* SystemException.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class SystemException
+public abstract class SystemException
extends RuntimeException
implements Serializable
{
diff --git a/org/omg/CORBA/TIMEOUT.java b/org/omg/CORBA/TIMEOUT.java
index 44ae8b31c..bdeae7b19 100644
--- a/org/omg/CORBA/TIMEOUT.java
+++ b/org/omg/CORBA/TIMEOUT.java
@@ -1,5 +1,5 @@
/* TIMEOUT.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class TIMEOUT
+public final class TIMEOUT
extends SystemException
implements Serializable
{
@@ -59,7 +59,7 @@ public class TIMEOUT
/**
* Creates TIMEOUT with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reason the explaining message.
+ * @param message the explaining message.
*/
public TIMEOUT(String message)
{
diff --git a/org/omg/CORBA/TRANSACTION_MODE.java b/org/omg/CORBA/TRANSACTION_MODE.java
index 5f1981ba4..fc72d3c67 100644
--- a/org/omg/CORBA/TRANSACTION_MODE.java
+++ b/org/omg/CORBA/TRANSACTION_MODE.java
@@ -1,5 +1,5 @@
/* TRANSACTION_MODE.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class TRANSACTION_MODE
+public final class TRANSACTION_MODE
extends SystemException
implements Serializable
{
@@ -60,7 +60,7 @@ public class TRANSACTION_MODE
/**
* Creates TRANSACTION_MODE with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reason the explaining message.
+ * @param message the explaining message.
*/
public TRANSACTION_MODE(String message)
{
diff --git a/org/omg/CORBA/TRANSACTION_REQUIRED.java b/org/omg/CORBA/TRANSACTION_REQUIRED.java
index 66eedf4b9..3d6c55c52 100644
--- a/org/omg/CORBA/TRANSACTION_REQUIRED.java
+++ b/org/omg/CORBA/TRANSACTION_REQUIRED.java
@@ -1,5 +1,5 @@
/* TRANSACTION_REQUIRED.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,7 +45,7 @@ import java.io.Serializable;
* active transaction is required.
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class TRANSACTION_REQUIRED
+public final class TRANSACTION_REQUIRED
extends SystemException
implements Serializable
{
@@ -57,7 +57,7 @@ public class TRANSACTION_REQUIRED
/**
* Creates a TRANSACTION_REQUIRED with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public TRANSACTION_REQUIRED(String message)
{
diff --git a/org/omg/CORBA/TRANSACTION_ROLLEDBACK.java b/org/omg/CORBA/TRANSACTION_ROLLEDBACK.java
index ce115c8ac..f7f4aabf2 100644
--- a/org/omg/CORBA/TRANSACTION_ROLLEDBACK.java
+++ b/org/omg/CORBA/TRANSACTION_ROLLEDBACK.java
@@ -1,5 +1,5 @@
/* TRANSACTION_ROLLEDBACK.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,7 +46,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class TRANSACTION_ROLLEDBACK
+public final class TRANSACTION_ROLLEDBACK
extends SystemException
implements Serializable
{
@@ -58,7 +58,7 @@ public class TRANSACTION_ROLLEDBACK
/**
* Creates a TRANSACTION_ROLLEDBACK with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public TRANSACTION_ROLLEDBACK(String message)
{
diff --git a/org/omg/CORBA/TRANSACTION_UNAVAILABLE.java b/org/omg/CORBA/TRANSACTION_UNAVAILABLE.java
index dc808a23c..13ce17ebe 100644
--- a/org/omg/CORBA/TRANSACTION_UNAVAILABLE.java
+++ b/org/omg/CORBA/TRANSACTION_UNAVAILABLE.java
@@ -1,5 +1,5 @@
/* TRANSACTION_UNAVAILABLE.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class TRANSACTION_UNAVAILABLE
+public final class TRANSACTION_UNAVAILABLE
extends SystemException
implements Serializable
{
@@ -60,7 +60,7 @@ public class TRANSACTION_UNAVAILABLE
/**
* Creates TRANSACTION_UNAVAILABLE with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reason the explaining message.
+ * @param message the explaining message.
*/
public TRANSACTION_UNAVAILABLE(String message)
{
diff --git a/org/omg/CORBA/TRANSIENT.java b/org/omg/CORBA/TRANSIENT.java
index c2aa5cb31..1dad9a1c4 100644
--- a/org/omg/CORBA/TRANSIENT.java
+++ b/org/omg/CORBA/TRANSIENT.java
@@ -1,5 +1,5 @@
/* TRANSIENT.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,14 +46,14 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class TRANSIENT
+public final class TRANSIENT
extends SystemException
implements Serializable
{
/**
* Creates a TRANSIENT with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public TRANSIENT(String message)
{
diff --git a/org/omg/CORBA/TypeCodeHolder.java b/org/omg/CORBA/TypeCodeHolder.java
index bb293376d..0a3c4e370 100644
--- a/org/omg/CORBA/TypeCodeHolder.java
+++ b/org/omg/CORBA/TypeCodeHolder.java
@@ -1,5 +1,5 @@
/* TypeCodeHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -51,7 +51,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class TypeCodeHolder
+public final class TypeCodeHolder
implements Streamable
{
/**
@@ -87,7 +87,7 @@ public class TypeCodeHolder
}
/**
- * Fill in the {@link value } field by reading the required data
+ * Fill in the {@link #value} field by reading the required data
* from the given stream. For <code>TypeCode</code>, the functionality
* is delegated to
* {@link org.omg.CORBA.portable.InputStream#read_TypeCode}.
@@ -109,7 +109,7 @@ public class TypeCodeHolder
}
/**
- * Write the {@link value } field to the given stream.
+ * Write the {@link #value} field to the given stream.
* For <code>TypeCode</code>, the functionality
* is delegated to
* {@link org.omg.CORBA.portable.OutputStream#write_TypeCode(TypeCode) }.
diff --git a/org/omg/CORBA/UNKNOWN.java b/org/omg/CORBA/UNKNOWN.java
index 60d3fc0b5..37b627aa3 100644
--- a/org/omg/CORBA/UNKNOWN.java
+++ b/org/omg/CORBA/UNKNOWN.java
@@ -1,5 +1,5 @@
/* UNKNOWN.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -44,7 +44,7 @@ import java.io.Serializable;
* Means that the operation implementation has thrown a non-CORBA exception.
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class UNKNOWN
+public final class UNKNOWN
extends SystemException
implements Serializable
{
@@ -56,7 +56,7 @@ public class UNKNOWN
/**
* Creates a UNKNOWN with the default minor code of 0,
* completion state COMPLETED_NO and the given explaining message.
- * @param reasom the explaining message.
+ * @param message the explaining message.
*/
public UNKNOWN(String message)
{
diff --git a/org/omg/CORBA/UnionMember.java b/org/omg/CORBA/UnionMember.java
index 41afeb7da..69e424cdb 100644
--- a/org/omg/CORBA/UnionMember.java
+++ b/org/omg/CORBA/UnionMember.java
@@ -1,5 +1,5 @@
/* UnionMember.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.IDLEntity;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class UnionMember
+public final class UnionMember
implements IDLEntity, Serializable
{
/**
@@ -87,6 +87,7 @@ public class UnionMember
* Creates a union member.
*
* @param a_name member name.
+ * @param a_label member label.
* @param a_type member type code.
* @param a_type_def member IDL type definition.
*/
diff --git a/org/omg/CORBA/UnknownUserException.java b/org/omg/CORBA/UnknownUserException.java
index 19efc0e3f..3b33ffd33 100644
--- a/org/omg/CORBA/UnknownUserException.java
+++ b/org/omg/CORBA/UnknownUserException.java
@@ -1,5 +1,5 @@
/* UnknownUserException.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,11 +47,11 @@ import java.io.Serializable;
* on remote side and returned by the server. The instance of this
* class is returned by {@link Request#env()}.
*
- * @see Environment#exception().
+ * @see Environment#exception()
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class UnknownUserException
+public final class UnknownUserException
extends UserException
implements IDLEntity, Serializable
{
diff --git a/org/omg/CORBA/UnknownUserExceptionHolder.java b/org/omg/CORBA/UnknownUserExceptionHolder.java
index d7b1ca006..0fa966982 100644
--- a/org/omg/CORBA/UnknownUserExceptionHolder.java
+++ b/org/omg/CORBA/UnknownUserExceptionHolder.java
@@ -1,5 +1,5 @@
/* UnknownUserExceptionHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,7 @@ import org.omg.CORBA.portable.Streamable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class UnknownUserExceptionHolder implements Streamable
+public final class UnknownUserExceptionHolder implements Streamable
{
/**
* The stored UnknownUserException value.
@@ -74,7 +74,7 @@ public class UnknownUserExceptionHolder implements Streamable
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/CORBA/UserException.java b/org/omg/CORBA/UserException.java
index ac9b9fb3d..edbd76e86 100644
--- a/org/omg/CORBA/UserException.java
+++ b/org/omg/CORBA/UserException.java
@@ -1,5 +1,5 @@
/* UserException.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,7 +46,7 @@ import org.omg.CORBA.portable.IDLEntity;
* The root class for CORBA IDL-defined user exceptions.
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class UserException
+public abstract class UserException
extends Exception
implements IDLEntity, Serializable
{
@@ -59,7 +59,7 @@ public class UserException
/**
* Constructs a the exception.
*/
- public UserException()
+ protected UserException()
{
}
@@ -67,7 +67,7 @@ public class UserException
* Constructs the exception, explaining the reason of throwing it.
* @param reason a string, explaining, why the exception has been thrown.
*/
- public UserException(String reason)
+ protected UserException(String reason)
{
super(reason);
}
diff --git a/org/omg/CORBA/ValueMember.java b/org/omg/CORBA/ValueMember.java
index f6bb70d3c..9323c86f9 100644
--- a/org/omg/CORBA/ValueMember.java
+++ b/org/omg/CORBA/ValueMember.java
@@ -1,5 +1,5 @@
/* ValueMember.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
-public class ValueMember
+public final class ValueMember
implements Serializable, IDLEntity
{
/**
diff --git a/org/omg/CORBA/WrongTransactionHolder.java b/org/omg/CORBA/WrongTransactionHolder.java
index 103724f81..1ea3e025f 100644
--- a/org/omg/CORBA/WrongTransactionHolder.java
+++ b/org/omg/CORBA/WrongTransactionHolder.java
@@ -1,5 +1,5 @@
/* WrongTransactionHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class WrongTransactionHolder implements Streamable
+public final class WrongTransactionHolder implements Streamable
{
/**
* The stored WrongTransaction value.
@@ -74,7 +74,7 @@ public class WrongTransactionHolder implements Streamable
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/CosNaming/NamingContextOperations.java b/org/omg/CosNaming/NamingContextOperations.java
index dc25daaa3..cc93cb7ba 100644
--- a/org/omg/CosNaming/NamingContextOperations.java
+++ b/org/omg/CosNaming/NamingContextOperations.java
@@ -1,5 +1,5 @@
/* NamingContext.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,7 +38,6 @@ exception statement from your version. */
package org.omg.CosNaming;
-import org.omg.CORBA.portable.IDLEntity;
import org.omg.CosNaming.NamingContextPackage.AlreadyBound;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.InvalidName;
@@ -55,7 +54,6 @@ import org.omg.CosNaming.NamingContextPackage.NotFound;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public interface NamingContextOperations
- extends IDLEntity
{
/**
* Gives the object a name, valid in this context.
diff --git a/org/omg/CosNaming/_BindingIteratorStub.java b/org/omg/CosNaming/_BindingIteratorStub.java
index 487b2efe3..b5400c4a1 100644
--- a/org/omg/CosNaming/_BindingIteratorStub.java
+++ b/org/omg/CosNaming/_BindingIteratorStub.java
@@ -1,5 +1,5 @@
/* _BindingIteratorStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -77,7 +77,7 @@ public class _BindingIteratorStub
/**
* Create the stub that used the given delegate.
*/
- public _BindingIteratorStub(Delegate delegate)
+ _BindingIteratorStub(Delegate delegate)
{
super();
_set_delegate(delegate);
diff --git a/org/omg/CosNaming/_NamingContextExtStub.java b/org/omg/CosNaming/_NamingContextExtStub.java
index a0bc80ac0..067b3cf3c 100644
--- a/org/omg/CosNaming/_NamingContextExtStub.java
+++ b/org/omg/CosNaming/_NamingContextExtStub.java
@@ -1,5 +1,5 @@
/* _NamingContextExtStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -99,7 +99,7 @@ public class _NamingContextExtStub
/**
* Create the naming context stub with the given delegate.
*/
- public _NamingContextExtStub(Delegate delegate)
+ _NamingContextExtStub(Delegate delegate)
{
super(delegate);
}
diff --git a/org/omg/CosNaming/_NamingContextStub.java b/org/omg/CosNaming/_NamingContextStub.java
index d561aeb48..2b21e71b6 100644
--- a/org/omg/CosNaming/_NamingContextStub.java
+++ b/org/omg/CosNaming/_NamingContextStub.java
@@ -1,5 +1,5 @@
/* _NamingContextStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,7 +39,6 @@ exception statement from your version. */
package org.omg.CosNaming;
import org.omg.CORBA.MARSHAL;
-import org.omg.CORBA.ORB;
import org.omg.CORBA.ObjectHelper;
import org.omg.CORBA.portable.ApplicationException;
import org.omg.CORBA.portable.Delegate;
@@ -85,7 +84,7 @@ public class _NamingContextStub
/**
* Create the naming context stub with the given delegate.
*/
- public _NamingContextStub(Delegate delegate)
+ _NamingContextStub(Delegate delegate)
{
super();
_set_delegate(delegate);
@@ -415,7 +414,7 @@ public class _NamingContextStub
* @throws NotFound if the id matches.
* @throws MARSHAL if the id does not match any of the previous 4 exceptions.
*/
- protected void throw4(InputStream in, String id)
+ void throw4(InputStream in, String id)
throws MARSHAL, InvalidName, CannotProceed, NotFound
{
if (id.equals(NotFoundHelper.id()))
@@ -443,7 +442,7 @@ public class _NamingContextStub
* @throws NotFound if the id matches.
* @throws MARSHAL if the id does not match any of the previous 4 exceptions.
*/
- protected void throw5(InputStream in, String id)
+ void throw5(InputStream in, String id)
throws MARSHAL, AlreadyBound, InvalidName, CannotProceed,
NotFound
{
diff --git a/org/omg/DynamicAny/_DynAnyFactoryStub.java b/org/omg/DynamicAny/_DynAnyFactoryStub.java
index 15f7c816b..d4b569069 100644
--- a/org/omg/DynamicAny/_DynAnyFactoryStub.java
+++ b/org/omg/DynamicAny/_DynAnyFactoryStub.java
@@ -1,5 +1,5 @@
/* _DynAnyFactoryStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -40,20 +40,19 @@ package org.omg.DynamicAny;
import gnu.CORBA.Minor;
+import java.io.Serializable;
+
import org.omg.CORBA.Any;
import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.TypeCode;
-import org.omg.CORBA.portable.Delegate;
import org.omg.CORBA.portable.ObjectImpl;
import org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode;
-import java.io.Serializable;
-
/**
* Should provide support for remote invocation of methods on
* DynAnyFactory. As DynAny can never be remote at least till 1.5 inclusive,
* this class is not in use. DynAnyFactory should be obtained from the
- * {@link ORB#resolve_initial_references}.
+ * {@link org.omg.CORBA.ORB#resolve_initial_references}.
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
@@ -79,14 +78,6 @@ public class _DynAnyFactoryStub
}
/**
- * Create the naming context stub with the given delegate.
- */
- public _DynAnyFactoryStub(Delegate delegate)
- {
- _set_delegate(delegate);
- }
-
- /**
* Return the array of repository ids for this object.
*/
public String[] _ids()
diff --git a/org/omg/DynamicAny/_DynAnyStub.java b/org/omg/DynamicAny/_DynAnyStub.java
index af8d4e5ed..0e3e39058 100644
--- a/org/omg/DynamicAny/_DynAnyStub.java
+++ b/org/omg/DynamicAny/_DynAnyStub.java
@@ -1,5 +1,5 @@
/* _DynAnyStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,16 +38,15 @@ exception statement from your version. */
package org.omg.DynamicAny;
+import java.io.Serializable;
+
import org.omg.CORBA.Any;
import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.TypeCode;
-import org.omg.CORBA.portable.Delegate;
import org.omg.CORBA.portable.ObjectImpl;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
-import java.io.Serializable;
-
/**
* Should provide support for remote invocation of methods on DynAny. As
* DynAny can never be remote at least till 1.5 inclusive, this class is
@@ -77,14 +76,6 @@ public class _DynAnyStub
}
/**
- * Create the naming context stub with the given delegate.
- */
- public _DynAnyStub(Delegate delegate)
- {
- _set_delegate(delegate);
- }
-
- /**
* Return the array of repository ids for this object.
*/
public String[] _ids()
diff --git a/org/omg/DynamicAny/_DynArrayStub.java b/org/omg/DynamicAny/_DynArrayStub.java
index 4484f1655..869e269c3 100644
--- a/org/omg/DynamicAny/_DynArrayStub.java
+++ b/org/omg/DynamicAny/_DynArrayStub.java
@@ -1,5 +1,5 @@
/* _DynArrayStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,14 +38,15 @@ exception statement from your version. */
package org.omg.DynamicAny;
+import java.io.Serializable;
+
import org.omg.CORBA.Any;
import org.omg.CORBA.MARSHAL;
-import org.omg.CORBA.portable.Delegate;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.ObjectImpl;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
-import java.io.Serializable;
-
/**
* Should provide support for remote invocation of methods on DynArray. As
* DynArray can never be remote at least till 1.5 inclusive, this class is
@@ -54,7 +55,7 @@ import java.io.Serializable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class _DynArrayStub
- extends _DynAnyStub
+ extends ObjectImpl
implements DynArray, Serializable
{
/**
@@ -75,14 +76,6 @@ public class _DynArrayStub
}
/**
- * Create the naming context stub with the given delegate.
- */
- public _DynArrayStub(Delegate delegate)
- {
- _set_delegate(delegate);
- }
-
- /**
* Return the array of repository ids for this object.
*/
public String[] _ids()
@@ -131,4 +124,543 @@ public class _DynArrayStub
{
throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
}
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode type()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean next()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void destroy()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny copy()
+ {
+ return this;
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void rewind()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void assign(DynAny _0)
+ throws TypeMismatch
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int component_count()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny current_component()
+ throws TypeMismatch
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean equal(DynAny _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void from_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any get_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean get_boolean()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_char()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public double get_double()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny get_dyn_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public float get_float()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_long()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_longlong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public byte get_octet()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public org.omg.CORBA.Object get_reference()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_short()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_string()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode get_typecode()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_ulong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_ulonglong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_ushort()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Serializable get_val()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_wchar()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_wstring()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_boolean(boolean _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_char(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_double(double _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_dyn_any(DynAny _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_float(float _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_long(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_longlong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_octet(byte _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_reference(org.omg.CORBA.Object _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_short(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_string(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_typecode(TypeCode _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulong(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulonglong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ushort(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_val(Serializable _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wchar(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wstring(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean seek(int _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any to_any()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
} \ No newline at end of file
diff --git a/org/omg/DynamicAny/_DynEnumStub.java b/org/omg/DynamicAny/_DynEnumStub.java
index ea7879be1..73e9fa72d 100644
--- a/org/omg/DynamicAny/_DynEnumStub.java
+++ b/org/omg/DynamicAny/_DynEnumStub.java
@@ -1,5 +1,5 @@
/* _DynEnumStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,11 +38,14 @@ exception statement from your version. */
package org.omg.DynamicAny;
+import java.io.Serializable;
+
+import org.omg.CORBA.Any;
import org.omg.CORBA.MARSHAL;
-import org.omg.CORBA.portable.Delegate;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.ObjectImpl;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
-
-import java.io.Serializable;
+import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
/**
* Should provide support for remote invocation of methods on DynEnum. As
@@ -52,7 +55,7 @@ import java.io.Serializable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class _DynEnumStub
- extends _DynAnyStub
+ extends ObjectImpl
implements DynEnum, Serializable
{
/**
@@ -73,14 +76,6 @@ public class _DynEnumStub
}
/**
- * Create the naming context stub with the given delegate.
- */
- public _DynEnumStub(Delegate delegate)
- {
- _set_delegate(delegate);
- }
-
- /**
* Return the array of repository ids for this object.
*/
public String[] _ids()
@@ -129,4 +124,543 @@ public class _DynEnumStub
{
throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
}
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode type()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean next()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void destroy()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny copy()
+ {
+ return this;
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void rewind()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void assign(DynAny _0)
+ throws TypeMismatch
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int component_count()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny current_component()
+ throws TypeMismatch
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean equal(DynAny _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void from_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any get_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean get_boolean()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_char()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public double get_double()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny get_dyn_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public float get_float()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_long()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_longlong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public byte get_octet()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public org.omg.CORBA.Object get_reference()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_short()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_string()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode get_typecode()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_ulong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_ulonglong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_ushort()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Serializable get_val()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_wchar()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_wstring()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_boolean(boolean _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_char(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_double(double _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_dyn_any(DynAny _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_float(float _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_long(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_longlong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_octet(byte _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_reference(org.omg.CORBA.Object _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_short(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_string(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_typecode(TypeCode _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulong(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulonglong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ushort(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_val(Serializable _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wchar(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wstring(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean seek(int _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any to_any()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
} \ No newline at end of file
diff --git a/org/omg/DynamicAny/_DynFixedStub.java b/org/omg/DynamicAny/_DynFixedStub.java
index 8e2747e4f..97a3d94df 100644
--- a/org/omg/DynamicAny/_DynFixedStub.java
+++ b/org/omg/DynamicAny/_DynFixedStub.java
@@ -1,5 +1,5 @@
/* _DynFixedStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,13 +38,15 @@ exception statement from your version. */
package org.omg.DynamicAny;
+import java.io.Serializable;
+
+import org.omg.CORBA.Any;
import org.omg.CORBA.MARSHAL;
-import org.omg.CORBA.portable.Delegate;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.ObjectImpl;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
-import java.io.Serializable;
-
/**
* Should provide support for remote invocation of methods on DynFixed. As
* DynFixed can never be remote at least till 1.5 inclusive, this class is
@@ -53,7 +55,7 @@ import java.io.Serializable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class _DynFixedStub
- extends _DynAnyStub
+ extends ObjectImpl
implements DynFixed, Serializable
{
/**
@@ -74,14 +76,6 @@ public class _DynFixedStub
}
/**
- * Create the naming context stub with the given delegate.
- */
- public _DynFixedStub(Delegate delegate)
- {
- _set_delegate(delegate);
- }
-
- /**
* Return the array of repository ids for this object.
*/
public String[] _ids()
@@ -109,4 +103,543 @@ public class _DynFixedStub
{
throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
}
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode type()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean next()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void destroy()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny copy()
+ {
+ return this;
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void rewind()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void assign(DynAny _0)
+ throws TypeMismatch
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int component_count()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny current_component()
+ throws TypeMismatch
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean equal(DynAny _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void from_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any get_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean get_boolean()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_char()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public double get_double()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny get_dyn_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public float get_float()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_long()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_longlong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public byte get_octet()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public org.omg.CORBA.Object get_reference()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_short()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_string()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode get_typecode()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_ulong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_ulonglong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_ushort()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Serializable get_val()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_wchar()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_wstring()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_boolean(boolean _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_char(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_double(double _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_dyn_any(DynAny _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_float(float _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_long(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_longlong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_octet(byte _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_reference(org.omg.CORBA.Object _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_short(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_string(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_typecode(TypeCode _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulong(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulonglong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ushort(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_val(Serializable _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wchar(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wstring(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean seek(int _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any to_any()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
} \ No newline at end of file
diff --git a/org/omg/DynamicAny/_DynSequenceStub.java b/org/omg/DynamicAny/_DynSequenceStub.java
index 5f1f038ba..802ff2332 100644
--- a/org/omg/DynamicAny/_DynSequenceStub.java
+++ b/org/omg/DynamicAny/_DynSequenceStub.java
@@ -1,5 +1,5 @@
/* _DynSequenceStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,14 +38,16 @@ exception statement from your version. */
package org.omg.DynamicAny;
+import java.io.Serializable;
+
import org.omg.CORBA.Any;
import org.omg.CORBA.MARSHAL;
+import org.omg.CORBA.TypeCode;
import org.omg.CORBA.portable.Delegate;
+import org.omg.CORBA.portable.ObjectImpl;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
-import java.io.Serializable;
-
/**
* Should provide support for remote invocation of methods on DynSequence. As
* DynSequence can never be remote at least till 1.5 inclusive, this class is
@@ -54,7 +56,7 @@ import java.io.Serializable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class _DynSequenceStub
- extends _DynAnyStub
+ extends ObjectImpl
implements DynSequence, Serializable
{
/**
@@ -77,14 +79,6 @@ public class _DynSequenceStub
}
/**
- * Create the naming context stub with the given delegate.
- */
- public _DynSequenceStub(Delegate delegate)
- {
- _set_delegate(delegate);
- }
-
- /**
* Return the array of repository ids for this object.
*/
public String[] _ids()
@@ -154,4 +148,543 @@ public class _DynSequenceStub
{
throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
}
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode type()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean next()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void destroy()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny copy()
+ {
+ return this;
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void rewind()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void assign(DynAny _0)
+ throws TypeMismatch
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int component_count()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny current_component()
+ throws TypeMismatch
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean equal(DynAny _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void from_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any get_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean get_boolean()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_char()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public double get_double()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny get_dyn_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public float get_float()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_long()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_longlong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public byte get_octet()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public org.omg.CORBA.Object get_reference()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_short()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_string()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode get_typecode()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_ulong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_ulonglong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_ushort()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Serializable get_val()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_wchar()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_wstring()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_boolean(boolean _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_char(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_double(double _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_dyn_any(DynAny _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_float(float _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_long(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_longlong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_octet(byte _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_reference(org.omg.CORBA.Object _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_short(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_string(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_typecode(TypeCode _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulong(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulonglong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ushort(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_val(Serializable _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wchar(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wstring(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean seek(int _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any to_any()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
} \ No newline at end of file
diff --git a/org/omg/DynamicAny/_DynStructStub.java b/org/omg/DynamicAny/_DynStructStub.java
index 0b8231b36..a48f2a633 100644
--- a/org/omg/DynamicAny/_DynStructStub.java
+++ b/org/omg/DynamicAny/_DynStructStub.java
@@ -1,5 +1,5 @@
/* _DynStructStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,14 +38,17 @@ exception statement from your version. */
package org.omg.DynamicAny;
+import java.io.Serializable;
+
+import org.omg.CORBA.Any;
import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.TCKind;
+import org.omg.CORBA.TypeCode;
import org.omg.CORBA.portable.Delegate;
+import org.omg.CORBA.portable.ObjectImpl;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
-import java.io.Serializable;
-
/**
* Should provide support for remote invocation of methods on DynStruct. As
* DynStruct can never be remote at least till 1.5 inclusive, this class is
@@ -54,7 +57,7 @@ import java.io.Serializable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class _DynStructStub
- extends _DynAnyStub
+ extends ObjectImpl
implements DynStruct, Serializable
{
/**
@@ -77,14 +80,6 @@ public class _DynStructStub
}
/**
- * Create the naming context stub with the given delegate.
- */
- public _DynStructStub(Delegate delegate)
- {
- _set_delegate(delegate);
- }
-
- /**
* Return the array of repository ids for this object.
*/
public String[] _ids()
@@ -155,4 +150,543 @@ public class _DynStructStub
{
throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
}
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode type()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean next()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void destroy()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny copy()
+ {
+ return this;
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void rewind()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void assign(DynAny _0)
+ throws TypeMismatch
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int component_count()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny current_component()
+ throws TypeMismatch
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean equal(DynAny _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void from_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any get_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean get_boolean()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_char()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public double get_double()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny get_dyn_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public float get_float()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_long()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_longlong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public byte get_octet()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public org.omg.CORBA.Object get_reference()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_short()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_string()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode get_typecode()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_ulong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_ulonglong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_ushort()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Serializable get_val()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_wchar()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_wstring()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_boolean(boolean _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_char(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_double(double _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_dyn_any(DynAny _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_float(float _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_long(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_longlong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_octet(byte _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_reference(org.omg.CORBA.Object _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_short(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_string(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_typecode(TypeCode _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulong(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulonglong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ushort(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_val(Serializable _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wchar(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wstring(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean seek(int _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any to_any()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
} \ No newline at end of file
diff --git a/org/omg/DynamicAny/_DynUnionStub.java b/org/omg/DynamicAny/_DynUnionStub.java
index 7f8eba778..b7ba74e00 100644
--- a/org/omg/DynamicAny/_DynUnionStub.java
+++ b/org/omg/DynamicAny/_DynUnionStub.java
@@ -1,5 +1,5 @@
/* _DynUnionStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,14 +38,17 @@ exception statement from your version. */
package org.omg.DynamicAny;
+import java.io.Serializable;
+
+import org.omg.CORBA.Any;
import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.TCKind;
+import org.omg.CORBA.TypeCode;
import org.omg.CORBA.portable.Delegate;
+import org.omg.CORBA.portable.ObjectImpl;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
-import java.io.Serializable;
-
/**
* Should provide support for remote invocation of methods on DynUnion. As
* DynUnion can never be remote at least till 1.5 inclusive, this class is
@@ -54,7 +57,7 @@ import java.io.Serializable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class _DynUnionStub
- extends _DynAnyStub
+ extends ObjectImpl
implements DynUnion, Serializable
{
/**
@@ -77,14 +80,6 @@ public class _DynUnionStub
}
/**
- * Create the naming context stub with the given delegate.
- */
- public _DynUnionStub(Delegate delegate)
- {
- _set_delegate(delegate);
- }
-
- /**
* Return the array of repository ids for this object.
*/
public String[] _ids()
@@ -187,4 +182,543 @@ public class _DynUnionStub
{
throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
}
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode type()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean next()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void destroy()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny copy()
+ {
+ return this;
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void rewind()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void assign(DynAny _0)
+ throws TypeMismatch
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int component_count()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny current_component()
+ throws TypeMismatch
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean equal(DynAny _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void from_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any get_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean get_boolean()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_char()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public double get_double()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny get_dyn_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public float get_float()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_long()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_longlong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public byte get_octet()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public org.omg.CORBA.Object get_reference()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_short()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_string()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode get_typecode()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_ulong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_ulonglong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_ushort()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Serializable get_val()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_wchar()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_wstring()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_boolean(boolean _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_char(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_double(double _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_dyn_any(DynAny _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_float(float _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_long(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_longlong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_octet(byte _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_reference(org.omg.CORBA.Object _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_short(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_string(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_typecode(TypeCode _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulong(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulonglong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ushort(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_val(Serializable _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wchar(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wstring(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean seek(int _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any to_any()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
} \ No newline at end of file
diff --git a/org/omg/DynamicAny/_DynValueStub.java b/org/omg/DynamicAny/_DynValueStub.java
index 5319a7b63..5c6b7a209 100644
--- a/org/omg/DynamicAny/_DynValueStub.java
+++ b/org/omg/DynamicAny/_DynValueStub.java
@@ -1,5 +1,5 @@
/* _DynValueStub.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,9 +38,12 @@ exception statement from your version. */
package org.omg.DynamicAny;
+import org.omg.CORBA.Any;
import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.TCKind;
+import org.omg.CORBA.TypeCode;
import org.omg.CORBA.portable.Delegate;
+import org.omg.CORBA.portable.ObjectImpl;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
@@ -54,7 +57,7 @@ import java.io.Serializable;
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class _DynValueStub
- extends _DynAnyStub
+ extends ObjectImpl
implements DynValue, Serializable
{
/**
@@ -70,21 +73,13 @@ public class _DynValueStub
/**
* Create the DynValue stub. To get the stub working,
* you must later set the delegate with
- * {@link ObjectImpl#_set_delegate(Delegate)}.
+ * {@link org.omg.CORBA.portable.ObjectImpl#_set_delegate(Delegate)}.
*/
public _DynValueStub()
{
}
/**
- * Create the naming context stub with the given delegate.
- */
- public _DynValueStub(Delegate delegate)
- {
- _set_delegate(delegate);
- }
-
- /**
* Return the array of repository ids for this object.
*/
public String[] _ids()
@@ -187,4 +182,543 @@ public class _DynValueStub
{
throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
}
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode type()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean next()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void destroy()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny copy()
+ {
+ return this;
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void rewind()
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void assign(DynAny _0)
+ throws TypeMismatch
+ {
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int component_count()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny current_component()
+ throws TypeMismatch
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean equal(DynAny _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void from_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any get_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean get_boolean()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_char()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public double get_double()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public DynAny get_dyn_any()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public float get_float()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_long()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_longlong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public byte get_octet()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public org.omg.CORBA.Object get_reference()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_short()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_string()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public TypeCode get_typecode()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public int get_ulong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public long get_ulonglong()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public short get_ushort()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Serializable get_val()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public char get_wchar()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public String get_wstring()
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_any(Any _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_boolean(boolean _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_char(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_double(double _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_dyn_any(DynAny _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_float(float _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_long(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_longlong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_octet(byte _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_reference(org.omg.CORBA.Object _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_short(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_string(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_typecode(TypeCode _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulong(int _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ulonglong(long _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_ushort(short _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_val(Serializable _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wchar(char _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public void insert_wstring(String _0)
+ throws TypeMismatch, InvalidValue
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public boolean seek(int _0)
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
+ /**
+ * The remote call of DynAny methods is not possible.
+ *
+ * @throws MARSHAL, always.
+ */
+ public Any to_any()
+ {
+ throw new MARSHAL(_DynAnyStub.NOT_APPLICABLE);
+ }
+
} \ No newline at end of file
diff --git a/org/omg/IOP/CodecFactoryPackage/UnknownEncoding.java b/org/omg/IOP/CodecFactoryPackage/UnknownEncoding.java
index 08f8ac4df..c1988bfd0 100644
--- a/org/omg/IOP/CodecFactoryPackage/UnknownEncoding.java
+++ b/org/omg/IOP/CodecFactoryPackage/UnknownEncoding.java
@@ -1,5 +1,5 @@
/* UnknownEncoding.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -50,7 +50,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithiania (AudriusA@Bioinformatics.org)
*/
-public class UnknownEncoding
+public final class UnknownEncoding
extends UserException
implements IDLEntity, Serializable
{
diff --git a/org/omg/IOP/CodecPackage/FormatMismatch.java b/org/omg/IOP/CodecPackage/FormatMismatch.java
index c82c4899f..b4cb13666 100644
--- a/org/omg/IOP/CodecPackage/FormatMismatch.java
+++ b/org/omg/IOP/CodecPackage/FormatMismatch.java
@@ -1,5 +1,5 @@
/* FormatMismatch.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -52,7 +52,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithiania (AudriusA@Bioinformatics.org)
*/
-public class FormatMismatch
+public final class FormatMismatch
extends UserException
implements IDLEntity, Serializable
{
diff --git a/org/omg/IOP/CodecPackage/InvalidTypeForEncoding.java b/org/omg/IOP/CodecPackage/InvalidTypeForEncoding.java
index 4099f58bd..5a23fdccd 100644
--- a/org/omg/IOP/CodecPackage/InvalidTypeForEncoding.java
+++ b/org/omg/IOP/CodecPackage/InvalidTypeForEncoding.java
@@ -1,5 +1,5 @@
/* InvalidTypeForEncoding.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -53,7 +53,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithiania (AudriusA@Bioinformatics.org)
*/
-public class InvalidTypeForEncoding
+public final class InvalidTypeForEncoding
extends UserException
implements IDLEntity, Serializable
{
diff --git a/org/omg/IOP/CodecPackage/TypeMismatch.java b/org/omg/IOP/CodecPackage/TypeMismatch.java
index c4a53b659..7751c3eb6 100644
--- a/org/omg/IOP/CodecPackage/TypeMismatch.java
+++ b/org/omg/IOP/CodecPackage/TypeMismatch.java
@@ -1,5 +1,5 @@
/* TypeMismatch.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -50,7 +50,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithiania (AudriusA@Bioinformatics.org)
*/
-public class TypeMismatch
+public final class TypeMismatch
extends UserException
implements IDLEntity, Serializable
{
diff --git a/org/omg/IOP/Encoding.java b/org/omg/IOP/Encoding.java
index 5b36f646f..cbf1e9e40 100644
--- a/org/omg/IOP/Encoding.java
+++ b/org/omg/IOP/Encoding.java
@@ -1,5 +1,5 @@
/* Encoding.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -50,7 +50,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class Encoding
+public final class Encoding
implements IDLEntity, Serializable
{
/**
diff --git a/org/omg/IOP/IOR.java b/org/omg/IOP/IOR.java
index 7ff6dc1eb..12c47a1ca 100644
--- a/org/omg/IOP/IOR.java
+++ b/org/omg/IOP/IOR.java
@@ -1,5 +1,5 @@
/* IOR.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -51,9 +51,10 @@ import java.io.Serializable;
* for the same object or indicate that the object is equal to null.
* </p><p>
* The IOR is a standard structure, transferred when sending an object with
- * {@link org.omg.CORBA.portable.OutputStream#write_Object} and receiving with
- * {@link org.omg.CORBA.portable.InputStream#read_Object}. The stringified
- * object references, managed by {@link org.omg.CORBA.ORB#string_to_object}
+ * {@link org.omg.CORBA.portable.OutputStream#write_Object(org.omg.CORBA.Object)}
+ * and receiving with {@link org.omg.CORBA.portable.InputStream#read_Object()}.
+ * The stringified object references, managed by
+ * {@link org.omg.CORBA.ORB#string_to_object}
* and {@link org.omg.CORBA.ORB#object_to_string} are also IORs, where the
* initially binary data are encoded as strings using hexadecimal notation.
* </p><p>
@@ -67,7 +68,7 @@ import java.io.Serializable;
* gnu.CORBA.IOR. The reason is that IORs are required from 1.2, but only
* in 1.4 the associated classes appear in the public API.
*/
-public class IOR
+public final class IOR
implements IDLEntity, Serializable
{
/**
diff --git a/org/omg/IOP/IORHolder.java b/org/omg/IOP/IORHolder.java
index cdf0d74d5..144c7993a 100644
--- a/org/omg/IOP/IORHolder.java
+++ b/org/omg/IOP/IORHolder.java
@@ -1,5 +1,5 @@
/* IORHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class IORHolder
+public final class IORHolder
implements Streamable
{
/**
@@ -74,7 +74,7 @@ public class IORHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/IOP/MultipleComponentProfileHolder.java b/org/omg/IOP/MultipleComponentProfileHolder.java
index ee9652282..2be0e714b 100644
--- a/org/omg/IOP/MultipleComponentProfileHolder.java
+++ b/org/omg/IOP/MultipleComponentProfileHolder.java
@@ -1,5 +1,5 @@
/* MultipleComponentProfileHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -45,11 +45,11 @@ import org.omg.CORBA.portable.OutputStream;
/**
* A holder for the sequence of {@link TaggedComponent}
- * ({@link MultipleComponentProfile}).
+ * ({@link org.omg.IOP.MultipleComponentProfileHelper}).
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class MultipleComponentProfileHolder
+public final class MultipleComponentProfileHolder
implements Streamable
{
/**
@@ -76,7 +76,7 @@ public class MultipleComponentProfileHolder
}
/**
- * Read the {@link value} array from the CDR stream.
+ * Read the {@link #value} array from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/IOP/ServiceContextHolder.java b/org/omg/IOP/ServiceContextHolder.java
index 28dcb3ea5..1b9896d03 100644
--- a/org/omg/IOP/ServiceContextHolder.java
+++ b/org/omg/IOP/ServiceContextHolder.java
@@ -1,5 +1,5 @@
/* ServiceContextHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class ServiceContextHolder
+public final class ServiceContextHolder
implements Streamable
{
/**
@@ -74,7 +74,7 @@ public class ServiceContextHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/IOP/ServiceContextListHolder.java b/org/omg/IOP/ServiceContextListHolder.java
index 2a186101d..95fd091df 100644
--- a/org/omg/IOP/ServiceContextListHolder.java
+++ b/org/omg/IOP/ServiceContextListHolder.java
@@ -1,5 +1,5 @@
/* ServiceContextListHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class ServiceContextListHolder
+public final class ServiceContextListHolder
implements Streamable
{
/**
@@ -74,7 +74,7 @@ public class ServiceContextListHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/IOP/TaggedComponent.java b/org/omg/IOP/TaggedComponent.java
index b8aa17f2d..66437e701 100644
--- a/org/omg/IOP/TaggedComponent.java
+++ b/org/omg/IOP/TaggedComponent.java
@@ -1,5 +1,5 @@
/* TaggedComponent.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -56,7 +56,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class TaggedComponent
+public final class TaggedComponent
implements IDLEntity, Serializable
{
/**
diff --git a/org/omg/IOP/TaggedComponentHolder.java b/org/omg/IOP/TaggedComponentHolder.java
index 28df24f11..b233591f2 100644
--- a/org/omg/IOP/TaggedComponentHolder.java
+++ b/org/omg/IOP/TaggedComponentHolder.java
@@ -1,5 +1,5 @@
/* TaggedComponentHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.OutputStream;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class TaggedComponentHolder
+public final class TaggedComponentHolder
implements Streamable
{
/**
@@ -74,7 +74,7 @@ public class TaggedComponentHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/IOP/TaggedProfile.java b/org/omg/IOP/TaggedProfile.java
index 66494fdb4..669b73a59 100644
--- a/org/omg/IOP/TaggedProfile.java
+++ b/org/omg/IOP/TaggedProfile.java
@@ -1,5 +1,5 @@
/* TaggedProfile.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -72,7 +72,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class TaggedProfile
+public final class TaggedProfile
implements IDLEntity, Serializable
{
/**
diff --git a/org/omg/IOP/TaggedProfileHolder.java b/org/omg/IOP/TaggedProfileHolder.java
index 7edb1d46b..f739097e3 100644
--- a/org/omg/IOP/TaggedProfileHolder.java
+++ b/org/omg/IOP/TaggedProfileHolder.java
@@ -1,5 +1,5 @@
/* TaggedProfileHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class TaggedProfileHolder
+public final class TaggedProfileHolder
implements Streamable
{
/**
@@ -74,7 +74,7 @@ public class TaggedProfileHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/Messaging/SyncScopeHelper.java b/org/omg/Messaging/SyncScopeHelper.java
index 1d482c579..f716edfaf 100644
--- a/org/omg/Messaging/SyncScopeHelper.java
+++ b/org/omg/Messaging/SyncScopeHelper.java
@@ -1,5 +1,5 @@
/* SyncScopeHelper.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -55,15 +55,11 @@ import org.omg.CORBA.portable.OutputStream;
*
* @see SYNC_WITH_TRANSPORT
*/
-public class SyncScopeHelper
+public abstract class SyncScopeHelper
{
- /**
- * A cached typecode value, computed only once.
- */
- private static TypeCode typecode;
/**
- * Delegates call to {@link Any.extract_short()}.
+ * Delegates call to {@link Any#extract_short()}.
*/
public static short extract(Any a)
{
@@ -81,7 +77,7 @@ public class SyncScopeHelper
}
/**
- * Delegates call to {@link Any.insert_short(short)}.
+ * Delegates call to {@link Any#insert_short(short)}.
*/
public static void insert(Any a, short that)
{
@@ -89,7 +85,7 @@ public class SyncScopeHelper
}
/**
- * Delegates call to {@link InputStream.read_short()}.
+ * Delegates call to {@link InputStream#read_short()}.
*/
public static short read(InputStream istream)
{
@@ -112,7 +108,7 @@ public class SyncScopeHelper
}
/**
- * Delegates call to {@link OutputStream.write_short()}.
+ * Delegates call to {@link OutputStream#write_short(short)}.
*/
public static void write(OutputStream ostream, short value)
{
diff --git a/org/omg/PortableInterceptor/ForwardRequest.java b/org/omg/PortableInterceptor/ForwardRequest.java
index 7e7d7a3f4..7202f2344 100644
--- a/org/omg/PortableInterceptor/ForwardRequest.java
+++ b/org/omg/PortableInterceptor/ForwardRequest.java
@@ -1,5 +1,5 @@
/* ForwardRequest.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -50,7 +50,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class ForwardRequest extends UserException implements IDLEntity,
+public final class ForwardRequest extends UserException implements IDLEntity,
Serializable
{
/**
diff --git a/org/omg/PortableInterceptor/IORInterceptor_3_0Holder.java b/org/omg/PortableInterceptor/IORInterceptor_3_0Holder.java
index dc7ecf23f..f4830a2e1 100644
--- a/org/omg/PortableInterceptor/IORInterceptor_3_0Holder.java
+++ b/org/omg/PortableInterceptor/IORInterceptor_3_0Holder.java
@@ -1,5 +1,5 @@
/* IORInterceptor_3_0Holder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -49,7 +49,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class IORInterceptor_3_0Holder
+public final class IORInterceptor_3_0Holder
implements Streamable
{
/**
@@ -77,7 +77,7 @@ public class IORInterceptor_3_0Holder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/PortableInterceptor/InvalidSlot.java b/org/omg/PortableInterceptor/InvalidSlot.java
index 72805cf72..30cb1a1dc 100644
--- a/org/omg/PortableInterceptor/InvalidSlot.java
+++ b/org/omg/PortableInterceptor/InvalidSlot.java
@@ -1,5 +1,5 @@
/* InvalidSlot.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -49,7 +49,7 @@ import java.io.Serializable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class InvalidSlot extends UserException implements IDLEntity,
+public final class InvalidSlot extends UserException implements IDLEntity,
Serializable
{
/**
diff --git a/org/omg/PortableInterceptor/ObjectReferenceFactory.java b/org/omg/PortableInterceptor/ObjectReferenceFactory.java
index 55cde585c..83f3da652 100644
--- a/org/omg/PortableInterceptor/ObjectReferenceFactory.java
+++ b/org/omg/PortableInterceptor/ObjectReferenceFactory.java
@@ -1,5 +1,5 @@
/* ObjectReferenceFactory.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,20 +38,38 @@ exception statement from your version. */
package org.omg.PortableInterceptor;
+import org.omg.CORBA.Object;
import org.omg.CORBA.portable.IDLEntity;
+import org.omg.CORBA.portable.ValueBase;
/**
* Provides the possibility to create the CORBA object reference.
* The reference is created from repository id (defining the type of the
* object) and the object id (defining the identity of the object).
- * The operation for creating reference is defined separately in
- * {@link ObjectReferenceFactoryOperations}.
*
* @since 1.5
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public interface ObjectReferenceFactory
- extends ObjectReferenceFactoryOperations, IDLEntity
+ extends ValueBase, IDLEntity
{
+ /**
+ * Create an object with the given repository and object ids. This interface
+ * does not specify where and how the returned object must be connected and
+ * activated. The derived {@link ObjectReferenceTemplate} interface assumes
+ * the object must be connected to the POA that is specific to that
+ * template (name can be obtained).
+ *
+ * If the object with this objectId already exists in the given context, it
+ * is found and returned; a new object is <i>not</i> created.
+ *
+ * @param repositoryId the repository id of the object being created, defines
+ * the type of the object.
+ *
+ * @param objectId the byte array, defining the identity of the object.
+ *
+ * @return The created corba object.
+ */
+ Object make_object(String repositoryId, byte[] objectId);
} \ No newline at end of file
diff --git a/org/omg/PortableInterceptor/ObjectReferenceFactoryHolder.java b/org/omg/PortableInterceptor/ObjectReferenceFactoryHolder.java
index fc68ec5c1..c662977a2 100644
--- a/org/omg/PortableInterceptor/ObjectReferenceFactoryHolder.java
+++ b/org/omg/PortableInterceptor/ObjectReferenceFactoryHolder.java
@@ -1,5 +1,5 @@
/* ObjectReferenceFactoryHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -49,7 +49,7 @@ import org.omg.CORBA.portable.Streamable;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class ObjectReferenceFactoryHolder
+public final class ObjectReferenceFactoryHolder
implements Streamable
{
/**
@@ -76,7 +76,7 @@ public class ObjectReferenceFactoryHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/PortableInterceptor/ObjectReferenceTemplateHolder.java b/org/omg/PortableInterceptor/ObjectReferenceTemplateHolder.java
index 9658e1fa7..d76ef43f1 100644
--- a/org/omg/PortableInterceptor/ObjectReferenceTemplateHolder.java
+++ b/org/omg/PortableInterceptor/ObjectReferenceTemplateHolder.java
@@ -1,5 +1,5 @@
/* ObjectReferenceTemplateHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.OutputStream;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class ObjectReferenceTemplateHolder
+public final class ObjectReferenceTemplateHolder
implements Streamable
{
/**
@@ -74,7 +74,7 @@ public class ObjectReferenceTemplateHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.java b/org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.java
index d16f5cedd..3fdc2bfe8 100644
--- a/org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.java
+++ b/org/omg/PortableInterceptor/ObjectReferenceTemplateSeqHolder.java
@@ -1,5 +1,5 @@
/* ObjectReferenceTemplateSeqHolder.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@ import org.omg.CORBA.portable.OutputStream;
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
-public class ObjectReferenceTemplateSeqHolder
+public final class ObjectReferenceTemplateSeqHolder
implements Streamable
{
/**
@@ -75,7 +75,7 @@ public class ObjectReferenceTemplateSeqHolder
}
/**
- * Fill in the {@link value} by data from the CDR stream.
+ * Fill in the {@link #value} by data from the CDR stream.
*
* @param input the org.omg.CORBA.portable stream to read.
*/
diff --git a/org/omg/PortableServer/ServantActivatorPOA.java b/org/omg/PortableServer/ServantActivatorPOA.java
index 94e5b47ba..c94866ab2 100644
--- a/org/omg/PortableServer/ServantActivatorPOA.java
+++ b/org/omg/PortableServer/ServantActivatorPOA.java
@@ -98,42 +98,6 @@ public abstract class ServantActivatorPOA
}
/**
- * It is your responsibility to handle the incarnation event and
- * supply the servant.
- * The default method instructs POA that the servant cannot be
- * provided by activator. The OBJ_ADAPTER exception will be
- * thrown by POA, unless the servant is provided as one of the
- * parameters in the activation method, or the default servant is set.
- *
- * @see ServantActivatorOperations#incarnate
- *
- * @specnote in GNU Classpath, returning null means that the
- * activator does not supply the servant. The servant can still be supplied
- * as one of parameters in some POA activation methods or as a default
- * servant.
- *
- * @throws ForwardRequest
- */
- public Servant incarnate(byte[] Object_Id, POA poa)
- throws ForwardRequest
- {
- return null;
- }
-
- /**
- * It is your responsibility to handle the etherialization event.
- * Override this method if using the class. The default method
- * does nothing.
- *
- * @see ServantActivatorOperations#incarnate
- */
- public void etherealize(byte[] Object_Id, POA poa, Servant servant,
- boolean cleanup, boolean remains
- )
- {
- }
-
- /**
* Our implementation will not call this method. After setting your
* manager to POA, it will call incarnate and etherialize directly.
*/
diff --git a/org/omg/PortableServer/ServantLocatorPOA.java b/org/omg/PortableServer/ServantLocatorPOA.java
index ef3f743d2..8e9c7aeb5 100644
--- a/org/omg/PortableServer/ServantLocatorPOA.java
+++ b/org/omg/PortableServer/ServantLocatorPOA.java
@@ -74,40 +74,6 @@ public abstract class ServantLocatorPOA
final ServantLocatorPOA THIS = this;
/**
- * It is your responsibility to take the preinvoke actions, if any,
- * and also supply an appropriate servant for the current invocation.
- *
- * The default method instructs POA that the servant cannot be
- * provided by locator. The OBJ_ADAPTER exception will be
- * thrown by POA, unless it uses the available default servant for all
- * invocations.
- *
- * @specnote in GNU Classpath, returning null means that the
- * locator does not supply the servant.
- *
- * @see ServantLocatorOperations#preinvoke
- */
- public Servant preinvoke(byte[] Object_Id, POA poa, String method,
- CookieHolder cookie_holder
- )
- throws org.omg.PortableServer.ForwardRequest
- {
- return null;
- }
-
- /**
- * It is your responsibility to take the postinvoke actions, if any,
- * by overriding this method. The default method does nothing.
- *
- * @see ServantLocatorOperations#postinvoke
- */
- public void postinvoke(byte[] Object_Id, POA poa, String method,
- java.lang.Object cookie, Servant servant
- )
- {
- }
-
- /**
* Our implementation will not call this method. After setting your
* manager to POA, it will call incarnate and etherialize directly.
*/
diff --git a/resource/gnu/classpath/tools/appletviewer/MessagesBundle.properties b/resource/gnu/classpath/tools/appletviewer/MessagesBundle.properties
new file mode 100644
index 000000000..b2365a8d7
--- /dev/null
+++ b/resource/gnu/classpath/tools/appletviewer/MessagesBundle.properties
@@ -0,0 +1,71 @@
+/* MessagesBundle.properties -- English language messages
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+gcjwebplugin.code_description= Code attribute
+gcjwebplugin.codebase_description= Codebase attribute
+gcjwebplugin.archive_description= Archive attribute
+gcjwebplugin.param_description= Parameter arguments
+gcjwebplugin.width_description= Width attribute
+gcjwebplugin.height_description= Height attribute
+gcjwebplugin.plugin_description= Enable plugin mode
+gcjwebplugin.verbose_description= Enable verbose mode
+gcjwebplugin.debug_description= For appletviewer compatibility
+gcjwebplugin.encoding_description= Specify character encoding used by HTML files
+gcjwebplugin.j_description= Pass argument to the Java runtime
+
+gcjwebplugin.no_input_files=appletviewer: no input files
+
+gcjwebplugin.menu_title=Applet
+gcjwebplugin.menu_reload=Reload
+gcjwebplugin.menu_restart=Restart
+gcjwebplugin.menu_start=Start
+gcjwebplugin.menu_stop=Stop
+gcjwebplugin.menu_clone=Clone ...
+gcjwebplugin.menu_quit=Quit
+gcjwebplugin.menu_close=Close
+gcjwebplugin.menu_tag=Tag ...
+gcjwebplugin.menu_info=Info ...
+gcjwebplugin.menu_edit=Edit
+gcjwebplugin.menu_encoding=Character Encoding
+gcjwebplugin.menu_print=Print ...
+gcjwebplugin.menu_properties=Properties ...
+gcjwebplugin.menu_cancel=Cancel
+gcjwebplugin.menu_save=Save ...
+
+gcjwebplugin.console_title=GCJ web plugin console
+gcjwebplugin.console_clear=Clear
+gcjwebplugin.console_hide=Hide
diff --git a/resource/gnu/classpath/tools/appletviewer/MessagesBundle_de.properties b/resource/gnu/classpath/tools/appletviewer/MessagesBundle_de.properties
new file mode 100644
index 000000000..fc61ecc5b
--- /dev/null
+++ b/resource/gnu/classpath/tools/appletviewer/MessagesBundle_de.properties
@@ -0,0 +1,75 @@
+/* MessagesBundle_de.properties -- German language messages
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+/* FIXME: rewrite this */
+gcjwebplugin.help.0=Syntax: appletviewer [Optionen] <Dateiname>.class | <Dateiname>.html... | URL...
+gcjwebplugin.help.1=Optionen:
+gcjwebplugin.help.2= --help Diese Hilfe anzeigen and beenden
+gcjwebplugin.help.3= --version Version anzeigen und beenden
+gcjwebplugin.help.4= --code=<Klassenname>[.class] Applet mit Klassen- oder Dateiname ausführen
+gcjwebplugin.help.5= --codebase=<Verzeichnis> Applet-Codebasis setzen
+gcjwebplugin.help.6= --archive=<Dateiname>.jar[,...] Archive zum Klassenlader hinzufügen
+gcjwebplugin.help.7= --param=<Name>,<Wert> Parameter an Applet übergeben
+gcjwebplugin.help.8= --width=<Breite> Setze Breite des Appletfensters
+gcjwebplugin.help.9= --height=<Höhe> Setze Höhe des Appletfensters
+gcjwebplugin.help.10= --plugin=<Eingabepipe>,<Ausgabepipe> Pluginmodus einschalten
+gcjwebplugin.help.11= -debug Starten des Applet-Viewers im Java-Debugger (nicht implementiert)
+gcjwebplugin.help.12= -encoding <Codierung> Angabe der von HTML-Dateien verwendeten Zeichencodierung
+gcjwebplugin.help.13= -J<Laufzeit-Flag> Übergeben des Arguments an den Java-Interpreter
+
+gcjwebplugin.no_input_files=appletviewer: keine Dateien angegeben
+
+gcjwebplugin.menu_title=Applet
+gcjwebplugin.menu_reload=Neu laden
+gcjwebplugin.menu_restart=Neu starten
+gcjwebplugin.menu_start=Start
+gcjwebplugin.menu_stop=Stop
+gcjwebplugin.menu_clone=Klonen ...
+gcjwebplugin.menu_quit=Beenden
+gcjwebplugin.menu_tag=Tag ...
+gcjwebplugin.menu_info=Informationen ...
+gcjwebplugin.menu_edit=Bearbeiten
+gcjwebplugin.menu_encoding=Zeichenkodierung
+gcjwebplugin.menu_print=Drucken ...
+gcjwebplugin.menu_properties=Eigenschaften ...
+gcjwebplugin.menu_close=Schließen
+gcjwebplugin.menu_cancel=Abbrechen
+gcjwebplugin.menu_save=Speichern unter ...
+
+gcjwebplugin.console_title=GCJ web plugin Konsole
+gcjwebplugin.console_clear=Löschen
+gcjwebplugin.console_hide=Schließen
diff --git a/resource/gnu/classpath/tools/jarsigner/MessageBundle.properties b/resource/gnu/classpath/tools/jarsigner/MessageBundle.properties
new file mode 100644
index 000000000..902166d5f
--- /dev/null
+++ b/resource/gnu/classpath/tools/jarsigner/MessageBundle.properties
@@ -0,0 +1,33 @@
+# default locale messages for gnu.classpath.tools.jarsigner package
+
+Main.7=jarsigner:
+Main.9=jarsigner error:
+Main.70=JAR file [{0}] is NOT a file object
+Main.72=JAR file [{0}] is NOT readable
+#Main.85=Option '-keystore' is not defined or is an empty string, and 'user.home' is unknown
+Main.85=Unable to locate a valid key store
+Main.92=Enter key store password:
+Main.6=Designated alias [{0}] MUST be known to the key store in use
+Main.95=Designated alias [{0}] MUST be an Alias of a Key Entry
+Main.97=Enter key password for <{0}>:
+Main.99=Key associated with [{0}] MUST be a private key
+
+JarSigner.1=\ \ signing:
+JarSigner.2=\ updating:
+JarSigner.8=\ \ \ adding:
+JarSigner.11=\ \ \ adding:
+JarSigner.14=jar signed.
+
+JarVerifier.2=jar is not signed.--no signature files found.
+JarVerifier.3=jar verification failed.
+JarVerifier.4=jar partially verified --{0,numer} of {1,number} signers.
+JarVerifier.7=jar verified --{0,number} signer(s).
+JarVerifier.13=Signature Block missing for {0}
+JarVerifier.14=At least one SignerInfo element MUST be present in a Signature Block (.DSA file)
+JarVerifier.16=Missing EncryptedDigest in Signature Block (.DSA file) first SignerInfo element
+
+SFHelper.1=Helper is NOT finished
+SFHelper.4=.SF file has NOT been generated
+SFHelper.6=Unknown or unsupported private key algorithm
+SFHelper.9=Helper is NOT ready
+SFHelper.10=Helper is NOT started
diff --git a/resource/gnu/classpath/tools/keytool/MessageBundle.properties b/resource/gnu/classpath/tools/keytool/MessageBundle.properties
new file mode 100644
index 000000000..2dd3ce2fc
--- /dev/null
+++ b/resource/gnu/classpath/tools/keytool/MessageBundle.properties
@@ -0,0 +1,95 @@
+# default locale messages for gnu.classpath.tools.keytool package
+
+Main.6=keytool:
+Main.8=keytool error:
+
+Command.19=Failed creating new file at {0}
+Command.20=Unable to find a suitable signature algorithm named {0}, although we found a key-pair generation algorithm named {1}
+Command.21=Enter key password for <{0}>:
+Command.23=A correct key password MUST be provided
+Command.24=Enter key store password:
+#Command.36=Option '-keystore' is undefined, or is an empty string, and 'user.home' is unknown
+Command.36=Unable to locate a valid key store
+Command.40=Provider fully qualified class name:
+Command.42=File object [{0}] exists but is NOT a file
+Command.44=File [{0}] exists but is NOT writable
+Command.46=File object [{0}] MUST be an existing readable file
+Command.48=Signature algorithm is missing and private key is of unknown or unsupported type
+Command.51=Validity period MUST be greater than zero
+Command.52=Unable to get signature algorithm name
+Command.60=Unknown or unsupported signature algorithm: {0}
+Command.63=Saving key store at {0}
+Command.66=Owner: {0}
+Command.67=Issuer: {0}
+Command.68=Serial number: {0,number}
+Command.69=Valid from: {0,date,full} - {0,time,full}
+Command.70=\ \ \ \ \ until: {0,date,full} - {0,time,full}
+Command.71=Certificate fingerprints
+Command.72=\ \ \ \ \ \ MD5: {0}
+Command.73=\ \ SHA-160: {0}
+Command.75=Alias [{0}] MUST be knwon to the key store
+Command.77=Alias [{0}] MUST be associated with a Key Entry
+
+CertReqCmd.27=Certification request stored in {0}
+CertReqCmd.28=Submit this to your CA
+
+DeleteCmd.19=Enter the Alias to delete:
+DeleteCmd.20=Alias MUST NOT be null or an empty string
+
+GenKeyCmd.0=\nYou are about to enter information that will be incorporated into\n\
+your certificate request. This information is what is called a\n\
+Distinguished Name or DN. There are quite a few fields but you\n\
+can use supplied default values, displayed between brackets, by just\n\
+hitting <Enter>, or blank the field by entering the <.> character\n\
+before hitting <Enter>.\n\n
+GenKeyCmd.6=The Sample Company
+GenKeyCmd.7=Sydney
+GenKeyCmd.8=NSW
+GenKeyCmd.9=AU
+GenKeyCmd.10=Common Name (hostname, IP, or your name):
+GenKeyCmd.11=Organization Name (company) [{0}]:
+GenKeyCmd.13=Organizational Unit Name (department, division):
+GenKeyCmd.14=Locality Name (city, district) [{0}]:
+GenKeyCmd.16=State or Province Name (full name) [{0}]:
+GenKeyCmd.18=Country Name (2 letter code) [{0}]:
+GenKeyCmd.54=Key size MUST be greater than zero
+
+StorePasswdCmd.19=Too many failed attempts
+StorePasswdCmd.20=Enter new key store password:
+StorePasswdCmd.21=Password MUST be at least 6 characters.
+StorePasswdCmd.22=New password MUST be different than the old one.
+StorePasswdCmd.23=Re-enter new key store password:
+StorePasswdCmd.24=Passwords MUST be the same in both attempts.
+
+KeyPasswdCmd.24=Enter new key password for <{0}>:
+KeyPasswdCmd.28=Re-enter new key password for <{0}>:
+
+KeyCloneCmd.23=Destination Alias MUST NOT exist in key store
+KeyCloneCmd.26=Enter destination alias:
+KeyCloneCmd.27=Destination alias MUST NOT be null nor empty
+KeyCloneCmd.28=Enter new key password for <{0}> [{1}]:
+
+ListCmd.21=Key store type: {0}
+ListCmd.22=Key store provider: {0}
+ListCmd.24=Key store contains {0,number} entry(ies)
+ListCmd.30=Alias name: {0}
+ListCmd.31=Creation timestamp: {0,date,full} - {0,time,full}
+ListCmd.32=Entry type: trusted-certificate
+ListCmd.33=Entry type: key-entry
+ListCmd.34=Alias [{0}] is unknown to the key store
+ListCmd.38=Certificate chain length: {0,number}
+ListCmd.39=Certificate[1]:
+ListCmd.40=Certificate[{0,number}]:
+ListCmd.42=*******************************************
+ListCmd.43=-----BEGIN CERTIFICATE-----
+ListCmd.44=-----END CERTIFICATE-----
+ListCmd.45=Certificate fingerprint (MD5): {0}
+
+ImportCmd.34=Failed to establish chain-of-trust from reply
+ImportCmd.37=Unable to find anchor certificate for {0}
+ImportCmd.38=Public keys, in key store and certificate, MUST be of the same type
+ImportCmd.32=Can this certificate be trusted?
+ImportCmd.40=Key entry associated with {0} has an unknown or unsupported public key type {1}
+ImportCmd.41=Public keys, in key store and certificate, MUST be the same
+ImportCmd.29=Certificate was added to the key store
+ImportCmd.28=Certificate was not added to the key store
diff --git a/resource/gnu/java/locale/LocaleInformation_aa.properties b/resource/gnu/java/locale/LocaleInformation_aa.properties
index b60bfe066..ca40f9b24 100644
--- a/resource/gnu/java/locale/LocaleInformation_aa.properties
+++ b/resource/gnu/java/locale/LocaleInformation_aa.properties
@@ -5,8 +5,14 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesDisplayName.DJF=DJF
-currenciesDisplayName.ERN=ERN
+currenciesDisplayName.INR=Indian Rupee
+currenciesDisplayName.JPY=Japanese Yen
+currenciesDisplayName.RUB=Russian Ruble
+currenciesDisplayName.CNY=Chinese Yuan Renminbi
+currenciesDisplayName.GBP=British Pound Sterling
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.USD=US Dollar
+currenciesDisplayName.BRL=Brazilian Real
currenciesSymbol.DJF=FD
currenciesSymbol.ERN=$
currenciesSymbol.USD=US$
@@ -25,7 +31,28 @@ shortTimeFormat=h:mm a
mediumTimeFormat=h:mm:ss a
longTimeFormat=h:mm:ss a
fullTimeFormat=h:mm:ss a
-territories.ER=Eretria
+territories.FR=France
territories.DJ=Yabuuti
+territories.IN=India
+territories.CN=China
territories.ET=Otobbia
+territories.DE=Germany
+territories.GB=United Kingdom
+territories.ER=Eretria
+territories.BR=Brazil
+territories.RU=Russia
+territories.JP=Japan
+territories.US=United States
+territories.IT=Italy
+languages.zh=Chinese
languages.aa=Qafar
+languages.en=English
+languages.ru=Russian
+languages.hi=Hindi
+languages.ar=Arabic
+languages.it=Italian
+languages.fr=French
+languages.de=German
+languages.es=Spanish
+languages.ja=Japanese
+languages.pt=Portuguese
diff --git a/resource/gnu/java/locale/LocaleInformation_aa_ET.properties b/resource/gnu/java/locale/LocaleInformation_aa_ET.properties
index 182894737..e642c5367 100644
--- a/resource/gnu/java/locale/LocaleInformation_aa_ET.properties
+++ b/resource/gnu/java/locale/LocaleInformation_aa_ET.properties
@@ -6,6 +6,5 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.ETB=ETB
currenciesSymbol.ETB=$
months=®Kudo®®Agda Baxis®®®®Liiqen®®®®®®
diff --git a/resource/gnu/java/locale/LocaleInformation_af.properties b/resource/gnu/java/locale/LocaleInformation_af.properties
index 3a57193df..cae928491 100644
--- a/resource/gnu/java/locale/LocaleInformation_af.properties
+++ b/resource/gnu/java/locale/LocaleInformation_af.properties
@@ -18,17 +18,17 @@ ampms=vm.®nm.®
territories.AU=Australi\u00eb
territories.TD=Tsjaad
territories.AT=Oostenryk
-territories.GW=Guinee-Bissau
territories.AR=Argentini\u00eb
+territories.GW=Guinee-Bissau
territories.MZ=Mosambiek
territories.MY=Maleisi\u00eb
territories.MX=Meksiko
-territories.GR=Griekeland
territories.AM=Armeni\u00eb
+territories.GR=Griekeland
territories.ZA=Suid-Afrika
territories.MV=Maldive
-territories.GQ=Ekwatoriaal-Guinee
territories.AL=Albani\u00eb
+territories.GQ=Ekwatoriaal-Guinee
territories.SY=Siri\u00eb
territories.GN=Guinee
territories.MR=Mouritani\u00eb
@@ -39,7 +39,6 @@ territories.AF=Afganistan
territories.ST=Sao Tome en Principe
territories.AE=Verenigde Arabiese Emirate
territories.MN=Mongoli\u00eb
-territories.YU=Serwi\u00eb
territories.MK=Macedoni\u00eb
territories.SO=Somali\u00eb
territories.GE=Georgi\u00eb
@@ -75,8 +74,8 @@ territories.KW=Koeweit
territories.KR=Suid-Korea
territories.KP=Noord-Korea
territories.KN=Saint Kitts en Nevis
-territories.KM=Comore
territories.EH=Wes-Sahara
+territories.KM=Comore
territories.EG=Egipte
territories.EE=Estland
territories.KH=Kambodja
@@ -86,8 +85,8 @@ territories.DZ=Algeri\u00eb
territories.QA=Katar
territories.DO=Dominikaanse Republiek
territories.DK=Denemarke
-territories.JO=Jordani\u00eb
territories.DJ=Djiboeti
+territories.JO=Jordani\u00eb
territories.JM=Jamaika
territories.DE=Duitsland
territories.PL=Pole
@@ -99,16 +98,17 @@ territories.CY=Ciprus
territories.CV=Kaap Verde
territories.CU=Kuba
territories.VC=Saint Vincent en die Grenadine
+territories.CS=Serwi\u00eb
territories.VA=Vatikaan
territories.IT=Itali\u00eb
-territories.IS=Ysland
territories.CN=Sjina
+territories.IS=Ysland
territories.CM=Kameroen
-territories.IQ=Irak
territories.CL=Chili
+territories.IQ=Irak
territories.UZ=Oesbekistan
-territories.IN=Indi\u00eb
territories.CI=Ivoorkus
+territories.IN=Indi\u00eb
territories.CH=Switserland
territories.CG=Kongo
territories.CF=Sentraal-Afrikaanse Republiek
@@ -122,8 +122,8 @@ territories.BR=Brasili\u00eb
territories.UA=Oekraine
territories.NZ=Nieu-Seeland
territories.HU=Hongarye
-territories.HT=Ha\u00efti
territories.BO=Bolivi\u00eb
+territories.HT=Ha\u00efti
territories.BN=Broenei
territories.HR=Kroasi\u00eb
territories.TZ=Tanzani\u00eb
diff --git a/resource/gnu/java/locale/LocaleInformation_am.properties b/resource/gnu/java/locale/LocaleInformation_am.properties
index be1a63ce1..e0f52641f 100644
--- a/resource/gnu/java/locale/LocaleInformation_am.properties
+++ b/resource/gnu/java/locale/LocaleInformation_am.properties
@@ -5,6 +5,19 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+currenciesDisplayName.INR=\u12e8\u1215\u1295\u12f5 \u1229\u1352
+currenciesDisplayName.RUB=\u12e8\u122b\u123b \u1229\u1265\u120d
+currenciesDisplayName.JPY=\u12e8\u1303\u1353\u1295 \u12e8\u1295
+currenciesDisplayName.BRL=\u12e8\u1265\u122b\u12da\u120d \u122a\u120d
+currenciesDisplayName.CNY=\u12e8\u127b\u12ed\u1293 \u12e9\u12a0\u1295 \u1228\u1295\u121a\u1295\u1262
+currenciesDisplayName.USD=\u12e8\u12a0\u121c\u122a\u12ab\u1295 \u12f6\u120b\u122d
+currenciesDisplayName.EUR=\u12a0\u12cd\u122e
+currenciesDisplayName.ETB=\u12e8\u12a2\u1275\u12ee\u1335\u12eb \u1265\u122d
+currenciesDisplayName.GBP=\u12e8\u12a5\u1295\u130d\u120a\u12dd \u1353\u12cd\u1295\u12f5 \u1235\u1270\u122d\u120a\u1295\u130d
+currenciesSymbol.ETB=$
+currenciesSymbol.CNY=Y
+currenciesSymbol.USD=USD
+currenciesSymbol.BRL=R$
shortMonths=\u1303\u1295\u12e9®\u134c\u1265\u1229®\u121b\u122d\u127d®\u12a4\u1355\u1228®\u121c\u12ed®\u1301\u1295®\u1301\u120b\u12ed®\u12a6\u1308\u1235®\u1234\u1355\u1274®\u12a6\u12ad\u1270®\u1296\u126c\u121d®\u12f2\u1234\u121d®®
months=\u1303\u1295\u12e9\u12c8\u122a®\u134c\u1265\u1229\u12c8\u122a®\u121b\u122d\u127d®\u12a4\u1355\u1228\u120d®\u121c\u12ed®\u1301\u1295®\u1301\u120b\u12ed®\u12a6\u1308\u1235\u1275®\u1234\u1355\u1274\u121d\u1260\u122d®\u12a6\u12ad\u1270\u12cd\u1260\u122d®\u1296\u126c\u121d\u1260\u122d®\u12f2\u1234\u121d\u1260\u122d®®
shortWeekdays=®\u12a5\u1211\u12f5®\u1230\u129e®\u121b\u12ad\u1230®\u1228\u1261\u12d5®\u1210\u1219\u1235®\u12d3\u122d\u1265®\u1245\u12f3\u121c®
@@ -33,10 +46,9 @@ territories.GN=\u130a\u1292
territories.GM=\u130b\u121d\u1262\u12eb
territories.GL=\u130d\u122a\u1295\u120b\u1295\u12f5
territories.SV=\u12a4\u120d \u1233\u120d\u126b\u12f6\u122d
-territories.062=South-central Asia
territories.ST=\u1233\u12a6 \u1276\u121c \u12a5\u1293 \u1355\u122a\u1295\u1232\u1354
-territories.GI=\u130a\u1265\u122b\u120d\u1273\u122d
territories.061=\u1356\u120a\u1294\u12e2\u12eb
+territories.GI=\u130a\u1265\u122b\u120d\u1273\u122d
territories.GH=\u130b\u1293
territories.SR=\u1231\u122a\u1293\u121d
territories.GF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u1309\u12ca\u12a0\u1293
@@ -59,13 +71,11 @@ territories.SC=\u1232\u123c\u120d\u1235
territories.SB=\u1230\u120e\u121e\u1295 \u12f0\u1234\u1275
territories.SA=\u1233\u12cd\u12f5\u12a0\u1228\u1262\u12eb
territories.FR=\u1348\u1228\u1295\u1233\u12ed
-territories.FO=\u12e8\u134b\u122e\u12ed \u12f0\u1234\u1276\u127d
territories.057=\u121a\u12ad\u122e\u1294\u12e2\u12eb
+territories.FO=\u12e8\u134b\u122e\u12ed \u12f0\u1234\u1276\u127d
territories.FM=\u121a\u12ad\u122e\u1294\u12e2\u12eb
territories.RW=\u1229\u12cb\u1295\u12f3
-territories.054=Melanesia
territories.FK=\u12e8\u134e\u120d\u12ad\u120b\u1295\u12f5 \u12f0\u1234\u1276\u127d
-territories.053=Australia and New Zealand
territories.RU=\u122b\u123a\u12eb
territories.FJ=\u134a\u1302
territories.FI=\u134a\u1295\u120b\u1295\u12f5
@@ -75,10 +85,8 @@ territories.ET=\u12a2\u1275\u12ee\u1335\u12eb
territories.ES=\u1235\u1354\u1295
territories.ER=\u12a4\u122d\u1275\u122b
territories.EH=\u121d\u12d5\u122b\u1263\u12ca \u1233\u1205\u122b
-territories.833=Isle of Man
territories.EG=\u130d\u1265\u133d
territories.EE=\u12a4\u1235\u1276\u1292\u12eb
-territories.830=Channel Islands
territories.EC=\u12a2\u12b3\u12f6\u122d
territories.DZ=\u12a0\u120d\u1304\u122a\u12eb
territories.QA=\u12b3\u1273\u122d
@@ -86,13 +94,11 @@ territories.039=\u12f0\u1261\u1263\u12ca \u12a0\u12cd\u122e\u1353
territories.DO=\u12f6\u121a\u1292\u12ad \u122a\u1351\u1265\u120a\u12ad
territories.PY=\u1353\u122b\u1313\u12ed
territories.DM=\u12f6\u121a\u1292\u12ab
-territories.035=South-eastern Asia
territories.PW=\u1353\u120b\u12cd
territories.DK=\u12f4\u1295\u121b\u122d\u12ad
territories.DJ=\u1302\u1261\u1272
territories.PT=\u1356\u122d\u1271\u130b\u120d
territories.PS=\u12e8\u134d\u120d\u1235\u1324\u121d \u130d\u12db\u1275
-territories.030=Eastern Asia
territories.PR=\u1356\u122d\u1273 \u122a\u12ae
territories.DE=\u1300\u122d\u1218\u1295
territories.PN=\u1352\u1275\u12ab\u12a2\u122d\u1295
@@ -109,15 +115,15 @@ territories.CX=\u12e8\u1308\u1293 \u12f0\u1234\u1276\u127d
territories.CV=\u12ac\u1355 \u126c\u122d\u12f4
territories.PA=\u1353\u1293\u121b
territories.CU=\u12a9\u1263
+territories.CS=\u1230\u122d\u1262\u12eb
territories.CR=\u12ae\u1235\u1273 \u122a\u12ab
-territories.029=Caribbean
territories.CO=\u12ae\u120e\u121d\u1262\u12eb
territories.CN=\u127b\u12ed\u1293
territories.CM=\u12ab\u121c\u1229\u1295
territories.CL=\u127a\u120a
territories.CK=\u12a9\u12ad \u12f0\u1234\u1276\u127d
-territories.021=\u1230\u121c\u1293\u12ca \u12a0\u121c\u122a\u12ab
territories.CI=\u12ae\u1275 \u12f2\u126f\u122d
+territories.021=\u1230\u121c\u1293\u12ca \u12a0\u121c\u122a\u12ab
territories.CH=\u1235\u12ca\u12d8\u122d\u120b\u1295\u12f5
territories.CG=\u12ae\u1295\u1310
territories.CF=\u12e8\u1218\u12ab\u12a8\u1208\u129b\u12cd \u12a0\u134d\u122a\u12ab \u122a\u1350\u1265\u120a\u12ad
@@ -132,27 +138,24 @@ territories.BV=\u12e8\u1266\u12cd\u126c\u1275 \u12f0\u1234\u1275
territories.BT=\u1261\u1205\u1273\u1295
territories.BS=\u1263\u1203\u121b\u1235
territories.BR=\u1265\u122b\u12da\u120d
-territories.019=Americas
territories.018=\u12f0\u1261\u1263\u12ca \u12a0\u134d\u122a\u12ab
territories.NZ=\u1292\u12cd \u12da\u120b\u1295\u12f5
-territories.017=Middle \u12a0\u134d\u122a\u12ab
territories.BO=\u1266\u120a\u126a\u12eb
+territories.017=Middle \u12a0\u134d\u122a\u12ab
territories.BN=\u1265\u1229\u1292
-territories.015=\u1230\u121c\u1293\u12ca \u12a0\u134d\u122a\u12ab
territories.BM=\u1264\u122d\u1219\u12f3
+territories.015=\u1230\u121c\u1293\u12ca \u12a0\u134d\u122a\u12ab
territories.014=\u121d\u1235\u122b\u1243\u12ca \u12a0\u134d\u122a\u12ab
-territories.013=Central America
territories.NU=\u1292\u12a1\u12ed
territories.BJ=\u1264\u1292\u1295
-territories.011=\u121d\u12d5\u122b\u1263\u12ca \u12a0\u134d\u122a\u12ab
territories.BI=\u1265\u1229\u1295\u12f2
+territories.011=\u121d\u12d5\u122b\u1263\u12ca \u12a0\u134d\u122a\u12ab
territories.BH=\u1263\u1205\u122c\u1295
territories.NR=\u1293\u12a1\u1229
territories.BG=\u1261\u120d\u130c\u122a\u12eb
territories.BF=\u1261\u122d\u12aa\u1293 \u134b\u1236
territories.NP=\u1294\u1353\u120d
territories.BE=\u1264\u120d\u1304\u121d
-territories.ZZ=Outlying Oceania
territories.NO=\u1296\u122d\u12cc
territories.BD=\u1263\u1295\u130d\u120b\u12f2\u123d
territories.BB=\u1263\u122d\u1264\u12f6\u1235
@@ -164,7 +167,6 @@ territories.NG=\u1293\u12ed\u1304\u122a\u12eb
territories.NF=\u1296\u122d\u134e\u120d\u12ad \u12f0\u1234\u1275
territories.AZ=\u12a0\u12d8\u122d\u1263\u1303\u1295
territories.NE=\u1292\u1300\u122d
-territories.AX=Aland Islands
territories.NC=\u1292\u12cd \u12ab\u120c\u12f6\u1292\u12eb
territories.AW=\u12a0\u1229\u1263
territories.ZM=\u12db\u121d\u1262\u12eb
@@ -174,14 +176,13 @@ territories.AT=\u12a6\u1235\u1275\u122a\u12eb
territories.AS=\u12e8\u12a0\u121c\u122a\u12ab \u1233\u121e\u12a0
territories.AR=\u12a0\u122d\u1300\u1295\u1272\u1293
territories.AQ=\u12a0\u1295\u1273\u122d\u12ad\u1272\u12ab
-territories.009=Oceania
territories.MZ=\u121e\u12db\u121d\u1262\u12ad
territories.AO=\u12a0\u1295\u1310\u120b
territories.MY=\u121b\u120c\u12e2\u12eb
territories.AN=\u1294\u12d8\u122d\u120b\u1295\u12f5\u1235 \u12a0\u1295\u1272\u120d\u1235
territories.MX=\u121c\u12ad\u1232\u12ae
-territories.AM=\u12a0\u122d\u121c\u1292\u12eb
territories.005=\u12f0\u1261\u1263\u12ca \u12a0\u121c\u122a\u12ab
+territories.AM=\u12a0\u122d\u121c\u1292\u12eb
territories.MW=\u121b\u120b\u12ca
territories.AL=\u12a0\u120d\u1263\u1292\u12eb
territories.MV=\u121b\u120d\u12f2\u126d\u1235
@@ -189,8 +190,8 @@ territories.ZA=\u12f0\u1261\u1265 \u12a0\u134d\u122a\u12ab
territories.MU=\u121b\u1229\u1238\u1235
territories.002=\u12a0\u121c\u122a\u12ab
territories.MT=\u121b\u120d\u1273
-territories.AI=\u12a0\u1295\u1309\u12a2\u120b
territories.001=\u12d3\u1208\u121d
+territories.AI=\u12a0\u1295\u1309\u12a2\u120b
territories.MS=\u121e\u1295\u1275\u1234\u122b\u1275
territories.MR=\u121e\u122a\u1274\u1292\u12eb
territories.AG=\u12a0\u1295\u1272\u1313 \u12a5\u1293 \u1263\u1229\u12f3
@@ -204,7 +205,6 @@ territories.MN=\u121e\u1295\u130e\u120a\u12eb
territories.MM=\u121b\u12eb\u1295\u121b\u122d
territories.ML=\u121b\u120a
territories.MK=\u121b\u12a8\u12f6\u1292\u12eb
-territories.YU=\u12e9\u130e\u12dd\u120b\u126a\u12eb
territories.YT=\u121c\u12ed\u12a6\u1274
territories.MH=\u121b\u122d\u123b\u120d \u12a0\u12ed\u120b\u1295\u12f5
territories.MG=\u121b\u12f3\u130b\u1235\u12ab\u122d
@@ -219,8 +219,8 @@ territories.LU=\u1209\u12ad\u1230\u121d\u1260\u122d\u130d
territories.154=\u1230\u121c\u1293\u12ca \u12a0\u12cd\u122e\u1353
territories.LT=\u120a\u1271\u12cc\u1292\u12eb
territories.LS=\u120c\u1236\u1276
-territories.LR=\u120b\u12ed\u1264\u122a\u12eb
territories.151=\u121d\u1235\u122b\u1243\u12ca \u12a0\u12cd\u122e\u1353
+territories.LR=\u120b\u12ed\u1264\u122a\u12eb
territories.150=\u12a0\u12cd\u122e\u1353
territories.LK=\u1232\u122a\u120b\u1295\u12ab
territories.LI=\u120a\u127d\u1270\u1295\u1235\u1273\u12ed\u1295
@@ -230,8 +230,6 @@ territories.LA=\u120b\u12a6\u1235
territories.KZ=\u12ab\u12db\u12aa\u1235\u1273\u1295
territories.KY=\u12ab\u12ed\u121b\u1295 \u12f0\u1234\u1276\u127d
territories.KW=\u12ad\u12cc\u1275
-territories.145=Western Asia
-territories.142=Asia
territories.KR=\u1230\u121c\u1295 \u12ae\u122a\u12eb
territories.KP=\u12f0\u1261\u1265 \u12ae\u122a\u12eb
territories.KN=\u1245\u12f1\u1235 \u12aa\u1275\u1235 \u12a5\u1293 \u1294\u126a\u1235
@@ -284,8 +282,8 @@ territories.TM=\u1271\u122d\u12ad\u121c\u1292\u1235\u1273\u1295
languages.es=\u1235\u1353\u1292\u123d
languages.ku=\u12a9\u122d\u12f5\u123d\u129b
languages.eo=\u12a4\u1235\u1350\u122b\u1295\u1276
-languages.ks=\u12ab\u123d\u121a\u122d\u129b
languages.en=\u12a5\u1295\u130d\u120a\u12dd\u129b
+languages.ks=\u12ab\u123d\u121a\u122d\u129b
languages.el=\u130d\u122a\u12ad\u129b
languages.qu=\u12b5\u127f\u129b
languages.ko=\u12ae\u122a\u12eb\u129b
@@ -309,8 +307,8 @@ languages.cy=\u12c8\u120d\u123d
languages.pa=\u1353\u1295\u1303\u1262\u129b
languages.cs=\u127c\u12ad\u129b
languages.iu=\u12a5\u1291\u12ad\u1272\u1271\u1275\u129b
-languages.it=\u1323\u120a\u12eb\u1295\u129b
languages.co=\u12ae\u122d\u1232\u12ab\u129b
+languages.it=\u1323\u120a\u12eb\u1295\u129b
languages.is=\u12a0\u12ed\u1235\u120b\u1295\u12f5\u129b
languages.uz=\u12a1\u12dd\u1260\u12ad\u129b
languages.or=\u12a6\u122a\u12eb\u129b
@@ -367,8 +365,8 @@ languages.am=\u12a0\u121b\u122d\u129b
languages.za=\u12e1\u12cb\u1295\u130d\u129b
languages.mt=\u121b\u120d\u1272\u1235\u129b
languages.ms=\u121b\u120b\u12ed\u129b
-languages.byn=\u1265\u120a\u1295
languages.gn=\u1313\u122b\u1292\u129b
+languages.byn=\u1265\u120a\u1295
languages.sw=\u1235\u12cb\u1202\u120a\u129b
languages.mr=\u121b\u122b\u12da\u129b
languages.sv=\u1235\u12ca\u12f5\u1295\u129b
@@ -406,14 +404,14 @@ languages.sid=\u1232\u12f3\u121d\u129b
languages.sa=\u1233\u1295\u1235\u12ad\u122a\u1275\u129b
languages.fr=\u1348\u1228\u1295\u1233\u12ed\u129b
languages.lv=\u120b\u1275\u126a\u12eb\u1295
-languages.lt=\u120a\u1271\u12a0\u1292\u12eb\u1295
languages.fo=\u134b\u122e\u129b
+languages.lt=\u120a\u1271\u12a0\u1292\u12eb\u1295
languages.rw=\u12aa\u1295\u12eb\u122d\u12cb\u1295\u12f5\u129b
languages.ru=\u122b\u123d\u129b
-languages.lo=\u120b\u12cd\u1235\u129b
languages.fj=\u134a\u1302\u129b
-languages.ln=\u120a\u1295\u130b\u120b\u129b
+languages.lo=\u120b\u12cd\u1235\u129b
languages.fi=\u134a\u1292\u123d
+languages.ln=\u120a\u1295\u130b\u120b\u129b
languages.ro=\u122e\u121b\u1292\u12eb\u1295
languages.rn=\u1229\u1295\u12f2\u129b
languages.rm=\u122e\u121b\u1295\u1235
@@ -421,5 +419,5 @@ languages.fa=\u1350\u122d\u1232\u12eb\u129b
languages.la=\u120b\u1272\u1295\u129b
languages.xh=\u12de\u1233\u129b
languages.eu=\u1263\u1235\u12ad\u129b
-languages.ky=\u12aa\u122d\u130a\u12dd\u129b
languages.et=\u12a4\u1235\u1276\u1292\u12a0\u1295
+languages.ky=\u12aa\u122d\u130a\u12dd\u129b
diff --git a/resource/gnu/java/locale/LocaleInformation_am_ET.properties b/resource/gnu/java/locale/LocaleInformation_am_ET.properties
index fc96872d7..5da859c1d 100644
--- a/resource/gnu/java/locale/LocaleInformation_am_ET.properties
+++ b/resource/gnu/java/locale/LocaleInformation_am_ET.properties
@@ -6,8 +6,6 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.ETB=ETB
-currenciesSymbol.ETB=$
currenciesSymbol.USD=US$
ampms=\u1321\u12cb\u1275®\u12a8\u1233\u12d3\u1275®
shortDateFormat=dd/MM/yy
diff --git a/resource/gnu/java/locale/LocaleInformation_ar.properties b/resource/gnu/java/locale/LocaleInformation_ar.properties
index 148fb4f55..b929f64a9 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ar.properties
@@ -11,40 +11,46 @@ decimalSeparator=\u066b
groupingSeparator=\u066c
currencyFormat=\u00a4 #,##0.00;\u00a4 #,##0.00-
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.LBP=LBP
-currenciesDisplayName.KWD=KWD
-currenciesDisplayName.TND=TND
-currenciesDisplayName.MAD=MAD
-currenciesDisplayName.AED=AED
-currenciesDisplayName.BHD=BHD
-currenciesDisplayName.QAR=QAR
-currenciesDisplayName.DZD=DZD
-currenciesDisplayName.LYD=LYD
-currenciesDisplayName.SYP=SYP
-currenciesDisplayName.JOD=JOD
-currenciesDisplayName.IQD=IQD
-currenciesDisplayName.YER=YER
-currenciesDisplayName.EGP=EGP
-currenciesDisplayName.OMR=OMR
-currenciesDisplayName.SAR=SAR
-currenciesDisplayName.SDP=SDP
-currenciesSymbol.LBP=\u0644.\u0644.\u200f
-currenciesSymbol.KWD=\u062f.\u0643.\u200f
-currenciesSymbol.TND=\u062f.\u062a.\u200f
+currenciesDisplayName.INR=\u0631\u0648\u0628\u064a\u0647 \u0647\u0646\u062f\u064a
+currenciesDisplayName.RUB=\u0631\u0648\u0628\u0644 \u0631\u0648\u0633\u064a
+currenciesDisplayName.JPY=\u064a\u0646 \u064a\u0627\u0628\u0627\u0646\u064a
+currenciesDisplayName.SDD=\u062f\u064a\u0646\u0627\u0631 \u0633\u0648\u062f\u0627\u0646\u064a
+currenciesDisplayName.XAF=\u0641\u0631\u0646\u0643 \u0627\u0641\u0631\u064a\u0642\u064a
+currenciesDisplayName.KMF=\u0641\u0631\u0646\u0643 \u062c\u0632\u0631 \u0627\u0644\u0642\u0645\u0631
+currenciesDisplayName.BRL=\u0631\u064a\u0627\u0644 \u0628\u0631\u0627\u0632\u064a\u0644\u064a
+currenciesDisplayName.CNY=\u064a\u0648\u0627\u0646 \u0635\u064a\u0646\u064a
+currenciesDisplayName.USD=\u062f\u0648\u0644\u0627\u0631 \u0623\u0645\u0631\u064a\u0643\u064a
+currenciesDisplayName.XXX=\u0628\u062f\u0648\u0646 \u0639\u0645\u0644\u0629
+currenciesDisplayName.MRO=\u0623\u0648\u0642\u064a\u0629 \u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0629
+currenciesDisplayName.EUR=\u064a\u0648\u0631\u0648
+currenciesDisplayName.TRY=\u0644\u064a\u0631\u0629 \u062a\u0631\u0643\u064a\u0629 \u062c\u062f\u064a\u062f\u0629
+currenciesDisplayName.GBP=\u062c\u0646\u064a\u0647 \u0633\u062a\u0631\u0644\u064a\u0646\u064a
+currenciesSymbol.OMR=\u0631.\u0639.\u200f
+currenciesSymbol.QAR=\u0631.\u0642.\u200f
+currenciesSymbol.INR=.\u200f\u0631.\u0647
+currenciesSymbol.KMF=.\u200f\u0641.\u062c.\u0642
currenciesSymbol.MAD=\u062f.\u0645.\u200f
-currenciesSymbol.AED=\u062f.\u0625.\u200f
+currenciesSymbol.SAR=\u0631.\u0633.\u200f
+currenciesSymbol.XAF=.\u200f\u0641.\u0627
+currenciesSymbol.SDP=\u062c.\u0633.\u200f
+currenciesSymbol.JOD=\u062f.\u0623.\u200f
+currenciesSymbol.IQD=\u062f.\u0639.\u200f
+currenciesSymbol.SYP=\u0644.\u0633.\u200f
currenciesSymbol.BHD=\u062f.\u0628.\u200f
-currenciesSymbol.QAR=\u0631.\u0642.\u200f
+currenciesSymbol.TND=\u062f.\u062a.\u200f
+currenciesSymbol.SDD=.\u200f\u062f.\u0633
+currenciesSymbol.EGP=\u062c.\u0645.\u200f
+currenciesSymbol.KWD=\u062f.\u0643.\u200f
+currenciesSymbol.CNY=.\u200f\u064a.\u0635
+currenciesSymbol.XXX=XXX\u200f
+currenciesSymbol.LBP=\u0644.\u0644.\u200f
+currenciesSymbol.BRL=.\u200f\u0631.\u0628
currenciesSymbol.DZD=\u062f.\u062c.\u200f
+currenciesSymbol.MRO=.\u200f\u0623.\u0645
currenciesSymbol.LYD=\u062f.\u0644.\u200f
-currenciesSymbol.SYP=\u0644.\u0633.\u200f
-currenciesSymbol.JOD=\u062f.\u0623.\u200f
-currenciesSymbol.IQD=\u062f.\u0639.\u200f
+currenciesSymbol.RUB=\u0631.\u0631.\u200f
currenciesSymbol.YER=\u0631.\u064a.\u200f
-currenciesSymbol.EGP=\u062c.\u0645.\u200f
-currenciesSymbol.OMR=\u0631.\u0639.\u200f
-currenciesSymbol.SAR=\u0631.\u0633.\u200f
-currenciesSymbol.SDP=\u062c.\u0633.\u200f
+currenciesSymbol.AED=\u062f.\u0625.\u200f
shortMonths=\u064a\u0646\u0627\u064a\u0631®\u0641\u0628\u0631\u0627\u064a\u0631®\u0645\u0627\u0631\u0633®\u0623\u0628\u0631\u064a\u0644®\u0645\u0627\u064a\u0648®\u064a\u0648\u0646\u064a\u0648®\u064a\u0648\u0644\u064a\u0648®\u0623\u063a\u0633\u0637\u0633®\u0633\u0628\u062a\u0645\u0628\u0631®\u0623\u0643\u062a\u0648\u0628\u0631®\u0646\u0648\u0641\u0645\u0628\u0631®\u062f\u064a\u0633\u0645\u0628\u0631®®
months=\u064a\u0646\u0627\u064a\u0631®\u0641\u0628\u0631\u0627\u064a\u0631®\u0645\u0627\u0631\u0633®\u0623\u0628\u0631\u064a\u0644®\u0645\u0627\u064a\u0648®\u064a\u0648\u0646\u064a\u0648®\u064a\u0648\u0644\u064a\u0648®\u0623\u063a\u0633\u0637\u0633®\u0633\u0628\u062a\u0645\u0628\u0631®\u0623\u0643\u062a\u0648\u0628\u0631®\u0646\u0648\u0641\u0645\u0628\u0631®\u062f\u064a\u0633\u0645\u0628\u0631®®
shortWeekdays=®\u062d®\u0646®\u062b®\u0631®\u062e®\u062c®\u0633®
@@ -116,17 +122,18 @@ territories.PW=\u0628\u0627\u0644\u0627\u0648
territories.DK=\u0627\u0644\u062f\u0627\u0646\u0645\u0631\u0643
territories.DJ=\u062c\u064a\u0628\u0648\u062a\u064a
territories.PT=\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644
+territories.PS=\u0641\u0644\u0633\u0637\u064a\u0646
territories.DE=\u0627\u0644\u0645\u0627\u0646\u064a\u0627
territories.PL=\u0628\u0648\u0644\u0646\u062f\u0627
territories.PK=\u0627\u0644\u0628\u0627\u0643\u0633\u062a\u0627\u0646
territories.PH=\u0627\u0644\u0641\u064a\u0644\u0628\u064a\u0646
territories.PG=\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629
territories.CZ=\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u062a\u0634\u064a\u0643
-territories.PE=\u0628\u064a\u0631\u0648
territories.CY=\u0642\u0628\u0631\u0635
+territories.PE=\u0628\u064a\u0631\u0648
territories.CV=\u0627\u0644\u0631\u0623\u0633 \u0627\u0644\u0627\u062e\u0636\u0631
-territories.PA=\u0628\u0646\u0645\u0627
territories.CU=\u0643\u0648\u0628\u0627
+territories.PA=\u0628\u0646\u0645\u0627
territories.CR=\u0643\u0648\u0633\u062a\u0627\u0631\u064a\u0643\u0627
territories.CO=\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627
territories.CN=\u0627\u0644\u0635\u064a\u0646
@@ -143,45 +150,45 @@ territories.BW=\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627
territories.BT=\u0628\u0648\u062a\u0627\u0646
territories.BS=\u0627\u0644\u0628\u0647\u0627\u0645\u0627
territories.BR=\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644
-territories.NZ=\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629
territories.BO=\u0628\u0648\u0644\u064a\u0641\u064a\u0627
+territories.NZ=\u0632\u064a\u0644\u0646\u062f\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629
territories.BN=\u0628\u0631\u0648\u0646\u0627\u064a
territories.BJ=\u0628\u0646\u064a\u0646
territories.BI=\u0628\u0648\u0631\u0648\u0646\u062f\u064a
territories.BH=\u0627\u0644\u0628\u062d\u0631\u064a\u0646
-territories.NR=\u0646\u0627\u0648\u0631\u0648
territories.BG=\u0628\u0644\u063a\u0627\u0631\u064a\u0627
+territories.NR=\u0646\u0627\u0648\u0631\u0648
territories.BF=\u0628\u0648\u0631\u0643\u064a\u0646\u0627 \u0641\u0627\u0633\u0648
-territories.NP=\u0627\u0644\u0646\u064a\u0628\u0627\u0644
territories.BE=\u0628\u0644\u062c\u064a\u0643\u0627
-territories.NO=\u0627\u0644\u0646\u0631\u0648\u064a\u062c
+territories.NP=\u0627\u0644\u0646\u064a\u0628\u0627\u0644
territories.BD=\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634
+territories.NO=\u0627\u0644\u0646\u0631\u0648\u064a\u062c
territories.BB=\u0628\u0631\u0628\u0627\u062f\u0648\u0633
territories.ZW=\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a
-territories.NL=\u0647\u0648\u0644\u0646\u062f\u0627
territories.BA=\u0627\u0644\u0628\u0648\u0633\u0646\u0629 \u0648\u0627\u0644\u0647\u0631\u0633\u0643
+territories.NL=\u0647\u0648\u0644\u0646\u062f\u0627
territories.NI=\u0646\u064a\u0643\u0627\u0631\u0627\u063a\u0648\u0627
territories.NG=\u0646\u064a\u062c\u064a\u0631\u064a\u0627
territories.AZ=\u0622\u0630\u0631\u0628\u064a\u062c\u0627\u0646
territories.NE=\u0627\u0644\u0646\u064a\u062c\u0631
territories.ZM=\u0632\u0627\u0645\u0628\u064a\u0627
-territories.AU=\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627
territories.NA=\u0646\u0627\u0645\u064a\u0628\u064a\u0627
+territories.AU=\u0627\u0633\u062a\u0631\u0627\u0644\u064a\u0627
territories.AT=\u0627\u0644\u0646\u0645\u0633\u0627
territories.AR=\u0627\u0644\u0627\u0631\u062c\u0646\u062a\u064a\u0646
-territories.MZ=\u0645\u0648\u0632\u0645\u0628\u064a\u0642
territories.AO=\u0627\u0646\u063a\u0648\u0644\u0627
+territories.MZ=\u0645\u0648\u0632\u0645\u0628\u064a\u0642
territories.MY=\u0645\u0627\u0644\u064a\u0632\u064a\u0627
-territories.MX=\u0627\u0644\u0645\u0643\u0633\u064a\u0643
territories.AM=\u0627\u0631\u0645\u064a\u0646\u064a\u0627
+territories.MX=\u0627\u0644\u0645\u0643\u0633\u064a\u0643
territories.MW=\u0645\u0644\u0627\u0648\u064a
territories.MV=\u0645\u0627\u0644\u062f\u064a\u0641
territories.ZA=\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u064a\u0642\u064a\u0627
territories.MU=\u0645\u0648\u0631\u064a\u0634\u0648\u0633
-territories.MT=\u0645\u0627\u0644\u0637\u0629
territories.AI=\u0627\u0644\u0628\u0627\u0646\u064a\u0627
-territories.MR=\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627
+territories.MT=\u0645\u0627\u0644\u0637\u0629
territories.AG=\u0627\u0646\u062a\u064a\u063a\u0648\u0627 \u0648\u0628\u0631\u0628\u0648\u062f\u0627
+territories.MR=\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627
territories.AF=\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646
territories.AE=\u0627\u0644\u0627\u0645\u0627\u0631\u0627\u062a \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629
territories.AD=\u0627\u0646\u062f\u0648\u0631\u0627
@@ -253,22 +260,22 @@ territories.TM=\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646
languages.es=\u0627\u0644\u0627\u0633\u0628\u0627\u0646\u064a\u0629
languages.ku=\u0627\u0644\u0643\u0631\u062f\u064a\u0629
languages.eo=\u0627\u0633\u0628\u0631\u0627\u0646\u062a\u0648
-languages.ks=\u0627\u0644\u0643\u0627\u0634\u0645\u064a\u0631\u064a\u0629
languages.en=\u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629
+languages.ks=\u0627\u0644\u0643\u0627\u0634\u0645\u064a\u0631\u064a\u0629
languages.el=\u0627\u0644\u064a\u0648\u0646\u0627\u0646\u064a\u0629
languages.ko=\u0627\u0644\u0643\u0648\u0631\u064a\u0629
languages.km=\u0627\u0644\u062e\u0645\u064a\u0631\u064a\u0629
languages.dz=\u0627\u0644\u0632\u0648\u0646\u062e\u0627\u064a\u0629
languages.smi=\u0627\u0644\u0644\u063a\u0627\u062a \u0627\u0644\u0633\u0627\u0645\u064a\u0629
-languages.dv=\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629
languages.syr=\u0627\u0644\u0633\u0631\u064a\u0627\u0646\u064a\u0629
+languages.dv=\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641\u064a\u0629
languages.pt=\u0627\u0644\u0628\u0631\u062a\u063a\u0627\u0644\u064a\u0629
languages.ps=\u0627\u0644\u0628\u0634\u062a\u0648\u0646\u064a\u0629
languages.de=\u0627\u0644\u0627\u0644\u0645\u0627\u0646\u064a\u0629
languages.pl=\u0627\u0644\u0628\u0648\u0644\u0648\u0646\u064a\u0629
languages.da=\u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a\u0629
-languages.cop=\u0642\u0628\u0637\u064a\u0629
languages.ja=\u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a\u0629
+languages.cop=\u0642\u0628\u0637\u064a\u0629
languages.vi=\u0627\u0644\u0641\u064a\u062a\u0646\u0627\u0645\u064a\u0629
languages.cy=\u0627\u0644\u0648\u0644\u0632\u064a\u0629
languages.pa=\u0627\u0644\u0628\u0646\u062c\u0627\u0628\u064a\u0629
@@ -284,8 +291,8 @@ languages.egy=\u0645\u0635\u0631\u064a\u0629\u060c \u0642\u062f\u064a\u0645\u062
languages.hy=\u0627\u0644\u0627\u0631\u0645\u0646\u064a\u0629
languages.bs=\u0627\u0644\u0628\u0648\u0633\u0646\u064a\u0629
languages.hu=\u0627\u0644\u0647\u0646\u063a\u0627\u0631\u064a\u0629
-languages.ht=\u0627\u0644\u0647\u0627\u064a\u062a\u064a\u0629
languages.bo=\u0627\u0644\u062a\u0628\u062a\u064a\u0629
+languages.ht=\u0627\u0644\u0647\u0627\u064a\u062a\u064a\u0629
languages.bn=\u0627\u0644\u0628\u0646\u063a\u0627\u0644\u064a\u0629
languages.hr=\u0627\u0644\u0643\u0631\u0648\u0627\u062a\u064a\u0629
languages.bg=\u0627\u0644\u0628\u0644\u063a\u0627\u0631\u064a\u0629
@@ -298,8 +305,8 @@ languages.nl=\u0627\u0644\u0647\u0648\u0644\u0646\u062f\u064a\u0629
languages.he=\u0627\u0644\u0639\u0628\u0631\u064a\u0629
languages.tl=\u0627\u0644\u062a\u0627\u063a\u0627\u0644\u0648\u063a\u064a\u0629
languages.bal=\u0627\u0644\u0628\u0644\u0648\u0634\u064a\u0629
-languages.ne=\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629
languages.az=\u0627\u0630\u0631\u064a\u0629
+languages.ne=\u0627\u0644\u0646\u064a\u0628\u0627\u0644\u064a\u0629
languages.th=\u0627\u0644\u062a\u0627\u064a\u0644\u0627\u0646\u062f\u064a\u0629
languages.zh=\u0627\u0644\u0635\u064a\u0646\u064a\u0629
languages.ar=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
@@ -313,19 +320,19 @@ languages.sv=\u0627\u0644\u0633\u0648\u064a\u062f\u064a\u0629
languages.af=\u0627\u0644\u0627\u0641\u0631\u064a\u0642\u064a\u0629
languages.mn=\u0627\u0644\u0645\u0646\u063a\u0648\u0644\u064a\u0629
languages.sr=\u0627\u0644\u0635\u0631\u0628\u064a\u0629
-languages.sq=\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629
languages.ab=\u0627\u0644\u0627\u0628\u062e\u0627\u0632\u064a\u0629
+languages.sq=\u0627\u0644\u0627\u0644\u0628\u0627\u0646\u064a\u0629
languages.aa=\u0627\u0644\u0627\u0641\u0627\u0631\u064a\u0629
languages.fr=\u0627\u0644\u0641\u0631\u0646\u0633\u064a\u0629
languages.lv=\u0627\u0644\u0644\u0627\u062a\u0641\u064a\u0629
languages.lt=\u0627\u0644\u0644\u062a\u0648\u0627\u0646\u064a\u0629
languages.ru=\u0627\u0644\u0631\u0648\u0633\u064a\u0629
-languages.afa=\u0627\u0641\u0631\u0648-\u0627\u0633\u064a\u0648\u064a\u0629
languages.fj=\u0627\u0644\u0641\u064a\u062c\u064a\u0629
+languages.afa=\u0627\u0641\u0631\u0648-\u0627\u0633\u064a\u0648\u064a\u0629
languages.fi=\u0627\u0644\u0641\u0646\u0644\u0646\u062f\u064a\u0629
languages.ro=\u0627\u0644\u0631\u0648\u0645\u0627\u0646\u064a\u0629
-languages.ber=\u0627\u0644\u0628\u0631\u0628\u0631\u064a\u0629
languages.arc=\u0627\u0644\u0627\u0631\u0627\u0645\u064a\u0629
+languages.ber=\u0627\u0644\u0628\u0631\u0628\u0631\u064a\u0629
languages.fa=\u0627\u0644\u0641\u0627\u0631\u0633\u064a\u0629
languages.la=\u0627\u0644\u0644\u0627\u062a\u064a\u0646\u064a\u0629
languages.et=\u0627\u0633\u062a\u0648\u0646\u064a\u0629
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_JO.properties b/resource/gnu/java/locale/LocaleInformation_ar_JO.properties
index 0dae11099..e16164cd6 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_JO.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ar_JO.properties
@@ -5,7 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4 #,##0.000;\u00a4 #,##0.000-
shortMonths=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a®\u0634\u0628\u0627\u0637®\u0622\u0630\u0627\u0631®\u0646\u064a\u0633\u0627\u0646®\u0623\u064a\u0627\u0631®\u062d\u0632\u064a\u0631\u0627\u0646®\u062a\u0645\u0648\u0632®\u0622\u0628®\u0623\u064a\u0644\u0648\u0644®\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644®\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a®\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644®®
months=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a®\u0634\u0628\u0627\u0637®\u0622\u0630\u0627\u0631®\u0646\u064a\u0633\u0627\u0646®\u0623\u064a\u0627\u0631®\u062d\u0632\u064a\u0631\u0627\u0646®\u062a\u0645\u0648\u0632®\u0622\u0628®\u0623\u064a\u0644\u0648\u0644®\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644®\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a®\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644®®
shortWeekdays=®\u0627\u0644\u0623\u062d\u062f®\u0627\u0644\u0627\u062b\u0646\u064a\u0646®\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621®\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621®\u0627\u0644\u062e\u0645\u064a\u0633®\u0627\u0644\u062c\u0645\u0639\u0629®\u0627\u0644\u0633\u0628\u062a®
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_QA.properties b/resource/gnu/java/locale/LocaleInformation_ar_QA.properties
index f004e1192..30061aa2c 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_QA.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ar_QA.properties
@@ -5,5 +5,5 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4###0.00;-\u00a4###0.00
+currencyFormat=\u00a4#0.00;-\u00a4#0.00
shortWeekdays=®\u0627\u0644\u0623\u062d\u062f®\u0627\u0644\u0627\u062b\u0646\u064a\u0646®\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621®\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621®\u0627\u0644\u062e\u0645\u064a\u0633®\u0627\u0644\u062c\u0645\u0639\u0629®\u0627\u0644\u0633\u0628\u062a®
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_SA.properties b/resource/gnu/java/locale/LocaleInformation_ar_SA.properties
index 56b7a61f0..ebb48f6a7 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_SA.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ar_SA.properties
@@ -5,5 +5,5 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4###0.00;-\u00a4###0.00
+currencyFormat=\u00a4#0.00;-\u00a4#0.00
shortWeekdays=®\u0627\u0644\u0623\u062d\u062f®\u0627\u0644\u0627\u062b\u0646\u064a\u0646®\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621®\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621®\u0627\u0644\u062e\u0645\u064a\u0633®\u0627\u0644\u062c\u0645\u0639\u0629®\u0627\u0644\u0633\u0628\u062a®
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_SY.properties b/resource/gnu/java/locale/LocaleInformation_ar_SY.properties
index f4b23d236..f09647795 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_SY.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ar_SY.properties
@@ -5,7 +5,7 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4###0.00;-\u00a4###0.00
+currencyFormat=\u00a4#0.00;-\u00a4#0.00
shortMonths=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a®\u0634\u0628\u0627\u0637®\u0622\u0630\u0627\u0631®\u0646\u064a\u0633\u0627\u0646®\u0646\u0648\u0627\u0631®\u062d\u0632\u064a\u0631\u0627\u0646®\u062a\u0645\u0648\u0632®\u0622\u0628®\u0623\u064a\u0644\u0648\u0644®\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644®\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a®\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644®®
months=\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a®\u0634\u0628\u0627\u0637®\u0622\u0630\u0627\u0631®\u0646\u064a\u0633\u0627\u0646®\u0646\u0648\u0627\u0631®\u062d\u0632\u064a\u0631\u0627\u0646®\u062a\u0645\u0648\u0632®\u0622\u0628®\u0623\u064a\u0644\u0648\u0644®\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644®\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a®\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644®®
shortWeekdays=®\u0627\u0644\u0623\u062d\u062f®\u0627\u0644\u0627\u062b\u0646\u064a\u0646®\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621®\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621®\u0627\u0644\u062e\u0645\u064a\u0633®\u0627\u0644\u062c\u0645\u0639\u0629®\u0627\u0644\u0633\u0628\u062a®
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_TN.properties b/resource/gnu/java/locale/LocaleInformation_ar_TN.properties
index 0fccecd41..32a12df14 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_TN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ar_TN.properties
@@ -6,5 +6,5 @@
# This file was automatically generated by gnu.localegen from CLDR.
zeroDigit=0
-currencyFormat=\u00a4###0.00;-\u00a4###0.00
+currencyFormat=\u00a4#0.00;-\u00a4#0.00
shortWeekdays=®\u0627\u0644\u0623\u062d\u062f®\u0627\u0644\u0627\u062b\u0646\u064a\u0646®\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621®\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621®\u0627\u0644\u062e\u0645\u064a\u0633®\u0627\u0644\u062c\u0645\u0639\u0629®\u0627\u0644\u0633\u0628\u062a®
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_YE.properties b/resource/gnu/java/locale/LocaleInformation_ar_YE.properties
index 6fb3a8dfe..1cebfe4ad 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_YE.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ar_YE.properties
@@ -5,5 +5,5 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4###0.00;-\u00a4###0.00
+currencyFormat=\u00a4#0.00;-\u00a4#0.00
shortWeekdays=®\u0627\u0644\u0623\u062d\u062f®\u0627\u0644\u0627\u062b\u0646\u064a\u0646®\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621®\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621®\u0627\u0644\u062e\u0645\u064a\u0633®\u0627\u0644\u062c\u0645\u0639\u0629®\u0627\u0644\u0633\u0628\u062a®
diff --git a/resource/gnu/java/locale/LocaleInformation_as_IN.properties b/resource/gnu/java/locale/LocaleInformation_as_IN.properties
index e7fad8d5f..254c6ad5a 100644
--- a/resource/gnu/java/locale/LocaleInformation_as_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_as_IN.properties
@@ -5,8 +5,9 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
+firstDayOfWeek=mon
shortDateFormat=d-M-yyyy
mediumDateFormat=dd-MM-yyyy
longDateFormat=d MMMM, yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_az.properties b/resource/gnu/java/locale/LocaleInformation_az.properties
new file mode 100644
index 000000000..addff83c0
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_az.properties
@@ -0,0 +1,18 @@
+# LocaleInformation_az.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+decimalSeparator=,
+groupingSeparator=\u00a0
+currenciesDisplayName.AZM=Manat
+currenciesSymbol.AZM=man.
+shortMonths=yan®fev®mar®apr®may®iyn®iyl®avq®sen®okt®noy®dek®®
+months=Yanvar®Fevral®Mart®Aprel®May®\u0130yun®\u0130yul®Avqust®Sentyabr®Oktyabr®Noyabr®Dekabr®®
+shortWeekdays=®B.®B.e.®\u00c7.a.®\u00c7.®C.a.®C.®\u015e.®
+weekdays=®bazar®bazar ert\u0259si®\u00e7\u0259r\u015f\u0259nb\u0259 ax\u015fam®\u00e7\u0259r\u015f\u0259nb\u0259®c\u00fcm\u0259 ax\u015fam\u0131®c\u00fcm\u0259®\u015f\u0259nb\u0259®
+eras=e.\u0259.®b.e.®
+territories.AZ=Az\u0259rbaycan
+languages.az=az\u0259rbaycanca
diff --git a/resource/gnu/java/locale/LocaleInformation_az_Cyrl.properties b/resource/gnu/java/locale/LocaleInformation_az_Cyrl.properties
index 8472b7cda..8e7e20796 100644
--- a/resource/gnu/java/locale/LocaleInformation_az_Cyrl.properties
+++ b/resource/gnu/java/locale/LocaleInformation_az_Cyrl.properties
@@ -5,9 +5,9 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=\u00a0
-currenciesDisplayName.AZM=AZM
+currenciesDisplayName.AZM=\u043c\u0430\u043d\u0430\u0442
currenciesSymbol.AZM=\u043c\u0430\u043d.
+months=\u0458\u0430\u043d\u0432\u0430\u0440®\u0444\u0435\u0432\u0440\u0430\u043b®\u043c\u0430\u0440\u0442®\u0430\u043f\u0440\u0435\u043b®\u043c\u0430\u0439®\u0438\u0458\u0443\u043d®\u0438\u0458\u0443\u043b®\u0430\u0432\u0433\u0443\u0441\u0442®\u0441\u0435\u043d\u0442\u0458\u0430\u0431\u0440®\u043e\u043a\u0442\u0458\u0430\u0431\u0440®\u043d\u043e\u0458\u0430\u0431\u0440®\u0434\u0435\u043a\u0430\u0431\u0440®®
+weekdays=®\u0431\u0430\u0437\u0430\u0440®\u0431\u0430\u0437\u0430\u0440 \u0435\u0440\u0442\u04d9\u0441\u0438®\u0447\u04d9\u0440\u0448\u04d9\u043d\u0431\u04d9 \u0430\u0445\u0448\u0430\u043c\u044b®\u0447\u04d9\u0440\u0448\u04d9\u043d\u0431\u04d9®\u04b9\u04af\u043c\u04d9 \u0430\u0445\u0448\u0430\u043c\u044b®\u04b9\u04af\u043c\u04d9®\u0448\u04d9\u043d\u0431\u04d9®
territories.AZ=\u0410\u0437\u04d9\u0440\u0431\u0430\u0458\u04b9\u0430\u043d
languages.az=\u0410\u0437\u04d9\u0440\u0431\u0430\u0458\u04b9\u0430\u043d
diff --git a/resource/gnu/java/locale/LocaleInformation_be.properties b/resource/gnu/java/locale/LocaleInformation_be.properties
index ac885c134..feea4f3a5 100644
--- a/resource/gnu/java/locale/LocaleInformation_be.properties
+++ b/resource/gnu/java/locale/LocaleInformation_be.properties
@@ -8,7 +8,15 @@
decimalSeparator=,
groupingSeparator=\u00a0
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.BYB=BYB
+currenciesDisplayName.INR=\u0456\u043d\u0434\u044b\u0439\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0456\u044f
+currenciesDisplayName.RUB=\u0440\u0443\u0441\u043a\u0456 \u0440\u0443\u0431\u0435\u043b\u044c
+currenciesDisplayName.JPY=\u044f\u043f\u043e\u043d\u0441\u043a\u0430\u044f \u0456\u0435\u043d\u0430
+currenciesDisplayName.BRL=\u0431\u0440\u0430\u0437\u0456\u043b\u044c\u0441\u043a\u0456 \u0440\u044d\u0430\u043b
+currenciesDisplayName.CNY=\u043a\u0456\u0442\u0430\u0439\u0441\u043a\u0456 \u044e\u0430\u043d\u044c Renminbi
+currenciesDisplayName.USD=\u0434\u043e\u043b\u0430\u0440 \u0417\u0428\u0410
+currenciesDisplayName.BYR=\u0431\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0456 \u0440\u0443\u0431\u0435\u043b\u044c
+currenciesDisplayName.EUR=\u0435\u045e\u0440\u0430
+currenciesDisplayName.GBP=\u0430\u043d\u0433\u043b\u0456\u0439\u0441\u043a\u0456 \u0444\u0443\u043d\u0442
currenciesSymbol.BYB=\u0420\u0443\u0431
shortMonths=\u0441\u0442\u0443®\u043b\u044e\u0442®\u0441\u0430\u043a®\u043a\u0440\u0430®\u043c\u0430\u0439®\u0447\u044d\u0440®\u043b\u0456\u043f®\u0436\u043d\u0456®\u0432\u0435\u0440®\u043a\u0430\u0441®\u043b\u0456\u0441®\u0441\u043d\u0435®®
months=\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c®\u043b\u044e\u0442\u044b®\u0441\u0430\u043a\u0430\u0432\u0456\u043a®\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a®\u043c\u0430\u0439®\u0447\u044d\u0440\u0432\u0435\u043d\u044c®\u043b\u0456\u043f\u0435\u043d\u044c®\u0436\u043d\u0456\u0432\u0435\u043d\u044c®\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c®\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a®\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434®\u0441\u043d\u0435\u0436\u0430\u043d\u044c®®
@@ -24,5 +32,26 @@ shortTimeFormat=HH.mm
mediumTimeFormat=HH.mm.ss
longTimeFormat=HH.mm.ss z
fullTimeFormat=HH.mm.ss z
+territories.FR=\u0424\u0440\u0430\u043d\u0446\u044b\u044f
territories.BY=\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u044c
+territories.IN=\u0406\u043d\u0434\u044b\u044f
+territories.CN=\u041a\u0456\u0442\u0430\u0439
+territories.DE=\u0413\u0435\u0440\u043c\u0430\u043d\u0456\u044f
+territories.GB=\u0412\u0435\u043b\u0456\u043a\u0430\u0431\u0440\u044b\u0442\u0430\u043d\u0456\u044f
+territories.BR=\u0411\u0440\u0430\u0437\u0456\u043b\u0456\u044f
+territories.RU=\u0420\u0430\u0441\u0456\u044f
+territories.JP=\u042f\u043f\u043e\u043d\u0456\u044f
+territories.US=\u0417\u043b\u0443\u0447\u0430\u043d\u044b\u044f \u0428\u0442\u0430\u0442\u044b
+territories.IT=\u0406\u0442\u0430\u043b\u0456\u044f
+languages.zh=\u043a\u0456\u0442\u0430\u0439\u0441\u043a\u0456
+languages.en=\u0430\u043d\u0433\u043b\u0456\u0439\u0441\u043a\u0456
+languages.ru=\u0440\u0443\u0441\u043a\u0456
+languages.hi=\u0445\u0456\u043d\u0434\u0437\u0456
+languages.ar=\u0430\u0440\u0430\u0431\u0441\u043a\u0456
+languages.it=\u0456\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0456
languages.be=\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0456
+languages.fr=\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0456
+languages.de=\u043d\u044f\u043c\u0435\u0446\u043a\u0456
+languages.es=\u0456\u0441\u043f\u0430\u043d\u0441\u043a\u0456
+languages.ja=\u044f\u043f\u043e\u043d\u0441\u043a\u0456
+languages.pt=\u043f\u0430\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0456
diff --git a/resource/gnu/java/locale/LocaleInformation_be_BY.properties b/resource/gnu/java/locale/LocaleInformation_be_BY.properties
index 435e36938..2095cf121 100644
--- a/resource/gnu/java/locale/LocaleInformation_be_BY.properties
+++ b/resource/gnu/java/locale/LocaleInformation_be_BY.properties
@@ -5,4 +5,4 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4#,##0;-\u00a4#,##0
+currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
diff --git a/resource/gnu/java/locale/LocaleInformation_bg.properties b/resource/gnu/java/locale/LocaleInformation_bg.properties
index 0f4396a4b..9ac9b7274 100644
--- a/resource/gnu/java/locale/LocaleInformation_bg.properties
+++ b/resource/gnu/java/locale/LocaleInformation_bg.properties
@@ -9,160 +9,126 @@ decimalSeparator=,
groupingSeparator=\u00a0
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
currenciesDisplayName.YDD=\u0419\u0435\u043c\u0435\u043d\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.GRN=\u0413\u0440\u044a\u0446\u043a\u0430 \u043d\u043e\u0432\u0430 \u0434\u0440\u0430\u0445\u043c\u0430
-currenciesDisplayName.KES=\u041a\u0435\u043d\u0438\u0439\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.TWD=\u0422\u0430\u0439\u0432\u0430\u043d\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.LKR=\u0428\u0440\u0438\u043b\u0430\u043d\u043a\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
+currenciesDisplayName.KES=\u041a\u0435\u043d\u0438\u0439\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.BYB=\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u0440\u0443\u0431\u043b\u0430 (1994-1999)
-currenciesDisplayName.TJS=\u0422\u0430\u0434\u0436\u0438\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0441\u043e\u043c\u043e\u043d\u0438
+currenciesDisplayName.LKR=\u0428\u0440\u0438\u043b\u0430\u043d\u043a\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.RWF=\u0420\u0443\u0430\u043d\u0434\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.ERN=\u0415\u0440\u0438\u0442\u0440\u0435\u0439\u0441\u043a\u0430 \u043d\u0430\u043a\u0444\u0430
-currenciesDisplayName.TJR=\u0422\u0430\u0434\u0436\u0438\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u0431\u043b\u0430
+currenciesDisplayName.TJS=\u0422\u0430\u0434\u0436\u0438\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0441\u043e\u043c\u043e\u043d\u0438
currenciesDisplayName.SDP=\u0421\u0443\u0434\u0430\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.GRD=\u0413\u0440\u044a\u0446\u043a\u0430 \u0434\u0440\u0430\u0445\u043c\u0430
+currenciesDisplayName.TJR=\u0422\u0430\u0434\u0436\u0438\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u0431\u043b\u0430
+currenciesDisplayName.ERN=\u0415\u0440\u0438\u0442\u0440\u0435\u0439\u0441\u043a\u0430 \u043d\u0430\u043a\u0444\u0430
currenciesDisplayName.AFN=\u0410\u0444\u0433\u0430\u043d\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0430\u0444\u0433\u0430\u043d
+currenciesDisplayName.GRD=\u0413\u0440\u044a\u0446\u043a\u0430 \u0434\u0440\u0430\u0445\u043c\u0430
currenciesDisplayName.IEP=\u0418\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.ARS=\u0410\u0440\u0436\u0435\u043d\u0442\u0438\u043d\u0441\u043a\u043e \u043f\u0435\u0441\u043e
-currenciesDisplayName.MQF=\u041c\u0430\u0440\u0442\u0438\u043d\u0438\u043a\u0430 - \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.ARP=\u0410\u0440\u0436\u0435\u043d\u0442\u0438\u043d\u0441\u043a\u043e \u043f\u0435\u0441\u043e (1983-1985)
currenciesDisplayName.SDD=\u0421\u0443\u0434\u0430\u043d\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.ARP=\u0410\u0440\u0436\u0435\u043d\u0442\u0438\u043d\u0441\u043a\u043e \u043f\u0435\u0441\u043e (1983-1985)
currenciesDisplayName.GEL=\u0413\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438 \u043b\u0430\u0440\u0438
currenciesDisplayName.AFA=\u0410\u0444\u0433\u0430\u043d\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0430\u0444\u0433\u0430\u043d (1927-2002)
currenciesDisplayName.CRC=\u041a\u043e\u0441\u0442\u0430\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u043a\u043e\u043b\u043e\u043d
currenciesDisplayName.FKP=\u0424\u043e\u043b\u043a\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.EEK=\u0415\u0441\u0442\u043e\u043d\u0441\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.MDL=\u041c\u043e\u043b\u0434\u043e\u0432\u0441\u043a\u043e \u043b\u0435\u0443
currenciesDisplayName.HKD=\u0425\u043e\u043d\u0433\u043a\u043e\u043d\u0433\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.MDL=\u041c\u043e\u043b\u0434\u043e\u0432\u0441\u043a\u043e \u043b\u0435\u0443
currenciesDisplayName.IQD=\u0418\u0440\u0430\u043a\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.SCR=\u0421\u0435\u0439\u0448\u0435\u043b\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.VUV=\u0412\u0430\u043d\u0443\u0430\u0442\u0443 - \u0432\u0430\u0442\u0443
-currenciesDisplayName.KPW=\u0421\u0435\u0432\u0435\u0440\u043d\u043e\u043a\u043e\u0440\u0435\u0439\u0441\u043a\u0438 \u0432\u043e\u043d
currenciesDisplayName.DKK=\u0414\u0430\u0442\u0441\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
+currenciesDisplayName.KPW=\u0421\u0435\u0432\u0435\u0440\u043d\u043e\u043a\u043e\u0440\u0435\u0439\u0441\u043a\u0438 \u0432\u043e\u043d
currenciesDisplayName.IDR=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
-currenciesDisplayName.IDN=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u0440\u0443\u043f\u0438\u044f
-currenciesDisplayName.SOS=\u0421\u043e\u043c\u0430\u043b\u0438\u0439\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.LVR=\u041b\u0430\u0442\u0432\u0438\u0439\u0441\u043a\u0430 \u0440\u0443\u0431\u043b\u0430
+currenciesDisplayName.SOS=\u0421\u043e\u043c\u0430\u043b\u0438\u0439\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.AED=\u041e\u0431\u0435\u0434\u0438\u043d\u0435\u043d\u0438 \u0430\u0440\u0430\u0431\u0441\u043a\u0438 \u0435\u043c\u0438\u0440\u0441\u0442\u0432\u0430-\u0434\u0438\u0440\u0445\u0430\u043c
-currenciesDisplayName.LVL=\u041b\u0430\u0442\u0432\u0438\u0439\u0441\u043a\u0438 \u043b\u0430\u0442
currenciesDisplayName.BWP=\u0411\u043e\u0442\u0441\u0443\u0430\u043d\u0441\u043a\u0430 \u043f\u0443\u043b\u0430
+currenciesDisplayName.LVL=\u041b\u0430\u0442\u0432\u0438\u0439\u0441\u043a\u0438 \u043b\u0430\u0442
currenciesDisplayName.RUR=\u0420\u0443\u0441\u043a\u0430 \u0440\u0443\u0431\u043b\u0430 (1991-1998)
-currenciesDisplayName.FJP=\u0424\u0438\u0434\u0436\u0438 - \u043b\u0438\u0440\u0430
-currenciesDisplayName.NIG=\u041d\u0438\u043a\u0430\u0440\u0430\u0433\u0443\u0430\u043d\u0441\u043a\u0430 \u0437\u043b\u0430\u0442\u043d\u0430 \u043a\u043e\u0440\u0434\u043e\u0431\u0430
-currenciesDisplayName.MOP=\u041c\u0430\u043a\u0430\u043e - \u043f\u0430\u0442\u0430\u043a\u0430
-currenciesDisplayName.GPF=\u0413\u0432\u0430\u0434\u0435\u043b\u0443\u043f\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.FJD=\u0424\u0438\u0434\u0436\u0438 - \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.ADP=\u0410\u043d\u0434\u043e\u0440\u0441\u043a\u0430 \u043f\u0435\u0441\u0435\u0442\u0430
+currenciesDisplayName.FJD=\u0424\u0438\u0434\u0436\u0438 - \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.MOP=\u041c\u0430\u043a\u0430\u043e - \u043f\u0430\u0442\u0430\u043a\u0430
currenciesDisplayName.RUB=\u0420\u0443\u0441\u043a\u0430 \u0440\u0443\u0431\u043b\u0430
currenciesDisplayName.CDF=\u041a\u043e\u043d\u0433\u043e\u0430\u043d\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.NIC=\u041d\u0438\u043a\u0430\u0440\u0430\u0433\u0443\u0430\u043d\u0441\u043a\u0430 \u043a\u043e\u0440\u0434\u043e\u0431\u0430
currenciesDisplayName.DJF=\u0414\u0436\u0438\u0431\u0443\u0442\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.LIF=\u041b\u0438\u0445\u0442\u0435\u043d\u0449\u0430\u0439\u043d\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.UZS=\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0441\u0443\u043c
currenciesDisplayName.SBD=\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u043e\u0432\u0438 \u043e\u0441\u0442\u0440\u043e\u0432\u0438 - \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.ADD=\u0410\u043d\u0434\u043e\u0440\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.TTO=\u0422\u0440\u0438\u043d\u0438\u0434\u0430\u0442 \u0438 \u0422\u043e\u0431\u0430\u0433\u043e - \u0441\u0442\u0430\u0440 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.UZS=\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0441\u0443\u043c
currenciesDisplayName.ECS=\u0415\u043a\u0432\u0430\u0434\u043e\u0440\u0441\u043a\u043e \u0441\u0443\u043a\u0440\u0435
-currenciesDisplayName.THB=\u0422\u0430\u0439\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0431\u0430\u0442
currenciesDisplayName.PHP=\u0424\u0438\u043b\u0438\u043f\u0438\u043d\u0441\u043a\u043e \u043f\u0435\u0441\u043e
+currenciesDisplayName.THB=\u0422\u0430\u0439\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0431\u0430\u0442
currenciesDisplayName.LUF=\u041b\u044e\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.FIN=\u0424\u0438\u043d\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0430 (1860-1962)
currenciesDisplayName.FIM=\u0424\u0438\u043d\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.TTD=\u0422\u0440\u0438\u043d\u0438\u0434\u0430\u0442 \u0438 \u0422\u043e\u0431\u0430\u0433\u043e - \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.SZL=\u0421\u0432\u0430\u0437\u0438\u043b\u0435\u043d\u0434\u0441\u043a\u0438 \u043b\u0438\u043b\u0430\u043d\u0433\u0435\u043d\u0438
currenciesDisplayName.MNT=\u041c\u043e\u043d\u0433\u043e\u043b\u0441\u043a\u0438 \u0442\u0443\u0433\u0440\u0438\u043a
-currenciesDisplayName.UAK=\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438 \u043a\u0430\u0440\u0431\u043e\u0432\u0430\u043d\u0435\u0446
currenciesDisplayName.SAR=\u0421\u0430\u0443\u0434\u0438\u0442\u0441\u043a\u043e\u0430\u0440\u0430\u0431\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
+currenciesDisplayName.UAK=\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438 \u043a\u0430\u0440\u0431\u043e\u0432\u0430\u043d\u0435\u0446
currenciesDisplayName.UAH=\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0430 \u0445\u0440\u0438\u0432\u043d\u044f
currenciesDisplayName.HUF=\u0423\u043d\u0433\u0430\u0440\u0441\u043a\u0438 \u0444\u043e\u0440\u0438\u043d\u0442
-currenciesDisplayName.QAR=\u041a\u0430\u0442\u0430\u0440\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.COP=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u0439\u0441\u043a\u043e \u043f\u0435\u0441\u043e
+currenciesDisplayName.QAR=\u041a\u0430\u0442\u0430\u0440\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.PTE=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u043e \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.AOS=\u0410\u043d\u0433\u043e\u043b\u0441\u043a\u043e \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.UYU=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u043a\u043e \u043f\u0435\u0441\u043e
currenciesDisplayName.AOR=\u0410\u043d\u0433\u043e\u043b\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u043a\u0432\u0430\u043d\u0446\u0430 (1995-1999)
+currenciesDisplayName.UYU=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u043a\u043e \u043f\u0435\u0441\u043e
currenciesDisplayName.GBP=\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.BUR=\u0411\u0438\u0440\u043c\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
-currenciesDisplayName.ZRZ=\u0417\u0430\u0438\u0440\u0441\u043a\u043e \u0437\u0430\u0439\u0440\u0435
-currenciesDisplayName.INR=\u0418\u043d\u0434\u0438\u0439\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.BIF=\u0411\u0443\u0440\u0443\u043d\u0434\u0438\u0439\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.LTL=\u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438 \u043b\u0438\u0442\u0430\u0437
+currenciesDisplayName.INR=\u0418\u043d\u0434\u0438\u0439\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
+currenciesDisplayName.ZRZ=\u0417\u0430\u0438\u0440\u0441\u043a\u043e \u0437\u0430\u0439\u0440\u0435
currenciesDisplayName.AON=\u0410\u043d\u0433\u043e\u043b\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u043a\u0432\u0430\u043d\u0446\u0430 (1990-2000)
-currenciesDisplayName.UYP=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u043a\u043e \u043f\u0435\u0441\u043e (1975-1993)
-currenciesDisplayName.SML=\u0421\u0430\u043d \u041c\u0430\u0440\u0438\u043d\u043e - \u043b\u0438\u0440\u0430
-currenciesDisplayName.MZM=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a\u0441\u043a\u0438 \u043c\u0435\u0442\u0438\u043a\u0430\u043b
+currenciesDisplayName.LTL=\u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438 \u043b\u0438\u0442\u0430\u0437
currenciesDisplayName.KZT=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d\u0441\u043a\u043e \u0442\u0435\u043d\u0433\u0435
-currenciesDisplayName.KZR=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u0431\u043b\u0430
+currenciesDisplayName.MZM=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a\u0441\u043a\u0438 \u043c\u0435\u0442\u0438\u043a\u0430\u043b
+currenciesDisplayName.UYP=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u043a\u043e \u043f\u0435\u0441\u043e (1975-1993)
currenciesDisplayName.AOK=\u0410\u043d\u0433\u043e\u043b\u0441\u043a\u0430 \u043a\u0432\u0430\u043d\u0446\u0430 (1977-1990)
currenciesDisplayName.XFO=\u0424\u0440\u0435\u043d\u0441\u043a\u0438 \u0437\u043b\u0430\u0442\u0435\u043d \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.PGK=\u041f\u0430\u043f\u0443\u0430-\u043d\u043e\u0432\u043e\u0433\u0432\u0438\u043d\u0435\u0439\u0441\u043a\u0430 \u043a\u0438\u043d\u0430
currenciesDisplayName.SYP=\u0421\u0438\u0440\u0438\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.OMR=\u041e\u043c\u0430\u043d\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
-currenciesDisplayName.NGP=\u041d\u0438\u0433\u0435\u0440\u0438\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.MZE=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a\u0441\u043a\u043e \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.MMX=\u041c\u0438\u044f\u043d\u043c\u0430\u0440\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.ZRN=\u0417\u0430\u0438\u0440\u0441\u043a\u043e \u043d\u043e\u0432\u043e \u0437\u0430\u0439\u0440\u0435
+currenciesDisplayName.OMR=\u041e\u043c\u0430\u043d\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.NGN=\u041d\u0438\u0433\u0435\u0440\u0438\u0439\u0441\u043a\u0430 \u043d\u0430\u0439\u0440\u0430
-currenciesDisplayName.PSP=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.CNY=\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438 \u0440\u0435\u043d\u043c\u0438\u043d\u0431\u0438 \u044e\u0430\u043d
+currenciesDisplayName.ZRN=\u0417\u0430\u0438\u0440\u0441\u043a\u043e \u043d\u043e\u0432\u043e \u0437\u0430\u0439\u0440\u0435
currenciesDisplayName.AOA=\u0410\u043d\u0433\u043e\u043b\u0441\u043a\u0430 \u043a\u0432\u0430\u043d\u0446\u0430
-currenciesDisplayName.GNI=\u0413\u0432\u0438\u043d\u0435\u0439\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a (1960-1972)
+currenciesDisplayName.CNY=\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438 \u0440\u0435\u043d\u043c\u0438\u043d\u0431\u0438 \u044e\u0430\u043d
currenciesDisplayName.MAF=\u041c\u0430\u0440\u043e\u043a\u0430\u043d\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.GNF=\u0413\u0432\u0438\u043d\u0435\u0439\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.MAD=\u041c\u0430\u0440\u043e\u043a\u0430\u043d\u0441\u043a\u0438 \u0434\u0438\u0440\u0445\u0430\u043c
currenciesDisplayName.HTG=\u0425\u0430\u0438\u0442\u0441\u043a\u0438 \u0433\u0443\u0440\u0434
+currenciesDisplayName.MAD=\u041c\u0430\u0440\u043e\u043a\u0430\u043d\u0441\u043a\u0438 \u0434\u0438\u0440\u0445\u0430\u043c
+currenciesDisplayName.TRY=\u041d\u043e\u0432\u0430 \u0442\u0443\u0440\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.MMK=\u041c\u0438\u044f\u043d\u043c\u0430\u0440\u0441\u043a\u0438 (\u0411\u0438\u0440\u043c\u0430) \u043a\u0438\u044f\u0442
currenciesDisplayName.MYR=\u041c\u0430\u043b\u0430\u0439\u0437\u0438\u0439\u0441\u043a\u0438 \u0440\u0438\u043d\u0433\u0438\u0442
-currenciesDisplayName.BTR=\u0411\u0443\u0442\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
-currenciesDisplayName.XEU=\u0415\u043a\u0443 \u043d\u0430 \u0415\u0418\u041e
currenciesDisplayName.LSL=\u041b\u0435\u0441\u043e\u0442\u0441\u043a\u043e \u043b\u043e\u0442\u0438
-currenciesDisplayName.SLL=\u0421\u0438\u0435\u0440\u0430\u043b\u0435\u043e\u043d\u0441\u043a\u043e \u043b\u0435\u043e\u043d\u0435
+currenciesDisplayName.XEU=\u0415\u043a\u0443 \u043d\u0430 \u0415\u0418\u041e
currenciesDisplayName.BHD=\u0411\u0430\u0445\u0440\u0435\u0439\u043d\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.SLL=\u0421\u0438\u0435\u0440\u0430\u043b\u0435\u043e\u043d\u0441\u043a\u043e \u043b\u0435\u043e\u043d\u0435
currenciesDisplayName.BTN=\u0411\u0443\u0442\u0430\u043d\u0441\u043a\u0438 \u043d\u0433\u0443\u043b\u0442\u0440\u0443\u043c
currenciesDisplayName.TRL=\u0422\u0443\u0440\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.KMF=\u041a\u043e\u043c\u043e\u0440\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.GAF=\u0413\u0430\u0431\u043e\u043d - CFA \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.CZK=\u0427\u0435\u0448\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.ANG=\u0410\u043d\u0442\u0438\u043b\u0441\u043a\u0438 \u0433\u0443\u043b\u0434\u0435\u043d
-currenciesDisplayName.GMP=\u0413\u0430\u043c\u0431\u0438\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.BGX=\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043b\u0435\u0432
+currenciesDisplayName.CZK=\u0427\u0435\u0448\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.AZM=\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d\u0441\u043a\u0438 \u043c\u0430\u043d\u0430\u0442
currenciesDisplayName.KYD=\u041a\u0430\u0439\u043c\u0430\u043d\u043e\u0432\u0438 \u043e\u0441\u0442\u0440\u043e\u0432\u0438 - \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.GMD=\u0413\u0430\u043c\u0431\u0438\u0439\u0441\u043a\u0438 \u0434\u0430\u043b\u0430\u0441\u0438
-currenciesDisplayName.BGO=\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 \u043b\u0435\u0432 (1879-1952)
-currenciesDisplayName.BGN=BGN
+currenciesDisplayName.BGN=\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 \u043b\u0435\u0432
currenciesDisplayName.CAD=\u041a\u0430\u043d\u0430\u0434\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.BGM=\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0435\u0432
-currenciesDisplayName.BGL=BGL
currenciesDisplayName.VEB=\u0412\u0435\u043d\u0435\u0441\u0443\u0435\u043b\u0441\u043a\u0438 \u0431\u043e\u043b\u0438\u0432\u0430\u0440
-currenciesDisplayName.MXP=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u043e \u0441\u0440\u0435\u0431\u044a\u0440\u043d\u043e \u043f\u0435\u0441\u043e (1861-1992)
currenciesDisplayName.ILS=\u0418\u0437\u0440\u0430\u0435\u043b\u0441\u043a\u0438 \u043d\u043e\u0432 \u0448\u0435\u043a\u0435\u043b
+currenciesDisplayName.MXP=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u043e \u0441\u0440\u0435\u0431\u044a\u0440\u043d\u043e \u043f\u0435\u0441\u043e (1861-1992)
currenciesDisplayName.PES=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u043a\u0438 \u0441\u043e\u043b
-currenciesDisplayName.BSP=\u0411\u0430\u0445\u0430\u043c\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.MXN=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u043e \u043d\u043e\u0432\u043e \u043f\u0435\u0441\u043e
currenciesDisplayName.GYD=\u0413\u0430\u044f\u043d\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.MXN=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u043e \u043d\u043e\u0432\u043e \u043f\u0435\u0441\u043e
currenciesDisplayName.ILP=\u0418\u0437\u0440\u0430\u0435\u043b\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.CYP=\u041a\u0438\u043f\u044a\u0440\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.SKK=\u0421\u043b\u043e\u0432\u0430\u0448\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
+currenciesDisplayName.CYP=\u041a\u0438\u043f\u044a\u0440\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.PEN=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u043a\u0438 \u043d\u043e\u0432 \u0441\u043e\u043b
-currenciesDisplayName.ILL=\u0418\u0437\u0440\u0430\u0435\u043b\u0441\u043a\u0438 \u0448\u0435\u043a\u0435\u043b
currenciesDisplayName.LRD=\u041b\u0438\u0431\u0435\u0440\u0438\u0439\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.AMD=\u0410\u0440\u043c\u0435\u043d\u0441\u043a\u0438 \u0434\u0440\u0430\u043c
currenciesDisplayName.BSD=\u0411\u0430\u0445\u0430\u043c\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.GLK=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.HRK=\u0425\u044a\u0440\u0432\u0430\u0442\u0441\u043a\u0430 \u043a\u0443\u043d\u0430
-currenciesDisplayName.MKN=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0434\u0435\u043d\u0430\u0440 (1992-1993)
-currenciesDisplayName.ALX=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.CLP=\u0427\u0438\u043b\u0438\u0439\u0441\u043a\u043e \u043f\u0435\u0441\u043e
currenciesDisplayName.HRD=\u0425\u044a\u0440\u0432\u0430\u0442\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.ALV=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438 \u0432\u0430\u043b\u0443\u0442\u0435\u043d \u043b\u0435\u043a
currenciesDisplayName.XPF=\u0424\u0440\u0435\u043d\u0441\u043a\u043e\u043f\u043e\u043b\u0438\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.FRF=\u0424\u0440\u0435\u043d\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.MWP=\u041c\u0430\u043b\u0430\u0432\u0438\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.MKD=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0434\u0435\u043d\u0430\u0440
-currenciesDisplayName.TPP=\u0422\u0438\u043c\u043e\u0440\u0441\u043a\u0430 \u043f\u0430\u0442\u0430\u043a\u0430
currenciesDisplayName.ALL=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438 \u043b\u0435\u043a
-currenciesDisplayName.CLE=\u0427\u0438\u043b\u0438\u0439\u0441\u043a\u043e \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.ALK=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438 \u043b\u0435\u043a (1946-1961)
currenciesDisplayName.MWK=\u041c\u0430\u043b\u0430\u0432\u0438\u0439\u0441\u043a\u0430 \u043a\u0432\u0430\u0447\u0430
currenciesDisplayName.BRL=\u0411\u0440\u0430\u0437\u0438\u043b\u0441\u043a\u0438 \u0440\u0435\u0430\u043b
currenciesDisplayName.TPE=\u0422\u0438\u043c\u043e\u0440\u0441\u043a\u043e \u0435\u0441\u043a\u0443\u0434\u043e
@@ -179,30 +145,22 @@ currenciesDisplayName.SIT=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438
currenciesDisplayName.JPY=\u042f\u043f\u043e\u043d\u0441\u043a\u0430 \u0439\u0435\u043d\u0430
currenciesDisplayName.XOF=\u0411\u0435\u043d\u0438\u043d - CFA \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.MVR=\u041c\u0430\u043b\u0434\u0438\u0432\u0441\u043a\u0430 \u0440\u0443\u0444\u0438\u044f
-currenciesDisplayName.MVP=\u041c\u0430\u043b\u0434\u0438\u0432\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f - \u041c\u0430\u043b\u0434\u0438\u0432\u0438
currenciesDisplayName.BEF=\u0411\u0435\u043b\u0433\u0438\u0439\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.TOP=\u0422\u043e\u043d\u0433\u0430 - \u043f\u0430 \u0430\u043d\u0433\u0430
currenciesDisplayName.BEC=\u0411\u0435\u043b\u0433\u0438\u0439\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a (\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c)
-currenciesDisplayName.CKD=\u041e\u0441\u0442\u0440\u043e\u0432\u0438 \u041a\u0443\u043a-\u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.SUR=\u0421\u044a\u0432\u0435\u0442\u0441\u043a\u0430 \u0440\u0443\u0431\u043b\u0430
-currenciesDisplayName.RON=\u0420\u0443\u043c\u044a\u043d\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u043b\u0435\u044f
currenciesDisplayName.ROL=\u0420\u0443\u043c\u044a\u043d\u0441\u043a\u0430 \u043b\u0435\u044f
-currenciesDisplayName.SUN=\u0421\u044a\u0432\u0435\u0442\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u0440\u0443\u0431\u043b\u0430
currenciesDisplayName.BDT=\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448\u043a\u0430 \u0442\u0430\u043a\u0430
currenciesDisplayName.AWG=\u0410\u0440\u0443\u0431\u0441\u043a\u0438 \u0433\u0438\u043b\u0434\u0435\u0440 - \u043e. \u0410\u0440\u0443\u0431\u0430
-currenciesDisplayName.VNS=\u0412\u0438\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 \u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0435\u043d \u0434\u043e\u043d\u0433
currenciesDisplayName.NOK=\u041d\u043e\u0440\u0432\u0435\u0436\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.VNN=\u0412\u0438\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 \u043d\u043e\u0432 \u0434\u043e\u043d\u0433
currenciesDisplayName.MUR=\u041c\u0430\u0432\u0440\u0438\u0446\u0438\u0439\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.ZAR=\u042e\u0436\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u0440\u0430\u043d\u0434
currenciesDisplayName.SHP=\u0421\u0432\u0435\u0442\u0430 \u0415\u043b\u0435\u043d\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.ZAP=\u042e\u0436\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.XAU=\u0417\u043b\u0430\u0442\u043e
currenciesDisplayName.ZAL=\u042e\u0436\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u0440\u0430\u043d\u0434 (\u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432)
currenciesDisplayName.VND=\u0412\u0438\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 \u0434\u043e\u043d\u0433
currenciesDisplayName.TZS=\u0422\u0430\u043d\u0437\u0430\u043d\u0438\u0439\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.GIP=\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.ZMP=\u0417\u0430\u043c\u0431\u0438\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.TND=\u0422\u0443\u043d\u0438\u0437\u0438\u0439\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.CVE=\u041a\u0430\u0431\u043e \u0412\u0435\u0440\u0434\u0435 \u0435\u0441\u043a\u0443\u0434\u043e
currenciesDisplayName.UGX=\u0423\u0433\u0430\u043d\u0434\u0438\u0439\u0441\u043a\u0438 \u043d\u043e\u0432 \u0448\u0438\u043b\u0438\u043d\u0433
@@ -210,71 +168,51 @@ currenciesDisplayName.ZMK=\u0417\u0430\u043c\u0431\u0438\u0439\u0441\u043a\u0430
currenciesDisplayName.JOD=\u0419\u043e\u0440\u0434\u0430\u043d\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.XAF=\u0411\u0443\u0440\u043a\u0438\u043d\u0430 \u0424\u0430\u0441\u043e - CFA - \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.LBP=\u041b\u0438\u0432\u0430\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.VAL=\u0412\u0430\u0442\u0438\u043a\u0430\u043d\u0430 - \u043b\u0438\u0440\u0430
currenciesDisplayName.UGS=\u0423\u0433\u0430\u043d\u0434\u0438\u0439\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433 (1966-1987)
-currenciesDisplayName.STE=\u0421\u0430\u043e \u0422\u043e\u043c\u0435 \u0438 \u041f\u0440\u0438\u043d\u0441\u0438\u043f\u0438 - \u0435\u0441\u043a\u0443\u0434\u043e
currenciesDisplayName.STD=\u0421\u0430\u043e \u0422\u043e\u043c\u0435 \u0438 \u041f\u0440\u0438\u043d\u0441\u0438\u043f\u0438 - \u0434\u043e\u0431\u0440\u0430
currenciesDisplayName.WST=\u0421\u0430\u043c\u043e\u0430 - \u0442\u0430\u043b\u0430
currenciesDisplayName.KHR=\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0430\u043d\u0441\u043a\u0438 \u0440\u0438\u0435\u043b
-currenciesDisplayName.DOP=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u043e \u043f\u0435\u0441\u043e
currenciesDisplayName.EUR=\u0415\u0432\u0440\u043e
-currenciesDisplayName.LNR=\u0421\u0435\u0439\u043b\u043e\u043d\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
-currenciesDisplayName.WSP=\u0421\u0430\u043c\u043e\u0430 - \u043b\u0438\u0440\u0430
-currenciesDisplayName.KHO=\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0430\u043d\u0441\u043a\u0438 \u0441\u0442\u0430\u0440 \u0440\u0438\u0435\u043b
-currenciesDisplayName.MHD=\u041c\u0430\u0440\u0448\u0430\u043b\u0441\u043a\u0438 \u043e\u0441\u0442\u0440\u043e\u0432\u0438-\u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.DOP=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u043e \u043f\u0435\u0441\u043e
currenciesDisplayName.BOP=\u0411\u043e\u043b\u0438\u0432\u0438\u0439\u0441\u043a\u043e \u043f\u0435\u0441\u043e
-currenciesDisplayName.NZP=\u041d\u043e\u0432\u043e\u0437\u0435\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.CUP=\u041a\u0443\u0431\u0438\u043d\u0441\u043a\u043e \u043f\u0435\u0441\u043e
currenciesDisplayName.MTL=\u041c\u0430\u043b\u0442\u0438\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
+currenciesDisplayName.CUP=\u041a\u0443\u0431\u0438\u043d\u0441\u043a\u043e \u043f\u0435\u0441\u043e
currenciesDisplayName.TMM=\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u043c\u0430\u043d\u0430\u0442
-currenciesDisplayName.BOL=\u0411\u043e\u043b\u0438\u0432\u0438\u0439\u0441\u043a\u043e \u0431\u043e\u043b\u0438\u0432\u0438\u0430\u043d\u043e (1863-1962)
-currenciesDisplayName.GHP=\u0413\u0430\u043d\u0430\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.SSP=\u0428\u043e\u0442\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.AUP=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.GHO=\u0413\u0430\u043d\u0430\u0439\u0441\u043a\u0438 \u0441\u0442\u0430\u0440\u0438 \u0441\u0435\u0434\u0438
currenciesDisplayName.SGD=\u0421\u0438\u043d\u0433\u0430\u043f\u0443\u0440\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.NZD=\u041d\u043e\u0432\u043e\u0437\u0435\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.USD=\u0421\u0410\u0429 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.BOB=\u0411\u043e\u043b\u0438\u0432\u0438\u0439\u0441\u043a\u043e \u0431\u043e\u043b\u0438\u0432\u0438\u0430\u043d\u043e
currenciesDisplayName.HNL=\u0425\u043e\u043d\u0434\u0443\u0440\u0430\u0441\u043a\u0430 \u043b\u0435\u043c\u043f\u0438\u0440\u0430
-currenciesDisplayName.ITL=\u0418\u0442\u0430\u043b\u0438\u0430\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
+currenciesDisplayName.BOB=\u0411\u043e\u043b\u0438\u0432\u0438\u0439\u0441\u043a\u043e \u0431\u043e\u043b\u0438\u0432\u0438\u0430\u043d\u043e
currenciesDisplayName.PAB=\u041f\u0430\u043d\u0430\u043c\u0441\u043a\u0438 \u0431\u0430\u043b\u0431\u043e\u0430
+currenciesDisplayName.ITL=\u0418\u0442\u0430\u043b\u0438\u0430\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.GTQ=\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0441\u043a\u0438 \u043a\u0432\u0435\u0442\u0437\u0430\u043b
-currenciesDisplayName.AUD=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0439\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.GHC=\u0413\u0430\u043d\u0430\u0439\u0441\u043a\u0438 \u0441\u0435\u0434\u0438
-currenciesDisplayName.LAK=\u041b\u0430\u043e\u0441\u043a\u0438 \u043a\u0438\u043f
currenciesDisplayName.NAD=\u041d\u0430\u043c\u0438\u0431\u0438\u0439\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.LAK=\u041b\u0430\u043e\u0441\u043a\u0438 \u043a\u0438\u043f
+currenciesDisplayName.GHC=\u0413\u0430\u043d\u0430\u0439\u0441\u043a\u0438 \u0441\u0435\u0434\u0438
+currenciesDisplayName.AUD=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0439\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.KGS=\u041a\u0438\u0440\u0433\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0441\u043e\u043c
currenciesDisplayName.MGF=\u041c\u0430\u043b\u0433\u0430\u0448\u043a\u0438 \u0444\u0440\u0430\u043d\u043a - \u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440
-currenciesDisplayName.BBD=\u0411\u0430\u0440\u0431\u0435\u0439\u0434\u043e\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.CHF=\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.BBD=\u0411\u0430\u0440\u0431\u0435\u0439\u0434\u043e\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.PYG=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439\u0441\u043a\u043e \u0433\u0443\u0430\u0440\u0430\u043d\u0438
-currenciesDisplayName.JMP=\u042f\u043c\u0430\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.PLZ=\u041f\u043e\u043b\u0441\u043a\u0430 \u0437\u043b\u043e\u0442\u0430 (1950-1995)
-currenciesDisplayName.PLX=\u041f\u043e\u043b\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.YER=\u0419\u0435\u043c\u0435\u043d\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.ATS=\u0410\u0432\u0441\u0442\u0440\u0438\u0439\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
-currenciesDisplayName.ETD=\u0415\u0442\u0438\u043e\u043f\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.LYP=\u041b\u0438\u0431\u0438\u0439\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.ETB=\u0415\u0442\u0438\u043e\u043f\u0441\u043a\u0438 \u0431\u0438\u0440
currenciesDisplayName.BND=\u0411\u0440\u0443\u043d\u0435\u0439\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.DZF=\u0410\u043b\u0436\u0438\u0440\u0441\u043a\u0438 \u043d\u043e\u0432 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.EGP=\u0415\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.JMD=\u042f\u043c\u0430\u0439\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.EGP=\u0415\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.PLN=\u041f\u043e\u043b\u0441\u043a\u0430 \u0437\u043b\u043e\u0442\u0430
currenciesDisplayName.DZD=\u0410\u043b\u0436\u0438\u0440\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.ISK=\u0418\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.SRG=\u0421\u0443\u0440\u0438\u043d\u0430\u043c\u0441\u043a\u0438 \u0433\u0438\u043b\u0434\u0435\u0440
-currenciesDisplayName.BZH=\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0438 \u0445\u043e\u043d\u0434\u0443\u0440\u0430\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.LYD=\u041b\u0438\u0431\u0438\u0439\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.BAN=\u0411\u043e\u0441\u043d\u0430 \u0438 \u0425\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0438\u043d\u0430-\u043d\u043e\u0432 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.BAM=\u0411\u043e\u0441\u043d\u0435\u043d\u0441\u043a\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u0430 \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.BZD=\u0411\u0435\u043b\u0438\u0437\u0438\u0439\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.BAM=\u0411\u043e\u0441\u043d\u0435\u043d\u0441\u043a\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u0430 \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.ESP=\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0430 \u043f\u0435\u0441\u0435\u0442\u0430
-currenciesDisplayName.KRW=\u041a\u041d\u0414\u0420 \u0432\u043e\u043d
currenciesDisplayName.NLG=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0433\u0443\u043b\u0434\u0435\u043d
+currenciesDisplayName.KRW=\u041a\u041d\u0414\u0420 \u0432\u043e\u043d
currenciesDisplayName.MRO=\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0430 \u043e\u0433\u0438\u044f
-currenciesDisplayName.BMP=\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.BAD=\u0411\u043e\u0441\u043d\u0430 \u0438 \u0425\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0438\u043d\u0430-\u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.ZWD=\u0417\u0438\u043c\u0431\u0430\u0431\u0432\u0438\u0439\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.SEK=\u0428\u0432\u0435\u0434\u0441\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
@@ -283,293 +221,121 @@ currenciesDisplayName.BYR=\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430
currenciesDisplayName.IRR=\u0418\u0440\u0430\u043d\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.PKR=\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.BMD=\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.BYL=\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430 \u0440\u0443\u0431\u043b\u0430 (1992-1994)
-currenciesDisplayName.CSC=\u0427\u0435\u0445\u043e\u0441\u043b\u043e\u0432\u0430\u0448\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesSymbol.YDD=YDD
-currenciesSymbol.GRN=GRN
+currenciesSymbol.BGL=\u043b\u0432
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.TWD=NT$
currenciesSymbol.LKR=SL Re
-currenciesSymbol.BYB=BYB
-currenciesSymbol.TJS=TJS
-currenciesSymbol.RWF=RWF
-currenciesSymbol.ERN=ERN
-currenciesSymbol.TJR=TJR
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GRD=GRD
-currenciesSymbol.AFN=Af
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.MQF=MQF
-currenciesSymbol.ARP=ARP
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.AFA=AFA
-currenciesSymbol.CRC=C
-currenciesSymbol.FKP=FKP
-currenciesSymbol.EEK=EEK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.HKD=HK$
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.SCR=SR
-currenciesSymbol.VUV=VT
-currenciesSymbol.KPW=KPW
-currenciesSymbol.DKK=DKr
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
currenciesSymbol.IDR=Rp
-currenciesSymbol.IDN=IDN
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.LVR=LVR
-currenciesSymbol.AED=AED
-currenciesSymbol.LVL=LVL
-currenciesSymbol.BWP=BWP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.MOP=MOP
-currenciesSymbol.GPF=GPF
-currenciesSymbol.FJD=F$
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUB=RUB
-currenciesSymbol.CDF=CDF
-currenciesSymbol.NIC=NIC
-currenciesSymbol.DJF=DF
-currenciesSymbol.LIF=LIF
-currenciesSymbol.UZS=UZS
+currenciesSymbol.RUB=\u0420\u0443\u0431.
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.ADD=ADD
-currenciesSymbol.TTO=TTO
-currenciesSymbol.ECS=ECS
-currenciesSymbol.THB=THB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.LUF=LUF
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.MNT=Tug
-currenciesSymbol.UAK=UAK
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.UAH=UAH
-currenciesSymbol.HUF=Ft
-currenciesSymbol.QAR=QR
-currenciesSymbol.COP=Col$
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOS=AOS
+currenciesSymbol.FJD=F$
currenciesSymbol.UYU=Ur$
-currenciesSymbol.AOR=AOR
-currenciesSymbol.BUR=BUR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.INR=INR
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.LTL=LTL
-currenciesSymbol.AON=AON
-currenciesSymbol.UYP=UYP
-currenciesSymbol.SML=SML
-currenciesSymbol.MZM=Mt
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.AOK=AOK
-currenciesSymbol.XFO=XFO
-currenciesSymbol.PGK=PGK
-currenciesSymbol.SYP=LS
-currenciesSymbol.OMR=RO
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MZE=MZE
-currenciesSymbol.MMX=MMX
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.NGN=NGN
-currenciesSymbol.PSP=PSP
-currenciesSymbol.CNY=Y
-currenciesSymbol.AOA=AOA
-currenciesSymbol.GNI=GNI
-currenciesSymbol.MAF=MAF
-currenciesSymbol.GNF=GF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.HTG=HTG
-currenciesSymbol.MMK=MMK
-currenciesSymbol.MYR=RM
-currenciesSymbol.BTR=BTR
-currenciesSymbol.XEU=XEU
-currenciesSymbol.LSL=M
-currenciesSymbol.SLL=SLL
-currenciesSymbol.BHD=BD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.TRL=TL
-currenciesSymbol.KMF=CF
-currenciesSymbol.GAF=GAF
-currenciesSymbol.CZK=CZK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.GMP=GMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.AZM=AZM
-currenciesSymbol.KYD=KYD
-currenciesSymbol.GMD=GMD
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=\u043b\u0432.
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGM=BGM
-currenciesSymbol.BGL=\u043b\u0432
-currenciesSymbol.VEB=Be
-currenciesSymbol.MXP=MXP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.PES=PES
-currenciesSymbol.BSP=BSP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.GYD=G$
-currenciesSymbol.ILP=ILP
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.SKK=Sk
-currenciesSymbol.PEN=PEN
-currenciesSymbol.ILL=ILL
-currenciesSymbol.LRD=LRD
-currenciesSymbol.AMD=dram
-currenciesSymbol.BSD=BSD
-currenciesSymbol.GLK=GLK
-currenciesSymbol.HRK=HRK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.ALX=ALX
-currenciesSymbol.CLP=Ch$
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.FRF=FRF
-currenciesSymbol.MWP=MWP
-currenciesSymbol.MKD=MDen
-currenciesSymbol.TPP=TPP
-currenciesSymbol.ALL=lek
-currenciesSymbol.CLE=CLE
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MWK=MK
-currenciesSymbol.BRL=R$
-currenciesSymbol.TPE=TPE
-currenciesSymbol.DEM=DEM
-currenciesSymbol.KWD=KD
-currenciesSymbol.XCD=EC$
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.GWP=GWP
-currenciesSymbol.YUN=YUN
-currenciesSymbol.SVC=SVC
-currenciesSymbol.YUM=YUM
-currenciesSymbol.BEL=BEL
-currenciesSymbol.SIT=SIT
-currenciesSymbol.XOF=XOF
-currenciesSymbol.MVR=MVR
-currenciesSymbol.MVP=MVP
-currenciesSymbol.BEF=BF
-currenciesSymbol.TOP=T$
-currenciesSymbol.BEC=BEC
-currenciesSymbol.CKD=CKD
-currenciesSymbol.SUR=SUR
-currenciesSymbol.RON=RON
-currenciesSymbol.ROL=leu
-currenciesSymbol.SUN=SUN
currenciesSymbol.BDT=Tk
-currenciesSymbol.AWG=AWG
-currenciesSymbol.VNS=VNS
-currenciesSymbol.NOK=NKr
-currenciesSymbol.VNN=VNN
-currenciesSymbol.MUR=MUR
-currenciesSymbol.ZAR=R
-currenciesSymbol.SHP=SHP
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.XAU=XAU
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.GIP=GIP
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.TND=TND
-currenciesSymbol.CVE=CVEsc
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.JOD=JD
-currenciesSymbol.XAF=XAF
+currenciesSymbol.QAR=QR
currenciesSymbol.LBP=LL
-currenciesSymbol.VAL=VAL
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STE=STE
-currenciesSymbol.STD=Db
-currenciesSymbol.WST=WST
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
currenciesSymbol.KHR=CR
-currenciesSymbol.DOP=RD$
-currenciesSymbol.LNR=LNR
-currenciesSymbol.WSP=WSP
-currenciesSymbol.KHO=KHO
-currenciesSymbol.MHD=MHD
-currenciesSymbol.BOP=BOP
-currenciesSymbol.NZP=NZP
-currenciesSymbol.CUP=CUP
+currenciesSymbol.SYP=LS
currenciesSymbol.MTL=Lm
-currenciesSymbol.TMM=TMM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.GHP=GHP
-currenciesSymbol.SSP=SSP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.GHO=GHO
-currenciesSymbol.SGD=S$
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
+currenciesSymbol.CVE=CVEsc
+currenciesSymbol.HUF=Ft
currenciesSymbol.NZD=$NZ
-currenciesSymbol.USD=US$
-currenciesSymbol.BOB=Bs
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
+currenciesSymbol.DOP=RD$
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.PAB=PAB
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
+currenciesSymbol.BIF=Fbu
+currenciesSymbol.PLN=Zl
+currenciesSymbol.GNF=GF
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
+currenciesSymbol.KMF=CF
+currenciesSymbol.SEK=SKr
currenciesSymbol.AUD=$A
-currenciesSymbol.GHC=GHC
-currenciesSymbol.LAK=LAK
-currenciesSymbol.NAD=N$
-currenciesSymbol.KGS=som
-currenciesSymbol.MGF=MGF
-currenciesSymbol.BBD=BDS$
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
+currenciesSymbol.SKK=Sk
currenciesSymbol.CHF=SwF
-currenciesSymbol.PYG=PYG
-currenciesSymbol.JMP=JMP
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.PLX=PLX
-currenciesSymbol.YER=YRl
-currenciesSymbol.ATS=ATS
-currenciesSymbol.ETD=ETD
-currenciesSymbol.LYP=LYP
currenciesSymbol.ETB=Br
-currenciesSymbol.BND=BND
-currenciesSymbol.DZF=DZF
-currenciesSymbol.EGP=EGP
-currenciesSymbol.JMD=J$
-currenciesSymbol.PLN=Zl
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
currenciesSymbol.DZD=DA
-currenciesSymbol.ISK=ISK
-currenciesSymbol.SRG=Sf
-currenciesSymbol.BZH=BZH
-currenciesSymbol.LYD=LD
-currenciesSymbol.BAN=BAN
-currenciesSymbol.BAM=KM
+currenciesSymbol.ANG=NA f.
currenciesSymbol.BZD=BZ$
-currenciesSymbol.ESP=ESP
-currenciesSymbol.KRW=KRW
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.BMP=BMP
-currenciesSymbol.BAD=BAD
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.SEK=SKr
-currenciesSymbol.CSK=CSK
-currenciesSymbol.BYR=Rbl
currenciesSymbol.IRR=RI
-currenciesSymbol.PKR=Pra
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-shortMonths=\u044f\u043d.®\u0444\u0435\u0432.®\u043c\u0430\u0440\u0442®\u0430\u043f\u0440.®\u043c\u0430\u0439®\u044e\u043d\u0438®\u044e\u043b\u0438®\u0430\u0432\u0433.®\u0441\u0435\u043f.®\u043e\u043a\u0442.®\u043d\u043e\u0435\u043c.®\u0434\u0435\u043a.®®
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
+currenciesSymbol.BGN=\u043b\u0432.
+shortMonths=\u044f\u043d\u0443®\u0444\u0435\u0432®\u043c\u0430\u0440®\u0430\u043f\u0440®\u043c\u0430\u0439®\u044e\u043d\u0438®\u044e\u043b\u0438®\u0430\u0432\u0433®\u0441\u0435\u043f®\u043e\u043a\u0442®\u043d\u043e\u0435®\u0434\u0435\u043a®®
months=\u044f\u043d\u0443\u0430\u0440\u0438®\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438®\u043c\u0430\u0440\u0442®\u0430\u043f\u0440\u0438\u043b®\u043c\u0430\u0439®\u044e\u043d\u0438®\u044e\u043b\u0438®\u0430\u0432\u0433\u0443\u0441\u0442®\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438®\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438®\u043d\u043e\u0435\u043c\u0432\u0440\u0438®\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438®®
-shortWeekdays=®\u043d\u0435\u0434.®\u043f\u043e\u043d.®\u0432\u0442.®\u0441\u0440.®\u0447\u0435\u0442\u0432.®\u043f\u0435\u0442.®\u0441\u044a\u0431.®
+shortWeekdays=®\u043d\u0434®\u043f\u043d®\u0432\u0442®\u0441\u0440®\u0447\u0442®\u043f\u0442®\u0441\u0431®
weekdays=®\u043d\u0435\u0434\u0435\u043b\u044f®\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a®\u0432\u0442\u043e\u0440\u043d\u0438\u043a®\u0441\u0440\u044f\u0434\u0430®\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a®\u043f\u0435\u0442\u044a\u043a®\u0441\u044a\u0431\u043e\u0442\u0430®
firstDayOfWeek=mon
-eras=\u043f\u0440.\u043d.\u0435.®\u043d.\u0435.®
+eras=\u043f\u0440.\u0425\u0440.®\u0441\u043b.\u0425\u0440.®
+ampms=\u043f\u0440. \u043e\u0431.®\u0441\u043b. \u043e\u0431.®
shortDateFormat=dd.MM.yy
mediumDateFormat=dd.MM.yyyy
longDateFormat=dd MMMM yyyy
fullDateFormat=dd MMMM yyyy, EEEE
longTimeFormat=HH:mm:ss
-zoneStrings=America/Los_Angeles®PST®\u0422\u0438\u0445\u043e\u043e\u043a\u0435\u0430\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®PDT®\u0422\u0438\u0445\u043e\u043e\u043a\u0435\u0430\u043d\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Africa/Casablanca®GMT®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0413\u0440\u0438\u043d\u0443\u0438\u0447®GMT®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0413\u0440\u0438\u043d\u0443\u0438\u0447®©America/New_York®EST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0438\u0437\u0442\u043e\u0447\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®EDT®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0438\u0437\u0442\u043e\u0447\u043d\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Anchorage®AST®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0410\u043b\u044f\u0441\u043a\u0430®ADT®\u041b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0410\u043b\u044f\u0441\u043a\u0430®©Etc/GMT®GMT®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0413\u0440\u0438\u043d\u0443\u0438\u0447®GMT®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0413\u0440\u0438\u043d\u0443\u0438\u0447®©Asia/Shanghai®CTT®\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®CDT®\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Halifax®AST®\u0410\u0442\u043b\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®ADT®\u0410\u0442\u043b\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Europe/Paris®CET®\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e\u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®CEST®\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e\u0435\u0432\u0440\u043e\u043f\u0435\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Denver®MST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043f\u043b\u0430\u043d\u0438\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®MDT®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043f\u043b\u0430\u043d\u0438\u043d\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Asia/Jerusalem®IST®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0418\u0437\u0440\u0430\u0435\u043b®IDT®\u041b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0418\u0437\u0440\u0430\u0435\u043b®©Pacific/Honolulu®HST®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0425\u0430\u0432\u0430\u0439®HST®\u041b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0425\u0430\u0432\u0430\u0439®©America/St_Johns®CNT®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u041d\u044e\u0444\u0430\u0443\u043d\u0434\u043b\u0435\u043d\u0434®CDT®\u041b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u041d\u044e\u0444\u0430\u0443\u043d\u0434\u043b\u0435\u043d\u0434®©America/Indianapolis®EST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0438\u0437\u0442\u043e\u0447\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®EST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0438\u0437\u0442\u043e\u0447\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Chicago®CST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®CDT®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Europe/Bucharest®EET®\u0418\u0437\u0442\u043e\u0447\u043d\u043e\u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®EEST®\u0418\u0437\u0442\u043e\u0447\u043d\u043e\u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Asia/Tokyo®JST®\u042f\u043f\u043e\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®JST®\u042f\u043f\u043e\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Phoenix®MST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043f\u043b\u0430\u043d\u0438\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®MST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043f\u043b\u0430\u043d\u0438\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©
+zoneStrings=America/Halifax®AST®\u0410\u0442\u043b\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®ADT®\u0410\u0442\u043b\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Indianapolis®EST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0438\u0437\u0442\u043e\u0447\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®EST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0438\u0437\u0442\u043e\u0447\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Europe/Paris®CET®\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e\u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®CEST®\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e\u0435\u0432\u0440\u043e\u043f\u0435\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Phoenix®MST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043f\u043b\u0430\u043d\u0438\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®MST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043f\u043b\u0430\u043d\u0438\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Los_Angeles®PST®\u0422\u0438\u0445\u043e\u043e\u043a\u0435\u0430\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®PDT®\u0422\u0438\u0445\u043e\u043e\u043a\u0435\u0430\u043d\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Pacific/Honolulu®HST®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0425\u0430\u0432\u0430\u0439®HST®\u041b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0425\u0430\u0432\u0430\u0439®©America/Denver®MST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043f\u043b\u0430\u043d\u0438\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®MDT®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043f\u043b\u0430\u043d\u0438\u043d\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Europe/Bucharest®EET®\u0418\u0437\u0442\u043e\u0447\u043d\u043e\u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®EEST®\u0418\u0437\u0442\u043e\u0447\u043d\u043e\u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/New_York®EST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0438\u0437\u0442\u043e\u0447\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®EDT®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0438\u0437\u0442\u043e\u0447\u043d\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Asia/Tokyo®JST®\u042f\u043f\u043e\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®JST®\u042f\u043f\u043e\u043d\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Anchorage®AST®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0410\u043b\u044f\u0441\u043a\u0430®ADT®\u041b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0410\u043b\u044f\u0441\u043a\u0430®©Asia/Shanghai®CTT®\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®CDT®\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©America/Chicago®CST®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®CDT®\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u0430 \u043b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430®©Africa/Casablanca®GMT®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0413\u0440\u0438\u043d\u0443\u0438\u0447®GMT®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0413\u0440\u0438\u043d\u0443\u0438\u0447®©America/St_Johns®CNT®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u041d\u044e\u0444\u0430\u0443\u043d\u0434\u043b\u0435\u043d\u0434®CDT®\u041b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u041d\u044e\u0444\u0430\u0443\u043d\u0434\u043b\u0435\u043d\u0434®©Asia/Jerusalem®IST®\u0427\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0418\u0437\u0440\u0430\u0435\u043b®IDT®\u041b\u044f\u0442\u043d\u0430 \u0447\u0430\u0441\u043e\u0432\u0430 \u0437\u043e\u043d\u0430 \u0418\u0437\u0440\u0430\u0435\u043b®©
territories.TL=\u0418\u0437\u0442\u043e\u0447\u0435\u043d \u0422\u0438\u043c\u043e\u0440
territories.TK=\u0422\u043e\u043a\u0435\u043b\u0430\u0443
territories.TJ=\u0422\u0430\u0434\u0436\u0438\u043a\u0438\u0441\u0442\u0430\u043d
@@ -592,7 +358,9 @@ territories.GN=\u0413\u0432\u0438\u043d\u0435\u044f
territories.GM=\u0413\u0430\u043c\u0431\u0438\u044f
territories.GL=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0438\u044f
territories.SV=\u0415\u043b \u0421\u0430\u043b\u0432\u0430\u0434\u043e\u0440
+territories.062=\u042e\u0436\u043d\u0430 \u0410\u0437\u0438\u044f
territories.ST=\u0421\u0430\u043e \u0422\u043e\u043c\u0435 \u0438 \u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0435
+territories.061=\u041f\u043e\u043b\u0438\u043d\u0435\u0437\u0438\u044f
territories.GI=\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440
territories.GH=\u0413\u0430\u043d\u0430
territories.SR=\u0421\u0443\u0440\u0438\u043d\u0430\u043c
@@ -616,9 +384,12 @@ territories.SC=\u0421\u0435\u0439\u0448\u0435\u043b\u0438
territories.SB=\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u043e\u0432\u0438 \u041e\u0441\u0442\u0440\u043e\u0432\u0438
territories.SA=\u0421\u0430\u0443\u0434\u0438\u0442\u0441\u043a\u0430 \u0410\u0440\u0430\u0431\u0438\u044f
territories.FR=\u0424\u0440\u0430\u043d\u0446\u0438\u044f
+territories.057=\u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u044f
territories.FO=\u0424\u0430\u0440\u044c\u043e\u0440\u0441\u043a\u0438 \u043e\u0441\u0442\u0440\u043e\u0432\u0438
territories.FM=\u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u044f, \u041e\u0431\u0435\u0434\u0438\u043d\u0435\u043d\u0438 \u0429\u0430\u0442\u0438
territories.RW=\u0420\u0443\u0430\u043d\u0434\u0430
+territories.054=\u041c\u0435\u043b\u0430\u043d\u0435\u0437\u0438\u044f
+territories.053=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f \u0438 \u041d\u043e\u0432\u0430 \u0417\u0435\u043b\u0430\u043d\u0434\u0438\u044f
territories.FK=\u0424\u043e\u043b\u043a\u043b\u0435\u043d\u0434\u0441\u043a\u0438 \u043e\u0441\u0442\u0440\u043e\u0432\u0438
territories.RU=\u0420\u0443\u0441\u043a\u0430 \u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u044f
territories.FJ=\u0424\u0438\u0434\u0436\u0438
@@ -628,20 +399,26 @@ territories.RE=\u0420\u0435\u044e\u043d\u0438\u044a\u043d
territories.ET=\u0415\u0442\u0438\u043e\u043f\u0438\u044f
territories.ES=\u0418\u0441\u043f\u0430\u043d\u0438\u044f
territories.ER=\u0415\u0440\u0438\u0442\u0440\u0435\u044f
+territories.833=\u043e.\u041c\u0430\u043d
territories.EH=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0421\u0430\u0445\u0430\u0440\u0430
territories.EG=\u0415\u0433\u0438\u043f\u0435\u0442
+territories.830=\u041d\u043e\u0440\u043c\u0430\u043d\u0434\u0441\u043a\u0438 \u043e-\u0432\u0438
territories.EE=\u0415\u0441\u0442\u043e\u043d\u0438\u044f
+territories.QO=\u041e\u043a\u0435\u0430\u043d\u0438\u044f
territories.EC=\u0415\u043a\u0432\u0430\u0434\u043e\u0440
territories.DZ=\u0410\u043b\u0436\u0438\u0440
territories.QA=\u041a\u0430\u0442\u0430\u0440
+territories.039=\u042e\u0436\u043d\u0430 \u0415\u0432\u0440\u043e\u043f\u0430
territories.DO=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430
territories.PY=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439
+territories.035=\u042e\u0433\u043e\u0438\u0437\u0442\u043e\u0447\u043d\u0430 \u0410\u0437\u0438\u044f
territories.DM=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430
territories.PW=\u041f\u0430\u043b\u0430\u0443
territories.DK=\u0414\u0430\u043d\u0438\u044f
territories.DJ=\u0414\u0436\u0438\u0431\u0443\u0442\u0438
territories.PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u044f
territories.PS=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u043a\u0438 \u0442\u0435\u0440\u0438\u0442\u043e\u0440\u0438\u0438
+territories.030=\u0418\u0437\u0442\u043e\u0447\u043d\u0430 \u0410\u0437\u0438\u044f
territories.PR=\u041f\u0443\u0435\u0440\u0442\u043e \u0420\u0438\u043a\u043e
territories.DE=\u0413\u0435\u0440\u043c\u0430\u043d\u0438\u044f
territories.PN=\u041f\u0438\u0442\u043a\u0430\u0439\u0440\u043d
@@ -659,12 +436,14 @@ territories.CV=\u041a\u0430\u0431\u043e \u0412\u0435\u0440\u0434\u0435
territories.PA=\u041f\u0430\u043d\u0430\u043c\u0430
territories.CU=\u041a\u0443\u0431\u0430
territories.CR=\u041a\u043e\u0441\u0442\u0430 \u0420\u0438\u043a\u0430
+territories.029=\u041a\u0430\u0440\u0438\u0431\u0441\u043a\u0438 \u043e-\u0432\u0438
territories.CO=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u044f
territories.CN=\u041a\u0438\u0442\u0430\u0439
territories.CM=\u041a\u0430\u043c\u0435\u0440\u0443\u043d
territories.CL=\u0427\u0438\u043b\u0438
territories.CK=\u041e\u0441\u0442\u0440\u043e\u0432\u0438 \u041a\u0443\u043a
territories.CI=\u041a\u043e\u0442 \u0434\u2019\u0418\u0432\u043e\u0430\u0440
+territories.021=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.CH=\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0438\u044f
territories.CG=\u041a\u043e\u043d\u0433\u043e
territories.CF=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430
@@ -679,13 +458,20 @@ territories.BV=\u041e\u0441\u0442\u0440\u043e\u0432 \u0411\u0443\u0432\u0435
territories.BT=\u0411\u0443\u0442\u0430\u043d
territories.BS=\u0411\u0430\u0445\u0430\u043c\u0438
territories.BR=\u0411\u0440\u0430\u0437\u0438\u043b\u0438\u044f
+territories.019=\u0410\u043c\u0435\u0440\u0438\u043a\u0430
+territories.018=\u042e\u0436\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.NZ=\u041d\u043e\u0432\u0430 \u0417\u0435\u043b\u0430\u043d\u0434\u0438\u044f
territories.BO=\u0411\u043e\u043b\u0438\u0432\u0438\u044f
+territories.017=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.BN=\u0411\u0440\u0443\u043d\u0435\u0439 \u0414\u0430\u0440\u0443\u0441\u0430\u043b\u0430\u043c
territories.BM=\u0411\u0435\u0440\u043c\u0443\u0434\u0430
+territories.015=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
+territories.014=\u0418\u0437\u0442\u043e\u0447\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
+territories.013=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u0430 \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.NU=\u041d\u0438\u0443\u0435
territories.BJ=\u0411\u0435\u043d\u0438\u043d
territories.BI=\u0411\u0443\u0440\u0443\u043d\u0434\u0438
+territories.011=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0410\u0444\u0438\u0440\u043a\u0430
territories.BH=\u0411\u0430\u0445\u0440\u0435\u0439\u043d
territories.NR=\u041d\u0430\u0443\u0440\u0443
territories.BG=\u0411\u044a\u043b\u0433\u0430\u0440\u0438\u044f
@@ -703,6 +489,7 @@ territories.NG=\u041d\u0438\u0433\u0435\u0440\u0438\u044f
territories.NF=\u041e\u0441\u0442\u0440\u043e\u0432 \u041d\u043e\u0440\u0444\u043e\u043b\u043a
territories.AZ=\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d
territories.NE=\u041d\u0438\u0433\u0435\u0440
+territories.AX=\u0410\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u043e-\u0432\u0438
territories.NC=\u041d\u043e\u0432\u0430 \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0438\u044f
territories.AW=\u0410\u0440\u0443\u0431\u0430
territories.ZM=\u0417\u0430\u043c\u0431\u0438\u044f
@@ -711,19 +498,23 @@ territories.AU=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f
territories.AT=\u0410\u0432\u0441\u0442\u0440\u0438\u044f
territories.AS=\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u043e \u0421\u0430\u043c\u043e\u0430
territories.AR=\u0410\u0440\u0436\u0435\u043d\u0442\u0438\u043d\u0430
+territories.009=\u041e\u043a\u0435\u0430\u043d\u0438\u044f
territories.AQ=\u0410\u043d\u0442\u0430\u0440\u043a\u0442\u0438\u043a\u0430
territories.MZ=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a
territories.AO=\u0410\u043d\u0433\u043e\u043b\u0430
territories.MY=\u041c\u0430\u043b\u0430\u0439\u0437\u0438\u044f
territories.AN=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0410\u043d\u0442\u0438\u043b\u0438
territories.MX=\u041c\u0435\u043a\u0441\u0438\u043a\u043e
+territories.005=\u042e\u0436\u043d\u0430 \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.AM=\u0410\u0440\u043c\u0435\u043d\u0438\u044f
territories.MW=\u041c\u0430\u043b\u0430\u0432\u0438
territories.AL=\u0410\u043b\u0431\u0430\u043d\u0438\u044f
territories.MV=\u041c\u0430\u043b\u0434\u0438\u0432\u0438
territories.ZA=\u042e\u0436\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.MU=\u041c\u0430\u0432\u0440\u0438\u0446\u0438\u0439
+territories.002=\u0410\u0444\u0440\u0438\u043a\u0430
territories.MT=\u041c\u0430\u043b\u0442\u0430
+territories.001=\u0417\u0435\u043c\u044f\u0442\u0430
territories.AI=\u0410\u043d\u0433\u0443\u0438\u043b\u0430
territories.MS=\u041c\u043e\u043d\u0441\u0435\u0440\u0430\u0442
territories.MR=\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0438\u044f
@@ -738,7 +529,6 @@ territories.MN=\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u044f
territories.MM=\u041c\u0438\u0430\u043d\u043c\u0430\u0440
territories.ML=\u041c\u0430\u043b\u0438
territories.MK=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0438\u044f, \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430
-territories.YU=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0438\u044f
territories.YT=\u041c\u0435\u0439\u043e\u0442
territories.MH=\u041c\u0430\u0440\u0448\u0430\u043b\u043e\u0432\u0438 \u041e\u0441\u0442\u0440\u043e\u0432\u0438
territories.MG=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440
@@ -748,10 +538,14 @@ territories.MA=\u041c\u0430\u0440\u043e\u043a\u043e
territories.YE=\u0419\u0435\u043c\u0435\u043d
territories.LY=\u041b\u0438\u0431\u0438\u0439\u0441\u043a\u0430 \u0410\u0440\u0430\u0431\u0441\u043a\u0430 \u0414\u0436\u0430\u043c\u0430\u0445\u0438\u0440\u0438\u044f
territories.LV=\u041b\u0430\u0442\u0432\u0438\u044f
+territories.155=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0415\u0432\u0440\u043e\u043f\u0430
territories.LU=\u041b\u044e\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433
+territories.154=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u0415\u0432\u0440\u043e\u043f\u0430
territories.LT=\u041b\u0438\u0442\u0432\u0430
territories.LS=\u041b\u0435\u0441\u043e\u0442\u043e
territories.LR=\u041b\u0438\u0431\u0435\u0440\u0438\u044f
+territories.151=\u0418\u0437\u0442\u043e\u0447\u043d\u0430 \u0415\u0432\u0440\u043e\u043f\u0430
+territories.150=\u0415\u0432\u0440\u043e\u043f\u0430
territories.LK=\u0428\u0440\u0438 \u041b\u0430\u043d\u043a\u0430
territories.LI=\u041b\u0438\u0445\u0442\u0435\u043d\u0449\u0430\u0439\u043d
territories.LC=\u0421\u0435\u0439\u043d\u0442 \u041b\u0443\u0441\u0438\u044f
@@ -760,6 +554,8 @@ territories.LA=\u041d\u0430\u0440\u043e\u0434\u043d\u0430 \u0414\u0435\u043c\u04
territories.KZ=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d
territories.KY=\u041a\u0430\u0439\u043c\u0430\u043d\u043e\u0432\u0438 \u043e\u0441\u0442\u0440\u043e\u0432\u0438
territories.KW=\u041a\u0443\u0432\u0435\u0439\u0442
+territories.145=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0410\u0437\u0438\u044f
+territories.142=\u0410\u0437\u0438\u044f
territories.KR=\u041a\u043e\u0440\u0435\u044f, \u042e\u0436\u043d\u0430
territories.KP=\u041a\u043e\u0440\u0435\u044f, \u0421\u0435\u0432\u0435\u0440\u043d\u0430
territories.KN=\u0421\u0435\u0439\u043d\u0442 \u041a\u0438\u0442\u0441 \u0438 \u041d\u0435\u0432\u0438\u0441
@@ -816,15 +612,15 @@ languages.ku=\u041a\u044e\u0440\u0434\u0441\u043a\u0438
languages.ks=\u041a\u0430\u0448\u043c\u0438\u0440\u0441\u043a\u0438
languages.ko=\u041a\u043e\u0440\u0435\u0439\u0441\u043a\u0438
languages.km=\u041a\u0445\u043c\u0435\u0440\u0441\u043a\u0438
-languages.kk=\u041a\u0430\u0437\u0430\u0445\u0441\u043a\u0438
languages.ira=\u0418\u0440\u0430\u043d\u0441\u043a\u0438
+languages.kk=\u041a\u0430\u0437\u0430\u0445\u0441\u043a\u0438
languages.ki=\u043a\u0438\u043a\u0443\u0439\u0443
languages.kg=\u041a\u043e\u043d\u0433\u043e\u0430\u043d\u0441\u043a\u0438
languages.grc=\u0414\u0440\u0435\u0432\u043d\u043e\u0433\u0440\u044a\u0446\u043a\u0438 (\u0434\u043e 1453)
languages.crp=\u041a\u0440\u0435\u043e\u043b\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.art=\u0418\u0437\u043a\u0443\u0441\u0442\u0432\u0435\u043d (\u0434\u0440\u0443\u0433\u0438)
-languages.ka=\u0413\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438
languages.afh=\u0410\u0444\u0440\u0438\u0445\u0438\u043b\u0438
+languages.ka=\u0413\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438
languages.gem=\u0413\u0435\u0440\u043c\u0430\u043d\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.afa=\u0410\u0444\u0440\u043e-\u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.jv=\u042f\u0432\u0430\u043d\u0441\u043a\u0438
@@ -841,18 +637,18 @@ languages.cpp=\u041a\u0440\u0435\u043e\u043b\u0441\u043a\u0438, \u043e\u0442 \u0
languages.id=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438
languages.hit=\u0425\u0438\u0442\u0441\u043a\u0438
languages.uk=\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438
-languages.fiu=\u0423\u0433\u0440\u043e\u0444\u0438\u043d\u0441\u043a\u0430 (\u0434\u0440\u0443\u0433\u0438)
languages.cpf=\u041a\u0440\u0435\u043e\u043b\u0441\u043a\u0438, \u043e\u0442 \u0444\u0440\u0435\u043d\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
+languages.fiu=\u0423\u0433\u0440\u043e\u0444\u0438\u043d\u0441\u043a\u0430 (\u0434\u0440\u0443\u0433\u0438)
languages.und=\u041d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d
-languages.cpe=\u041a\u0440\u0435\u043e\u043b\u0441\u043a\u0438, \u043e\u0442 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.hy=\u0410\u0440\u043c\u0435\u043d\u0441\u043a\u0438
+languages.cpe=\u041a\u0440\u0435\u043e\u043b\u0441\u043a\u0438, \u043e\u0442 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.nub=\u041d\u0443\u0431\u0438\u0439\u0441\u043a\u0438 \u0435\u0437\u0438\u0446\u0438
-languages.phn=\u0424\u0438\u043d\u0438\u043a\u0438\u0439\u0441\u043a\u0438
languages.got=\u0413\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438
+languages.phn=\u0424\u0438\u043d\u0438\u043a\u0438\u0439\u0441\u043a\u0438
languages.hu=\u0423\u043d\u0433\u0430\u0440\u0441\u043a\u0438
languages.ht=\u0425\u0430\u0438\u0442\u044f\u043d\u0441\u043a\u0438
-languages.phi=\u0424\u0438\u043b\u0438\u043f\u0438\u043d\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.hr=\u0425\u044a\u0440\u0432\u0430\u0442\u0441\u043a\u0438
+languages.phi=\u0424\u0438\u043b\u0438\u043f\u0438\u043d\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.ty=\u0422\u0430\u0438\u0442\u044f\u043d\u0441\u043a\u0438
languages.apa=\u0415\u0437\u0438\u0446\u0438 \u043d\u0430 \u0430\u043f\u0430\u0445\u0438\u0442\u0435
languages.goh=\u041d\u0435\u043c\u0441\u043a\u0438 (750-1050)
@@ -890,18 +686,18 @@ languages.si=\u0421\u0438\u043d\u0445\u0430\u043b\u0441\u043a\u0438
languages.sh=\u0421\u044a\u0440\u0431\u043e\u0445\u044a\u0440\u0432\u0430\u0442\u0441\u043a\u0438
languages.sg=\u0421\u0430\u043d\u0433\u043e
languages.sc=\u0421\u0430\u0440\u0434\u0438\u043d\u0441\u043a\u0438
-languages.cau=\u041a\u0430\u0432\u043a\u0430\u0437\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.sa=\u0421\u0430\u043d\u043a\u0441\u043a\u0440\u0438\u0442\u0441\u043a\u0438
+languages.cau=\u041a\u0430\u0432\u043a\u0430\u0437\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.ang=\u0421\u0442\u0430\u0440\u043e\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438 (ca.450-1100)
-languages.car=\u041a\u0430\u0440\u0438\u0431\u0441\u043a\u0438
languages.fr=\u0424\u0440\u0435\u043d\u0441\u043a\u0438
+languages.car=\u041a\u0430\u0440\u0438\u0431\u0441\u043a\u0438
languages.sla=\u0421\u043b\u0430\u0432\u044f\u043d\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.pro=\u041f\u0440\u043e\u0432\u0430\u043d\u0441\u0430\u043b\u0441\u043a\u0438 (to 1500)
languages.rw=\u041a\u0438\u043d\u044f\u0440\u0443\u0430\u043d\u0434\u0430
languages.gmh=\u041d\u0435\u043c\u0441\u043a\u0438 (1050-1500)
languages.ru=\u0420\u0443\u0441\u043a\u0438
-languages.cai=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e\u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u0438\u043d\u0434\u0438\u0430\u043d\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.fi=\u0424\u0438\u043d\u0441\u043a\u0438
+languages.cai=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e\u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u0438\u043d\u0434\u0438\u0430\u043d\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.ro=\u0420\u0443\u043c\u044a\u043d\u0441\u043a\u0438
languages.rn=\u0420\u0443\u043d\u0434\u0438
languages.rm=\u0420\u0435\u0442\u043e\u0440\u043e\u043c\u0430\u043d\u0441\u043a\u0438
@@ -913,24 +709,24 @@ languages.es=\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438
languages.eo=\u0415\u0441\u043f\u0435\u0440\u0430\u043d\u0442\u043e
languages.en=\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438
languages.el=\u0413\u0440\u044a\u0446\u043a\u0438
-languages.qu=\u041a\u0435\u0447\u0443\u0430
languages.jrb=\u0435\u0432\u0440\u0435\u0439\u0441\u043a\u043e-\u0430\u0440\u0430\u0431\u0441\u043a\u0438
+languages.qu=\u041a\u0435\u0447\u0443\u0430
languages.fro=\u0424\u0440\u0435\u043d\u0441\u043a\u0438 (842-1400)
languages.frm=\u0424\u0440\u0435\u043d\u0441\u043a\u0438 (1400-1600)
languages.dv=\u0414\u0438\u0432\u0435\u0445\u0438
languages.ale=\u0410\u043b\u0435\u0443\u0442\u0441\u043a\u0438
languages.den=\u0421\u043b\u0430\u0432\u044f\u043d\u0441\u043a\u0438
-languages.pt=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0438
languages.ber=\u0431\u0435\u0440\u0431\u0435\u0440\u0441\u043a\u0438
+languages.pt=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0438
languages.ps=\u041f\u0443\u0449\u0443
languages.de=\u041d\u0435\u043c\u0441\u043a\u0438
-languages.pl=\u041f\u043e\u043b\u0441\u043a\u0438
languages.da=\u0414\u0430\u0442\u0441\u043a\u0438
+languages.pl=\u041f\u043e\u043b\u0441\u043a\u0438
languages.sux=\u0428\u0443\u043c\u0435\u0440\u0441\u043a\u0438
languages.jpr=\u0435\u0432\u0440\u0435\u0439\u0441\u043a\u043e-\u043f\u0435\u0440\u0441\u0438\u0439\u0441\u043a\u0438
languages.cy=\u0423\u0435\u043b\u0441\u043a\u0438
-languages.pa=\u041f\u0435\u043d\u0434\u0436\u0430\u0431\u0441\u043a\u0438
languages.cu=\u0426\u044a\u0440\u043a\u043e\u0432\u043d\u043e \u0441\u043b\u0430\u0432\u044f\u043d\u0441\u043a\u0438
+languages.pa=\u041f\u0435\u043d\u0434\u0436\u0430\u0431\u0441\u043a\u0438
languages.cs=\u0427\u0435\u0448\u043a\u0438
languages.co=\u041a\u043e\u0440\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u0438
languages.mis=\u0414\u0440\u0443\u0433\u0438 \u0435\u0437\u0438\u0446\u0438
@@ -941,29 +737,29 @@ languages.ca=\u041a\u0430\u0442\u0430\u043b\u043e\u043d\u0441\u043a\u0438
languages.bs=\u0411\u043e\u0441\u043d\u0435\u043d\u0441\u043a\u0438
languages.br=\u0411\u0440\u0435\u0442\u043e\u043d\u0441\u043a\u0438
languages.bo=\u0422\u0438\u0431\u0435\u0442\u0441\u043a\u0438
-languages.ny=\u0427\u0438\u043d\u044f\u043d\u0434\u0436\u0430
languages.bn=\u0411\u0435\u043d\u0433\u0430\u043b\u0441\u043a\u0438
+languages.ny=\u0427\u0438\u043d\u044f\u043d\u0434\u0436\u0430
languages.bg=\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438
languages.be=\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0438
-languages.oto=\u0421\u0442\u0430\u0440\u043e\u0442\u0443\u0440\u0441\u043a\u0438 \u0435\u0437\u0438\u0446\u0438
languages.no=\u041d\u043e\u0440\u0432\u0435\u0436\u043a\u0438
+languages.oto=\u0421\u0442\u0430\u0440\u043e\u0442\u0443\u0440\u0441\u043a\u0438 \u0435\u0437\u0438\u0446\u0438
languages.tai=\u0422\u0430\u0439\u043b\u0430\u043d\u0434\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
-languages.nl=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438
languages.ba=\u0411\u0430\u0448\u043a\u0438\u0440\u0441\u043a\u0438
+languages.nl=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438
languages.zu=\u0417\u0443\u043b\u0443\u0441\u043a\u0438
-languages.raj=\u0420\u0430\u0434\u0436\u0430\u0441\u0442\u0430\u043d\u0441\u043a\u0438
languages.az=\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d\u0441\u043a\u0438
-languages.ne=\u041d\u0435\u043f\u0430\u043b\u0441\u043a\u0438
+languages.raj=\u0420\u0430\u0434\u0436\u0430\u0441\u0442\u0430\u043d\u0441\u043a\u0438
languages.ay=\u0410\u0439\u043c\u0430\u0440\u0430
+languages.ne=\u041d\u0435\u043f\u0430\u043b\u0441\u043a\u0438
languages.av=\u0410\u0432\u0430\u0440\u0441\u043a\u0438
-languages.ota=\u0422\u0443\u0440\u0441\u043a\u0438, \u043e\u0442\u043e\u043c\u0430\u043d\u0441\u043a\u0438 (1500-1928)
languages.aus=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0439\u0441\u043a\u0438 \u0435\u0437\u0438\u0446\u0438
-languages.nap=\u041d\u0435\u0430\u043f\u043e\u043b\u0438\u0442\u0430\u043d\u0441\u043a\u0438
+languages.ota=\u0422\u0443\u0440\u0441\u043a\u0438, \u043e\u0442\u043e\u043c\u0430\u043d\u0441\u043a\u0438 (1500-1928)
languages.ar=\u0410\u0440\u0430\u0431\u0441\u043a\u0438
+languages.nap=\u041d\u0435\u0430\u043f\u043e\u043b\u0438\u0442\u0430\u043d\u0441\u043a\u0438
languages.zh=\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438
languages.sga=\u0421\u0442\u0430\u0440\u043e\u0438\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438 (\u0434\u043e 900)
-languages.chy=\u0447\u0435\u0439\u0435\u043d\u0441\u043a\u0438
languages.my=\u0411\u0438\u0440\u043c\u0430\u043d\u0441\u043a\u0438
+languages.chy=\u0447\u0435\u0439\u0435\u043d\u0441\u043a\u0438
languages.am=\u0410\u043c\u0445\u0430\u0440\u0441\u043a\u0438
languages.nai=\u0421\u0435\u0432\u0435\u0440\u043d\u043e\u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u0438\u043d\u0434\u0438\u0430\u043d\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.paa=\u041f\u0430\u043f\u0443\u0430\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
@@ -971,19 +767,19 @@ languages.mt=\u041c\u0430\u043b\u0442\u0438\u0439\u0441\u043a\u0438
languages.ms=\u041c\u0430\u043b\u0430\u0439\u0441\u043a\u0438
languages.chr=\u0447\u0435\u0440\u043e\u043a\u0438
languages.af=\u0410\u0444\u0440\u0438\u043a\u0430\u043d\u0441
-languages.haw=\u0425\u0430\u0432\u0430\u0439\u0441\u043a\u0438
languages.mo=\u041c\u043e\u043b\u0434\u043e\u0432\u0441\u043a\u0438
+languages.haw=\u0425\u0430\u0432\u0430\u0439\u0441\u043a\u0438
languages.mn=\u041c\u043e\u043d\u0433\u043e\u043b\u0441\u043a\u0438
languages.ab=\u0410\u0431\u043a\u0445\u0430\u0437\u0441\u043a\u0438
languages.ml=\u041c\u0430\u043b\u0430\u0439\u0441\u043a\u0438
-languages.bnt=\u0411\u0430\u043d\u0442\u0443
languages.mk=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438
+languages.bnt=\u0411\u0430\u043d\u0442\u0443
languages.mi=\u041c\u0430\u043e\u0440\u0441\u043a\u0438
languages.mg=\u041c\u0430\u043b\u0433\u0430\u0448\u043a\u0438
languages.mga=\u0418\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438 (900-1200)
languages.egy=\u0415\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0438 (\u0434\u0440\u0435\u0432\u0435\u043d)
-languages.bat=\u041f\u0440\u0438\u0431\u0430\u043b\u0442\u0438\u0439\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.lv=\u041b\u0430\u0442\u0432\u0438\u0439\u0441\u043a\u0438
+languages.bat=\u041f\u0440\u0438\u0431\u0430\u043b\u0442\u0438\u0439\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
languages.lt=\u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438
languages.lo=\u041b\u0430\u043e\u0441\u043a\u0438
languages.sem=\u0421\u0435\u043c\u0438\u0442\u0441\u043a\u0438 (\u0434\u0440\u0443\u0433\u0438)
diff --git a/resource/gnu/java/locale/LocaleInformation_bn.properties b/resource/gnu/java/locale/LocaleInformation_bn.properties
index c27fc7bf4..9f0d5c349 100644
--- a/resource/gnu/java/locale/LocaleInformation_bn.properties
+++ b/resource/gnu/java/locale/LocaleInformation_bn.properties
@@ -5,7 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesDisplayName.BDT=BDT
currenciesSymbol.INR=\u099f\u09be\u0995\u09be
currenciesSymbol.BDT=\u09f3
shortMonths=\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0®\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09c0®\u09ae\u09be\u09b0\u09cd\u099a®\u098f\u09aa\u09cd\u09b0\u09bf\u09b2®\u09ae\u09c7®\u099c\u09c1\u09a8®\u099c\u09c1\u09b2\u09be\u0987®\u0986\u0997\u09b8\u09cd\u099f®\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0®\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0®\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0®\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0®®
@@ -14,14 +13,14 @@ shortWeekdays=®\u09b0\u09ac\u09bf®\u09b8\u09cb\u09ae®\u09ae\u0999\u09cd\u0997\u0
weekdays=®\u09b0\u09ac\u09bf\u09ac\u09be\u09b0®\u09b8\u09cb\u09ae\u09ac\u09be\u09b0®\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0®\u09ac\u09c1\u09a7\u09ac\u09be\u09b0®\u09ac\u09c3\u09b9\u09b7\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0®\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0®\u09b6\u09a8\u09bf\u09ac\u09be\u09b0®
ampms=\u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09b9\u09cd\u09a3®\u0985\u09aa\u09b0\u09be\u09b9\u09cd\u09a3®
territories.AU=\u0985\u09b8\u09cd\u099f\u09cd\u09b0\u09c7\u09b2\u09bf\u09df\u09be
-territories.GY=\u0997\u09bf\u09df\u09be\u09a8\u09be
territories.AT=\u0985\u09b8\u09cd\u099f\u09cd\u09b0\u09bf\u09df\u09be
+territories.GY=\u0997\u09bf\u09df\u09be\u09a8\u09be
territories.AR=\u0986\u09b0\u09cd\u099c\u09c7\u09a3\u09cd\u099f\u09be\u0987\u09a8\u09be
-territories.MY=\u09ae\u09be\u09b2\u09cd\u09af\u09be\u09b6\u09bf\u09df\u09be
territories.GT=\u0997\u09cb\u09df\u09be\u099f\u09bf\u09ae\u09be\u09b2\u09be
+territories.MY=\u09ae\u09be\u09b2\u09cd\u09af\u09be\u09b6\u09bf\u09df\u09be
territories.MX=\u09ae\u0995\u09cd\u09b8\u09bf\u0995\u09cb
-territories.GR=\u0997\u09cd\u09b0\u09c0\u09b8\u09cd
territories.AM=\u0986\u09b0\u09cd\u09ae\u09c7\u09a8\u09bf\u09df\u09be
+territories.GR=\u0997\u09cd\u09b0\u09c0\u09b8\u09cd
territories.ZA=\u09a6\u0995\u09cd\u09b7\u09bf\u09a3 \u0986\u09ab\u09cd\u09b0\u09bf\u0995\u09be
territories.AL=\u0986\u09b2\u09ac\u09cd\u09af\u09be\u09a8\u09bf\u09df\u09be
territories.SY=\u09b8\u09bf\u09b0\u09bf\u09df\u09be
@@ -31,8 +30,8 @@ territories.MN=\u09ae\u0999\u09cd\u0997\u09cb\u09b2\u09bf\u09df\u09be
territories.GH=\u0997\u09be\u09a8\u09be
territories.SO=\u09b8\u09cb\u09ae\u09be\u09b2\u09bf
territories.GE=\u099c\u09b0\u09cd\u099c\u09bf\u09df\u09be
-territories.MG=\u09ae\u09be\u09a6\u09be\u0997\u09be\u09b8\u09cd\u0995\u09be\u09b0
territories.GB=\u0997\u09cd\u09b0\u09c7\u099f\u09ac\u09c3\u099f\u09c7\u09a8
+territories.MG=\u09ae\u09be\u09a6\u09be\u0997\u09be\u09b8\u09cd\u0995\u09be\u09b0
territories.SK=\u09b6\u09cd\u09b2\u09cb\u09ad\u09be\u0995\u09bf\u09df\u09be
territories.MD=\u09ae\u09cb\u09b2\u09cd\u09a6\u09be\u09ad\u09bf\u09df\u09be
territories.SG=\u09b8\u09bf\u0999\u09cd\u0997\u09be\u09aa\u09c1\u09b0
@@ -60,14 +59,14 @@ territories.KR=\u09a6\u0995\u09cd\u09b7\u09bf\u09a3 \u0995\u09cb\u09b0\u09bf\u09
territories.EH=\u09aa\u09b6\u09cd\u099a\u09bf\u09ae\u09c0 \u09b8\u09be\u09b9\u09be\u09b0\u09be
territories.EG=\u09ae\u09bf\u09b6\u09b0
territories.EE=\u098f\u09b8\u09cd\u09a4\u09cb\u09a8\u09bf\u09df\u09be
-territories.KH=\u0995\u09be\u09ae\u09cd\u09ac\u09cb\u099c
territories.EC=\u0987\u0995\u09cb\u09df\u09be\u09a1\u09b0
+territories.KH=\u0995\u09be\u09ae\u09cd\u09ac\u09cb\u099c
territories.KG=\u0995\u09bf\u09b0\u09cd\u0997\u09bf\u099c\u09bf\u09df\u09be
territories.KE=\u0995\u09c7\u09a8\u09bf\u09df\u09be
territories.DZ=\u098f\u09b2\u099c\u09bf\u09b0\u09bf\u09df\u09be
territories.PY=\u09aa\u09cd\u09af\u09be\u09b0\u09be\u0997\u09cb\u09df\u09c7
-territories.JP=\u099c\u09be\u09aa\u09be\u09a8
territories.DK=\u09a1\u09c7\u09a8\u09cd\u09ae\u09be\u09b0\u09cd\u0995
+territories.JP=\u099c\u09be\u09aa\u09be\u09a8
territories.PT=\u09aa\u09b0\u09cd\u09a4\u09c1\u0997\u09be\u09b2
territories.JO=\u099c\u09b0\u09cd\u09a1\u09a8
territories.JM=\u099c\u09cd\u09af\u09be\u09ae\u09c7\u0995\u09be
@@ -82,19 +81,19 @@ territories.PA=\u09aa\u09be\u09a8\u09be\u09ae\u09be
territories.VE=\u09ad\u09c7\u09a8\u09c7\u099c\u09c1\u09df\u09c7\u09b2\u09be
territories.CU=\u0995\u09bf\u0989\u09ac\u09be
territories.CR=\u0995\u09cb\u09b8\u09cd\u099f\u09be\u09b0\u09bf\u0995\u09be
-territories.IT=\u0987\u09a4\u09be\u09b2\u09c0
territories.CO=\u0995\u09cb\u09b2\u09cb\u09ae\u09cd\u09ac\u09bf\u09df\u09be
-territories.IS=\u0986\u0987\u09b8\u09b2\u09a3\u09cd\u09a1
+territories.IT=\u0987\u09a4\u09be\u09b2\u09c0
territories.CN=\u099a\u09c0\u09a8
+territories.IS=\u0986\u0987\u09b8\u09b2\u09a3\u09cd\u09a1
territories.IR=\u0987\u09b0\u09be\u09a8
-territories.IQ=\u0987\u09b0\u09be\u0995
territories.CL=\u099a\u09bf\u09b2\u09bf
+territories.IQ=\u0987\u09b0\u09be\u0995
territories.UZ=\u0989\u099c\u09cd\u09ac\u09c7\u0995\u09bf\u09b8\u09cd\u09a5\u09be\u09a8
territories.UY=\u0989\u09b0\u09c1\u0997\u09cb\u09df\u09c7
territories.IN=\u09ad\u09be\u09b0\u09a4
territories.CH=\u09b8\u09c1\u0987\u099c\u09b0\u09cd\u09b2\u09a3\u09cd\u09a1
-territories.IL=\u0987\u09b8\u09cd\u09b0\u09be\u09df\u09c7\u09b2
territories.CG=\u0995\u0999\u09cd\u0997\u09cb
+territories.IL=\u0987\u09b8\u09cd\u09b0\u09be\u09df\u09c7\u09b2
territories.US=\u09ae\u09be\u09b0\u09cd\u0995\u09bf\u09a8 \u09af\u09c1\u0995\u09cd\u09a4\u09b0\u09be\u09b7\u09cd\u099f\u09cd\u09b0
territories.IE=\u0986\u09df\u09be\u09b0\u09cd\u09b2\u09a3\u09cd\u09a1
territories.ID=\u0987\u09a8\u09cd\u09a6\u09cb\u09a8\u09c7\u09b6\u09bf\u09df\u09be
diff --git a/resource/gnu/java/locale/LocaleInformation_bn_IN.properties b/resource/gnu/java/locale/LocaleInformation_bn_IN.properties
index ebc79e5e7..4b98a3c59 100644
--- a/resource/gnu/java/locale/LocaleInformation_bn_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_bn_IN.properties
@@ -5,8 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
firstDayOfWeek=mon
shortDateFormat=d-M-yy
mediumDateFormat=dd-MM-yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_bs.properties b/resource/gnu/java/locale/LocaleInformation_bs.properties
new file mode 100644
index 000000000..678a363d1
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_bs.properties
@@ -0,0 +1,17 @@
+# LocaleInformation_bs.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+decimalSeparator=,
+groupingSeparator=.
+currenciesDisplayName.BAM=Konvertibilna marka
+currenciesSymbol.BAM=KM
+shortMonths=Jan®Feb®Mar®Apr®Maj®Jun®Jul®Avg®Sep®Okt®Nov®Dec®®
+months=Januar®Februar®Mart®April®Maj®Juni®Juli®Avgust®Septembar®Oktobar®Novembar®Decembar®®
+shortWeekdays=®Ned®Pon®Uto®Sri®\u010cet®Pet®Sub®
+weekdays=®Nedjelja®Ponedjeljak®Utorak®Srijeda®\u010cetvrtak®Petak®Subota®
+firstDayOfWeek=mon
+eras=BC®AD®
diff --git a/resource/gnu/java/locale/LocaleInformation_byn.properties b/resource/gnu/java/locale/LocaleInformation_byn.properties
new file mode 100644
index 000000000..f300c2348
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_byn.properties
@@ -0,0 +1,300 @@
+# LocaleInformation_byn.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currenciesDisplayName.INR=\u12e8\u1215\u1295\u12f5 \u1229\u1352
+currenciesDisplayName.RUB=\u12e8\u122b\u123b \u1229\u1265\u120d
+currenciesDisplayName.JPY=\u12e8\u1303\u1353\u1295 \u12e8\u1295
+currenciesDisplayName.BRL=\u12e8\u1265\u122b\u12da\u120d \u122a\u120d
+currenciesDisplayName.CNY=\u12e8\u127b\u12ed\u1293 \u12e9\u12a0\u1295 \u1228\u1295\u121a\u1295\u1262
+currenciesDisplayName.USD=\u12e8\u12a0\u121c\u122a\u12ab\u1295 \u12f6\u120b\u122d
+currenciesDisplayName.EUR=\u12a0\u12cd\u122e
+currenciesDisplayName.ETB=\u12e8\u12a2\u1275\u12ee\u1335\u12eb \u1265\u122d
+currenciesDisplayName.GBP=\u12e8\u12a5\u1295\u130d\u120a\u12dd \u1353\u12cd\u1295\u12f5 \u1235\u1270\u122d\u120a\u1295\u130d
+currenciesSymbol.ETB=$
+currenciesSymbol.CNY=Y
+currenciesSymbol.ERN=$
+currenciesSymbol.USD=USD
+currenciesSymbol.BRL=R$
+shortMonths=\u120d\u12f0\u1275®\u12ab\u1265\u12bd®\u12ad\u1265\u120b®\u134b\u1305\u12ba®\u12ad\u1262\u1245®\u121d/\u1275®\u12b0\u122d®\u121b\u122d\u12eb®\u12eb\u12b8\u1292®\u1218\u1270\u1209®\u121d/\u121d®\u1270\u1215\u1233®®
+months=\u120d\u12f0\u1275\u122a®\u12ab\u1265\u12bd\u1265\u1272®\u12ad\u1265\u120b®\u134b\u1305\u12ba\u122a®\u12ad\u1262\u1245\u122a®\u121d\u12aa\u12a4\u120d \u1275\u1313\u0305\u1292\u122a®\u12b0\u122d\u12a9®\u121b\u122d\u12eb\u121d \u1275\u122a®\u12eb\u12b8\u1292 \u1218\u1233\u1245\u1208\u122a®\u1218\u1270\u1209®\u121d\u12aa\u12a4\u120d \u1218\u123d\u12c8\u122a®\u1270\u1215\u1233\u1235\u122a®®
+shortWeekdays=®\u1230/\u1245®\u1230\u1291®\u1230\u120a\u131d®\u1208\u1313®\u12a3\u121d\u12f5®\u12a3\u122d\u1265®\u1230/\u123d®
+weekdays=®\u1230\u1295\u1260\u122d \u1245\u12f3\u12c5®\u1230\u1291®\u1230\u120a\u131d®\u1208\u1313 \u12c8\u122a \u1208\u1265\u12cb®\u12a3\u121d\u12f5®\u12a3\u122d\u1265®\u1230\u1295\u1260\u122d \u123d\u1313\u12c5®
+firstDayOfWeek=sat
+eras=\u12ed\u1305®\u12a3\u12f5®
+ampms=\u134b\u12f1\u1235 \u1303\u1265®\u134b\u12f1\u1235 \u12f0\u121d\u1262®
+territories.AU=\u12a0\u12cd\u1235\u1275\u122c\u120a\u12eb
+territories.TD=\u127b\u12f5
+territories.AT=\u12a6\u1235\u1275\u122a\u12eb
+territories.GY=\u1309\u12eb\u1293
+territories.AR=\u12a0\u122d\u1300\u1295\u1272\u1293
+territories.GW=\u1262\u1233\u12ce
+territories.MY=\u121b\u120c\u12e2\u12eb
+territories.MX=\u121c\u12ad\u1232\u12ae
+territories.AN=\u1294\u12d8\u122d\u120b\u1295\u12f5\u1235 \u12a0\u1295\u1272\u120d\u1235
+territories.AM=\u12a0\u122d\u121c\u1292\u12eb
+territories.GR=\u130d\u122a\u12ad
+territories.ZA=\u12f0\u1261\u1265 \u12a0\u134d\u122a\u12ab
+territories.AL=\u12a0\u120d\u1263\u1292\u12eb
+territories.GQ=\u12a2\u12b3\u1276\u122a\u12eb\u120d \u130a\u1292
+territories.MU=\u121b\u1229\u1238\u1235
+territories.SY=\u1232\u122a\u12eb
+territories.MT=\u121b\u120d\u1273
+territories.GN=\u130a\u1292
+territories.MR=\u121e\u122a\u1274\u1292\u12eb
+territories.GM=\u130b\u121d\u1262\u12eb
+territories.MO=\u121b\u12ab\u12ce
+territories.AE=\u12e8\u1270\u1263\u1260\u1229\u1275 \u12a0\u1228\u1265 \u12a4\u121d\u122c\u1275\u1235
+territories.MN=\u121e\u1295\u130e\u120a\u12eb
+territories.AD=\u12a0\u1295\u12f6\u122b
+territories.MK=\u121b\u12a8\u12f6\u1292\u12eb
+territories.GF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u1309\u12ca\u12a0\u1293
+territories.SO=\u1231\u121b\u120c
+territories.GE=\u1306\u122d\u1302\u12eb
+territories.SN=\u1234\u1294\u130b\u120d
+territories.GB=\u12a5\u1295\u130d\u120a\u12dd
+territories.SK=\u1235\u120e\u126b\u12aa\u12eb
+territories.SI=\u1235\u120e\u126c\u1292\u12eb
+territories.MD=\u121e\u120d\u12f6\u126b
+territories.SG=\u1232\u1295\u130b\u1356\u122d
+territories.MA=\u121e\u122e\u12ae
+territories.SE=\u1235\u12ca\u12f5\u1295
+territories.SD=\u1231\u12f3\u1295
+territories.SA=\u1233\u12cd\u12f5\u12a0\u1228\u1262\u12eb
+territories.YE=\u12e8\u1218\u1295
+territories.LY=\u120a\u1262\u12eb
+territories.FR=\u1348\u1228\u1295\u1233\u12ed
+territories.LV=\u120b\u1275\u126a\u12eb
+territories.LT=\u120a\u1271\u12cc\u1292\u12eb
+territories.FM=\u121a\u12ad\u122e\u1294\u12e2\u12eb
+territories.RU=\u122b\u123a\u12eb
+territories.FJ=\u134a\u1302
+territories.FI=\u134a\u1295\u120b\u1295\u12f5
+territories.RO=\u122e\u121c\u1292\u12eb
+territories.LB=\u120a\u1263\u1296\u1235
+territories.ET=\u12a2\u1275\u12ee\u1335\u12eb
+territories.ES=\u1235\u1354\u1295
+territories.KW=\u12ad\u12cc\u1275
+territories.ER=\u12a4\u122d\u1275\u122b
+territories.KR=\u1230\u121c\u1295 \u12ae\u122a\u12eb
+territories.KP=\u12f0\u1261\u1265 \u12ae\u122a\u12eb
+territories.KM=\u12ae\u121e\u122e\u1235
+territories.EH=\u121d\u12d5\u122b\u1263\u12ca \u1233\u1205\u122b
+territories.EG=\u130d\u1265\u133d
+territories.EE=\u12a4\u1235\u1276\u1292\u12eb
+territories.EC=\u12a2\u12b3\u12f6\u122d
+territories.KH=\u12ab\u121d\u1266\u12f2\u12eb
+territories.DZ=\u12a0\u120d\u1304\u122a\u12eb
+territories.DO=\u12f6\u121a\u1292\u12ad \u122a\u1351\u1265\u120a\u12ad
+territories.DM=\u12f6\u121a\u1292\u12ab
+territories.DK=\u12f4\u1295\u121b\u122d\u12ad
+territories.JP=\u1303\u1353\u1295
+territories.JO=\u1306\u122d\u12f3\u1295
+territories.PR=\u1356\u122d\u1273 \u122a\u12ae
+territories.JM=\u1303\u121b\u12ed\u12ab
+territories.DE=\u1300\u122d\u1218\u1295
+territories.PL=\u1356\u120b\u1295\u12f5
+territories.PG=\u1353\u1351\u12cb \u1292\u12cd \u130a\u1292
+territories.PF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u1356\u120a\u1294\u12e2\u12eb
+territories.PE=\u1354\u1229
+territories.CZ=\u127c\u12ad \u122a\u1351\u1265\u120a\u12ad
+territories.VI=\u12e8\u12a0\u121c\u122a\u12ab \u1268\u122d\u1302\u1295 \u12f0\u1234\u1276\u127d
+territories.CY=\u1233\u12ed\u1355\u1228\u1235
+territories.VG=\u12e8\u12a5\u1295\u130d\u120a\u12dd \u12f5\u1295\u130d\u120d \u12f0\u1234\u1276\u127d
+territories.CV=\u12ac\u1355 \u126c\u122d\u12f4
+territories.VE=\u126c\u1295\u12d9\u12cc\u120b
+territories.CS=\u1230\u122d\u1262\u12eb
+territories.CO=\u12ae\u120e\u121d\u1262\u12eb
+territories.IT=\u1323\u120a\u12eb\u1295
+territories.CN=\u127b\u12ed\u1293
+territories.IS=\u12a0\u12ed\u1235\u120b\u1295\u12f5
+territories.CM=\u12ab\u121c\u1229\u1295
+territories.CL=\u127a\u120a
+territories.IQ=\u12a2\u122b\u1245
+territories.UZ=\u12e9\u12dd\u1260\u12aa\u1235\u1273\u1295
+territories.IN=\u1205\u1295\u12f5
+territories.CH=\u1235\u12ca\u12d8\u122d\u120b\u1295\u12f5
+territories.IL=\u12a5\u1235\u122b\u12a4\u120d
+territories.CF=\u12e8\u1218\u12ab\u12a8\u1208\u129b\u12cd \u12a0\u134d\u122a\u12ab \u122a\u1350\u1265\u120a\u12ad
+territories.US=\u12a0\u121c\u122a\u12ab
+territories.CD=\u12ae\u1295\u130e
+territories.IE=\u12a0\u12e8\u122d\u120b\u1295\u12f5
+territories.ID=\u12a2\u1295\u12f6\u1294\u12e2\u12eb
+territories.BZ=\u1264\u120a\u12d8
+territories.BY=\u1264\u120b\u1229\u1235
+territories.UG=\u12e9\u130b\u1295\u12f3
+territories.BT=\u1261\u1205\u1273\u1295
+territories.BR=\u1265\u122b\u12da\u120d
+territories.NZ=\u1292\u12cd \u12da\u120b\u1295\u12f5
+territories.HU=\u1200\u1295\u130b\u122a
+territories.BO=\u1266\u120a\u126a\u12eb
+territories.HT=\u1200\u12ed\u1272
+territories.BM=\u1264\u122d\u1219\u12f3
+territories.HR=\u12ad\u122e\u12a4\u123d\u12eb
+territories.TZ=\u1273\u1295\u12db\u1292\u12eb
+territories.BH=\u1263\u1205\u122c\u1295
+territories.BG=\u1261\u120d\u130c\u122a\u12eb
+territories.NP=\u1294\u1353\u120d
+territories.HK=\u1206\u1295\u130d \u12ae\u1295\u130d
+territories.TT=\u1275\u122a\u1292\u12f3\u12f5 \u12a5\u1293 \u1276\u1263\u130e
+territories.NO=\u1296\u122d\u12cc
+territories.BE=\u1264\u120d\u1304\u121d
+territories.TR=\u1271\u122d\u12ad
+territories.NL=\u1294\u12d8\u122d\u120b\u1295\u12f5
+territories.BB=\u1263\u122d\u1264\u12f6\u1235
+territories.BA=\u1266\u1235\u1292\u12eb \u12a5\u1293 \u1204\u122d\u12de\u130e\u126a\u1292\u12eb
+territories.TN=\u1271\u1292\u12da\u12eb
+territories.TL=\u121d\u1235\u122b\u1245 \u1272\u121e\u122d
+territories.NG=\u1293\u12ed\u1304\u122a\u12eb
+territories.TJ=\u1273\u1303\u12aa\u1235\u1273\u1295
+territories.AZ=\u12a0\u12d8\u122d\u1263\u1303\u1295
+territories.ZM=\u12db\u121d\u1262\u12eb
+territories.TH=\u1273\u12ed\u120b\u1295\u12f5
+territories.NC=\u1292\u12cd \u12ab\u120c\u12f6\u1292\u12eb
+territories.TF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u12f0\u1261\u1263\u12ca \u130d\u12db\u1276\u127d
+territories.NA=\u1293\u121a\u1262\u12eb
+languages.es=\u1235\u1353\u1292\u123d
+languages.ku=\u12a9\u122d\u12f5\u123d\u129b
+languages.eo=\u12a4\u1235\u1350\u122b\u1295\u1276
+languages.en=\u12a5\u1295\u130d\u120a\u12dd\u129b
+languages.ks=\u12ab\u123d\u121a\u122d\u129b
+languages.el=\u130d\u122a\u12ad\u129b
+languages.qu=\u12b5\u127f\u129b
+languages.ko=\u12ae\u122a\u12eb\u129b
+languages.kn=\u12ab\u1293\u12f3\u129b
+languages.km=\u12ad\u1218\u122d\u129b
+languages.kl=\u12ab\u120b\u120a\u1231\u1275\u129b
+languages.kk=\u12ab\u12db\u12ad\u129b
+languages.wo=\u12ce\u120e\u134d\u129b
+languages.ka=\u130a\u12ee\u122d\u130a\u12eb\u1295
+languages.dz=\u12f5\u12de\u1295\u130d\u12bb\u129b
+languages.jv=\u1303\u126b\u1295\u129b
+languages.pt=\u1356\u122d\u1271\u130b\u120a\u129b
+languages.ps=\u1351\u123d\u1276\u129b
+languages.de=\u1300\u122d\u1218\u1295
+languages.pl=\u1356\u120a\u123d
+languages.da=\u12f4\u1292\u123d
+languages.vo=\u126e\u120b\u1351\u12ad\u129b
+languages.ja=\u1303\u1353\u1295\u129b
+languages.vi=\u126a\u1275\u1293\u121d\u129b
+languages.cy=\u12c8\u120d\u123d
+languages.pa=\u1353\u1295\u1303\u1262\u129b
+languages.cs=\u127c\u12ad\u129b
+languages.iu=\u12a5\u1291\u12ad\u1272\u1271\u1275\u129b
+languages.co=\u12ae\u122d\u1232\u12ab\u129b
+languages.it=\u1323\u120a\u12eb\u1295\u129b
+languages.is=\u12a0\u12ed\u1235\u120b\u1295\u12f5\u129b
+languages.uz=\u12a1\u12dd\u1260\u12ad\u129b
+languages.or=\u12a6\u122a\u12eb\u129b
+languages.ik=\u12a5\u1291\u1352\u12eb\u1245\u129b
+languages.ur=\u12a1\u122d\u12f1\u129b
+languages.om=\u12a6\u122e\u121d\u129b
+languages.ca=\u12ab\u1273\u120b\u1295\u129b
+languages.ie=\u12a5\u1295\u1270\u122d\u120a\u1295\u130d\u12c8
+languages.id=\u12a5\u1295\u12f6\u1292\u1232\u129b
+languages.uk=\u12e9\u12ad\u1228\u1292\u129b
+languages.ia=\u12a2\u1295\u1274\u122d\u120a\u1295\u1313
+languages.oc=\u12a6\u12aa\u1273\u1295\u129b
+languages.ug=\u12a1\u12ca\u130d\u1201\u122d\u129b
+languages.hy=\u12a0\u122d\u1218\u1293\u12ca
+languages.br=\u1265\u122c\u1276\u1295\u129b
+languages.hu=\u1200\u1295\u130b\u122a\u129b
+languages.bo=\u1275\u1260\u1275\u1295\u129b
+languages.bn=\u1260\u1295\u130b\u120a\u129b
+languages.hr=\u12ad\u122e\u123d\u12eb\u1295\u129b
+languages.bi=\u1262\u1235\u120b\u121d\u129b
+languages.tw=\u1275\u12ca\u129b
+languages.bh=\u1262\u1203\u122a
+languages.bg=\u1261\u120d\u130b\u122a\u129b
+languages.tt=\u1273\u1273\u122d\u129b
+languages.no=\u1296\u122d\u12cc\u1302\u12eb\u1295
+languages.be=\u1264\u120b\u122b\u123b\u129b
+languages.ts=\u133e\u1295\u130b\u129b
+languages.hi=\u1210\u1295\u12f5\u129b
+languages.tr=\u1271\u122d\u12ad\u129b
+languages.nl=\u12f0\u127d
+languages.zu=\u12d9\u1209\u129b
+languages.ba=\u1263\u1235\u12aa\u122d\u129b
+languages.to=\u1276\u1295\u130b
+languages.he=\u12d5\u1265\u122b\u1235\u1325
+languages.tn=\u133d\u12cb\u1293\u12ca\u129b
+languages.tl=\u1273\u130b\u120e\u1308\u129b
+languages.tk=\u1271\u122d\u12ad\u1218\u1295\u129b
+languages.ha=\u1203\u12cd\u1233\u129b
+languages.ne=\u1294\u1353\u120a\u129b
+languages.az=\u12a0\u12dc\u122d\u1263\u12ed\u1303\u1295\u129b
+languages.ti=\u1275\u130d\u122d\u129b
+languages.ay=\u12a0\u12eb\u121b\u122d\u129b
+languages.th=\u1273\u12ed\u129b
+languages.tg=\u1273\u1302\u12aa\u129b
+languages.na=\u1293\u12a1\u1229
+languages.te=\u1270\u1209\u1309\u129b
+languages.zh=\u127b\u12ed\u1295\u129b
+languages.as=\u12a0\u1233\u121c\u12db\u12ca
+languages.ar=\u12d0\u122d\u1262\u129b
+languages.ta=\u1273\u121a\u120d\u129b
+languages.gu=\u1309\u1303\u122d\u1272\u129b
+languages.my=\u1261\u122d\u121b\u129b
+languages.am=\u12a0\u121b\u122d\u129b
+languages.za=\u12e1\u12cb\u1295\u130d\u129b
+languages.mt=\u121b\u120d\u1272\u1235\u129b
+languages.ms=\u121b\u120b\u12ed\u129b
+languages.gn=\u1313\u122b\u1292\u129b
+languages.byn=\u1265\u120a\u1295
+languages.sw=\u1235\u12cb\u1202\u120a\u129b
+languages.mr=\u121b\u122b\u12da\u129b
+languages.sv=\u1235\u12ca\u12f5\u1295\u129b
+languages.gl=\u130b\u1208\u130b\u129b
+languages.su=\u1231\u12f3\u1295\u129b
+languages.af=\u12a0\u134d\u122a\u1243\u1295\u1235\u129b
+languages.st=\u1236\u12de\u129b
+languages.mo=\u121e\u120d\u12f3\u126b\u12ca\u1293
+languages.ss=\u1235\u12cb\u1272\u129b
+languages.mn=\u121e\u1295\u130e\u120b\u12ca\u129b
+languages.gez=\u130d\u12d5\u12dd\u129b
+languages.sr=\u1230\u122d\u1262\u129b
+languages.sq=\u120d\u1264\u1292\u129b
+languages.ml=\u121b\u120b\u12eb\u120b\u121d\u129b
+languages.ab=\u12a0\u1265\u1210\u12da\u129b
+languages.mk=\u121b\u12a8\u12f6\u1292\u129b
+languages.aa=\u12a0\u134b\u122d\u129b
+languages.so=\u1231\u121b\u120d\u129b
+languages.sn=\u123e\u1293\u129b
+languages.mi=\u121b\u12ee\u122a\u129b
+languages.gd=\u12a5\u1235\u12ae\u1275\u1235 \u130c\u120d\u12ad\u129b
+languages.sm=\u1233\u121e\u12a0\u129b
+languages.sl=\u1235\u120e\u126a\u129b
+languages.mg=\u121b\u120b\u130b\u1235\u129b
+languages.tig=\u1275\u130d\u1228
+languages.sk=\u1235\u120e\u126b\u12ad\u129b
+languages.ga=\u12a0\u12ed\u122a\u123d
+languages.yo=\u12ee\u1229\u1263\u12ca\u129b
+languages.si=\u1235\u1295\u1203\u120d\u129b
+languages.sg=\u1233\u1295\u130e\u129b
+languages.yi=\u12ed\u12f2\u123b\u12ca\u129b
+languages.sd=\u1232\u1295\u12f5\u1202\u129b
+languages.fy=\u134d\u122a\u1235\u129b
+languages.sid=\u1232\u12f3\u121d\u129b
+languages.sa=\u1233\u1295\u1235\u12ad\u122a\u1275\u129b
+languages.fr=\u1348\u1228\u1295\u1233\u12ed\u129b
+languages.lv=\u120b\u1275\u126a\u12eb\u1295
+languages.fo=\u134b\u122e\u129b
+languages.lt=\u120a\u1271\u12a0\u1292\u12eb\u1295
+languages.rw=\u12aa\u1295\u12eb\u122d\u12cb\u1295\u12f5\u129b
+languages.ru=\u122b\u123d\u129b
+languages.fj=\u134a\u1302\u129b
+languages.lo=\u120b\u12cd\u1235\u129b
+languages.fi=\u134a\u1292\u123d
+languages.ln=\u120a\u1295\u130b\u120b\u129b
+languages.ro=\u122e\u121b\u1292\u12eb\u1295
+languages.rn=\u1229\u1295\u12f2\u129b
+languages.rm=\u122e\u121b\u1295\u1235
+languages.fa=\u1350\u122d\u1232\u12eb\u129b
+languages.la=\u120b\u1272\u1295\u129b
+languages.xh=\u12de\u1233\u129b
+languages.eu=\u1263\u1235\u12ad\u129b
+languages.et=\u12a4\u1235\u1276\u1292\u12a0\u1295
+languages.ky=\u12aa\u122d\u130a\u12dd\u129b
diff --git a/resource/gnu/java/locale/LocaleInformation_byn_ER.properties b/resource/gnu/java/locale/LocaleInformation_byn_ER.properties
new file mode 100644
index 000000000..4971b7fa1
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_byn_ER.properties
@@ -0,0 +1,16 @@
+# LocaleInformation_byn_ER.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
+shortDateFormat=dd/MM/yy
+mediumDateFormat=dd-MMM-yyyy
+longDateFormat=dd MMMM yyyy
+fullDateFormat=EEEE\u1361 dd MMMM \u130d\u122d\u130b yyyy G
+shortTimeFormat=h:mm a
+mediumTimeFormat=h:mm:ss a
+longTimeFormat=h:mm:ss a
+fullTimeFormat=h:mm:ss a
diff --git a/resource/gnu/java/locale/LocaleInformation_ca.properties b/resource/gnu/java/locale/LocaleInformation_ca.properties
index de4c5bf1e..8a598d94d 100644
--- a/resource/gnu/java/locale/LocaleInformation_ca.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ca.properties
@@ -8,13 +8,21 @@
decimalSeparator=,
groupingSeparator=.
localPatternChars=GuMtkHmsSEDFwWahKzUeygAZ
-currenciesDisplayName.ESP=ESP
+currenciesDisplayName.INR=Rupia \u00edndia
+currenciesDisplayName.JPY=Ien japon\u00e8s
+currenciesDisplayName.RUB=Ruble rus
+currenciesDisplayName.CNY=Iuan renmimbi xin\u00e8s
+currenciesDisplayName.GBP=Lliura esterlina brit\u00e0nica
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.USD=D\u00f2lar EUA
+currenciesDisplayName.BRL=Real brasiler
currenciesSymbol.ESP=\u20a7
shortMonths=gen.®febr.®mar\u00e7®abr.®maig®juny®jul.®ag.®set.®oct.®nov.®des.®®
months=gener®febrer®mar\u00e7®abril®maig®juny®juliol®agost®setembre®octubre®novembre®desembre®®
shortWeekdays=®dg.®dl.®dt.®dc.®dj.®dv.®ds.®
weekdays=®diumenge®dilluns®dimarts®dimecres®dijous®divendres®dissabte®
firstDayOfWeek=mon
+eras=aC®dC®
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
longDateFormat=d 'd\u2019'MMMM 'de' yyyy
@@ -85,13 +93,14 @@ territories.PL=Pol\u00f2nia
territories.PK=Pakistan
territories.PH=Filipines
territories.PG=Papua Nova Guinea
-territories.PF=Polin\u00e8sia Francesa
territories.CZ=Rep\u00fablica Txeca
-territories.PE=Per\u00fa
+territories.PF=Polin\u00e8sia Francesa
territories.CY=Xipre
+territories.PE=Per\u00fa
territories.CV=Cap Verd
-territories.PA=Panam\u00e0
territories.CU=Cuba
+territories.PA=Panam\u00e0
+territories.CS=S\u00e8rbia i Montenegro
territories.CR=Costa Rica
territories.CO=Col\u00f2mbia
territories.CN=Xina
@@ -109,57 +118,56 @@ territories.BW=Botswana
territories.BT=Bhutan
territories.BS=Bahames
territories.BR=Brasil
-territories.NZ=Nova Zelanda
territories.BO=Bol\u00edvia
+territories.NZ=Nova Zelanda
territories.BN=Brunei
territories.BM=Bermudes
-territories.NU=Niue
territories.BJ=Benin
+territories.NU=Niue
territories.BI=Burundi
territories.BH=Bahrain
territories.BG=Bulg\u00e0ria
territories.BF=Burkina Faso
-territories.NP=Nepal
territories.BE=B\u00e8lgica
-territories.NO=Noruega
+territories.NP=Nepal
territories.BD=Bangla Desh
+territories.NO=Noruega
territories.BB=Barbados
territories.ZW=Zimbabwe
-territories.NL=Pa\u00efsos Baixos
territories.BA=B\u00f2snia i Hercegovina
+territories.NL=Pa\u00efsos Baixos
territories.NI=Nicaragua
territories.NG=Nig\u00e8ria
territories.AZ=Azerbaidjan
territories.NE=N\u00edger
-territories.NC=Nova Caled\u00f2nia
territories.AW=Aruba
+territories.NC=Nova Caled\u00f2nia
territories.ZM=Z\u00e0mbia
-territories.AU=Austr\u00e0lia
territories.NA=Nam\u00edbia
-territories.AT=\u00c2ustria
+territories.AU=Austr\u00e0lia
+territories.AT=\u00c0ustria
territories.AR=Argentina
-territories.MZ=Mo\u00e7ambic
territories.AO=Angola
-territories.MY=Mal\u00e0isia
+territories.MZ=Mo\u00e7ambic
territories.AN=Antilles Holandeses
-territories.MX=M\u00e8xic
+territories.MY=Mal\u00e0isia
territories.AM=Arm\u00e8nia
+territories.MX=M\u00e8xic
territories.AL=Alb\u00e0nia
territories.ZA=Sud-\u00e0frica
territories.MU=Maurici
-territories.MT=Malta
territories.AI=Anguilla
+territories.MT=Malta
territories.MS=Montserrat
territories.MR=Maurit\u00e0nia
-territories.MQ=Martinica
territories.AF=Afganistan
+territories.MQ=Martinica
territories.AE=Uni\u00f3 dels Emirats \u00c0rabs
territories.AD=Andorra
territories.MN=Mong\u00f2lia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Maced\u00f2nia
-territories.YU=Iugosl\u00e0via
territories.YT=Mayotte
territories.MG=Madagascar
territories.MD=Mold\u00e0via
@@ -222,8 +230,8 @@ territories.TM=Turkmenistan
languages.es=espanyol
languages.ku=kurd
languages.eo=esperanto
-languages.ks=caixmiri
languages.en=angl\u00e8s
+languages.ks=caixmiri
languages.el=grec
languages.qu=qu\u00e8txua
languages.ko=core\u00e0
@@ -247,8 +255,8 @@ languages.cy=gal\u00b7l\u00e8s
languages.pa=panjabi
languages.cs=txec
languages.iu=inuktitut
-languages.it=itali\u00e0
languages.co=cors
+languages.it=itali\u00e0
languages.is=island\u00e8s
languages.uz=uzbek
languages.or=oriya
@@ -297,7 +305,7 @@ languages.na=nauru\u00e0
languages.te=telugu
languages.zh=xin\u00e9s
languages.as=assam\u00e8s
-languages.ar=\u00e2rab
+languages.ar=\u00e0rab
languages.ta=t\u00e0mil
languages.gu=gujarati
languages.my=birm\u00e0
@@ -324,8 +332,8 @@ languages.mk=macedoni
languages.aa=\u00e0far
languages.so=somali
languages.sn=shona
-languages.mi=maori
languages.gd=escoc\u00e8s
+languages.mi=maori
languages.sm=samo\u00e0
languages.sl=eslov\u00e8
languages.mg=malgaix
@@ -341,14 +349,14 @@ languages.fy=fris\u00f3
languages.sa=s\u00e0nscrit
languages.fr=franc\u00e8s
languages.lv=let\u00f3
-languages.lt=litu\u00e0
languages.fo=fero\u00e8s
+languages.lt=litu\u00e0
languages.rw=kinyarwanda
languages.ru=rus
-languages.lo=laosi\u00e0
languages.fj=fiji\u00e0
-languages.ln=lingala
+languages.lo=laosi\u00e0
languages.fi=fin\u00e8s
+languages.ln=lingala
languages.ro=roman\u00e8s
languages.rn=kirundi
languages.rm=retorom\u00e0nic
@@ -356,5 +364,5 @@ languages.fa=persa
languages.la=llat\u00ed
languages.xh=xosa
languages.eu=basc
-languages.ky=kirgu\u00eds
languages.et=estoni\u00e0
+languages.ky=kirgu\u00eds
diff --git a/resource/gnu/java/locale/LocaleInformation_cs.properties b/resource/gnu/java/locale/LocaleInformation_cs.properties
index 3456d4989..d7dd1850d 100644
--- a/resource/gnu/java/locale/LocaleInformation_cs.properties
+++ b/resource/gnu/java/locale/LocaleInformation_cs.properties
@@ -8,738 +8,364 @@
decimalSeparator=,
groupingSeparator=\u00a0
localPatternChars=GuMtkHmsSEDFwWahKzUeygAZ
-currenciesDisplayName.JOD=Din\u00e1r jord\u00e1nsk\u00fd
-currenciesDisplayName.BOV=Mvdol
-currenciesDisplayName.XAU=Zlato
-currenciesDisplayName.FOK=Koruna Faersk\u00fdch ostrov\u016f
-currenciesDisplayName.LBP=Libra libanonsk\u00e1
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.TZS=\u0160ilink tanzansk\u00fd
-currenciesDisplayName.BOP=Peso
-currenciesDisplayName.KHR=Riel
-currenciesDisplayName.XAM=Asijsk\u00e1 pen\u011b\u017en\u00ed jednotka
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Riel star\u00fd
-currenciesDisplayName.ZMP=Libra zambijsk\u00e1
-currenciesDisplayName.AUP=Libra australsk\u00e1
-currenciesDisplayName.XAF=Frank BEAC/CFA
-currenciesDisplayName.MTP=Libra maltsk\u00e1
-currenciesDisplayName.GHR=Ghana Revalued Cedi
-currenciesDisplayName.ZMK=Kwacha
-currenciesDisplayName.GHP=Libra ghansk\u00e1
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Ghana Old Cedi
-currenciesDisplayName.MTL=Lira maltsk\u00e1
-currenciesDisplayName.AUD=Dolar australsk\u00fd
-currenciesDisplayName.USS=Dolar americk\u00fd (t\u00fd\u017e den)
-currenciesDisplayName.ITL=Lira italsk\u00e1
-currenciesDisplayName.USN=Dolar americk\u00fd (p\u0159\u00ed\u0161t\u00ed den)
-currenciesDisplayName.GHC=Cedi
-currenciesDisplayName.SGD=Dolar singapursk\u00fd
-currenciesDisplayName.PAB=Balboa
-currenciesDisplayName.LAK=Kip
-currenciesDisplayName.KGS=Som
-currenciesDisplayName.CHF=Frank \u0161v\u00fdcarsk\u00fd
-currenciesDisplayName.ATS=\u0160ilink
-currenciesDisplayName.USD=Dolar americk\u00fd
-currenciesDisplayName.ETD=Dolar etiopsk\u00fd
-currenciesDisplayName.BND=Dolar brunejsk\u00fd
-currenciesDisplayName.JMP=Libra jamajsk\u00e1
-currenciesDisplayName.ETB=Birr etiopsk\u00fd
-currenciesDisplayName.DZG=Frank al\u017e\u00edrsk\u00fd germinal
-currenciesDisplayName.DZF=Frank nov\u00fd al\u017e\u00edrsk\u00fd
-currenciesDisplayName.DZD=Din\u00e1r al\u017e\u00edrsk\u00fd
-currenciesDisplayName.PYG=Guarani
-currenciesDisplayName.LYP=Libra lybijsk\u00e1
-currenciesDisplayName.JMD=Dolar jamajsk\u00fd
-currenciesDisplayName.ISK=Koruna islandsk\u00e1
-currenciesDisplayName.ESP=Peseta \u0161pan\u011blsk\u00e1
-currenciesDisplayName.BMP=Libra bermudsk\u00e1
-currenciesDisplayName.LYD=Din\u00e1r lybijsk\u00fd
-currenciesDisplayName.BMD=Dolar bermudsk\u00fd
-currenciesDisplayName.NLG=Zlat\u00fd holandsk\u00fd
-currenciesDisplayName.MRO=Ouguiya
-currenciesDisplayName.IRR=Rij\u00e1l \u00edr\u00e1nsk\u00fd
-currenciesDisplayName.SEK=Koruna \u0161v\u00e9dsk\u00e1
-currenciesDisplayName.ERN=Nakfa
+currenciesDisplayName.YDD=Din\u00e1r jemensk\u00fd
+currenciesDisplayName.TWD=Dolar tchajvansk\u00fd nov\u00fd
currenciesDisplayName.KES=\u0160ilink ke\u0148sk\u00fd
-currenciesDisplayName.CFF=Frank St\u0159edoafrick\u00e9 republiky CFA
+currenciesDisplayName.BYB=Rubl nov\u00fd b\u011blorusk\u00fd (1994-1999)
+currenciesDisplayName.LKR=Rupie sr\u00edlansk\u00e1
+currenciesDisplayName.RWF=Frank rwandsk\u00fd
+currenciesDisplayName.TJS=Somoni
+currenciesDisplayName.SDP=Libra s\u00fad\u00e1nsk\u00e1
+currenciesDisplayName.TJR=Tajikistan Ruble
+currenciesDisplayName.ERN=Nakfa
+currenciesDisplayName.AFN=Afgh\u00e1n
+currenciesDisplayName.GRD=Drachma
+currenciesDisplayName.IEP=Libra irsk\u00e1
currenciesDisplayName.ARS=Peso argentinsk\u00e9
+currenciesDisplayName.SDD=Din\u00e1r s\u00fad\u00e1nsk\u00fd
currenciesDisplayName.ARP=Peso argentinsk\u00e9 (1983-1985)
-currenciesDisplayName.ARM=Peso argentinsk\u00e9 Moneda Nacional
-currenciesDisplayName.TWD=Dolar tchajvansk\u00fd nov\u00fd
-currenciesDisplayName.SDP=Libra s\u00fad\u00e1nsk\u00e1
currenciesDisplayName.GEL=Lari
+currenciesDisplayName.AFA=Afgh\u00e1n (1927-2002)
currenciesDisplayName.GEK=Georgian Kupon Larit
-currenciesDisplayName.MQF=Frank martiniksk\u00fd
+currenciesDisplayName.CRC=Col\u00f3n kostarick\u00fd
currenciesDisplayName.FKP=Libra falklandsk\u00e1
+currenciesDisplayName.EEK=Kroon
+currenciesDisplayName.HKD=Dolar hongkongsk\u00fd
+currenciesDisplayName.MDL=Leu moldavsk\u00fd
currenciesDisplayName.ARA=Austral
-currenciesDisplayName.SDD=Din\u00e1r s\u00fad\u00e1nsk\u00fd
currenciesDisplayName.IQD=Din\u00e1r ir\u00e1ck\u00fd
-currenciesDisplayName.TVD=Dolar tuvalsk\u00fd
currenciesDisplayName.SCR=Rupie seychelsk\u00e1
+currenciesDisplayName.VUV=Vatu
+currenciesDisplayName.DKK=Koruna d\u00e1nsk\u00e1
+currenciesDisplayName.KPW=Won severokorejsk\u00fd
+currenciesDisplayName.GQE=Equatorial Guinea Ekwele Guineana
+currenciesDisplayName.IDR=Rupie indon\u00e9zsk\u00e1
currenciesDisplayName.LVR=Rubl loty\u0161sk\u00fd
-currenciesDisplayName.FJP=Libra fid\u017eijsk\u00e1
+currenciesDisplayName.SOS=\u0160ilink som\u00e1lsk\u00fd
+currenciesDisplayName.AED=Dirham SAE
+currenciesDisplayName.BWP=Pula
currenciesDisplayName.LVL=Lat loty\u0161sk\u00fd
-currenciesDisplayName.CDL=Zaire kon\u017esk\u00fd
-currenciesDisplayName.CDG=Frank Kon\u017esk\u00e9 republiky
-currenciesDisplayName.CDF=Frank kon\u017esk\u00fd
-currenciesDisplayName.FJD=Dolar fid\u017eijsk\u00fd
+currenciesDisplayName.RUR=Rubl rusk\u00fd (1991-1998)
currenciesDisplayName.NIO=Cordoba oro
+currenciesDisplayName.ADP=Peseta andorrsk\u00e1
+currenciesDisplayName.FJD=Dolar fid\u017eijsk\u00fd
currenciesDisplayName.MOP=Pataca
-currenciesDisplayName.NIG=Cordoba zlat\u00e1
+currenciesDisplayName.RUB=Rubl rusk\u00fd
+currenciesDisplayName.CDF=Frank kon\u017esk\u00fd
currenciesDisplayName.NIC=Cordoba
-currenciesDisplayName.FIN=Markka (1860-1962)
-currenciesDisplayName.FIM=Markka
+currenciesDisplayName.DJF=Frank d\u017eibutsk\u00fd
+currenciesDisplayName.ECV=Ecuador Unidad de Valor Constante (UVC)
currenciesDisplayName.SBD=Dolar \u0160alamounov\u00fdch ostrov\u016f
+currenciesDisplayName.UZS=Sum uzbeck\u00fd
+currenciesDisplayName.ECS=Sucre ekv\u00e1dorsk\u00fd
+currenciesDisplayName.PHP=Peso filip\u00ednsk\u00e9
+currenciesDisplayName.THB=Baht
currenciesDisplayName.LUF=Frank lucembursk\u00fd
-currenciesDisplayName.TTO=Dolar star\u00fd Trinidad a Tobago
-currenciesDisplayName.AOS=Escudo angolsk\u00e9
-currenciesDisplayName.AOR=Kwanza reajustado (1995-1999)
-currenciesDisplayName.MNT=Tugrik
-currenciesDisplayName.HUF=Forint
-currenciesDisplayName.BIF=Frank burundsk\u00fd
-currenciesDisplayName.AON=Kwanza nov\u00e1 (1990-2000)
-currenciesDisplayName.AOK=Kwanza (1977-1990)
+currenciesDisplayName.FIM=Markka
currenciesDisplayName.TTD=Dolar Trinidad a Tobago
currenciesDisplayName.SZL=Lilangeni
-currenciesDisplayName.NHF=Frank Nov\u00fdch Hebrid CFP
-currenciesDisplayName.GBP=Libra \u0161terlink\u016f
-currenciesDisplayName.SAS=Rij\u00e1l saudsk\u00fd sovereign
+currenciesDisplayName.MNT=Tugrik
currenciesDisplayName.SAR=Rij\u00e1l saudsk\u00fd
+currenciesDisplayName.UAK=Karbovanec
+currenciesDisplayName.UAH=H\u0159ivna
+currenciesDisplayName.HUF=Forint
+currenciesDisplayName.COP=Peso kolumbijsk\u00e9
+currenciesDisplayName.QAR=Rij\u00e1l katarsk\u00fd
currenciesDisplayName.LTT=Talon
-currenciesDisplayName.INR=Rupie indick\u00e1
currenciesDisplayName.PTE=Escudo portugalsk\u00e9
-currenciesDisplayName.AOA=Kwanza
-currenciesDisplayName.PTC=Conto portugalsk\u00e9
+currenciesDisplayName.AOR=Kwanza reajustado (1995-1999)
+currenciesDisplayName.UYU=Peso uruguaysk\u00e9
+currenciesDisplayName.GBP=Libra \u0161terlink\u016f
+currenciesDisplayName.BIF=Frank burundsk\u00fd
+currenciesDisplayName.INR=Rupie indick\u00e1
+currenciesDisplayName.ZRZ=Zaire
+currenciesDisplayName.AON=Kwanza nov\u00e1 (1990-2000)
currenciesDisplayName.LTL=Litus litevsk\u00fd
+currenciesDisplayName.XFU=Frank UIC
currenciesDisplayName.KZT=Tenge
-currenciesDisplayName.KZR=Rubl kaza\u0161sk\u00fd
-currenciesDisplayName.VGD=Dolar Britsk\u00fdch Panensk\u00fdch ostrov\u016f
-currenciesDisplayName.NGP=Libra nigerijsk\u00e1
+currenciesDisplayName.MZM=Metical
+currenciesDisplayName.UYP=Peso uruguaysk\u00e9 (1975-1993)
+currenciesDisplayName.AOK=Kwanza (1977-1990)
+currenciesDisplayName.BUK=Kyat barmsk\u00fd
+currenciesDisplayName.GNS=Guinea Syli
+currenciesDisplayName.XFO=Frank zlat\u00fd
+currenciesDisplayName.PGK=Kina
+currenciesDisplayName.SYP=Libra syrsk\u00e1
+currenciesDisplayName.MZE=Escudo Mosambiku
+currenciesDisplayName.OMR=Rij\u00e1l om\u00e1nsk\u00fd
currenciesDisplayName.NGN=Naira
+currenciesDisplayName.ZRN=Zaire nov\u00fd
+currenciesDisplayName.AOA=Kwanza
+currenciesDisplayName.CNY=Juan renminbi
+currenciesDisplayName.MAF=Frank marock\u00fd
+currenciesDisplayName.GNF=Frank guinejsk\u00fd
currenciesDisplayName.HTG=Gourde
-currenciesDisplayName.SYP=Libra syrsk\u00e1
-currenciesDisplayName.PSP=Libra palestinsk\u00e1
-currenciesDisplayName.BHD=Din\u00e1r bahrajnsk\u00fd
+currenciesDisplayName.MAD=Dirham marock\u00fd
+currenciesDisplayName.TRY=Lira nov\u00e1 tureck\u00e1
currenciesDisplayName.MMK=Kyat
+currenciesDisplayName.MYR=Ringgit malajskijsk\u00fd
+currenciesDisplayName.LSL=Loti
+currenciesDisplayName.XEU=Evropsk\u00e1 m\u011bnov\u00e1 jednotka
+currenciesDisplayName.BHD=Din\u00e1r bahrajnsk\u00fd
+currenciesDisplayName.BTN=Ngultrum
+currenciesDisplayName.TRL=Lira tureck\u00e1
+currenciesDisplayName.KMF=Frank komorsk\u00fd
currenciesDisplayName.ANG=Zlat\u00fd Nizozemsk\u00fdch Antil
currenciesDisplayName.CZK=Koruna \u010desk\u00e1
-currenciesDisplayName.IMP=Libra \u0161terlink\u016f Ostrov Man
-currenciesDisplayName.LSL=Loti
-currenciesDisplayName.GAF=Frank gabonsk\u00fd CFA
-currenciesDisplayName.BGO=Lev Bulharsk\u00fd (1879-1952)
+currenciesDisplayName.AZM=Manat \u00e1zerbajd\u017e\u00e1nsk\u00fd
+currenciesDisplayName.KYD=Dolar Kajmansk\u00fdch ostrov\u016f
+currenciesDisplayName.GMD=Dalasi
currenciesDisplayName.BGN=Lev Bulharsk\u00fd
-currenciesDisplayName.BGM=Lev Bulharsk\u00fd socialistick\u00fd
currenciesDisplayName.CAD=Dolar kanadsk\u00fd
+currenciesDisplayName.MXV=Mexican Unidad de Inversion (UDI)
currenciesDisplayName.BGL=Lev
-currenciesDisplayName.TRL=Lira tureck\u00e1
-currenciesDisplayName.KYD=Dolar Kajmansk\u00fdch ostrov\u016f
-currenciesDisplayName.CYP=Libra kypersk\u00e1
+currenciesDisplayName.VEB=Bolivar
+currenciesDisplayName.MLF=Frank malijsk\u00fd
currenciesDisplayName.ILS=\u0160ekel nov\u00fd izraelsk\u00fd
+currenciesDisplayName.MXP=Peso st\u0159\u00edbrn\u00e9 mexick\u00e9 (1861-1992)
+currenciesDisplayName.PES=Sol
currenciesDisplayName.GYD=Dolar guyansk\u00fd
-currenciesDisplayName.AMD=Dram arm\u00e9nsk\u00fd
+currenciesDisplayName.MXN=Peso mexick\u00e9
currenciesDisplayName.ILP=Libra izraelsk\u00e1
-currenciesDisplayName.MLF=Frank malijsk\u00fd
-currenciesDisplayName.ILL=\u0160ekel izraelsk\u00fd
-currenciesDisplayName.VEB=Bolivar
+currenciesDisplayName.SKK=Koruna slovensk\u00e1
+currenciesDisplayName.CYP=Libra kypersk\u00e1
+currenciesDisplayName.XDR=SDR
+currenciesDisplayName.PEN=Nuevo sol
currenciesDisplayName.LRD=Dolar liberijsk\u00fd
-currenciesDisplayName.ALV=Albanian Lek Valute
+currenciesDisplayName.PEI=Inti
+currenciesDisplayName.AMD=Dram arm\u00e9nsk\u00fd
+currenciesDisplayName.BSD=Dolar bahamsk\u00fd
currenciesDisplayName.HRK=Kuna chorvatsk\u00e1
-currenciesDisplayName.REF=Frank Reunion
+currenciesDisplayName.CLP=Peso chilsk\u00e9
currenciesDisplayName.HRD=Dinar chorvatsk\u00fd
-currenciesDisplayName.ALL=Lek
-currenciesDisplayName.JEP=Libra \u0161terlink\u016f Jersey
-currenciesDisplayName.ALK=Lek (1946-1961)
-currenciesDisplayName.MKN=Den\u00e1r (1992-1993)
-currenciesDisplayName.MKD=Den\u00e1r
-currenciesDisplayName.TPP=Pataca timorsk\u00e1
currenciesDisplayName.XPF=Frank CFP
-currenciesDisplayName.BEL=Frank finan\u010dn\u00ed
-currenciesDisplayName.GWP=Peso Guinnea-Bissau
-currenciesDisplayName.KWD=Din\u00e1r kuvajtsk\u00fd
-currenciesDisplayName.GWM=Portuguese Guinea Mil Reis
-currenciesDisplayName.BEF=Frank belgick\u00fd
+currenciesDisplayName.FRF=Frank francouzsk\u00fd
+currenciesDisplayName.BRR=Cruzeiro real
+currenciesDisplayName.MKD=Den\u00e1r
+currenciesDisplayName.CLF=Unidades de fomento
+currenciesDisplayName.ALL=Lek
+currenciesDisplayName.BRN=Cruzado nov\u00e9
+currenciesDisplayName.MWK=Kwacha
+currenciesDisplayName.BRL=Real brazilsk\u00fd
currenciesDisplayName.TPE=Escudo timorsk\u00e9
-currenciesDisplayName.BEC=Frank konvertibiln\u00ed
-currenciesDisplayName.GWE=Escudo guinejsk\u00e9
+currenciesDisplayName.BRE=Cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Cruzado
+currenciesDisplayName.BRB=Cruzeiro (1967-1986)
+currenciesDisplayName.DEM=Marka n\u011bmeck\u00e1
+currenciesDisplayName.KWD=Din\u00e1r kuvajtsk\u00fd
+currenciesDisplayName.XCD=Dolar v\u00fdchodokaribsk\u00fd
+currenciesDisplayName.NPR=Rupie nep\u00e1lsk\u00e1
+currenciesDisplayName.GWP=Peso Guinnea-Bissau
+currenciesDisplayName.YUN=Din\u00e1r jugosl\u00e1vsk\u00fd
currenciesDisplayName.SVC=Colon salvadorsk\u00fd
-currenciesDisplayName.CWG=Zlat\u00fd Curacao
-currenciesDisplayName.BDT=Taka
-currenciesDisplayName.TOS=Libra \u0161terlink\u016f ton\u017esk\u00e1
+currenciesDisplayName.YUM=Din\u00e1r jugosl\u00e1vsk\u00fd
+currenciesDisplayName.BEL=Frank finan\u010dn\u00ed
+currenciesDisplayName.SIT=Tolar
+currenciesDisplayName.JPY=Jen
currenciesDisplayName.XOF=Frank BCEAO/CFA
+currenciesDisplayName.MVR=Rufiyaa
+currenciesDisplayName.GWE=Escudo guinejsk\u00e9
+currenciesDisplayName.BEF=Frank belgick\u00fd
+currenciesDisplayName.YUD=Din\u00e1r jugosl\u00e1vsk\u00fd nov\u00fd
+currenciesDisplayName.BEC=Frank konvertibiln\u00ed
currenciesDisplayName.SUR=Rubl
-currenciesDisplayName.SUN=Rubl nov\u00fd
-currenciesDisplayName.NCF=Frank Nov\u00e9 Kaledonie germinal
-currenciesDisplayName.CVE=Escudo kapverdsk\u00e9
-currenciesDisplayName.XNF=Frank Francouzsk\u00fdch Antil CFA
+currenciesDisplayName.ROL=Lei
+currenciesDisplayName.DDM=Marka NDR
+currenciesDisplayName.BDT=Taka
+currenciesDisplayName.XBD=Evropsk\u00e1 jednotka \u00fa\u010dtu 17 (XBD)
+currenciesDisplayName.AWG=Zlat\u00fd arubsk\u00fd
+currenciesDisplayName.XBC=Evropsk\u00e1 jednotka \u00fa\u010dtu 9 (XBC)
+currenciesDisplayName.XBB=Evropsk\u00e1 pen\u011b\u017en\u00ed jednotka
+currenciesDisplayName.XBA=Evropsk\u00e1 sm\u00ed\u0161en\u00e1 jednotka
+currenciesDisplayName.NOK=Koruna norsk\u00e1
+currenciesDisplayName.MUR=Rupie mauricijsk\u00e1
currenciesDisplayName.ZAR=Rand
-currenciesDisplayName.DOP=Peso dominik\u00e1nsk\u00e9
-currenciesDisplayName.ZAP=Libra jihoafrick\u00e1
+currenciesDisplayName.SHP=Libra Svat\u00e9 Heleny
+currenciesDisplayName.XAU=Zlato
currenciesDisplayName.ZAL=Rand finan\u010dn\u00ed
+currenciesDisplayName.TZS=\u0160ilink tanzansk\u00fd
+currenciesDisplayName.GIP=Libra gibraltarsk\u00e1
currenciesDisplayName.TND=Din\u00e1r tunisk\u00fd
-currenciesDisplayName.CUP=Peso kub\u00e1nsk\u00e9
-currenciesDisplayName.GUF=French Guyana Franc Guiana
+currenciesDisplayName.CVE=Escudo kapverdsk\u00e9
currenciesDisplayName.UGX=\u0160ilink ugandsk\u00fd
-currenciesDisplayName.LNR=Rupie cejlonsk\u00e1
-currenciesDisplayName.AIF=Affars and Issas Franc
-currenciesDisplayName.VAL=Lira Vatik\u00e1nu
-currenciesDisplayName.STE=Escudo Svat\u00e9ho Tom\u00e1\u0161e
+currenciesDisplayName.ZMK=Kwacha
+currenciesDisplayName.JOD=Din\u00e1r jord\u00e1nsk\u00fd
+currenciesDisplayName.XAF=Frank BEAC/CFA
+currenciesDisplayName.LBP=Libra libanonsk\u00e1
currenciesDisplayName.UGS=\u0160ilink ugandsk\u00fd (1966-1987)
currenciesDisplayName.STD=Dobra
-currenciesDisplayName.MHD=Dolar Marshallov\u00fdch ostrov\u016f
-currenciesDisplayName.NZP=Libra novoz\u00e9landsk\u00e1
currenciesDisplayName.WST=Tala
-currenciesDisplayName.WSP=Libra Z\u00e1padn\u00ed Samoa
-currenciesDisplayName.HNL=Lempira
+currenciesDisplayName.KHR=Riel
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Peso dominik\u00e1nsk\u00e9
+currenciesDisplayName.BOV=Mvdol
+currenciesDisplayName.MTP=Libra maltsk\u00e1
+currenciesDisplayName.USS=Dolar americk\u00fd (t\u00fd\u017e den)
+currenciesDisplayName.BOP=Peso
+currenciesDisplayName.MTL=Lira maltsk\u00e1
+currenciesDisplayName.CUP=Peso kub\u00e1nsk\u00e9
currenciesDisplayName.TMM=Manat
-currenciesDisplayName.GTQ=Quetzal
+currenciesDisplayName.USN=Dolar americk\u00fd (p\u0159\u00ed\u0161t\u00ed den)
+currenciesDisplayName.SGD=Dolar singapursk\u00fd
currenciesDisplayName.NZD=Dolar novoz\u00e9landsk\u00fd
-currenciesDisplayName.SSP=Libra skotsk\u00e1
-currenciesDisplayName.BBD=Dolar barbadosk\u00fd
+currenciesDisplayName.USD=Dolar americk\u00fd
+currenciesDisplayName.HNL=Lempira
+currenciesDisplayName.BOB=Boliviano
+currenciesDisplayName.ITL=Lira italsk\u00e1
+currenciesDisplayName.PAB=Balboa
+currenciesDisplayName.GTQ=Quetzal
+currenciesDisplayName.LAK=Kip
+currenciesDisplayName.GHC=Cedi
+currenciesDisplayName.AUD=Dolar australsk\u00fd
currenciesDisplayName.NAD=Dolar namibijsk\u00fd
+currenciesDisplayName.KGS=Som
currenciesDisplayName.MGF=Frank madagaskarsk\u00fd
+currenciesDisplayName.CHF=Frank \u0161v\u00fdcarsk\u00fd
+currenciesDisplayName.BBD=Dolar barbadosk\u00fd
currenciesDisplayName.MGA=Ariary madagaskarsk\u00fd
-currenciesDisplayName.EGP=Libra egyptsk\u00e1
-currenciesDisplayName.BZH=Dolar Britsk\u00e9ho Hondurasu
+currenciesDisplayName.PYG=Guarani
currenciesDisplayName.PLZ=Zlot\u00fd (1950-1995)
-currenciesDisplayName.BAN=Nov\u00fd Din\u00e1r Bosny a Hercegoviny
-currenciesDisplayName.BAM=Marka konvertibiln\u00ed
-currenciesDisplayName.BZD=Dolar belizsk\u00fd
-currenciesDisplayName.BAD=Din\u00e1r Bosny a Hercegoviny
-currenciesDisplayName.PLN=Zlot\u00fd
currenciesDisplayName.YER=Rij\u00e1l jemensk\u00fd
+currenciesDisplayName.ATS=\u0160ilink
+currenciesDisplayName.ETB=Birr etiopsk\u00fd
+currenciesDisplayName.BND=Dolar brunejsk\u00fd
+currenciesDisplayName.JMD=Dolar jamajsk\u00fd
+currenciesDisplayName.EGP=Libra egyptsk\u00e1
+currenciesDisplayName.PLN=Zlot\u00fd
+currenciesDisplayName.DZD=Din\u00e1r al\u017e\u00edrsk\u00fd
+currenciesDisplayName.ISK=Koruna islandsk\u00e1
currenciesDisplayName.SRG=Zlat\u00fd surinamsk\u00fd
-currenciesDisplayName.CSK=Koruna \u010deskoslovensk\u00e1
+currenciesDisplayName.LYD=Din\u00e1r lybijsk\u00fd
+currenciesDisplayName.BZD=Dolar belizsk\u00fd
+currenciesDisplayName.BAM=Marka konvertibiln\u00ed
+currenciesDisplayName.ESP=Peseta \u0161pan\u011blsk\u00e1
currenciesDisplayName.KRW=Won jihokorejsk\u00fd
+currenciesDisplayName.NLG=Zlat\u00fd holandsk\u00fd
+currenciesDisplayName.MRO=Ouguiya
+currenciesDisplayName.BAD=Din\u00e1r Bosny a Hercegoviny
+currenciesDisplayName.ZWD=Dolar zimbabwsk\u00fd
+currenciesDisplayName.SEK=Koruna \u0161v\u00e9dsk\u00e1
+currenciesDisplayName.CSK=Koruna \u010deskoslovensk\u00e1
currenciesDisplayName.BYR=Rubl b\u011blorusk\u00fd
-currenciesDisplayName.YEI=Rij\u00e1l jemensk\u00fd imadi
-currenciesDisplayName.BYL=Rubl b\u011blorusk\u00fd (1992-1994)
-currenciesDisplayName.CSC=Koruna \u010deskoslovensk\u00e1
-currenciesDisplayName.KRO=Won star\u00fd jihokorejsk\u00fd
-currenciesDisplayName.KRH=Hwan jihokorejsk\u00fd
-currenciesDisplayName.BYB=Rubl nov\u00fd b\u011blorusk\u00fd (1994-1999)
-currenciesDisplayName.SQS=Somaliland Shilling
-currenciesDisplayName.GRN=Drachma nov\u00e1 \u0159eck\u00e1
+currenciesDisplayName.IRR=Rij\u00e1l \u00edr\u00e1nsk\u00fd
currenciesDisplayName.PKR=Rupie p\u00e1kist\u00e1nsk\u00e1
-currenciesDisplayName.AFN=Afgh\u00e1n
-currenciesDisplayName.ZWD=Dolar zimbabwsk\u00fd
-currenciesDisplayName.LKR=Rupie sr\u00edlansk\u00e1
-currenciesDisplayName.GRD=Drachma
-currenciesDisplayName.IEP=Libra irsk\u00e1
-currenciesDisplayName.AFA=Afgh\u00e1n (1927-2002)
-currenciesDisplayName.YDD=Din\u00e1r jemensk\u00fd
-currenciesDisplayName.RWF=Frank rwandsk\u00fd
-currenciesDisplayName.CRC=Col\u00f3n kostarick\u00fd
-currenciesDisplayName.TJS=Somoni
-currenciesDisplayName.TJR=Tajikistan Ruble
-currenciesDisplayName.EEK=Kroon
-currenciesDisplayName.GQP=Equatorial Guinea Peseta Guineana
-currenciesDisplayName.MDR=Moldovan Ruble Cupon
-currenciesDisplayName.HKD=Dolar hongkongsk\u00fd
-currenciesDisplayName.DKK=Koruna d\u00e1nsk\u00e1
-currenciesDisplayName.MDL=Leu moldavsk\u00fd
-currenciesDisplayName.GQF=Equatorial Guinea Franco
-currenciesDisplayName.GQE=Equatorial Guinea Ekwele Guineana
-currenciesDisplayName.IDR=Rupie indon\u00e9zsk\u00e1
-currenciesDisplayName.AED=Dirham SAE
-currenciesDisplayName.KPW=Won severokorejsk\u00fd
-currenciesDisplayName.IDN=Indonesian New Rupiah
-currenciesDisplayName.BWP=Pula
-currenciesDisplayName.MDC=Moldovan Leu Cupon
-currenciesDisplayName.IDJ=Indonesian Java Rupiah
-currenciesDisplayName.IDG=Indonesian Nica Guilder
-currenciesDisplayName.VUV=Vatu
-currenciesDisplayName.XID=Din\u00e1r isl\u00e1msk\u00fd
-currenciesDisplayName.SOS=\u0160ilink som\u00e1lsk\u00fd
-currenciesDisplayName.ADP=Peseta andorrsk\u00e1
-currenciesDisplayName.RUR=Rubl rusk\u00fd (1991-1998)
-currenciesDisplayName.GPF=Frank guadeloupsk\u00fd
-currenciesDisplayName.DJF=Frank d\u017eibutsk\u00fd
-currenciesDisplayName.ADD=Diner andorrsk\u00fd
-currenciesDisplayName.MCG=Frank monack\u00fd germinal
-currenciesDisplayName.MCF=Frank nouveau monack\u00fd
-currenciesDisplayName.ECV=Ecuador Unidad de Valor Constante (UVC)
-currenciesDisplayName.ECS=Sucre ekv\u00e1dorsk\u00fd
-currenciesDisplayName.LIF=Frank lichten\u0161tejnsk\u00fd
-currenciesDisplayName.RUB=Rubl rusk\u00fd
-currenciesDisplayName.PHP=Peso filip\u00ednsk\u00e9
-currenciesDisplayName.UZS=Sum uzbeck\u00fd
-currenciesDisplayName.COP=Peso kolumbijsk\u00e9
-currenciesDisplayName.THB=Baht
-currenciesDisplayName.IBP=Libra severoirsk\u00e1
-currenciesDisplayName.BUR=Rupie barmsk\u00e1
-currenciesDisplayName.COF=Krank kon\u017esk\u00fd CFA
-currenciesDisplayName.BUK=Kyat barmsk\u00fd
-currenciesDisplayName.COB=Peso kolumbijsk\u00e9
-currenciesDisplayName.UZC=Uzbekistan Coupon Som
-currenciesDisplayName.UAK=Karbovanec
-currenciesDisplayName.QAR=Rij\u00e1l katarsk\u00fd
-currenciesDisplayName.UAH=H\u0159ivna
-currenciesDisplayName.GNS=Guinea Syli
-currenciesDisplayName.CNY=Juan renminbi
-currenciesDisplayName.MZM=Metical
-currenciesDisplayName.CNX=Dolar lidov\u00e9 banky
-currenciesDisplayName.UYU=Peso uruguaysk\u00e9
-currenciesDisplayName.GNI=Frank guinejsk\u00fd (1960-1972)
-currenciesDisplayName.SML=Lira San Marino
-currenciesDisplayName.MZE=Escudo Mosambiku
-currenciesDisplayName.CNP=Juan jen min piao
-currenciesDisplayName.PGK=Kina
-currenciesDisplayName.OMS=Rij\u00e1l om\u00e1nsk\u00fd saidi
-currenciesDisplayName.GNF=Frank guinejsk\u00fd
-currenciesDisplayName.UYP=Peso uruguaysk\u00e9 (1975-1993)
-currenciesDisplayName.OMR=Rij\u00e1l om\u00e1nsk\u00fd
-currenciesDisplayName.XFU=Frank UIC
-currenciesDisplayName.ZRZ=Zaire
-currenciesDisplayName.BTR=Rupie bh\u00fat\u00e1nsk\u00e1
-currenciesDisplayName.MAF=Frank marock\u00fd
-currenciesDisplayName.MAD=Dirham marock\u00fd
-currenciesDisplayName.BTN=Ngultrum
-currenciesDisplayName.XFO=Frank zlat\u00fd
-currenciesDisplayName.UYF=Peso uruguaysk\u00e9 fuerte
-currenciesDisplayName.MYR=Ringgit malajskijsk\u00fd
-currenciesDisplayName.ZRN=Zaire nov\u00fd
-currenciesDisplayName.AZM=Manat \u00e1zerbajd\u017e\u00e1nsk\u00fd
-currenciesDisplayName.GMP=Libra gambijsk\u00e1
-currenciesDisplayName.KMF=Frank komorsk\u00fd
-currenciesDisplayName.GMD=Dalasi
-currenciesDisplayName.XEU=Evropsk\u00e1 m\u011bnov\u00e1 jednotka
-currenciesDisplayName.BSP=Libra bahamsk\u00e1
-currenciesDisplayName.CMF=Frank kamerunsk\u00fd CFA
-currenciesDisplayName.MXV=Mexican Unidad de Inversion (UDI)
-currenciesDisplayName.XEF=Frank BCEAEC/CFA
-currenciesDisplayName.BSD=Dolar bahamsk\u00fd
-currenciesDisplayName.MXP=Peso st\u0159\u00edbrn\u00e9 mexick\u00e9 (1861-1992)
-currenciesDisplayName.MXN=Peso mexick\u00e9
-currenciesDisplayName.PES=Sol
-currenciesDisplayName.GLK=Greenland Krone
-currenciesDisplayName.BRZ=Cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Nuevo sol
-currenciesDisplayName.CLP=Peso chilsk\u00e9
-currenciesDisplayName.SKK=Koruna slovensk\u00e1
-currenciesDisplayName.PEI=Inti
-currenciesDisplayName.BRR=Cruzeiro real
-currenciesDisplayName.XDR=SDR
-currenciesDisplayName.FRG=Frank francouzsk\u00fd germinal/Frank poincare
-currenciesDisplayName.FRF=Frank francouzsk\u00fd
-currenciesDisplayName.BRN=Cruzado nov\u00e9
-currenciesDisplayName.CLF=Unidades de fomento
-currenciesDisplayName.CLE=Escudo chilsk\u00e9
-currenciesDisplayName.BRL=Real brazilsk\u00fd
-currenciesDisplayName.CLC=Condor chilsk\u00fd
-currenciesDisplayName.BRE=Cruzeiro (1990-1993)
-currenciesDisplayName.DES=Sperrmark n\u011bmeck\u00e1
-currenciesDisplayName.MWP=Libra malawijsk\u00e1
-currenciesDisplayName.BRC=Cruzado
-currenciesDisplayName.BRB=Cruzeiro (1967-1986)
-currenciesDisplayName.MWK=Kwacha
-currenciesDisplayName.PDR=Transdniestria Ruble
-currenciesDisplayName.DEM=Marka n\u011bmeck\u00e1
-currenciesDisplayName.TDF=Frank \u010dadsk\u00fd CFA
-currenciesDisplayName.PDN=Transdniestria New Ruble
-currenciesDisplayName.PDK=Transdniestria Ruble Kupon
-currenciesDisplayName.NPR=Rupie nep\u00e1lsk\u00e1
-currenciesDisplayName.CKD=Dolar Cookov\u00fdch ostrov\u016f
-currenciesDisplayName.JPY=Jen
-currenciesDisplayName.MVR=Rufiyaa
-currenciesDisplayName.XCF=Frank Nouveau CFA
-currenciesDisplayName.MVP=Rupie maledivsk\u00e1
-currenciesDisplayName.XCD=Dolar v\u00fdchodokaribsk\u00fd
-currenciesDisplayName.SIT=Tolar
-currenciesDisplayName.YUR=Din\u00e1r jugosl\u00e1vsk\u00fd reformovan\u00fd
-currenciesDisplayName.AWG=Zlat\u00fd arubsk\u00fd
-currenciesDisplayName.DDM=Marka NDR
-currenciesDisplayName.YUN=Din\u00e1r jugosl\u00e1vsk\u00fd
-currenciesDisplayName.YUM=Din\u00e1r jugosl\u00e1vsk\u00fd
-currenciesDisplayName.TCC=Koruna Turks a Caicos
-currenciesDisplayName.YUG=Din\u00e1r jugosl\u00e1vsk\u00fd 1994
-currenciesDisplayName.YUF=Din\u00e1r jugosl\u00e1vsk\u00fd federativn\u00ed
-currenciesDisplayName.RON=Lei nov\u00fd
-currenciesDisplayName.YUD=Din\u00e1r jugosl\u00e1vsk\u00fd nov\u00fd
-currenciesDisplayName.ROL=Lei
-currenciesDisplayName.SIB=Slovenia Tolar Bons
-currenciesDisplayName.NOK=Koruna norsk\u00e1
-currenciesDisplayName.MUR=Rupie mauricijsk\u00e1
-currenciesDisplayName.XBD=Evropsk\u00e1 jednotka \u00fa\u010dtu 17 (XBD)
-currenciesDisplayName.GIP=Libra gibraltarsk\u00e1
-currenciesDisplayName.XBC=Evropsk\u00e1 jednotka \u00fa\u010dtu 9 (XBC)
-currenciesDisplayName.XBB=Evropsk\u00e1 pen\u011b\u017en\u00ed jednotka
-currenciesDisplayName.XBA=Evropsk\u00e1 sm\u00ed\u0161en\u00e1 jednotka
-currenciesDisplayName.KID=Dolar kiribatsk\u00fd
-currenciesDisplayName.SHP=Libra Svat\u00e9 Heleny
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Dolar bermudsk\u00fd
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.INR=INR
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=K\u010d
-currenciesSymbol.IMP=IMP
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
currenciesSymbol.DOP=RD$
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
currenciesSymbol.GNF=GF
-currenciesSymbol.UYP=UYP
-currenciesSymbol.OMR=RO
-currenciesSymbol.XFU=XFU
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.BTR=BTR
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.XFO=XFO
-currenciesSymbol.BTN=Nu
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.XBC=XBC
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-shortMonths=1.®2.®3.®4.®5.®6.®7.®8.®9.®10.®11.®12.®®
-months=Leden®\u00danor®B\u0159ezen®Duben®Kv\u011bten®\u010cerven®\u010cervenec®Srpen®Z\u00e1\u0159\u00ed®\u0158\u00edjen®Listopad®Prosinec®®
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.CZK=K\u010d
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
+shortMonths=led®\u00fano®b\u0159e®dub®kv\u011b®\u010drn®\u010drc®srp®z\u00e1\u0159®\u0159\u00edj®lis®pro®®
+months=leden®\u00fanor®b\u0159ezen®duben®kv\u011bten®\u010derven®\u010dervenec®srpen®z\u00e1\u0159\u00ed®\u0159\u00edjen®listopad®prosinec®®
shortWeekdays=®ne®po®\u00fat®st®\u010dt®p\u00e1®so®
weekdays=®ned\u011ble®pond\u011bl\u00ed®\u00fater\u00fd®st\u0159eda®\u010dtvrtek®p\u00e1tek®sobota®
firstDayOfWeek=mon
eras=p\u0159.Kr.®po Kr.®
ampms=dop.®odp.®
-shortDateFormat=d.M.yy
-mediumDateFormat=d.M.yyyy
+shortDateFormat=yy-MM-dd
+mediumDateFormat=yyyy-MM-dd
longDateFormat=d. MMMM yyyy
fullDateFormat=EEEE, d. MMMM yyyy
shortTimeFormat=H:mm
mediumTimeFormat=H:mm:ss
-longTimeFormat=H:mm:ss z
-fullTimeFormat=H:mm:ss z
-zoneStrings=America/Indianapolis®EST®V\u00fdchodn\u00ed standardn\u00ed \u010das®EST®V\u00fdchodn\u00ed standardn\u00ed \u010das®©America/Halifax®AST®Atlantick\u00fd standardn\u00ed \u010das®ADT®Atlantick\u00fd letn\u00ed \u010das®©Pacific/Honolulu®HST®Havajsk\u00fd standardn\u00ed \u010das®HST®Havajsk\u00fd standardn\u00ed \u010das®©America/Denver®MST®Horsk\u00fd standardn\u00ed \u010das®MDT®Horsk\u00fd letn\u00ed \u010das®©America/Anchorage®AST®Alja\u0161sk\u00fd standardn\u00ed \u010das®ADT®Alja\u0161sk\u00fd letn\u00ed \u010das®©America/St_Johns®CNT®Newfoundlandsk\u00fd standardn\u00ed \u010das®CDT®Newfoundlandsk\u00fd letn\u00ed \u010das®©Africa/Casablanca®GMT®Greenwichsk\u00fd st\u0159edn\u00ed \u010das®GMT®Greenwichsk\u00fd st\u0159edn\u00ed \u010das®©America/Chicago®CST®Centr\u00e1ln\u00ed standardn\u00ed \u010das®CDT®Centr\u00e1ln\u00ed letn\u00ed \u010das®©Asia/Shanghai®CTT®\u010c\u00ednsk\u00fd standardn\u00ed \u010das®CDT®\u010c\u00ednsk\u00fd standardn\u00ed \u010das®©Asia/Tokyo®JST®Japonsk\u00fd standardn\u00ed \u010das®JST®Japonsk\u00fd standardn\u00ed \u010das®©America/New_York®EST®V\u00fdchodn\u00ed standardn\u00ed \u010das®EDT®V\u00fdchodn\u00ed letn\u00ed \u010das®©Europe/Bucharest®EET®V\u00fdchodoevropsk\u00fd standardn\u00ed \u010das®EEST®V\u00fdchodoevropsk\u00fd letn\u00ed \u010das®©America/Los_Angeles®PST®Pacifick\u00fd standardn\u00ed \u010das®PDT®Pacifick\u00fd letn\u00ed \u010das®©America/Phoenix®MST®Horsk\u00fd standardn\u00ed \u010das®MST®Horsk\u00fd standardn\u00ed \u010das®©Etc/GMT®GMT®Greenwichsk\u00fd st\u0159edn\u00ed \u010das®GMT®Greenwichsk\u00fd st\u0159edn\u00ed \u010das®©Asia/Jerusalem®IST®Izraelsk\u00fd standardn\u00ed \u010das®IDT®Izraelsk\u00fd letn\u00ed \u010das®©Europe/Paris®CET®St\u0159edoevropsk\u00fd standardn\u00ed \u010das®CEST®St\u0159edoevropsk\u00fd letn\u00ed \u010das®©
+longTimeFormat=H:mm:ssZZ
+fullTimeFormat=H:mm:ssZZ
+zoneStrings=Europe/Paris®CET®St\u0159edoevropsk\u00fd standardn\u00ed \u010das®CEST®St\u0159edoevropsk\u00fd letn\u00ed \u010das®©Pacific/Honolulu®HST®Havajsk\u00fd standardn\u00ed \u010das®HST®Havajsk\u00fd letn\u00ed \u010das®©America/Denver®MST®Horsk\u00fd standardn\u00ed \u010das®MDT®Horsk\u00fd letn\u00ed \u010das®©Asia/Jerusalem®IST®Izraelsk\u00fd standardn\u00ed \u010das®IDT®Izraelsk\u00fd letn\u00ed \u010das®©America/Anchorage®AST®Alja\u0161sk\u00fd standardn\u00ed \u010das®ADT®Alja\u0161sk\u00fd letn\u00ed \u010das®©Africa/Casablanca®GMT®Greenwichsk\u00fd st\u0159edn\u00ed \u010das®GMT®Greenwichsk\u00fd st\u0159edn\u00ed \u010das®©America/Phoenix®MST®Horsk\u00fd standardn\u00ed \u010das®MST®Horsk\u00fd letn\u00ed \u010das®©America/Los_Angeles®PST®Pacifick\u00fd standardn\u00ed \u010das®PDT®Pacifick\u00fd letn\u00ed \u010das®©America/Chicago®CST®Centr\u00e1ln\u00ed standardn\u00ed \u010das®CDT®Centr\u00e1ln\u00ed letn\u00ed \u010das®©America/Halifax®AST®Atlantick\u00fd standardn\u00ed \u010das®ADT®Atlantick\u00fd letn\u00ed \u010das®©America/New_York®EST®V\u00fdchodn\u00ed standardn\u00ed \u010das®EDT®V\u00fdchodn\u00ed letn\u00ed \u010das®©Asia/Tokyo®JST®Japonsk\u00fd standardn\u00ed \u010das®JST®Japonsk\u00fd letn\u00ed \u010das®©Europe/Bucharest®EET®V\u00fdchodoevropsk\u00fd standardn\u00ed \u010das®EEST®V\u00fdchodoevropsk\u00fd letn\u00ed \u010das®©America/Indianapolis®EST®V\u00fdchodn\u00ed standardn\u00ed \u010das®EST®V\u00fdchodn\u00ed letn\u00ed \u010das®©
territories.TL=V\u00fdchodn\u00ed Timor
territories.TK=Tokelau
territories.TJ=T\u00e1d\u017eikist\u00e1n
@@ -762,7 +388,9 @@ territories.GN=Guinea
territories.GM=Gambie
territories.GL=Gr\u00f3nsko
territories.SV=El Salvador
+territories.062=Ji\u017en\u00ed a centr\u00e1ln\u00ed Asie
territories.ST=Svat\u00fd Tom\u00e1\u0161
+territories.061=Polyn\u00e9sie
territories.GI=Gibraltar
territories.GH=Ghana
territories.SR=Surinam
@@ -786,9 +414,12 @@ territories.SC=Seychely
territories.SB=\u0160alamounovy ostrovy
territories.SA=Sa\u00fadsk\u00e1 Ar\u00e1bie
territories.FR=Francie
+territories.057=Mikron\u00e9sie
territories.FO=Faersk\u00e9 ostrovy
territories.FM=Mikron\u00e9sie, federativn\u00ed st\u00e1t
territories.RW=Rwanda
+territories.054=Melan\u00e9sie
+territories.053=Austr\u00e1lie a Nov\u00fd Z\u00e9land
territories.FK=Falklandsk\u00e9 ostrovy
territories.RU=Rusko
territories.FJ=Fid\u017ei
@@ -798,20 +429,26 @@ territories.RE=R\u00e9union
territories.ET=Etiopie
territories.ES=\u0160pan\u011blsko
territories.ER=Eritrea
+territories.833=Ostrov Man
territories.EH=Z\u00e1padn\u00ed Sahara
territories.EG=Egypt
+territories.830=Normansk\u00e9 ostrovy
territories.EE=Estonsko
+territories.QO=Vn\u011bj\u0161\u00ed Oce\u00e1nie
territories.EC=Ekv\u00e1dor
territories.DZ=Al\u017e\u00edrsko
territories.QA=Katar
+territories.039=Ji\u017en\u00ed Evropa
territories.DO=Dominik\u00e1nsk\u00e1 republika
territories.PY=Paraguay
+territories.035=Jihov\u00fdchodn\u00ed Asie
territories.DM=Dominika
territories.PW=Palau
territories.DK=D\u00e1nsko
territories.DJ=D\u017eibuti
territories.PT=Portugalsko
territories.PS=Palestinian Territory
+territories.030=V\u00fdchodn\u00ed Asie
territories.PR=Portoriko
territories.DE=N\u011bmecko
territories.PN=Pitcairn
@@ -828,13 +465,16 @@ territories.CX=V\u00e1no\u010dn\u00ed ostrovy
territories.CV=Kapverdy
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Srbsko a \u010cern\u00e1 Hora
territories.CR=Kostarika
+territories.029=Karibik
territories.CO=Kolumbie
territories.CN=\u010c\u00edna
territories.CM=Kamerun
territories.CL=Chile
territories.CK=Cookovy ostrovy
territories.CI=Pob\u0159e\u017e\u00ed slonoviny
+territories.021=Severn\u00ed Amerika
territories.CH=\u0160v\u00fdcarsko
territories.CG=Kongo
territories.CF=St\u0159edoafrick\u00e1 republika
@@ -849,13 +489,20 @@ territories.BV=Ostrov Bouvet
territories.BT=Bh\u00fat\u00e1n
territories.BS=Bahamy
territories.BR=Braz\u00edlie
+territories.019=Amerika
+territories.018=Ji\u017en\u00ed Afrika
territories.NZ=Nov\u00fd Z\u00e9land
territories.BO=Bol\u00edvie
+territories.017=St\u0159edn\u00ed Afrika
territories.BN=Brunej Darussalam
territories.BM=Bermudy
+territories.015=Severn\u00ed Afrika
+territories.014=V\u00fdchodn\u00ed Afrika
+territories.013=St\u0159edn\u00ed Amerika
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Z\u00e1padn\u00ed Afrika
territories.BH=Bahrajn
territories.NR=Nauru
territories.BG=Bulharsko
@@ -873,6 +520,7 @@ territories.NG=Nig\u00e9rie
territories.NF=Norfolk
territories.AZ=\u00c1zerb\u00e1jd\u017e\u00e1n
territories.NE=Niger
+territories.AX=Alandy
territories.NC=Nov\u00e1 Kaledonie
territories.AW=Aruba
territories.ZM=Zambie
@@ -881,19 +529,24 @@ territories.AU=Austr\u00e1lie
territories.AT=Rakousko
territories.AS=Americk\u00e1 Samoa
territories.AR=Argentina
+territories.009=Oce\u00e1nie
territories.AQ=Antarktida
territories.MZ=Mosambik
+territories.200=\u010ceskoslovensko
territories.AO=Angola
territories.MY=Malajsie
territories.AN=Nizozemsk\u00e9 Antily
territories.MX=Mexiko
+territories.005=Ji\u017en\u00ed Amerika
territories.AM=Arm\u00e9nie
territories.MW=Malawi
territories.AL=Alb\u00e1nie
territories.MV=Maladivy
territories.ZA=Ji\u017en\u00ed Afrika
territories.MU=Mauricius
+territories.002=Afrika
territories.MT=Malta
+territories.001=Sv\u011bt
territories.AI=Anguila
territories.MS=Montserrat
territories.MR=Maurit\u00e1nie
@@ -908,7 +561,6 @@ territories.MN=Mongolsko
territories.MM=Myanmar (Burma)
territories.ML=Mali
territories.MK=Macedonia
-territories.YU=Jugosl\u00e1vie
territories.YT=Mayotte
territories.MH=Marshallovy ostrovy
territories.MG=Madagaskar
@@ -918,10 +570,14 @@ territories.MA=Maroko
territories.YE=Jemen
territories.LY=Libye
territories.LV=Loty\u0161sko
+territories.155=Z\u00e1padn\u00ed Evropa
territories.LU=Lucembursko
+territories.154=Severn\u00ed Evropa
territories.LT=Litva
territories.LS=Lesotho
territories.LR=Lib\u00e9rie
+territories.151=V\u00fdchodn\u00ed Evropa
+territories.150=Evropa
territories.LK=Sr\u00ed Lanka
territories.LI=Lichten\u0161tejnsko
territories.LC=Svat\u00e1 Lucie
@@ -930,6 +586,8 @@ territories.LA=Lidov\u011b demokratick\u00e1 republika Laos
territories.KZ=Kazachst\u00e1n
territories.KY=Kajmansk\u00e9 ostrovy
territories.KW=Kuvajt
+territories.145=Z\u00e1padn\u00ed Asie
+territories.142=Asie
territories.KR=Ji\u017en\u00ed Korea
territories.KP=Severn\u00ed Korea
territories.KN=Svat\u00fd Kitts a Nevis
@@ -982,8 +640,8 @@ territories.TM=Turkmenist\u00e1n
languages.es=\u0160pan\u011bl\u0161tina
languages.ku=Kurd\u0161tina
languages.eo=Esperanto
-languages.ks=Ka\u0161m\u00edr\u0161tina
languages.en=Angli\u010dtina
+languages.ks=Ka\u0161m\u00edr\u0161tina
languages.el=\u0158e\u010dtina
languages.qu=Ke\u010du\u00e1n\u0161tina
languages.ko=Korej\u0161tina
@@ -1007,8 +665,8 @@ languages.cy=Vel\u0161tina
languages.pa=Pa\u0148d\u017e\u00e1b\u0161tina
languages.cs=\u010ce\u0161tina
languages.iu=Inuktitut\u0161tina
-languages.it=Ital\u0161tina
languages.co=Korsi\u010dtina
+languages.it=Ital\u0161tina
languages.is=Island\u0161tina
languages.uz=Uzbe\u010dtina
languages.or=Oriya
@@ -1084,8 +742,8 @@ languages.mk=Makedon\u0161tina
languages.aa=Afar\u0161tina
languages.so=Som\u00e1l\u0161tina
languages.sn=Shona
-languages.mi=Maor\u0161tina
languages.gd=Skotsk\u00e1 gal\u0161tina
+languages.mi=Maor\u0161tina
languages.sm=Samoy\u0161tina
languages.sl=Slovin\u0161tina
languages.mg=Malga\u0161tina
@@ -1101,14 +759,14 @@ languages.fy=Fr\u00ed\u0161tina
languages.sa=Sanskrt
languages.fr=Francouz\u0161tina
languages.lv=Loty\u0161tina
-languages.lt=Litev\u0161tina
languages.fo=Faer\u0161tina
+languages.lt=Litev\u0161tina
languages.rw=Kinyarwand\u0161tina
languages.ru=Ru\u0161tina
-languages.lo=Lao\u0161tina
languages.fj=Fid\u017ei
-languages.ln=Lingal\u0161tina
+languages.lo=Lao\u0161tina
languages.fi=Fin\u0161tina
+languages.ln=Lingal\u0161tina
languages.ro=Rumun\u0161tina
languages.rn=Kirundi
languages.rm=R\u00e9torom\u00e1n\u0161tina
@@ -1116,5 +774,5 @@ languages.fa=Per\u0161tina
languages.la=Latina
languages.xh=Xhosa
languages.eu=Baski\u010dtina
-languages.ky=Kirgiz\u0161tina
languages.et=Eston\u0161tina
+languages.ky=Kirgiz\u0161tina
diff --git a/resource/gnu/java/locale/LocaleInformation_cy.properties b/resource/gnu/java/locale/LocaleInformation_cy.properties
index bd9484616..612de13b3 100644
--- a/resource/gnu/java/locale/LocaleInformation_cy.properties
+++ b/resource/gnu/java/locale/LocaleInformation_cy.properties
@@ -13,24 +13,286 @@ currenciesDisplayName.EUR=Ewro
currenciesDisplayName.GBP=Punt Sterling Prydain
currenciesDisplayName.BRL=Real Brasil
currenciesDisplayName.USD=Doler yr UDA
+currenciesSymbol.EUR=EUR
shortMonths=Ion®Chwef®Mawrth®Ebrill®Mai®Meh®Gorff®Awst®Medi®Hyd®Tach®Rhag®®
months=Ionawr®Chwefror®Mawrth®Ebrill®Mai®Mehefin®Gorffenaf®Awst®Medi®Hydref®Tachwedd®Rhagfyr®®
shortWeekdays=®Sul®Llun®Maw®Mer®Iau®Gwen®Sad®
weekdays=®Dydd Sul®Dydd Llun®Dydd Mawrth®Dydd Mercher®Dydd Iau®Dydd Gwener®Dydd Sadwrn®
+territories.TL=Timor-Leste
+territories.TK=Tokelau
+territories.TJ=Tajicistan
+territories.TH=Gwlad Thai
+territories.TG=Togo
+territories.TF=Tiriogaethau Ffrengig y De
+territories.GY=Guyana
+territories.TD=Chad
+territories.TC=Ynysoedd Turks a Caicos
+territories.GW=Guinea-Bissau
+territories.GU=Guam
+territories.GT=Guatemala
+territories.GS=Ynysoedd De Georgia a De Sandwich
+territories.GR=Gwlad Groeg
+territories.GQ=Gini Gyhydeddol
+territories.GP=Guadeloupe
+territories.SZ=Swaziland
+territories.SY=Syria
+territories.GN=Gini
+territories.GM=Gambia
+territories.GL=Yr Ynys Las
+territories.SV=El Salfador
+territories.062=De Canol Asia
+territories.ST=Sao Tome a Principe
+territories.061=Polynesia
+territories.GI=Gibraltar
+territories.GH=Ghana
+territories.SR=Swrinam
+territories.GF=Giana Ffrengig
+territories.GE=Georgia
+territories.SO=Somalia
+territories.GD=Grenada
+territories.SN=Senegal
+territories.SM=San Marino
+territories.GB=Prydain Fawr
+territories.SL=Sierra Leone
+territories.GA=Gabon
+territories.SK=Slofacia
+territories.SJ=Svalbard a Jan Mayen
+territories.SI=Slofenia
+territories.SH=Saint Helena
+territories.SG=Singapore
+territories.SE=Sweden
+territories.SD=Y Swdan
+territories.SC=Seychelles
+territories.SB=Ynysoedd Solomon
+territories.SA=Sawdi-Arabia
territories.FR=Ffrainc
-territories.IN=India
-territories.CN=Tseina
+territories.057=Micronesia
+territories.FO=Ynysoedd Ffar\u00f6e
+territories.FM=Micronesia
+territories.RW=Rwanda
+territories.054=Melanesia
+territories.053=Awstralia a Seland Newydd
+territories.FK=Ynysoedd y Falkland
+territories.RU=Rwsia
+territories.FJ=Fiji
+territories.FI=Y Ffindir
+territories.RO=Rwmania
+territories.RE=R\u00e9union
+territories.ET=Ethiopia
+territories.ES=Sbaen
+territories.ER=Eritrea
+territories.833=Ynys Manaw
+territories.EH=Gorllewin Sahara
+territories.EG=Yr Aifft
+territories.830=Ynysoedd y Sianel
+territories.EE=Estonia
+territories.QO=Ynysoedd Pellenig y De
+territories.EC=Ecwador
+territories.DZ=Algeria
+territories.QA=Qatar
+territories.039=De Ewrop
+territories.DO=Y Weriniaeth Ddominicaidd
+territories.PY=Paraguay
+territories.035=De ddwyrain Asia
+territories.DM=Dominica
+territories.PW=Palau
+territories.DK=Denmarc
+territories.DJ=Djibouti
+territories.PT=Portiwgal
+territories.PS=Tiriogaeth Palesteina
+territories.030=Dwyrain Asia
+territories.PR=Puerto Rico
territories.DE=Yr Almaen
-territories.GB=Prydain Fawr
+territories.PN=Pitcairn
+territories.PM=Saint Pierre a Miquelon
+territories.PL=Gwlad Pwyl
+territories.PK=Pacistan
+territories.PH=Philipinau
+territories.PG=Papua Gini Newydd
+territories.PF=Polynesia Ffrainc
+territories.CZ=Gweriniaeth Tsiec
+territories.PE=Perw
+territories.CY=Cyprus
+territories.CX=Ynys y Nadolig
+territories.CV=Cape Verde
+territories.PA=Panama
+territories.CU=Ciwba
+territories.CR=Costa Rica
+territories.029=Y Carib\u00ee
+territories.CO=Colombia
+territories.CN=Tseina
+territories.CM=Y Camer\u0175n
+territories.CL=Chile
+territories.CK=Ynysoedd Cook
+territories.CI=C\u00f4te d\u2019Ivoire
+territories.021=Gogledd America
+territories.CH=Y Swistir
+territories.CG=Congo
+territories.CF=Gweriniaeth Canol Affrica
+territories.CD=Gweriniaeth Ddemocrataidd y Congo
+territories.CC=Ynysoedd Cocos (Keeling)
+territories.OM=Oman
+territories.CA=Canada
+territories.BZ=Belize
+territories.BY=Belarws
+territories.BW=Botswana
+territories.BV=Ynys Bouvet
+territories.BT=Bhwtan
+territories.BS=Y Bahamas
territories.BR=Brasil
-territories.RU=Rwsia
+territories.019=Americas
+territories.018=De Affrica
+territories.NZ=Seland Newydd
+territories.BO=Bolifia
+territories.017=Canol Affrica
+territories.BN=Brunei
+territories.BM=Bermwda
+territories.015=Gogledd Affrica
+territories.014=Dwyrain Affrica
+territories.013=Canolbarth America
+territories.NU=Niue
+territories.BJ=Benin
+territories.BI=Burundi
+territories.011=Gorllewin Affrica
+territories.BH=Bahrain
+territories.NR=Nawrw
+territories.BG=Bwlgaria
+territories.BF=Burkina Faso
+territories.NP=Nepal
+territories.BE=Gwlad Belg
+territories.NO=Norwy
+territories.BD=Bangladesh
+territories.BB=Barbados
+territories.ZW=Simbabwe
+territories.NL=Yr Iseldiroedd
+territories.BA=Bosnia a Herzegovina
+territories.NI=Nicaragwa
+territories.NG=Nigeria
+territories.NF=Ynys Norfolk
+territories.AZ=Azerbaijan
+territories.NE=Niger
+territories.AX=Ynysoedd Aland
+territories.NC=Caledonia Newydd
+territories.AW=Aruba
+territories.ZM=Sambia
+territories.NA=Namibia
+territories.AU=Awstralia
+territories.AT=Awstria
+territories.AS=Samoa Americanaidd
+territories.AR=Yr Ariannin
+territories.009=Oceania
+territories.AQ=Antarctica
+territories.MZ=Mozambique
+territories.AO=Angola
+territories.MY=Malaysia
+territories.AN=Ynysoedd Carib\u00ee yr Iseldiroedd
+territories.MX=Mecsico
+territories.005=De America
+territories.AM=Armenia
+territories.MW=Malawi
+territories.AL=Albania
+territories.MV=Maldives
+territories.ZA=De Affrica
+territories.MU=Mawrisiws
+territories.002=Affrica
+territories.MT=Malta
+territories.001=Y Byd
+territories.AI=Anguilla
+territories.MS=Montserrat
+territories.MR=Mawritania
+territories.AG=Antigwa a Barbuda
+territories.MQ=Martinique
+territories.AF=Affganistan
+territories.MP=Ynysoedd Gogledd Mariana
+territories.AE=Emiraethau Arabaidd Unedig
+territories.MO=Macao S.A.R., Tseina
+territories.AD=Andorra
+territories.MN=Mongolia
+territories.MM=Myanmar
+territories.ML=Mali
+territories.MK=Macedonia
+territories.YT=Mayotte
+territories.MH=Ynysoedd Marshall
+territories.MG=Madagascar
+territories.MD=Moldofa
+territories.MC=Monaco
+territories.MA=Moroco
+territories.YE=Yemen
+territories.LY=Libia
+territories.LV=Latfia
+territories.155=Gorllewin Ewrop
+territories.LU=Lwcsembwrg
+territories.154=Gogledd Ewrop
+territories.LT=Lithwania
+territories.LS=Lesotho
+territories.LR=Liberia
+territories.151=Dwyrain Ewrop
+territories.150=Ewrop
+territories.LK=Sri Lanka
+territories.LI=Liechtenstein
+territories.LC=Saint Lucia
+territories.LB=Libanus
+territories.LA=Laos
+territories.KZ=Kazakhstan
+territories.KY=Ynysoedd Cayman
+territories.KW=Coweit
+territories.145=Gorllewin Asia
+territories.142=Asia
+territories.KR=De Corea
+territories.KP=Gogledd Corea
+territories.KN=Saint Kitts a Nevis
+territories.KM=Comoros
+territories.KI=Kiribati
+territories.WS=Samoa
+territories.KH=Cambodia
+territories.KG=Cirgistan
+territories.KE=Cenia
+territories.WF=Wallis a Futuna
territories.JP=Siapan
-territories.US=Yr Unol Daleithiau
+territories.JO=Yr Iorddonen
+territories.JM=Jamaica
+territories.VU=Vanuatu
+territories.VN=Fietnam
+territories.VI=Ynysoedd Americanaidd y Wyryf
+territories.VG=Ynysoedd Prydeinig y Wyryf
+territories.VE=Venezuela
+territories.VC=Saint Vincent a\u2019r Grenadines
+territories.VA=Y Fatican
territories.IT=Yr Eidal
+territories.IS=Gwlad yr I\u00e2
+territories.IR=Iran
+territories.IQ=Irac
+territories.UZ=Wsbecistan
+territories.IO=Tiriogaeth Cefnfor India Prydain
+territories.UY=Uruguay
+territories.IN=India
+territories.IL=Israel
+territories.US=Yr Unol Daleithiau
+territories.IE=Iwerddon
+territories.ID=Indonesia
+territories.UM=M\u00e2n Ynysoedd Pellenig yr Unol Daleithiau
+territories.UG=Uganda
+territories.UA=Wcr\u00e1in
+territories.HU=Hwngari
+territories.HT=Haiti
+territories.HR=Croatia
+territories.TZ=Tansan\u00efa
+territories.HN=Hondwras
+territories.HM=Ynys Heard ac Ynysoedd McDonald
+territories.TW=Taiwan
+territories.TV=Twfalw
+territories.HK=Hong Kong S.A.R., Tseina
+territories.TT=Trinidad a Thobago
+territories.TR=Twrci
+territories.TO=Tonga
+territories.TN=Tiwnisia
+territories.TM=Tyrcmenistan
languages.zh=Tseineeg
languages.en=Saesneg
languages.ru=Rwsieg
+languages.hi=Hindi
languages.cy=Cymraeg
+languages.ar=Arabeg
languages.it=Eidaleg
languages.fr=Ffrangeg
languages.de=Almaeneg
diff --git a/resource/gnu/java/locale/LocaleInformation_da.properties b/resource/gnu/java/locale/LocaleInformation_da.properties
index d4043c325..10efddee2 100644
--- a/resource/gnu/java/locale/LocaleInformation_da.properties
+++ b/resource/gnu/java/locale/LocaleInformation_da.properties
@@ -8,693 +8,334 @@
decimalSeparator=,
groupingSeparator=.
localPatternChars=GuMtkHmsSEDFwWahKzUeygAZ
-currenciesDisplayName.JOD=Jordansk dinar
-currenciesDisplayName.BOV=Boliviansk mvdol
-currenciesDisplayName.XAU=Guld
-currenciesDisplayName.FOK=F\u00e6r\u00f8sk krone
-currenciesDisplayName.LBP=Libanesisk pund
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Vietnamesisk dong
-currenciesDisplayName.TZS=Tanzanisk shilling
-currenciesDisplayName.BOP=Boliviansk peso
-currenciesDisplayName.KHR=Cambodjansk riel
-currenciesDisplayName.KHO=Gammel cambodjansk riel
-currenciesDisplayName.ZMP=Zambisk pund
-currenciesDisplayName.AUP=Australsk pund
-currenciesDisplayName.XAF=Beninsk CFA-franc
-currenciesDisplayName.MTP=Maltesisk pund
-currenciesDisplayName.GHR=Ghanesisk revalueret cedi
-currenciesDisplayName.ZMK=Zambisk kwacha
-currenciesDisplayName.GHP=Ghanesisk pund
-currenciesDisplayName.GHO=Gammel ghanesisk cedi
-currenciesDisplayName.MTL=Maltesisk lira
-currenciesDisplayName.AUD=Australsk dollar
-currenciesDisplayName.USS=Amerikansk dollar (samme dag)
-currenciesDisplayName.ITL=Italiensk lira
-currenciesDisplayName.USN=Amerikansk dollar (n\u00e6ste dag)
-currenciesDisplayName.GHC=Ghanesisk cedi
-currenciesDisplayName.SGD=Singaporeansk dollar
-currenciesDisplayName.PAB=Panamansk balboa
-currenciesDisplayName.LAK=Laotisk kip
-currenciesDisplayName.KGS=Kirgisisk som
-currenciesDisplayName.CHF=Schweizisk franc
-currenciesDisplayName.ATS=\u00d8strigsk schilling
-currenciesDisplayName.USD=Amerikanske dollar
-currenciesDisplayName.ETD=Etiopisk dollar
-currenciesDisplayName.BND=Bruneisk dollar
-currenciesDisplayName.JMP=Jamaicansk pund
-currenciesDisplayName.ETB=Etiopisk birr
-currenciesDisplayName.DZG=Algerisk franc germinal
-currenciesDisplayName.DZF=Ny algerisk franc
-currenciesDisplayName.DZD=Algerisk dinar
-currenciesDisplayName.PYG=Paraguaysk guarani
-currenciesDisplayName.LYP=Libysk pund
-currenciesDisplayName.JMD=Jamaicansk dollar
-currenciesDisplayName.ISK=Islandsk krona
-currenciesDisplayName.ESP=Spansk peseta
-currenciesDisplayName.BMP=Bermudansk pund
-currenciesDisplayName.LYD=Libysk dinar
-currenciesDisplayName.BMD=Bermudansk dollar
-currenciesDisplayName.NLG=Hollandsk guilder
-currenciesDisplayName.MRO=Mauritansk ouguiya
-currenciesDisplayName.IRR=Iransk rial
-currenciesDisplayName.SEK=Svensk krona
-currenciesDisplayName.ERN=Eritreisk nakfa
+currenciesDisplayName.YDD=Yemenitisk dinar
+currenciesDisplayName.TWD=Ny taiwansk dollar
currenciesDisplayName.KES=Kenyansk shilling
-currenciesDisplayName.CFF=CFA-franc fra den Centralafrikanske republik
+currenciesDisplayName.BYB=Ny hviderussisk rubel (1994-1999)
+currenciesDisplayName.LKR=Srilankansk rupee
+currenciesDisplayName.RWF=Rwandisk franc
+currenciesDisplayName.TJS=Tadsjikisk somoni
+currenciesDisplayName.SDP=Sudansk pund
+currenciesDisplayName.TJR=Tadsjikisk rubel
+currenciesDisplayName.ERN=Eritreisk nakfa
+currenciesDisplayName.GRD=Gr\u00e6sk drachma
+currenciesDisplayName.IEP=Irsk pund
currenciesDisplayName.ARS=Argentinsk peso
+currenciesDisplayName.SDD=Sudansk dinar
currenciesDisplayName.ARP=Argentinsk peso (1983-1985)
-currenciesDisplayName.ARM=Argentinsk peso moneda nacional
-currenciesDisplayName.TWD=Ny taiwansk dollar
-currenciesDisplayName.SDP=Sudansk pund
currenciesDisplayName.GEL=Georgisk lari
currenciesDisplayName.GEK=Georgisk kupon larit
-currenciesDisplayName.MQF=Martiniquisk franc
+currenciesDisplayName.CRC=Costaricansk colon
currenciesDisplayName.FKP=Pund fra Falklands\u00f8erne
+currenciesDisplayName.EEK=Estisk kroon
+currenciesDisplayName.MDL=Moldovisk leu
currenciesDisplayName.ARA=Argentinsk austral
-currenciesDisplayName.SDD=Sudansk dinar
currenciesDisplayName.IQD=Irakisk dinar
-currenciesDisplayName.TVD=Tuvaluansk dollar
currenciesDisplayName.SCR=Seychellisk rupee
+currenciesDisplayName.VUV=Vanuaisk vatu
+currenciesDisplayName.DKK=Dansk krone
+currenciesDisplayName.KPW=Nordkoreansk won
+currenciesDisplayName.GQE=\u00c6kvatorialguineask ekwele guineana
+currenciesDisplayName.IDR=Indonesisk pupiah
currenciesDisplayName.LVR=Lettisk rubel
-currenciesDisplayName.FJP=Fijiansk pund
+currenciesDisplayName.SOS=Somalisk shilling
+currenciesDisplayName.AED=Dirham fra de Forenede Arabiske Emirater
+currenciesDisplayName.BWP=Botswansk pula
currenciesDisplayName.LVL=Lettisk lats
-currenciesDisplayName.CDL=Congolesisk Zaire
-currenciesDisplayName.CDG=Congolesisk franc
-currenciesDisplayName.CDF=Congolesisk franc congolais
-currenciesDisplayName.FJD=Fijiansk dollar
+currenciesDisplayName.RUR=Russisk rubel (1991-1998)
currenciesDisplayName.NIO=Nicaraguansk cordoba oro
+currenciesDisplayName.ADP=Andorransk peseta
+currenciesDisplayName.FJD=Fijiansk dollar
currenciesDisplayName.MOP=Macaosk pataca
-currenciesDisplayName.NIG=Nicaraguansk gold cordoba
+currenciesDisplayName.RUB=Russisk rubel
+currenciesDisplayName.CDF=Congolesisk franc congolais
currenciesDisplayName.NIC=Nicaraguansk cordoba
-currenciesDisplayName.FIN=Finsk mark (1860-1962)
-currenciesDisplayName.FIM=Finsk mark
+currenciesDisplayName.DJF=Djiboutisk franc
currenciesDisplayName.SBD=Salomonsk dollar
+currenciesDisplayName.UZS=Usbekisk sum
+currenciesDisplayName.ECS=Ecuadoriansk sucre
+currenciesDisplayName.PHP=Filippinsk peso
+currenciesDisplayName.THB=Thailandsk baht
currenciesDisplayName.LUF=Luxembourgsk franc
-currenciesDisplayName.TTO=Gammel dollar fra Trinidad og Tobago
-currenciesDisplayName.AOS=Angolansk escudo
-currenciesDisplayName.AOR=Angolansk kwanza reajustado (1995-1999)
-currenciesDisplayName.MNT=Mongolsk tugrik
-currenciesDisplayName.HUF=Ungarsk forint
-currenciesDisplayName.BIF=Burundisk franc
-currenciesDisplayName.AON=Ny angolansk kwanza (1990-2000)
-currenciesDisplayName.AOK=Angolansk kwanza (1977-1990)
+currenciesDisplayName.FIM=Finsk mark
currenciesDisplayName.TTD=Dollar fra Trinidad og Tobago
currenciesDisplayName.SZL=Swazilandsk lilangeni
-currenciesDisplayName.NHF=CFP-franc fra Ny-Hebriderne
-currenciesDisplayName.GBP=Britisk pund
-currenciesDisplayName.SAS=Saudisk sovereign riyal
+currenciesDisplayName.MNT=Mongolsk tugrik
currenciesDisplayName.SAR=Saudisk riyal
+currenciesDisplayName.UAK=Ukrainsk karbovanetz
+currenciesDisplayName.UAH=Ukrainsk grynia
+currenciesDisplayName.HUF=Ungarsk forint
+currenciesDisplayName.COP=Colombiansk peso
+currenciesDisplayName.QAR=Qatarsk rial
currenciesDisplayName.LTT=Litauisk talonas
-currenciesDisplayName.INR=Indisk rupee
currenciesDisplayName.PTE=Portugisisk escudo
-currenciesDisplayName.AOA=Angolansk kwanza
-currenciesDisplayName.PTC=Portugisisk conto
+currenciesDisplayName.AOR=Angolansk kwanza reajustado (1995-1999)
+currenciesDisplayName.UYU=Uruguaysk peso uruguayo
+currenciesDisplayName.GBP=Britisk pund
+currenciesDisplayName.BIF=Burundisk franc
+currenciesDisplayName.INR=Indisk rupee
+currenciesDisplayName.ZRZ=Zairisk naire
+currenciesDisplayName.AON=Ny angolansk kwanza (1990-2000)
currenciesDisplayName.LTL=Litauisk lita
+currenciesDisplayName.XFU=Fransk UIC-franc
currenciesDisplayName.KZT=Kasakhisk tenge
-currenciesDisplayName.KZR=Kasakhisk rubel
-currenciesDisplayName.VGD=Dollar fra De Britiske Jomfru\u00f8er
-currenciesDisplayName.NGP=Nigeriansk pund
+currenciesDisplayName.MZM=Mozambiquisk metical
+currenciesDisplayName.UYP=Uruguaysk peso (1975-1993)
+currenciesDisplayName.AOK=Angolansk kwanza (1977-1990)
+currenciesDisplayName.BUK=Burmesisk kyat
+currenciesDisplayName.GNS=Guineansk syli
+currenciesDisplayName.XFO=Fransk guldfranc
+currenciesDisplayName.PGK=Papuansk kina
+currenciesDisplayName.SYP=Syrisk pund
+currenciesDisplayName.MZE=Mozambiquisk escudo
+currenciesDisplayName.OMR=Omansk rial
currenciesDisplayName.NGN=Nigeriansk naira
+currenciesDisplayName.ZRN=Ny zairisk zaire
+currenciesDisplayName.AOA=Angolansk kwanza
+currenciesDisplayName.CNY=Kinesisk yuan renminbi
+currenciesDisplayName.MAF=Marokkansk franc
+currenciesDisplayName.GNF=Guineansk franc
currenciesDisplayName.HTG=Haitisk gourde
-currenciesDisplayName.SYP=Syrisk pund
-currenciesDisplayName.PSP=Pal\u00e6stinensisk pund
-currenciesDisplayName.BHD=Bahrainsk dinar
+currenciesDisplayName.MAD=Marokkansk dirham
+currenciesDisplayName.TRY=Ny tyrkisk lira
currenciesDisplayName.MMK=Myanmarsk kyat
+currenciesDisplayName.MYR=Malaysisk ringgit
+currenciesDisplayName.LSL=Lesothisk loti
+currenciesDisplayName.BHD=Bahrainsk dinar
+currenciesDisplayName.SLL=Sierraleonsk leone
+currenciesDisplayName.BTN=Bhutansk ngultrum
+currenciesDisplayName.TRL=Tyrkisk lira
+currenciesDisplayName.KMF=Comorisk franc
currenciesDisplayName.ANG=Gylden fra De Nederlandske Antiller
currenciesDisplayName.CZK=Tjekkisk koruna
-currenciesDisplayName.LSL=Lesothisk loti
-currenciesDisplayName.GAF=Gabonesisk CFA-franc
-currenciesDisplayName.BGO=Bulgarsk lev (1879-1952)
+currenciesDisplayName.AZM=Aserbajdsjansk manat
+currenciesDisplayName.KYD=Dollar fra Cayman\u00f8erne
+currenciesDisplayName.GMD=Gambisk dalasi
currenciesDisplayName.BGN=Ny Bulgarsk lev
-currenciesDisplayName.BGM=Bulgarsk socialist lev
currenciesDisplayName.CAD=Canadisk dollar
currenciesDisplayName.BGL=Bulgarsk hard lev
-currenciesDisplayName.TRL=Tyrkisk lira
-currenciesDisplayName.KYD=Dollar fra Cayman\u00f8erne
-currenciesDisplayName.CYP=Cypriotisk pund
+currenciesDisplayName.VEB=Venezuelansk bolivar
+currenciesDisplayName.MLF=Malisk franc
currenciesDisplayName.ILS=Ny israelsk shekel
+currenciesDisplayName.MXP=Mexicansk silver peso (1861-1992)
+currenciesDisplayName.PES=Peruviansk sol
currenciesDisplayName.GYD=Guyansk dollar
-currenciesDisplayName.AMD=Armensk dram
+currenciesDisplayName.MXN=Mexicansk peso
currenciesDisplayName.ILP=Israelsk pund
-currenciesDisplayName.MLF=Malisk franc
-currenciesDisplayName.ILL=Israelsk shekel
-currenciesDisplayName.VEB=Venezuelansk bolivar
+currenciesDisplayName.SKK=Slovakisk koruna
+currenciesDisplayName.CYP=Cypriotisk pund
+currenciesDisplayName.PEN=Peruviansk sol nuevo
currenciesDisplayName.LRD=Liberisk dollar
-currenciesDisplayName.ALV=Albansk lek
+currenciesDisplayName.PEI=Peruviansk inti
+currenciesDisplayName.AMD=Armensk dram
+currenciesDisplayName.BSD=Bahamansk dollar
currenciesDisplayName.HRK=Kroatisk kuna
+currenciesDisplayName.CLP=Chilensk peso
currenciesDisplayName.HRD=Kroatisk dinar
-currenciesDisplayName.ALL=Albansk lek
-currenciesDisplayName.JEP=Pund fra Jersey
-currenciesDisplayName.ALK=Albansk lek (1946-1961)
-currenciesDisplayName.MKN=Makedonsk denar (1992-1993)
-currenciesDisplayName.VDP=Nordvietnamesisk viet minh piastre dong viet
-currenciesDisplayName.VDN=Ny nordvietnamesisk dong
-currenciesDisplayName.MKD=Makedonsk denar
-currenciesDisplayName.VDD=Nordvietnamesisk piastre dong viet
-currenciesDisplayName.TPP=Pataca fra Timor
currenciesDisplayName.XPF=CFP-franc
-currenciesDisplayName.BEL=Belgisk franc (financial)
-currenciesDisplayName.GWP=Guineansk peso
-currenciesDisplayName.KWD=Kuwaitisk dinar
-currenciesDisplayName.GWM=Portugisisk guinea mil reis
-currenciesDisplayName.BEF=Belgisk franc
+currenciesDisplayName.FRF=Fransk franc
+currenciesDisplayName.BRR=Brasiliansk cruzeiro
+currenciesDisplayName.MKD=Makedonsk denar
+currenciesDisplayName.CLF=Chilensk unidades de fomento
+currenciesDisplayName.ALL=Albansk lek
+currenciesDisplayName.BRN=Brasiliansk cruzado novo
+currenciesDisplayName.MWK=Malawisk kwacha
+currenciesDisplayName.BRL=Brasiliansk real
currenciesDisplayName.TPE=Escudo fra Timor
-currenciesDisplayName.BEC=Belgisk franc (konvertibel)
-currenciesDisplayName.GWE=Portugisisk guinea escudo
+currenciesDisplayName.BRE=Brasiliansk cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Brasiliansk cruzado
+currenciesDisplayName.BRB=Brasiliansk cruzeiro novo (1967-1986)
+currenciesDisplayName.DEM=Tysk mark
+currenciesDisplayName.KWD=Kuwaitisk dinar
+currenciesDisplayName.XCD=\u00d8st-karaibisk dollar
+currenciesDisplayName.NPR=Nepalesisk rupee
+currenciesDisplayName.GWP=Guineansk peso
+currenciesDisplayName.YUN=Jugoslavisk convertible dinar
currenciesDisplayName.SVC=Salvadoransk colon
-currenciesDisplayName.CWG=Curacaosk gylden
-currenciesDisplayName.BDT=Bangladeshisk taka
-currenciesDisplayName.TOS=Tongask pund
+currenciesDisplayName.YUM=Jugoslavisk noviy dinar
+currenciesDisplayName.BEL=Belgisk franc (financial)
+currenciesDisplayName.SIT=Slovensk tolar
+currenciesDisplayName.JPY=Japansk yen
+currenciesDisplayName.MVR=Maldivisk rufiyaa
+currenciesDisplayName.GWE=Portugisisk guinea escudo
+currenciesDisplayName.BEF=Belgisk franc
currenciesDisplayName.TOP=Tongask pa\u02bbanga
+currenciesDisplayName.YUD=Jugoslavisk hard dinar
+currenciesDisplayName.BEC=Belgisk franc (konvertibel)
currenciesDisplayName.SUR=Sovjetisk rubel
-currenciesDisplayName.SUN=Ny sovjetisk rubel
-currenciesDisplayName.NCF=Nykaledonsk franc germinal
-currenciesDisplayName.CVE=Kapverdisk escudo
+currenciesDisplayName.ROL=Rum\u00e6nsk leu
+currenciesDisplayName.DDM=\u00d8sttysk mark
+currenciesDisplayName.BDT=Bangladeshisk taka
+currenciesDisplayName.AWG=Arubansk gylden
+currenciesDisplayName.NOK=Norsk krone
+currenciesDisplayName.MUR=Mauritisk rupee
currenciesDisplayName.ZAR=Sydafrikansk rand
-currenciesDisplayName.DOP=Dominikansk peso
-currenciesDisplayName.ZAP=Sydafrikansk pund
+currenciesDisplayName.SHP=Pund fra Saint Helena
+currenciesDisplayName.XAU=Guld
currenciesDisplayName.ZAL=Sydafrikansk rand (financial)
+currenciesDisplayName.VND=Vietnamesisk dong
+currenciesDisplayName.TZS=Tanzanisk shilling
+currenciesDisplayName.GIP=Gibraltarisk pund
currenciesDisplayName.TND=Tunesisk dinar
-currenciesDisplayName.CUP=Cubansk peso
-currenciesDisplayName.GUF=Fransk-guyansk franc guiana
+currenciesDisplayName.CVE=Kapverdisk escudo
currenciesDisplayName.UGX=Ugandisk shilling
-currenciesDisplayName.LNR=Ceylonesisk rupee
-currenciesDisplayName.AIF=Affars og Issas franc
-currenciesDisplayName.VAL=Vatikansk lira
-currenciesDisplayName.STE=Escudo fra Sao Tome og Principe
+currenciesDisplayName.ZMK=Zambisk kwacha
+currenciesDisplayName.JOD=Jordansk dinar
+currenciesDisplayName.XAF=Beninsk CFA-franc
+currenciesDisplayName.LBP=Libanesisk pund
currenciesDisplayName.UGS=Ugandisk shilling (1966-1987)
currenciesDisplayName.STD=Dobra fra Sao Tome og Principe
-currenciesDisplayName.MHD=Dollar fra Marshall\u00f8erne
-currenciesDisplayName.NZP=New Zealandsk pund
currenciesDisplayName.WST=Samoansk tala
-currenciesDisplayName.WSP=Samoansk pund
-currenciesDisplayName.HNL=Honduransk lempira
+currenciesDisplayName.KHR=Cambodjansk riel
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Dominikansk peso
+currenciesDisplayName.BOV=Boliviansk mvdol
+currenciesDisplayName.MTP=Maltesisk pund
+currenciesDisplayName.USS=Amerikansk dollar (samme dag)
+currenciesDisplayName.BOP=Boliviansk peso
+currenciesDisplayName.MTL=Maltesisk lira
+currenciesDisplayName.CUP=Cubansk peso
currenciesDisplayName.TMM=Turkmensk manat
-currenciesDisplayName.GTQ=Guatemalansk quetzal
+currenciesDisplayName.USN=Amerikansk dollar (n\u00e6ste dag)
+currenciesDisplayName.SGD=Singaporeansk dollar
currenciesDisplayName.NZD=New Zealandsk dollar
-currenciesDisplayName.SSP=Skotsk pund
-currenciesDisplayName.BBD=Barbadisk dollar
+currenciesDisplayName.USD=Amerikanske dollar
+currenciesDisplayName.HNL=Honduransk lempira
+currenciesDisplayName.ITL=Italiensk lira
+currenciesDisplayName.PAB=Panamansk balboa
+currenciesDisplayName.GTQ=Guatemalansk quetzal
+currenciesDisplayName.LAK=Laotisk kip
+currenciesDisplayName.GHC=Ghanesisk cedi
+currenciesDisplayName.AUD=Australsk dollar
currenciesDisplayName.NAD=Namibisk dollar
+currenciesDisplayName.KGS=Kirgisisk som
currenciesDisplayName.MGF=Madagaskisk franc
+currenciesDisplayName.CHF=Schweizisk franc
+currenciesDisplayName.BBD=Barbadisk dollar
currenciesDisplayName.MGA=Madagaskisk ariary
-currenciesDisplayName.EGP=Egyptisk pund
-currenciesDisplayName.BZH=Britisk Honduras dollar
+currenciesDisplayName.PYG=Paraguaysk guarani
currenciesDisplayName.PLZ=Polsk zloty (1950-1995)
-currenciesDisplayName.BAN=Ny bosnien-hercegovinsk dinar
-currenciesDisplayName.BAM=Bosnien-Hercegovinsk konvertibel mark
-currenciesDisplayName.BZD=Belizisk dollar
-currenciesDisplayName.BAD=Bosnien-Hercegovinsk dinar
-currenciesDisplayName.PLN=Polsk zloty
currenciesDisplayName.YER=Yemenitisk rial
+currenciesDisplayName.ATS=\u00d8strigsk schilling
+currenciesDisplayName.ETB=Etiopisk birr
+currenciesDisplayName.BND=Bruneisk dollar
+currenciesDisplayName.JMD=Jamaicansk dollar
+currenciesDisplayName.EGP=Egyptisk pund
+currenciesDisplayName.PLN=Polsk zloty
+currenciesDisplayName.DZD=Algerisk dinar
+currenciesDisplayName.ISK=Islandsk krona
currenciesDisplayName.SRG=Surinamsk guilder
-currenciesDisplayName.CSK=Tjekkoslovakisk hard koruna
+currenciesDisplayName.LYD=Libysk dinar
+currenciesDisplayName.BZD=Belizisk dollar
+currenciesDisplayName.BAM=Bosnien-Hercegovinsk konvertibel mark
+currenciesDisplayName.ESP=Spansk peseta
currenciesDisplayName.KRW=Sydkoreansk won
+currenciesDisplayName.NLG=Hollandsk guilder
+currenciesDisplayName.MRO=Mauritansk ouguiya
+currenciesDisplayName.BAD=Bosnien-Hercegovinsk dinar
+currenciesDisplayName.ZWD=Zimbabwisk dollar
+currenciesDisplayName.SEK=Svensk krona
+currenciesDisplayName.CSK=Tjekkoslovakisk hard koruna
currenciesDisplayName.BYR=Hviderussisk rubel
-currenciesDisplayName.YEI=Yemenitisk imadi riyal
-currenciesDisplayName.BYL=Hviderussisk rubel (1992-1994)
-currenciesDisplayName.CSC=Tjekkoslovakisk koruna
-currenciesDisplayName.KRO=Gammel sydkoreansk won
-currenciesDisplayName.KRH=Sydkoreansk hwan
-currenciesDisplayName.BYB=Ny hviderussisk rubel (1994-1999)
-currenciesDisplayName.SQS=Somalilands shilling
-currenciesDisplayName.GRN=Ny gr\u00e6sk drachma
+currenciesDisplayName.IRR=Iransk rial
currenciesDisplayName.PKR=Pakistansk rupee
-currenciesDisplayName.ZWD=Zimbabwisk dollar
-currenciesDisplayName.LKR=Srilankansk rupee
-currenciesDisplayName.GRD=Gr\u00e6sk drachma
-currenciesDisplayName.IEP=Irsk pund
-currenciesDisplayName.YDD=Yemenitisk dinar
-currenciesDisplayName.RWF=Rwandisk franc
-currenciesDisplayName.CRC=Costaricansk colon
-currenciesDisplayName.TJS=Tadsjikisk somoni
-currenciesDisplayName.TJR=Tadsjikisk rubel
-currenciesDisplayName.EEK=Estisk kroon
-currenciesDisplayName.GQP=\u00c6kvatorialguineask peseta guineana
-currenciesDisplayName.MDR=Moldovisk ruble cupon
-currenciesDisplayName.DKK=Dansk krone
-currenciesDisplayName.MDL=Moldovisk leu
-currenciesDisplayName.GQF=\u00c6kvatorialguineask franco
-currenciesDisplayName.GQE=\u00c6kvatorialguineask ekwele guineana
-currenciesDisplayName.IDR=Indonesisk pupiah
-currenciesDisplayName.AED=Dirham fra de Forenede Arabiske Emirater
-currenciesDisplayName.KPW=Nordkoreansk won
-currenciesDisplayName.IDN=Ny indonesisk rupiah
-currenciesDisplayName.BWP=Botswansk pula
-currenciesDisplayName.MDC=Moldovisk leu cupon
-currenciesDisplayName.IDJ=Indonesisk java rupiah
-currenciesDisplayName.IDG=Indonesisk nica guilder
-currenciesDisplayName.VUV=Vanuaisk vatu
-currenciesDisplayName.XID=Islamisk dinar
-currenciesDisplayName.SOS=Somalisk shilling
-currenciesDisplayName.ADP=Andorransk peseta
-currenciesDisplayName.RUR=Russisk rubel (1991-1998)
-currenciesDisplayName.GPF=Guadeloupsk franc
-currenciesDisplayName.DJF=Djiboutisk franc
-currenciesDisplayName.ADD=Andorransk diner
-currenciesDisplayName.MCG=Monegaskisk franc germinal
-currenciesDisplayName.MCF=Ny monegaskisk franc
-currenciesDisplayName.ECS=Ecuadoriansk sucre
-currenciesDisplayName.LIF=Liechtensteinsk franc
-currenciesDisplayName.RUB=Russisk rubel
-currenciesDisplayName.PHP=Filippinsk peso
-currenciesDisplayName.UZS=Usbekisk sum
-currenciesDisplayName.COP=Colombiansk peso
-currenciesDisplayName.THB=Thailandsk baht
-currenciesDisplayName.IBP=Nordirsk pund
-currenciesDisplayName.BUR=Burmesisk rupee
-currenciesDisplayName.COF=Congolesisk CFA-franc
-currenciesDisplayName.BUK=Burmesisk kyat
-currenciesDisplayName.COB=Colombiansk papirpeso
-currenciesDisplayName.UZC=Usbekisk coupon som
-currenciesDisplayName.UAK=Ukrainsk karbovanetz
-currenciesDisplayName.QAR=Qatarsk rial
-currenciesDisplayName.UAH=Ukrainsk grynia
-currenciesDisplayName.GNS=Guineansk syli
-currenciesDisplayName.CNY=Kinesisk yuan renminbi
-currenciesDisplayName.MZM=Mozambiquisk metical
-currenciesDisplayName.UYU=Uruguaysk peso uruguayo
-currenciesDisplayName.GNI=Guineansk franc (1960-1972)
-currenciesDisplayName.SML=Lira fra San Marino
-currenciesDisplayName.MZE=Mozambiquisk escudo
-currenciesDisplayName.CNP=Kinesisk jen min piao yuan
-currenciesDisplayName.PGK=Papuansk kina
-currenciesDisplayName.OMS=Omansk rial saidi
-currenciesDisplayName.GNF=Guineansk franc
-currenciesDisplayName.UYP=Uruguaysk peso (1975-1993)
-currenciesDisplayName.OMR=Omansk rial
-currenciesDisplayName.XFU=Fransk UIC-franc
-currenciesDisplayName.ZRZ=Zairisk naire
-currenciesDisplayName.BTR=Bhutansk rupee
-currenciesDisplayName.MAF=Marokkansk franc
-currenciesDisplayName.MAD=Marokkansk dirham
-currenciesDisplayName.XFO=Fransk guldfranc
-currenciesDisplayName.BTN=Bhutansk ngultrum
-currenciesDisplayName.UYF=Uruguaysk peso fuerte
-currenciesDisplayName.ZRN=Ny zairisk zaire
-currenciesDisplayName.MYR=Malaysisk ringgit
-currenciesDisplayName.AZM=Aserbajdsjansk manat
-currenciesDisplayName.GMP=Gambisk pund
-currenciesDisplayName.KMF=Comorisk franc
-currenciesDisplayName.SLL=Sierraleonsk leone
-currenciesDisplayName.GMD=Gambisk dalasi
-currenciesDisplayName.BSP=Bahamansk pund
-currenciesDisplayName.CMF=Camerounsk CFA-franc
-currenciesDisplayName.BSD=Bahamansk dollar
-currenciesDisplayName.MXP=Mexicansk silver peso (1861-1992)
-currenciesDisplayName.MXN=Mexicansk peso
-currenciesDisplayName.PES=Peruviansk sol
-currenciesDisplayName.GLK=Gr\u00f8nlandsk krone
-currenciesDisplayName.BRZ=Brasiliansk cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Peruviansk sol nuevo
-currenciesDisplayName.CLP=Chilensk peso
-currenciesDisplayName.SKK=Slovakisk koruna
-currenciesDisplayName.PEI=Peruviansk inti
-currenciesDisplayName.BRR=Brasiliansk cruzeiro
-currenciesDisplayName.FRF=Fransk franc
-currenciesDisplayName.BRN=Brasiliansk cruzado novo
-currenciesDisplayName.CLF=Chilensk unidades de fomento
-currenciesDisplayName.CLE=Chilensk escudo
-currenciesDisplayName.BRL=Brasiliansk real
-currenciesDisplayName.CLC=Chilensk condor
-currenciesDisplayName.BRE=Brasiliansk cruzeiro (1990-1993)
-currenciesDisplayName.DES=Tysk sperrmark
-currenciesDisplayName.MWP=Malawisk pund
-currenciesDisplayName.BRC=Brasiliansk cruzado
-currenciesDisplayName.BRB=Brasiliansk cruzeiro novo (1967-1986)
-currenciesDisplayName.MWK=Malawisk kwacha
-currenciesDisplayName.PDR=Transdniestrisk rubel
-currenciesDisplayName.DEM=Tysk mark
-currenciesDisplayName.TDF=Tchadisk CFA-franc
-currenciesDisplayName.PDN=Ny transdniestrisk rubel
-currenciesDisplayName.PDK=Transdniestrisk rubelkupon
-currenciesDisplayName.NPR=Nepalesisk rupee
-currenciesDisplayName.CKD=Dollar fra Cook\u00f8erne
-currenciesDisplayName.JPY=Japansk yen
-currenciesDisplayName.MVR=Maldivisk rufiyaa
-currenciesDisplayName.MVP=Maldivisk rupee
-currenciesDisplayName.XCD=\u00d8st-karaibisk dollar
-currenciesDisplayName.SIT=Slovensk tolar
-currenciesDisplayName.YUR=Jugoslavisk reformed dinar
-currenciesDisplayName.AWG=Arubansk gylden
-currenciesDisplayName.YUO=Jugoslavisk october dinar
-currenciesDisplayName.DDM=\u00d8sttysk mark
-currenciesDisplayName.YUN=Jugoslavisk convertible dinar
-currenciesDisplayName.YUM=Jugoslavisk noviy dinar
-currenciesDisplayName.YUG=Jugoslavisk 1994 dinar
-currenciesDisplayName.YUF=Jugoslavisk federation dinar
-currenciesDisplayName.RON=Ny rum\u00e6nsk leu
-currenciesDisplayName.YUD=Jugoslavisk hard dinar
-currenciesDisplayName.ROL=Rum\u00e6nsk leu
-currenciesDisplayName.SIB=Slovensk tolar bons
-currenciesDisplayName.NOK=Norsk krone
-currenciesDisplayName.MUR=Mauritisk rupee
-currenciesDisplayName.GIP=Gibraltarisk pund
-currenciesDisplayName.VNS=Vietnamesisk national dong
-currenciesDisplayName.VNR=Vietnamesisk republikansk dong
-currenciesDisplayName.SHP=Pund fra Saint Helena
-currenciesDisplayName.VNN=Ny vietnamesisk dong
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.GHP=GHP
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Bermudansk dollar
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=kr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.DKK=kr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
currenciesSymbol.GNF=GF
-currenciesSymbol.UYP=UYP
-currenciesSymbol.OMR=RO
-currenciesSymbol.XFU=XFU
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.BTR=BTR
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.XFO=XFO
-currenciesSymbol.BTN=Nu
-currenciesSymbol.UYF=UYF
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.MYR=RM
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.VNR=VNR
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=jan®feb®mar®apr®maj®jun®jul®aug®sep®okt®nov®dec®®
months=januar®februar®marts®april®maj®juni®juli®august®september®oktober®november®december®®
shortWeekdays=®s\u00f8n®man®tir®ons®tor®fre®l\u00f8r®
@@ -702,11 +343,15 @@ weekdays=®s\u00f8ndag®mandag®tirsdag®onsdag®torsdag®fredag®l\u00f8rdag®
minNumberOfDaysInFirstWeek=4
firstDayOfWeek=mon
eras=f.Kr.®e.Kr.®
-shortDateFormat=dd-MM-yy
-mediumDateFormat=dd-MM-yyyy
+shortDateFormat=dd/MM/yy
+mediumDateFormat=dd/MM/yyyy
longDateFormat=d. MMM yyyy
-fullDateFormat=EEEE dd MMMM yyyy
-zoneStrings=America/Indianapolis®EST®Eastern-normaltid®EST®Eastern-normaltid®©America/Halifax®AST®Atlantic-normaltid®ADT®Atlantic-sommertid®©Pacific/Honolulu®HST®Hawaii-normaltid®HST®Hawaii-normaltid®©America/Denver®MST®Mountain-normaltid®MDT®Mountain-sommertid®©America/Anchorage®AST®Alaska-normaltid®ADT®Alaska-sommertid®©America/St_Johns®CNT®Newfoundland-normaltid®CDT®Newfoundland-sommertid®©Africa/Casablanca®GMT®Verdenstid®GMT®Verdenstid®©America/Chicago®CST®Central-normaltid®CDT®Central-sommertid®©Asia/Shanghai®CTT®Kinesisk normaltid®CDT®Kinesisk normaltid®©Asia/Tokyo®JST®Japansk normaltid®JST®Japansk normaltid®©America/New_York®EST®Eastern-normaltid®EDT®Eastern-sommertid®©Europe/Bucharest®EET®\u00d8steurop\u00e6isk normaltid®EEST®\u00d8steurop\u00e6isk sommertid®©America/Los_Angeles®PST®Pacific-normaltid®PDT®Pacific-sommertid®©America/Phoenix®MST®Mountain-normaltid®MST®Mountain-normaltid®©Etc/GMT®GMT®Verdenstid®GMT®Verdenstid®©Asia/Jerusalem®IST®Israelsk normaltid®IDT®Israelsk sommertid®©Europe/Paris®CET®Mellemeurop\u00e6isk normaltid®CEST®Mellemeurop\u00e6isk sommertid®©
+fullDateFormat=EEEE 'den' dd. MMM yyyy
+shortTimeFormat=H.mm
+mediumTimeFormat=H.mm.ss
+longTimeFormat=H.mm.ss z
+fullTimeFormat=H.mm.ss z
+zoneStrings=Europe/Paris®CET®Mellemeurop\u00e6isk normaltid®CEST®Mellemeurop\u00e6isk sommertid®©Pacific/Honolulu®HST®Hawaii-normaltid®HST®Hawaii-normaltid®©America/Denver®MST®Mountain-normaltid®MDT®Mountain-sommertid®©Asia/Jerusalem®IST®Israelsk normaltid®IDT®Israelsk sommertid®©America/Anchorage®AST®Alaska-normaltid®ADT®Alaska-sommertid®©Africa/Casablanca®GMT®Verdenstid®GMT®Verdenstid®©America/Phoenix®MST®Mountain-normaltid®MST®Mountain-normaltid®©America/Los_Angeles®PST®Pacific-normaltid®PDT®Pacific-sommertid®©America/Chicago®CST®Central-normaltid®CDT®Central-sommertid®©America/Halifax®AST®Atlantic-normaltid®ADT®Atlantic-sommertid®©America/St_Johns®CNT®Newfoundland-normaltid®CDT®Newfoundland-sommertid®©America/New_York®EST®Eastern-normaltid®EDT®Eastern-sommertid®©Asia/Shanghai®CTT®Kinesisk normaltid®CDT®Kinesisk normaltid®©Asia/Tokyo®JST®Japansk normaltid®JST®Japansk normaltid®©Europe/Bucharest®EET®\u00d8steurop\u00e6isk normaltid®EEST®\u00d8steurop\u00e6isk sommertid®©America/Indianapolis®EST®Eastern-normaltid®EST®Eastern-normaltid®©
territories.TL=Timor-Leste
territories.TK=Tokelau
territories.TJ=Tadsjikistan
@@ -795,6 +440,7 @@ territories.CX=Jule\u00f8en
territories.CV=Kap Verde
territories.PA=Panama
territories.CU=Cuba
+territories.CS=Serbien og Montenegro
territories.CR=Costa Rica
territories.CO=Colombia
territories.CN=Kina
@@ -865,17 +511,16 @@ territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauretanien
territories.AG=Antigua og Barbuda
-territories.MQ=Martinique
territories.AF=Afghanistan
-territories.MP=Nordmarianerne
+territories.MQ=Martinique
territories.AE=Forenede Arabiske Emirater
-territories.MO=SAR Macao
+territories.MP=Nordmarianerne
territories.AD=Andorra
+territories.MO=SAR Macao
territories.MN=Mongoliet
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Republikken Makedonien
-territories.YU=Jugoslavien
territories.YT=Mayotte
territories.MH=Marshall\u00f8erne
territories.MG=Madagaskar
@@ -946,8 +591,8 @@ territories.TR=Tyrkiet
territories.TO=Tonga
territories.TN=Tunesien
territories.TM=Turkmenistan
-languages.gwi=Gwich\u02bbin
languages.akk=Akkadisk
+languages.gwi=Gwich\u02bcin
languages.eka=Ekajuk
languages.ijo=Ijo
languages.xh=Xhosa
@@ -965,8 +610,8 @@ languages.mic=Micmac
languages.wa=Vallonsk
languages.zap=Zapotec
languages.cus=Kusjitiske sprog (\u00f8vrige)
-languages.jbo=Lojban
languages.doi=Dogri
+languages.jbo=Lojban
languages.vo=Volap\u00fck
languages.oto=Otomi sprog
languages.vi=Vietnamesisk
@@ -990,8 +635,8 @@ languages.egy=Egyptisk (oldtid)
languages.ug=Uigurisk
languages.fan=Fang
languages.ssa=Afrikanske sprog syd for Sahara (\u00f8vrige)
-languages.mga=Irsk, Middel- (900-1200)
languages.bat=Baltiske sprog (\u00f8vrige)
+languages.mga=Irsk, Middel- (900-1200)
languages.nyo=Nyoro sprog
languages.bas=Basa
languages.nyn=Nyankole
@@ -1018,8 +663,8 @@ languages.kru=Kurukh
languages.tg=Tajik
languages.byn=Blin
languages.te=Telugu
-languages.kro=Kru
languages.csb=Kashubian
+languages.kro=Kru
languages.ta=Tamilsk
languages.tkl=Tokelau
languages.efi=Efik
@@ -1043,8 +688,8 @@ languages.sk=Slovakisk
languages.grb=Grebo
languages.si=Singalesisk
languages.sh=Serbokroatisk
-languages.crh=Krim-tyrkisk; Krim-tatarisk
languages.afa=Afro-asiatisk (\u00f8vrige)
+languages.crh=Krim-tyrkisk; Krim-tatarisk
languages.sg=Sango
languages.se=Nordsamisk
languages.sd=Sindhi
@@ -1068,14 +713,14 @@ languages.son=Songhai
languages.cpp=Kreolsk og pidgin, baseret p\u00e5 portugisisk (\u00f8vrige)
languages.sog=Sogdiansk
languages.ada=Adangme
-languages.kos=Kosraean
-languages.hit=Hittitisk
languages.cpf=Kreolsk og pidgin, baseret p\u00e5 fransk (\u00f8vrige)
+languages.hit=Hittitisk
+languages.kos=Kosraean
languages.cpe=Kreolsk og pidgin, baseret p\u00e5 engelsk (\u00f8vrige)
languages.him=Himachali
-languages.kok=Konkani
-languages.hil=Hiligaynon
languages.got=Gotisk
+languages.hil=Hiligaynon
+languages.kok=Konkani
languages.gor=Gorontalo
languages.gon=Gondi
languages.din=Dinka
@@ -1146,21 +791,21 @@ languages.ms=Malay
languages.mr=Marathisk
languages.fro=Fransk, Old- (842-ca.1400)
languages.mo=Moldovisk
-languages.frm=Fransk, Middel- (ca.1400-1600)
languages.mn=Mongolsk
-languages.jrb=J\u00f8disk-arabisk
+languages.frm=Fransk, Middel- (ca.1400-1600)
languages.ml=Malayalam
+languages.jrb=J\u00f8disk-arabisk
languages.mk=Makedonsk
languages.mi=Maori
languages.mh=Marshallese
languages.mg=Malagasy
languages.mwr=Marwari
languages.bra=Braj
-languages.den=Slave (Athapascan)
languages.lv=Lettisk
+languages.den=Slave (Athapascan)
languages.lu=Luba-Katanga
-languages.del=Delaware
languages.lt=Litauisk
+languages.del=Delaware
languages.lo=Lao
languages.ln=Lingala
languages.li=Limburgsk
@@ -1211,38 +856,38 @@ languages.iu=Inuktitut
languages.pap=Papiamento
languages.it=Italiensk
languages.sgn=Tegnsprog
-languages.is=Islandsk
languages.kha=Khasi
+languages.is=Islandsk
languages.chr=Cherokee
languages.pam=Pampanga
languages.pal=Pahlavi
languages.chp=Chipewyan
-languages.io=Ido
languages.cho=Choctaw
+languages.io=Ido
languages.chn=Chinook
languages.chm=Mari
languages.tyv=Tuvinian
languages.bnt=Bantu
languages.pag=Pangasinan
-languages.ik=Inupiaq
languages.chk=Chuukese
-languages.ii=Sichuan Yi
+languages.ik=Inupiaq
languages.haw=Hawaiiansk
+languages.ii=Sichuan Yi
languages.lam=Lamba
-languages.ig=Igbo
languages.chg=Chagatai
+languages.ig=Igbo
languages.sga=Irsk, Old- (indtil 900)
languages.paa=Papua-australske sprog (\u00f8vrige)
languages.ie=Interlingue
languages.id=Indonesisk
languages.lah=Lahnda
-languages.day=Dayak
languages.chb=Chibcha
+languages.day=Dayak
languages.ia=Interlingua
languages.lad=Ladino
-languages.hz=Herero
-languages.hai=Haida
languages.dar=Dargwa
+languages.hai=Haida
+languages.hz=Herero
languages.hy=Armensk
languages.hu=Ungarsk
languages.ht=Haitisk
@@ -1263,9 +908,9 @@ languages.iro=Irokesiske sprog
languages.gn=Guarani
languages.gl=Galicisk
languages.arw=Arawak
-languages.gez=Geez
-languages.art=Kunstsprog (\u00f8vrige)
languages.gd=G\u00e6lisk (skotsk)
+languages.art=Kunstsprog (\u00f8vrige)
+languages.gez=Geez
languages.ira=Iranske sprog (\u00f8vrige)
languages.ga=Irsk
languages.arp=Arapaho
@@ -1273,8 +918,8 @@ languages.arn=Araukansk
languages.fy=Frisisk
languages.bla=Siksika
languages.gem=Germanske sprog (\u00f8vrige)
-languages.arc=Aram\u00e6isk
languages.fr=Fransk
+languages.arc=Aram\u00e6isk
languages.fo=F\u00e6r\u00f8sk
languages.cel=Keltiske sprog (\u00f8vrige)
languages.fj=Fijian
@@ -1297,9 +942,9 @@ languages.tum=Tumbuka
languages.mos=Mossi
languages.dz=Dzongkha
languages.nic=Niger-Congo sprog (\u00f8vrige)
-languages.lus=Lushai
-languages.fiu=Finsk-ugriske sprog (\u00f8vrige)
languages.dv=Divehi
+languages.fiu=Finsk-ugriske sprog (\u00f8vrige)
+languages.lus=Lushai
languages.nia=Nias
languages.moh=Mohawk
languages.luo=Luo
@@ -1320,8 +965,8 @@ languages.wal=Walamo
languages.sat=Santali
languages.cy=Walisisk
languages.sas=Sasak
-languages.kbd=Kabardian
languages.cv=Chuvash
+languages.kbd=Kabardian
languages.cu=Kirkeslavisk
languages.mni=Manipuri
languages.cs=Tjekkisk
@@ -1332,17 +977,17 @@ languages.co=Korsikansk
languages.sai=Sydamerikanske indianske sprog (\u00f8vrige)
languages.mnc=Manchu
languages.sah=Yakut
-languages.kaw=Kawi
-languages.inh=Ingush
languages.gba=Gbaya
+languages.inh=Ingush
+languages.kaw=Kawi
languages.sad=Sandawe
languages.ch=Chamorro
-languages.ine=Indoeurop\u00e6iske sprog (\u00f8vrige)
languages.bho=Bhojpuri
+languages.ine=Indoeurop\u00e6iske sprog (\u00f8vrige)
languages.enm=Engelsk, Middel- (1100-1500)
-languages.kar=Karen
-languages.inc=Indiske sprog (\u00f8vrige)
languages.ce=Tjetjensk
+languages.inc=Indiske sprog (\u00f8vrige)
+languages.kar=Karen
languages.gay=Gayo
languages.ca=Katalansk
languages.umb=Umbundu
@@ -1350,19 +995,19 @@ languages.syr=Syrisk
languages.kam=Kamba
languages.tsi=Tsimshisk
languages.ang=Angelsaksisk (ca.450-1100)
-languages.kac=Kachin
languages.cau=Kaukasiske sprog (\u00f8vrige)
+languages.kac=Kachin
languages.kab=Kabyle
-languages.kaa=Karakalpakisk
languages.bs=Bosnisk
-languages.car=Caribisk
+languages.kaa=Karakalpakisk
languages.br=Bretonsk
+languages.car=Caribisk
languages.bo=Tibetansk
languages.bn=Bengalsk
languages.bm=Bambara
languages.gaa=Ga
-languages.cai=Mellemamerikanske indianske sprog (\u00f8vrige)
languages.bi=Bislama
+languages.cai=Mellemamerikanske indianske sprog (\u00f8vrige)
languages.bh=Bihari
languages.bg=Bulgarsk
languages.be=Hviderussisk
@@ -1376,10 +1021,10 @@ languages.az=Aserbajdsjan
languages.ay=Aymara
languages.av=Avarisk
languages.as=Assamesisk
-languages.dsb=Nedre sorbisk
languages.ar=Arabisk
-languages.ilo=Iloko
+languages.dsb=Nedre sorbisk
languages.elx=Elamitisk
+languages.ilo=Iloko
languages.zh=Kinesisk
languages.an=Aragonesisk
languages.am=Amharisk
diff --git a/resource/gnu/java/locale/LocaleInformation_de.properties b/resource/gnu/java/locale/LocaleInformation_de.properties
index 1c6600955..fda19437c 100644
--- a/resource/gnu/java/locale/LocaleInformation_de.properties
+++ b/resource/gnu/java/locale/LocaleInformation_de.properties
@@ -8,682 +8,248 @@
decimalSeparator=,
groupingSeparator=.
localPatternChars=GjMtkHmsSEDFwWahKzJeugAZ
-currenciesDisplayName.JOD=Jordanischer Dinar
-currenciesDisplayName.BOV=Mvdol
-currenciesDisplayName.XAU=Gold
-currenciesDisplayName.FOK=F\u00e4r\u00f6er Inseln Krone
-currenciesDisplayName.LBP=Libanesisches Pfund
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Dong
-currenciesDisplayName.TZS=Tansania Schilling
-currenciesDisplayName.BOP=Bolivianischer Peso
-currenciesDisplayName.KHR=Riel
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Riel (alt)
-currenciesDisplayName.ZMP=Sambisches Pfund
-currenciesDisplayName.AUP=Australisches Pfund
-currenciesDisplayName.XAF=CFA Franc (\u00c4quatorial)
-currenciesDisplayName.MTP=Maltesisches Pfund
-currenciesDisplayName.ZMK=Kwacha
-currenciesDisplayName.GHP=Ghana Pfund
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Ghana Cedi (alt)
-currenciesDisplayName.MTL=Maltesische Lira
-currenciesDisplayName.AUD=Australischer Dollar
-currenciesDisplayName.USS=US Dollar (Gleicher Tag)
-currenciesDisplayName.ITL=Italienische Lire
-currenciesDisplayName.USN=US Dollar (N\u00e4chster Tag)
-currenciesDisplayName.GHC=Cedi
-currenciesDisplayName.SGD=Singapur Dollar
-currenciesDisplayName.PAB=Balboa
-currenciesDisplayName.LAK=Kip
-currenciesDisplayName.KGS=Som
-currenciesDisplayName.CHF=Schweizer Franken
-currenciesDisplayName.ATS=\u00d6sterreichischer Schilling
-currenciesDisplayName.USD=US Dollar
-currenciesDisplayName.ETD=\u00c4thiopischer Dollar
-currenciesDisplayName.BND=Brunei-Dollar
-currenciesDisplayName.JMP=Jamaika Pfund
-currenciesDisplayName.ETB=Birr
-currenciesDisplayName.DZG=Algerischer Franc Germinal
-currenciesDisplayName.DZF=Algerischer Neuer Franc
-currenciesDisplayName.DZD=Algerischer Dinar
-currenciesDisplayName.PYG=Guarani
-currenciesDisplayName.LYP=Libysches Pfund
-currenciesDisplayName.JMD=Jamaika Dollar
-currenciesDisplayName.ISK=Isl\u00e4ndische Krone
-currenciesDisplayName.ESP=Spanische Pesete
-currenciesDisplayName.BMP=Bermuda-Pfund
-currenciesDisplayName.LYD=Libyscher Dinar
-currenciesDisplayName.BMD=Bermuda-Dollar
-currenciesDisplayName.NLG=Holl\u00e4ndischer Gulden
-currenciesDisplayName.MRO=Ouguiya
-currenciesDisplayName.IRR=Rial
-currenciesDisplayName.SEK=Schwedische Krone
-currenciesDisplayName.ERN=Nakfa
+currenciesDisplayName.YDD=Jemen Dinar
+currenciesDisplayName.TWD=Neuer Taiwan Dollar
currenciesDisplayName.KES=Kenia Schilling
-currenciesDisplayName.CFF=Zentralafrikanische Republik CFA Franc
+currenciesDisplayName.BYB=Belarus Rubel (alt)
+currenciesDisplayName.LKR=Sri Lanka Rupie
+currenciesDisplayName.RWF=Ruanda Franc
+currenciesDisplayName.TJS=Tadschikistan Somoni
+currenciesDisplayName.SDP=Sudanesisches Pfund
+currenciesDisplayName.TJR=Tadschikistan Rubel
+currenciesDisplayName.ERN=Nakfa
+currenciesDisplayName.AFN=Afghani
+currenciesDisplayName.GRD=Griechische Drachme
+currenciesDisplayName.IEP=Irisches Pfund
currenciesDisplayName.ARS=Argentinischer Peso
+currenciesDisplayName.SDD=Sudanesischer Dinar
currenciesDisplayName.ARP=Argentinischer Peso (1983-1985)
-currenciesDisplayName.ARM=Argentinischer Peso Moneda Nacional
-currenciesDisplayName.TWD=Neuer Taiwan Dollar
-currenciesDisplayName.SDP=Sudanesisches Pfund
currenciesDisplayName.GEL=Georgischer Lari
+currenciesDisplayName.AFA=Afghani
currenciesDisplayName.GEK=Georgischer Kupon Larit
+currenciesDisplayName.CRC=Costa Rica Colon
currenciesDisplayName.FKP=Falkland Pfund
+currenciesDisplayName.EEK=Estnische Krone
+currenciesDisplayName.HKD=Hongkong Dollar
+currenciesDisplayName.MDL=Moldau Leu
currenciesDisplayName.ARA=Argentinischer Austral
-currenciesDisplayName.SDD=Sudanesischer Dinar
currenciesDisplayName.IQD=Irak Dinar
-currenciesDisplayName.TVD=Tuvalu Dollar
currenciesDisplayName.SCR=Seychellen Rupie
+currenciesDisplayName.VUV=Vatu
+currenciesDisplayName.DKK=D\u00e4nische Krone
+currenciesDisplayName.KPW=Nordkoreanischer Won
+currenciesDisplayName.GQE=\u00c4quatorialguinea Ekwele Guineana
+currenciesDisplayName.IDR=Rupiah
currenciesDisplayName.LVR=Lettischer Rubel
-currenciesDisplayName.FJP=Fidschi Pfund
+currenciesDisplayName.SOS=Somalia Schilling
+currenciesDisplayName.AED=UAE Dirham
+currenciesDisplayName.BWP=Pula
currenciesDisplayName.LVL=Lettischer Lats
-currenciesDisplayName.CDL=Kongolesische Zaire
-currenciesDisplayName.CDG=Republik Kongo Franc
-currenciesDisplayName.CDF=Franc congolais
-currenciesDisplayName.FJD=Fidschi Dollar
+currenciesDisplayName.RUR=Russischer Rubel (alt)
currenciesDisplayName.NIO=Gold-Cordoba
+currenciesDisplayName.ADP=Andorranische Pesete
+currenciesDisplayName.FJD=Fidschi Dollar
currenciesDisplayName.MOP=Pataca
-currenciesDisplayName.NIG=Gold-Cordoba
+currenciesDisplayName.RUB=Russischer Rubel (neu)
+currenciesDisplayName.CDF=Franc congolais
currenciesDisplayName.NIC=Cordoba
-currenciesDisplayName.XTR=COMECON Transferabler Rubel
-currenciesDisplayName.FIN=Finnische Mark (1860-1962)
-currenciesDisplayName.FIM=Finnische Mark
+currenciesDisplayName.DJF=Dschibuti-Franc
+currenciesDisplayName.ECV=Verrechnungseinheit f\u00fcr EC
currenciesDisplayName.SBD=Salomonen Dollar
+currenciesDisplayName.UZS=Usbekistan Sum
+currenciesDisplayName.ECS=Ecuadorianischer Sucre
+currenciesDisplayName.PHP=Philippinischer Peso
+currenciesDisplayName.THB=Baht
currenciesDisplayName.LUF=Luxemburgischer Franc
-currenciesDisplayName.TTO=Trinidad und Tobago Dollar (alt)
-currenciesDisplayName.AOS=Angolanischer Escudo
-currenciesDisplayName.AOR=Kwanza Reajustado
-currenciesDisplayName.MNT=Tugrik
-currenciesDisplayName.HUF=Forint
-currenciesDisplayName.BIF=Burundi-Franc
-currenciesDisplayName.AON=Neuer Kwanza
-currenciesDisplayName.AOK=Angolanischer Kwanza (1977-1990)
+currenciesDisplayName.FIM=Finnische Mark
currenciesDisplayName.TTD=Trinidad und Tobago Dollar
currenciesDisplayName.SZL=Lilangeni
-currenciesDisplayName.NHF=Neue Hebriden CFP Franc
-currenciesDisplayName.GBP=Pfund Sterling
+currenciesDisplayName.MNT=Tugrik
currenciesDisplayName.SAR=Saudi Riyal
+currenciesDisplayName.UAK=Ukrainischer Karbovanetz
+currenciesDisplayName.UAH=Hryvnia
+currenciesDisplayName.HUF=Forint
+currenciesDisplayName.COP=Kolumbianischer Peso
+currenciesDisplayName.QAR=Katar Riyal
currenciesDisplayName.LTT=Litauischer Talonas
-currenciesDisplayName.INR=Indische Rupie
currenciesDisplayName.PTE=Portugiesischer Escudo
-currenciesDisplayName.AOA=Kwanza
-currenciesDisplayName.PTC=Portugiesischer Conto
+currenciesDisplayName.AOR=Kwanza Reajustado
+currenciesDisplayName.UYU=Uruguayischer Peso
+currenciesDisplayName.GBP=Pfund Sterling
+currenciesDisplayName.BIF=Burundi-Franc
+currenciesDisplayName.INR=Indische Rupie
+currenciesDisplayName.ZRZ=Zaire
+currenciesDisplayName.AON=Neuer Kwanza
currenciesDisplayName.LTL=Litauischer Litas
+currenciesDisplayName.XFU=Franz\u00f6sischer UIC-Franc
currenciesDisplayName.KZT=Tenge
-currenciesDisplayName.KZR=Kasachstan Rubel
-currenciesDisplayName.VGD=Britische Jungferninseln Dollar
-currenciesDisplayName.NGP=Nigerianisches Pfund
+currenciesDisplayName.MZM=Metical
+currenciesDisplayName.AOK=Angolanischer Kwanza (1977-1990)
+currenciesDisplayName.BUK=Birmanischer Kyat
+currenciesDisplayName.XFO=Franz\u00f6sischer Gold-Franc
+currenciesDisplayName.PGK=Kina
+currenciesDisplayName.SYP=Syrisches Pfund
+currenciesDisplayName.OMR=Rial Omani
currenciesDisplayName.NGN=Naira
+currenciesDisplayName.ZRN=Neuer Zaire
+currenciesDisplayName.AOA=Kwanza
+currenciesDisplayName.CNY=Renminbi Yuan
+currenciesDisplayName.MAF=Marokkanischer Franc
+currenciesDisplayName.GNF=Guinea Franc
currenciesDisplayName.HTG=Gourde
-currenciesDisplayName.SYP=Syrisches Pfund
-currenciesDisplayName.PSP=Pal\u00e4stina Pfund
-currenciesDisplayName.BHD=Bahrain-Dinar
+currenciesDisplayName.MAD=Marokkanischer Dirham
+currenciesDisplayName.TRY=Neue T\u00fcrkische Lira
currenciesDisplayName.MMK=Kyat
+currenciesDisplayName.MYR=Malaysischer Ringgit
+currenciesDisplayName.LSL=Loti
+currenciesDisplayName.BHD=Bahrain-Dinar
+currenciesDisplayName.SLL=Leone
+currenciesDisplayName.BTN=Ngultrum
+currenciesDisplayName.TRL=T\u00fcrkische Lira
+currenciesDisplayName.KMF=Komoren Franc
currenciesDisplayName.ANG=Niederl. Antillen Gulden
currenciesDisplayName.CZK=Tschechische Krone
-currenciesDisplayName.LSL=Loti
-currenciesDisplayName.BGO=Lew (1879-1952)
+currenciesDisplayName.AZM=Aserbeidschan Manat
+currenciesDisplayName.KYD=Kaiman-Dollar
+currenciesDisplayName.GMD=Dalasi
currenciesDisplayName.BGN=Lew
currenciesDisplayName.CAD=Kanadischer Dollar
+currenciesDisplayName.MXV=Mexican Unidad de Inversion (UDI)
currenciesDisplayName.BGL=Lew
-currenciesDisplayName.TRL=T\u00fcrkische Lira
-currenciesDisplayName.KYD=Kaiman-Dollar
-currenciesDisplayName.CYP=Zypern Pfund
+currenciesDisplayName.VEB=Bolivar
currenciesDisplayName.ILS=Schekel
+currenciesDisplayName.MXP=Mexikanischer Silber-Peso (1861-1992)
+currenciesDisplayName.PES=Sol
currenciesDisplayName.GYD=Guyana Dollar
-currenciesDisplayName.AMD=Dram
+currenciesDisplayName.MXN=Mexikanischer Peso
currenciesDisplayName.ILP=Israelisches Pfund
-currenciesDisplayName.ILL=Schekel
-currenciesDisplayName.VEB=Bolivar
+currenciesDisplayName.SKK=Slowakische Krone
+currenciesDisplayName.CYP=Zypern Pfund
+currenciesDisplayName.XDR=Sonderziehungsrechte
+currenciesDisplayName.PEN=Neuer Sol
currenciesDisplayName.LRD=Liberianischer Dollar
-currenciesDisplayName.ALV=Albanischer Lek Valute
+currenciesDisplayName.PEI=Peruanischer Inti
+currenciesDisplayName.AMD=Dram
+currenciesDisplayName.BSD=Bahama-Dollar
currenciesDisplayName.HRK=Kuna
+currenciesDisplayName.CLP=Chilenischer Peso
currenciesDisplayName.HRD=Kroatischer Dinar
-currenciesDisplayName.ALL=Lek
-currenciesDisplayName.JEP=Jersey Pfund Sterling
-currenciesDisplayName.ALK=Albanischer Lek (1946-1961)
-currenciesDisplayName.VDP=Nordvietnam Viet Minh Piastre Dong Viet
-currenciesDisplayName.VDN=Nordvietnam Neuer Dong
-currenciesDisplayName.MKD=Denar
-currenciesDisplayName.VDD=Nordvietnam Piastre Dong Viet
-currenciesDisplayName.TPP=Timor Pataca
currenciesDisplayName.XPF=CFP Franc
-currenciesDisplayName.GWP=Guinea Bissau Peso
-currenciesDisplayName.KWD=Kuwait Dinar
-currenciesDisplayName.GWM=Portugiesisch Guinea Mil Reis
-currenciesDisplayName.BEF=Belgischer Franc
+currenciesDisplayName.FRF=Franz\u00f6sischer Franc
+currenciesDisplayName.BRR=Brasilianischer Cruzeiro
+currenciesDisplayName.MKD=Denar
+currenciesDisplayName.CLF=Unidades de Fomento
+currenciesDisplayName.ALL=Lek
+currenciesDisplayName.BRN=Brasilianischer Cruzado Novo
+currenciesDisplayName.MWK=Malawi Kwacha
+currenciesDisplayName.BRL=Real
currenciesDisplayName.TPE=Timor Escudo
-currenciesDisplayName.BEC=Belgischer Franc (konvertibel)
-currenciesDisplayName.GWE=Portugiesisch Guinea Escudo
+currenciesDisplayName.BRE=Brasilianischer Cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Brasilianischer Cruzado
+currenciesDisplayName.BRB=Brasilianischer Cruzeiro Novo (1967-1986)
+currenciesDisplayName.DEM=Deutsche Mark
+currenciesDisplayName.KWD=Kuwait Dinar
+currenciesDisplayName.XCD=Ostkaribischer Dollar
+currenciesDisplayName.NPR=Nepalesische Rupie
+currenciesDisplayName.GWP=Guinea Bissau Peso
+currenciesDisplayName.YUN=Jugoslawischer Dinar (konvertibel)
currenciesDisplayName.SVC=El Salvador Colon
-currenciesDisplayName.BDT=Taka
-currenciesDisplayName.TOS=Tonga Pfund Sterling
-currenciesDisplayName.TOP=Pa\u02bbanga
+currenciesDisplayName.YUM=Neuer Dinar
+currenciesDisplayName.SIT=Tolar
+currenciesDisplayName.JPY=Yen
currenciesDisplayName.XOF=CFA Franc (West)
+currenciesDisplayName.MVR=Rufiyaa
+currenciesDisplayName.GWE=Portugiesisch Guinea Escudo
+currenciesDisplayName.BEF=Belgischer Franc
+currenciesDisplayName.TOP=Pa\u02bbanga
+currenciesDisplayName.YUD=Jugoslawischer Dinar (1966-1990)
+currenciesDisplayName.BEC=Belgischer Franc (konvertibel)
currenciesDisplayName.SUR=Sowjetischer Rubel
-currenciesDisplayName.SUN=Sowjetischer Neuer Rubel
-currenciesDisplayName.NCF=Neukaledonien Franc Germinal
-currenciesDisplayName.CVE=Kap Verde Escudo
-currenciesDisplayName.XNF=Franz\u00f6sischer Antillen CFA Franc
+currenciesDisplayName.ROL=Leu
+currenciesDisplayName.BDT=Taka
+currenciesDisplayName.XBD=Europ\u00e4ische Rechnungseinheit (XBD)
+currenciesDisplayName.AWG=Aruba Florin
+currenciesDisplayName.XBC=Europ\u00e4ische Rechnungseinheit (XBC)
+currenciesDisplayName.XBA=Europ\u00e4ische Rechnungseinheit
+currenciesDisplayName.NOK=Norwegische Krone
+currenciesDisplayName.MUR=Mauritius Rupie
currenciesDisplayName.ZAR=Rand
-currenciesDisplayName.DOP=Dominikanischer Peso
-currenciesDisplayName.ZAP=S\u00fcdafrikanisches Pfund
+currenciesDisplayName.SHP=St. Helena Pfund
+currenciesDisplayName.XAU=Gold
+currenciesDisplayName.VND=Dong
+currenciesDisplayName.TZS=Tansania Schilling
+currenciesDisplayName.GIP=Gibraltar Pfund
currenciesDisplayName.TND=Tunesischer Dinar
-currenciesDisplayName.CUP=Kubanischer Peso
-currenciesDisplayName.GUF=Franz\u00f6sisch Guayana Franc Guiana
+currenciesDisplayName.CVE=Kap Verde Escudo
currenciesDisplayName.UGX=Uganda Schilling
-currenciesDisplayName.LNR=Ceylon Rupie
-currenciesDisplayName.AIF=Afar und Issa Franc
-currenciesDisplayName.VAL=Vatikanstadt Lire
-currenciesDisplayName.STE=Sao Tome und Principe Escudo
+currenciesDisplayName.ZMK=Kwacha
+currenciesDisplayName.JOD=Jordanischer Dinar
+currenciesDisplayName.XAF=CFA Franc (\u00c4quatorial)
+currenciesDisplayName.LBP=Libanesisches Pfund
currenciesDisplayName.UGS=Uganda Schilling (1966-1987)
currenciesDisplayName.STD=Dobra
-currenciesDisplayName.MHD=Marshall Inseln Dollar
-currenciesDisplayName.NZP=Neuseeland Pfund
currenciesDisplayName.WST=Tala
-currenciesDisplayName.WSP=West-Samoa Pfund
-currenciesDisplayName.HNL=Lempira
+currenciesDisplayName.KHR=Riel
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Dominikanischer Peso
+currenciesDisplayName.BOV=Mvdol
+currenciesDisplayName.MTP=Maltesisches Pfund
+currenciesDisplayName.USS=US Dollar (Gleicher Tag)
+currenciesDisplayName.BOP=Bolivianischer Peso
+currenciesDisplayName.MTL=Maltesische Lira
+currenciesDisplayName.CUP=Kubanischer Peso
currenciesDisplayName.TMM=Turkmenistan-Manat
-currenciesDisplayName.GTQ=Quetzal
+currenciesDisplayName.USN=US Dollar (N\u00e4chster Tag)
+currenciesDisplayName.SGD=Singapur Dollar
currenciesDisplayName.NZD=Neuseeland Dollar
-currenciesDisplayName.SSP=Schottisches Pfund
-currenciesDisplayName.BBD=Barbados-Dollar
+currenciesDisplayName.USD=US Dollar
+currenciesDisplayName.HNL=Lempira
+currenciesDisplayName.BOB=Boliviano
+currenciesDisplayName.ITL=Italienische Lire
+currenciesDisplayName.PAB=Balboa
+currenciesDisplayName.GTQ=Quetzal
+currenciesDisplayName.LAK=Kip
+currenciesDisplayName.GHC=Cedi
+currenciesDisplayName.AUD=Australischer Dollar
currenciesDisplayName.NAD=Namibia Dollar
+currenciesDisplayName.KGS=Som
currenciesDisplayName.MGF=Madagaskar Franc
+currenciesDisplayName.CHF=Schweizer Franken
+currenciesDisplayName.BBD=Barbados-Dollar
currenciesDisplayName.MGA=Madagaskar Ariary
-currenciesDisplayName.EGP=\u00c4gyptisches Pfund
+currenciesDisplayName.PYG=Guarani
currenciesDisplayName.PLZ=Zloty (1950-1995)
-currenciesDisplayName.BAN=Bosnien und Herzegowina Neuer Dinar
-currenciesDisplayName.BAM=Konvertierbare Mark
-currenciesDisplayName.BZD=Belize-Dollar
-currenciesDisplayName.BAD=Bosnien und Herzegowina Dinar
-currenciesDisplayName.PLN=Zloty
currenciesDisplayName.YER=Jemen Rial
+currenciesDisplayName.ATS=\u00d6sterreichischer Schilling
+currenciesDisplayName.ETB=Birr
+currenciesDisplayName.BND=Brunei-Dollar
+currenciesDisplayName.JMD=Jamaika Dollar
+currenciesDisplayName.EGP=\u00c4gyptisches Pfund
+currenciesDisplayName.PLN=Zloty
+currenciesDisplayName.DZD=Algerischer Dinar
+currenciesDisplayName.ISK=Isl\u00e4ndische Krone
currenciesDisplayName.SRG=Suriname Gulden
+currenciesDisplayName.LYD=Libyscher Dinar
+currenciesDisplayName.BZD=Belize-Dollar
+currenciesDisplayName.BAM=Konvertierbare Mark
+currenciesDisplayName.ESP=Spanische Pesete
currenciesDisplayName.KRW=S\u00fcdkoreanischer Won
+currenciesDisplayName.NLG=Holl\u00e4ndischer Gulden
+currenciesDisplayName.MRO=Ouguiya
+currenciesDisplayName.BAD=Bosnien und Herzegowina Dinar
+currenciesDisplayName.ZWD=Simbabwe Dollar
+currenciesDisplayName.SEK=Schwedische Krone
currenciesDisplayName.BYR=Belarus Rubel (neu)
-currenciesDisplayName.YEI=Jemen Imadi Riyal
-currenciesDisplayName.BYL=Belarus Rubel (1992-1994)
-currenciesDisplayName.CSC=Tschechoslowakische Krone
-currenciesDisplayName.KRO=S\u00fcdkoreanischer Won (alt)
-currenciesDisplayName.KRH=S\u00fcdkoreanischer Hwan
-currenciesDisplayName.BYB=Belarus Rubel (alt)
-currenciesDisplayName.SQS=Somaliland Schilling
-currenciesDisplayName.GRN=Neue Griechische Drachme
+currenciesDisplayName.IRR=Rial
currenciesDisplayName.PKR=Pakistanische Rupie
-currenciesDisplayName.AFN=Afghani
-currenciesDisplayName.ZWD=Simbabwe Dollar
-currenciesDisplayName.LKR=Sri Lanka Rupie
-currenciesDisplayName.GRD=Griechische Drachme
-currenciesDisplayName.IEP=Irisches Pfund
-currenciesDisplayName.AFA=Afghani
-currenciesDisplayName.YDD=Jemen Dinar
-currenciesDisplayName.RWF=Ruanda Franc
-currenciesDisplayName.CRC=Costa Rica Colon
-currenciesDisplayName.TJS=Tadschikistan Somoni
-currenciesDisplayName.TJR=Tadschikistan Rubel
-currenciesDisplayName.EEK=Estnische Krone
-currenciesDisplayName.GQP=\u00c4quatorialguinea Peseta Guineana
-currenciesDisplayName.MDR=Moldau Rubel Cupon
-currenciesDisplayName.HKD=Hongkong Dollar
-currenciesDisplayName.DKK=D\u00e4nische Krone
-currenciesDisplayName.MDL=Moldau Leu
-currenciesDisplayName.GQF=\u00c4quatorialguinea Franco
-currenciesDisplayName.GQE=\u00c4quatorialguinea Ekwele Guineana
-currenciesDisplayName.IDR=Rupiah
-currenciesDisplayName.AED=UAE Dirham
-currenciesDisplayName.KPW=Nordkoreanischer Won
-currenciesDisplayName.IDN=Indonesische Neue Rupiah
-currenciesDisplayName.BWP=Pula
-currenciesDisplayName.MDC=Moldau Leu Cupon
-currenciesDisplayName.IDJ=Indonesische Java Rupiah
-currenciesDisplayName.KPP=Nordkoreanischer Won (alt)
-currenciesDisplayName.IDG=Indonesischer Nica Guilder
-currenciesDisplayName.VUV=Vatu
-currenciesDisplayName.XID=Islamischer Dinar
-currenciesDisplayName.SOS=Somalia Schilling
-currenciesDisplayName.ADP=Andorranische Pesete
-currenciesDisplayName.RUR=Russischer Rubel (alt)
-currenciesDisplayName.DJF=Dschibuti-Franc
-currenciesDisplayName.ADD=Andorranischer Diner
-currenciesDisplayName.MCG=Monaco Franc Germinal
-currenciesDisplayName.MCF=Monaco Franc Nouveau
-currenciesDisplayName.ECV=Verrechnungseinheit f\u00fcr EC
-currenciesDisplayName.ECS=Ecuadorianischer Sucre
-currenciesDisplayName.LIF=Liechtenstein Franken
-currenciesDisplayName.RUB=Russischer Rubel (neu)
-currenciesDisplayName.PHP=Philippinischer Peso
-currenciesDisplayName.UZS=Usbekistan Sum
-currenciesDisplayName.COP=Kolumbianischer Peso
-currenciesDisplayName.THB=Baht
-currenciesDisplayName.IBP=Nordirisches Pfund
-currenciesDisplayName.BUR=Birmanische Rupie
-currenciesDisplayName.COF=Kongo CFA Franc
-currenciesDisplayName.BUK=Birmanischer Kyat
-currenciesDisplayName.COB=Kolumbianischer Papier-Peso
-currenciesDisplayName.UAK=Ukrainischer Karbovanetz
-currenciesDisplayName.QAR=Katar Riyal
-currenciesDisplayName.UAH=Hryvnia
-currenciesDisplayName.CNY=Renminbi Yuan
-currenciesDisplayName.MZM=Metical
-currenciesDisplayName.UYU=Uruguayischer Peso
-currenciesDisplayName.SML=San Marino Lire
-currenciesDisplayName.CNP=Chinesischer Jen Min Piao Yuan
-currenciesDisplayName.PGK=Kina
-currenciesDisplayName.GNF=Guinea Franc
-currenciesDisplayName.OMR=Rial Omani
-currenciesDisplayName.XFU=Franz\u00f6sischer UIC-Franc
-currenciesDisplayName.ZRZ=Zaire
-currenciesDisplayName.BTR=Bhutan Rupie
-currenciesDisplayName.MAF=Marokkanischer Franc
-currenciesDisplayName.MAD=Marokkanischer Dirham
-currenciesDisplayName.XFO=Franz\u00f6sischer Gold-Franc
-currenciesDisplayName.BTN=Ngultrum
-currenciesDisplayName.ZRN=Neuer Zaire
-currenciesDisplayName.MYR=Malaysischer Ringgit
-currenciesDisplayName.AZM=Aserbeidschan Manat
-currenciesDisplayName.GMP=Gambia Pfund
-currenciesDisplayName.KMF=Komoren Franc
-currenciesDisplayName.SLL=Leone
-currenciesDisplayName.GMD=Dalasi
-currenciesDisplayName.BSP=Bahama-Pfund
-currenciesDisplayName.CMF=Kamerun CFA Franc
-currenciesDisplayName.MXV=Mexican Unidad de Inversion (UDI)
-currenciesDisplayName.MXP=Mexikanischer Silber-Peso (1861-1992)
-currenciesDisplayName.BSD=Bahama-Dollar
-currenciesDisplayName.MXN=Mexikanischer Peso
-currenciesDisplayName.PES=Sol
-currenciesDisplayName.GLK=Gr\u00f6nland Krone
-currenciesDisplayName.BRZ=Brasilianischer Cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Neuer Sol
-currenciesDisplayName.CLP=Chilenischer Peso
-currenciesDisplayName.SKK=Slowakische Krone
-currenciesDisplayName.PEI=Peruanischer Inti
-currenciesDisplayName.BRR=Brasilianischer Cruzeiro
-currenciesDisplayName.XDR=Sonderziehungsrechte
-currenciesDisplayName.FRG=Franz\u00f6sischer Franc Germinal/Franc Poincare
-currenciesDisplayName.FRF=Franz\u00f6sischer Franc
-currenciesDisplayName.BRN=Brasilianischer Cruzado Novo
-currenciesDisplayName.CLF=Unidades de Fomento
-currenciesDisplayName.CLE=Chilenischer Escudo
-currenciesDisplayName.BRL=Real
-currenciesDisplayName.CLC=Chilenischer Condor
-currenciesDisplayName.BRE=Brasilianischer Cruzeiro (1990-1993)
-currenciesDisplayName.DES=Sperrmark
-currenciesDisplayName.MWP=Malawi Pfund
-currenciesDisplayName.BRC=Brasilianischer Cruzado
-currenciesDisplayName.BRB=Brasilianischer Cruzeiro Novo (1967-1986)
-currenciesDisplayName.MWK=Malawi Kwacha
-currenciesDisplayName.PDR=Dnjestr-Republik Rubel
-currenciesDisplayName.DEM=Deutsche Mark
-currenciesDisplayName.TDF=Tschad CFA Franc
-currenciesDisplayName.PDN=Dnjestr-Republik Rubel (neu)
-currenciesDisplayName.PDK=Dnjestr-Republik Rubel Kupon
-currenciesDisplayName.NPR=Nepalesische Rupie
-currenciesDisplayName.JPY=Yen
-currenciesDisplayName.MVR=Rufiyaa
-currenciesDisplayName.MVP=Malediven Rupie
-currenciesDisplayName.XCD=Ostkaribischer Dollar
-currenciesDisplayName.SIT=Tolar
-currenciesDisplayName.YUR=Jugoslawischer Reformierter Dinar
-currenciesDisplayName.AWG=Aruba Florin
-currenciesDisplayName.YUO=Jugoslawischer Oktober-Dinar
-currenciesDisplayName.YUN=Jugoslawischer Dinar (konvertibel)
-currenciesDisplayName.YUM=Neuer Dinar
-currenciesDisplayName.TCC=Turks und Caicos Krone
-currenciesDisplayName.YUG=Jugoslawischer 1994-Dinar
-currenciesDisplayName.YUF=Jugoslawische F\u00f6deration Dinar
-currenciesDisplayName.RON=Neuer Leu
-currenciesDisplayName.YUD=Jugoslawischer Dinar (1966-1990)
-currenciesDisplayName.ROL=Leu
-currenciesDisplayName.SIB=Tolar Bons
-currenciesDisplayName.NOK=Norwegische Krone
-currenciesDisplayName.MUR=Mauritius Rupie
-currenciesDisplayName.XBD=Europ\u00e4ische Rechnungseinheit (XBD)
-currenciesDisplayName.GIP=Gibraltar Pfund
-currenciesDisplayName.VNS=Vietnamesischer Dong
-currenciesDisplayName.XBC=Europ\u00e4ische Rechnungseinheit (XBC)
-currenciesDisplayName.VNR=Republik Vietnam Dong
-currenciesDisplayName.XBA=Europ\u00e4ische Rechnungseinheit
-currenciesDisplayName.SHP=St. Helena Pfund
-currenciesDisplayName.VNN=Vietnamesischer Neuer Dong
-currenciesSymbol.JOD=JOD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LBP
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=TZS
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=KHR
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=BOB
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=MTL
-currenciesSymbol.AUD=AUD
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=SGD
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SFr.
+currenciesDisplayName.BMD=Bermuda-Dollar
currenciesSymbol.ATS=\u00f6S
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=ETB
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DZD
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=JMD
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LYD
-currenciesSymbol.BMD=BMD
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=MRO
-currenciesSymbol.IRR=IRR
-currenciesSymbol.SEK=SEK
-currenciesSymbol.ERN=ERN
-currenciesSymbol.KES=KES
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=ARS
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=TWD
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GEL=GEL
-currenciesSymbol.GEK=GEK
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
-currenciesSymbol.IQD=IQD
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SCR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=FJD
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
-currenciesSymbol.SBD=SBD
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=MNT
-currenciesSymbol.HUF=HUF
-currenciesSymbol.BIF=BIF
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
-currenciesSymbol.TTD=TTD
-currenciesSymbol.SZL=SZL
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAR=SAR
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=KZT
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=SYP
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BHD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=ANG
-currenciesSymbol.CZK=CZK
-currenciesSymbol.LSL=LSL
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.CAD=CAD
-currenciesSymbol.BGL=BGL
-currenciesSymbol.TRL=TRL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=CYP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=GYD
-currenciesSymbol.AMD=AMD
-currenciesSymbol.ILP=ILP
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=VEB
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=ALL
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MKD
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=XPF
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KWD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BEF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.BDT=BDT
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=TOP
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
-currenciesSymbol.CVE=CVE
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=ZAR
-currenciesSymbol.DOP=DOP
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=UGX
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=STD
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
-currenciesSymbol.HNL=HNL
-currenciesSymbol.TMM=TMM
-currenciesSymbol.GTQ=GTQ
-currenciesSymbol.NZD=NZD
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BBD
-currenciesSymbol.NAD=NAD
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.BAM=BAM
-currenciesSymbol.BZD=BZD
-currenciesSymbol.BAD=BAD
-currenciesSymbol.PLN=PLN
-currenciesSymbol.YER=YER
-currenciesSymbol.SRG=SRG
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=BYR
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=PKR
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=ZWD
-currenciesSymbol.LKR=LKR
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IEP
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=CRC
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HKD
-currenciesSymbol.DKK=DKK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=IDR
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VUV
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=SOS
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.DJF=DJF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=COP
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QAR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.CNY=CNY
-currenciesSymbol.MZM=MZM
-currenciesSymbol.UYU=UYU
-currenciesSymbol.SML=SML
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.GNF=GNF
-currenciesSymbol.OMR=OMR
-currenciesSymbol.XFU=XFU
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.BTR=BTR
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.XFO=XFO
-currenciesSymbol.BTN=BTN
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.MYR=MYR
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
-currenciesSymbol.KMF=KMF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.MXP=MXP
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXN=MXN
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.PEN=PEN
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.SKK=SKK
-currenciesSymbol.CLP=CLP
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
+currenciesSymbol.KGS=som
currenciesSymbol.FRF=FF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=BRL
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MWK
-currenciesSymbol.PDR=PDR
+currenciesSymbol.CHF=SFr.
currenciesSymbol.DEM=DM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=NPR
-currenciesSymbol.MVR=MVR
-currenciesSymbol.MVP=MVP
currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=ROL
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NOK
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBA=XBA
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.AFN=Af
shortMonths=Jan®Feb®Mrz®Apr®Mai®Jun®Jul®Aug®Sep®Okt®Nov®Dez®®
months=Januar®Februar®M\u00e4rz®April®Mai®Juni®Juli®August®September®Oktober®November®Dezember®®
shortWeekdays=®So®Mo®Di®Mi®Do®Fr®Sa®
@@ -722,8 +288,8 @@ territories.GL=Gr\u00f6nland
territories.SV=El Salvador
territories.062=S\u00fcd-Zentralasien
territories.ST=S\u00e3o Tom\u00e9 und Pr\u00edncipe
-territories.GI=Gibraltar
territories.061=Polynesien
+territories.GI=Gibraltar
territories.GH=Ghana
territories.SR=Suriname
territories.GF=Franz\u00f6sisch-Guayana
@@ -746,13 +312,13 @@ territories.SC=Seychellen
territories.SB=Salomonen
territories.SA=Saudi-Arabien
territories.FR=Frankreich
-territories.FO=F\u00e4r\u00f6er
territories.057=Mikronesien
+territories.FO=F\u00e4r\u00f6er
territories.FM=Mikronesien
territories.RW=Ruanda
territories.054=Melanesien
-territories.FK=Falklandinseln
territories.053=Australien und Neuseeland
+territories.FK=Falklandinseln
territories.RU=Russische F\u00f6deration
territories.FJ=Fidschi
territories.FI=Finnland
@@ -761,19 +327,20 @@ territories.RE=R\u00e9union
territories.ET=\u00c4thiopien
territories.ES=Spanien
territories.ER=Eritrea
-territories.EH=Westsahara
territories.833=Insel Man
+territories.EH=Westsahara
territories.EG=\u00c4gypten
+territories.830=Kanalinseln
territories.EE=Estland
-territories.830=\u00c4rmelkanalinseln
+territories.QO=\u00c4u\u00dferes Ozeanien
territories.EC=Ecuador
territories.DZ=Algerien
territories.QA=Katar
territories.039=S\u00fcdeuropa
territories.DO=Dominikanische Republik
territories.PY=Paraguay
-territories.DM=Dominica
territories.035=S\u00fcdostasien
+territories.DM=Dominica
territories.PW=Palau
territories.DK=D\u00e4nemark
territories.DJ=Dschibuti
@@ -796,6 +363,7 @@ territories.CX=Weihnachtsinsel
territories.CV=Kap Verde
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Serbien und Montenegro
territories.CR=Costa Rica
territories.029=Karibik
territories.CO=Kolumbien
@@ -803,8 +371,8 @@ territories.CN=China
territories.CM=Kamerun
territories.CL=Chile
territories.CK=Cookinseln
-territories.021=Nordamerika
territories.CI=C\u00f4te d\u2019Ivoire
+territories.021=Nordamerika
territories.CH=Schweiz
territories.CG=Kongo
territories.CF=Zentralafrikanische Republik
@@ -819,27 +387,26 @@ territories.BV=Bouvetinsel
territories.BT=Bhutan
territories.BS=Bahamas
territories.BR=Brasilien
-territories.019=Nord- und S\u00fcdamerika
+territories.019=Nord-, Mittel- und S\u00fcdamerika
territories.018=S\u00fcdafrika
territories.NZ=Neuseeland
-territories.017=Zentralafrika
territories.BO=Bolivien
+territories.017=Zentralafrika
territories.BN=Brunei Darussalam
-territories.015=Nordafrika
territories.BM=Bermuda
+territories.015=Nordafrika
territories.014=Ostafrika
territories.013=Mittelamerika
territories.NU=Niue
territories.BJ=Benin
-territories.011=Westafrika
territories.BI=Burundi
+territories.011=Westafrika
territories.BH=Bahrain
territories.NR=Nauru
territories.BG=Bulgarien
territories.BF=Burkina Faso
territories.NP=Nepal
territories.BE=Belgien
-territories.ZZ=\u00c4u\u00dferes Ozeanien
territories.NO=Norwegen
territories.BD=Bangladesch
territories.BB=Barbados
@@ -851,7 +418,7 @@ territories.NG=Nigeria
territories.NF=Norfolkinsel
territories.AZ=Aserbaidschan
territories.NE=Niger
-territories.AX=Aland Inseln
+territories.AX=Alandinseln
territories.NC=Neukaledonien
territories.AW=Aruba
territories.ZM=Sambia
@@ -860,15 +427,15 @@ territories.AU=Australien
territories.AT=\u00d6sterreich
territories.AS=Amerikanisch-Samoa
territories.AR=Argentinien
-territories.AQ=Antarktis
territories.009=Ozeanien
+territories.AQ=Antarktis
territories.MZ=Mosambik
territories.AO=Angola
territories.MY=Malaysia
territories.AN=Niederl\u00e4ndische Antillen
territories.MX=Mexiko
-territories.AM=Armenien
territories.005=S\u00fcdamerika
+territories.AM=Armenien
territories.MW=Malawi
territories.AL=Albanien
territories.MV=Malediven
@@ -876,8 +443,8 @@ territories.ZA=S\u00fcdafrika
territories.MU=Mauritius
territories.002=Afrika
territories.MT=Malta
-territories.AI=Anguilla
territories.001=Welt
+territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauretanien
territories.AG=Antigua und Barbuda
@@ -891,7 +458,6 @@ territories.MN=Mongolei
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Mazedonien
-territories.YU=Jugoslawien
territories.YT=Mayotte
territories.MH=Marshallinseln
territories.MG=Madagaskar
@@ -917,7 +483,7 @@ territories.LA=Laos
territories.KZ=Kasachstan
territories.KY=Kaimaninseln
territories.KW=Kuwait
-territories.145=West-Asien
+territories.145=Westasien
territories.142=Asien
territories.KR=Republik Korea
territories.KP=Demokratische Volksrepublik Korea
@@ -968,36 +534,36 @@ territories.TR=T\u00fcrkei
territories.TO=Tonga
territories.TN=Tunesien
territories.TM=Turkmenistan
-languages.gwi=Gwich\u02bbin
languages.akk=Akkadisch
+languages.gwi=Kutchin-Sprache
languages.eka=Ekajuk
-languages.ijo=Ijo
+languages.ijo=Ijo-Sprache
languages.xh=Xhosa
languages.sux=Sumerisch
languages.sus=Susu
languages.mis=Verschiedene Sprachen
-languages.loz=Lozi
+languages.loz=Rotse-Sprache
languages.tog=Tonga (Nyasa)
languages.pon=Ponapeanisch
-languages.min=Minangkabau
-languages.suk=Sukuma
+languages.min=Minangkabau-Sprache
+languages.suk=Sukuma-Sprache
languages.wo=Wolof
+languages.kut=Kutenai-Sprache
languages.lol=Mongo
-languages.kut=Kutenai
-languages.mic=Micmac
+languages.mic=Micmac-Sprache
languages.wa=Wallonisch
languages.kum=Kum\u00fckisch
languages.zap=Zapotekisch
languages.cus=Kuschitische Sprachen (Andere)
-languages.jbo=Lojban
languages.doi=Dogri
+languages.jbo=Lojban
languages.vo=Volap\u00fck
languages.oto=Otomangue-Sprachen
languages.vi=Vietnamesisch
-languages.vai=Vai
-languages.rar=Rarotongan
+languages.vai=Vai-Sprache
+languages.rar=Rarotonganisch
languages.ve=Venda-Sprache
-languages.rap=Rapanui
+languages.rap=Osterinsel-Sprache
languages.raj=Rajasthani
languages.ota=Osmanisch
languages.nzi=Nzima
@@ -1008,30 +574,30 @@ languages.tmh=Tamaseq
languages.nai=Indianersprachen, Nordamerika (Andere)
languages.nah=Nahuatl
languages.ur=Urdu
-languages.fat=Fanti
+languages.fat=Fanti-Sprache
languages.uk=Ukrainisch
languages.egy=\u00c4gyptisch
languages.ug=Uigurisch
-languages.fan=Fang
-languages.ssa=Nilosaharanische Sprachen
-languages.mga=Mittelirisch
+languages.fan=Pangwe-Sprache
+languages.ssa=Nilosaharanische Sprachen (Andere)
languages.bat=Baltische Sprachen (Andere)
+languages.mga=Mittelirisch
languages.nyo=Nyoro
languages.bas=Basaa-Sprache
languages.nyn=Nyankole
-languages.nym=Nyamwezi
+languages.nym=Nyamwezi-Sprache
languages.hmn=Miao-Sprachen
languages.ban=Balinesisch
-languages.osa=Osage
+languages.osa=Osage-Sprache
languages.bal=Belutschisch
languages.ty=Tahitisch
-languages.bai=Bamileke-Sprachen
+languages.bai=Bamileke-Sprache
languages.tw=Twi
-languages.srr=Serer
-languages.tli=Tlingit
+languages.srr=Serer-Sprache
+languages.tli=Tlingit-Sprache
languages.tt=Tatarisch
languages.ts=Tsonga
-languages.bad=Banda
+languages.bad=Banda-Sprache
languages.tr=T\u00fcrkisch
languages.to=Tongaisch
languages.tn=Tswana-Sprache
@@ -1039,12 +605,12 @@ languages.tl=Tagalog
languages.tk=Turkmenisch
languages.ti=Tigrinja
languages.th=Thai
-languages.kru=Kurukh
+languages.kru=Oraon-Sprache
languages.tg=Tadschikisch
languages.byn=Blin
languages.te=Telugu
-languages.kro=Kru
languages.csb=Kaschubisch
+languages.kro=Kru-Sprachen
languages.ta=Tamilisch
languages.tkl=Tokelauanisch
languages.efi=Efik
@@ -1056,7 +622,7 @@ languages.st=S\u00fcd-Sotho-Sprache
languages.ss=Swazi
languages.sr=Serbisch
languages.sq=Albanisch
-languages.men=Mende
+languages.men=Mende-Sprache
languages.crp=Kreolische Sprachen
languages.so=Somali
languages.afh=Afrihili
@@ -1065,11 +631,11 @@ languages.sm=Samoanisch
languages.sl=Slowenisch
languages.grc=Griechisch (bis 1453)
languages.sk=Slowakisch
-languages.grb=Gerbo
+languages.grb=Grebo-Sprache
languages.si=Singhalesisch
languages.sh=Serbo-Kroatisch
-languages.crh=Krimtatarisch
languages.afa=Afro-Asiatische Sprachen (Andere)
+languages.crh=Krimtatarisch
languages.sg=Sango
languages.se=Nord-Samisch
languages.sd=Sindhi
@@ -1083,71 +649,71 @@ languages.ro=Rum\u00e4nisch
languages.rn=Rundi-Sprache
languages.rm=R\u00e4toromanisch
languages.mdf=Moksha
-languages.tiv=Tiv
+languages.tiv=Tiv-Sprache
languages.ady=Adygai
-languages.zun=Zuni
-languages.kpe=Kpelle
+languages.zun=Zuni-Sprache
+languages.kpe=Kpelle-Sprache
languages.qu=Quechua
languages.tig=Tigre
-languages.son=Songhai
+languages.son=Songhai-Sprache
languages.cpp=Kreolisch-Portugiesisch (Andere)
-languages.sog=Sogdien
+languages.sog=Sogdisch
languages.ada=Adangme
-languages.kos=Kosraeanisch
-languages.hit=Hethitisch
languages.cpf=Kreolisch-Franz\u00f6sisch (Andere)
-languages.cpe=Krio
+languages.hit=Hethitisch
+languages.kos=Kosraeanisch
+languages.cpe=Kreolisch-Englisch (Andere)
languages.him=Himachali
-languages.kok=Konkani
-languages.hil=Hiligaynon
languages.got=Gotisch
-languages.gor=Gorontalo
-languages.gon=Gondi
-languages.din=Dinka
+languages.hil=Hiligaynon-Sprache
+languages.kok=Konkani
+languages.gor=Mongondou
+languages.gon=Gondi-Sprache
+languages.din=Dinka-Sprache
languages.nub=Nubische Sprachen
languages.pt=Portugiesisch
languages.ps=Afghanisch (Paschtu)
languages.fur=Friulisch
languages.phn=Ph\u00f6nikisch
languages.goh=Althochdeutsch
-languages.snk=Soninke
+languages.snk=Soninke-Sprache
languages.cop=Koptisch
-languages.yap=Yap
-languages.ach=Acoli
-languages.yao=Yao
+languages.yap=Yapesisch
+languages.ach=Acholi-Sprache
+languages.yao=Yao-Sprache
languages.phi=Philippinen-Austronesisch (Andere)
languages.pl=Polnisch
-languages.ace=Achinesisch
+languages.ace=Aceh-Sprache
languages.pi=Pali
languages.pa=Pandschabisch
languages.bug=Buginesisch
languages.iba=Iban
languages.sms=Skolt-Lappisch
languages.bua=Burjatisch
-languages.mas=Masai
+languages.mas=Massai-Sprache
languages.smn=Inari-Lappisch
languages.os=Ossetisch
-languages.map=Austronesisch
+languages.map=Austronesische Sprachen (Andere)
languages.or=Orija
-languages.man=Mandingo
+languages.man=Manding-Sprache
languages.smj=Lule-Lappisch
languages.smi=Lappisch
languages.mak=Makassarisch
languages.om=Oromo
languages.mai=Maithili
languages.oj=Ojibwa-Sprache
-languages.mag=Magahi
+languages.mag=Khotta
languages.mad=Maduresisch
languages.sma=S\u00fcd-Samisch
languages.oc=Okzitanisch
-languages.nso=Sotho (Nord)
-languages.btk=Batak
+languages.nso=Sotho-Sprache (Nord)
+languages.btk=Batak (Indonesien)
languages.myv=Erzya
languages.dgr=Dogrib
languages.ny=Chewa-Sprache
languages.myn=Maya-Sprachen
languages.nv=Navajo-Sprache
-languages.kmb=Kimbundu
+languages.kmb=Kimbundu-Sprache
languages.nr=Ndebele-Sprache (S\u00fcd)
languages.gmh=Mittelhochdeutsch
languages.no=Norwegisch
@@ -1158,10 +724,10 @@ languages.sla=Slawische Sprachen (Andere)
languages.ne=Nepalesisch
languages.nd=Ndebele-Sprache (Nord)
languages.cmc=Cham-Sprachen
-languages.tet=Tetum
+languages.tet=Tetum-Sprache
languages.nb=Norwegisch Bokm\u00e5l
languages.na=Nauruisch
-languages.ter=Tereno
+languages.ter=Tereno-Sprache
languages.tem=Temne
languages.my=Birmanisch
languages.lez=Lesgisch
@@ -1171,21 +737,21 @@ languages.ms=Malaiisch
languages.mr=Marathi
languages.fro=Altfranz\u00f6sisch
languages.mo=Moldauisch
-languages.frm=Mittelfranz\u00f6sisch
languages.mn=Mongolisch
-languages.jrb=J\u00fcdisch-Arabisch
+languages.frm=Mittelfranz\u00f6sisch
languages.ml=Malayalam
+languages.jrb=J\u00fcdisch-Arabisch
languages.mk=Mazedonisch
languages.mi=Maori
languages.mh=Marschallesisch
languages.mg=Madagassisch
languages.mwr=Marwari
-languages.bra=Braj
-languages.den=Slave
+languages.bra=Braj-Bhakha
languages.lv=Lettisch
+languages.den=Slave (Athapaskische Sprachen)
languages.lu=Luba
-languages.del=Delaware
languages.lt=Litauisch
+languages.del=Delaware-Sprache
languages.lo=Laotisch
languages.ln=Lingala
languages.li=Limburgisch
@@ -1209,23 +775,23 @@ languages.kn=Kannada
languages.km=Kambodschanisch
languages.kl=Gr\u00f6nl\u00e4ndisch
languages.kk=Kasachisch
-languages.rom=Romany
+languages.rom=Zigeunersprache
languages.kj=Kwanyama
languages.sid=Sidamo
languages.ki=Kikuyu-Sprache
languages.kg=Kongo
languages.non=Altnordisch
languages.ka=Georgisch
-languages.mus=Creek
-languages.roa=Romance (Other)
+languages.mus=Muskogee-Sprachen
+languages.roa=Romanische Sprachen (Andere)
languages.nog=Nogai
languages.mun=Munda-Sprachen
languages.mul=Polyglott
languages.jv=Javanisch
languages.gil=Gilbertesisch
-languages.znd=Zande
+languages.znd=Zande-Sprache
languages.shn=Schan-Sprache
-languages.fon=Fon
+languages.fon=Fon-Sprache
languages.xal=Kalm\u00fcckisch
languages.aus=Australische Sprachen
languages.kho=Sakisch
@@ -1238,47 +804,47 @@ languages.iu=Inukitut
languages.pap=Papiamento
languages.it=Italienisch
languages.sgn=Geb\u00e4rdensprache
+languages.kha=Khasi-Sprache
languages.is=Isl\u00e4ndisch
-languages.kha=Khasi
languages.chr=Cherokee
-languages.pam=Pampanga
+languages.pam=Pampanggan-Sprache
languages.pal=Mittelpersisch
languages.chp=Chipewyan
-languages.io=Ido
languages.cho=Choctaw
+languages.io=Ido-Sprache
languages.chn=Chinook
languages.chm=Tscheremissisch
languages.tyv=Tuwinisch
-languages.bnt=Bantu
-languages.pag=Pangasinan
-languages.ik=Inupiak
+languages.bnt=Bantusprachen (Andere)
+languages.pag=Pangasinan-Sprache
languages.chk=Trukesisch
-languages.ii=Sichuan Yi
+languages.ik=Inupiak
languages.haw=Hawaiianisch
-languages.lam=Banjari
-languages.ig=Igbo-Sprache
+languages.ii=Sichuan Yi
+languages.lam=Lamba-Sprache
languages.chg=Tschagataisch
+languages.ig=Igbo-Sprache
languages.sga=Altirisch
languages.paa=Papuasprachen (Andere)
languages.ie=Interlingue
languages.id=Indonesisch
languages.lah=Lahnda
+languages.chb=Chibcha-Sprachen
languages.day=Dajak
-languages.chb=Chibcha
languages.ia=Interlingua
-languages.lad=Ladino
-languages.hz=Herero-Sprache
-languages.hai=Haida
+languages.lad=Judenspanisch
languages.dar=Darginisch
+languages.hai=Haida-Sprache
+languages.hz=Herero-Sprache
languages.hy=Armenisch
languages.ath=Athapaskische Sprachen
languages.hu=Ungarisch
languages.ht=Kreolisch
-languages.dak=Dakota
+languages.dak=Dakota-Sprache
languages.hr=Kroatisch
languages.ho=Hiri-Motu
languages.hi=Hindi
-languages.dyu=Dyula
+languages.dyu=Dyula-Sprache
languages.he=Hebr\u00e4isch
languages.ast=Asturianisch
languages.ha=Hausa
@@ -1290,20 +856,20 @@ languages.sel=Selkupisch
languages.iro=Irokesische Sprachen
languages.gn=Guarani
languages.gl=Galizisch
-languages.arw=Arawak
-languages.gez=Geez
-languages.art=Kunstsprachen (Andere)
+languages.arw=Arawak-Sprachen
languages.gd=Schottisch-G\u00e4lisch
-languages.ira=Iranisch
+languages.art=Kunstsprachen (Andere)
+languages.gez=Geez
+languages.ira=Iranische Sprachen (Andere)
languages.ga=Irisch
languages.arp=Arapaho-Sprache
languages.arn=Araukanisch
languages.fy=Friesisch
-languages.bla=Siksika
+languages.bla=Blackfoot-Sprache
languages.gem=Germanische Sprachen (Andere)
-languages.ypk=Yupik-Sprachen
-languages.arc=Aram\u00e4isch
+languages.ypk=Yupik-Sprache
languages.fr=Franz\u00f6sisch
+languages.arc=Aram\u00e4isch
languages.fo=F\u00e4r\u00f6isch
languages.cel=Keltische Sprachen (Andere)
languages.fj=Fidschianisch
@@ -1320,82 +886,82 @@ languages.eo=Esperanto
languages.en=Englisch
languages.el=Griechisch
languages.tut=Altaische Sprachen (Andere)
-languages.niu=Niue
+languages.niu=Niue-Sprache
languages.tup=Tupi-Sprachen
languages.ee=Ewe-Sprache
-languages.tum=Tumbuka
-languages.mos=Mossi
+languages.tum=Tumbuka-Sprache
+languages.mos=Mossi-Sprache
languages.dz=Bhutanisch
-languages.nic=Nigerkordofanische Sprachen
-languages.lus=Lushai
-languages.fiu=Finnougrische Sprachen (Andere)
+languages.nic=Nigerkordofanische Sprachen (Andere)
languages.dv=Maledivisch
-languages.nia=Nias
-languages.moh=Mohawk
-languages.luo=Luo
-languages.lun=Lunda
-languages.apa=Apachen-Sprachen
-languages.lui=Luiseno
+languages.fiu=Finnougrische Sprachen (Andere)
+languages.lus=Lushai-Sprache
+languages.nia=Nias-Sprache
+languages.moh=Mohawk-Sprache
+languages.luo=Luo-Sprache
+languages.lun=Lunda-Sprache
+languages.apa=Apachen-Sprache
+languages.lui=Luiseno-Sprache
languages.hup=Hupa
-languages.bin=Bini
+languages.bin=Bini-Sprache
languages.de=Deutsch
languages.lua=Luba-Lulua
-languages.bik=Bikol
-languages.was=Washo
+languages.bik=Bikol-Sprache
+languages.was=Washo-Sprache
languages.und=Sprache nicht ermittelt
languages.war=Waray
languages.da=D\u00e4nisch
languages.dum=Mittelniederl\u00e4ndisch
-languages.wal=Walamo
-languages.mno=Manobo-Sprachen
-languages.wak=Wakash-Sprachen
+languages.wal=Walamo-Sprache
+languages.mno=Manobo-Sprache
+languages.wak=Wakashanisch
languages.sat=Santali
languages.cy=Kymrisch
-languages.sas=Sassak
-languages.kbd=Kabardinisch
+languages.sas=Sasak
languages.cv=Tschuwaschisch
+languages.kbd=Kabardinisch
languages.cu=Kirchenslawisch
-languages.mni=Manipuri
+languages.mni=Meithei-Sprache
languages.cs=Tschechisch
languages.sam=Samaritanisch
languages.cr=Cree
-languages.sal=Salish-Sprachen
+languages.sal=Salish-Sprache
languages.dua=Duala
languages.co=Korsisch
languages.sai=Indianersprachen, S\u00fcdamerika (Andere)
languages.mnc=Mandschurisch
languages.sah=Jakutisch
-languages.kaw=Altjavanisch
+languages.gba=Gbaya-Sprache
languages.inh=Ingush
-languages.gba=Gbaya
-languages.sad=Sandawe
+languages.kaw=Kawi
+languages.sad=Sandawe-Sprache
languages.ch=Chamorro-Sprache
-languages.ine=Indogermanische Sprachen (Andere)
languages.bho=Bhodschpuri
+languages.ine=Indogermanische Sprachen (Andere)
languages.enm=Mittelenglisch
-languages.kar=Karenisch
-languages.inc=Indoarische Sprachen
languages.ce=Tschetschenisch
+languages.inc=Indoarische Sprachen (Andere)
+languages.kar=Karenisch
languages.gay=Gayo
languages.ca=Katalanisch
-languages.umb=Umbundu
+languages.umb=Mbundu-Sprache
languages.syr=Syrisch
languages.kam=Kamba
-languages.tsi=Tsimshian
+languages.tsi=Tsimshian-Sprache
languages.ang=Altenglisch
-languages.kac=Kachin
languages.cau=Kaukasische Sprachen (Andere)
+languages.kac=Kachin-Sprache
languages.kab=Kabylisch
-languages.kaa=Karakalpakisch
languages.bs=Bosnisch
-languages.car=Karibische Sprachen
+languages.kaa=Karakalpakisch
languages.br=Bretonisch
+languages.car=Karibische Sprachen
languages.bo=Tibetisch
languages.bn=Bengalisch
languages.bm=Bambara-Sprache
-languages.gaa=Ga
-languages.cai=Indianersprachen, Zentralamerika (Andere)
+languages.gaa=Ga-Sprache
languages.bi=Bislama
+languages.cai=Indianersprachen, Zentralamerika (Andere)
languages.bh=Biharisch
languages.bg=Bulgarisch
languages.be=Wei\u00dfrussisch
@@ -1409,10 +975,10 @@ languages.az=Aserbaidschanisch
languages.ay=Aymar\u00e1-Sprache
languages.av=Awarisch
languages.as=Assamesisch
-languages.dsb=Niedersorbisch
languages.ar=Arabisch
-languages.ilo=Iloko
+languages.dsb=Niedersorbisch
languages.elx=Elamisch
+languages.ilo=Ilokano-Sprache
languages.zh=Chinesisch
languages.an=Aragonesisch
languages.pra=Prakrit
@@ -1427,12 +993,12 @@ languages.aa=Afar
languages.yo=Joruba
languages.alg=Algonkin-Sprachen
languages.ale=Aleutisch
-languages.mkh=Mon-Khmer-Sprachen
+languages.mkh=Mon-Khmer-Sprachen (Andere)
languages.yi=Jiddisch
languages.dra=Drawidische Sprachen (Andere)
-languages.ber=Berbersprachen
+languages.ber=Berbersprachen (Andere)
languages.nds=Niederdeutsch
-languages.bem=Bemba
+languages.bem=Bemba-Sprache
languages.bej=Bedauye
languages.tpi=Neumelanesisch
variants.POSIX=Posix
diff --git a/resource/gnu/java/locale/LocaleInformation_de_CH.properties b/resource/gnu/java/locale/LocaleInformation_de_CH.properties
index 9d4aa9948..9f3722bb2 100644
--- a/resource/gnu/java/locale/LocaleInformation_de_CH.properties
+++ b/resource/gnu/java/locale/LocaleInformation_de_CH.properties
@@ -8,8 +8,8 @@
decimalSeparator=.
groupingSeparator='
currencyFormat=\u00a4 #,##0.00;\u00a4-#,##0.00
-territories.MH=Marshall-Inseln
territories.BD=Bangladesh
+territories.MH=Marshall-Inseln
territories.DJ=Djibouti
territories.SB=Salomon-Inseln
territories.BW=Botswana
diff --git a/resource/gnu/java/locale/LocaleInformation_dv.properties b/resource/gnu/java/locale/LocaleInformation_dv.properties
index bbe3351c3..25153e2fd 100644
--- a/resource/gnu/java/locale/LocaleInformation_dv.properties
+++ b/resource/gnu/java/locale/LocaleInformation_dv.properties
@@ -8,7 +8,6 @@
zeroDigit=\u0660
percentFormat=#,##,##0%
currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
-currenciesDisplayName.MVR=MVR
currenciesSymbol.MVR=\u0783.
territories.MV=\u078b\u07a8\u0788\u07ac\u0780\u07a8 \u0783\u07a7\u0787\u07b0\u0796\u07ac
languages.dv=\u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0
diff --git a/resource/gnu/java/locale/LocaleInformation_dz.properties b/resource/gnu/java/locale/LocaleInformation_dz.properties
index f9633a36d..ba202d856 100644
--- a/resource/gnu/java/locale/LocaleInformation_dz.properties
+++ b/resource/gnu/java/locale/LocaleInformation_dz.properties
@@ -39,21 +39,21 @@ territories.CZ=\u0f45\u0f7a\u0f40\u0f0b\u0f62\u0f72\u0f0b\u0f54\u0f56\u0f0b\u0f6
territories.PA=\u0f54\u0f0b\u0f53\u0f0b\u0f58\u0f71
territories.SA=\u0f66\u0f60\u0f74\u0f0b\u0f51\u0f72\u0f0b\u0f68\u0f7a\u0f0b\u0f62\u0f0b\u0f66 \u0fa6\u0f72\u0f0b\u0f61
territories.CU=\u0f40\u0f72\u0f60\u0f74\u0f0b\u0f66\u0fa6
-territories.IT=\u0f68\u0f80\u0f4a\u0f0b\u0f63\u0f72
territories.FR=\u0f55\u0f62\u0f71\u0f53\u0f66\u0f72
+territories.IT=\u0f68\u0f80\u0f4a\u0f0b\u0f63\u0f72
territories.IS=\u0f68\u0f60\u0f72\u0f66\u0f72\u0f0b\u0f63\u0f7a\u0f53\u0f4c
territories.UZ=\u0f68\u0f74\u0f5b\u0f0b\u0f56\u0f7a\u0f0b\u0f40\u0f72\u0f66\u0f72\u0f0b\u0f4f\u0f71\u0f53
-territories.IR=\u0f68\u0f72\u0f0b\u0f62\u0f71\u0f53
territories.CN=\u0f62\u0f92\u0fb1\u0f0b\u0f58\u0f72
+territories.IR=\u0f68\u0f72\u0f0b\u0f62\u0f71\u0f53
territories.IQ=\u0f68\u0f72\u0f0b\u0f62\u0f40
territories.IN=\u0f62\u0f92\u0fb1\u0f0b\u0f42\u0f62
-territories.IL=\u0f68\u0f72\u0f5b\u0f0b\u0f62\u0f71\u0f7a\u0f63
territories.CH=\u0f66\u0f74\u0f60\u0f72\u0f4a\u0f0b\u0f5b\u0f62\u0f0b\u0f63\u0f7a\u0f53
+territories.IL=\u0f68\u0f72\u0f5b\u0f0b\u0f62\u0f71\u0f7a\u0f63
territories.US=\u0f61\u0f74\u0f0b\u0f53\u0f60\u0f72\u0f4a\u0f7a\u0f4a\u0f0b\u0f66\u0f72\u0f0b\u0f4a\u0f7a\u0f66\u0f72
territories.FI=\u0f55\u0f72\u0f53\u0f0b\u0f63\u0f7a\u0f53\u0f4c
territories.LK=\u0f64\u0fb2\u0f71\u0f80\u0f0b\u0f63\u0f44\u0f40
-territories.IE=\u0f68\u0f60\u0f72\u0f62\u0f72\u0f0b\u0f63\u0f7a\u0f53\u0f4c
territories.CA=\u0f40\u0f7a\u0f0b\u0f53\u0f0b\u0f4c
+territories.IE=\u0f68\u0f60\u0f72\u0f62\u0f72\u0f0b\u0f63\u0f7a\u0f53\u0f4c
territories.LB=\u0f63\u0f7a\u0f0b\u0f56\u0f71\u0f0b\u0f53\u0f71\u0f7c\u0f53
territories.LA=\u0f63\u0f0b\u0f60\u0f7c\u0f66\u0f74
territories.BT=\u0f60\u0f56\u0fb2\u0f74\u0f42
@@ -69,8 +69,8 @@ territories.BH=\u0f56\u0f67\u0f0b\u0f62\u0f7a\u0f53
territories.ZW=\u0f5b\u0f72\u0f58\u0f0b\u0f56\u0f56\u0f0b\u0f5d\u0f7a
territories.NO=\u0f53\u0f7c\u0f0b\u0f5d\u0f7a
territories.HK=\u0f67\u0f7c\u0f44\u0f0b\u0f40\u0f7c\u0f44
-territories.EG=\u0f68\u0f72\u0f0b\u0f47\u0f72\u0f54\u0f4a
territories.BE=\u0f56\u0f7a\u0f63\u0f0b\u0f47\u0f72\u0f61\u0f58
+territories.EG=\u0f68\u0f72\u0f0b\u0f47\u0f72\u0f54\u0f4a
territories.NL=\u0f53\u0f7a\u0f0b\u0f51\u0f62\u0f0b\u0f63\u0f7a\u0f53\u0f4c\u0f66\u0f72
territories.BD=\u0f56\u0f44\u0f92\u0f0b\u0f63\u0f0b\u0f51\u0f7a\u0f64
territories.KH=\u0f40\u0f58\u0f0b\u0f56\u0f7c\u0f0b\u0f4c\u0f72\u0f0b\u0f61
@@ -106,8 +106,8 @@ languages.mn=\u0f66\u0f7c\u0f42\u0f0b\u0f54\u0f7c\u0f60\u0f72\u0f0b\u0f41
languages.ml=\u0f58\u0f0b\u0f63\u0f0b\u0f61\u0f0b\u0f63\u0f58
languages.de=\u0f47\u0f71\u0f62\u0f0b\u0f58\u0f71\u0f53
languages.pi=\u0f54\u0f0b\u0f63\u0f72
-languages.da=\u0f4c\u0f7a\u0f0b\u0f53\u0f72\u0f64
languages.art=\u0f56\u0f5f\u0f7c\u0f0b\u0f56\u0f5f\u0f7c\u0f5d (\u0f42\u0f5e\u0f53)
+languages.da=\u0f4c\u0f7a\u0f0b\u0f53\u0f72\u0f64
languages.si=\u0f66\u0f72\u0f53\u0f0b\u0f67\u0f0b\u0f63\u0f72\u0f66\u0f72
languages.ga=\u0f68\u0f60\u0f72\u0f0b\u0f62\u0f72\u0f64
languages.mni=\u0f58\u0f0b\u0f53\u0f72\u0f0b\u0f54\u0f74\u0f0b\u0f62\u0f72
@@ -116,25 +116,25 @@ languages.pa=\u0f54\u0f71\u0f53\u0f0b\u0f47\u0f0b\u0f56\u0f72
languages.mnc=\u0f58\u0f71\u0f53\u0f0b\u0f45\u0f74
languages.sa=\u0f66\u0f7e\u0f66\u0f90\u0fb2\u0f80\u0f4f
languages.cs=\u0f45\u0f7a\u0f40
-languages.it=\u0f68\u0f72\u0f0b\u0f4a\u0f0b\u0f63\u0f72\u0f0b\u0f62\u0f53
languages.fr=\u0f55\u0f7a\u0f0b\u0f62\u0f7a\u0f53\u0f46\u0f7a
+languages.it=\u0f68\u0f72\u0f0b\u0f4a\u0f0b\u0f63\u0f72\u0f0b\u0f62\u0f53
languages.him=\u0f67\u0f72\u0f0b\u0f58\u0f0b\u0f45\u0f0b\u0f63\u0f72
languages.ru=\u0f62\u0f0b\u0f64\u0f72\u0f0b\u0f61\u0f53
languages.or=\u0f68\u0f7c\u0f0b\u0f62\u0f72\u0f0b\u0f61
languages.lo=\u0f63\u0f60\u0f7c
languages.ur=\u0f68\u0f74\u0f62\u0f0b\u0f51\u0f74
languages.fa=\u0f54\u0f62\u0f0b\u0f64\u0f72\u0f0b\u0f61\u0f53
-languages.grc=\u0f42\u0f72\u0f62\u0f72\u0f40, \u0f66\u0f94\u0f0b\u0f51\u0f74\u0f66\u0f0b\u0f40\u0fb1\u0f72 (\u0f21\u0f24\u0f25\u0f23)
languages.es=\u0f66\u0f72\u0f54\u0f7a\u0f0b\u0f53\u0f72\u0f64
+languages.grc=\u0f42\u0f72\u0f62\u0f72\u0f40, \u0f66\u0f94\u0f0b\u0f51\u0f74\u0f66\u0f0b\u0f40\u0fb1\u0f72 (\u0f21\u0f24\u0f25\u0f23)
languages.bo=\u0f56\u0f7c\u0f51\u0f0b\u0f41
languages.bn=\u0f56\u0f7a\u0f44\u0f92\u0f0b\u0f63\u0f72
languages.ks=\u0f40\u0f7a\u0f64\u0f0b\u0f58\u0f72\u0f0b\u0f62\u0f72
languages.en=\u0f68\u0f72\u0f44\u0f0b\u0f63\u0f72\u0f64
-languages.el=\u0f42\u0f72\u0f62\u0f72\u0f40
languages.inc=\u0f68\u0f72\u0f53\u0f0b\u0f4c\u0f72\u0f40 (\u0f42\u0f5e\u0f53)
+languages.el=\u0f42\u0f72\u0f62\u0f72\u0f40
languages.ko=\u0f40\u0f7c\u0f0b\u0f62\u0f72\u0f61\u0f53
-languages.kn=\u0f40\u0f0b\u0f53\u0f0b\u0f4c
languages.bh=\u0f56\u0f72\u0f0b\u0f67\u0f0b\u0f63\u0f72
+languages.kn=\u0f40\u0f0b\u0f53\u0f0b\u0f4c
languages.no=\u0f53\u0f7c\u0f62\u0f0b\u0f5d\u0f72\u0f0b\u0f47\u0f72\u0f0b\u0f61\u0f53
languages.km=\u0f41\u0f7a\u0f0b\u0f58\u0f62
languages.hi=\u0f67\u0f72\u0f53\u0f0b\u0f51\u0f72
diff --git a/resource/gnu/java/locale/LocaleInformation_el.properties b/resource/gnu/java/locale/LocaleInformation_el.properties
index 80dfca181..f8b841a60 100644
--- a/resource/gnu/java/locale/LocaleInformation_el.properties
+++ b/resource/gnu/java/locale/LocaleInformation_el.properties
@@ -5,1057 +5,251 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
-localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0399\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.BOV=Mvdol \u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.XAU=\u03a7\u03c1\u03c5\u03c3\u03cc\u03c2
-currenciesDisplayName.FOK=Kronur \u039d\u03ae\u03c3\u03c9\u03bd Faeroe
-currenciesDisplayName.LBP=\u039b\u03af\u03c1\u03b1 \u039b\u03b9\u03b2\u03ac\u03bd\u03bf\u03c5
-currenciesDisplayName.EUR=\u0395\u03c5\u03c1\u03ce
-currenciesDisplayName.VND=Dong \u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
-currenciesDisplayName.TZS=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u03a4\u03b1\u03bd\u03b6\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.BOP=\u03a0\u03ad\u03c3\u03bf \u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.KHR=Riel \u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7\u03c2
-currenciesDisplayName.XAM=\u0391\u03c3\u03b9\u03b1\u03c4\u03b9\u03ba\u03ae \u039d\u03bf\u03bc\u03b9\u03c3\u03bc\u03b1\u03c4\u03b9\u03ba\u03ae \u039c\u03bf\u03bd\u03ac\u03b4\u03b1
-currenciesDisplayName.KHO=\u03a0\u03b1\u03bb\u03b1\u03b9\u03cc Riel \u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7\u03c2
-currenciesDisplayName.ZMP=\u039b\u03af\u03c1\u03b1 \u0396\u03ac\u03bc\u03c0\u03b9\u03b1\u03c2
-currenciesDisplayName.AUP=\u039b\u03af\u03c1\u03b1 \u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.XAF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf BEAC CFA
-currenciesDisplayName.MTP=\u039b\u03af\u03c1\u03b1 \u039c\u03ac\u03bb\u03c4\u03b1\u03c2
-currenciesDisplayName.GHR=\u0391\u03bd\u03b1\u03c4\u03b9\u03bc\u03b7\u03bc\u03ad\u03bd\u03bf Cedi \u0393\u03ba\u03ac\u03bd\u03b1\u03c2
-currenciesDisplayName.ZMK=Kwacha \u0396\u03ac\u03bc\u03c0\u03b9\u03b1\u03c2
-currenciesDisplayName.XAD=\u039c\u03bf\u03bd\u03ac\u03b4\u03b1 \u039b\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd \u0391\u03c3\u03b9\u03b1\u03c4\u03b9\u03ba\u03bf\u03cd \u0394\u03b7\u03bd\u03b1\u03c1\u03af\u03bf\u03c5
-currenciesDisplayName.GHP=\u039b\u03af\u03c1\u03b1 \u0393\u03ba\u03ac\u03bd\u03b1\u03c2
-currenciesDisplayName.GHO=\u03a0\u03b1\u03bb\u03b1\u03b9\u03cc Cedi \u0393\u03ba\u03ac\u03bd\u03b1\u03c2
-currenciesDisplayName.MTL=\u039b\u03b9\u03c1\u03ad\u03c4\u03b1 \u039c\u03ac\u03bb\u03c4\u03b1\u03c2
-currenciesDisplayName.AUD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.USS=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0397\u03a0\u0391 (\u038a\u03b4\u03b9\u03b1 \u0397\u03bc\u03ad\u03c1\u03b1)
-currenciesDisplayName.ITL=\u039b\u03b9\u03c1\u03ad\u03c4\u03b1 \u0399\u03c4\u03b1\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.USN=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0397\u03a0\u0391 (\u0395\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u0397\u03bc\u03ad\u03c1\u03b1)
-currenciesDisplayName.GHC=Cedi \u0393\u03ba\u03ac\u03bd\u03b1\u03c2
-currenciesDisplayName.SGD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u03a3\u03b9\u03b3\u03ba\u03b1\u03c0\u03bf\u03cd\u03c1\u03b7\u03c2
-currenciesDisplayName.PAB=\u039c\u03c0\u03b1\u03bb\u03bc\u03c0\u03cc\u03b1 \u03a0\u03b1\u03bd\u03b1\u03bc\u03ac
-currenciesDisplayName.LAK=Kip \u039b\u03ac\u03bf\u03c2
-currenciesDisplayName.CHF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0395\u03bb\u03b2\u03b5\u03c4\u03af\u03b1\u03c2
-currenciesDisplayName.ATS=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u0391\u03c5\u03c3\u03c4\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.USD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0397\u03a0\u0391
-currenciesDisplayName.ETD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1\u03c2
-currenciesDisplayName.BND=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf Brunei
-currenciesDisplayName.JMP=\u039b\u03af\u03c1\u03b1 \u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1\u03c2
-currenciesDisplayName.ETB=Birr \u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1\u03c2
-currenciesDisplayName.DZG=Germinal \u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.DZF=\u039d\u03ad\u03bf \u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.DZD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.PYG=\u0393\u03ba\u03bf\u03c5\u03b1\u03c1\u03b1\u03bd\u03af \u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7\u03c2
-currenciesDisplayName.LYP=\u039b\u03af\u03c1\u03b1 \u039b\u03b9\u03b2\u03cd\u03b7\u03c2
-currenciesDisplayName.JMD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1\u03c2
-currenciesDisplayName.ISK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.ESP=\u03a0\u03b5\u03c3\u03ad\u03c4\u03b1 \u0399\u03c3\u03c0\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.BMP=\u039b\u03af\u03c1\u03b1 \u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03c9\u03bd
-currenciesDisplayName.LYD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u039b\u03b9\u03b2\u03cd\u03b7\u03c2
-currenciesDisplayName.LYB=\u039b\u03af\u03c1\u03b1 \u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ae\u03c2 \u03a3\u03c4\u03c1\u03b1\u03c4\u03b9\u03c9\u03c4\u03b9\u03ba\u03ae\u03c2 \u0395\u03be\u03bf\u03c5\u03c3\u03af\u03b1\u03c2 \u039b\u03b9\u03b2\u03cd\u03b7\u03c2
-currenciesDisplayName.BMD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03c9\u03bd
-currenciesDisplayName.NLG=\u0393\u03ba\u03af\u03bb\u03bd\u03c4\u03b1 \u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.MRO=Ouguiya \u039c\u03b1\u03c5\u03c1\u03b9\u03c4\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.IRR=Rial \u0399\u03c1\u03ac\u03ba
-currenciesDisplayName.SEK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u03a3\u03bf\u03c5\u03b7\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.ERN=Eritrean Nakfa
-currenciesDisplayName.KES=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u039a\u03ad\u03bd\u03c5\u03b1\u03c2
-currenciesDisplayName.CFF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039a\u03b5\u03bd\u03c4\u03c1\u03b9\u03ba\u03ae\u03c2 \u0391\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae\u03c2 \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1\u03c2 CFA
-currenciesDisplayName.ARS=\u03a0\u03ad\u03c3\u03bf \u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae\u03c2
-currenciesDisplayName.ARP=\u03a0\u03ad\u03c3\u03bf \u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae\u03c2 (1983-1985)
-currenciesDisplayName.ARM=\u0395\u03b8\u03bd\u03b9\u03ba\u03cc \u039d\u03cc\u03bc\u03b9\u03c3\u03bc\u03b1 \u03a0\u03ad\u03c3\u03bf \u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae\u03c2
-currenciesDisplayName.TWD=\u039d\u03ad\u03bf \u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u03a4\u03b1\u03ca\u03b2\u03ac\u03bd
-currenciesDisplayName.SDP=\u039b\u03af\u03c1\u03b1 \u03a3\u03bf\u03c5\u03b4\u03ac\u03bd
-currenciesDisplayName.GEL=Lari \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1\u03c2
-currenciesDisplayName.GEK=Kupon Larit \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1\u03c2
-currenciesDisplayName.MQF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039c\u03b1\u03c1\u03c4\u03b9\u03bd\u03af\u03ba\u03b1\u03c2
-currenciesDisplayName.FKP=\u039b\u03af\u03c1\u03b1 \u039d\u03b7\u03c3\u03b9\u03ce\u03bd \u03a6\u03ce\u03bb\u03ba\u03bb\u03b1\u03bd\u03c4
-currenciesDisplayName.ARA=Austral \u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae\u03c2
-currenciesDisplayName.SDD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u03a3\u03bf\u03c5\u03b4\u03ac\u03bd
-currenciesDisplayName.IQD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0399\u03c1\u03ac\u03ba
-currenciesDisplayName.TVD=Tuvalu \u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf
-currenciesDisplayName.SCR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u03a3\u03b5\u03cb\u03c7\u03ad\u03bb\u03b5\u03c2
-currenciesDisplayName.LVR=\u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 \u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.FJP=\u039b\u03af\u03c1\u03b1 \u03a6\u03af\u03c4\u03b6\u03b9
-currenciesDisplayName.LVL=Lats \u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.CDL=Congolese \u0396\u03b1\u0390\u03c1
-currenciesDisplayName.CDG=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1\u03c2 \u039a\u03bf\u03bd\u03b3\u03ba\u03cc
-currenciesDisplayName.CDF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Congolais \u039a\u03bf\u03bd\u03b3\u03ba\u03cc
-currenciesDisplayName.FJD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u03a6\u03af\u03c4\u03b6\u03b9
-currenciesDisplayName.NIO=\u03a7\u03c1\u03c5\u03c3\u03ae \u039a\u03cc\u03c1\u03b4\u03bf\u03b2\u03b1 \u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1\u03c2
-currenciesDisplayName.MOP=Pataca \u039c\u03b1\u03ba\u03ac\u03bf
-currenciesDisplayName.NIG=\u03a7\u03c1\u03c5\u03c3\u03ae \u039a\u03cc\u03c1\u03b4\u03bf\u03b2\u03b1 \u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1\u03c2
-currenciesDisplayName.NIC=\u039a\u03cc\u03c1\u03b4\u03bf\u03b2\u03b1 \u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1\u03c2
-currenciesDisplayName.XTR=\u039c\u03b5\u03c4\u03b1\u03b2\u03b9\u03b2\u03ac\u03c3\u03b9\u03bc\u03bf \u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 COMECON
-currenciesDisplayName.FIN=\u039c\u03ac\u03c1\u03ba\u03bf \u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2 (1860-1962)
-currenciesDisplayName.FIM=\u039c\u03ac\u03c1\u03ba\u03bf \u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.SBD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039d\u03ae\u03c3\u03c9\u03bd \u03a3\u03bf\u03bb\u03bf\u03bc\u03ce\u03bd\u03c4\u03bf\u03c2
-currenciesDisplayName.LUF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u03cd\u03c1\u03b3\u03bf\u03c5
-currenciesDisplayName.TTO=\u03a0\u03b1\u03bb\u03b1\u03b9\u03cc \u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u03a4\u03c1\u03b9\u03bd\u03b9\u03b4\u03ac\u03b4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf
-currenciesDisplayName.AOS=\u0395\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u0391\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1\u03c2
-currenciesDisplayName.AOR=Kwanza Reajustado \u0391\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1\u03c2 (1995-1999)
-currenciesDisplayName.MNT=Tugrik \u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.HUF=\u03a6\u03b9\u03bf\u03c1\u03af\u03bd\u03b9 \u039f\u03c5\u03b3\u03b3\u03b1\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.BIF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Burundi
-currenciesDisplayName.AON=\u039d\u03ad\u03b1 Kwanza \u0391\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1\u03c2 (1990-2000)
-currenciesDisplayName.AOK=Kwanza \u0391\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1\u03c2 (1977-1990)
-currenciesDisplayName.TTD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u03a4\u03c1\u03b9\u03bd\u03b9\u03b4\u03ac\u03b4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf
-currenciesDisplayName.SZL=Lilangeni \u0396\u03bf\u03c5\u03b1\u03b6\u03b9\u03bb\u03ac\u03bd\u03b4\u03b7
-currenciesDisplayName.NHF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039d\u03ad\u03c9\u03bd \u0395\u03b2\u03c1\u03af\u03b4\u03c9\u03bd CFP
-currenciesDisplayName.GBP=\u039b\u03af\u03c1\u03b1 \u03a3\u03c4\u03b5\u03c1\u03bb\u03af\u03bd\u03b1 \u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.LTT=Talonas \u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.INR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u0399\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.PTE=\u0395\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.AOA=Kwanza \u0391\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1\u03c2
-currenciesDisplayName.PTC=Conto \u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.LTL=Lita \u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.KZT=Tenge \u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd
-currenciesDisplayName.KZR=\u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 \u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd
-currenciesDisplayName.VGD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ce\u03bd \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03c9\u03bd \u039d\u03ae\u03c3\u03c9\u03bd
-currenciesDisplayName.NGP=\u039b\u03af\u03c1\u03b1 \u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.MMX=\u03a0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03ac \u039e\u03ad\u03bd\u03bf\u03c5 \u03a3\u03c5\u03bd\u03b1\u03bb\u03bb\u03ac\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c3\u03b5 \u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03b1, \u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1
-currenciesDisplayName.NGN=Naira \u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.HTG=Gourde \u0391\u03ca\u03c4\u03ae\u03c2
-currenciesDisplayName.SYP=\u039b\u03af\u03c1\u03b1 \u03a3\u03c5\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.PSP=\u039b\u03af\u03c1\u03b1 \u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03af\u03bd\u03b7\u03c2
-currenciesDisplayName.BHD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf Bahraini
-currenciesDisplayName.MMK=Kyat \u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1
-currenciesDisplayName.ANG=\u0393\u03ba\u03af\u03bb\u03bd\u03c4\u03b1 \u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ce\u03bd \u0391\u03bd\u03c4\u03b9\u03bb\u03bb\u03ce\u03bd
-currenciesDisplayName.CZK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u03a4\u03c3\u03ad\u03c7\u03b9\u03ba\u03b7\u03c2 \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1\u03c2
-currenciesDisplayName.IMP=\u039b\u03af\u03c1\u03b1 \u03a3\u03c4\u03b5\u03c1\u03bb\u03af\u03bd\u03b1 \u039d\u03ae\u03c3\u03bf\u03c5 Man
-currenciesDisplayName.BGX=\u03a0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03ac \u039e\u03ad\u03bd\u03bf\u03c5 \u03a3\u03c5\u03bd\u03b1\u03bb\u03bb\u03ac\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c3\u03b5 \u039b\u03b5\u03b2
-currenciesDisplayName.GAF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03ba\u03b1\u03bc\u03c0\u03cc\u03bd CFA
-currenciesDisplayName.BGO=\u039b\u03b5\u03b2 \u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1\u03c2 (1879-1952)
-currenciesDisplayName.BGN=\u039d\u03ad\u03bf \u039b\u03b5\u03b2 \u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.BGM=\u03a3\u03bf\u03c3\u03b9\u03b1\u03bb\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u039b\u03b5\u03b2 \u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.CAD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039a\u03b1\u03bd\u03b1\u03b4\u03ac
-currenciesDisplayName.BGL=\u039c\u03b5\u03c4\u03b1\u03bb\u03bb\u03b9\u03ba\u03cc \u039b\u03b5\u03b2 \u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.TRL=\u039b\u03af\u03c1\u03b1 \u03a4\u03bf\u03c5\u03c1\u03ba\u03af\u03b1\u03c2
-currenciesDisplayName.KYD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039d\u03ae\u03c3\u03c9\u03bd \u039a\u03ac\u03b9\u03bc\u03b1\u03bd
-currenciesDisplayName.CYP=\u039b\u03af\u03c1\u03b1 \u039a\u03cd\u03c0\u03c1\u03bf\u03c5
-currenciesDisplayName.ILS=\u039d\u03ad\u03bf Sheqel \u0399\u03c3\u03c1\u03b1\u03ae\u03bb
-currenciesDisplayName.GYD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1\u03c2
-currenciesDisplayName.AMD=Dram \u0391\u03c1\u03bc\u03b5\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.ILP=\u039b\u03af\u03c1\u03b1 \u0399\u03c3\u03c1\u03b1\u03ae\u03bb
-currenciesDisplayName.MLF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039c\u03b1\u03bb\u03af
-currenciesDisplayName.ILL=Sheqel \u0399\u03c3\u03c1\u03b1\u03ae\u03bb
-currenciesDisplayName.VEB=\u039c\u03c0\u03bf\u03bb\u03b9\u03b2\u03ac\u03bb \u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1\u03c2
-currenciesDisplayName.ALX=\u0391\u03bb\u03b2\u03b1\u03bd\u03b9\u03ba\u03ac \u03a0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03ac \u039e\u03ad\u03bd\u03bf\u03c5 \u03a3\u03c5\u03bd\u03b1\u03bb\u03bb\u03ac\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c3\u03b5 \u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03b1
-currenciesDisplayName.LRD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039b\u03b9\u03b2\u03b5\u03c1\u03af\u03b1\u03c2
-currenciesDisplayName.ALV=\u039b\u03b5\u03ba Valute \u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.HRK=Kuna \u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf
-currenciesDisplayName.REF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Reunion
-currenciesDisplayName.HRD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1\u03c2
-currenciesDisplayName.ALL=\u039b\u03b5\u03ba \u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.JEP=\u039b\u03af\u03c1\u03b1 \u03a3\u03c4\u03b5\u03c1\u03bb\u03af\u03bd\u03b1 \u03a5\u03b5\u03c1\u03c3\u03ad\u03b7\u03c2
-currenciesDisplayName.ALK=\u039b\u03b5\u03ba \u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1\u03c2 (1946-1961)
-currenciesDisplayName.MKN=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u03a0.\u0393.\u0394.\u039c. (1992-1993)
-currenciesDisplayName.VDP=Viet Minh Piastre Dong Viet \u0392\u03bf\u03c1\u03b5\u03af\u03bf\u03c5 \u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
-currenciesDisplayName.VDN=\u039d\u03ad\u03bf Dong \u0392\u03bf\u03c1\u03b5\u03af\u03bf\u03c5 \u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
-currenciesDisplayName.MKD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u03a0.\u0393.\u0394.\u039c.
-currenciesDisplayName.VDD=Piastre Dong Viet \u0392\u03bf\u03c1\u03b5\u03af\u03bf\u03c5 \u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
-currenciesDisplayName.TPP=Pataca \u03a4\u03b9\u03bc\u03cc\u03c1
-currenciesDisplayName.XPF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf CFP
-currenciesDisplayName.BEL=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0392\u03b5\u03bb\u03b3\u03af\u03bf\u03c5 (\u03bf\u03b9\u03ba\u03bf\u03bd\u03bf\u03bc\u03b9\u03ba\u03cc)
-currenciesDisplayName.GWP=\u03a0\u03ad\u03c3\u03bf Guinea-Bissau
-currenciesDisplayName.KWD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u039a\u03bf\u03c5\u03b2\u03ad\u03b9\u03c4
-currenciesDisplayName.GWM=\u0393\u03ba\u03b9\u03bd\u03ad\u03b1 Mil Reis \u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.BEF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0392\u03b5\u03bb\u03b3\u03af\u03bf\u03c5
-currenciesDisplayName.TPE=\u0395\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u03a4\u03b9\u03bc\u03cc\u03c1
-currenciesDisplayName.BEC=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0392\u03b5\u03bb\u03b3\u03af\u03bf\u03c5 (\u03bc\u03b5\u03c4\u03b1\u03c4\u03c1\u03ad\u03c8\u03b9\u03bc\u03bf)
-currenciesDisplayName.GWE=\u0393\u03ba\u03b9\u03bd\u03ad\u03b1 \u0395\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.SVC=Colon \u0395\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1
-currenciesDisplayName.CWG=\u0393\u03ba\u03af\u03bb\u03bd\u03c4\u03b1 Curacao
-currenciesDisplayName.BDT=\u03a4\u03ac\u03ba\u03b1 \u039c\u03c0\u03b1\u03b3\u03ba\u03bb\u03b1\u03bd\u03c4\u03ad\u03c2
-currenciesDisplayName.TOS=\u039b\u03af\u03c1\u03b1 \u03a3\u03c4\u03b5\u03c1\u03bb\u03af\u03bd\u03b1 \u03a4\u03cc\u03bd\u03b3\u03ba\u03b1
-currenciesDisplayName.XOF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf BCEAO CFA
-currenciesDisplayName.SUR=\u03a3\u03bf\u03b2\u03b9\u03b5\u03c4\u03b9\u03ba\u03cc \u03a1\u03bf\u03cd\u03b2\u03bb\u03b9
-currenciesDisplayName.SUN=\u039d\u03ad\u03bf \u03a3\u03bf\u03b2\u03b9\u03b5\u03c4\u03b9\u03ba\u03cc \u03a1\u03bf\u03cd\u03b2\u03bb\u03b9
-currenciesDisplayName.NCF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Germinal \u039d\u03ad\u03b1\u03c2 \u039a\u03b1\u03bb\u03b7\u03b4\u03bf\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.CVE=\u0395\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf\u03c5 \u0391\u03ba\u03c1\u03c9\u03c4\u03b7\u03c1\u03af\u03bf\u03c5
-currenciesDisplayName.XNF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ce\u03bd \u0391\u03bd\u03c4\u03b9\u03bb\u03bb\u03ce\u03bd CFA
-currenciesDisplayName.ZAR=\u03a1\u03b1\u03bd\u03c4 \u039d\u03cc\u03c4\u03b9\u03b1\u03c2 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae\u03c2
-currenciesDisplayName.DOP=\u03a0\u03ad\u03c3\u03bf \u0394\u03bf\u03bc\u03af\u03bd\u03b9\u03ba\u03bf\u03c5
-currenciesDisplayName.CUX=\u03a0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03ac \u039e\u03ad\u03bd\u03bf\u03c5 \u03a3\u03c5\u03bd\u03b1\u03bb\u03bb\u03ac\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 \u039a\u03bf\u03cd\u03b2\u03b1\u03c2
-currenciesDisplayName.ZAP=\u039b\u03af\u03c1\u03b1 \u039d\u03cc\u03c4\u03b9\u03b1\u03c2 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae\u03c2
-currenciesDisplayName.ZAL=\u03a1\u03b1\u03bd\u03c4 \u039d\u03cc\u03c4\u03b9\u03b1\u03c2 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae\u03c2 (\u03bf\u03b9\u03ba\u03bf\u03bd\u03bf\u03bc\u03b9\u03ba\u03cc)
-currenciesDisplayName.TND=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u03a4\u03c5\u03bd\u03b7\u03c3\u03af\u03b1\u03c2
-currenciesDisplayName.CUP=\u03a0\u03ad\u03c3\u03bf \u039a\u03bf\u03cd\u03b2\u03b1\u03c2
-currenciesDisplayName.GUF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Guiana \u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae\u03c2 \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1\u03c2
-currenciesDisplayName.UGX=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1\u03c2
-currenciesDisplayName.LNR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 Ceylon
-currenciesDisplayName.AIF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Affars \u03ba\u03b1\u03b9 Issas
-currenciesDisplayName.VAL=\u039b\u03b9\u03c1\u03ad\u03c4\u03b1 \u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03bf\u03cd
-currenciesDisplayName.UGS=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1\u03c2 (1966-1987)
-currenciesDisplayName.MHD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039d\u03ae\u03c3\u03c9\u03bd Marshall
-currenciesDisplayName.NZP=\u039b\u03af\u03c1\u03b1 \u039d\u03ad\u03b1\u03c2 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.WST=Tala \u0394\u03c5\u03c4\u03b9\u03ba\u03ae\u03c2 \u03a3\u03b1\u03bc\u03cc\u03b1
-currenciesDisplayName.WSP=\u039b\u03af\u03c1\u03b1 \u0394\u03c5\u03c4\u03b9\u03ba\u03ae\u03c2 \u03a3\u03b1\u03bc\u03cc\u03b1
-currenciesDisplayName.XMF=\u039d\u03ad\u03bf \u039c\u03b7\u03c4\u03c1\u03bf\u03c0\u03bf\u03bb\u03b9\u03c4\u03b9\u03ba\u03cc \u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03b1\u03bb\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.TMM=\u039c\u03b1\u03bd\u03ac\u03c4 \u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd
-currenciesDisplayName.GTQ=Quetzal \u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1
-currenciesDisplayName.NZD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039d\u03ad\u03b1\u03c2 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.SSP=\u039b\u03af\u03c1\u03b1 \u03a3\u03ba\u03c9\u03c4\u03af\u03b1\u03c2
-currenciesDisplayName.BBD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03ac\u03bd\u03c4\u03bf\u03c2
-currenciesDisplayName.NAD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1
-currenciesDisplayName.MGF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7\u03c2
-currenciesDisplayName.MGA=Ariary \u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7\u03c2
-currenciesDisplayName.EGP=\u039b\u03af\u03c1\u03b1 \u0391\u03b9\u03b3\u03cd\u03c0\u03c4\u03bf\u03c5
-currenciesDisplayName.BZH=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ae\u03c2 \u039f\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1\u03c2
-currenciesDisplayName.PLZ=\u0396\u03bb\u03cc\u03c4\u03c5 \u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1\u03c2 (1950-1995)
-currenciesDisplayName.BAN=\u039d\u03ad\u03bf \u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0392\u03bf\u03c3\u03bd\u03af\u03b1\u03c2-\u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7\u03c2
-currenciesDisplayName.PLX=\u03a0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03ac \u039e\u03ad\u03bd\u03bf\u03c5 \u03a3\u03c5\u03bd\u03b1\u03bb\u03bb\u03ac\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c3\u03b5 \u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03b1, \u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.BAM=\u039c\u03ac\u03c1\u03ba\u03bf \u0392\u03bf\u03c3\u03bd\u03af\u03b1\u03c2-\u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7\u03c2
-currenciesDisplayName.BZD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf Belize
-currenciesDisplayName.BAD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0392\u03bf\u03c3\u03bd\u03af\u03b1\u03c2-\u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7\u03c2
-currenciesDisplayName.PLN=\u0396\u03bb\u03cc\u03c4\u03c5 \u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.YER=Rial \u03a5\u03b5\u03bc\u03ad\u03bd\u03b7\u03c2
-currenciesDisplayName.SRG=\u0393\u03ba\u03af\u03bb\u03bd\u03c4\u03b1 \u03a3\u03bf\u03c5\u03c1\u03b9\u03bd\u03ac\u03bc
-currenciesDisplayName.CSK=\u03a3\u03ba\u03bb\u03b7\u03c1\u03ae \u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u03a4\u03c3\u03b5\u03c7\u03bf\u03c3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1\u03c2
-currenciesDisplayName.KRW=Won \u039d\u03cc\u03c4\u03b9\u03b1\u03c2 \u039a\u03bf\u03c1\u03ad\u03b1\u03c2
-currenciesDisplayName.BYR=\u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 \u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1\u03c2
-currenciesDisplayName.YEI=Imadi Riyal \u03a5\u03b5\u03bc\u03ad\u03bd\u03b7\u03c2
-currenciesDisplayName.BYL=\u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 \u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1\u03c2 (1992-1994)
-currenciesDisplayName.CSC=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u03a4\u03c3\u03b5\u03c7\u03bf\u03c3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1\u03c2
-currenciesDisplayName.KRO=\u03a0\u03b1\u03bb\u03b1\u03b9\u03cc Won \u039d\u03cc\u03c4\u03b9\u03b1\u03c2 \u039a\u03bf\u03c1\u03ad\u03b1\u03c2
-currenciesDisplayName.KRH=Hwan \u039d\u03cc\u03c4\u03b9\u03b1\u03c2 \u039a\u03bf\u03c1\u03ad\u03b1\u03c2
-currenciesDisplayName.BYB=\u039d\u03ad\u03bf \u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 \u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1\u03c2 (1994-1999)
-currenciesDisplayName.SQS=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.GRN=\u039d\u03ad\u03b1 \u0394\u03c1\u03b1\u03c7\u03bc\u03ae \u0395\u03bb\u03bb\u03ac\u03b4\u03b1\u03c2
-currenciesDisplayName.PKR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u03a0\u03b1\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
-currenciesDisplayName.ZWD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0396\u03b9\u03bc\u03c0\u03ac\u03bc\u03c0\u03bf\u03c5\u03b5
-currenciesDisplayName.LKR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u03a3\u03c1\u03b9 \u039b\u03ac\u03bd\u03ba\u03b1
-currenciesDisplayName.GRD=\u0394\u03c1\u03b1\u03c7\u03bc\u03ae \u0395\u03bb\u03bb\u03ac\u03b4\u03b1\u03c2
-currenciesDisplayName.IEP=\u039b\u03af\u03c1\u03b1 \u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.YDD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u03a5\u03b5\u03bc\u03ad\u03bd\u03b7\u03c2
-currenciesDisplayName.RWF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u03a1\u03bf\u03c5\u03ac\u03bd\u03c4\u03b1\u03c2
-currenciesDisplayName.CRC=Colon \u039a\u03cc\u03c3\u03c4\u03b1 \u03a1\u03af\u03ba\u03b1
-currenciesDisplayName.TJS=Somoni \u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
-currenciesDisplayName.TJR=\u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 \u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
-currenciesDisplayName.EEK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u0395\u03c3\u03b8\u03bf\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.GQP=\u03a0\u03b5\u03c3\u03ad\u03c4\u03b1 Guineana \u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae\u03c2 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1\u03c2
-currenciesDisplayName.MDR=\u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 Cupon \u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.HKD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u03a7\u03bf\u03bd\u03b3\u03ba \u039a\u03bf\u03bd\u03b3\u03ba
-currenciesDisplayName.DKK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u0394\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.MDL=\u039b\u03ad\u03b9 \u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.GQF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae\u03c2 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1\u03c2
-currenciesDisplayName.GQE=Ekwele Guineana \u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae\u03c2 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1\u03c2
-currenciesDisplayName.IDR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1\u03c2
-currenciesDisplayName.AED=\u039d\u03c4\u03b9\u03c1\u03ac\u03bc \u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ce\u03bd \u0395\u03bc\u03b9\u03c1\u03ac\u03c4\u03c9\u03bd
-currenciesDisplayName.KPW=Won \u0392\u03cc\u03c1\u03b5\u03b9\u03b1\u03c2 \u039a\u03bf\u03c1\u03ad\u03b1\u03c2
-currenciesDisplayName.IDN=\u039d\u03ad\u03b1 \u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1\u03c2
-currenciesDisplayName.BWP=Pula \u039c\u03c0\u03bf\u03c4\u03c3\u03bf\u03c5\u03ac\u03bd\u03b1
-currenciesDisplayName.MDC=\u039b\u03ad\u03b9 Cupon \u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.IDJ=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u0399\u03ac\u03b2\u03b1\u03c2 \u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1\u03c2
-currenciesDisplayName.KPP=Won \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1\u03c2 \u0392\u03cc\u03c1\u03b5\u03b9\u03b1\u03c2 \u039a\u03bf\u03c1\u03ad\u03b1\u03c2
-currenciesDisplayName.IDG=\u0393\u03ba\u03af\u03bb\u03bd\u03c4\u03b1 Nica \u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1\u03c2
-currenciesDisplayName.XID=\u0399\u03c3\u03bb\u03b1\u03bc\u03b9\u03ba\u03cc \u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf
-currenciesDisplayName.SOS=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.ADP=\u03a0\u03b5\u03c3\u03ad\u03c4\u03b1 \u0391\u03bd\u03b4\u03cc\u03c1\u03b1\u03c2
-currenciesDisplayName.RUR=\u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 \u03a1\u03c9\u03c3\u03af\u03b1\u03c2 (1991-1998)
-currenciesDisplayName.GPF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03bf\u03c5\u03b1\u03b4\u03b5\u03bb\u03bf\u03cd\u03c0\u03b7\u03c2
-currenciesDisplayName.DJF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u03a4\u03b6\u03b9\u03bc\u03c0\u03bf\u03c5\u03c4\u03af
-currenciesDisplayName.ADD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0391\u03bd\u03b4\u03cc\u03c1\u03b1\u03c2
-currenciesDisplayName.MCG=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Germinal \u039c\u03bf\u03bd\u03b1\u03ba\u03cc
-currenciesDisplayName.MCF=\u039d\u03ad\u03bf \u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039c\u03bf\u03bd\u03b1\u03ba\u03cc
-currenciesDisplayName.ECV=Unidad de Valor Constante (UVC) \u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03bf\u03cd
-currenciesDisplayName.ECS=Sucre \u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03bf\u03cd
-currenciesDisplayName.LIF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039b\u03b9\u03c7\u03c4\u03b5\u03bd\u03c3\u03c4\u03ac\u03b9\u03bd
-currenciesDisplayName.RUB=\u03a1\u03bf\u03cd\u03b2\u03bb\u03b9 \u03a1\u03c9\u03c3\u03af\u03b1\u03c2
-currenciesDisplayName.PHP=\u03a0\u03ad\u03c3\u03bf \u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03af\u03bd\u03c9\u03bd
-currenciesDisplayName.UZS=Sum \u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
-currenciesDisplayName.COP=\u03a0\u03ad\u03c3\u03bf \u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.THB=\u039c\u03c0\u03b1\u03c4 \u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7\u03c2
-currenciesDisplayName.IBP=\u039b\u03af\u03c1\u03b1 \u0392\u03cc\u03c1\u03b5\u03b9\u03b1\u03c2 \u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.BUR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u0392\u03b9\u03c1\u03bc\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.COF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039a\u03bf\u03bd\u03b3\u03ba\u03cc CFA
-currenciesDisplayName.BUK=Kyat \u0392\u03b9\u03c1\u03bc\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.COB=\u03a7\u03ac\u03c1\u03c4\u03b9\u03bd\u03bf \u03a0\u03ad\u03c3\u03bf \u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.UZC=Coupon Som \u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
-currenciesDisplayName.UAK=Karbovanetz \u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.QAR=Rial \u039a\u03b1\u03c4\u03ac\u03c1
-currenciesDisplayName.UAH=Hryvnia \u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.GNS=Syli \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1\u03c2
-currenciesDisplayName.CNY=Yuan Renminbi \u039a\u03af\u03bd\u03b1\u03c2
-currenciesDisplayName.MZM=Metical \u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7\u03c2
-currenciesDisplayName.CNX=\u03a0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03b9\u03b7\u03c4\u03b9\u03ba\u03ac \u039e\u03ad\u03bd\u03bf\u03c5 \u03a3\u03c5\u03bd\u03b1\u03bb\u03bb\u03ac\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c3\u03b5 \u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03b1 \u0397\u03a0\u0391, \u039a\u03af\u03bd\u03b1\u03c2
-currenciesDisplayName.UYU=\u03a0\u03ad\u03c3\u03bf Uruguayo \u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7\u03c2
-currenciesDisplayName.GNI=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1\u03c2 (1960-1972)
-currenciesDisplayName.SML=\u039b\u03b9\u03c1\u03ad\u03c4\u03b1 \u0391\u03b3\u03af\u03bf\u03c5 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c5
-currenciesDisplayName.MZE=\u0395\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7\u03c2
-currenciesDisplayName.CNP=Jen Min Piao Yuan \u039a\u03af\u03bd\u03b1\u03c2
-currenciesDisplayName.PGK=Kina \u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
-currenciesDisplayName.OMS=Rial Saidi \u039f\u03bc\u03ac\u03bd
-currenciesDisplayName.GNF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1\u03c2
-currenciesDisplayName.UYP=\u03a0\u03ad\u03c3\u03bf \u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7\u03c2 (1975-1993)
-currenciesDisplayName.OMR=Rial \u039f\u03bc\u03ac\u03bd
-currenciesDisplayName.XFU=UIC-\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03b1\u03bb\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.ZRZ=Zaire \u0396\u03b1\u0390\u03c1
-currenciesDisplayName.BTR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd
-currenciesDisplayName.MAF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039c\u03b1\u03c1\u03cc\u03ba\u03bf\u03c5
-currenciesDisplayName.MAD=\u039d\u03c4\u03b9\u03c1\u03ac\u03bc \u039c\u03b1\u03c1\u03cc\u03ba\u03bf\u03c5
-currenciesDisplayName.BTN=Ngultrum \u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd
-currenciesDisplayName.XFO=\u03a7\u03c1\u03c5\u03c3\u03cc \u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03b1\u03bb\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.UYF=\u039c\u03b5\u03c4\u03b1\u03bb\u03bb\u03b9\u03ba\u03cc \u03a0\u03ad\u03c3\u03bf \u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7\u03c2
-currenciesDisplayName.MYR=Ringgit \u039c\u03b1\u03bb\u03b1\u03b9\u03c3\u03af\u03b1\u03c2
-currenciesDisplayName.ZRN=\u039d\u03ad\u03bf Zaire \u0396\u03b1\u0390\u03c1
-currenciesDisplayName.AZM=\u039c\u03b1\u03bd\u03ac\u03c4 \u0391\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd
-currenciesDisplayName.GMP=\u039b\u03af\u03c1\u03b1 \u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1
-currenciesDisplayName.KMF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Comoro
-currenciesDisplayName.SLL=Leone \u03a3\u03b9\u03ad\u03c1\u03b1 \u039b\u03b5\u03cc\u03bd\u03b5
-currenciesDisplayName.GMD=Dalasi \u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1
-currenciesDisplayName.XEU=\u0395\u03c5\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u03ae \u03a3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03bc\u03b1\u03c4\u03b9\u03ba\u03ae \u039c\u03bf\u03bd\u03ac\u03b4\u03b1
-currenciesDisplayName.BSP=\u039b\u03af\u03c1\u03b1 \u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2
-currenciesDisplayName.CMF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u039a\u03b1\u03bc\u03b5\u03c1\u03bf\u03cd\u03bd CFA
-currenciesDisplayName.MXV=Unidad de Inversion (UDI) \u039c\u03b5\u03be\u03b9\u03ba\u03bf\u03cd
-currenciesDisplayName.XEF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf BCEAEC CFA
-currenciesDisplayName.BSD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2
-currenciesDisplayName.MXP=\u0391\u03c3\u03b7\u03bc\u03ad\u03bd\u03b9\u03bf \u03a0\u03ad\u03c3\u03bf \u039c\u03b5\u03be\u03b9\u03ba\u03bf\u03cd (1861-1992)
-currenciesDisplayName.MXN=\u03a0\u03ad\u03c3\u03bf \u039c\u03b5\u03be\u03b9\u03ba\u03bf\u03cd
-currenciesDisplayName.PES=Sol \u03a0\u03b5\u03c1\u03bf\u03cd
-currenciesDisplayName.GLK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u0393\u03c1\u03bf\u03b9\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.BRZ=Cruzeiro \u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1\u03c2 (1942-1967)
-currenciesDisplayName.PEN=Sol Nuevo \u03a0\u03b5\u03c1\u03bf\u03cd
-currenciesDisplayName.CLP=\u03a0\u03ad\u03c3\u03bf \u03a7\u03b9\u03bb\u03ae\u03c2
-currenciesDisplayName.SKK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.PEI=Inti \u03a0\u03b5\u03c1\u03bf\u03cd
-currenciesDisplayName.BRR=Cruzeiro \u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.XDR=\u0395\u03b9\u03b4\u03b9\u03ba\u03ac \u0394\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03b1 \u0391\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7\u03c2
-currenciesDisplayName.FRG=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Germinal/\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf Poincare \u0393\u03b1\u03bb\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.FRF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03b1\u03bb\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.BRN=\u039d\u03ad\u03bf Cruzado \u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.CLF=Unidades de Fomento \u03a7\u03b9\u03bb\u03ae\u03c2
-currenciesDisplayName.CLE=\u0395\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u03a7\u03b9\u03bb\u03ae\u03c2
-currenciesDisplayName.BRL=Real \u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.CLC=Condor \u03a7\u03b9\u03bb\u03ae\u03c2
-currenciesDisplayName.BRE=Cruzeiro \u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1\u03c2 (1990-1993)
-currenciesDisplayName.DES=Sperrmark \u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.MWP=\u039b\u03af\u03c1\u03b1 \u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9
-currenciesDisplayName.BRC=Cruzado \u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1\u03c2
-currenciesDisplayName.BRB=\u039d\u03ad\u03bf Cruzeiro \u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1\u03c2 (1967-1986)
-currenciesDisplayName.MWK=Kwacha \u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9
-currenciesDisplayName.DEM=\u039c\u03ac\u03c1\u03ba\u03bf \u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.TDF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u03a4\u03c3\u03b1\u03bd\u03c4 CFA
-currenciesDisplayName.NPR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u039d\u03b5\u03c0\u03ac\u03bb
-currenciesDisplayName.CKD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039d\u03ae\u03c3\u03c9\u03bd \u039a\u03bf\u03c5\u03ba
-currenciesDisplayName.JPY=\u0393\u03b9\u03b5\u03bd \u0399\u03b1\u03c0\u03c9\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.MVR=Rufiyaa \u039d\u03ae\u03c3\u03c9\u03bd \u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03c9\u03bd
-currenciesDisplayName.XCF=\u039d\u03ad\u03bf \u03a6\u03c1\u03ac\u03b3\u03ba\u03bf CFA
-currenciesDisplayName.MVP=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u039d\u03ae\u03c3\u03c9\u03bd \u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03c9\u03bd
-currenciesDisplayName.XCD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0391\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03ba\u03ae\u03c2 \u039a\u03b1\u03c1\u03b1\u03ca\u03b2\u03b9\u03ba\u03ae\u03c2
-currenciesDisplayName.SIT=Tolar \u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.YUR=\u0391\u03bd\u03b1\u03bd\u03b5\u03c9\u03bc\u03ad\u03bd\u03bf \u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0393\u03b9\u03bf\u03c5\u03b3\u03ba\u03bf\u03c3\u03bb\u03b1\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.AWG=\u0393\u03ba\u03af\u03bb\u03bd\u03c4\u03b1 \u0391\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1
-currenciesDisplayName.YUO=\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03b9\u03b1\u03bd\u03cc \u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0393\u03b9\u03bf\u03c5\u03b3\u03ba\u03bf\u03c3\u03bb\u03b1\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.DDM=Ostmark \u0391\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03ba\u03ae\u03c2 \u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.YUN=\u039c\u03b5\u03c4\u03b1\u03c4\u03c1\u03ad\u03c8\u03b9\u03bc\u03bf \u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0393\u03b9\u03bf\u03c5\u03b3\u03ba\u03bf\u03c3\u03bb\u03b1\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.YUM=\u039d\u03ad\u03bf \u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0393\u03b9\u03bf\u03c5\u03b3\u03ba\u03bf\u03c3\u03bb\u03b1\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.TCC=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u039d\u03ae\u03c3\u03c9\u03bd \u03a4\u03b5\u03c1\u03ba\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2
-currenciesDisplayName.YUG=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0393\u03b9\u03bf\u03c5\u03b3\u03ba\u03bf\u03c3\u03bb\u03b1\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.YUF=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0393\u03b9\u03bf\u03c5\u03b3\u03ba\u03bf\u03c3\u03bb\u03b1\u03b2\u03b9\u03ba\u03ae\u03c2 \u039f\u03bc\u03bf\u03c3\u03c0\u03bf\u03bd\u03b4\u03af\u03b1\u03c2
-currenciesDisplayName.RON=\u039d\u03ad\u03bf \u039b\u03ad\u03b9 \u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.YUD=\u039c\u03b5\u03c4\u03b1\u03bb\u03bb\u03b9\u03ba\u03cc \u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0393\u03b9\u03bf\u03c5\u03b3\u03ba\u03bf\u03c3\u03bb\u03b1\u03b2\u03af\u03b1\u03c2
-currenciesDisplayName.ROL=\u039b\u03ad\u03b9 \u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.SIB=Tolar Bons \u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1\u03c2
-currenciesDisplayName.NOK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1\u03c2
-currenciesDisplayName.MUR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u039c\u03b1\u03c5\u03c1\u03b9\u03ba\u03af\u03bf\u03c5
-currenciesDisplayName.XBD=\u0395\u03c5\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u03ae \u039c\u03bf\u03bd\u03ac\u03b4\u03b1 \u039b\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd (XBD)
-currenciesDisplayName.GIP=\u039b\u03af\u03c1\u03b1 \u0393\u03b9\u03b2\u03c1\u03b1\u03bb\u03c4\u03ac\u03c1
-currenciesDisplayName.VNS=\u0395\u03b8\u03bd\u03b9\u03ba\u03cc Dong \u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
-currenciesDisplayName.XBC=\u0395\u03c5\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u03ae \u039c\u03bf\u03bd\u03ac\u03b4\u03b1 \u039b\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd (XBC)
-currenciesDisplayName.VNR=Dong \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1\u03c2 \u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
-currenciesDisplayName.XBB=\u0395\u03c5\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u03ae \u039d\u03bf\u03bc\u03b9\u03c3\u03bc\u03b1\u03c4\u03b9\u03ba\u03ae \u039c\u03bf\u03bd\u03ac\u03b4\u03b1
-currenciesDisplayName.XBA=\u0395\u03c5\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u03ae \u03a3\u03cd\u03bd\u03b8\u03b5\u03c4\u03b7 \u039c\u03bf\u03bd\u03ac\u03b4\u03b1
-currenciesDisplayName.KID=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf Kiribati
-currenciesDisplayName.SHP=\u039b\u03af\u03c1\u03b1 \u0391\u03b3\u03af\u03b1\u03c2 \u0395\u03bb\u03ad\u03bd\u03b7\u03c2
-currenciesDisplayName.VNN=\u039d\u03ad\u03bf Dong \u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.EUR=\u20ac
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
-currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
-currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
-currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
-currenciesSymbol.TTD=TT$
-currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.GBP=\u00a3
-currenciesSymbol.LTT=LTT
-currenciesSymbol.INR=INR
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
-currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
-currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
-currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.UGS=UGS
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
-currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
-currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
-currenciesSymbol.GNF=GF
-currenciesSymbol.UYP=UYP
-currenciesSymbol.OMR=RO
-currenciesSymbol.XFU=XFU
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.BTR=BTR
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
-currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
-currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.JPY=\u00a5
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
-shortMonths=\u0399\u03b1\u03bd®\u03a6\u03b5\u03b2®\u039c\u03b1\u03c1®\u0391\u03c0\u03c1®\u039c\u03b1\u03ca®\u0399\u03bf\u03c5\u03bd®\u0399\u03bf\u03c5\u03bb®\u0391\u03c5\u03b3®\u03a3\u03b5\u03c0®\u039f\u03ba\u03c4®\u039d\u03bf\u03b5®\u0394\u03b5\u03ba®®
-months=\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2®\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2®\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2®\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2®\u039c\u03ac\u03b9\u03bf\u03c2®\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2®\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2®\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2®\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2®\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2®\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2®\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2®®
-shortWeekdays=®\u039a\u03c5\u03c1®\u0394\u03b5\u03c5®\u03a4\u03c1\u03b9®\u03a4\u03b5\u03c4®\u03a0\u03b5\u03bc®\u03a0\u03b1\u03c1®\u03a3\u03b1\u03b2®
-weekdays=®\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae®\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1®\u03a4\u03c1\u03af\u03c4\u03b7®\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7®\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7®\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae®\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf®
-firstDayOfWeek=mon
-eras=\u03c0.\u03a7.®\u03bc.\u03a7.®
-ampms=\u03a0\u039c®\u039c\u039c®
-shortDateFormat=dd/MM/yyyy
-mediumDateFormat=dd MMM yyyy
-longDateFormat=dd MMMM yyyy
-fullDateFormat=EEEE, dd MMMM yyyy
-shortTimeFormat=h:mm a
-mediumTimeFormat=h:mm:ss a
-longTimeFormat=h:mm:ss a z
-fullTimeFormat=h:mm:ss a z
-territories.TL=\u0391\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03ba\u03cc \u03a4\u03b9\u03bc\u03cc\u03c1
-territories.TK=\u03a4\u03bf\u03ba\u03b5\u03bb\u03ac\u03bf\u03c5
-territories.TJ=\u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
-territories.TH=\u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7
-territories.TG=\u03a4\u03cc\u03b3\u03ba\u03bf
-territories.TF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac \u039d\u03cc\u03c4\u03b9\u03b1 \u0395\u03b4\u03ac\u03c6\u03b7
-territories.GY=\u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1
-territories.TD=\u03a4\u03c3\u03b1\u03bd\u03c4
-territories.TC=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a4\u03b5\u03c1\u03ba\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2
-territories.GW=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1-\u039c\u03c0\u03b9\u03c3\u03ac\u03bf\u03c5
-territories.GU=\u0393\u03ba\u03bf\u03c5\u03ac\u03bc
-territories.GT=\u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1
-territories.GS=\u039d\u03cc\u03c4\u03b9\u03b1 \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 \u03ba\u03b1\u03b9 \u039d\u03ae\u03c3\u03bf\u03b9 \u039d\u03cc\u03c4\u03b9\u03b5\u03c2 \u03a3\u03ac\u03bd\u03c4\u03bf\u03c5\u03b9\u03c4\u03c2
-territories.GR=\u0395\u03bb\u03bb\u03ac\u03b4\u03b1
-territories.GQ=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
-territories.GP=\u0393\u03bf\u03c5\u03b1\u03b4\u03b5\u03bb\u03bf\u03cd\u03c0\u03b7
-territories.SZ=\u03a3\u03bf\u03c5\u03b1\u03b6\u03b9\u03bb\u03ac\u03bd\u03b4\u03b7
-territories.SY=\u03a3\u03c5\u03c1\u03af\u03b1, \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03b7\u03c2
-territories.GN=\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
-territories.GM=\u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1
-territories.GL=\u0393\u03c1\u03bf\u03b9\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
-territories.SV=\u0395\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1
-territories.ST=\u03a3\u03ac\u03bf \u03a4\u03bf\u03bc\u03ad \u03ba\u03b1\u03b9 \u03a0\u03c1\u03af\u03bd\u03c3\u03b9\u03c0\u03b5
-territories.GI=\u0393\u03b9\u03b2\u03c1\u03b1\u03bb\u03c4\u03ac\u03c1
-territories.GH=\u0393\u03ba\u03ac\u03bd\u03b1
-territories.SR=\u03a3\u03bf\u03c5\u03c1\u03b9\u03bd\u03ac\u03bc
-territories.GF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1
-territories.GE=\u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1
-territories.SO=\u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1
-territories.GD=\u0393\u03c1\u03b5\u03bd\u03ac\u03b4\u03b1
-territories.SN=\u03a3\u03b5\u03bd\u03b5\u03b3\u03ac\u03bb\u03b7
-territories.SM=\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c2
-territories.GB=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf \u0392\u03b1\u03c3\u03af\u03bb\u03b5\u03b9\u03bf
-territories.SL=\u03a3\u03b9\u03ad\u03c1\u03b1 \u039b\u03b5\u03cc\u03bd\u03b5
-territories.GA=\u0393\u03ba\u03b1\u03bc\u03c0\u03cc\u03bd
-territories.SK=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1
-territories.SJ=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03b2\u03ac\u03bb\u03bc\u03c0\u03b1\u03c1 \u03ba\u03b1\u03b9 \u0393\u03b9\u03b1\u03bd \u039c\u03b1\u03b3\u03b9\u03ad\u03bd
-territories.SI=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1
-territories.SH=\u0391\u03b3\u03af\u03b1 \u0395\u03bb\u03ad\u03bd\u03b7
-territories.SG=\u03a3\u03b9\u03b3\u03ba\u03b1\u03c0\u03bf\u03cd\u03c1\u03b7
-territories.SE=\u03a3\u03bf\u03c5\u03b7\u03b4\u03af\u03b1
-territories.SD=\u03a3\u03bf\u03c5\u03b4\u03ac\u03bd
-territories.SC=\u03a3\u03b5\u03cb\u03c7\u03ad\u03bb\u03bb\u03b5\u03c2
-territories.SB=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03bf\u03bb\u03bf\u03bc\u03ce\u03bd\u03c4\u03bf\u03c2
-territories.SA=\u03a3\u03b1\u03bf\u03c5\u03b4\u03b9\u03ba\u03ae \u0391\u03c1\u03b1\u03b2\u03af\u03b1
-territories.FR=\u0393\u03b1\u03bb\u03bb\u03af\u03b1
-territories.FO=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03b5\u03c1\u03cc\u03b5\u03c2
-territories.FM=\u039c\u03b9\u03ba\u03c1\u03bf\u03bd\u03b7\u03c3\u03af\u03b1, \u039f\u03bc\u03cc\u03c3\u03c0\u03bf\u03bd\u03b4\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2 \u03c4\u03b7\u03c2
-territories.RW=\u03a1\u03bf\u03c5\u03ac\u03bd\u03c4\u03b1
-territories.FK=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03ce\u03ba\u03bb\u03b1\u03bd\u03c4
-territories.RU=\u03a1\u03c9\u03c3\u03af\u03b1
-territories.FJ=\u03a6\u03af\u03c4\u03b6\u03b9
-territories.FI=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
-territories.RO=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1
-territories.RE=\u03a1\u03b5\u03cb\u03bd\u03b9\u03cc\u03bd
-territories.ET=\u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1
-territories.ES=\u0399\u03c3\u03c0\u03b1\u03bd\u03af\u03b1
-territories.ER=\u0395\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1
-territories.EH=\u0394\u03c5\u03c4\u03b9\u03ba\u03ae \u03a3\u03b1\u03c7\u03ac\u03c1\u03b1
-territories.EG=\u0391\u03af\u03b3\u03c5\u03c0\u03c4\u03bf\u03c2
-territories.EE=\u0395\u03c3\u03b8\u03bf\u03bd\u03af\u03b1
-territories.EC=\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03cc\u03c2
-territories.DZ=\u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1
-territories.QA=\u039a\u03b1\u03c4\u03ac\u03c1
-territories.DO=\u0394\u03bf\u03bc\u03b9\u03bd\u03b9\u03ba\u03b1\u03bd\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1
-territories.PY=\u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7
-territories.DM=\u039d\u03c4\u03bf\u03bc\u03af\u03bd\u03b9\u03ba\u03b1
-territories.PW=\u03a0\u03b1\u03bb\u03ac\u03bf\u03c5
-territories.DK=\u0394\u03b1\u03bd\u03af\u03b1
-territories.DJ=\u03a4\u03b6\u03b9\u03bc\u03c0\u03bf\u03c5\u03c4\u03af
-territories.PT=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1
-territories.PS=\u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03b9\u03bd\u03b9\u03b1\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7
-territories.PR=\u03a0\u03bf\u03c5\u03ad\u03c1\u03c4\u03bf \u03a1\u03af\u03ba\u03bf
-territories.DE=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1
-territories.PN=\u03a0\u03af\u03c4\u03ba\u03b5\u03c1\u03bd
-territories.PM=\u03a3\u03b1\u03b9\u03bd\u03c4 \u03a0\u03b9\u03ad\u03c1 \u03ba\u03b1\u03b9 \u039c\u03b9\u03ba\u03b5\u03bb\u03cc\u03bd
-territories.PL=\u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1
-territories.PK=\u03a0\u03b1\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
-territories.PH=\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03af\u03bd\u03b5\u03c2
-territories.PG=\u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 - \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
-territories.PF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u03a0\u03bf\u03bb\u03c5\u03bd\u03b7\u03c3\u03af\u03b1
-territories.CZ=\u03a4\u03c3\u03b5\u03c7\u03af\u03b1
-territories.PE=\u03a0\u03b5\u03c1\u03bf\u03cd
-territories.CY=\u039a\u03cd\u03c0\u03c1\u03bf\u03c2
-territories.CX=\u039d\u03ae\u03c3\u03bf\u03c2 \u03a7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c5\u03b3\u03ad\u03bd\u03bd\u03c9\u03bd
-territories.CV=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf\u03c5 \u0391\u03ba\u03c1\u03c9\u03c4\u03b7\u03c1\u03af\u03bf\u03c5
-territories.PA=\u03a0\u03b1\u03bd\u03b1\u03bc\u03ac\u03c2
-territories.CU=\u039a\u03bf\u03cd\u03b2\u03b1
-territories.CR=\u039a\u03cc\u03c3\u03c4\u03b1 \u03a1\u03af\u03ba\u03b1
-territories.CO=\u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1
-territories.CN=\u039a\u03af\u03bd\u03b1
-territories.CM=\u039a\u03b1\u03bc\u03b5\u03c1\u03bf\u03cd\u03bd
-territories.CL=\u03a7\u03b9\u03bb\u03ae
-territories.CK=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03bf\u03c5\u03ba
-territories.CI=\u0391\u03ba\u03c4\u03ae \u0395\u03bb\u03b5\u03c6\u03b1\u03bd\u03c4\u03cc\u03b4\u03bf\u03bd\u03c4\u03bf\u03c2
-territories.CH=\u0395\u03bb\u03b2\u03b5\u03c4\u03af\u03b1
-territories.CG=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc
-territories.CF=\u039a\u03b5\u03bd\u03c4\u03c1\u03bf\u03b1\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1
-territories.CD=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc, \u039b\u03b1\u03ca\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03bf\u03c5
-territories.CC=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03cc\u03ba\u03bf\u03c2 (\u039a\u03ae\u03bb\u03b9\u03bd\u03b3\u03ba)
-territories.OM=\u039f\u03bc\u03ac\u03bd
-territories.CA=\u039a\u03b1\u03bd\u03b1\u03b4\u03ac\u03c2
-territories.BZ=\u039c\u03c0\u03b5\u03bb\u03af\u03b6
-territories.BY=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1
-territories.BW=\u039c\u03c0\u03bf\u03c4\u03c3\u03bf\u03c5\u03ac\u03bd\u03b1
-territories.BV=\u039d\u03ae\u03c3\u03bf\u03c2 \u039c\u03c0\u03bf\u03c5\u03b2\u03ad
-territories.BT=\u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd
-territories.BS=\u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2
-territories.BR=\u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1
-territories.NZ=\u039d\u03ad\u03b1 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
-territories.BO=\u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1
-territories.BN=\u039c\u03c0\u03c1\u03bf\u03c5\u03bd\u03ad\u03b9 \u039d\u03c4\u03b1\u03c1\u03bf\u03c5\u03c3\u03b1\u03bb\u03ac\u03bc
-territories.BM=\u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03b5\u03c2
-territories.NU=\u039d\u03b9\u03bf\u03cd\u03b5
-territories.BJ=\u039c\u03c0\u03ad\u03bd\u03b9\u03bd
-territories.BI=\u039c\u03c0\u03bf\u03c5\u03c1\u03bf\u03cd\u03bd\u03c4\u03b9
-territories.BH=\u039c\u03c0\u03b1\u03c7\u03c1\u03ad\u03b9\u03bd
-territories.NR=\u039d\u03b1\u03bf\u03cd\u03c1\u03bf\u03c5
-territories.BG=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1
-territories.BF=\u039c\u03c0\u03bf\u03c5\u03c1\u03ba\u03af\u03bd\u03b1 \u03a6\u03ac\u03c3\u03bf
-territories.NP=\u039d\u03b5\u03c0\u03ac\u03bb
-territories.BE=\u0392\u03ad\u03bb\u03b3\u03b9\u03bf
-territories.NO=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1
-territories.BD=\u039c\u03c0\u03b1\u03bd\u03b3\u03ba\u03bb\u03b1\u03bd\u03c4\u03ad\u03c2
-territories.BB=\u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03ac\u03bd\u03c4\u03bf\u03c2
-territories.ZW=\u0396\u03b9\u03bc\u03c0\u03ac\u03bc\u03c0\u03bf\u03c5\u03b5
-territories.NL=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
-territories.BA=\u0392\u03bf\u03c3\u03bd\u03af\u03b1 - \u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7
-territories.NI=\u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1
-territories.NG=\u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1
-territories.NF=\u039d\u03ae\u03c3\u03bf\u03c2 \u039d\u03cc\u03c1\u03c6\u03bf\u03bb\u03ba
-territories.AZ=\u0391\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd
-territories.NE=\u039d\u03af\u03b3\u03b7\u03c1
-territories.NC=\u039d\u03ad\u03b1 \u039a\u03b1\u03bb\u03b7\u03b4\u03bf\u03bd\u03af\u03b1
-territories.AW=\u0391\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1
-territories.ZM=\u0396\u03ac\u03bc\u03c0\u03b9\u03b1
-territories.NA=\u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1
-territories.AU=\u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1
-territories.AT=\u0391\u03c5\u03c3\u03c4\u03c1\u03af\u03b1
-territories.AS=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u03a3\u03b1\u03bc\u03cc\u03b1
-territories.AR=\u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae
-territories.AQ=\u0391\u03bd\u03c4\u03b1\u03c1\u03ba\u03c4\u03b9\u03ba\u03ae
-territories.MZ=\u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7
-territories.AO=\u0391\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1
-territories.MY=\u039c\u03b1\u03bb\u03b1\u03b9\u03c3\u03af\u03b1
-territories.AN=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ad\u03c2 \u0391\u03bd\u03c4\u03af\u03bb\u03bb\u03b5\u03c2
-territories.MX=\u039c\u03b5\u03be\u03b9\u03ba\u03cc
-territories.AM=\u0391\u03c1\u03bc\u03b5\u03bd\u03af\u03b1
-territories.MW=\u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9
-territories.AL=\u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1
-territories.MV=\u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03b5\u03c2
-territories.ZA=\u039d\u03cc\u03c4\u03b9\u03b1 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae
-territories.MU=\u039c\u03b1\u03c5\u03c1\u03af\u03ba\u03b9\u03bf\u03c2
-territories.MT=\u039c\u03ac\u03bb\u03c4\u03b1
-territories.AI=\u0391\u03bd\u03b3\u03ba\u03bf\u03c5\u03af\u03bb\u03b1
-territories.MS=\u039c\u03bf\u03bd\u03c3\u03b5\u03c1\u03ac\u03c4
-territories.MR=\u039c\u03b1\u03c5\u03c1\u03b9\u03c4\u03b1\u03bd\u03af\u03b1
-territories.AG=\u0391\u03bd\u03c4\u03af\u03b3\u03ba\u03bf\u03c5\u03b1 \u03ba\u03b1\u03b9 \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03bf\u03cd\u03bd\u03c4\u03b1
-territories.MQ=\u039c\u03b1\u03c1\u03c4\u03b9\u03bd\u03af\u03ba\u03b1
-territories.AF=\u0391\u03c6\u03b3\u03b1\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd
-territories.MP=\u039d\u03ae\u03c3\u03bf\u03b9 \u0392\u03cc\u03c1\u03b5\u03b9\u03b5\u03c2 \u039c\u03b1\u03c1\u03b9\u03ac\u03bd\u03b5\u03c2
-territories.AE=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac \u0395\u03bc\u03b9\u03c1\u03ac\u03c4\u03b1
-territories.MO=\u039c\u03b1\u03ba\u03ac\u03bf, \u0395\u03b9\u03b4\u03b9\u03ba\u03ae \u0394\u03b9\u03bf\u03b9\u03ba\u03b7\u03c4\u03b9\u03ba\u03ae \u03a0\u03b5\u03c1\u03b9\u03c6\u03ad\u03c1\u03b5\u03b9\u03b1 \u03c4\u03b7\u03c2 \u039a\u03af\u03bd\u03b1\u03c2
-territories.AD=\u0391\u03bd\u03b4\u03cc\u03c1\u03b1
-territories.MN=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03af\u03b1
-territories.MM=\u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1
-territories.ML=\u039c\u03ac\u03bb\u03b9
-territories.MK=\u03a0\u0393\u0394 \u039c\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03af\u03b1\u03c2
-territories.YU=\u0393\u03b9\u03bf\u03c5\u03b3\u03ba\u03bf\u03c3\u03bb\u03b1\u03b2\u03af\u03b1
-territories.YT=\u039c\u03b1\u03b3\u03b9\u03cc\u03c4
-territories.MH=\u039d\u03ae\u03c3\u03bf\u03b9 \u039c\u03ac\u03c1\u03c3\u03b1\u03bb
-territories.MG=\u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7
-territories.MD=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1, \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03b7\u03c2
-territories.MC=\u039c\u03bf\u03bd\u03b1\u03ba\u03cc
-territories.MA=\u039c\u03b1\u03c1\u03cc\u03ba\u03bf
-territories.YE=\u03a5\u03b5\u03bc\u03ad\u03bd\u03b7
-territories.LV=\u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1
-territories.LU=\u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u03cd\u03c1\u03b3\u03bf
-territories.LT=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1
-territories.LS=\u039b\u03b5\u03c3\u03cc\u03c4\u03bf
-territories.LR=\u039b\u03b9\u03b2\u03b5\u03c1\u03af\u03b1
-territories.LK=\u03a3\u03c1\u03b9 \u039b\u03ac\u03bd\u03ba\u03b1
-territories.LI=\u039b\u03b9\u03c7\u03c4\u03b5\u03bd\u03c3\u03c4\u03ac\u03b9\u03bd
-territories.LC=\u0391\u03b3\u03af\u03b1 \u039b\u03bf\u03c5\u03ba\u03af\u03b1
-territories.LB=\u039b\u03af\u03b2\u03b1\u03bd\u03bf\u03c2
-territories.LA=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ae \u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03ae
-territories.KZ=\u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd
-territories.KY=\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03ad\u03b9\u03bc\u03b1\u03bd
-territories.KW=\u039a\u03bf\u03c5\u03b2\u03ad\u03b9\u03c4
-territories.KR=\u039a\u03bf\u03c1\u03ad\u03b1, \u039d\u03cc\u03c4\u03b9\u03b1
-territories.KP=\u039a\u03bf\u03c1\u03ad\u03b1, \u0392\u03cc\u03c1\u03b5\u03b9\u03b1
-territories.KN=\u03a3\u03b1\u03b9\u03bd\u03c4 \u039a\u03b9\u03c4\u03c2 \u03ba\u03b1\u03b9 \u039d\u03ad\u03b2\u03b9\u03c2
-territories.KM=\u039a\u03bf\u03bc\u03cc\u03c1\u03b5\u03c2
-territories.KI=\u039a\u03b9\u03c1\u03b9\u03bc\u03c0\u03ac\u03c4\u03b9
-territories.WS=\u03a3\u03b1\u03bc\u03cc\u03b1
-territories.KH=\u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7
-territories.KG=\u039a\u03b9\u03c1\u03b3\u03b9\u03b6\u03af\u03b1
-territories.KE=\u039a\u03ad\u03bd\u03c5\u03b1
-territories.WF=\u039d\u03ae\u03c3\u03bf\u03b9 \u039f\u03c5\u03b1\u03bb\u03bb\u03af\u03c2 \u03ba\u03b1\u03b9 \u03a6\u03bf\u03c5\u03c4\u03bf\u03c5\u03bd\u03ac
-territories.JP=\u0399\u03b1\u03c0\u03c9\u03bd\u03af\u03b1
-territories.JO=\u0399\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1
-territories.JM=\u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1
-territories.VU=\u0392\u03b1\u03bd\u03bf\u03c5\u03ac\u03c4\u03bf\u03c5
-territories.VN=\u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc
-territories.VI=\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03bf\u03b9 \u039d\u03ae\u03c3\u03bf\u03b9
-territories.VG=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03bf\u03b9 \u039d\u03ae\u03c3\u03bf\u03b9
-territories.VE=\u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1
-territories.VC=\u0386\u03b3\u03b9\u03bf\u03c2 \u0392\u03b9\u03ba\u03ad\u03bd\u03c4\u03b9\u03bf\u03c2 \u03ba\u03b1\u03b9 \u0393\u03c1\u03b5\u03bd\u03b1\u03b4\u03af\u03bd\u03b5\u03c2
-territories.VA=\u0391\u03b3\u03af\u03b1 \u0388\u03b4\u03c1\u03b1 (\u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03cc)
-territories.IT=\u0399\u03c4\u03b1\u03bb\u03af\u03b1
-territories.IS=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
-territories.IR=\u0399\u03c1\u03ac\u03bd, \u0399\u03c3\u03bb\u03b1\u03bc\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03bf\u03c5
-territories.IQ=\u0399\u03c1\u03ac\u03ba
-territories.UZ=\u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
-territories.IO=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ac \u0388\u03b4\u03ac\u03c6\u03b7 \u0399\u03bd\u03b4\u03b9\u03ba\u03bf\u03cd \u03a9\u03ba\u03b5\u03b1\u03bd\u03bf\u03cd
-territories.UY=\u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7
-territories.IN=\u0399\u03bd\u03b4\u03af\u03b1
-territories.IL=\u0399\u03c3\u03c1\u03b1\u03ae\u03bb
-territories.US=\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2
-territories.IE=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
-territories.ID=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1
-territories.UM=\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u039d\u03b7\u03c3\u03af\u03b4\u03b5\u03c2 \u03c4\u03c9\u03bd \u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03b9\u03ce\u03bd
-territories.UG=\u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1
-territories.UA=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1
-territories.HU=\u039f\u03c5\u03b3\u03b3\u03b1\u03c1\u03af\u03b1
-territories.HT=\u0391\u03ca\u03c4\u03ae
-territories.HR=\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1
-territories.TZ=\u03a4\u03b1\u03bd\u03b6\u03b1\u03bd\u03af\u03b1
-territories.HN=\u039f\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1
-territories.HM=\u039d\u03ae\u03c3\u03bf\u03b9 \u03a7\u03b5\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u039c\u03b1\u03ba\u03bd\u03c4\u03cc\u03bd\u03b1\u03bb\u03bd\u03c4
-territories.TW=\u03a4\u03b1\u03ca\u03b2\u03ac\u03bd
-territories.TV=\u03a4\u03bf\u03c5\u03b2\u03b1\u03bb\u03bf\u03cd
-territories.HK=\u03a7\u03bf\u03bd\u03b3\u03ba \u039a\u03bf\u03bd\u03b3\u03ba, \u0395\u03b9\u03b4\u03b9\u03ba\u03ae \u0394\u03b9\u03bf\u03b9\u03ba\u03b7\u03c4\u03b9\u03ba\u03ae \u03a0\u03b5\u03c1\u03b9\u03c6\u03ad\u03c1\u03b5\u03b9\u03b1 \u03c4\u03b7\u03c2 \u039a\u03af\u03bd\u03b1\u03c2
-territories.TT=\u03a4\u03c1\u03b9\u03bd\u03b9\u03b4\u03ac\u03b4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf
-territories.TR=\u03a4\u03bf\u03c5\u03c1\u03ba\u03af\u03b1
-territories.TO=\u03a4\u03cc\u03bd\u03b3\u03ba\u03b1
-territories.TN=\u03a4\u03c5\u03bd\u03b7\u03c3\u03af\u03b1
-territories.TM=\u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd
-languages.haw=\u03a7\u03b1\u03b2\u03b1\u03bd\u03b5\u03b6\u03b9\u03ba\u03ac
-languages.mul=\u03a0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03ad\u03c2 \u0393\u03bb\u03ce\u03c3\u03c3\u03b5\u03c2
-languages.ka=\u0393\u03b5\u03c9\u03c1\u03b3\u03b9\u03b1\u03bd\u03ac
-languages.zh=\u039a\u03b9\u03bd\u03b5\u03b6\u03b9\u03ba\u03ac
-languages.cop=\u039a\u03bf\u03c0\u03c4\u03b9\u03ba\u03ac
-languages.ar=\u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac
-languages.mt=\u039c\u03b1\u03bb\u03c4\u03b5\u03b6\u03b9\u03ba\u03ac
-languages.sv=\u03a3\u03bf\u03c5\u03b7\u03b4\u03b9\u03ba\u03ac
-languages.pt=\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03b9\u03ba\u03ac
-languages.mo=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03b9\u03ba\u03ac
-languages.sr=\u03a3\u03b5\u03c1\u03b2\u03b9\u03ba\u03ac
-languages.ota=\u03a4\u03bf\u03c5\u03c1\u03ba\u03b9\u03ba\u03ac, \u039f\u03b8\u03c9\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac (1500-1928)
-languages.mn=\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03b9\u03ba\u03ac
-languages.sq=\u0391\u03bb\u03b2\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.mk=\u03a3\u03bb\u03b1\u03b2\u03bf\u03bc\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03b9\u03ba\u03ac
-languages.de=\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.pl=\u03a0\u03bf\u03bb\u03c9\u03bd\u03b9\u03ba\u03ac
-languages.sl=\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03b9\u03ba\u03ac
-languages.gd=\u03a3\u03ba\u03c9\u03c4\u03b9\u03ba\u03ac \u039a\u03b5\u03bb\u03c4\u03b9\u03ba\u03ac
-languages.sk=\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03b9\u03ba\u03ac
-languages.da=\u0394\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.ga=\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
-languages.sh=\u03a3\u03b5\u03c1\u03b2\u03bf\u03ba\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac
-languages.vi=\u0392\u03b9\u03b5\u03c4\u03bd\u03b1\u03bc\u03b5\u03b6\u03b9\u03ba\u03ac
-languages.ja=\u0399\u03b1\u03c0\u03c9\u03bd\u03b9\u03ba\u03ac
-languages.yi=\u0399\u03bf\u03c5\u03b4\u03b1\u03ca\u03ba\u03ac
-languages.sla=\u03a3\u03bb\u03b1\u03b2\u03b9\u03ba\u03ac (\u0386\u03bb\u03bb\u03b1)
-languages.cy=\u039f\u03c5\u03b1\u03bb\u03b9\u03ba\u03ac
-languages.egy=\u0391\u03b9\u03b3\u03c5\u03c0\u03c4\u03b9\u03b1\u03ba\u03ac (\u0391\u03c1\u03c7\u03b1\u03af\u03b1)
-languages.rom=\u03a1\u03c9\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.cs=\u03a4\u03c3\u03b5\u03c7\u03b9\u03ba\u03ac
-languages.nai=\u0399\u03bd\u03b4\u03b9\u03b1\u03bd\u03b9\u03ba\u03ac \u0392\u03cc\u03c1\u03b5\u03b9\u03b1\u03c2 \u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03ae\u03c2 (\u0386\u03bb\u03bb\u03b1)
-languages.lv=\u039b\u03b5\u03c4\u03bf\u03bd\u03b9\u03ba\u03ac
-languages.it=\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac
-languages.fr=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac
-languages.is=\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
-languages.co=\u039a\u03bf\u03c1\u03c3\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.arc=\u0391\u03c1\u03b1\u03bc\u03b1\u03ca\u03ba\u03ac
-languages.lt=\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.ru=\u03a1\u03c9\u03c3\u03b9\u03ba\u03ac
-languages.sem=\u03a3\u03b7\u03bc\u03b9\u03c4\u03b9\u03ba\u03ac (\u0386\u03bb\u03bb\u03b1)
-languages.fi=\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
-languages.ira=\u0399\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.ro=\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.ca=\u039a\u03b1\u03c4\u03b1\u03bb\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.id=\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac
-languages.uk=\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.fa=\u03a0\u03b5\u03c1\u03c3\u03b9\u03ba\u03ac
-languages.la=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u03ac
-languages.hy=\u0391\u03c1\u03bc\u03b5\u03bd\u03b9\u03ba\u03ac
-languages.eu=\u0392\u03b1\u03c3\u03ba\u03b9\u03ba\u03ac
-languages.bs=\u0392\u03bf\u03c3\u03bd\u03b9\u03b1\u03ba\u03ac
-languages.et=\u0395\u03c3\u03b8\u03bf\u03bd\u03b9\u03ba\u03ac
-languages.grc=\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, \u0391\u03c1\u03c7\u03b1\u03af\u03b1 (\u03ad\u03c9\u03c2 1453)
-languages.hu=\u039f\u03c5\u03b3\u03b3\u03c1\u03b9\u03ba\u03ac
-languages.es=\u0399\u03c3\u03c0\u03b1\u03bd\u03b9\u03ba\u03ac
-languages.bo=\u0398\u03b9\u03b2\u03b5\u03c4\u03b9\u03b1\u03bd\u03ac
-languages.hr=\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac
-languages.en=\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac
-languages.ine=\u0399\u03bd\u03b4\u03bf\u03b5\u03c5\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u03ac (\u00a8\u0391\u03bb\u03bb\u03b7)
-languages.peo=\u0391\u03c1\u03c7\u03b1\u03af\u03b1 \u03a0\u03b5\u03c1\u03c3\u03b9\u03ba\u03ac (600-400 \u03c0.\u03a7.)
-languages.el=\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
-languages.ko=\u039a\u03bf\u03c1\u03b5\u03b1\u03c4\u03b9\u03ba\u03ac
-languages.phn=\u03a6\u03bf\u03b9\u03bd\u03b9\u03ba\u03b9\u03ba\u03ac
-languages.no=\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac
-languages.bg=\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03b9\u03ba\u03ac
-languages.tr=\u03a4\u03bf\u03c5\u03c1\u03ba\u03b9\u03ba\u03ac
-languages.be=\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03b9\u03ba\u03ac
-languages.nl=\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
-languages.phi=\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03b9\u03bd\u03ad\u03b6\u03b9\u03ba\u03b1 (\u0386\u03bb\u03bb\u03b1)
-languages.he=\u0395\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac
+currenciesDisplayName.BGL=\u039c\u03b5\u03c4\u03b1\u03bb\u03bb\u03b9\u03ba\u1f78 \u039b\u1f72\u03b2 \u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1\u03c2
+currenciesDisplayName.XCD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u1f08\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03ba\u1fc6\u03c2 \u039a\u03b1\u03c1\u03b1\u03ca\u03b2\u03b9\u03ba\u1fc6\u03c2
+currenciesDisplayName.LKR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u03a3\u03c1\u1f76 \u039b\u03ac\u03bd\u03ba\u03b1\u03c2
+currenciesDisplayName.TPE=\u1f18\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u03a4\u03b9\u03bc\u03cc\u03c1
+currenciesDisplayName.BAD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0392\u03bf\u03c3\u03bd\u03af\u03b1\u03c2-\u1f19\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7\u03c2
+currenciesDisplayName.CSK=\u03a3\u03ba\u03bb\u03b7\u03c1\u1f74 \u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u03a4\u03c3\u03b5\u03c7\u03bf\u03c3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1\u03c2
+currenciesDisplayName.YUD=\u039c\u03b5\u03c4\u03b1\u03bb\u03bb\u03b9\u03ba\u1f78 \u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u0393\u03b9\u03bf\u03c5\u03b3\u03ba\u03bf\u03c3\u03bb\u03b1\u03b2\u03af\u03b1\u03c2
+currenciesDisplayName.SVC=Colon \u1f1a\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1
+currenciesDisplayName.SCR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u03a3\u03b5\u03cb\u03c7\u03b5\u03bb\u1ff6\u03bd
+currenciesDisplayName.IEP=\u039b\u03af\u03c1\u03b1 \u1f38\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
+currenciesDisplayName.AMD=Dram \u1f08\u03c1\u03bc\u03b5\u03bd\u03af\u03b1\u03c2
+currenciesDisplayName.GRD=\u0394\u03c1\u03b1\u03c7\u03bc\u1f74 \u1f19\u03bb\u03bb\u03ac\u03b4\u03b1\u03c2
+currenciesDisplayName.ERN=Nakfa \u1f18\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1\u03c2
+currenciesDisplayName.CLP=\u03a0\u03ad\u03c3\u03bf \u03a7\u03b9\u03bb\u1fc6\u03c2
+currenciesDisplayName.SUR=\u03a3\u03bf\u03b2\u03b9\u03b5\u03c4\u03b9\u03ba\u1f78 \u03a1\u03bf\u03cd\u03b2\u03bb\u03b9
+currenciesDisplayName.XBD=\u0395\u1f50\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u1f74 \u039c\u03bf\u03bd\u03ac\u03b4\u03b1 \u039b\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u1fe6 (XBD)
+currenciesDisplayName.XBC=\u0395\u1f50\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u1f74 \u039c\u03bf\u03bd\u03ac\u03b4\u03b1 \u039b\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u1fe6 (XBC)
+currenciesDisplayName.XBB=\u0395\u1f50\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u1f74 \u039d\u03bf\u03bc\u03b9\u03c3\u03bc\u03b1\u03c4\u03b9\u03ba\u1f74 \u039c\u03bf\u03bd\u03ac\u03b4\u03b1
+currenciesDisplayName.XBA=\u0395\u1f50\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u1f74 \u03a3\u03cd\u03bd\u03b8\u03b5\u03c4\u03b7 \u039c\u03bf\u03bd\u03ac\u03b4\u03b1
+currenciesDisplayName.CLF=Unidades de Fomento \u03a7\u03b9\u03bb\u1fc6\u03c2
+currenciesDisplayName.ZAR=\u03a1\u1f70\u03bd\u03c4 \u039d\u03cc\u03c4\u03b9\u03b1\u03c2 \u1f08\u03c6\u03c1\u03b9\u03ba\u1fc6\u03c2
+currenciesDisplayName.IQD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u1f38\u03c1\u03ac\u03ba
+currenciesDisplayName.FKP=\u039b\u03af\u03c1\u03b1 \u039d\u03ae\u03c3\u03c9\u03bd \u03a6\u03ce\u03bb\u03ba\u03bb\u03b1\u03bd\u03c4
+currenciesDisplayName.HKD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u03a7\u1f78\u03bd\u03b3\u03ba \u039a\u03cc\u03bd\u03b3\u03ba
+currenciesDisplayName.ARS=\u03a0\u03ad\u03c3\u03bf \u1f08\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u1fc6\u03c2
+currenciesDisplayName.ALL=\u039b\u1f72\u03ba \u1f08\u03bb\u03b2\u03b1\u03bd\u03af\u03b1\u03c2
+currenciesDisplayName.ZAL=\u03a1\u03b1\u03bd\u03c4 \u039d\u03cc\u03c4\u03b9\u03b1\u03c2 \u1f08\u03c6\u03c1\u03b9\u03ba\u1fc6\u03c2 (\u03bf\u1f30\u03ba\u03bf\u03bd\u03bf\u03bc\u03b9\u03ba\u03cc)
+currenciesDisplayName.JPY=\u0393\u03b9\u1f72\u03bd \u1f38\u03b1\u03c0\u03c9\u03bd\u03af\u03b1\u03c2
+currenciesDisplayName.ARP=\u03a0\u03ad\u03c3\u03bf \u1f08\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u1fc6\u03c2 (1983-1985)
+currenciesDisplayName.EEK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u1f18\u03c3\u03c4\u03bf\u03bd\u03af\u03b1\u03c2
+currenciesDisplayName.IDR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u1f38\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1\u03c2
+currenciesDisplayName.GQE=Ekwele Guineana \u1f38\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u1fc6\u03c2 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1\u03c2
+currenciesDisplayName.UZS=Sum \u039f\u1f50\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
+currenciesDisplayName.GWE=\u0393\u03ba\u03b9\u03bd\u03ad\u03b1 \u1f18\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1\u03c2
+currenciesDisplayName.NIO=\u03a7\u03c1\u03c5\u03c3\u1f74 \u039a\u03cc\u03c1\u03b4\u03bf\u03b2\u03b1 \u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1\u03c2
+currenciesDisplayName.SHP=\u039b\u03af\u03c1\u03b1 \u1f08\u03b3\u03af\u03b1\u03c2 \u1f19\u03bb\u03ad\u03bd\u03b7\u03c2
+currenciesDisplayName.ARA=Austral \u1f08\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u1fc6\u03c2
+currenciesDisplayName.SBD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039d\u03ae\u03c3\u03c9\u03bd \u03a3\u03bf\u03bb\u03bf\u03bc\u1ff6\u03bd\u03c4\u03bf\u03c2
+currenciesDisplayName.THB=\u039c\u03c0\u1f70\u03c4 \u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7\u03c2
+currenciesDisplayName.BEL=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0392\u03b5\u03bb\u03b3\u03af\u03bf\u03c5 (\u03bf\u1f30\u03ba\u03bf\u03bd\u03bf\u03bc\u03b9\u03ba\u03cc)
+currenciesDisplayName.MOP=Pataca \u039c\u03b1\u03ba\u03ac\u03bf\u03c5
+currenciesDisplayName.UGX=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u039f\u1f50\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1\u03c2
+currenciesDisplayName.WST=Tala \u0394\u03c5\u03c4\u03b9\u03ba\u1fc6\u03c2 \u03a3\u03b1\u03bc\u03cc\u03b1\u03c2
+currenciesDisplayName.TTD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u03a4\u03c1\u03b9\u03bd\u03b9\u03b4\u1f70\u03b4 \u03ba\u03b1\u1f76 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf
+currenciesDisplayName.UGS=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u039f\u1f50\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1\u03c2 (1966-1987)
+currenciesDisplayName.SZL=Lilangeni \u0396\u03bf\u03c5\u03b1\u03b6\u03b9\u03bb\u03ac\u03bd\u03b4\u03b7\u03c2
+currenciesDisplayName.UAK=Karbovanetz \u039f\u1f50\u03ba\u03c1\u03b1\u03bd\u03af\u03b1\u03c2
+currenciesDisplayName.AED=\u039d\u03c4\u03b9\u03c1\u1f70\u03bc \u1f29\u03bd\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd \u1f08\u03c1\u03b1\u03b2\u03b9\u03ba\u1ff6\u03bd \u1f18\u03bc\u03b9\u03c1\u03ac\u03c4\u03c9\u03bd
+currenciesDisplayName.UAH=Hryvnia \u039f\u1f50\u03ba\u03c1\u03b1\u03bd\u03af\u03b1\u03c2
+currenciesDisplayName.USS=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0397\u03a0\u0391 (\u1f3c\u03b4\u03b9\u03b1 \u1f21\u03bc\u03ad\u03c1\u03b1)
+currenciesDisplayName.DDM=Ostmark \u1f08\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03ba\u1fc6\u03c2 \u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1\u03c2
+currenciesDisplayName.UYU=\u03a0\u03ad\u03c3\u03bf Uruguayo \u039f\u1f50\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7\u03c2
+currenciesDisplayName.USN=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0397\u03a0\u0391 (\u1f19\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u1f21\u03bc\u03ad\u03c1\u03b1)
+currenciesDisplayName.TMM=\u039c\u03b1\u03bd\u1f70\u03c4 \u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd
+currenciesDisplayName.XFO=\u03a7\u03c1\u03c5\u03c3\u1f78 \u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u0393\u03b1\u03bb\u03bb\u03af\u03b1\u03c2
+currenciesDisplayName.AWG=\u0393\u03ba\u03af\u03bb\u03bd\u03c4\u03b1 \u1f08\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1
+currenciesDisplayName.UYP=\u03a0\u03ad\u03c3\u03bf \u039f\u1f50\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7\u03c2 (1975-1993)
+currenciesDisplayName.PTE=\u1f18\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1\u03c2
+currenciesDisplayName.JOD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u1f38\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1\u03c2
+currenciesDisplayName.ADP=\u03a0\u03b5\u03c3\u03ad\u03c4\u03b1 \u1f08\u03bd\u03b4\u03cc\u03c1\u03b1\u03c2
+currenciesDisplayName.ECV=Unidad de Valor Constante (UVC) \u1f38\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03bf\u1fe6
+currenciesDisplayName.ECS=Sucre \u1f38\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03bf\u1fe6
+currenciesDisplayName.PGK=Kina \u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1\u03c2
+currenciesDisplayName.CVE=\u1f18\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf\u03c5 \u1f08\u03ba\u03c1\u03c9\u03c4\u03b7\u03c1\u03af\u03bf\u03c5
+currenciesDisplayName.YER=Rial \u1f59\u03b5\u03bc\u03ad\u03bd\u03b7\u03c2
+currenciesDisplayName.HUF=\u03a6\u03b9\u03bf\u03c1\u03af\u03bd\u03b9 \u039f\u1f51\u03b3\u03b3\u03b1\u03c1\u03af\u03b1\u03c2
+currenciesDisplayName.PAB=\u039c\u03c0\u03b1\u03bb\u03bc\u03c0\u03cc\u03b1 \u03a0\u03b1\u03bd\u03b1\u03bc\u1fb6
+currenciesDisplayName.XEU=\u0395\u1f50\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u1f74 \u03a3\u03c5\u03bd\u03b1\u03bb\u03bb\u03b1\u03b3\u03bc\u03b1\u03c4\u03b9\u03ba\u1f74 \u039c\u03bf\u03bd\u03ac\u03b4\u03b1
+currenciesDisplayName.EUR=\u0395\u1f50\u03c1\u03ce
+currenciesDisplayName.MZE=\u1f18\u03c3\u03ba\u03bf\u03cd\u03b4\u03bf \u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7\u03c2
+currenciesDisplayName.INR=\u03a1\u03bf\u03cd\u03c0\u03b9\u03b1 \u1f38\u03bd\u03b4\u03af\u03b1\u03c2
+currenciesDisplayName.NAD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1\u03c2
+currenciesDisplayName.PYG=\u0393\u03ba\u03bf\u03c5\u03b1\u03c1\u03b1\u03bd\u1f76 \u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7\u03c2
+currenciesDisplayName.ITL=\u039b\u03b9\u03c1\u03ad\u03c4\u03b1 \u1f38\u03c4\u03b1\u03bb\u03af\u03b1\u03c2
+currenciesDisplayName.AOR=Kwanza Reajustado \u1f08\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1\u03c2 (1995-1999)
+currenciesDisplayName.GTQ=Quetzal \u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1\u03c2
+currenciesDisplayName.AON=\u039d\u03ad\u03b1 Kwanza \u1f08\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1\u03c2 (1990-2000)
+currenciesDisplayName.HTG=Gourde \u1f09\u03ca\u03c4\u1fc6\u03c2
+currenciesDisplayName.AOK=Kwanza \u1f08\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1\u03c2 (1977-1990)
+currenciesDisplayName.VEB=\u039c\u03c0\u03bf\u03bb\u03b9\u03b2\u1f70\u03bb \u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1\u03c2
+currenciesDisplayName.XDR=\u0395\u1f30\u03b4\u03b9\u03ba\u1f70 \u0394\u03b9\u03ba\u03b1\u03b9\u03ce\u03bc\u03b1\u03c4\u03b1 \u1f08\u03bd\u03ac\u03bb\u03b7\u03c8\u03b7\u03c2
+currenciesDisplayName.AOA=Kwanza \u1f08\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1\u03c2
+currenciesDisplayName.AUD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u0391\u1f50\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1\u03c2
+currenciesDisplayName.YDD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u1f59\u03b5\u03bc\u03ad\u03bd\u03b7\u03c2
+currenciesDisplayName.CHF=\u03a6\u03c1\u03ac\u03b3\u03ba\u03bf \u1f19\u03bb\u03b2\u03b5\u03c4\u03af\u03b1\u03c2
+currenciesDisplayName.NLG=\u0393\u03ba\u03af\u03bb\u03bd\u03c4\u03b1 \u1f49\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
+currenciesDisplayName.ISK=\u039a\u03bf\u03c1\u03cc\u03bd\u03b1 \u1f38\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1\u03c2
+currenciesDisplayName.MXV=Unidad de Inversion (UDI) \u039c\u03b5\u03be\u03b9\u03ba\u03bf\u1fe6
+currenciesDisplayName.ETB=Birr \u0391\u1f30\u03b8\u03b9\u03bf\u03c0\u03af\u03b1\u03c2
+currenciesDisplayName.MXP=\u1f08\u03c3\u03b7\u03bc\u03ad\u03bd\u03b9\u03bf \u03a0\u03ad\u03c3\u03bf \u039c\u03b5\u03be\u03b9\u03ba\u03bf\u1fe6 (1861-1992)
+currenciesDisplayName.ATS=\u03a3\u03b5\u03bb\u03af\u03bd\u03b9 \u0391\u1f50\u03c3\u03c4\u03c1\u03af\u03b1\u03c2
+currenciesDisplayName.MXN=\u03a0\u03ad\u03c3\u03bf \u039c\u03b5\u03be\u03b9\u03ba\u03bf\u1fe6
+currenciesDisplayName.EGP=\u039b\u03af\u03c1\u03b1 \u0391\u1f30\u03b3\u03cd\u03c0\u03c4\u03bf\u03c5
+currenciesDisplayName.DZD=\u0394\u03b7\u03bd\u03ac\u03c1\u03b9\u03bf \u1f08\u03bb\u03b3\u03b5\u03c1\u03af\u03b1\u03c2
+currenciesDisplayName.GMD=Dalasi \u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1\u03c2
+currenciesDisplayName.ANG=\u0393\u03ba\u03af\u03bb\u03bd\u03c4\u03b1 \u1f49\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u1ff6\u03bd \u1f08\u03bd\u03c4\u03b9\u03bb\u03bb\u1ff6\u03bd
+currenciesDisplayName.ILS=\u039d\u03ad\u03bf Sheqel \u1f38\u03c3\u03c1\u03b1\u03ae\u03bb
+currenciesDisplayName.ESP=\u03a0\u03b5\u03c3\u03ad\u03c4\u03b1 \u1f39\u03c3\u03c0\u03b1\u03bd\u03af\u03b1\u03c2
+currenciesDisplayName.AZM=\u039c\u03b1\u03bd\u1f70\u03c4 \u1f08\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd
+currenciesDisplayName.ILP=\u039b\u03af\u03c1\u03b1 \u1f38\u03c3\u03c1\u03b1\u03ae\u03bb
+currenciesDisplayName.IRR=Rial \u1f38\u03c1\u03ac\u03ba
+currenciesDisplayName.BAM=\u039c\u03ac\u03c1\u03ba\u03bf \u0392\u03bf\u03c3\u03bd\u03af\u03b1\u03c2-\u1f19\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7\u03c2
+currenciesDisplayName.CAD=\u0394\u03bf\u03bb\u03ac\u03c1\u03b9\u03bf \u039a\u03b1\u03bd\u03b1\u03b4\u1fb6
+currenciesDisplayName.BGN=\u039d\u03ad\u03bf \u039b\u1f72\u03b2 \u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1\u03c2
+currenciesSymbol.CYP= \u00a3
+currenciesSymbol.CRC= C
+currenciesSymbol.KZT= T
+currenciesSymbol.ZAR= R
+currenciesSymbol.SZL= E
+currenciesSymbol.CNY= Y
+currenciesSymbol.GTQ= Q
+currenciesSymbol.EUR= \u20ac
+currenciesSymbol.GBP= \u00a3
+shortMonths=\u1f38\u03b1\u03bd®®®\u1f08\u03c0\u03c1®®\u1f38\u03bf\u03c5\u03bd®\u1f38\u03bf\u03c5\u03bb®\u0391\u1f50\u03b3®®\u1f48\u03ba\u03c4®®®®
+months=\u1f38\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2®®®\u1f08\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2®®\u1f38\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2®\u1f38\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2®\u0391\u1f54\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2®®\u1f48\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2®®®®
+territories.AU=\u0391\u1f50\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1
+territories.TD=\u03a4\u03c3\u03ac\u03bd\u03c4
+territories.AT=\u0391\u1f50\u03c3\u03c4\u03c1\u03af\u03b1
+territories.TC=\u039d\u1fc6\u03c3\u03bf\u03b9 \u03a4\u1f72\u03c1\u03ba\u03c2 \u03ba\u03b1\u1f76 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2
+territories.AS=\u1f08\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u1f74 \u03a3\u03b1\u03bc\u03cc\u03b1
+territories.AR=\u1f08\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae
+territories.AQ=\u1f08\u03bd\u03c4\u03b1\u03c1\u03ba\u03c4\u03b9\u03ba\u03ae
+territories.AO=\u1f08\u03bd\u03b3\u03ba\u03cc\u03bb\u03b1
+territories.AN=\u1f49\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u1f72\u03c2 \u1f08\u03bd\u03c4\u03af\u03bb\u03bb\u03b5\u03c2
+territories.GS=\u039d\u03cc\u03c4\u03b9\u03b1 \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 \u03ba\u03b1\u1f76 \u039d\u03ae\u03c3\u03bf\u03b9 \u039d\u03cc\u03c4\u03b9\u03b5\u03c2 \u03a3\u03ac\u03bd\u03c4\u03bf\u03c5\u03b9\u03c4\u03c2
+territories.AM=\u1f08\u03c1\u03bc\u03b5\u03bd\u03af\u03b1
+territories.GR=\u1f19\u03bb\u03bb\u03ac\u03b4\u03b1
+territories.ZA=\u039d\u03cc\u03c4\u03b9\u03b1 \u1f08\u03c6\u03c1\u03b9\u03ba\u03ae
+territories.AL=\u1f08\u03bb\u03b2\u03b1\u03bd\u03af\u03b1
+territories.GQ=\u1f38\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u1f74 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1
+territories.SY=\u03a3\u03c5\u03c1\u03af\u03b1, \u1f08\u03c1\u03b1\u03b2\u03b9\u03ba\u1f74 \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u1fc6\u03c2
+territories.AI=\u1f08\u03bd\u03b3\u03ba\u03bf\u03c5\u03af\u03bb\u03b1
+territories.SV=\u1f1a\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1
+territories.AG=\u1f08\u03bd\u03c4\u03af\u03b3\u03ba\u03bf\u03c5\u03b1 \u03ba\u03b1\u1f76 \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03bf\u03cd\u03bd\u03c4\u03b1
+territories.AF=\u1f08\u03c6\u03b3\u03b1\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd
+territories.MP=\u039d\u1fc6\u03c3\u03bf\u03b9 \u0392\u03cc\u03c1\u03b5\u03b9\u03b5\u03c2 \u039c\u03b1\u03c1\u03b9\u03ac\u03bd\u03b5\u03c2
+territories.ST=\u03a3\u03ac\u03bf \u03a4\u03bf\u03bc\u1f72 \u03ba\u03b1\u1f76 \u03a0\u03c1\u03af\u03bd\u03c3\u03b9\u03c0\u03b5
+territories.AE=\u1f28\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u1f08\u03c1\u03b1\u03b2\u03b9\u03ba\u1f70 \u1f18\u03bc\u03b9\u03c1\u03ac\u03c4\u03b1
+territories.MO=\u039c\u03b1\u03ba\u03ac\u03bf, \u0395\u1f30\u03b4\u03b9\u03ba\u1f74 \u0394\u03b9\u03bf\u03b9\u03ba\u03b7\u03c4\u03b9\u03ba\u1f74 \u03a0\u03b5\u03c1\u03b9\u03c6\u03ad\u03c1\u03b5\u03b9\u03b1 \u03c4\u1fc6\u03c2 \u039a\u03af\u03bd\u03b1\u03c2
+territories.AD=\u1f08\u03bd\u03b4\u03cc\u03c1\u03b1
+territories.ML=\u039c\u03b1\u03bb\u03af
+territories.GF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u1f74 \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1
+territories.SM=\u1f0d\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c2
+territories.MH=\u039d\u1fc6\u03c3\u03bf\u03b9 \u039c\u03ac\u03c1\u03c3\u03b1\u03bb
+territories.GB=\u1f29\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf \u0392\u03b1\u03c3\u03af\u03bb\u03b5\u03b9\u03bf
+territories.SJ=\u039d\u1fc6\u03c3\u03bf\u03b9 \u03a3\u03b2\u03ac\u03bb\u03bc\u03c0\u03b1\u03c1 \u03ba\u03b1\u1f76 \u0393\u03b9\u1f70\u03bd \u039c\u03b1\u03b3\u03b9\u03ad\u03bd
+territories.MD=\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1, \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u1fc6\u03c2
+territories.SH=\u1f09\u03b3\u03af\u03b1 \u1f19\u03bb\u03ad\u03bd\u03b7
+territories.SB=\u039d\u1fc6\u03c3\u03bf\u03b9 \u03a3\u03bf\u03bb\u03bf\u03bc\u1ff6\u03bd\u03c4\u03bf\u03c2
+territories.SA=\u03a3\u03b1\u03bf\u03c5\u03b4\u03b9\u03ba\u1f74 \u1f08\u03c1\u03b1\u03b2\u03af\u03b1
+territories.YE=\u1f59\u03b5\u03bc\u03ad\u03bd\u03b7
+territories.LU=\u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u1fe6\u03c1\u03b3\u03bf
+territories.FO=\u039d\u1fc6\u03c3\u03bf\u03b9 \u03a6\u03b5\u03c1\u03cc\u03b5\u03c2
+territories.FM=\u039c\u03b9\u03ba\u03c1\u03bf\u03bd\u03b7\u03c3\u03af\u03b1, \u1f49\u03bc\u03cc\u03c3\u03c0\u03bf\u03bd\u03b4\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u1fd6\u03b5\u03c2 \u03c4\u1fc6\u03c2
+territories.LK=\u03a3\u03c1\u1f76 \u039b\u03ac\u03bd\u03ba\u03b1
+territories.LC=\u1f09\u03b3\u03af\u03b1 \u039b\u03bf\u03c5\u03ba\u03af\u03b1
+territories.LA=\u039b\u03b1\u03c4\u03b9\u03bd\u03b9\u03ba\u1f74 \u1f08\u03bc\u03b5\u03c1\u03b9\u03ba\u03ae
+territories.ET=\u0391\u1f30\u03b8\u03b9\u03bf\u03c0\u03af\u03b1
+territories.KY=\u039d\u1fc6\u03c3\u03bf\u03b9 \u039a\u03ad\u03b9\u03bc\u03b1\u03bd
+territories.ES=\u1f39\u03c3\u03c0\u03b1\u03bd\u03af\u03b1
+territories.ER=\u1f18\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1
+territories.KN=\u03a3\u03b1\u1f76\u03bd\u03c4 \u039a\u1f76\u03c4\u03c2 \u03ba\u03b1\u1f76 \u039d\u03ad\u03b2\u03b9\u03c2
+territories.EH=\u0394\u03c5\u03c4\u03b9\u03ba\u1f74 \u03a3\u03b1\u03c7\u03ac\u03c1\u03b1
+territories.EG=\u0391\u1f34\u03b3\u03c5\u03c0\u03c4\u03bf\u03c2
+territories.EE=\u1f18\u03c3\u03b8\u03bf\u03bd\u03af\u03b1
+territories.EC=\u1f38\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03cc\u03c2
+territories.DZ=\u1f08\u03bb\u03b3\u03b5\u03c1\u03af\u03b1
+territories.WF=\u039d\u1fc6\u03c3\u03bf\u03b9 \u039f\u1f50\u03ac\u03bb\u03bb\u03b9\u03c2 \u03ba\u03b1\u1f76 \u03a6\u03bf\u03c5\u03c4\u03bf\u03c5\u03bd\u03ac
+territories.DO=\u0394\u03bf\u03bc\u03b9\u03bd\u03b9\u03ba\u03b1\u03bd\u1f74 \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1
+territories.JP=\u1f38\u03b1\u03c0\u03c9\u03bd\u03af\u03b1
+territories.JO=\u1f38\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1
+territories.PS=\u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03b9\u03bd\u03b9\u03b1\u03ba\u1f70 \u1f18\u03b4\u03ac\u03c6\u03b7
+territories.PM=\u03a3\u03b1\u1f76\u03bd\u03c4 \u03a0\u03b9\u1f72\u03c1 \u03ba\u03b1\u1f76 \u039c\u03b9\u03ba\u03b5\u03bb\u03cc\u03bd
+territories.PF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u1f74 \u03a0\u03bf\u03bb\u03c5\u03bd\u03b7\u03c3\u03af\u03b1
+territories.VI=\u1f08\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u1f72\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03bf\u03b9 \u039d\u1fc6\u03c3\u03bf\u03b9
+territories.CX=\u039d\u1fc6\u03c3\u03bf\u03c2 \u03a7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c5\u03b3\u03ad\u03bd\u03bd\u03c9\u03bd
+territories.VG=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u1f72\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03bf\u03b9 \u039d\u1fc6\u03c3\u03bf\u03b9
+territories.CV=\u039d\u1fc6\u03c3\u03bf\u03b9 \u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf\u03c5 \u1f08\u03ba\u03c1\u03c9\u03c4\u03b7\u03c1\u03af\u03bf\u03c5
+territories.VC=\u1f0d\u03b3\u03b9\u03bf\u03c2 \u0392\u03b9\u03ba\u03ad\u03bd\u03c4\u03b9\u03bf\u03c2 \u03ba\u03b1\u1f76 \u0393\u03c1\u03b5\u03bd\u03b1\u03b4\u03af\u03bd\u03b5\u03c2
+territories.VA=\u1f09\u03b3\u03af\u03b1 \u1f1d\u03b4\u03c1\u03b1 (\u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03cc)
+territories.IT=\u1f38\u03c4\u03b1\u03bb\u03af\u03b1
+territories.IS=\u1f38\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+territories.IR=\u1f38\u03c1\u03ac\u03bd, \u1f38\u03c3\u03bb\u03b1\u03bc\u03b9\u03ba\u1f74 \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03bf\u1fe6
+territories.IQ=\u1f38\u03c1\u03ac\u03ba
+territories.UZ=\u039f\u1f50\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd
+territories.CK=\u039d\u1fc6\u03c3\u03bf\u03b9 \u039a\u03bf\u03cd\u03ba
+territories.UY=\u039f\u1f50\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7
+territories.IO=\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u1f70 \u1f18\u03b4\u03ac\u03c6\u03b7 \u1f38\u03bd\u03b4\u03b9\u03ba\u03bf\u1fe6 \u1f68\u03ba\u03b5\u03b1\u03bd\u03bf\u1fe6
+territories.CI=\u1f08\u03ba\u03c4\u1f74 \u1f18\u03bb\u03b5\u03c6\u03b1\u03bd\u03c4\u03cc\u03b4\u03bf\u03bd\u03c4\u03bf\u03c2
+territories.IN=\u1f38\u03bd\u03b4\u03af\u03b1
+territories.CH=\u1f19\u03bb\u03b2\u03b5\u03c4\u03af\u03b1
+territories.IL=\u1f38\u03c3\u03c1\u03b1\u03ae\u03bb
+territories.CF=\u039a\u03b5\u03bd\u03c4\u03c1\u03bf\u03b1\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u1f74 \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1
+territories.US=\u1f29\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u1fd6\u03b5\u03c2
+territories.CD=\u039a\u03bf\u03bd\u03b3\u03ba\u03cc, \u039b\u03b1\u03ca\u03ba\u1f74 \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1 \u03c4\u03bf\u1fe6
+territories.OM=\u1f48\u03bc\u03ac\u03bd
+territories.CC=\u039d\u1fc6\u03c3\u03bf\u03b9 \u039a\u03cc\u03ba\u03bf\u03c2 (\u039a\u03ae\u03bb\u03b9\u03bd\u03b3\u03ba)
+territories.IE=\u1f38\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+territories.ID=\u1f38\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1
+territories.UM=\u1f08\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u039d\u03b7\u03c3\u03af\u03b4\u03b5\u03c2 \u03c4\u1ff6\u03bd \u1f29\u03bd\u03c9\u03bc\u03ad\u03bd\u03c9\u03bd \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03b9\u1ff6\u03bd
+territories.UG=\u039f\u1f50\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1
+territories.BV=\u039d\u1fc6\u03c3\u03bf\u03c2 \u039c\u03c0\u03bf\u03c5\u03b2\u03ad
+territories.UA=\u039f\u1f50\u03ba\u03c1\u03b1\u03bd\u03af\u03b1
+territories.HU=\u039f\u1f51\u03b3\u03b3\u03b1\u03c1\u03af\u03b1
+territories.HT=\u1f09\u03ca\u03c4\u03ae
+territories.BM=\u0392\u03b5\u03c1\u03bc\u03bf\u1fe6\u03b4\u03b5\u03c2
+territories.HN=\u1f49\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1
+territories.HM=\u039d\u1fc6\u03c3\u03bf\u03b9 \u03a7\u1f72\u03c1\u03bd\u03c4 \u03ba\u03b1\u1f76 \u039c\u03b1\u03ba\u03bd\u03c4\u03cc\u03bd\u03b1\u03bb\u03bd\u03c4
+territories.HK=\u03a7\u1f78\u03bd\u03b3\u03ba \u039a\u03cc\u03bd\u03b3\u03ba, \u0395\u1f30\u03b4\u03b9\u03ba\u1f74 \u0394\u03b9\u03bf\u03b9\u03ba\u03b7\u03c4\u03b9\u03ba\u1f74 \u03a0\u03b5\u03c1\u03b9\u03c6\u03ad\u03c1\u03b5\u03b9\u03b1 \u03c4\u1fc6\u03c2 \u039a\u03af\u03bd\u03b1\u03c2
+territories.TT=\u03a4\u03c1\u03b9\u03bd\u03b9\u03b4\u1f70\u03b4 \u03ba\u03b1\u1f76 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf
+territories.NL=\u1f49\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1
+territories.BA=\u0392\u03bf\u03c3\u03bd\u03af\u03b1 - \u1f18\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7
+territories.TL=\u1f08\u03bd\u03b1\u03c4\u03bf\u03bb\u03b9\u03ba\u1f78 \u03a4\u03b9\u03bc\u03cc\u03c1
+territories.NF=\u039d\u1fc6\u03c3\u03bf\u03c2 \u039d\u03cc\u03c1\u03c6\u03bf\u03bb\u03ba
+territories.AZ=\u1f08\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd
+territories.AW=\u1f08\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1
+territories.TF=\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u1f70 \u039d\u03cc\u03c4\u03b9\u03b1 \u1f18\u03b4\u03ac\u03c6\u03b7
+languages.ja=\u1f38\u03b1\u03c0\u03c9\u03bd\u03b9\u03ba\u03ac
+languages.en=\u1f08\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac
+languages.el=\u1f19\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+languages.phi=\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03b9\u03bd\u03ad\u03b6\u03b9\u03ba\u03b1 (\u1f04\u03bb\u03bb\u03b1)
+languages.cy=\u039f\u1f50\u03b1\u03bb\u03b9\u03ba\u03ac
+languages.nl=\u1f49\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+languages.he=\u1f19\u03b2\u03c1\u03b1\u03ca\u03ba\u03ac
+languages.it=\u1f38\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac
+languages.is=\u1f38\u03c3\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
+languages.sla=\u03a3\u03bb\u03b1\u03b2\u03b9\u03ba\u1f70 (\u1f04\u03bb\u03bb\u03b1)
+languages.egy=\u0391\u1f30\u03b3\u03c5\u03c0\u03c4\u03b9\u03b1\u03ba\u1f70 (\u1f00\u03c1\u03c7\u03b1\u1fd6\u03b1)
+languages.arc=\u1f08\u03c1\u03b1\u03bc\u03b1\u03ca\u03ba\u03ac
+languages.ine=\u1f38\u03bd\u03b4\u03bf\u03b5\u03c5\u03c1\u03c9\u03c0\u03b1\u03ca\u03ba\u1f70 (\u1f04\u03bb\u03bb\u03b1)
+languages.uk=\u039f\u1f50\u03ba\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac
+languages.ar=\u1f08\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac
+languages.id=\u1f38\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03b9\u03b1\u03ba\u03ac
+languages.nai=\u1f38\u03bd\u03b4\u03b9\u03b1\u03bd\u03b9\u03ba\u1f70 \u03b2\u03cc\u03c1\u03b5\u03b9\u03b1\u03c2 \u1f08\u03bc\u03b5\u03c1\u03b9\u03ba\u1fc6\u03c2 (\u1f04\u03bb\u03bb\u03b1)
+languages.sem=\u03a3\u03b7\u03bc\u03b9\u03c4\u03b9\u03ba\u1f70 (\u1f04\u03bb\u03bb\u03b1)
+languages.grc=\u1f19\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, \u1f00\u03c1\u03c7\u03b1\u1fd6\u03b1 \u03baa\u1f76 \u03bc\u03b5\u03c3\u03b1\u03b9\u03c9\u03bd\u03b9\u03ba\u1f70 (\u1f15\u03c9\u03c2 \u03c4\u1f78 1453)
+languages.sq=\u1f08\u03bb\u03b2\u03b1\u03bd\u03b9\u03ba\u03ac
+languages.ota=\u03a4\u03bf\u03c5\u03c1\u03ba\u03b9\u03ba\u03ac, \u1f40\u03b8\u03c9\u03bc\u03b1\u03bd\u03b9\u03ba\u1f70 (1500-1928)
+languages.mul=\u03a0\u03bf\u03bb\u03bb\u03b1\u03c0\u03bb\u03ad\u03c2 \u03b3\u03bb\u1ff6\u03c3\u03c3\u03b5\u03c2
+languages.ira=\u1f38\u03c1\u03b1\u03bd\u03b9\u03ba\u03ac
+languages.hy=\u1f08\u03c1\u03bc\u03b5\u03bd\u03b9\u03ba\u03ac
+languages.et=\u1f18\u03c3\u03b8\u03bf\u03bd\u03b9\u03ba\u03ac
+languages.hu=\u039f\u1f51\u03b3\u03b3\u03c1\u03b9\u03ba\u03ac
+languages.es=\u1f39\u03c3\u03c0\u03b1\u03bd\u03b9\u03ba\u03ac
+languages.gd=\u03a3\u03ba\u03c9\u03c4\u03b9\u03ba\u1f70 \u03ba\u03b5\u03bb\u03c4\u03b9\u03ba\u03ac
+languages.yi=\u1f38\u03bf\u03c5\u03b4\u03b1\u03ca\u03ba\u03ac
+languages.peo=\u1f08\u03c1\u03c7\u03b1\u1fd6\u03b1 \u03c0\u03b5\u03c1\u03c3\u03b9\u03ba\u1f70 (600-400 \u03c0.\u03a7.)
+languages.ga=\u1f38\u03c1\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03ac
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_IQ.properties b/resource/gnu/java/locale/LocaleInformation_el_CY.properties
index d0fc8f872..609c5af6a 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_IQ.properties
+++ b/resource/gnu/java/locale/LocaleInformation_el_CY.properties
@@ -1,8 +1,8 @@
-# LocaleInformation_ar_IQ.properties --
+# LocaleInformation_el_CY.properties --
# Copyright (C) 1991-2005 Unicode, Inc.
# All rights reserved. Distributed under the Terms of Use
# in http://www.unicode.org/copyright.html.
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4 #,##0.000;\u00a4 #,##0.000-
+currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
diff --git a/resource/gnu/java/locale/LocaleInformation_en.properties b/resource/gnu/java/locale/LocaleInformation_en.properties
index 1dc56b860..6195ff494 100644
--- a/resource/gnu/java/locale/LocaleInformation_en.properties
+++ b/resource/gnu/java/locale/LocaleInformation_en.properties
@@ -6,783 +6,369 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.JOD=Jordanian Dinar
-currenciesDisplayName.BOV=Bolivian Mvdol
-currenciesDisplayName.XAU=Gold
-currenciesDisplayName.FOK=Faeroe Islands Kronur
-currenciesDisplayName.LBP=Lebanese Pound
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Vietnamese Dong
-currenciesDisplayName.TZS=Tanzanian Shilling
-currenciesDisplayName.BOP=Bolivian Peso
-currenciesDisplayName.KHR=Cambodian Riel
-currenciesDisplayName.XAM=Asian Monetary Unit
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Cambodian Old Riel
-currenciesDisplayName.ZMP=Zambian Pound
-currenciesDisplayName.AUP=Australian Pound
-currenciesDisplayName.XAG=Silver
-currenciesDisplayName.XAF=CFA Franc BEAC
-currenciesDisplayName.MTP=Maltese Pound
-currenciesDisplayName.GHR=Ghana Revalued Cedi
-currenciesDisplayName.ZMK=Zambian Kwacha
-currenciesDisplayName.XAD=Asian Dinar Unit of Account
-currenciesDisplayName.GHP=Ghana Pound
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Ghana Old Cedi
-currenciesDisplayName.MTL=Maltese Lira
-currenciesDisplayName.AUD=Australian Dollar
-currenciesDisplayName.USS=US Dollar (Same day)
-currenciesDisplayName.ITL=Italian Lira
-currenciesDisplayName.USN=US Dollar (Next day)
-currenciesDisplayName.GHC=Ghana Cedi
-currenciesDisplayName.SGD=Singapore Dollar
-currenciesDisplayName.PAB=Panamanian Balboa
-currenciesDisplayName.LAK=Laotian Kip
-currenciesDisplayName.KGS=Kyrgystan Som
-currenciesDisplayName.CHF=Swiss Franc
-currenciesDisplayName.CHE=WIR Euro
-currenciesDisplayName.CHC=WIR Franc
-currenciesDisplayName.ATS=Austrian Schilling
-currenciesDisplayName.USD=US Dollar
-currenciesDisplayName.ETD=Ethiopian Dollar
-currenciesDisplayName.BND=Brunei Dollar
-currenciesDisplayName.JMP=Jamaican Pound
-currenciesDisplayName.ETB=Ethiopian Birr
-currenciesDisplayName.XXX=No Currency
-currenciesDisplayName.DZG=Algerian Franc Germinal
-currenciesDisplayName.DZF=Algerian New Franc
-currenciesDisplayName.DZD=Algerian Dinar
-currenciesDisplayName.PYG=Paraguay Guarani
-currenciesDisplayName.LYP=Libyan Pound
-currenciesDisplayName.JMD=Jamaican Dollar
-currenciesDisplayName.ISK=Icelandic Krona
-currenciesDisplayName.ESP=Spanish Peseta
-currenciesDisplayName.BMP=Bermudan Pound
-currenciesDisplayName.LYD=Libyan Dinar
-currenciesDisplayName.LYB=Libyan British Military Authority Lira
-currenciesDisplayName.BMD=Bermudan Dollar
-currenciesDisplayName.NLG=Netherlands Guilder
-currenciesDisplayName.MRO=Mauritania Ouguiya
-currenciesDisplayName.ESB=Spanish Peseta (convertible account)
-currenciesDisplayName.ESA=Spanish Peseta (A account)
-currenciesDisplayName.IRR=Iranian Rial
-currenciesDisplayName.CFP=CFP Franc
-currenciesDisplayName.SEK=Swedish Krona
-currenciesDisplayName.ERN=Eritrean Nakfa
+currenciesDisplayName.YDD=Yemeni Dinar
+currenciesDisplayName.TWD=Taiwan New Dollar
currenciesDisplayName.KES=Kenyan Shilling
-currenciesDisplayName.CFF=Central African Republic CFA Franc
+currenciesDisplayName.BYB=Belarussian New Ruble (1994-1999)
+currenciesDisplayName.LKR=Sri Lanka Rupee
+currenciesDisplayName.RWF=Rwandan Franc
+currenciesDisplayName.TJS=Tajikistan Somoni
+currenciesDisplayName.SDP=Sudanese Pound
+currenciesDisplayName.TJR=Tajikistan Ruble
+currenciesDisplayName.ERN=Eritrean Nakfa
+currenciesDisplayName.AFN=Afghani
+currenciesDisplayName.GRD=Greek Drachma
+currenciesDisplayName.IEP=Irish Pound
currenciesDisplayName.ARS=Argentine Peso
+currenciesDisplayName.SDD=Sudanese Dinar
currenciesDisplayName.ARP=Argentine Peso (1983-1985)
-currenciesDisplayName.ARM=Argentine Peso Moneda Nacional
-currenciesDisplayName.TWD=Taiwan New Dollar
-currenciesDisplayName.SDR=IMF SDR
-currenciesDisplayName.SDP=Sudanese Pound
currenciesDisplayName.GEL=Georgian Lari
+currenciesDisplayName.AFA=Afghani (1927-2002)
currenciesDisplayName.GEK=Georgian Kupon Larit
-currenciesDisplayName.MQF=Martinique Franc
+currenciesDisplayName.CRC=Costa Rican Colon
currenciesDisplayName.FKP=Falkland Islands Pound
+currenciesDisplayName.EEK=Estonian Kroon
+currenciesDisplayName.HKD=Hong Kong Dollar
+currenciesDisplayName.MDL=Moldovan Leu
currenciesDisplayName.ARA=Argentine Austral
-currenciesDisplayName.SDD=Sudanese Dinar
currenciesDisplayName.IQD=Iraqi Dinar
-currenciesDisplayName.EQE=Ekwele
-currenciesDisplayName.TVD=Tuvalu Dollar
currenciesDisplayName.SCR=Seychelles Rupee
+currenciesDisplayName.VUV=Vanuatu Vatu
+currenciesDisplayName.DKK=Danish Krone
+currenciesDisplayName.KPW=North Korean Won
+currenciesDisplayName.GQE=Equatorial Guinea Ekwele Guineana
+currenciesDisplayName.IDR=Indonesian Rupiah
currenciesDisplayName.LVR=Latvian Ruble
-currenciesDisplayName.FJP=Fiji Pound
+currenciesDisplayName.SOS=Somali Shilling
+currenciesDisplayName.EQE=Ekwele
+currenciesDisplayName.AED=United Arab Emirates Dirham
+currenciesDisplayName.BWP=Botswanan Pula
currenciesDisplayName.LVL=Latvian Lats
-currenciesDisplayName.CDL=Congolese Zaire
-currenciesDisplayName.CDG=Congolese Republic Franc
-currenciesDisplayName.CDF=Congolese Franc Congolais
-currenciesDisplayName.FJD=Fiji Dollar
+currenciesDisplayName.RUR=Russian Ruble (1991-1998)
currenciesDisplayName.NIO=Nicaraguan Cordoba Oro
+currenciesDisplayName.XTS=Testing Currency Code
+currenciesDisplayName.ADP=Andorran Peseta
+currenciesDisplayName.FJD=Fiji Dollar
currenciesDisplayName.MOP=Macao Pataca
-currenciesDisplayName.NIG=Nicaraguan Gold Cordoba
+currenciesDisplayName.RUB=Russian Ruble
+currenciesDisplayName.CDF=Congolese Franc Congolais
currenciesDisplayName.NIC=Nicaraguan Cordoba
-currenciesDisplayName.XTS=Testing Currency Code
-currenciesDisplayName.XTR=COMECON Transferable Ruble
-currenciesDisplayName.LUL=Luxembourg Financial Franc
-currenciesDisplayName.FIN=Finnish Markka (1860-1962)
-currenciesDisplayName.FIM=Finnish Markka
+currenciesDisplayName.DJF=Djibouti Franc
+currenciesDisplayName.ECV=Ecuador Unidad de Valor Constante (UVC)
currenciesDisplayName.SBD=Solomon Islands Dollar
+currenciesDisplayName.UZS=Uzbekistan Sum
+currenciesDisplayName.LUL=Luxembourg Financial Franc
+currenciesDisplayName.ECS=Ecuador Sucre
+currenciesDisplayName.PHP=Philippine Peso
+currenciesDisplayName.THB=Thai Baht
currenciesDisplayName.LUF=Luxembourg Franc
-currenciesDisplayName.LUC=Luxembourg Convertible Franc
-currenciesDisplayName.TTO=Trinidad and Tobago Old Dollar
-currenciesDisplayName.AOS=Angolan Escudo
-currenciesDisplayName.AOR=Angolan Kwanza Reajustado (1995-1999)
currenciesDisplayName.RHD=Rhodesian Dollar
-currenciesDisplayName.MNT=Mongolian Tugrik
-currenciesDisplayName.HUF=Hungarian Forint
-currenciesDisplayName.BIF=Burundi Franc
-currenciesDisplayName.AON=Angolan New Kwanza (1990-2000)
-currenciesDisplayName.AOK=Angolan Kwanza (1977-1990)
+currenciesDisplayName.FIM=Finnish Markka
+currenciesDisplayName.LUC=Luxembourg Convertible Franc
currenciesDisplayName.TTD=Trinidad and Tobago Dollar
currenciesDisplayName.SZL=Swaziland Lilangeni
-currenciesDisplayName.NHF=New Hebrides CFP Franc
-currenciesDisplayName.GBP=British Pound Sterling
-currenciesDisplayName.SAS=Saudi Sovereign Riyal
+currenciesDisplayName.MNT=Mongolian Tugrik
currenciesDisplayName.SAR=Saudi Riyal
+currenciesDisplayName.UAK=Ukrainian Karbovanetz
+currenciesDisplayName.COU=Unidad de Valor Real
+currenciesDisplayName.UAH=Ukrainian Hryvnia
+currenciesDisplayName.HUF=Hungarian Forint
+currenciesDisplayName.COP=Colombian Peso
+currenciesDisplayName.QAR=Qatari Rial
currenciesDisplayName.LTT=Lithuanian Talonas
-currenciesDisplayName.INR=Indian Rupee
currenciesDisplayName.PTE=Portuguese Escudo
-currenciesDisplayName.AOA=Angolan Kwanza
-currenciesDisplayName.PTC=Portuguese Conto
+currenciesDisplayName.AOR=Angolan Kwanza Reajustado (1995-1999)
+currenciesDisplayName.UYU=Uruguay Peso Uruguayo
+currenciesDisplayName.GBP=British Pound Sterling
+currenciesDisplayName.BIF=Burundi Franc
+currenciesDisplayName.INR=Indian Rupee
+currenciesDisplayName.ZRZ=Zairean Zaire
+currenciesDisplayName.AON=Angolan New Kwanza (1990-2000)
currenciesDisplayName.LTL=Lithuanian Lita
+currenciesDisplayName.XFU=French UIC-Franc
currenciesDisplayName.KZT=Kazakhstan Tenge
-currenciesDisplayName.KZR=Kazakhstan Ruble
-currenciesDisplayName.VGD=British Virgin Islands Dollar
-currenciesDisplayName.NGP=Nigerian Pound
-currenciesDisplayName.MMX=Myanmar Dollar Foreign Exchange Certificates
+currenciesDisplayName.MZM=Mozambique Metical
+currenciesDisplayName.UYP=Uruguay Peso (1975-1993)
+currenciesDisplayName.AOK=Angolan Kwanza (1977-1990)
+currenciesDisplayName.BUK=Burmese Kyat
+currenciesDisplayName.GNS=Guinea Syli
+currenciesDisplayName.XFO=French Gold Franc
+currenciesDisplayName.PGK=Papua New Guinea Kina
+currenciesDisplayName.SYP=Syrian Pound
+currenciesDisplayName.MZE=Mozambique Escudo
+currenciesDisplayName.OMR=Oman Rial
currenciesDisplayName.NGN=Nigerian Naira
+currenciesDisplayName.ZRN=Zairean New Zaire
+currenciesDisplayName.AOA=Angolan Kwanza
+currenciesDisplayName.CNY=Chinese Yuan Renminbi
+currenciesDisplayName.MAF=Moroccan Franc
+currenciesDisplayName.GNF=Guinea Franc
currenciesDisplayName.HTG=Haitian Gourde
-currenciesDisplayName.SYP=Syrian Pound
-currenciesDisplayName.PSP=Palestine Pound
-currenciesDisplayName.BHD=Bahraini Dinar
+currenciesDisplayName.MAD=Moroccan Dirham
+currenciesDisplayName.TRY=New Turkish Lira
currenciesDisplayName.MMK=Myanmar Kyat
-currenciesDisplayName.ANG=Netherlands Antillan Guilder
-currenciesDisplayName.CZK=Czech Republic Koruna
-currenciesDisplayName.IMP=Isle of Man Pound Sterling
+currenciesDisplayName.MYR=Malaysian Ringgit
+currenciesDisplayName.XRE=RINET Funds
currenciesDisplayName.LSM=Maloti
-currenciesDisplayName.BGX=Bulgarian Lev Foreign Exchange Certificates
-currenciesDisplayName.TRY=New Turkish Lira
currenciesDisplayName.LSL=Lesotho Loti
-currenciesDisplayName.GAF=Gabon CFA Franc
-currenciesDisplayName.BGO=Bulgarian Lev (1879-1952)
+currenciesDisplayName.XEU=European Currency Unit
+currenciesDisplayName.BHD=Bahraini Dinar
+currenciesDisplayName.SLL=Sierra Leone Leone
+currenciesDisplayName.BTN=Bhutan Ngultrum
+currenciesDisplayName.TRL=Turkish Lira
+currenciesDisplayName.KMF=Comoro Franc
+currenciesDisplayName.ANG=Netherlands Antillan Guilder
+currenciesDisplayName.CZK=Czech Republic Koruna
+currenciesDisplayName.AZM=Azerbaijanian Manat
+currenciesDisplayName.KYD=Cayman Islands Dollar
+currenciesDisplayName.GMD=Gambia Dalasi
currenciesDisplayName.BGN=Bulgarian New Lev
-currenciesDisplayName.BGM=Bulgarian Socialist Lev
-currenciesDisplayName.XRE=RINET Funds
currenciesDisplayName.CAD=Canadian Dollar
+currenciesDisplayName.MXV=Mexican Unidad de Inversion (UDI)
currenciesDisplayName.BGL=Bulgarian Hard Lev
-currenciesDisplayName.TRL=Turkish Lira
-currenciesDisplayName.KYD=Cayman Islands Dollar
-currenciesDisplayName.CYP=Cyprus Pound
+currenciesDisplayName.VEB=Venezuelan Bolivar
+currenciesDisplayName.MLF=Mali Franc
currenciesDisplayName.ILS=Israeli New Sheqel
+currenciesDisplayName.MXP=Mexican Silver Peso (1861-1992)
+currenciesDisplayName.PES=Peruvian Sol
currenciesDisplayName.GYD=Guyana Dollar
-currenciesDisplayName.AMD=Armenian Dram
+currenciesDisplayName.MXN=Mexican Peso
currenciesDisplayName.ILP=Israeli Pound
-currenciesDisplayName.MLF=Mali Franc
-currenciesDisplayName.ILL=Israeli Sheqel
-currenciesDisplayName.VEB=Venezuelan Bolivar
-currenciesDisplayName.ALX=Albanian Dollar Foreign Exchange Certificates
+currenciesDisplayName.SKK=Slovak Koruna
+currenciesDisplayName.CYP=Cyprus Pound
+currenciesDisplayName.XDR=Special Drawing Rights
+currenciesDisplayName.PEN=Peruvian Sol Nuevo
currenciesDisplayName.LRD=Liberian Dollar
-currenciesDisplayName.ALV=Albanian Lek Valute
+currenciesDisplayName.PEI=Peruvian Inti
+currenciesDisplayName.AMD=Armenian Dram
+currenciesDisplayName.XPT=Platinum
+currenciesDisplayName.BSD=Bahamian Dollar
currenciesDisplayName.HRK=Croatian Kuna
-currenciesDisplayName.REF=Reunion Franc
+currenciesDisplayName.CLP=Chilean Peso
currenciesDisplayName.HRD=Croatian Dinar
-currenciesDisplayName.ALL=Albanian Lek
-currenciesDisplayName.JEP=Jersey Pound Sterling
-currenciesDisplayName.ALK=Albanian Lek (1946-1961)
-currenciesDisplayName.MKN=Macedonian Denar (1992-1993)
-currenciesDisplayName.VDP=North Vietnam Viet Minh Piastre Dong Viet
-currenciesDisplayName.VDN=North Vietnam New Dong
-currenciesDisplayName.XPT=Platinum
-currenciesDisplayName.MKD=Macedonian Denar
-currenciesDisplayName.VDD=North Vietnam Piastre Dong Viet
-currenciesDisplayName.TPP=Timor Pataca
currenciesDisplayName.XPF=CFP Franc
-currenciesDisplayName.BEL=Belgian Franc (financial)
+currenciesDisplayName.FRF=French Franc
currenciesDisplayName.XPD=Palladium
-currenciesDisplayName.GWP=Guinea-Bissau Peso
-currenciesDisplayName.KWD=Kuwaiti Dinar
-currenciesDisplayName.GWM=Portuguese Guinea Mil Reis
-currenciesDisplayName.BEF=Belgian Franc
+currenciesDisplayName.BRR=Brazilian Cruzeiro
+currenciesDisplayName.MKD=Macedonian Denar
+currenciesDisplayName.CLF=Chilean Unidades de Fomento
+currenciesDisplayName.BRN=Brazilian Cruzado Novo
+currenciesDisplayName.ALL=Albanian Lek
+currenciesDisplayName.MWK=Malawi Kwacha
+currenciesDisplayName.BRL=Brazilian Real
currenciesDisplayName.TPE=Timor Escudo
-currenciesDisplayName.BEC=Belgian Franc (convertible)
-currenciesDisplayName.GWE=Portuguese Guinea Escudo
+currenciesDisplayName.BRE=Brazilian Cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Brazilian Cruzado
+currenciesDisplayName.BRB=Brazilian Cruzeiro Novo (1967-1986)
+currenciesDisplayName.DEM=Deutsche Mark
+currenciesDisplayName.KWD=Kuwaiti Dinar
+currenciesDisplayName.XCD=East Caribbean Dollar
+currenciesDisplayName.NPR=Nepalese Rupee
+currenciesDisplayName.GWP=Guinea-Bissau Peso
+currenciesDisplayName.YUN=Yugoslavian Convertible Dinar
currenciesDisplayName.SVC=El Salvador Colon
-currenciesDisplayName.CWG=Curacao Guilder
-currenciesDisplayName.BDT=Bangladesh Taka
-currenciesDisplayName.TOS=Tonga Pound Sterling
-currenciesDisplayName.TOP=Tonga Pa\u02bbanga
+currenciesDisplayName.YUM=Yugoslavian Noviy Dinar
+currenciesDisplayName.BEL=Belgian Franc (financial)
+currenciesDisplayName.SIT=Slovenia Tolar
+currenciesDisplayName.JPY=Japanese Yen
currenciesDisplayName.XOF=CFA Franc BCEAO
+currenciesDisplayName.MVR=Maldive Islands Rufiyaa
+currenciesDisplayName.GWE=Portuguese Guinea Escudo
+currenciesDisplayName.BEF=Belgian Franc
+currenciesDisplayName.TOP=Tonga Pa\u02bbanga
+currenciesDisplayName.YUD=Yugoslavian Hard Dinar
+currenciesDisplayName.BEC=Belgian Franc (convertible)
currenciesDisplayName.SUR=Soviet Rouble
-currenciesDisplayName.SUN=Soviet New Ruble
-currenciesDisplayName.NCF=New Caledonia Franc Germinal
-currenciesDisplayName.CVE=Cape Verde Escudo
-currenciesDisplayName.XNF=French Antilles CFA Franc
+currenciesDisplayName.ROL=Romanian Lei
+currenciesDisplayName.DDM=East German Ostmark
+currenciesDisplayName.BDT=Bangladesh Taka
+currenciesDisplayName.XBD=European Unit of Account (XBD)
+currenciesDisplayName.AWG=Aruban Guilder
+currenciesDisplayName.XBC=European Unit of Account (XBC)
+currenciesDisplayName.XBB=European Monetary Unit
+currenciesDisplayName.XBA=European Composite Unit
+currenciesDisplayName.NOK=Norwegian Krone
+currenciesDisplayName.MUR=Mauritius Rupee
currenciesDisplayName.ZAR=South African Rand
-currenciesDisplayName.DOP=Dominican Peso
-currenciesDisplayName.CUX=Cuban Foreign Exchange Certificates
-currenciesDisplayName.ZAP=South African Pound
+currenciesDisplayName.SHP=Saint Helena Pound
+currenciesDisplayName.XAU=Gold
currenciesDisplayName.ZAL=South African Rand (financial)
+currenciesDisplayName.VND=Vietnamese Dong
+currenciesDisplayName.TZS=Tanzanian Shilling
+currenciesDisplayName.GIP=Gibraltar Pound
currenciesDisplayName.TND=Tunisian Dinar
-currenciesDisplayName.CUP=Cuban Peso
-currenciesDisplayName.GUF=French Guyana Franc Guiana
+currenciesDisplayName.CVE=Cape Verde Escudo
currenciesDisplayName.UGX=Ugandan Shilling
-currenciesDisplayName.LNR=Ceylon Rupee
-currenciesDisplayName.AIF=Affars and Issas Franc
-currenciesDisplayName.VAL=Vatican City Lira
-currenciesDisplayName.STE=Sao Tome and Principe Escudo
+currenciesDisplayName.XAG=Silver
+currenciesDisplayName.ZMK=Zambian Kwacha
+currenciesDisplayName.JOD=Jordanian Dinar
+currenciesDisplayName.XAF=CFA Franc BEAC
+currenciesDisplayName.LBP=Lebanese Pound
currenciesDisplayName.UGS=Ugandan Shilling (1966-1987)
currenciesDisplayName.STD=Sao Tome and Principe Dobra
-currenciesDisplayName.MHD=Marshall Islands Dollar
-currenciesDisplayName.NZP=New Zealand Pound
currenciesDisplayName.WST=Western Samoa Tala
-currenciesDisplayName.WSP=Western Samoa Pound
-currenciesDisplayName.HNL=Hoduras Lempira
-currenciesDisplayName.XMF=French Metropolitan Nouveau Franc
+currenciesDisplayName.KHR=Cambodian Riel
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Dominican Peso
+currenciesDisplayName.BOV=Bolivian Mvdol
+currenciesDisplayName.MTP=Maltese Pound
+currenciesDisplayName.USS=US Dollar (Same day)
+currenciesDisplayName.BOP=Bolivian Peso
+currenciesDisplayName.CUP=Cuban Peso
+currenciesDisplayName.MTL=Maltese Lira
currenciesDisplayName.TMM=Turkmenistan Manat
-currenciesDisplayName.GTQ=Guatemala Quetzal
+currenciesDisplayName.USN=US Dollar (Next day)
+currenciesDisplayName.SGD=Singapore Dollar
currenciesDisplayName.NZD=New Zealand Dollar
-currenciesDisplayName.SSP=Scotland Pound
-currenciesDisplayName.BBD=Barbados Dollar
+currenciesDisplayName.USD=US Dollar
+currenciesDisplayName.HNL=Hoduras Lempira
+currenciesDisplayName.BOB=Boliviano
+currenciesDisplayName.CHW=WIR Franc
+currenciesDisplayName.ITL=Italian Lira
+currenciesDisplayName.PAB=Panamanian Balboa
+currenciesDisplayName.GTQ=Guatemala Quetzal
+currenciesDisplayName.XXX=No Currency
+currenciesDisplayName.LAK=Laotian Kip
+currenciesDisplayName.GHC=Ghana Cedi
+currenciesDisplayName.AUD=Australian Dollar
currenciesDisplayName.NAD=Namibia Dollar
+currenciesDisplayName.KGS=Kyrgystan Som
currenciesDisplayName.MGF=Madagascar Franc
+currenciesDisplayName.CHF=Swiss Franc
+currenciesDisplayName.BBD=Barbados Dollar
+currenciesDisplayName.CHE=WIR Euro
currenciesDisplayName.MGA=Madagascar Ariary
-currenciesDisplayName.EGP=Egyptian Pound
-currenciesDisplayName.BZH=British Honduras Dollar
+currenciesDisplayName.PYG=Paraguay Guarani
currenciesDisplayName.PLZ=Polish Zloty (1950-1995)
-currenciesDisplayName.BAN=Bosnia-Herzegovina New Dinar
-currenciesDisplayName.PLX=Polish US Dollar Foreign Exchange Certificates
-currenciesDisplayName.BAM=Bosnia-Herzegovina Convertible Mark
-currenciesDisplayName.BZD=Belize Dollar
-currenciesDisplayName.BAD=Bosnia-Herzegovina Dinar
-currenciesDisplayName.PLN=Polish Zloty
currenciesDisplayName.YER=Yemeni Rial
+currenciesDisplayName.ATS=Austrian Schilling
+currenciesDisplayName.ETB=Ethiopian Birr
+currenciesDisplayName.BND=Brunei Dollar
+currenciesDisplayName.JMD=Jamaican Dollar
+currenciesDisplayName.EGP=Egyptian Pound
+currenciesDisplayName.PLN=Polish Zloty
+currenciesDisplayName.DZD=Algerian Dinar
+currenciesDisplayName.ISK=Icelandic Krona
currenciesDisplayName.SRG=Suriname Guilder
-currenciesDisplayName.CSK=Czechoslovak Hard Koruna
+currenciesDisplayName.LYD=Libyan Dinar
+currenciesDisplayName.SRD=Surinam Dollar
+currenciesDisplayName.BZD=Belize Dollar
+currenciesDisplayName.BAM=Bosnia-Herzegovina Convertible Mark
+currenciesDisplayName.ESP=Spanish Peseta
currenciesDisplayName.KRW=South Korean Won
+currenciesDisplayName.NLG=Netherlands Guilder
+currenciesDisplayName.MRO=Mauritania Ouguiya
+currenciesDisplayName.BAD=Bosnia-Herzegovina Dinar
+currenciesDisplayName.ZWD=Zimbabwe Dollar
+currenciesDisplayName.SEK=Swedish Krona
+currenciesDisplayName.CSK=Czechoslovak Hard Koruna
+currenciesDisplayName.ESB=Spanish Peseta (convertible account)
currenciesDisplayName.BYR=Belarussian Ruble
-currenciesDisplayName.SRD=Surinam Dollar
-currenciesDisplayName.YEI=Yemeni Imadi Riyal
-currenciesDisplayName.CSD=Serbian Dinar
-currenciesDisplayName.BYL=Belarussian Ruble (1992-1994)
-currenciesDisplayName.CSC=Czechoslovak Koruna
-currenciesDisplayName.KRO=South Korean Old Won
-currenciesDisplayName.KRH=South Korean Hwan
-currenciesDisplayName.BYB=Belarussian New Ruble (1994-1999)
-currenciesDisplayName.SQS=Somaliland Shilling
-currenciesDisplayName.GRN=Greek New Drachma
+currenciesDisplayName.ESA=Spanish Peseta (A account)
+currenciesDisplayName.IRR=Iranian Rial
currenciesDisplayName.PKR=Pakistan Rupee
-currenciesDisplayName.AFN=Afghani
-currenciesDisplayName.ZWD=Zimbabwe Dollar
-currenciesDisplayName.LKR=Sri Lanka Rupee
-currenciesDisplayName.GRD=Greek Drachma
-currenciesDisplayName.IEP=Irish Pound
-currenciesDisplayName.AFA=Afghani (1927-2002)
-currenciesDisplayName.YDD=Yemeni Dinar
-currenciesDisplayName.RWF=Rwandan Franc
-currenciesDisplayName.CRC=Costa Rican Colon
-currenciesDisplayName.TJS=Tajikistan Somoni
-currenciesDisplayName.TJR=Tajikistan Ruble
-currenciesDisplayName.EEK=Estonian Kroon
-currenciesDisplayName.GQP=Equatorial Guinea Peseta Guineana
-currenciesDisplayName.MDR=Moldovan Ruble Cupon
-currenciesDisplayName.HKD=Hong Kong Dollar
-currenciesDisplayName.DKK=Danish Krone
-currenciesDisplayName.MDL=Moldovan Leu
-currenciesDisplayName.GQF=Equatorial Guinea Franco
-currenciesDisplayName.GQE=Equatorial Guinea Ekwele Guineana
-currenciesDisplayName.IDR=Indonesian Rupiah
-currenciesDisplayName.AED=United Arab Emirates Dirham
-currenciesDisplayName.KPW=North Korean Won
-currenciesDisplayName.IDN=Indonesian New Rupiah
-currenciesDisplayName.BWP=Botswanan Pula
-currenciesDisplayName.MDC=Moldovan Leu Cupon
-currenciesDisplayName.IDJ=Indonesian Java Rupiah
-currenciesDisplayName.KPP=North Korean People\u2019s Won
-currenciesDisplayName.IDG=Indonesian Nica Guilder
-currenciesDisplayName.VUV=Vanuatu Vatu
-currenciesDisplayName.XID=Islamic Dinar
-currenciesDisplayName.SOS=Somali Shilling
-currenciesDisplayName.ADP=Andorran Peseta
-currenciesDisplayName.RUR=Russian Ruble (1991-1998)
-currenciesDisplayName.GPF=Guadeloupe Franc
-currenciesDisplayName.DJF=Djibouti Franc
-currenciesDisplayName.ADD=Andorran Diner
-currenciesDisplayName.MCG=Monaco Franc Germinal
-currenciesDisplayName.MCF=Monaco Franc Nouveau
-currenciesDisplayName.ECV=Ecuador Unidad de Valor Constante (UVC)
-currenciesDisplayName.ECS=Ecuador Sucre
-currenciesDisplayName.LIF=Liechtenstein Franc
-currenciesDisplayName.RUB=Russian Ruble
-currenciesDisplayName.COU=Unidad de Valor Real
-currenciesDisplayName.PHP=Philippine Peso
-currenciesDisplayName.UZS=Uzbekistan Sum
-currenciesDisplayName.COP=Colombian Peso
-currenciesDisplayName.THB=Thai Baht
-currenciesDisplayName.BUR=Burmese Rupee
-currenciesDisplayName.IBP=Northern Irish Pound
-currenciesDisplayName.COF=Congo CFA Franc
-currenciesDisplayName.BUK=Burmese Kyat
-currenciesDisplayName.COB=Colombian Paper Peso
-currenciesDisplayName.UAK=Ukrainian Karbovanetz
-currenciesDisplayName.UZC=Uzbekistan Coupon Som
-currenciesDisplayName.QAR=Qatari Rial
-currenciesDisplayName.UAH=Ukrainian Hryvnia
-currenciesDisplayName.GNS=Guinea Syli
-currenciesDisplayName.CNY=Chinese Yuan Renminbi
-currenciesDisplayName.CNX=Chinese US Dollar Foreign Exchange Certificates
-currenciesDisplayName.MZM=Mozambique Metical
-currenciesDisplayName.UYU=Uruguay Peso Uruguayo
-currenciesDisplayName.GNI=Guinea Franc (1960-1972)
-currenciesDisplayName.SML=San Marino Lira
-currenciesDisplayName.CNP=Chinese Jen Min Piao Yuan
-currenciesDisplayName.MZE=Mozambique Escudo
-currenciesDisplayName.GNF=Guinea Franc
-currenciesDisplayName.OMS=Oman Rial Saidi
-currenciesDisplayName.PGK=Papua New Guinea Kina
-currenciesDisplayName.OMR=Oman Rial
-currenciesDisplayName.UYP=Uruguay Peso (1975-1993)
-currenciesDisplayName.XFU=French UIC-Franc
-currenciesDisplayName.BTR=Bhutan Rupee
-currenciesDisplayName.ZRZ=Zairean Zaire
-currenciesDisplayName.MAF=Moroccan Franc
-currenciesDisplayName.MAD=Moroccan Dirham
-currenciesDisplayName.BTN=Bhutan Ngultrum
-currenciesDisplayName.XFO=French Gold Franc
-currenciesDisplayName.UYF=Uruguay Peso Fuerte
-currenciesDisplayName.MYR=Malaysian Ringgit
-currenciesDisplayName.ZRN=Zairean New Zaire
-currenciesDisplayName.AZM=Azerbaijanian Manat
-currenciesDisplayName.GMP=Gambia Pound
-currenciesDisplayName.KMF=Comoro Franc
-currenciesDisplayName.SLL=Sierra Leone Leone
-currenciesDisplayName.GMD=Gambia Dalasi
-currenciesDisplayName.XEU=European Currency Unit
-currenciesDisplayName.BSP=Bahamian Pound
-currenciesDisplayName.CMF=Cameroon CFA Franc
-currenciesDisplayName.MXV=Mexican Unidad de Inversion (UDI)
-currenciesDisplayName.XEF=CFA Franc BCEAEC
-currenciesDisplayName.BSD=Bahamian Dollar
-currenciesDisplayName.MXP=Mexican Silver Peso (1861-1992)
-currenciesDisplayName.MXN=Mexican Peso
-currenciesDisplayName.PES=Peruvian Sol
-currenciesDisplayName.GLK=Greenland Krone
-currenciesDisplayName.BRZ=Brazilian Cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Peruvian Sol Nuevo
-currenciesDisplayName.CLP=Chilean Peso
-currenciesDisplayName.SKK=Slovak Koruna
-currenciesDisplayName.PEI=Peruvian Inti
-currenciesDisplayName.BRR=Brazilian Cruzeiro
-currenciesDisplayName.XDR=Special Drawing Rights
-currenciesDisplayName.FRG=French Franc Germinal/Franc Poincare
-currenciesDisplayName.FRF=French Franc
-currenciesDisplayName.BRN=Brazilian Cruzado Novo
-currenciesDisplayName.CLF=Chilean Unidades de Fomento
-currenciesDisplayName.CLE=Chilean Escudo
-currenciesDisplayName.BRL=Brazilian Real
-currenciesDisplayName.CLC=Chilean Condor
-currenciesDisplayName.BRE=Brazilian Cruzeiro (1990-1993)
-currenciesDisplayName.DES=German Sperrmark
-currenciesDisplayName.MWP=Malawi Pound
-currenciesDisplayName.BRC=Brazilian Cruzado
-currenciesDisplayName.BRB=Brazilian Cruzeiro Novo (1967-1986)
-currenciesDisplayName.MWK=Malawi Kwacha
-currenciesDisplayName.PDR=Transdniestria Ruble
-currenciesDisplayName.DEM=Deutsche Mark
-currenciesDisplayName.TDF=Chad CFA Franc
-currenciesDisplayName.PDN=Transdniestria New Ruble
-currenciesDisplayName.PDK=Transdniestria Ruble Kupon
-currenciesDisplayName.NPR=Nepalese Rupee
-currenciesDisplayName.CKD=Cook Islands Dollar
-currenciesDisplayName.JPY=Japanese Yen
-currenciesDisplayName.MVR=Maldive Islands Rufiyaa
-currenciesDisplayName.XCF=CFA Nouveau Franc
-currenciesDisplayName.MVP=Maldive Islands Rupee
-currenciesDisplayName.DDR=East German Mark
-currenciesDisplayName.XCD=East Caribbean Dollar
-currenciesDisplayName.SIT=Slovenia Tolar
-currenciesDisplayName.YUR=Yugoslavian Reformed Dinar
-currenciesDisplayName.AWG=Aruban Guilder
-currenciesDisplayName.YUO=Yugoslavian October Dinar
-currenciesDisplayName.DDM=East German Ostmark
-currenciesDisplayName.YUN=Yugoslavian Convertible Dinar
-currenciesDisplayName.YUM=Yugoslavian Noviy Dinar
-currenciesDisplayName.TCC=Turks and Caicos Crown
-currenciesDisplayName.YUG=Yugoslavian 1994 Dinar
-currenciesDisplayName.YUF=Yugoslavian Federation Dinar
-currenciesDisplayName.RON=Romanian New Leu
-currenciesDisplayName.YUD=Yugoslavian Hard Dinar
-currenciesDisplayName.ROL=Romanian Leu
-currenciesDisplayName.SIB=Slovenia Tolar Bons
-currenciesDisplayName.NOK=Norwegian Krone
-currenciesDisplayName.MUR=Mauritius Rupee
-currenciesDisplayName.XBD=European Unit of Account (XBD)
-currenciesDisplayName.GIP=Gibraltar Pound
-currenciesDisplayName.VNS=Vietnamese National Dong
-currenciesDisplayName.XBC=European Unit of Account (XBC)
-currenciesDisplayName.VNR=Vietnamese Republic Dong
-currenciesDisplayName.XBB=European Monetary Unit
-currenciesDisplayName.XBA=European Composite Unit
-currenciesDisplayName.KID=Kiribati Dollar
-currenciesDisplayName.SHP=Saint Helena Pound
-currenciesDisplayName.VNN=Vietnamese New Dong
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=\u20a7
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Bermudan Dollar
+currenciesDisplayName.CSD=Serbian Dinar
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.CNP=CNP
-currenciesSymbol.MZE=MZE
currenciesSymbol.GNF=GF
-currenciesSymbol.OMS=OMS
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.ESP=\u20a7
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=Jan®Feb®Mar®Apr®May®Jun®Jul®Aug®Sep®Oct®Nov®Dec®®
months=January®February®March®April®May®June®July®August®September®October®November®December®®
shortWeekdays=®Sun®Mon®Tue®Wed®Thu®Fri®Sat®
@@ -796,7 +382,7 @@ shortTimeFormat=h:mm a
mediumTimeFormat=h:mm:ss a
longTimeFormat=h:mm:ss a z
fullTimeFormat=h:mm:ss a z
-zoneStrings=America/Los_Angeles®PST®Pacific Standard Time®PDT®Pacific Daylight Time®©Pacific/Honolulu®HST®Hawaii Standard Time®HDT®Hawaii Daylight Time®©Etc/GMT®GMT®Greenwich Mean Time®GMT®Greenwich Mean Time®©Europe/London®BST®British Standard Time®BDT®British Daylight Time®©America/Phoenix®MST®Mountain Standard Time®MDT®Mountain Daylight Time®©America/Denver®MST®Mountain Standard Time®MDT®Mountain Daylight Time®©Asia/Jerusalem®IST®Israel Standard Time®IDT®Israel Daylight Time®©America/Edmonton®MST (CA)®Mountain Standard Time (CA)®MDT (CA)®Mountain Daylight Time (CA)®©America/Anchorage®AKST®Alaska Standard Time®AKDT®Alaska Daylight Time®©Europe/Paris®CEST®Central European Standard Time®CEDT®Central European Daylight Time®©America/Indianapolis®EST®Eastern Standard Time®EDT®Eastern Daylight Time®©Europe/Bucharest®EET®Eastern European Standard Time®EEST®Eastern European Daylight Time®©Asia/Tokyo®JST®Japan Standard Time®JDT®Japan Daylight Time®©America/Winnipeg®CST (CA)®Central Standard Time (CA)®CDT (CA)®Central Daylight Time (CA)®©Asia/Shanghai®CST®China Standard Time®CDT®China Daylight Time®©America/Vancouver®PST (CA)®Pacific Standard Time (CA)®PDT (CA)®Pacific Daylight Time (CA)®©America/New_York®EST®Eastern Standard Time®EDT®Eastern Daylight Time®©America/Montreal®EST (CA)®Eastern Standard Time (CA)®EDT (CA)®Eastern Daylight Time (CA)®©America/Halifax®AST®Atlantic Standard Time®ADT®Atlantic Daylight Time®©America/St_Johns®NST®Newfoundland Standard Time®NDT®Newfoundland Daylight Time®©America/Chicago®CST®Central Standard Time®CDT®Central Daylight Time®©
+zoneStrings=Europe/Paris®CEST®Central European Standard Time®CEDT®Central European Daylight Time®©Pacific/Honolulu®HST®Hawaii Standard Time®HDT®Hawaii Daylight Time®©Europe/London®BST®British Standard Time®BDT®British Daylight Time®©America/Edmonton®MST (CA)®Mountain Standard Time (CA)®MDT (CA)®Mountain Daylight Time (CA)®©America/Denver®MST®Mountain Standard Time®MDT®Mountain Daylight Time®©Asia/Jerusalem®IST®Israel Standard Time®IDT®Israel Daylight Time®©America/Anchorage®AKST®Alaska Standard Time®AKDT®Alaska Daylight Time®©America/Phoenix®MST®Mountain Standard Time®MDT®Mountain Daylight Time®©America/Los_Angeles®PST®Pacific Standard Time®PDT®Pacific Daylight Time®©America/Chicago®CST®Central Standard Time®CDT®Central Daylight Time®©America/Halifax®AST®Atlantic Standard Time®ADT®Atlantic Daylight Time®©America/St_Johns®NST®Newfoundland Standard Time®NDT®Newfoundland Daylight Time®©America/Winnipeg®CST (CA)®Central Standard Time (CA)®CDT (CA)®Central Daylight Time (CA)®©America/Vancouver®PST (CA)®Pacific Standard Time (CA)®PDT (CA)®Pacific Daylight Time (CA)®©America/New_York®EST®Eastern Standard Time®EDT®Eastern Daylight Time®©America/Montreal®EST (CA)®Eastern Standard Time (CA)®EDT (CA)®Eastern Daylight Time (CA)®©Asia/Shanghai®CST®China Standard Time®CDT®China Daylight Time®©Asia/Tokyo®JST®Japan Standard Time®JDT®Japan Daylight Time®©Europe/Bucharest®EET®Eastern European Standard Time®EEST®Eastern European Daylight Time®©America/Indianapolis®EST®Eastern Standard Time®EDT®Eastern Daylight Time®©
territories.GY=Guyana
territories.GW=Guinea-Bissau
territories.GU=Guam
@@ -819,7 +405,7 @@ territories.FX=Metropolitan France
territories.FR=France
territories.FQ=French Southern and Antarctic Territories
territories.FO=Faroe Islands
-territories.FM=Federated States of Micronesia
+territories.FM=Micronesia
territories.FK=Falkland Islands
territories.FJ=Fiji
territories.FI=Finland
@@ -831,7 +417,6 @@ territories.EG=Egypt
territories.EE=Estonia
territories.EC=Ecuador
territories.DZ=Algeria
-territories.DY=Benin
territories.DO=Dominican Republic
territories.DM=Dominica
territories.DK=Denmark
@@ -844,25 +429,24 @@ territories.CX=Christmas Island
territories.CV=Cape Verde
territories.CU=Cuba
territories.CT=Canton and Enderbury Islands
-territories.CS=Czechoslovakia
+territories.CS=Serbia And Montenegro
territories.CR=Costa Rica
territories.CO=Colombia
territories.CN=China
territories.CM=Cameroon
territories.CL=Chile
territories.CK=Cook Islands
-territories.CI=C\u00f4te d\u2019Ivoire
+territories.CI=Ivory Coast
territories.CH=Switzerland
-territories.CG=Congo
+territories.CG=Congo (Brazzaville)
territories.CF=Central African Republic
-territories.CD=Congo (Brazzaville)
+territories.CD=Congo (Kinshasa)
territories.CC=Cocos (Keeling) Islands
territories.CA=Canada
territories.BZ=Belize
territories.BY=Belarus
territories.BW=Botswana
territories.BV=Bouvet Island
-territories.BU=Myanmar
territories.BT=Bhutan
territories.BS=Bahamas
territories.BR=Brazil
@@ -877,11 +461,9 @@ territories.BG=Bulgaria
territories.BF=Burkina Faso
territories.BE=Belgium
territories.BD=Bangladesh
-territories.ZZ=Outlying Oceania
territories.BB=Barbados
territories.BA=Bosnia and Herzegovina
territories.ZW=Zimbabwe
-territories.ZR=Congo, The Democratic Republic of the
territories.AZ=Azerbaijan
territories.AX=Aland Islands
territories.AW=Aruba
@@ -901,11 +483,11 @@ territories.AG=Antigua and Barbuda
territories.AF=Afghanistan
territories.AE=United Arab Emirates
territories.AD=Andorra
-territories.YU=Serbia and Montenegro
territories.YT=Mayotte
territories.YE=Yemen
territories.YD=People's Democratic Republic of Yemen
territories.172=Commonwealth of Independent States
+territories.200=Czechoslovakia
territories.WS=Samoa
territories.WK=Wake Island
territories.WF=Wallis and Futuna
@@ -918,27 +500,26 @@ territories.VN=Vietnam
territories.VI=U.S. Virgin Islands
territories.VG=British Virgin Islands
territories.VE=Venezuela
-territories.145=Western Asia
territories.VD=North Vietnam
+territories.145=Western Asia
territories.VC=Saint Vincent and the Grenadines
-territories.142=Asia
territories.VA=Vatican
+territories.142=Asia
territories.UZ=Uzbekistan
territories.UY=Uruguay
territories.US=United States
territories.UM=United States Minor Outlying Islands
territories.UG=Uganda
territories.UA=Ukraine
-territories.TZ=United Republic of Tanzania
-territories.TW=Taiwan, Provience of China
+territories.TZ=Tanzania
+territories.TW=Taiwan
territories.TV=Tuvalu
territories.TT=Trinidad and Tobago
territories.TR=Turkey
-territories.TP=Timor-Leste
territories.TO=Tonga
territories.TN=Tunisia
territories.TM=Turkmenistan
-territories.TL=Timor-Leste
+territories.TL=East Timor
territories.TK=Tokelau
territories.TJ=Tajikistan
territories.TH=Thailand
@@ -969,16 +550,16 @@ territories.SA=Saudi Arabia
territories.RW=Rwanda
territories.RU=Russia
territories.RO=Romania
-territories.RH=Zimbabwe
-territories.RE=R\u00e9union
+territories.RE=Reunion
territories.062=South-central Asia
territories.061=Polynesia
+territories.QO=Outlying Oceania
territories.QA=Qatar
-territories.057=Micronesia
-territories.054=Melanesia
+territories.057=Micronesian Region
territories.PZ=Panama Canal Zone
-territories.053=Australia and New Zealand
+territories.054=Melanesia
territories.PY=Paraguay
+territories.053=Australia and New Zealand
territories.PW=Palau
territories.PU=U.S. Miscellaneous Pacific Islands
territories.PT=Portugal
@@ -1009,7 +590,6 @@ territories.NP=Nepal
territories.NO=Norway
territories.NL=Netherlands
territories.NI=Nicaragua
-territories.NH=Vanuatu
territories.NG=Nigeria
territories.NF=Norfolk Island
territories.NE=Niger
@@ -1019,8 +599,8 @@ territories.029=Caribbean
territories.MZ=Mozambique
territories.MY=Malaysia
territories.MX=Mexico
-territories.021=Northern America
territories.MW=Malawi
+territories.021=Northern America
territories.MV=Maldives
territories.MU=Mauritius
territories.MT=Malta
@@ -1033,8 +613,8 @@ territories.MN=Mongolia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Macedonia
-territories.419=Latin America and the Caribbean
territories.MI=Midway Islands
+territories.419=Latin America and the Caribbean
territories.MH=Marshall Islands
territories.MG=Madagascar
territories.MD=Moldova
@@ -1045,8 +625,8 @@ territories.018=Southern Africa
territories.017=Middle Africa
territories.015=Northern Africa
territories.014=Eastern Africa
-territories.013=Central America
territories.LY=Libya
+territories.013=Central America
territories.011=Western Africa
territories.LV=Latvia
territories.LU=Luxembourg
@@ -1061,13 +641,13 @@ territories.LA=Laos
territories.009=Oceania
territories.005=South America
territories.KZ=Kazakhstan
-territories.003=North America
territories.KY=Cayman Islands
+territories.003=North America
territories.002=Africa
-territories.001=World
territories.KW=Kuwait
-territories.KR=Republic of Korea
-territories.KP=Democratic People's Republic of Korea
+territories.001=World
+territories.KR=South Korea
+territories.KP=North Korea
territories.KN=Saint Kitts and Nevis
territories.KM=Comoros
territories.KI=Kiribati
@@ -1080,22 +660,21 @@ territories.JO=Jordan
territories.JM=Jamaica
territories.IT=Italy
territories.IS=Iceland
-territories.IR=Islamic Republic of Iran
+territories.IR=Iran
territories.IQ=Iraq
territories.IO=British Indian Ocean Territory
territories.IN=India
territories.IL=Israel
territories.IE=Ireland
territories.ID=Indonesia
-territories.HV=Burkina Faso
territories.HU=Hungary
territories.HT=Haiti
territories.HR=Croatia
territories.HN=Honduras
territories.HM=Heard Island and McDonald Islands
territories.HK=Hong Kong S.A.R., China
-languages.gwi=Gwich\u02bbin
languages.akk=Akkadian
+languages.gwi=Gwich\u02bcin
languages.eka=Ekajuk
languages.ijo=Ijo
languages.xh=Xhosa
@@ -1108,15 +687,15 @@ languages.pon=Pohnpeian
languages.min=Minangkabau
languages.suk=Sukuma
languages.wo=Wolof
-languages.lol=Mongo
languages.kut=Kutenai
+languages.lol=Mongo
languages.mic=Micmac
languages.wa=Walloon
languages.kum=Kumyk
languages.zap=Zapotec
languages.cus=Cushitic (Other)
-languages.jbo=Lojban
languages.doi=Dogri
+languages.jbo=Lojban
languages.vo=Volap\u00fck
languages.oto=Otomian Languages
languages.vi=Vietnamese
@@ -1139,9 +718,9 @@ languages.uk=Ukrainian
languages.egy=Egyptian (Ancient)
languages.ug=Uighur
languages.fan=Fang
-languages.ssa=Nilo-Saharam (Other)
-languages.mga=Middle Irish
+languages.ssa=Nilo-Saharan (Other)
languages.bat=Baltic (Other)
+languages.mga=Middle Irish
languages.nyo=Nyoro
languages.bas=Basa
languages.nyn=Nyankole
@@ -1158,6 +737,7 @@ languages.tli=Tlingit
languages.tlh=Klingon
languages.tt=Tatar
languages.ts=Tsonga
+languages.srn=Sranan Tongo
languages.bad=Banda
languages.tr=Turkish
languages.to=Tonga (Tonga Islands)
@@ -1170,8 +750,8 @@ languages.kru=Kurukh
languages.tg=Tajik
languages.byn=Blin
languages.te=Telugu
-languages.kro=Kru
languages.csb=Kashubian
+languages.kro=Kru
languages.ta=Tamil
languages.tkl=Tokelau
languages.efi=Efik
@@ -1192,11 +772,11 @@ languages.sm=Samoan
languages.sl=Slovenian
languages.grc=Ancient Greek
languages.sk=Slovak
-languages.grb=Gerbo
+languages.grb=Grebo
languages.si=Sinhalese
languages.sh=Serbo-Croatian
-languages.crh=Crimean Turkish; Crimean Tatar
languages.afa=Afro-Asiatic (Other)
+languages.crh=Crimean Turkish; Crimean Tatar
languages.sg=Sango
languages.se=Northern Sami
languages.sd=Sindhi
@@ -1218,17 +798,17 @@ languages.kpe=Kpelle
languages.qu=Quechua
languages.tig=Tigre
languages.son=Songhai
-languages.cpp=Portuguese-based Creoles and Pidgins
+languages.cpp=Other Portuguese-based Creoles and Pidgins
languages.sog=Sogdien
languages.ada=Adangme
-languages.kos=Kosraean
+languages.cpf=Other French-based Creoles and Pidgins
languages.hit=Hittite
-languages.cpf=French-based Creoles and Pidgins
-languages.cpe=English-based Creoles and Pidgins
+languages.kos=Kosraean
+languages.cpe=Other English-based Creoles and Pidgins
languages.him=Himachali
-languages.kok=Konkani
-languages.hil=Hiligaynon
languages.got=Gothic
+languages.hil=Hiligaynon
+languages.kok=Konkani
languages.gor=Gorontalo
languages.gon=Gondi
languages.din=Dinka
@@ -1300,10 +880,10 @@ languages.ms=Malay
languages.mr=Marathi
languages.fro=Old French
languages.mo=Moldavian
-languages.frm=Middle French
languages.mn=Mongolian
-languages.jrb=Judeo-Arabic
+languages.frm=Middle French
languages.ml=Malayalam
+languages.jrb=Judeo-Arabic
languages.mk=Macedonian
languages.mi=Maori
languages.mh=Marshallese
@@ -1311,11 +891,11 @@ languages.mg=Malagasy
languages.mwr=Marwari
languages.bra=Braj
languages.mwl=Mirandese
-languages.den=Slave
languages.lv=Latvian
+languages.den=Slave
languages.lu=Luba-Katanga
-languages.del=Delaware
languages.lt=Lithuanian
+languages.del=Delaware
languages.lo=Lao
languages.ln=Lingala
languages.li=Limburgish
@@ -1356,7 +936,6 @@ languages.gil=Gilbertese
languages.znd=Zande
languages.shn=Shan
languages.fon=Fon
-languages.ji=Yiddish
languages.xal=Kalmyk
languages.aus=Australian Languages
languages.kho=Khotanese
@@ -1364,45 +943,43 @@ languages.ja=Japanese
languages.khi=Khoisan (Other)
languages.pau=Palauan
languages.chy=Cheyenne
-languages.iw=Hebrew
languages.tai=Tai (Other)
languages.iu=Inuktitut
languages.pap=Papiamento
languages.it=Italian
languages.sgn=Sign Languages
-languages.is=Icelandic
languages.kha=Khasi
+languages.is=Icelandic
languages.chr=Cherokee
languages.pam=Pampanga
languages.pal=Pahlavi
languages.chp=Chipewyan
-languages.io=Ido
languages.cho=Choctaw
-languages.in=Indonesian
+languages.io=Ido
languages.chn=Chinook Jargon
languages.chm=Mari
languages.tyv=Tuvinian
languages.bnt=Bantu
languages.pag=Pangasinan
-languages.ik=Inupiaq
languages.chk=Chuukese
-languages.ii=Sichuan Yi
+languages.ik=Inupiaq
languages.haw=Hawaiian
+languages.ii=Sichuan Yi
languages.lam=Lamba
-languages.ig=Igbo
languages.chg=Chagatai
+languages.ig=Igbo
languages.sga=Old Irish
languages.paa=Papuan (Other)
languages.ie=Interlingue
languages.id=Indonesian
languages.lah=Lahnda
-languages.day=Dayak
languages.chb=Chibcha
+languages.day=Dayak
languages.ia=Interlingua
languages.lad=Ladino
-languages.hz=Herero
-languages.hai=Haida
languages.dar=Dargwa
+languages.hai=Haida
+languages.hz=Herero
languages.hy=Armenian
languages.ath=Athapascan Languages
languages.hu=Hungarian
@@ -1424,9 +1001,9 @@ languages.iro=Iroquoian languages
languages.gn=Guarani
languages.gl=Gallegan
languages.arw=Arawak
-languages.gez=Geez
-languages.art=Artificial (Other)
languages.gd=Scottish Gaelic
+languages.art=Artificial (Other)
+languages.gez=Geez
languages.ira=Iranian
languages.ga=Irish
languages.arp=Arapaho
@@ -1435,8 +1012,8 @@ languages.fy=Frisian
languages.bla=Siksika
languages.gem=Germanic (Other)
languages.ypk=Yupik Languages
-languages.arc=Aramaic
languages.fr=French
+languages.arc=Aramaic
languages.fo=Faroese
languages.cel=Celtic (Other)
languages.fj=Fijian
@@ -1461,9 +1038,9 @@ languages.tum=Tumbuka
languages.mos=Mossi
languages.dz=Dzongkha
languages.nic=Niger - Kordofanian (Other)
-languages.lus=Lushai
-languages.fiu=Finno - Ugrian (Other)
languages.dv=Divehi
+languages.fiu=Finno - Ugrian (Other)
+languages.lus=Lushai
languages.nia=Nias
languages.moh=Mohawk
languages.luo=Luo
@@ -1487,8 +1064,8 @@ languages.wak=Wakashan Languages
languages.sat=Santali
languages.cy=Welsh
languages.sas=Sasak
-languages.kbd=Kabardian
languages.cv=Chuvash
+languages.kbd=Kabardian
languages.cu=Church Slavic
languages.mni=Manipuri
languages.cs=Czech
@@ -1500,17 +1077,17 @@ languages.co=Corsican
languages.sai=South American Indian (Other)
languages.mnc=Manchu
languages.sah=Yakut
-languages.kaw=Kawi
-languages.inh=Ingush
languages.gba=Gbaya
+languages.inh=Ingush
+languages.kaw=Kawi
languages.sad=Sandawe
languages.ch=Chamorro
-languages.ine=Indo-European (Other)
languages.bho=Bhojpuri
+languages.ine=Indo-European (Other)
languages.enm=Middle English
-languages.kar=Karen
-languages.inc=Indic (Other)
languages.ce=Chechen
+languages.inc=Indic (Other)
+languages.kar=Karen
languages.gay=Gayo
languages.ca=Catalan
languages.umb=Umbundu
@@ -1518,19 +1095,19 @@ languages.syr=Syriac
languages.kam=Kamba
languages.tsi=Tsimshian
languages.ang=Old English (ca.450-1100)
-languages.kac=Kachin
languages.cau=Caucasian (Other)
+languages.kac=Kachin
languages.kab=Kabyle
-languages.kaa=Kara-Kalpak
languages.bs=Bosnian
-languages.car=Carib
+languages.kaa=Kara-Kalpak
languages.br=Breton
+languages.car=Carib
languages.bo=Tibetan
languages.bn=Bengali
languages.bm=Bambara
languages.gaa=Ga
-languages.cai=Central American Indian (Other)
languages.bi=Bislama
+languages.cai=Central American Indian (Other)
languages.bh=Bihari
languages.bg=Bulgarian
languages.be=Belarusian
@@ -1544,10 +1121,10 @@ languages.az=Azerbaijani
languages.ay=Aymara
languages.av=Avaric
languages.as=Assamese
-languages.dsb=Lower Sorbian
languages.ar=Arabic
-languages.ilo=Iloko
+languages.dsb=Lower Sorbian
languages.elx=Elamite
+languages.ilo=Iloko
languages.zh=Chinese
languages.an=Aragonese
languages.pra=Prakrit Languages
@@ -1571,16 +1148,16 @@ languages.nds=Low German; Low Saxon
languages.bem=Bemba
languages.bej=Beja
languages.tpi=Tok Pisin
+variants.BOONT=Boontling
variants.REVISED=Revised Orthography
-variants.lojban=Lojban
+variants.GAULISH=Gaulish
+variants.HAKKA=Hakka
+variants.GUOYU=Mandarin or Standard Chinese
+variants.XIANG=Xiang or Hunanese
variants.POSIX=Computer
-variants.gaulish=Gaulish
-variants.rozaj=Resian
-variants.nedis=Natisone dialect
-variants.boont=Boontling
variants.1996=German orthography of 1996
-variants.guoyu=Mandarin or Standard Chinese
-variants.hakka=Hakka
-variants.xiang=Xiang or Hunanese
+variants.LOJBAN=Lojban
+variants.SCOUSE=Scouse
variants.1901=Traditional German orthography
-variants.scouse=Scouse
+variants.ROZAJ=Resian
+variants.NEDIS=Natisone dialect
diff --git a/resource/gnu/java/locale/LocaleInformation_en_GB.properties b/resource/gnu/java/locale/LocaleInformation_en_GB.properties
index fb8ccd182..c35145c74 100644
--- a/resource/gnu/java/locale/LocaleInformation_en_GB.properties
+++ b/resource/gnu/java/locale/LocaleInformation_en_GB.properties
@@ -14,4 +14,4 @@ shortTimeFormat=HH:mm
mediumTimeFormat=HH:mm:ss
longTimeFormat=HH:mm:ss z
fullTimeFormat=HH:mm:ss z
-zoneStrings=Europe/London®GMT®Greenwich Mean Time®©
+zoneStrings=Europe/London®GMT®Greenwich Mean Time®BST®British Summer Time®©
diff --git a/resource/gnu/java/locale/LocaleInformation_en_IN.properties b/resource/gnu/java/locale/LocaleInformation_en_IN.properties
index 70b7bb43a..a624a8b88 100644
--- a/resource/gnu/java/locale/LocaleInformation_en_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_en_IN.properties
@@ -5,8 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
firstDayOfWeek=mon
shortDateFormat=dd/MM/yy
mediumDateFormat=dd-MMM-yy
diff --git a/resource/gnu/java/locale/LocaleInformation_en_PK.properties b/resource/gnu/java/locale/LocaleInformation_en_PK.properties
index b7957d372..658494d32 100644
--- a/resource/gnu/java/locale/LocaleInformation_en_PK.properties
+++ b/resource/gnu/java/locale/LocaleInformation_en_PK.properties
@@ -5,8 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
shortDateFormat=dd/MM/yy
mediumDateFormat=dd-MMM-yy
longDateFormat=d MMMM yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_en_SG.properties b/resource/gnu/java/locale/LocaleInformation_en_SG.properties
index e255bbec1..fe9075544 100644
--- a/resource/gnu/java/locale/LocaleInformation_en_SG.properties
+++ b/resource/gnu/java/locale/LocaleInformation_en_SG.properties
@@ -15,4 +15,4 @@ shortTimeFormat=h:mm a
mediumTimeFormat=h:mm:ss a
longTimeFormat=h:mm:ss a z
fullTimeFormat=h:mm:ss a z
-zoneStrings=Pacific/Guadalcanal®SST®Singapore Standard Time®SST®Singapore Standard Time®©
+zoneStrings=Asia/Singapore®SST®Singapore Standard Time®SST®Singapore Standard Time®©
diff --git a/resource/gnu/java/locale/LocaleInformation_en_US_POSIX.properties b/resource/gnu/java/locale/LocaleInformation_en_US_POSIX.properties
index 1435d0c93..6625bd8f4 100644
--- a/resource/gnu/java/locale/LocaleInformation_en_US_POSIX.properties
+++ b/resource/gnu/java/locale/LocaleInformation_en_US_POSIX.properties
@@ -8,5 +8,5 @@
perMill=0/00
infinity=INF
NaN=NaN
-percentFormat=0%
-currencyFormat=\u00a4 0.00;-\u00a4 0.00
+percentFormat=#0%
+currencyFormat=\u00a4 #0.00;-\u00a4 #0.00
diff --git a/resource/gnu/java/locale/LocaleInformation_eo.properties b/resource/gnu/java/locale/LocaleInformation_eo.properties
index 9cd17eac6..c5490afa4 100644
--- a/resource/gnu/java/locale/LocaleInformation_eo.properties
+++ b/resource/gnu/java/locale/LocaleInformation_eo.properties
@@ -102,6 +102,7 @@ territories.CY=Kipro
territories.CV=Kabo-Verdo
territories.PA=Panamo
territories.CU=Kubo
+territories.CS=Serbujo
territories.CR=Kostariko
territories.CO=Kolombio
territories.CN=\u0108inujo
@@ -147,36 +148,35 @@ territories.NE=Ni\u011dero
territories.NC=Nov-Kaledonio
territories.AW=Arubo
territories.ZM=Zambio
-territories.AU=A\u016dstralio
territories.NA=Namibio
+territories.AU=A\u016dstralio
territories.AT=A\u016dstrujo
territories.AR=Argentino
territories.AQ=Antarkto
-territories.MZ=Mozambiko
territories.AO=Angolo
-territories.MY=Malajzio
+territories.MZ=Mozambiko
territories.AN=Nederlandaj Antiloj
-territories.MX=Meksiko
+territories.MY=Malajzio
territories.AM=Armenujo
-territories.MW=Malavio
+territories.MX=Meksiko
territories.AL=Albanujo
+territories.MW=Malavio
territories.MV=Maldivoj
territories.ZA=Sud-Afriko
territories.MU=Ma\u016dricio
-territories.MT=Malto
territories.AI=Angvilo
-territories.MR=Ma\u016dritanujo
+territories.MT=Malto
territories.AG=Antigvo-Barbudo
-territories.MQ=Martiniko
+territories.MR=Ma\u016dritanujo
territories.AF=Afganujo
-territories.MP=Nord-Marianoj
+territories.MQ=Martiniko
territories.AE=Unui\u011dintaj Arabaj Emirlandos
+territories.MP=Nord-Marianoj
territories.AD=Andoro
territories.MN=Mongolujo
territories.MM=Mjanmao
territories.ML=Malio
territories.MK=Makedonujo
-territories.YU=Serbujo
territories.YT=Majoto
territories.MH=Mar\u015daloj
territories.MG=Madagaskaro
@@ -249,8 +249,8 @@ territories.TM=Turkmenujo
languages.es=hispana
languages.ku=kurda
languages.eo=esperanto
-languages.ks=ka\u015dmira
languages.en=angla
+languages.ks=ka\u015dmira
languages.el=greka
languages.qu=ke\u0109ua
languages.ko=korea
@@ -274,8 +274,8 @@ languages.cy=kimra
languages.pa=pan\u011daba
languages.cs=\u0109e\u0125a
languages.iu=inuita
-languages.it=itala
languages.co=korsika
+languages.it=itala
languages.is=islanda
languages.uz=uzbeka
languages.or=orijo
@@ -350,8 +350,8 @@ languages.mk=makedona
languages.aa=afara
languages.so=somala
languages.sn=\u015dona
-languages.mi=maoria
languages.gd=gaela
+languages.mi=maoria
languages.sm=samoa
languages.sl=slovena
languages.mg=malagasa
@@ -367,14 +367,14 @@ languages.fy=frisa
languages.sa=sanskrito
languages.fr=franca
languages.lv=latva
-languages.lt=litova
languages.fo=feroa
+languages.lt=litova
languages.rw=ruanda
languages.ru=rusa
-languages.lo=la\u016da
languages.fj=fi\u011dia
-languages.ln=lingala
+languages.lo=la\u016da
languages.fi=finna
+languages.ln=lingala
languages.ro=rumana
languages.rn=burunda
languages.rm=roman\u0109a
@@ -382,5 +382,5 @@ languages.fa=persa
languages.la=latino
languages.xh=ksosa
languages.eu=e\u016dska
-languages.ky=kirgiza
languages.et=estona
+languages.ky=kirgiza
diff --git a/resource/gnu/java/locale/LocaleInformation_es.properties b/resource/gnu/java/locale/LocaleInformation_es.properties
index 5284cd3ad..b109f14fd 100644
--- a/resource/gnu/java/locale/LocaleInformation_es.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es.properties
@@ -5,763 +5,356 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=,
+groupingSeparator=.
currencyFormat=\u00a4#,##0.00;(\u00a4#,##0.00)
localPatternChars=GuMtkHmsSEDFwWahKzUeygAZ
-currenciesDisplayName.JOD=dinar jordano
-currenciesDisplayName.BOV=MVDOL boliviano
-currenciesDisplayName.XAU=oro
-currenciesDisplayName.FOK=corona de las Islas Feroe
-currenciesDisplayName.LBP=libra libanesa
-currenciesDisplayName.EUR=euro
-currenciesDisplayName.VND=dong vietnamita
-currenciesDisplayName.TZS=chel\u00edn tanzano
-currenciesDisplayName.BOP=peso boliviano
-currenciesDisplayName.KHR=riel camboyano
-currenciesDisplayName.XAM=unidad monetaria asi\u00e1tica
-currenciesDisplayName.BOL=boliviano (1863-1962)
-currenciesDisplayName.KHO=antiguo riel camboyano
-currenciesDisplayName.ZMP=libra zambiana
-currenciesDisplayName.AUP=libra australiana
-currenciesDisplayName.XAF=franco CFA BEAC
-currenciesDisplayName.MTP=libra maltesa
-currenciesDisplayName.GHR=cedi revaluado ghan\u00e9s
-currenciesDisplayName.ZMK=kwacha zambiano
-currenciesDisplayName.XAD=unidad de cuenta asi\u00e1tica en dinares
-currenciesDisplayName.GHP=libra ghanesa
-currenciesDisplayName.BOB=boliviano
-currenciesDisplayName.GHO=antiguo cedi ghan\u00e9s
-currenciesDisplayName.MTL=lira maltesa
-currenciesDisplayName.AUD=d\u00f3lar australiano
-currenciesDisplayName.USS=d\u00f3lar estadounidense (mismo d\u00eda)
-currenciesDisplayName.ITL=lira italiana
-currenciesDisplayName.USN=d\u00f3lar estadounidense (d\u00eda siguiente)
-currenciesDisplayName.GHC=cedi ghan\u00e9s
-currenciesDisplayName.SGD=d\u00f3lar singapurense
-currenciesDisplayName.PAB=balboa paname\u00f1o
-currenciesDisplayName.LAK=kip laosiano
-currenciesDisplayName.KGS=som kirgu\u00eds
-currenciesDisplayName.CHF=franco suizo
-currenciesDisplayName.ATS=chel\u00edn austriaco
-currenciesDisplayName.USD=d\u00f3lar estadounidense
-currenciesDisplayName.ETD=d\u00f3lar et\u00edope
-currenciesDisplayName.BND=d\u00f3lar de Brun\u00e9i
-currenciesDisplayName.JMP=libra jamaicana
-currenciesDisplayName.ETB=birr et\u00edope
-currenciesDisplayName.DZG=franco germinal argelino
-currenciesDisplayName.DZF=nuevo franco argelino
-currenciesDisplayName.DZD=dinar argelino
-currenciesDisplayName.PYG=guaran\u00ed paraguayo
-currenciesDisplayName.LYP=libra libia
-currenciesDisplayName.JMD=d\u00f3lar de Jamaica
-currenciesDisplayName.ISK=corona islandesa
-currenciesDisplayName.ESP=peseta espa\u00f1ola
-currenciesDisplayName.BMP=libra de Bermudas
-currenciesDisplayName.LYD=dinar libio
-currenciesDisplayName.LYB=lira libia de la Autoridad Militar Brit\u00e1nica
-currenciesDisplayName.BMD=d\u00f3lar de Bermudas
-currenciesDisplayName.NLG=flor\u00edn neerland\u00e9s
-currenciesDisplayName.MRO=ouguiya mauritano
-currenciesDisplayName.IRR=rial iran\u00ed
-currenciesDisplayName.SEK=corona sueca
-currenciesDisplayName.ERN=nakfa eritreo
+currenciesDisplayName.YDD=dinar yemen\u00ed
+currenciesDisplayName.TWD=nuevo d\u00f3lar taiwan\u00e9s
currenciesDisplayName.KES=chel\u00edn keniata
-currenciesDisplayName.CFF=franco CFA de la Rep\u00fablica Centroafricana
+currenciesDisplayName.BYB=nuevo rublo bielorruso (1994-1999)
+currenciesDisplayName.LKR=rupia de Sri Lanka
+currenciesDisplayName.RWF=franco ruand\u00e9s
+currenciesDisplayName.TJS=somoni tayiko
+currenciesDisplayName.SDP=libra sudanesa
+currenciesDisplayName.TJR=rublo tayiko
+currenciesDisplayName.ERN=nakfa eritreo
+currenciesDisplayName.AFN=afgani
+currenciesDisplayName.GRD=dracma griego
+currenciesDisplayName.IEP=libra irlandesa
currenciesDisplayName.ARS=peso argentino
+currenciesDisplayName.SDD=dinar sudan\u00e9s
currenciesDisplayName.ARP=peso argentino (1983-1985)
-currenciesDisplayName.ARM=peso moneda nacional argentino
-currenciesDisplayName.TWD=nuevo d\u00f3lar taiwan\u00e9s
-currenciesDisplayName.SDP=libra sudanesa
currenciesDisplayName.GEL=lari georgiano
+currenciesDisplayName.AFA=afgani (1927-2002)
currenciesDisplayName.GEK=kupon larit georgiano
-currenciesDisplayName.MQF=franco de Martinica
+currenciesDisplayName.CRC=col\u00f3n costarricense
currenciesDisplayName.FKP=libra de las Islas Malvinas
+currenciesDisplayName.EEK=corona estonia
+currenciesDisplayName.HKD=d\u00f3lar de Hong Kong
+currenciesDisplayName.MDL=leu moldavo
currenciesDisplayName.ARA=austral argentino
-currenciesDisplayName.SDD=dinar sudan\u00e9s
currenciesDisplayName.IQD=dinar iraqu\u00ed
-currenciesDisplayName.TVD=d\u00f3lar de Tuvalu
currenciesDisplayName.SCR=rupia de Seychelles
+currenciesDisplayName.VUV=vatu vanuatuense
+currenciesDisplayName.DKK=corona danesa
+currenciesDisplayName.KPW=won norcoreano
+currenciesDisplayName.GQE=ekuele de Guinea Ecuatorial
+currenciesDisplayName.IDR=rupia indonesia
currenciesDisplayName.LVR=rublo let\u00f3n
-currenciesDisplayName.FJP=libra de las Islas Fiyi
+currenciesDisplayName.SOS=chel\u00edn somal\u00ed
+currenciesDisplayName.AED=dirham de los Emiratos \u00c1rabes Unidos
+currenciesDisplayName.BWP=pula botsuano
currenciesDisplayName.LVL=lats let\u00f3n
-currenciesDisplayName.CDL=zaire congole\u00f1o
-currenciesDisplayName.CDG=franco de la Rep\u00fablica del Congo
-currenciesDisplayName.CDF=franco congole\u00f1o
-currenciesDisplayName.FJD=d\u00f3lar de las Islas Fiyi
+currenciesDisplayName.RUR=rublo ruso (1991-1998)
currenciesDisplayName.NIO=c\u00f3rdoba oro nicarag\u00fcense
+currenciesDisplayName.ADP=peseta andorrana
+currenciesDisplayName.FJD=d\u00f3lar de las Islas Fiyi
currenciesDisplayName.MOP=pataca de Macao
-currenciesDisplayName.NIG=c\u00f3rdoba oro nicarag\u00fcense
+currenciesDisplayName.RUB=rublo ruso
+currenciesDisplayName.CDF=franco congole\u00f1o
currenciesDisplayName.NIC=c\u00f3rdoba nicarag\u00fcense
-currenciesDisplayName.XTR=rublo transferible del COMECON
-currenciesDisplayName.FIN=marco finland\u00e9s (1860-1962)
-currenciesDisplayName.FIM=marco finland\u00e9s
+currenciesDisplayName.DJF=franco de Yibuti
+currenciesDisplayName.ECV=unidad de valor constante (UVC) ecuatoriana
currenciesDisplayName.SBD=d\u00f3lar de las Islas Salom\u00f3n
+currenciesDisplayName.UZS=sum uzbeko
+currenciesDisplayName.ECS=sucre ecuatoriano
+currenciesDisplayName.PHP=peso filipino
+currenciesDisplayName.THB=baht tailand\u00e9s
currenciesDisplayName.LUF=franco luxemburgu\u00e9s
-currenciesDisplayName.TTO=antiguo d\u00f3lar de Trinidad y Tobago
-currenciesDisplayName.AOS=escudo angole\u00f1o
-currenciesDisplayName.AOR=kwanza reajustado angole\u00f1o (1995-1999)
-currenciesDisplayName.MNT=tugrik mongol
-currenciesDisplayName.HUF=forinto h\u00fangaro
-currenciesDisplayName.BIF=franco de Burundi
-currenciesDisplayName.AON=nuevo kwanza angole\u00f1o (1990-2000)
-currenciesDisplayName.AOK=kwanza angole\u00f1o (1977-1990)
+currenciesDisplayName.FIM=marco finland\u00e9s
currenciesDisplayName.TTD=d\u00f3lar de Trinidad y Tobago
currenciesDisplayName.SZL=lilangeni suazi
-currenciesDisplayName.NHF=franco CFP de las Nuevas H\u00e9bridas
-currenciesDisplayName.GBP=libra esterlina brit\u00e1nica
-currenciesDisplayName.SAS=riyal soberano saud\u00ed
+currenciesDisplayName.MNT=tugrik mongol
currenciesDisplayName.SAR=riyal saud\u00ed
+currenciesDisplayName.UAK=karbovanet ucraniano
+currenciesDisplayName.UAH=grivna ucraniana
+currenciesDisplayName.HUF=forinto h\u00fangaro
+currenciesDisplayName.COP=peso colombiano
+currenciesDisplayName.QAR=riyal de Qatar
currenciesDisplayName.LTT=talonas lituano
-currenciesDisplayName.INR=rupia india
currenciesDisplayName.PTE=escudo portugu\u00e9s
-currenciesDisplayName.AOA=kwanza angole\u00f1o
-currenciesDisplayName.PTC=conto portugu\u00e9s
+currenciesDisplayName.AOR=kwanza reajustado angole\u00f1o (1995-1999)
+currenciesDisplayName.UYU=peso uruguayo
+currenciesDisplayName.GBP=libra esterlina brit\u00e1nica
+currenciesDisplayName.BIF=franco de Burundi
+currenciesDisplayName.INR=rupia india
+currenciesDisplayName.ZRZ=zaire zaire\u00f1o
+currenciesDisplayName.AON=nuevo kwanza angole\u00f1o (1990-2000)
currenciesDisplayName.LTL=litas lituano
+currenciesDisplayName.XFU=franco UIC franc\u00e9s
currenciesDisplayName.KZT=tenge kazako
-currenciesDisplayName.KZR=rublo kazako
-currenciesDisplayName.VGD=d\u00f3lar de las Islas V\u00edrgenes Brit\u00e1nicas
-currenciesDisplayName.NGP=libra nigeriana
-currenciesDisplayName.MMX=certificados de cambio birmanos en d\u00f3lares
+currenciesDisplayName.MZM=metical mozambique\u00f1o
+currenciesDisplayName.UYP=peso uruguayo (1975-1993)
+currenciesDisplayName.AOK=kwanza angole\u00f1o (1977-1990)
+currenciesDisplayName.BUK=kyat birmano
+currenciesDisplayName.GNS=syli guineano
+currenciesDisplayName.XFO=franco oro franc\u00e9s
+currenciesDisplayName.PGK=kina de Pap\u00faa Nueva Guinea
+currenciesDisplayName.SYP=libra siria
+currenciesDisplayName.MZE=escudo mozambique\u00f1o
+currenciesDisplayName.OMR=rial oman\u00ed
currenciesDisplayName.NGN=naira nigeriano
+currenciesDisplayName.ZRN=nuevo zaire zaire\u00f1o
+currenciesDisplayName.AOA=kwanza angole\u00f1o
+currenciesDisplayName.CNY=yuan renminbi chino
+currenciesDisplayName.MAF=franco marroqu\u00ed
+currenciesDisplayName.GNF=franco guineo
currenciesDisplayName.HTG=gourde haitiano
-currenciesDisplayName.SYP=libra siria
-currenciesDisplayName.PSP=libra palestina
-currenciesDisplayName.BHD=dinar bahrein\u00ed
+currenciesDisplayName.MAD=dirham marroqu\u00ed
currenciesDisplayName.MMK=kyat de Myanmar
+currenciesDisplayName.MYR=ringgit malasio
+currenciesDisplayName.LSL=loti lesothense
+currenciesDisplayName.XEU=unidad de moneda europea
+currenciesDisplayName.BHD=dinar bahrein\u00ed
+currenciesDisplayName.SLL=leone de Sierra Leona
+currenciesDisplayName.BTN=ngultrum butan\u00e9s
+currenciesDisplayName.TRL=lira turca
+currenciesDisplayName.KMF=franco comorense
currenciesDisplayName.ANG=flor\u00edn de las Antillas Neerlandesas
currenciesDisplayName.CZK=corona checa
-currenciesDisplayName.IMP=libra esterlina de la Isla de Man
-currenciesDisplayName.BGX=certificados de cambio b\u00falgaros en leva
-currenciesDisplayName.LSL=loti lesothense
-currenciesDisplayName.GAF=franco CFA de Gab\u00f3n
-currenciesDisplayName.BGO=lev b\u00falgaro (1879-1952)
+currenciesDisplayName.AZM=manat azer\u00ed
+currenciesDisplayName.KYD=d\u00f3lar de las Islas Caim\u00e1n
+currenciesDisplayName.GMD=dalasi gambiano
currenciesDisplayName.BGN=nuevo lev b\u00falgaro
-currenciesDisplayName.BGM=lev socialista b\u00falgaro
currenciesDisplayName.CAD=d\u00f3lar canadiense
+currenciesDisplayName.MXV=unidad de inversi\u00f3n (UDI) mexicana
currenciesDisplayName.BGL=lev fuerte b\u00falgaro
-currenciesDisplayName.TRL=lira turca
-currenciesDisplayName.KYD=d\u00f3lar de las Islas Caim\u00e1n
-currenciesDisplayName.CYP=libra chipriota
+currenciesDisplayName.VEB=bol\u00edvar venezolano
+currenciesDisplayName.MLF=franco mal\u00ed
currenciesDisplayName.ILS=nuevo sheqel israel\u00ed
+currenciesDisplayName.MXP=peso de plata mexicano (1861-1992)
+currenciesDisplayName.PES=sol peruano
currenciesDisplayName.GYD=d\u00f3lar guyan\u00e9s
-currenciesDisplayName.AMD=dram armenio
+currenciesDisplayName.MXN=peso mexicano
currenciesDisplayName.ILP=libra israel\u00ed
-currenciesDisplayName.MLF=franco mal\u00ed
-currenciesDisplayName.ILL=sheqel israel\u00ed
-currenciesDisplayName.VEB=bol\u00edvar venezolano
-currenciesDisplayName.ALX=certificados de cambio albaneses en d\u00f3lares
+currenciesDisplayName.SKK=corona eslovaca
+currenciesDisplayName.CYP=libra chipriota
+currenciesDisplayName.XDR=derechos especiales de giro
+currenciesDisplayName.PEN=nuevo sol peruano
currenciesDisplayName.LRD=d\u00f3lar liberiano
-currenciesDisplayName.ALV=lek valute alban\u00e9s
+currenciesDisplayName.PEI=inti peruano
+currenciesDisplayName.AMD=dram armenio
+currenciesDisplayName.BSD=d\u00f3lar de las Bahamas
currenciesDisplayName.HRK=kuna croata
-currenciesDisplayName.REF=franco de Reuni\u00f3n
+currenciesDisplayName.CLP=peso chileno
currenciesDisplayName.HRD=dinar croata
-currenciesDisplayName.ALL=lek alban\u00e9s
-currenciesDisplayName.JEP=libra esterlina de Jersey
-currenciesDisplayName.ALK=lek alban\u00e9s (1946-1961)
-currenciesDisplayName.MKN=dinar macedonio (1992-1993)
-currenciesDisplayName.VDP=viet minh piastre dong viet de Vietnam del Norte
-currenciesDisplayName.VDN=nuevo dong de Vietnam del Norte
-currenciesDisplayName.MKD=dinar macedonio
-currenciesDisplayName.VDD=piastre dong viet de Vietnam del Norte
-currenciesDisplayName.TPP=pataca timorense
currenciesDisplayName.XPF=franco CFP
-currenciesDisplayName.BEL=franco belga (financiero)
-currenciesDisplayName.GWP=peso de Guinea-Biss\u00e1u
-currenciesDisplayName.KWD=dinar kuwait\u00ed
-currenciesDisplayName.GWM=mil reis de Guinea Portuguesa
-currenciesDisplayName.BEF=franco belga
+currenciesDisplayName.FRF=franco franc\u00e9s
+currenciesDisplayName.BRR=cruceiro brasile\u00f1o
+currenciesDisplayName.MKD=dinar macedonio
+currenciesDisplayName.CLF=unidad de fomento chilena
+currenciesDisplayName.ALL=lek alban\u00e9s
+currenciesDisplayName.BRN=nuevo cruzado brasile\u00f1o
+currenciesDisplayName.MWK=kwacha de Malawi
+currenciesDisplayName.BRL=real brasile\u00f1o
currenciesDisplayName.TPE=escudo timorense
-currenciesDisplayName.BEC=franco belga (convertible)
-currenciesDisplayName.GWE=escudo de Guinea Portuguesa
+currenciesDisplayName.BRE=cruceiro brasile\u00f1o (1990-1993)
+currenciesDisplayName.BRC=cruzado brasile\u00f1o
+currenciesDisplayName.BRB=nuevo cruceiro brasile\u00f1o (1967-1986)
+currenciesDisplayName.DEM=marco alem\u00e1n
+currenciesDisplayName.KWD=dinar kuwait\u00ed
+currenciesDisplayName.XCD=d\u00f3lar del Caribe Oriental
+currenciesDisplayName.NPR=rupia nepalesa
+currenciesDisplayName.GWP=peso de Guinea-Biss\u00e1u
+currenciesDisplayName.YUN=dinar convertible yugoslavo
currenciesDisplayName.SVC=col\u00f3n salvadore\u00f1o
-currenciesDisplayName.CWG=flor\u00edn de Curazao
-currenciesDisplayName.BDT=taka de Bangladesh
-currenciesDisplayName.TOS=libra esterlina tongana
-currenciesDisplayName.TOP=pa\u02bbanga tongano
+currenciesDisplayName.YUM=super dinar yugoslavo
+currenciesDisplayName.BEL=franco belga (financiero)
+currenciesDisplayName.SIT=t\u00f3lar esloveno
+currenciesDisplayName.JPY=yen japon\u00e9s
currenciesDisplayName.XOF=franco CFA BCEAO
+currenciesDisplayName.MVR=rufiyaa de Maldivas
+currenciesDisplayName.GWE=escudo de Guinea Portuguesa
+currenciesDisplayName.BEF=franco belga
+currenciesDisplayName.TOP=pa\u02bbanga tongano
+currenciesDisplayName.YUD=dinar fuerte yugoslavo
+currenciesDisplayName.BEC=franco belga (convertible)
currenciesDisplayName.SUR=rublo sovi\u00e9tico
-currenciesDisplayName.SUN=nuevo rublo sovi\u00e9tico
-currenciesDisplayName.NCF=franco germinal de Nueva Caledonia
-currenciesDisplayName.CVE=escudo de Cabo Verde
-currenciesDisplayName.XNF=franco CFA de las Antillas Francesas
+currenciesDisplayName.ROL=leu rumano
+currenciesDisplayName.DDM=ostmark de Alemania del Este
+currenciesDisplayName.BDT=taka de Bangladesh
+currenciesDisplayName.XBD=unidad de cuenta europea (XBD)
+currenciesDisplayName.AWG=flor\u00edn de Aruba
+currenciesDisplayName.XBC=unidad de cuenta europea (XBC)
+currenciesDisplayName.XBB=unidad monetaria europea
+currenciesDisplayName.XBA=unidad compuesta europea
+currenciesDisplayName.NOK=corona noruega
+currenciesDisplayName.MUR=rupia mauriciana
currenciesDisplayName.ZAR=rand sudafricano
-currenciesDisplayName.DOP=peso dominicano
-currenciesDisplayName.CUX=certificados de cambio cubanos
-currenciesDisplayName.ZAP=libra sudafricana
+currenciesDisplayName.SHP=libra de Santa Elena
+currenciesDisplayName.XAU=oro
currenciesDisplayName.ZAL=rand sudafricano (financiero)
+currenciesDisplayName.VND=dong vietnamita
+currenciesDisplayName.TZS=chel\u00edn tanzano
+currenciesDisplayName.GIP=libra de Gibraltar
currenciesDisplayName.TND=dinar tunecino
-currenciesDisplayName.CUP=peso cubano
-currenciesDisplayName.GUF=franco guayan\u00e9s de la Guayana Francesa
+currenciesDisplayName.CVE=escudo de Cabo Verde
currenciesDisplayName.UGX=chel\u00edn ugand\u00e9s
-currenciesDisplayName.LNR=rupia cingalesa
-currenciesDisplayName.AIF=franco de Affars e Issas
-currenciesDisplayName.VAL=lira de la Ciudad del Vaticano
-currenciesDisplayName.STE=escudo de Santo Tom\u00e9 y Pr\u00edncipe
+currenciesDisplayName.ZMK=kwacha zambiano
+currenciesDisplayName.JOD=dinar jordano
+currenciesDisplayName.XAF=franco CFA BEAC
+currenciesDisplayName.LBP=libra libanesa
currenciesDisplayName.UGS=chel\u00edn ugand\u00e9s (1966-1987)
currenciesDisplayName.STD=dobra de Santo Tom\u00e9 y Pr\u00edncipe
-currenciesDisplayName.MHD=d\u00f3lar de las Islas Marshall
-currenciesDisplayName.NZP=libra neozelandesa
currenciesDisplayName.WST=tala samoano
-currenciesDisplayName.WSP=libra samoana
-currenciesDisplayName.HNL=lempira hondure\u00f1o
-currenciesDisplayName.XMF=nuevo franco metropolitano franc\u00e9s
+currenciesDisplayName.KHR=riel camboyano
+currenciesDisplayName.EUR=euro
+currenciesDisplayName.DOP=peso dominicano
+currenciesDisplayName.BOV=MVDOL boliviano
+currenciesDisplayName.MTP=libra maltesa
+currenciesDisplayName.USS=d\u00f3lar estadounidense (mismo d\u00eda)
+currenciesDisplayName.BOP=peso boliviano
+currenciesDisplayName.MTL=lira maltesa
+currenciesDisplayName.CUP=peso cubano
currenciesDisplayName.TMM=manat turcomano
-currenciesDisplayName.GTQ=quetzal guatemalteco
+currenciesDisplayName.USN=d\u00f3lar estadounidense (d\u00eda siguiente)
+currenciesDisplayName.SGD=d\u00f3lar singapurense
currenciesDisplayName.NZD=d\u00f3lar neozeland\u00e9s
-currenciesDisplayName.SSP=libra escocesa
-currenciesDisplayName.BBD=d\u00f3lar de Barbados
+currenciesDisplayName.USD=d\u00f3lar estadounidense
+currenciesDisplayName.HNL=lempira hondure\u00f1o
+currenciesDisplayName.BOB=boliviano
+currenciesDisplayName.ITL=lira italiana
+currenciesDisplayName.PAB=balboa paname\u00f1o
+currenciesDisplayName.GTQ=quetzal guatemalteco
+currenciesDisplayName.LAK=kip laosiano
+currenciesDisplayName.GHC=cedi ghan\u00e9s
+currenciesDisplayName.AUD=d\u00f3lar australiano
currenciesDisplayName.NAD=d\u00f3lar de Namibia
+currenciesDisplayName.KGS=som kirgu\u00eds
currenciesDisplayName.MGF=franco malgache
+currenciesDisplayName.CHF=franco suizo
+currenciesDisplayName.BBD=d\u00f3lar de Barbados
currenciesDisplayName.MGA=ariary malgache
-currenciesDisplayName.EGP=libra egipcia
-currenciesDisplayName.BZH=d\u00f3lar de Honduras Brit\u00e1nica
+currenciesDisplayName.PYG=guaran\u00ed paraguayo
currenciesDisplayName.PLZ=zloty polaco (1950-1995)
-currenciesDisplayName.BAN=nuevo dinar bosnio
-currenciesDisplayName.PLX=certificados de cambio polacos en d\u00f3lares estadounidenses
-currenciesDisplayName.BAM=marco bosnio convertible
-currenciesDisplayName.BZD=d\u00f3lar de Belice
-currenciesDisplayName.BAD=dinar bosnio
-currenciesDisplayName.PLN=zloty polaco
currenciesDisplayName.YER=rial yemen\u00ed
+currenciesDisplayName.ATS=chel\u00edn austriaco
+currenciesDisplayName.ETB=birr et\u00edope
+currenciesDisplayName.BND=d\u00f3lar de Brun\u00e9i
+currenciesDisplayName.JMD=d\u00f3lar de Jamaica
+currenciesDisplayName.EGP=libra egipcia
+currenciesDisplayName.PLN=zloty polaco
+currenciesDisplayName.DZD=dinar argelino
+currenciesDisplayName.ISK=corona islandesa
currenciesDisplayName.SRG=flor\u00edn surinam\u00e9s
-currenciesDisplayName.CSK=corona fuerte checoslovaca
+currenciesDisplayName.LYD=dinar libio
+currenciesDisplayName.BZD=d\u00f3lar de Belice
+currenciesDisplayName.BAM=marco bosnio convertible
+currenciesDisplayName.ESP=peseta espa\u00f1ola
currenciesDisplayName.KRW=won surcoreano
+currenciesDisplayName.NLG=flor\u00edn neerland\u00e9s
+currenciesDisplayName.MRO=ouguiya mauritano
+currenciesDisplayName.BAD=dinar bosnio
+currenciesDisplayName.ZWD=d\u00f3lar de Zimbabue
+currenciesDisplayName.SEK=corona sueca
+currenciesDisplayName.CSK=corona fuerte checoslovaca
currenciesDisplayName.BYR=rublo bielorruso
-currenciesDisplayName.YEI=riyal Imadi yemen\u00ed
-currenciesDisplayName.BYL=rublo bielorruso (1992-1994)
-currenciesDisplayName.CSC=corona checoslovaca
-currenciesDisplayName.KRO=antiguo won surcoreano
-currenciesDisplayName.KRH=hwan surcoreano
-currenciesDisplayName.BYB=nuevo rublo bielorruso (1994-1999)
-currenciesDisplayName.SQS=chel\u00edn de Somalilandia
-currenciesDisplayName.GRN=nuevo dracma griego
+currenciesDisplayName.IRR=rial iran\u00ed
currenciesDisplayName.PKR=rupia pakistan\u00ed
-currenciesDisplayName.AFN=afgani
-currenciesDisplayName.ZWD=d\u00f3lar de Zimbabue
-currenciesDisplayName.LKR=rupia de Sri Lanka
-currenciesDisplayName.GRD=dracma griego
-currenciesDisplayName.IEP=libra irlandesa
-currenciesDisplayName.AFA=afgani (1927-2002)
-currenciesDisplayName.YDD=dinar yemen\u00ed
-currenciesDisplayName.RWF=franco ruand\u00e9s
-currenciesDisplayName.CRC=col\u00f3n costarricense
-currenciesDisplayName.TJS=somoni tayiko
-currenciesDisplayName.TJR=rublo tayiko
-currenciesDisplayName.EEK=corona estonia
-currenciesDisplayName.GQP=peseta guineana de Guinea Ecuatorial
-currenciesDisplayName.MDR=cup\u00f3n rublo moldavo
-currenciesDisplayName.HKD=d\u00f3lar de Hong Kong
-currenciesDisplayName.DKK=corona danesa
-currenciesDisplayName.MDL=leu moldavo
-currenciesDisplayName.GQF=franco de Guinea Ecuatorial
-currenciesDisplayName.GQE=ekuele de Guinea Ecuatorial
-currenciesDisplayName.IDR=rupia indonesia
-currenciesDisplayName.AED=dirham de los Emiratos \u00c1rabes Unidos
-currenciesDisplayName.KPW=won norcoreano
-currenciesDisplayName.IDN=nueva rupia indonesia
-currenciesDisplayName.BWP=pula botsuano
-currenciesDisplayName.MDC=cup\u00f3n leu moldavo
-currenciesDisplayName.IDJ=rupia Java indonesia
-currenciesDisplayName.KPP=won del pueblo norcoreano
-currenciesDisplayName.IDG=flor\u00edn Nica indonesio
-currenciesDisplayName.VUV=vatu vanuatuense
-currenciesDisplayName.XID=dinar isl\u00e1mico
-currenciesDisplayName.SOS=chel\u00edn somal\u00ed
-currenciesDisplayName.ADP=peseta andorrana
-currenciesDisplayName.RUR=rublo ruso (1991-1998)
-currenciesDisplayName.GPF=franco de Guadalupe
-currenciesDisplayName.DJF=franco de Yibuti
-currenciesDisplayName.ADD=diner andorrano
-currenciesDisplayName.MCG=franco germinal monegasco
-currenciesDisplayName.MCF=nuevo franco monegasco
-currenciesDisplayName.ECV=unidad de valor constante (UVC) ecuatoriana
-currenciesDisplayName.ECS=sucre ecuatoriano
-currenciesDisplayName.LIF=franco de Liechtenstein
-currenciesDisplayName.RUB=rublo ruso
-currenciesDisplayName.PHP=peso filipino
-currenciesDisplayName.UZS=sum uzbeko
-currenciesDisplayName.COP=peso colombiano
-currenciesDisplayName.THB=baht tailand\u00e9s
-currenciesDisplayName.IBP=libra de Irlanda del Norte
-currenciesDisplayName.BUR=rupia birmana
-currenciesDisplayName.COF=franco CFA del Congo
-currenciesDisplayName.BUK=kyat birmano
-currenciesDisplayName.COB=peso de papel colombiano
-currenciesDisplayName.UZC=cup\u00f3n som uzbeko
-currenciesDisplayName.UAK=karbovanet ucraniano
-currenciesDisplayName.QAR=riyal de Qatar
-currenciesDisplayName.UAH=grivna ucraniana
-currenciesDisplayName.GNS=syli guineano
-currenciesDisplayName.CNY=yuan renminbi chino
-currenciesDisplayName.MZM=metical mozambique\u00f1o
-currenciesDisplayName.CNX=certificados de cambio chinos en d\u00f3lares estadounidenses
-currenciesDisplayName.UYU=peso uruguayo
-currenciesDisplayName.GNI=franco guineo (1960-1972)
-currenciesDisplayName.SML=lira de San Marino
-currenciesDisplayName.CNP=jen min piao yuan chino
-currenciesDisplayName.MZE=escudo mozambique\u00f1o
-currenciesDisplayName.GNF=franco guineo
-currenciesDisplayName.OMS=rial saidi oman\u00ed
-currenciesDisplayName.PGK=kina de Pap\u00faa Nueva Guinea
-currenciesDisplayName.OMR=rial oman\u00ed
-currenciesDisplayName.UYP=peso uruguayo (1975-1993)
-currenciesDisplayName.XFU=franco UIC franc\u00e9s
-currenciesDisplayName.BTR=rupia butanesa
-currenciesDisplayName.ZRZ=zaire zaire\u00f1o
-currenciesDisplayName.MAF=franco marroqu\u00ed
-currenciesDisplayName.MAD=dirham marroqu\u00ed
-currenciesDisplayName.BTN=ngultrum butan\u00e9s
-currenciesDisplayName.XFO=franco oro franc\u00e9s
-currenciesDisplayName.UYF=peso fuerte uruguayo
-currenciesDisplayName.MYR=ringgit malasio
-currenciesDisplayName.ZRN=nuevo zaire zaire\u00f1o
-currenciesDisplayName.AZM=manat azer\u00ed
-currenciesDisplayName.GMP=libra gambiana
-currenciesDisplayName.KMF=franco comorense
-currenciesDisplayName.SLL=leone de Sierra Leona
-currenciesDisplayName.GMD=dalasi gambiano
-currenciesDisplayName.XEU=unidad de moneda europea
-currenciesDisplayName.BSP=libra de las Bahamas
-currenciesDisplayName.CMF=franco CFA de Camer\u00fan
-currenciesDisplayName.MXV=unidad de inversi\u00f3n (UDI) mexicana
-currenciesDisplayName.XEF=franco CFA BCEAEC
-currenciesDisplayName.BSD=d\u00f3lar de las Bahamas
-currenciesDisplayName.MXP=peso de plata mexicano (1861-1992)
-currenciesDisplayName.MXN=peso mexicano
-currenciesDisplayName.PES=sol peruano
-currenciesDisplayName.GLK=corona de Groenlandia
-currenciesDisplayName.BRZ=cruceiro brasile\u00f1o (1942-1967)
-currenciesDisplayName.PEN=nuevo sol peruano
-currenciesDisplayName.CLP=peso chileno
-currenciesDisplayName.SKK=corona eslovaca
-currenciesDisplayName.PEI=inti peruano
-currenciesDisplayName.BRR=cruceiro brasile\u00f1o
-currenciesDisplayName.XDR=derechos especiales de giro
-currenciesDisplayName.FRG=franco germinal/franco Poincar\u00e9 franc\u00e9s
-currenciesDisplayName.FRF=franco franc\u00e9s
-currenciesDisplayName.BRN=nuevo cruzado brasile\u00f1o
-currenciesDisplayName.CLF=unidad de fomento chilena
-currenciesDisplayName.CLE=escudo chileno
-currenciesDisplayName.BRL=real brasile\u00f1o
-currenciesDisplayName.CLC=c\u00f3ndor chileno
-currenciesDisplayName.BRE=cruceiro brasile\u00f1o (1990-1993)
-currenciesDisplayName.DES=sperrmark alem\u00e1n
-currenciesDisplayName.MWP=libra de Malawi
-currenciesDisplayName.BRC=cruzado brasile\u00f1o
-currenciesDisplayName.BRB=nuevo cruceiro brasile\u00f1o (1967-1986)
-currenciesDisplayName.MWK=kwacha de Malawi
-currenciesDisplayName.PDR=rublo de Transdniestria
-currenciesDisplayName.DEM=marco alem\u00e1n
-currenciesDisplayName.TDF=franco CFA del Chad
-currenciesDisplayName.PDN=nuevo rublo de Transdniestria
-currenciesDisplayName.PDK=cup\u00f3n rublo de Transdniestria
-currenciesDisplayName.NPR=rupia nepalesa
-currenciesDisplayName.CKD=d\u00f3lar de las Islas Cook
-currenciesDisplayName.JPY=yen japon\u00e9s
-currenciesDisplayName.MVR=rufiyaa de Maldivas
-currenciesDisplayName.XCF=nuevo franco CFA
-currenciesDisplayName.MVP=rupia de Maldivas
-currenciesDisplayName.XCD=d\u00f3lar del Caribe Oriental
-currenciesDisplayName.SIT=t\u00f3lar esloveno
-currenciesDisplayName.YUR=dinar reformado yugoslavo
-currenciesDisplayName.AWG=flor\u00edn de Aruba
-currenciesDisplayName.YUO=dinar de octubre yugoslavo
-currenciesDisplayName.DDM=ostmark de Alemania del Este
-currenciesDisplayName.YUN=dinar convertible yugoslavo
-currenciesDisplayName.YUM=super dinar yugoslavo
-currenciesDisplayName.TCC=corona de las Islas Turcas y Caicos
-currenciesDisplayName.YUG=dinar 1994 yugoslavo
-currenciesDisplayName.YUF=dinar de la Federaci\u00f3n Yugoslava
-currenciesDisplayName.RON=nuevo leu rumano
-currenciesDisplayName.YUD=dinar fuerte yugoslavo
-currenciesDisplayName.ROL=leu rumano
-currenciesDisplayName.SIB=t\u00f3lar bons esloveno
-currenciesDisplayName.NOK=corona noruega
-currenciesDisplayName.MUR=rupia mauriciana
-currenciesDisplayName.XBD=unidad de cuenta europea (XBD)
-currenciesDisplayName.GIP=libra de Gibraltar
-currenciesDisplayName.VNS=dong nacional vietnamita
-currenciesDisplayName.XBC=unidad de cuenta europea (XBC)
-currenciesDisplayName.VNR=dong de la Rep\u00fablica del vietnamita
-currenciesDisplayName.XBB=unidad monetaria europea
-currenciesDisplayName.XBA=unidad compuesta europea
-currenciesDisplayName.KID=d\u00f3lar de Kiribati
-currenciesDisplayName.SHP=libra de Santa Elena
-currenciesDisplayName.VNN=nuevo dong vietnamita
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=\u20a7
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=d\u00f3lar de Bermudas
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.NIO=C$
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.ECS=S/
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.CNP=CNP
-currenciesSymbol.MZE=MZE
currenciesSymbol.GNF=GF
-currenciesSymbol.OMS=OMS
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.ESP=\u20a7
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=ene®feb®mar®abr®may®jun®jul®ago®sep®oct®nov®dic®®
months=enero®febrero®marzo®abril®mayo®junio®julio®agosto®septiembre®octubre®noviembre®diciembre®®
shortWeekdays=®dom®lun®mar®mi\u00e9®jue®vie®s\u00e1b®
@@ -773,7 +366,7 @@ mediumDateFormat=dd-MMM-yy
longDateFormat=d' de 'MMMM' de 'yyyy
fullDateFormat=EEEE d' de 'MMMM' de 'yyyy
fullTimeFormat=HH'H'mm''ss\" z
-zoneStrings=America/Indianapolis®EST®Hora est\u00e1ndar oriental®EST®Hora est\u00e1ndar oriental®©America/Halifax®AST®Hora est\u00e1ndar del Atl\u00e1ntico®ADT®Hora de verano del Atl\u00e1ntico®©Pacific/Honolulu®HST®Hora est\u00e1ndar de Hawai®HST®Hora est\u00e1ndar de Hawai®©America/Denver®MST®Hora est\u00e1ndar de Monta\u00f1a®MDT®Hora de verano de Monta\u00f1a®©America/Anchorage®AST®Hora est\u00e1ndar de Alaska®ADT®Hora de verano de Alaska®©America/St_Johns®CNT®Hora est\u00e1ndar de Newfoundland®CDT®Hora de verano de Newfoundland®©Africa/Casablanca®GMT®Hora media de Greenwich®GMT®Hora media de Greenwich®©America/Chicago®CST®Hora est\u00e1ndar central®CDT®Hora de verano central®©Asia/Shanghai®CTT®Hora est\u00e1ndar de China®CDT®Hora est\u00e1ndar de China®©Asia/Tokyo®JST®Hora est\u00e1ndar de Jap\u00f3n®JST®Hora est\u00e1ndar de Jap\u00f3n®©America/New_York®EST®Hora est\u00e1ndar oriental®EDT®Hora de verano oriental®©Europe/Bucharest®EET®Hora est\u00e1ndar de Europa del Este®EEST®Hora de verano de Europa del Este®©America/Los_Angeles®PST®Hora est\u00e1ndar del Pac\u00edfico®PDT®Hora de verano del Pac\u00edfico®©America/Phoenix®MST®Hora est\u00e1ndar de Monta\u00f1a®MST®Hora est\u00e1ndar de Monta\u00f1a®©Etc/GMT®GMT®Hora media de Greenwich®GMT®Hora media de Greenwich®©Asia/Jerusalem®IST®Hora est\u00e1ndar de Israel®IDT®Hora de verano de Israel®©Europe/Paris®CET®Hora est\u00e1ndar de Europa Central®CEST®Hora de verano de Europa Central®©
+zoneStrings=Europe/Paris®CET®Hora est\u00e1ndar de Europa Central®CEST®Hora de verano de Europa Central®©Pacific/Honolulu®HST®Hora est\u00e1ndar de Hawai®HST®Hora est\u00e1ndar de Hawai®©America/Denver®MST®Hora est\u00e1ndar de Monta\u00f1a®MDT®Hora de verano de Monta\u00f1a®©Asia/Jerusalem®IST®Hora est\u00e1ndar de Israel®IDT®Hora de verano de Israel®©America/Anchorage®AST®Hora est\u00e1ndar de Alaska®ADT®Hora de verano de Alaska®©Africa/Casablanca®GMT®Hora media de Greenwich®GMT®Hora media de Greenwich®©America/Phoenix®MST®Hora est\u00e1ndar de Monta\u00f1a®MST®Hora est\u00e1ndar de Monta\u00f1a®©America/Los_Angeles®PST®Hora est\u00e1ndar del Pac\u00edfico®PDT®Hora de verano del Pac\u00edfico®©America/Chicago®CST®Hora est\u00e1ndar central®CDT®Hora de verano central®©America/Halifax®AST®Hora est\u00e1ndar del Atl\u00e1ntico®ADT®Hora de verano del Atl\u00e1ntico®©America/St_Johns®CNT®Hora est\u00e1ndar de Newfoundland®CDT®Hora de verano de Newfoundland®©America/New_York®EST®Hora est\u00e1ndar oriental®EDT®Hora de verano oriental®©Asia/Shanghai®CTT®Hora est\u00e1ndar de China®CDT®Hora est\u00e1ndar de China®©Asia/Tokyo®JST®Hora est\u00e1ndar de Jap\u00f3n®JST®Hora est\u00e1ndar de Jap\u00f3n®©Europe/Bucharest®EET®Hora est\u00e1ndar de Europa del Este®EEST®Hora de verano de Europa del Este®©America/Indianapolis®EST®Hora est\u00e1ndar oriental®EST®Hora est\u00e1ndar oriental®©
territories.TL=Timor Oriental
territories.TK=Islas Tokelau
territories.TJ=Tayikist\u00e1n
@@ -862,6 +455,7 @@ territories.CX=Isla Navidad
territories.CV=Cabo Verde
territories.PA=Panam\u00e1
territories.CU=Cuba
+territories.CS=Serbia y Montenegro
territories.CR=Costa Rica
territories.CO=Colombia
territories.CN=China
@@ -932,17 +526,16 @@ territories.AI=Anguila
territories.MS=Montserrat
territories.MR=Mauritania
territories.AG=Antigua y Barbuda
-territories.MQ=Martinica
territories.AF=Afganist\u00e1n
-territories.MP=Islas Marianas del Norte
+territories.MQ=Martinica
territories.AE=Emiratos \u00c1rabes Unidos
-territories.MO=Macao, Regi\u00f3n administrativa especial de China
+territories.MP=Islas Marianas del Norte
territories.AD=Andorra
+territories.MO=Macao, Regi\u00f3n administrativa especial de China
territories.MN=Mongolia
territories.MM=Myanmar
territories.ML=Mal\u00ed
territories.MK=Macedonia
-territories.YU=Yugoslavia
territories.YT=Mayotte
territories.MH=Islas Marshall
territories.MG=Madagascar
@@ -1013,10 +606,9 @@ territories.TR=Turqu\u00eda
territories.TO=Tonga
territories.TN=T\u00fanez
territories.TM=Turkmenist\u00e1n
-languages.gwi=kutchin
languages.akk=acadio
+languages.gwi=kutchin
languages.eka=ekajuk
-languages.ijo=ijo
languages.xh=xhosa
languages.sux=sumerio
languages.sus=susu
@@ -1027,19 +619,18 @@ languages.pon=pohnpeiano
languages.min=minangkabau
languages.suk=sukuma
languages.wo=uolof
-languages.lol=mongo
languages.kut=kutenai
+languages.lol=mongo
languages.mic=micmac
languages.wa=val\u00f3n
languages.kum=kumyk
languages.zap=zapoteco
languages.cus=cusitas (otras)
-languages.jbo=lojban
languages.doi=dogri
+languages.jbo=lojban
languages.vo=volapuk
languages.oto=lenguas otomanas
languages.vi=vietnamita
-languages.vai=vai
languages.rar=rarotongano
languages.ve=venda
languages.rap=rapanui
@@ -1059,8 +650,8 @@ languages.egy=egipcio (antiguo)
languages.ug=uigur
languages.fan=fang
languages.ssa=nilosaharianas (otras)
-languages.mga=irland\u00e9s medieval (900-1200)
languages.bat=b\u00e1lticas (otras)
+languages.mga=irland\u00e9s medieval (900-1200)
languages.nyo=nyoro
languages.bas=basa
languages.nyn=nyankole
@@ -1088,8 +679,8 @@ languages.kru=kurukh
languages.tg=tayiko
languages.byn=blin
languages.te=telugu
-languages.kro=kru
languages.csb=casubio
+languages.kro=kru
languages.ta=tamil
languages.tkl=tokelauano
languages.efi=efik
@@ -1110,11 +701,11 @@ languages.sm=samoano
languages.sl=esloveno
languages.grc=griego antiguo (hasta el 1453)
languages.sk=eslovaco
-languages.grb=gerbo
+languages.grb=grebo
languages.si=singal\u00e9s
languages.sh=serbo-croata
-languages.crh=turco de Crimea; t\u00e1rtaro de Crimea
-languages.afa=afroasi\u00e1tica (otra)
+languages.afa=afroasi\u00e1ticas (otras)
+languages.crh=t\u00e1rtaro de Crimea
languages.sg=sango
languages.se=sami septentrional
languages.sd=sindhi
@@ -1128,7 +719,6 @@ languages.ro=rumano
languages.rn=kiroundi
languages.rm=reto-romance
languages.mdf=moksha
-languages.tiv=tiv
languages.ady=adigeo
languages.zun=zuni
languages.kpe=kpelle
@@ -1138,13 +728,13 @@ languages.son=songhai
languages.cpp=criollas y pidgins, basadas en el portugu\u00e9s (otras)
languages.sog=sogdiano
languages.ada=adangme
-languages.kos=kosraeano
languages.hit=hitita
+languages.kos=kosraeano
languages.cpe=criollas y pidgins, basadas en el ingl\u00e9s (otras)
languages.him=himachali
-languages.kok=konkani
-languages.hil=hiligaynon
languages.got=g\u00f3tico
+languages.hil=hiligaynon
+languages.kok=konkani
languages.gor=gorontalo
languages.gon=gondi
languages.din=dinka
@@ -1158,7 +748,6 @@ languages.snk=sonink\u00e9
languages.cop=copto
languages.yap=yap\u00e9s
languages.ach=acoli
-languages.yao=yao
languages.phi=filipinas (otras)
languages.pl=polaco
languages.ace=acehn\u00e9s
@@ -1171,7 +760,7 @@ languages.bua=buriat
languages.mas=masai
languages.smn=sami inari
languages.os=os\u00e9tico
-languages.map=austronesio
+languages.map=austronesias (otras)
languages.or=oriya
languages.man=mandingo
languages.smj=sami lule
@@ -1184,8 +773,8 @@ languages.mag=magahi
languages.mad=madur\u00e9s
languages.sma=sami meridional
languages.oc=occitano (despu\u00e9s del 1500)
-languages.nso=sesotho septentrional
-languages.btk=batak
+languages.nso=sotho septentrional
+languages.btk=batak (Indonesia)
languages.myv=erzya
languages.dgr=dogrib
languages.ny=nyanja
@@ -1216,21 +805,21 @@ languages.ms=malayo
languages.mr=marathi
languages.fro=franc\u00e9s antiguo (842-1400 aprox.)
languages.mo=moldavo
-languages.frm=franc\u00e9s medieval (1400-1600 aprox.)
languages.mn=mongol
-languages.jrb=judeo-\u00e1rabe
+languages.frm=franc\u00e9s medieval (1400-1600 aprox.)
languages.ml=malayalam
+languages.jrb=judeo-\u00e1rabe
languages.mk=macedonio
languages.mi=maor\u00ed
languages.mh=marshal\u00e9s
languages.mg=malgache
languages.mwr=marwari
languages.bra=braj
-languages.den=slave
languages.lv=let\u00f3n
+languages.den=slave (atabasca)
languages.lu=luba-katanga
-languages.del=delaware
languages.lt=lituano
+languages.del=delaware
languages.lo=laosiano
languages.ln=lingala
languages.li=limburgu\u00e9s
@@ -1245,7 +834,7 @@ languages.ky=kirghiz
languages.kw=c\u00f3rnico
languages.kv=komi
languages.ku=kurdo
-languages.sio=lenguas siouan
+languages.sio=lenguas sioux
languages.ks=cachemiro
languages.kr=kanuri
languages.awa=avadhi
@@ -1259,7 +848,7 @@ languages.kj=kuanyama
languages.sid=sidamo
languages.ki=kikuyu
languages.kg=kongo
-languages.non=norse antiguo
+languages.non=n\u00f3rdico antiguo
languages.ka=georgiano
languages.mus=creek
languages.roa=rom\u00e1nicas (otras)
@@ -1270,7 +859,6 @@ languages.jv=javan\u00e9s
languages.gil=gilbert\u00e9s
languages.znd=zande
languages.shn=shan
-languages.fon=fon
languages.xal=kalmyk
languages.aus=lenguas australianas
languages.kho=kotan\u00e9s
@@ -1283,38 +871,38 @@ languages.iu=inuktitut
languages.pap=papiamento
languages.it=italiano
languages.sgn=lenguajes de signos
-languages.is=island\u00e9s
languages.kha=khasi
+languages.is=island\u00e9s
languages.chr=cherokee
languages.pam=pampanga
languages.pal=pahlavi
languages.chp=chipewyan
-languages.io=ido
languages.cho=choctaw
+languages.io=ido
languages.chn=jerga chinuk
languages.chm=mar\u00ed
languages.tyv=tuviniano
-languages.bnt=bant\u00fa
+languages.bnt=bant\u00faes (otras)
languages.pag=pangasin\u00e1n
-languages.ik=inupiak
languages.chk=truk\u00e9s
-languages.ii=sichuan yi
+languages.ik=inupiak
languages.haw=hawaiano
+languages.ii=sichuan yi
languages.lam=lamba
-languages.ig=igbo
languages.chg=chagat\u00e1i
-languages.sga=irland\u00e9s antiguo (hasta 900)
+languages.ig=igbo
+languages.sga=irland\u00e9s antiguo (hasta el 900)
languages.paa=pap\u00faes (otras)
languages.ie=interlingue
languages.id=indonesio
languages.lah=lahnda
-languages.day=dayak
languages.chb=chibcha
+languages.day=dayak
languages.ia=interlingua
languages.lad=ladino
-languages.hz=herero
-languages.hai=haida
languages.dar=dargva
+languages.hai=haida
+languages.hz=herero
languages.hy=armenio
languages.ath=lenguas atabascas
languages.hu=h\u00fangaro
@@ -1336,10 +924,10 @@ languages.iro=lenguas iroquesas
languages.gn=guaran\u00ed
languages.gl=gallego
languages.arw=arahuaco
-languages.gez=geez
-languages.art=artificiales (otras)
languages.gd=ga\u00e9lico escoc\u00e9s
-languages.ira=iranio
+languages.art=artificiales (otras)
+languages.gez=geez
+languages.ira=iranias (otras)
languages.ga=irland\u00e9s
languages.arp=arapaho
languages.arn=araucano
@@ -1347,8 +935,8 @@ languages.fy=fris\u00f3n
languages.bla=siksika
languages.gem=germ\u00e1nicas (otras)
languages.ypk=lenguas yupik
-languages.arc=arameo
languages.fr=franc\u00e9s
+languages.arc=arameo
languages.fo=fero\u00e9s
languages.cel=celtas (otras)
languages.fj=fidji
@@ -1372,12 +960,11 @@ languages.tum=tumbuka
languages.mos=mossi
languages.dz=bhutan\u00ed
languages.nic=n\u00edger-kordofanianas (otras)
-languages.lus=lushai
-languages.fiu=finougrias (otras)
languages.dv=divehi
+languages.fiu=finougrias (otras)
+languages.lus=lushai
languages.nia=nias
languages.moh=mohawk
-languages.luo=luo
languages.lun=lunda
languages.apa=lenguas apache
languages.lui=luise\u00f1o
@@ -1390,37 +977,37 @@ languages.was=washo
languages.und=indeterminada
languages.war=waray
languages.da=dan\u00e9s
-languages.dum=neerland\u00e9s medio (1050-1350 aprox.)
+languages.dum=neerland\u00e9s medieval (1050-1350 aprox.)
languages.wal=walamo
languages.mno=lenguas manobo
languages.wak=lenguas wakasha
languages.sat=santali
languages.cy=gal\u00e9s
languages.sas=sasak
-languages.kbd=kabardiana
languages.cv=chuvash
+languages.kbd=kabardiano
languages.cu=eslavo eclesi\u00e1stico
languages.mni=manipuri
languages.cs=checo
languages.sam=arameo samaritano
languages.cr=cree
-languages.sal=lenguas salishan
+languages.sal=lenguas salish
languages.dua=duala
languages.co=corso
languages.sai=indias sudamericanas (otras)
languages.mnc=manch\u00fa
languages.sah=yakut
-languages.kaw=kawi
-languages.inh=ingush
languages.gba=gbaya
+languages.inh=ingush
+languages.kaw=kawi
languages.sad=sandawe
languages.ch=chamorro
-languages.ine=indoeuropeas (otras)
languages.bho=bhojpuri
+languages.ine=indoeuropeas (otras)
languages.enm=ingl\u00e9s medieval (1100-1500)
-languages.kar=karen
-languages.inc=\u00edndicas (otras)
languages.ce=checheno
+languages.inc=\u00edndicas (otras)
+languages.kar=karen
languages.gay=gayo
languages.ca=catal\u00e1n
languages.umb=umbundu
@@ -1428,19 +1015,19 @@ languages.syr=siriaco
languages.kam=kamba
languages.tsi=tsimshiano
languages.ang=ingl\u00e9s antiguo (450-1100 aprox.)
-languages.kac=kachin
languages.cau=cauc\u00e1sicas (otras)
+languages.kac=kachin
languages.kab=cabila
-languages.kaa=karakalpako
languages.bs=bosnio
-languages.car=caribe
+languages.kaa=karakalpako
languages.br=bret\u00f3n
+languages.car=caribe
languages.bo=tibetano
languages.bn=bengal\u00ed
languages.bm=bambara
languages.gaa=ga
-languages.cai=indias centroamericanas (otras)
languages.bi=bislama
+languages.cai=indias centroamericanas (otras)
languages.bh=bihari
languages.bg=b\u00falgaro
languages.be=bielorruso
@@ -1454,10 +1041,10 @@ languages.az=azer\u00ed
languages.ay=aymara
languages.av=avar
languages.as=asam\u00e9s
-languages.dsb=sorbio inferior
languages.ar=\u00e1rabe
-languages.ilo=ilocano
+languages.dsb=sorbio inferior
languages.elx=elamita
+languages.ilo=ilocano
languages.zh=chino
languages.an=aragon\u00e9s
languages.pra=lenguas prakrit
@@ -1475,8 +1062,8 @@ languages.ale=aleutiano
languages.mkh=mon-jemer (otras)
languages.yi=yidish
languages.dra=drav\u00eddicas (otras)
-languages.ber=bereber
-languages.nds=bajo alem\u00e1n; bajo saj\u00f3n
+languages.ber=bereberes (otras)
+languages.nds=bajo alem\u00e1n
languages.bem=bemba
languages.bej=beja
languages.tpi=tok pisin
diff --git a/resource/gnu/java/locale/LocaleInformation_es_AR.properties b/resource/gnu/java/locale/LocaleInformation_es_AR.properties
index 97b24d4f6..9ab78a9ff 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_AR.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_AR.properties
@@ -5,8 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
currenciesDisplayName.ARS=Peso Argentino
currenciesDisplayName.USD=D\u00f3lar Americano
currenciesSymbol.ARS=$
diff --git a/resource/gnu/java/locale/LocaleInformation_es_BO.properties b/resource/gnu/java/locale/LocaleInformation_es_BO.properties
index ab383ea32..723d13a65 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_BO.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_BO.properties
@@ -5,8 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
shortTimeFormat=hh:mm a
diff --git a/resource/gnu/java/locale/LocaleInformation_es_CL.properties b/resource/gnu/java/locale/LocaleInformation_es_CL.properties
index 60957a170..0498645fe 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_CL.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_CL.properties
@@ -5,8 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
currencyFormat=\u00a4#,##0.00;\u00a4-#,##0.00
currenciesDisplayName.CLP=Peso Chileno
currenciesDisplayName.USD=D\u00f3lar Americano
diff --git a/resource/gnu/java/locale/LocaleInformation_es_CO.properties b/resource/gnu/java/locale/LocaleInformation_es_CO.properties
index 2adadca3d..1178909b9 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_CO.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_CO.properties
@@ -5,8 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
currenciesDisplayName.COP=Peso de Colombia
currenciesDisplayName.USD=D\u00f3lar Americano
currenciesSymbol.COP=$
diff --git a/resource/gnu/java/locale/LocaleInformation_es_CR.properties b/resource/gnu/java/locale/LocaleInformation_es_CR.properties
index 8eb845320..04eb63de0 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_CR.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_CR.properties
@@ -5,8 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
shortTimeFormat=hh:mm a
diff --git a/resource/gnu/java/locale/LocaleInformation_es_DO.properties b/resource/gnu/java/locale/LocaleInformation_es_DO.properties
index 89ee64cdd..0214a025f 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_DO.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_DO.properties
@@ -5,6 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=.
+groupingSeparator=,
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
shortTimeFormat=hh:mm a
diff --git a/resource/gnu/java/locale/LocaleInformation_es_EC.properties b/resource/gnu/java/locale/LocaleInformation_es_EC.properties
index 7ece89daa..df3b509f4 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_EC.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_EC.properties
@@ -5,9 +5,10 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
+decimalSeparator=.
+groupingSeparator=,
currencyFormat=\u00a4#,##0.00;\u00a4-#,##0.00
+currenciesSymbol.USD=$
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
shortTimeFormat=H:mm
diff --git a/resource/gnu/java/locale/LocaleInformation_es_ES.properties b/resource/gnu/java/locale/LocaleInformation_es_ES.properties
index deccfab13..52dd8013a 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_ES.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_ES.properties
@@ -5,8 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_es_GT.properties b/resource/gnu/java/locale/LocaleInformation_es_GT.properties
index 9c0575dd5..68a375d4d 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_GT.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_GT.properties
@@ -5,6 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=.
+groupingSeparator=,
mediumDateFormat=d/MM/yyyy
shortTimeFormat=hh:mm a
mediumTimeFormat=hh:mm:ss a
diff --git a/resource/gnu/java/locale/LocaleInformation_es_HN.properties b/resource/gnu/java/locale/LocaleInformation_es_HN.properties
index f4b45c906..c2dd4895d 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_HN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_HN.properties
@@ -5,6 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=.
+groupingSeparator=,
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
longDateFormat=dd' de 'MMMM' de 'yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_es_MX.properties b/resource/gnu/java/locale/LocaleInformation_es_MX.properties
index b18131034..50f4220d3 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_MX.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_MX.properties
@@ -5,6 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=.
+groupingSeparator=,
currenciesDisplayName.MXN=MXN
currenciesDisplayName.USD=D\u00f3lar Americano
currenciesSymbol.MXN=$
diff --git a/resource/gnu/java/locale/LocaleInformation_es_NI.properties b/resource/gnu/java/locale/LocaleInformation_es_NI.properties
index 2d7a9e6a0..5bba6ada2 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_NI.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_NI.properties
@@ -5,6 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=.
+groupingSeparator=,
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
shortTimeFormat=hh:mm a
diff --git a/resource/gnu/java/locale/LocaleInformation_es_PA.properties b/resource/gnu/java/locale/LocaleInformation_es_PA.properties
index 178724a32..89e298234 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_PA.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_PA.properties
@@ -5,6 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=.
+groupingSeparator=,
shortDateFormat=MM/dd/yy
mediumDateFormat=MM/dd/yyyy
shortTimeFormat=hh:mm a
diff --git a/resource/gnu/java/locale/LocaleInformation_es_PE.properties b/resource/gnu/java/locale/LocaleInformation_es_PE.properties
index a30e6c6ce..1cfe9b7cc 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_PE.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_PE.properties
@@ -5,6 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=.
+groupingSeparator=,
currencyFormat=\u00a4#,##0.00;\u00a4-#,##0.00
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_es_PR.properties b/resource/gnu/java/locale/LocaleInformation_es_PR.properties
index 7937a8a0b..ece3beb56 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_PR.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_PR.properties
@@ -5,6 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=.
+groupingSeparator=,
currenciesDisplayName.USD=D\u00f3lar Americano
currenciesSymbol.USD=$
shortDateFormat=MM/dd/yy
diff --git a/resource/gnu/java/locale/LocaleInformation_es_PY.properties b/resource/gnu/java/locale/LocaleInformation_es_PY.properties
index ed77a3cd8..40bc9972a 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_PY.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_PY.properties
@@ -5,9 +5,7 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
-currencyFormat=\u00a4 #,##0;\u00a4 -#,##0
+currencyFormat=\u00a4 #,##0.00;\u00a4 -#,##0.00
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
shortTimeFormat=hh:mm a
diff --git a/resource/gnu/java/locale/LocaleInformation_es_SV.properties b/resource/gnu/java/locale/LocaleInformation_es_SV.properties
index c6f0ab3a2..115503925 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_SV.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_SV.properties
@@ -5,6 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=.
+groupingSeparator=,
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
shortTimeFormat=hh:mm a
diff --git a/resource/gnu/java/locale/LocaleInformation_es_US.properties b/resource/gnu/java/locale/LocaleInformation_es_US.properties
index 99d868118..b45673fa1 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_US.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_US.properties
@@ -5,7 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-minNumberOfDaysInFirstWeek=1
+decimalSeparator=.
+groupingSeparator=,
firstDayOfWeek=sun
shortDateFormat=M/d/yy
mediumDateFormat=MMM d, yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_es_UY.properties b/resource/gnu/java/locale/LocaleInformation_es_UY.properties
index c174d2bea..5356fcf4b 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_UY.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_UY.properties
@@ -5,9 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
currencyFormat=\u00a4 #,##0.00;(\u00a4#,##0.00)
+currenciesSymbol.UYU=$
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
shortTimeFormat=hh:mm a
diff --git a/resource/gnu/java/locale/LocaleInformation_es_VE.properties b/resource/gnu/java/locale/LocaleInformation_es_VE.properties
index 9925e1637..288794f10 100644
--- a/resource/gnu/java/locale/LocaleInformation_es_VE.properties
+++ b/resource/gnu/java/locale/LocaleInformation_es_VE.properties
@@ -5,8 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=.
currencyFormat=\u00a4#,##0.00;\u00a4 -#,##0.00
shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_et.properties b/resource/gnu/java/locale/LocaleInformation_et.properties
index f73b78ac3..3f01ee6fc 100644
--- a/resource/gnu/java/locale/LocaleInformation_et.properties
+++ b/resource/gnu/java/locale/LocaleInformation_et.properties
@@ -8,7 +8,7 @@
decimalSeparator=,
groupingSeparator=\u00a0
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.EEK=EEK
+currenciesDisplayName.EEK=kroon
currenciesSymbol.EEK=kr
shortMonths=jaan®veebr®m\u00e4rts®apr®mai®juuni®juuli®aug®sept®okt®nov®dets®®
months=jaanuar®veebruar®m\u00e4rts®aprill®mai®juuni®juuli®august®september®oktoober®november®detsember®®
@@ -26,12 +26,12 @@ longTimeFormat=H:mm:ss z
fullTimeFormat=H:mm:ss z
territories.TL=Ida-Timor
territories.TK=Tokelau
-territories.TJ=Tad\u012aikistan
+territories.TJ=Tad\u017eikistan
territories.TH=Tai
territories.TG=Togo
territories.TF=Prantsuse L\u00f5unaalad
territories.GY=Guyana
-territories.TD=Tiaad
+territories.TD=T\u0161aad
territories.TC=Turks ja Caicos
territories.GW=Guinea-Bissau
territories.GU=Guam
@@ -66,7 +66,7 @@ territories.SH=Saint Helena
territories.SG=Singapur
territories.SE=Rootsi
territories.SD=Sudaan
-territories.SC=Seiiellid
+territories.SC=Sei\u0161ellid
territories.SB=Saalomoni Saared
territories.SA=Saudi Araabia
territories.FR=Prantsusmaa
@@ -75,7 +75,7 @@ territories.FM=Mikroneesia Liiduriigid
territories.RW=Rwanda
territories.FK=Falklandi saared
territories.RU=Venemaa
-territories.FJ=Fid\u012ai
+territories.FJ=Fid\u017ei
territories.FI=Soome
territories.RO=Rumeenia
territories.RE=R\u00e9union
@@ -86,7 +86,7 @@ territories.EH=L\u00e4\u00e4ne-Sahara
territories.EG=Egiptus
territories.EE=Eesti
territories.EC=Ecuador
-territories.DZ=Al\u012aeeria
+territories.DZ=Al\u017eeeria
territories.QA=Katar
territories.DO=Dominikaani Vabariik
territories.PY=Paraguay
@@ -105,21 +105,22 @@ territories.PK=Pakistan
territories.PH=Filipiinid
territories.PG=Paapua Uus-Guinea
territories.PF=Prantsuse Pol\u00fcneesia
-territories.CZ=Tiehhi Vabariik
+territories.CZ=T\u0161ehhi Vabariik
territories.PE=Peruu
territories.CY=K\u00fcpros
territories.CX=J\u00f5ulusaar
territories.CV=Cabo Verde
territories.PA=Panama
territories.CU=Kuuba
+territories.CS=Serbia ja Montenegro
territories.CR=Costa Rica
territories.CO=Colombia
territories.CN=Hiina
territories.CM=Kamerun
-territories.CL=Tiiili
+territories.CL=T\u0161iili
territories.CK=Cooki saared
territories.CI=Cote d\u2019Ivoire
-territories.CH=\u0128veits
+territories.CH=\u0160veits
territories.CG=Kongo
territories.CF=Kesk-Aafrika Vabariik
territories.CD=Kongo DV
@@ -155,7 +156,7 @@ territories.BA=Bosnia ja Hertsegoviina
territories.NI=Nicaragua
territories.NG=Nigeeria
territories.NF=Norfolk
-territories.AZ=Aserbaid\u012aaan
+territories.AZ=Aserbaid\u017eaan
territories.NE=Niger
territories.NC=Uus-Kaledoonia
territories.AW=Aruba
@@ -182,17 +183,16 @@ territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauritaania
territories.AG=Antigua ja Barbuda
-territories.MQ=Martinique
territories.AF=Afganistan
-territories.MP=P\u00f5hja-Mariaanid
+territories.MQ=Martinique
territories.AE=Araabia \u00dchendemiraadid
-territories.MO=Aomeni Hiina erihalduspiirkond
+territories.MP=P\u00f5hja-Mariaanid
territories.AD=Andorra
+territories.MO=Aomeni Hiina erihalduspiirkond
territories.MN=Mongoolia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Makedoonia Vabariik
-territories.YU=Jugoslaavia
territories.YT=Mayotte
territories.MH=Marshalli Saared
territories.MG=Madagaskar
@@ -220,7 +220,7 @@ territories.KN=Saint Kitts ja Nevis
territories.KM=Komoorid
territories.KI=Kiribati
territories.WS=Samoa
-territories.KH=Kambod\u012aa
+territories.KH=Kambod\u017ea
territories.KG=K\u00f5rg\u00f5zstan
territories.KE=Kenya
territories.WF=Wallis ja Futuna
@@ -272,8 +272,8 @@ languages.el=Kreeka
languages.nl=Hollandi
languages.bg=Bulgaaria
languages.lv=L\u00e4ti
+languages.cs=T\u0161ehhi
languages.he=Heebrea
-languages.cs=Tiehhi
languages.it=Itaalia
languages.lt=Leedu
languages.fr=Prantsuse
@@ -288,8 +288,8 @@ languages.pl=Poola
languages.sl=Sloveeni
languages.sk=Slovaki
languages.de=Saksa
-languages.hu=Ungari
languages.et=Eesti
+languages.hu=Ungari
languages.es=Hispaania
-languages.hr=Horvaadi
languages.da=Taani
+languages.hr=Horvaadi
diff --git a/resource/gnu/java/locale/LocaleInformation_eu.properties b/resource/gnu/java/locale/LocaleInformation_eu.properties
index 3d8b8e77b..c606f7866 100644
--- a/resource/gnu/java/locale/LocaleInformation_eu.properties
+++ b/resource/gnu/java/locale/LocaleInformation_eu.properties
@@ -7,7 +7,6 @@
decimalSeparator=,
groupingSeparator=.
-currenciesDisplayName.ESP=ESP
currenciesSymbol.ESP=\u20a7
shortMonths=urt®ots®mar®api®mai®eka®uzt®abu®ira®urr®aza®abe®®
months=urtarrila®otsaila®martxoa®apirila®maiatza®ekaina®uztaila®abuztua®iraila®urria®azaroa®abendua®®
@@ -32,7 +31,6 @@ territories.AF=Afganistan
territories.ST=Sao Tom\u00e9 eta Principe
territories.AE=Arabiar Emirrerri Batuak
territories.SR=Surinam
-territories.YU=Serbia eta Montenegro
territories.MK=Mazedonia
territories.MH=Marshall uharteak
territories.SL=Sierra Leona
@@ -63,11 +61,11 @@ territories.ES=Espainia
territories.KR=Hego Korea
territories.KP=Ipar Korea
territories.KN=Saint Kitts eta Nevis
-territories.KM=Komoreak
territories.EH=Mendebaldeko Sahara
+territories.KM=Komoreak
territories.EG=Egipto
-territories.KH=Kanbodia
territories.EC=Ekuador
+territories.KH=Kanbodia
territories.KG=Kirgizistan
territories.KE=Kenia
territories.DZ=Aljeria
@@ -75,10 +73,10 @@ territories.QA=Katar
territories.PY=Paraguai
territories.DO=Dominikar Errepublika
territories.DM=Dominika
-territories.JP=Japonia
territories.DK=Danimarka
-territories.JO=Jordania
+territories.JP=Japonia
territories.DJ=Djibuti
+territories.JO=Jordania
territories.JM=Jamaika
territories.DE=Alemania
territories.PL=Polonia
@@ -89,14 +87,15 @@ territories.CY=Zipre
territories.CV=Cabo Verde
territories.CU=Kuba
territories.VC=Saint Vincent eta Grenadinak
+territories.CS=Serbia eta Montenegro
territories.VA=Vatikano
-territories.IT=Italia
territories.CO=Kolonbia
-territories.IS=Islandia
+territories.IT=Italia
territories.CN=Txina
+territories.IS=Islandia
territories.CM=Kamerun
-territories.IQ=Irak
territories.CL=Txile
+territories.IQ=Irak
territories.UY=Uruguai
territories.CI=Boli Kosta
territories.CH=Suitza
diff --git a/resource/gnu/java/locale/LocaleInformation_fa.properties b/resource/gnu/java/locale/LocaleInformation_fa.properties
index caae448bd..a8a5e3661 100644
--- a/resource/gnu/java/locale/LocaleInformation_fa.properties
+++ b/resource/gnu/java/locale/LocaleInformation_fa.properties
@@ -5,23 +5,77 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesDisplayName.AFA=\u0627\u0641\u063a\u0627\u0646\u06cc
-currenciesDisplayName.IRR=IRR
+percent=\u066a
+exponential=\u00d7\u06f1\u06f0^
+minusSign=\u2212
+zeroDigit=\u06f0
+decimalSeparator=\u066b
+groupingSeparator=\u066c
+percentFormat='\u202a'%#,##0'\u202c'
+currencyFormat=#,##0.00 \u00a4;'\u202a'-#,##0.00'\u202c' \u00a4
+currenciesDisplayName.CHF=\u0641\u0631\u0627\u0646\u06a9 \u0633\u0648\u0626\u06cc\u0633
+currenciesDisplayName.AUD=\u062f\u0644\u0627\u0631 \u0627\u0633\u062a\u0631\u0627\u0644\u06cc\u0627
+currenciesDisplayName.RUB=\u0631\u0648\u0628\u0644 \u0631\u0648\u0633\u06cc\u0647
+currenciesDisplayName.SEK=\u06a9\u0631\u0648\u0646 \u0633\u0648\u0626\u062f
+currenciesDisplayName.TND=\u062f\u06cc\u0646\u0627\u0631 \u062a\u0648\u0646\u0633
+currenciesDisplayName.BHD=\u062f\u06cc\u0646\u0627\u0631 \u0628\u062d\u0631\u06cc\u0646
+currenciesDisplayName.ATS=\u0634\u06cc\u0644\u06cc\u0646\u06af \u0627\u062a\u0631\u06cc\u0634
+currenciesDisplayName.BND=\u062f\u0644\u0627\u0631 \u0628\u0631\u0648\u0646\u0626\u06cc
+currenciesDisplayName.HUF=\u0641\u0648\u0631\u06cc\u0646\u062a \u0645\u062c\u0627\u0631\u0633\u062a\u0627\u0646
+currenciesDisplayName.KWD=\u062f\u06cc\u0646\u0627\u0631 \u06a9\u0648\u06cc\u062a
+currenciesDisplayName.INR=\u0631\u0648\u067e\u06cc\u0647\u0654 \u0647\u0646\u062f
+currenciesDisplayName.AED=\u062f\u0631\u0647\u0645 \u0627\u0645\u0627\u0631\u0627\u062a
+currenciesDisplayName.TJS=\u0633\u0627\u0645\u0627\u0646\u06cc \u062a\u0627\u062c\u06cc\u06a9\u0633\u062a\u0627\u0646
+currenciesDisplayName.TJR=\u0631\u0648\u0628\u0644 \u062a\u0627\u062c\u06cc\u06a9\u0633\u062a\u0627\u0646
+currenciesDisplayName.AZM=\u0645\u0646\u0627\u062a \u062c\u0645\u0647\u0648\u0631\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646
+currenciesDisplayName.YER=\u0631\u06cc\u0627\u0644 \u06cc\u0645\u0646
+currenciesDisplayName.CAD=\u062f\u0644\u0627\u0631 \u06a9\u0627\u0646\u0627\u062f\u0627
+currenciesDisplayName.SAR=\u0631\u06cc\u0627\u0644 \u0633\u0639\u0648\u062f\u06cc
+currenciesDisplayName.USD=\u062f\u0644\u0627\u0631 \u0627\u0645\u0631\u06cc\u06a9\u0627
+currenciesDisplayName.JPY=\u06cc\u0646 \u0698\u0627\u067e\u0646
+currenciesDisplayName.IQD=\u062f\u06cc\u0646\u0627\u0631 \u0639\u0631\u0627\u0642
+currenciesDisplayName.NOK=\u06a9\u0631\u0648\u0646 \u0646\u0631\u0648\u0698
+currenciesDisplayName.FRF=\u0641\u0631\u0627\u0646\u06a9 \u0641\u0631\u0627\u0646\u0633\u0647
+currenciesDisplayName.GBP=\u067e\u0648\u0646\u062f \u0627\u0633\u062a\u0631\u0644\u06cc\u0646\u06af \u0628\u0631\u06cc\u062a\u0627\u0646\u06cc\u0627
+currenciesDisplayName.PKR=\u0631\u0648\u067e\u06cc\u0647\u0654 \u067e\u0627\u06a9\u0633\u062a\u0627\u0646
+currenciesDisplayName.EUR=\u06cc\u0648\u0631\u0648
+currenciesDisplayName.NLG=\u06af\u06cc\u0644\u062f\u0631 \u0647\u0644\u0646\u062f
+currenciesDisplayName.BYR=\u0631\u0648\u0628\u0644 \u0628\u06cc\u0644\u0648\u0631\u0648\u0633\u06cc
+currenciesDisplayName.SGD=\u062f\u0644\u0627\u0631 \u0633\u0646\u06af\u0627\u067e\u0648\u0631
+currenciesDisplayName.MXN=\u067e\u0632\u0648\u06cc \u0645\u06a9\u0632\u06cc\u06a9
+currenciesDisplayName.QAR=\u0631\u06cc\u0627\u0644 \u0642\u0637\u0631
+currenciesDisplayName.TRY=\u0644\u06cc\u0631\u0647\u0654 \u062c\u062f\u06cc\u062f \u062a\u0631\u06a9\u06cc\u0647
+currenciesDisplayName.XAU=\u0637\u0644\u0627
+currenciesDisplayName.TRL=\u0644\u06cc\u0631\u0647\u0654 \u062a\u0631\u06a9\u06cc\u0647
+currenciesDisplayName.DEM=\u0645\u0627\u0631\u06a9 \u0622\u0644\u0645\u0627\u0646
+currenciesDisplayName.BIF=\u0641\u0631\u0627\u0646\u06a9 \u0628\u0648\u0631\u0648\u0646\u062f\u06cc
+currenciesDisplayName.AFN=\u0627\u0641\u063a\u0627\u0646\u06cc
+currenciesDisplayName.XPT=\u067e\u0644\u0627\u062a\u06cc\u0646
+currenciesDisplayName.XAG=\u0646\u0642\u0631\u0647
+currenciesDisplayName.OMR=\u0631\u06cc\u0627\u0644 \u0639\u0645\u0627\u0646
+currenciesDisplayName.DKK=\u06a9\u0631\u0648\u0646 \u062f\u0627\u0646\u0645\u0627\u0631\u06a9
+currenciesDisplayName.IRR=\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646
+currenciesDisplayName.JOD=\u062f\u06cc\u0646\u0627\u0631 \u0627\u0631\u062f\u0646
+currenciesDisplayName.AFA=\u0627\u0641\u063a\u0627\u0646\u06cc \u0642\u062f\u06cc\u0645
+currenciesDisplayName.XPD=\u067e\u0627\u0644\u0627\u062f\u06cc\u0645
currenciesSymbol.AFA=\u0627\u0641\u063a\u0627\u0646\u06cc
currenciesSymbol.IRR=\ufdfc
-shortMonths=\u0698\u0627\u0646®\u0641\u0648\u0631®\u0645\u0627\u0631®\u0622\u0648\u0631®\u0645\u0640\u0647®\u0698\u0648\u0646®\u0698\u0648\u06cc®\u0627\u0648\u062a®\u0633\u067e\u062a®\u0627\u06a9\u062a®\u0646\u0648\u0627®\u062f\u0633\u0627®®
+currenciesSymbol.AFN=\u0627\u0641\u063a\u0627\u0646\u06cc
+shortMonths=®®®®®®®®®®®®®
months=\u0698\u0627\u0646\u0648\u06cc\u0647®\u0641\u0648\u0631\u06cc\u0647®\u0645\u0627\u0631\u0633®\u0622\u0648\u0631\u06cc\u0644®\u0645\u0647®\u0698\u0648\u0626\u0646®\u0698\u0648\u0626\u06cc\u0647®\u0627\u0648\u062a®\u0633\u067e\u062a\u0627\u0645\u0628\u0631®\u0627\u06a9\u062a\u0628\u0631®\u0646\u0648\u0627\u0645\u0628\u0631®\u062f\u0633\u0627\u0645\u0628\u0631®®
-shortWeekdays=®\u06cc.®\u062f.®\u0633.®\u0686.®\u067e.®\u062c.®\u0634.®
-weekdays=®\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647®\u062f\u0648\u0634\u0646\u0628\u0647®\u0633\u0647\u200c\u0634\u0646\u0628\u0647®\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647®\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647®\u062c\u0645\u0639\u0647®\u0634\u0646\u0628\u0647®
+shortWeekdays=®®®®®®®®
+weekdays=®\u06cc\u06a9\u0634\u0646\u0628\u0647®\u062f\u0648\u0634\u0646\u0628\u0647®\u0633\u0647\u200c\u0634\u0646\u0628\u0647®\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647®\u067e\u0646\u062c\u0634\u0646\u0628\u0647®\u062c\u0645\u0639\u0647®\u0634\u0646\u0628\u0647®
eras=\u0642.\u0645.®\u0645.®
-ampms=\u0642.\u0638.®\u0628.\u0638.®
-shortDateFormat=yyyy/MM/d
-mediumDateFormat=yyyy/MM/d
+ampms=\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631®\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631®
+shortDateFormat=yy/M/d G
+mediumDateFormat=yyyy/M/d
longDateFormat=d MMMM yyyy
-fullDateFormat=EEEE\u060c d MMMM yyyy
-longTimeFormat=HH:mm:ss (z)
-fullTimeFormat=HH:mm:ss (z)
-zoneStrings=Asia/Tehran®IRST®\u0648\u0642\u062a \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u062a\u0647\u0631\u0627\u0646®IRDT®\u0648\u0642\u062a \u062a\u0627\u0628\u0633\u062a\u0627\u0646\u06cc \u062a\u0647\u0631\u0627\u0646®©
+fullDateFormat=EEEE d MMMM yyyy G
+shortTimeFormat=H:mm
+mediumTimeFormat=H:mm:ss
+longTimeFormat=H:mm:ss (zz)
+fullTimeFormat=H:mm:ss (zzzz)
+zoneStrings=Asia/Tehran®IRST®\u0648\u0642\u062a \u0639\u0627\u062f\u06cc \u0627\u06cc\u0631\u0627\u0646®IRDT®\u0648\u0642\u062a \u062a\u0627\u0628\u0633\u062a\u0627\u0646\u06cc \u0627\u06cc\u0631\u0627\u0646®©
territories.TL=\u062a\u06cc\u0645\u0648\u0631 \u0634\u0631\u0642\u06cc
territories.TK=\u062a\u0648\u06a9\u0644\u0627\u0626\u0648
territories.TJ=\u062a\u0627\u062c\u06cc\u06a9\u0633\u062a\u0627\u0646
@@ -31,12 +85,12 @@ territories.TF=\u0645\u0633\u062a\u0639\u0645\u0631\u0647\u200c\u0647\u0627\u06c
territories.GY=\u06af\u0648\u06cc\u0627\u0646
territories.TD=\u0686\u0627\u062f
territories.TC=\u062c\u0632\u0627\u06cc\u0631 \u062a\u0631\u06a9 \u0648 \u06a9\u0627\u06cc\u06a9\u0648\u0633
-territories.GW=\u06af\u06cc\u0646\u0647\u200c\u06cc \u0628\u06cc\u0633\u0627\u0626\u0648
+territories.GW=\u06af\u06cc\u0646\u0647\u0654 \u0628\u06cc\u0633\u0627\u0626\u0648
territories.GU=\u06af\u0648\u0627\u0645
territories.GT=\u06af\u0648\u0627\u062a\u0645\u0627\u0644\u0627
territories.GS=\u062c\u0648\u0631\u062c\u06cc\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc \u0648 \u062c\u0632\u0627\u06cc\u0631 \u0633\u0627\u0646\u062f\u0648\u06cc\u0686 \u062c\u0646\u0648\u0628\u06cc
territories.GR=\u06cc\u0648\u0646\u0627\u0646
-territories.GQ=\u06af\u06cc\u0646\u0647\u200c\u06cc \u0627\u0633\u062a\u0648\u0627\u06cc\u06cc
+territories.GQ=\u06af\u06cc\u0646\u0647\u0654 \u0627\u0633\u062a\u0648\u0627\u06cc\u06cc
territories.GP=\u06af\u0648\u0627\u062f\u0644\u0648\u067e
territories.SZ=\u0633\u0648\u0627\u0632\u06cc\u0644\u0646\u062f
territories.SY=\u0633\u0648\u0631\u06cc\u0647
@@ -44,6 +98,7 @@ territories.GN=\u06af\u06cc\u0646\u0647
territories.GM=\u06af\u0627\u0645\u0628\u06cc\u0627
territories.GL=\u06af\u0631\u0648\u0626\u0646\u0644\u0646\u062f
territories.SV=\u0627\u0644\u0633\u0627\u0644\u0648\u0627\u062f\u0648\u0631
+territories.SU=\u0627\u062a\u062d\u0627\u062f \u062c\u0645\u0627\u0647\u06cc\u0631 \u0633\u0648\u0633\u06cc\u0627\u0644\u06cc\u0633\u062a\u06cc \u0634\u0648\u0631\u0648\u06cc
territories.ST=\u0633\u0627\u0626\u0648 \u062a\u0648\u0645\u0647 \u0648 \u067e\u0631\u06cc\u0646\u0633\u06cc\u067e\u0647
territories.GI=\u06af\u06cc\u0628\u0631\u0627\u0644\u062a\u0627\u0631
territories.GH=\u063a\u0646\u0627
@@ -54,7 +109,7 @@ territories.SO=\u0633\u0648\u0645\u0627\u0644\u06cc
territories.GD=\u06af\u0631\u0627\u0646\u0627\u062f\u0627
territories.SN=\u0633\u0646\u06af\u0627\u0644
territories.SM=\u0633\u0627\u0646 \u0645\u0627\u0631\u06cc\u0646\u0648
-territories.GB=\u0627\u0646\u06af\u0644\u0633\u062a\u0627\u0646
+territories.GB=\u0628\u0631\u06cc\u062a\u0627\u0646\u06cc\u0627
territories.SL=\u0633\u06cc\u0631\u0627\u0644\u0626\u0648\u0646
territories.GA=\u06af\u0627\u0628\u0648\u0646
territories.SK=\u0627\u0633\u0644\u0648\u0627\u06a9\u06cc
@@ -71,6 +126,7 @@ territories.FR=\u0641\u0631\u0627\u0646\u0633\u0647
territories.FO=\u062c\u0632\u0627\u06cc\u0631 \u0641\u0627\u0631\u0648
territories.FM=\u0645\u06cc\u06a9\u0631\u0648\u0646\u0632\u06cc
territories.RW=\u0631\u0648\u0627\u0646\u062f\u0627
+territories.053=\u0627\u0633\u062a\u0631\u0627\u0644\u06cc\u0627 \u0648 \u0632\u0644\u0627\u0646\u062f \u0646\u0648
territories.FK=\u062c\u0632\u0627\u06cc\u0631 \u0641\u0627\u0644\u06a9\u0644\u0646\u062f
territories.RU=\u0631\u0648\u0633\u06cc\u0647
territories.FJ=\u0641\u06cc\u062c\u06cc
@@ -86,13 +142,16 @@ territories.EE=\u0627\u0633\u062a\u0648\u0646\u06cc
territories.EC=\u0627\u06a9\u0648\u0627\u062f\u0631
territories.DZ=\u0627\u0644\u062c\u0632\u0627\u06cc\u0631
territories.QA=\u0642\u0637\u0631
+territories.039=\u062c\u0646\u0648\u0628 \u0627\u0631\u0648\u067e\u0627
territories.DO=\u062c\u0645\u0647\u0648\u0631\u06cc \u062f\u0648\u0645\u06cc\u0646\u06cc\u06a9\u0646
territories.PY=\u067e\u0627\u0631\u0627\u06af\u0648\u0626\u0647
+territories.035=\u062c\u0646\u0648\u0628 \u0634\u0631\u0642\u06cc \u0622\u0633\u06cc\u0627
territories.DM=\u062f\u0648\u0645\u06cc\u0646\u06cc\u06a9\u0627
territories.PW=\u067e\u0627\u0644\u0627\u0626\u0648
territories.DK=\u062f\u0627\u0646\u0645\u0627\u0631\u06a9
territories.DJ=\u062c\u06cc\u0628\u0648\u062a\u06cc
territories.PT=\u067e\u0631\u062a\u063a\u0627\u0644
+territories.030=\u0634\u0631\u0642 \u0622\u0633\u06cc\u0627
territories.PR=\u067e\u0648\u0631\u062a\u0648 \u0631\u06cc\u06a9\u0648
territories.DE=\u0622\u0644\u0645\u0627\u0646
territories.PN=\u067e\u06cc\u062a\u06a9\u0627\u06cc\u0631\u0646
@@ -100,22 +159,25 @@ territories.PM=\u0633\u0646\u062a \u067e\u06cc\u0631 \u0648 \u0645\u06cc\u06a9\u
territories.PL=\u0644\u0647\u0633\u062a\u0627\u0646
territories.PK=\u067e\u0627\u06a9\u0633\u062a\u0627\u0646
territories.PH=\u0641\u06cc\u0644\u06cc\u067e\u06cc\u0646
-territories.PG=\u067e\u0627\u067e\u0648\u0627 \u06af\u06cc\u0646\u0647\u200c\u06cc \u0646\u0648
+territories.PG=\u067e\u0627\u067e\u0648\u0627 \u06af\u06cc\u0646\u0647\u0654 \u0646\u0648
territories.PF=\u067e\u0644\u06cc\u200c\u0646\u0632\u06cc \u0641\u0631\u0627\u0646\u0633\u0647
territories.CZ=\u062c\u0645\u0647\u0648\u0631\u06cc \u0686\u06a9
territories.PE=\u067e\u0631\u0648
territories.CY=\u0642\u0628\u0631\u0633
-territories.CX=\u062c\u0632\u06cc\u0631\u0647\u200c\u06cc \u06a9\u0631\u06cc\u0633\u0645\u0633
+territories.CX=\u062c\u0632\u06cc\u0631\u0647\u0654 \u06a9\u0631\u06cc\u0633\u0645\u0633
territories.CV=\u06a9\u06cc\u067e \u0648\u0631\u062f
territories.PA=\u067e\u0627\u0646\u0627\u0645\u0627
territories.CU=\u06a9\u0648\u0628\u0627
+territories.CS=\u0635\u0631\u0628\u0633\u062a\u0627\u0646
territories.CR=\u06a9\u0627\u0633\u062a\u0627\u0631\u06cc\u06a9\u0627
+territories.029=\u06a9\u0627\u0631\u0627\u0626\u06cc\u0628
territories.CO=\u06a9\u0644\u0645\u0628\u06cc\u0627
territories.CN=\u0686\u06cc\u0646
territories.CM=\u06a9\u0627\u0645\u0631\u0648\u0646
territories.CL=\u0634\u06cc\u0644\u06cc
territories.CK=\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0648\u06a9
territories.CI=\u0633\u0627\u062d\u0644 \u0639\u0627\u062c
+territories.021=\u0634\u0645\u0627\u0644 \u0627\u0645\u0631\u06cc\u06a9\u0627
territories.CH=\u0633\u0648\u0626\u06cc\u0633
territories.CG=\u06a9\u0648\u0646\u06af\u0648
territories.CF=\u062c\u0645\u0647\u0648\u0631\u06cc \u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u0645\u0631\u06a9\u0632\u06cc
@@ -123,20 +185,28 @@ territories.CD=\u062c\u0645\u0647\u0648\u0631\u06cc \u062f\u0645\u0648\u06a9\u06
territories.CC=\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0648\u06a9\u0648\u0633
territories.OM=\u0639\u0645\u0627\u0646
territories.CA=\u06a9\u0627\u0646\u0627\u062f\u0627
+territories.419=\u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u0644\u0627\u062a\u06cc\u0646 \u0648 \u06a9\u0627\u0631\u0627\u0626\u06cc\u0628
territories.BZ=\u0628\u0644\u06cc\u0632
territories.BY=\u0628\u06cc\u0644\u0648\u0631\u0648\u0633\u06cc
territories.BW=\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627
-territories.BV=\u062c\u0632\u06cc\u0631\u0647\u200c\u06cc \u0628\u0648\u0648\u062a
+territories.BV=\u062c\u0632\u06cc\u0631\u0647\u0654 \u0628\u0648\u0648\u062a
territories.BT=\u0628\u0648\u062a\u0627\u0646
territories.BS=\u0628\u0627\u0647\u0627\u0645\u0627
territories.BR=\u0628\u0631\u0632\u06cc\u0644
+territories.019=\u0627\u0645\u0631\u06cc\u06a9\u0627
+territories.018=\u062c\u0646\u0648\u0628 \u0627\u0641\u0631\u06cc\u0642\u0627
territories.NZ=\u0632\u0644\u0627\u0646\u062f \u0646\u0648
territories.BO=\u0628\u0648\u0644\u06cc\u0648\u06cc
+territories.017=\u0645\u0631\u06a9\u0632 \u0627\u0641\u0631\u06cc\u0642\u0627
territories.BN=\u0628\u0631\u0648\u0646\u0626\u06cc
territories.BM=\u0628\u0631\u0645\u0648\u062f\u0627
+territories.015=\u0634\u0645\u0627\u0644 \u0627\u0641\u0631\u06cc\u0642\u0627
+territories.014=\u0634\u0631\u0642 \u0627\u0641\u0631\u06cc\u0642\u0627
+territories.013=\u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u0645\u0631\u06a9\u0632\u06cc
territories.NU=\u0646\u06cc\u0648\u0626\u0647
territories.BJ=\u0628\u0646\u06cc\u0646
territories.BI=\u0628\u0648\u0631\u0648\u0646\u062f\u06cc
+territories.011=\u063a\u0631\u0628 \u0627\u0641\u0631\u06cc\u0642\u0627
territories.BH=\u0628\u062d\u0631\u06cc\u0646
territories.NR=\u0646\u0627\u0626\u0648\u0631\u0648
territories.BG=\u0628\u0644\u063a\u0627\u0631\u0633\u062a\u0627\u0646
@@ -151,8 +221,8 @@ territories.NL=\u0647\u0644\u0646\u062f
territories.BA=\u0628\u0648\u0633\u0646\u06cc \u0648 \u0647\u0631\u0632\u06af\u0648\u06cc\u0646
territories.NI=\u0646\u06cc\u06a9\u0627\u0631\u0627\u06af\u0648\u0626\u0647
territories.NG=\u0646\u06cc\u062c\u0631\u06cc\u0647
-territories.NF=\u062c\u0632\u06cc\u0631\u0647\u200c\u06cc \u0646\u0648\u0631\u0641\u0648\u0644\u06a9
-territories.AZ=\u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646
+territories.NF=\u062c\u0632\u06cc\u0631\u0647\u0654 \u0646\u0648\u0631\u0641\u0648\u0644\u06a9
+territories.AZ=\u062c\u0645\u0647\u0648\u0631\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646
territories.NE=\u0646\u06cc\u062c\u0631
territories.NC=\u06a9\u0627\u0644\u062f\u0648\u0646\u06cc\u0627\u06cc \u062c\u062f\u06cc\u062f
territories.AW=\u0622\u0631\u0648\u0628\u0627
@@ -162,19 +232,24 @@ territories.AU=\u0627\u0633\u062a\u0631\u0627\u0644\u06cc\u0627
territories.AT=\u0627\u062a\u0631\u06cc\u0634
territories.AS=\u0633\u0627\u0645\u0648\u0627\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627
territories.AR=\u0622\u0631\u0698\u0627\u0646\u062a\u06cc\u0646
+territories.009=\u0627\u0642\u06cc\u0627\u0646\u0648\u0633\u06cc\u0647
territories.AQ=\u062c\u0646\u0648\u0628\u06af\u0627\u0646
territories.MZ=\u0645\u0648\u0632\u0627\u0645\u0628\u06cc\u06a9
territories.AO=\u0622\u0646\u06af\u0648\u0644\u0627
territories.MY=\u0645\u0627\u0644\u0632\u06cc
territories.AN=\u0622\u0646\u062a\u06cc\u0644 \u0647\u0644\u0646\u062f
territories.MX=\u0645\u06a9\u0632\u06cc\u06a9
+territories.005=\u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc
territories.AM=\u0627\u0631\u0645\u0646\u0633\u062a\u0627\u0646
territories.MW=\u0645\u0627\u0644\u0627\u0648\u06cc
territories.AL=\u0622\u0644\u0628\u0627\u0646\u06cc
territories.MV=\u0645\u0627\u0644\u062f\u06cc\u0648
+territories.003=\u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc
territories.ZA=\u0627\u0641\u0631\u06cc\u0642\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc
territories.MU=\u0645\u0648\u0631\u06cc\u062a\u06cc\u0648\u0633
+territories.002=\u0627\u0641\u0631\u06cc\u0642\u0627
territories.MT=\u0645\u0627\u0644\u062a
+territories.001=\u062c\u0647\u0627\u0646
territories.AI=\u0622\u0646\u06af\u06cc\u0644
territories.MS=\u0645\u0648\u0646\u062a\u200c\u0633\u0631\u0627\u062a
territories.MR=\u0645\u0648\u0631\u06cc\u062a\u0627\u0646\u06cc
@@ -182,14 +257,13 @@ territories.AG=\u0622\u0646\u062a\u06cc\u06af\u0648\u0627 \u0648 \u0628\u0627\u0
territories.MQ=\u0645\u0627\u0631\u062a\u06cc\u0646\u06cc\u06a9
territories.AF=\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646
territories.MP=\u062c\u0632\u0627\u06cc\u0631 \u0645\u0627\u0631\u06cc\u0627\u0646\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc
-territories.AE=\u0627\u0645\u0627\u0631\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u200c\u06cc \u0639\u0631\u0628\u06cc
-territories.MO=\u0645\u0627\u06a9\u0627\u0626\u0648
+territories.AE=\u0627\u0645\u0627\u0631\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u0654 \u0639\u0631\u0628\u06cc
+territories.MO=\u0645\u0627\u06a9\u0627\u0626\u0648\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646
territories.AD=\u0622\u0646\u062f\u0648\u0631\u0627
territories.MN=\u0645\u063a\u0648\u0644\u0633\u062a\u0627\u0646
territories.MM=\u0645\u06cc\u0627\u0646\u0645\u0627\u0631
territories.ML=\u0645\u0627\u0644\u06cc
territories.MK=\u0645\u0642\u062f\u0648\u0646\u06cc\u0647
-territories.YU=\u06cc\u0648\u06af\u0633\u0644\u0627\u0648\u06cc
territories.YT=\u0645\u0627\u06cc\u0648\u062a
territories.MH=\u062c\u0632\u0627\u06cc\u0631 \u0645\u0627\u0631\u0634\u0627\u0644
territories.MG=\u0645\u0627\u062f\u0627\u06af\u0627\u0633\u06a9\u0627\u0631
@@ -199,10 +273,14 @@ territories.MA=\u0645\u0631\u0627\u06a9\u0634
territories.YE=\u06cc\u0645\u0646
territories.LY=\u0644\u06cc\u0628\u06cc
territories.LV=\u0644\u062a\u0648\u0646\u06cc
+territories.155=\u063a\u0631\u0628 \u0627\u0631\u0648\u067e\u0627
territories.LU=\u0644\u0648\u06a9\u0632\u0627\u0645\u0628\u0648\u0631\u06af
+territories.154=\u0634\u0645\u0627\u0644 \u0627\u0631\u0648\u067e\u0627
territories.LT=\u0644\u06cc\u062a\u0648\u0627\u0646\u06cc
territories.LS=\u0644\u0633\u0648\u062a\u0648
territories.LR=\u0644\u06cc\u0628\u0631\u06cc\u0627
+territories.151=\u0634\u0631\u0642 \u0627\u0631\u0648\u067e\u0627
+territories.150=\u0627\u0631\u0648\u067e\u0627
territories.LK=\u0633\u0631\u06cc\u200c\u0644\u0627\u0646\u06a9\u0627
territories.LI=\u0644\u06cc\u062e\u062a\u0646\u200c\u0627\u0634\u062a\u0627\u06cc\u0646
territories.LC=\u0633\u0646\u062a \u0644\u0648\u0633\u06cc\u0627
@@ -211,8 +289,10 @@ territories.LA=\u0644\u0627\u0626\u0648\u0633
territories.KZ=\u0642\u0632\u0627\u0642\u0633\u062a\u0627\u0646
territories.KY=\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0650\u06cc\u0645\u0646
territories.KW=\u06a9\u0648\u06cc\u062a
-territories.KR=\u06a9\u0631\u0647\u200c\u06cc \u062c\u0646\u0648\u0628\u06cc
-territories.KP=\u06a9\u0631\u0647\u200c\u06cc \u0634\u0645\u0627\u0644\u06cc
+territories.145=\u063a\u0631\u0628 \u0622\u0633\u06cc\u0627
+territories.142=\u0622\u0633\u06cc\u0627
+territories.KR=\u06a9\u0631\u0647\u0654 \u062c\u0646\u0648\u0628\u06cc
+territories.KP=\u06a9\u0631\u0647\u0654 \u0634\u0645\u0627\u0644\u06cc
territories.KN=\u0633\u0646\u062a \u06a9\u06cc\u062a\u0633 \u0648 \u0646\u0648\u06cc\u0633
territories.KM=\u06a9\u0648\u0645\u0648\u0631\u0648
territories.KI=\u06a9\u06cc\u0631\u06cc\u0628\u0627\u062a\u06cc
@@ -240,10 +320,10 @@ territories.IO=\u0645\u0633\u062a\u0639\u0645\u0631\u0647\u200c\u0647\u0627\u06c
territories.UY=\u0627\u0648\u0631\u0648\u06af\u0648\u0626\u0647
territories.IN=\u0647\u0646\u062f
territories.IL=\u0627\u0633\u0631\u0627\u0626\u06cc\u0644
-territories.US=\u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u200c\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627
+territories.US=\u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u0654 \u0627\u0645\u0631\u06cc\u06a9\u0627
territories.IE=\u0627\u06cc\u0631\u0644\u0646\u062f
territories.ID=\u0627\u0646\u062f\u0648\u0646\u0632\u06cc
-territories.UM=\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u062f\u0648\u0631\u0627\u0641\u062a\u0627\u062f\u0647\u200c\u06cc \u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647
+territories.UM=\u062c\u0632\u0627\u06cc\u0631 \u06a9\u0648\u0686\u06a9 \u062f\u0648\u0631\u0627\u0641\u062a\u0627\u062f\u0647\u0654 \u0627\u06cc\u0627\u0644\u0627\u062a \u0645\u062a\u062d\u062f\u0647
territories.UG=\u0627\u0648\u06af\u0627\u0646\u062f\u0627
territories.UA=\u0627\u0648\u06a9\u0631\u0627\u06cc\u0646
territories.HU=\u0645\u062c\u0627\u0631\u0633\u062a\u0627\u0646
@@ -251,216 +331,411 @@ territories.HT=\u0647\u0627\u06cc\u06cc\u062a\u06cc
territories.HR=\u06a9\u0631\u0648\u0627\u0633\u06cc
territories.TZ=\u062a\u0627\u0646\u0632\u0627\u0646\u06cc\u0627
territories.HN=\u0647\u0646\u062f\u0648\u0631\u0627\u0633
-territories.HM=\u062c\u0632\u06cc\u0631\u0647\u200c\u06cc \u0647\u0631\u062f \u0648 \u062c\u0632\u0627\u06cc\u0631 \u0645\u06a9\u200c\u062f\u0648\u0646\u0627\u0644\u062f
+territories.HM=\u062c\u0632\u06cc\u0631\u0647\u0654 \u0647\u0631\u062f \u0648 \u062c\u0632\u0627\u06cc\u0631 \u0645\u06a9\u200c\u062f\u0648\u0646\u0627\u0644\u062f
territories.TW=\u062a\u0627\u06cc\u0648\u0627\u0646
territories.TV=\u062a\u0648\u0648\u0627\u0644\u0648
-territories.HK=\u0647\u0646\u06af\u200c\u06a9\u0646\u06af
+territories.HK=\u0647\u0646\u06af\u200c\u06a9\u0646\u06af\u060c \u0646\u0627\u062d\u06cc\u0647\u0654 \u0648\u06cc\u0698\u0647\u0654 \u062d\u06a9\u0648\u0645\u062a\u06cc \u0686\u06cc\u0646
territories.TT=\u062a\u0631\u06cc\u0646\u06cc\u062f\u0627\u062f \u0648 \u062a\u0648\u0628\u0627\u06af\u0648
territories.TR=\u062a\u0631\u06a9\u06cc\u0647
territories.TO=\u062a\u0648\u0646\u06af\u0627
territories.TN=\u062a\u0648\u0646\u0633
territories.TM=\u062a\u0631\u06a9\u0645\u0646\u0633\u062a\u0627\u0646
-languages.lb=\u0644\u062a\u0633\u0647\u200c\u0628\u0648\u0631\u06af\u06cc\u0634
-languages.la=\u0644\u0627\u062a\u06cc\u0646\u06cc
+languages.akk=\u0622\u06a9\u062f\u06cc
+languages.ijo=\u0627\u06cc\u062c\u0648\u06cc\u06cc
languages.xh=\u062e\u0648\u0633\u0627\u06cc\u06cc
-languages.ky=\u0642\u0631\u0642\u06cc\u0632\u06cc
-languages.kw=\u06a9\u0631\u0646\u0648\u0627\u0644\u06cc
-languages.kv=\u06a9\u0648\u0645\u06cc\u0627\u06cc\u06cc
-languages.ku=\u06a9\u0631\u062f\u06cc
-languages.ks=\u06a9\u0634\u0645\u06cc\u0631\u06cc
-languages.ko=\u06a9\u0631\u0647\u200c\u0627\u06cc
-languages.kn=\u06a9\u0627\u0646\u0627\u062f\u0647\u200c\u0627\u06cc
-languages.km=\u062e\u0645\u0631\u06cc
-languages.kk=\u0642\u0632\u0627\u0642\u06cc
-languages.ira=\u0627\u06cc\u0631\u0627\u0646\u06cc
-languages.grc=\u06cc\u0648\u0646\u0627\u0646\u06cc \u06a9\u0647\u0646 (\u062a\u0627 \u06f1\u06f4\u06f5\u06f3 \u0645.)
+languages.sux=\u0633\u0648\u0645\u0631\u06cc
+languages.sus=\u0633\u0648\u0633\u0648\u06cc\u06cc
+languages.mis=\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0645\u062a\u0641\u0631\u0642\u0647
+languages.loz=\u0644\u0648\u0632\u06cc\u0627\u06cc\u06cc
+languages.tog=\u062a\u0648\u0646\u06af\u0627\u06cc\u06cc (\u0646\u06cc\u0627\u0633\u0627)
+languages.min=\u0645\u06cc\u0646\u0627\u0646\u06af\u200c\u06a9\u0627\u0628\u0648\u06cc\u06cc
+languages.suk=\u0633\u0648\u06a9\u0648\u0645\u0627\u06cc\u06cc
languages.wo=\u0648\u0644\u0648\u0641\u06cc
-languages.art=\u0633\u0627\u062e\u062a\u0647\u200c\u06af\u06cc (\u063a\u06cc\u0631\u0647)
-languages.ka=\u06af\u0631\u062c\u06cc
-languages.gem=\u0698\u0631\u0645\u0646\u06cc (\u063a\u06cc\u0631\u0647)
-languages.afa=\u0627\u0641\u0631\u06cc\u0642\u0627 \u0648 \u0622\u0633\u06cc\u0627\u06cc\u06cc (\u063a\u06cc\u0631\u0647)
-languages.jv=\u062c\u0627\u0648\u0647\u200c\u0627\u06cc
-languages.arc=\u0622\u0631\u0627\u0645\u06cc
-languages.cel=\u0633\u0644\u062a\u06cc (\u063a\u06cc\u0631\u0647)
-languages.sco=\u0627\u0633\u06a9\u0627\u062a\u0644\u0646\u062f\u06cc
+languages.lol=\u0645\u0648\u0646\u06af\u0648\u06cc\u06cc
+languages.mic=\u0645\u06cc\u06a9\u0645\u0627\u06a9\u06cc
+languages.wa=\u0648\u0627\u0644\u0648\u0646\u06cc
+languages.kum=\u06a9\u0648\u0645\u06cc\u06a9\u06cc
+languages.zap=\u0632\u0627\u067e\u0648\u062a\u06a9\u06cc
+languages.cus=\u06a9\u0648\u0634\u06cc (\u062f\u06cc\u06af\u0631)
languages.vo=\u0648\u0644\u0627\u067e\u0648\u06a9
-languages.ja=\u0698\u0627\u067e\u0646\u06cc
+languages.oto=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0627\u062a\u0648\u0645\u06cc\u0627\u06cc\u06cc
languages.vi=\u0648\u06cc\u062a\u0646\u0627\u0645\u06cc
-languages.iu=\u0627\u06cc\u0646\u0648\u06a9\u06cc\u062a\u0648\u062a
-languages.it=\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627\u06cc\u06cc
-languages.is=\u0627\u06cc\u0633\u0644\u0646\u062f\u06cc
+languages.vai=\u0648\u06cc\u0627\u06cc\u06cc
+languages.rar=\u0631\u0627\u0631\u0648\u062a\u0648\u0646\u06af\u0627\u06cc\u06cc
+languages.ve=\u0648\u0646\u062f\u0627\u06cc\u06cc
+languages.raj=\u0631\u0627\u062c\u0633\u062a\u0627\u0646\u06cc
+languages.ota=\u062a\u0631\u06a9\u06cc \u0639\u062b\u0645\u0627\u0646\u06cc
+languages.nap=\u0646\u0627\u067e\u0644\u06cc
languages.uz=\u0627\u0632\u0628\u06a9\u06cc
-languages.ik=\u0627\u06cc\u0646\u0648\u067e\u06cc\u06a9
+languages.tmh=\u062a\u0627\u0645\u0627\u0634\u0642\u06cc
+languages.nai=\u0633\u0631\u062e\u067e\u0648\u0633\u062a\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc (\u062f\u06cc\u06af\u0631)
+languages.nah=\u0646\u0627\u0648\u0627\u062a\u0644\u06cc
languages.ur=\u0627\u0631\u062f\u0648
-languages.id=\u0627\u0646\u062f\u0648\u0646\u0632\u06cc\u0627\u06cc\u06cc
-languages.moh=\u0645\u0648\u0647\u0627\u06a9\u06cc
-languages.hit=\u0647\u06cc\u062a\u06cc
-languages.ia=\u0645\u06cc\u0627\u0646\u200c\u0632\u0628\u0627\u0646
+languages.fat=\u0641\u0627\u0646\u062a\u06cc\u0627\u06cc\u06cc
languages.uk=\u0627\u0648\u06a9\u0631\u0627\u06cc\u0646\u06cc
-languages.kok=\u06a9\u0646\u06a9\u0627\u0646\u06cc
+languages.egy=\u0645\u0635\u0631\u06cc (\u06a9\u0647\u0646)
languages.ug=\u0627\u0648\u06cc\u063a\u0648\u0631\u06cc
-languages.hz=\u0647\u0631\u06cc\u0631\u0648\u06cc\u06cc
-languages.und=\u0646\u0627\u0645\u0634\u062e\u0635
-languages.hy=\u0627\u0631\u0645\u0646\u06cc
-languages.phn=\u0641\u0646\u06cc\u0642\u06cc
-languages.got=\u06af\u0648\u062a\u06cc\u06a9
-languages.hu=\u0645\u062c\u0627\u0631\u06cc
-languages.phi=\u0641\u06cc\u0627\u06cc\u067e\u06cc\u0646\u06cc (\u063a\u06cc\u0631\u0647)
-languages.hr=\u06a9\u0631\u0648\u0627\u062a\u06cc
+languages.fan=\u0641\u0627\u0646\u06a9\u06cc
+languages.ssa=\u0646\u06cc\u0644\u06cc \u0648 \u0635\u062d\u0631\u0627\u06cc\u06cc (\u062f\u06cc\u06af\u0631)
+languages.bat=\u0628\u0627\u0644\u062a\u06cc\u06a9\u06cc (\u062f\u06cc\u06af\u0631)
+languages.mga=\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc \u0645\u06cc\u0627\u0646\u0647
+languages.bas=\u0628\u0627\u0633\u0627\u06cc\u06cc
+languages.nyo=\u0646\u06cc\u0648\u0631\u0648\u06cc\u06cc
+languages.nyn=\u0646\u06cc\u0627\u0646\u06a9\u0648\u0644\u0647\u200c\u0627\u06cc
+languages.ban=\u0628\u0627\u0644\u06cc\u0627\u06cc\u06cc
+languages.osa=\u0627\u0648\u0633\u06cc\u062c\u06cc
+languages.bal=\u0628\u0644\u0648\u0686\u06cc
languages.ty=\u062a\u0627\u0647\u06cc\u062a\u06cc\u0627\u06cc\u06cc
-languages.apa=\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0622\u067e\u0627\u0686\u06cc\u0627\u06cc\u06cc
languages.tw=\u062a\u0648\u06cc\u200c\u06cc\u0627\u06cc\u06cc
-languages.goh=\u0622\u0644\u0645\u0627\u0646\u06cc \u0639\u0644\u06cc\u0627\u06cc \u0628\u0627\u0633\u062a\u0627\u0646 (\u062d\u062f\u0648\u062f \u06f7\u06f5\u06f0-\u06f1\u06f0\u06f5\u06f0)
+languages.srr=\u0633\u0631\u06cc\u0631\u06cc
+languages.tli=\u062a\u0644\u06cc\u0646\u200c\u06af\u06cc\u062a\u06cc
+languages.tlh=\u06a9\u0644\u06cc\u0646\u06af\u0648\u0646
languages.tt=\u062a\u0627\u062a\u0627\u0631\u06cc
-languages.hi=\u0647\u0646\u062f\u06cc
languages.ts=\u062a\u0633\u0648\u0646\u06af\u0627\u06cc\u06cc
-languages.tr=\u062a\u0631\u06a9\u06cc
-languages.cop=\u0642\u0628\u0637\u06cc
-languages.he=\u0639\u0628\u0631\u06cc
+languages.bad=\u0628\u0627\u0646\u062f\u0627\u06cc\u06cc
+languages.tr=\u062a\u0631\u06a9\u06cc \u0627\u0633\u062a\u0627\u0646\u0628\u0648\u0644\u06cc
languages.to=\u062a\u0648\u0646\u06af\u0627\u06cc\u06cc (\u062c\u0632\u0627\u06cc\u0631 \u062a\u0648\u0646\u06af\u0627)
languages.tn=\u062a\u0633\u0648\u0627\u0646\u0627\u06cc\u06cc
-languages.sai=\u0633\u0631\u062e\u200c\u067e\u0648\u0633\u062a\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc (\u063a\u06cc\u0631\u0647)
languages.tl=\u062a\u0627\u06af\u0627\u0644\u0648\u06af\u06cc
-languages.ha=\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc
-languages.tk=\u062a\u0631\u06a9\u0645\u062a\u06cc
-languages.dum=\u0647\u0644\u0646\u062f\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u062d\u062f\u0648\u062f \u06f1\u06f0\u06f5\u06f0-\u06f1\u06f3\u06f5\u06f0 \u0645.)
+languages.tk=\u062a\u0631\u06a9\u0645\u0646\u06cc
languages.ti=\u062a\u06cc\u06af\u0631\u06cc\u0646\u06cc\u0627\u06cc\u06cc
languages.th=\u062a\u0627\u06cc\u0644\u0646\u062f\u06cc
+languages.kru=\u06a9\u0648\u0631\u0648\u062e\u06cc
languages.tg=\u062a\u0627\u062c\u06cc\u06a9\u06cc
languages.te=\u062a\u0644\u0648\u06af\u0648\u06cc\u06cc
-languages.gv=\u0645\u0627\u0646\u06cc
+languages.csb=\u06a9\u0627\u0634\u0648\u0628\u06cc
+languages.kro=\u06a9\u0631\u0648\u06cc\u06cc
languages.ta=\u062a\u0627\u0645\u06cc\u0644\u06cc
-languages.syr=\u0633\u0631\u06cc\u0627\u0646\u06cc
-languages.gu=\u06af\u062c\u0631\u0627\u062a\u06cc
-languages.map=\u0622\u0633\u062a\u0631\u0648\u0646\u06cc\u0632\u06cc\u0627\u06cc\u06cc
-languages.ine=\u0647\u0646\u062f\u0648\u0627\u0631\u0648\u062f\u067e\u0627\u06cc\u06cc
-languages.gn=\u06af\u0648\u0627\u0631\u0627\u0646\u06cc
-languages.inc=\u0647\u0646\u062f\u06cc\u06a9 (\u063a\u06cc\u0631\u0647)
+languages.efi=\u0627\u0641\u06cc\u06a9\u06cc
languages.sw=\u0633\u0648\u0627\u062d\u0644\u06cc
languages.sv=\u0633\u0648\u0626\u062f\u06cc
languages.su=\u0633\u0648\u0646\u062f\u0627\u06cc\u06cc
+languages.krc=\u0642\u0631\u0647\u200c\u0686\u0627\u06cc\u06cc\u2010\u0628\u0627\u0644\u06a9\u0627\u0631\u06cc
languages.st=\u0633\u0648\u062a\u0648\u06cc\u06cc \u062c\u0646\u0648\u0628\u06cc
-languages.enm=\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u06f1\u06f1\u06f0\u06f0 -\u06f1\u06f5\u06f0\u06f0 \u0645.)
languages.sr=\u0635\u0631\u0628\u06cc
languages.sq=\u0622\u0644\u0628\u0627\u0646\u06cc\u0627\u06cc\u06cc
-languages.bho=\u0628\u0648\u062c\u067e\u0648\u0631\u06cc
+languages.men=\u0645\u0646\u062f\u0647\u200c\u0627\u06cc
+languages.crp=\u06a9\u0631\u06cc\u0648\u0644\u200c\u0647\u0627 \u0648 \u067e\u06cc\u062c\u06cc\u0646\u200c\u0647\u0627 (\u062f\u06cc\u06af\u0631)
languages.so=\u0633\u0648\u0645\u0627\u0644\u06cc\u0627\u06cc\u06cc
languages.sn=\u0634\u0648\u0646\u0627\u06cc\u06cc
languages.sm=\u0633\u0627\u0645\u0648\u0622\u06cc\u06cc
languages.sl=\u0627\u0633\u0644\u0648\u0648\u06cc\u0646\u06cc\u0627\u06cc\u06cc
-languages.ga=\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc
+languages.grc=\u06cc\u0648\u0646\u0627\u0646\u06cc \u06a9\u0647\u0646
languages.sk=\u0627\u0633\u0644\u0648\u0627\u06a9\u06cc
+languages.grb=\u06af\u0631\u06cc\u0628\u0648\u06cc\u06cc
languages.si=\u0633\u06cc\u0646\u0647\u0627\u0644\u06cc
languages.sh=\u0635\u0631\u0628 \u0648 \u06a9\u0631\u0648\u0627\u062a\u06cc
+languages.afa=\u0627\u0641\u0631\u06cc\u0642\u0627 \u0648 \u0622\u0633\u06cc\u0627\u06cc\u06cc (\u062f\u06cc\u06af\u0631)
+languages.crh=\u062a\u0631\u06a9\u06cc \u06a9\u0631\u06cc\u0645\u0647\u061b \u062a\u0627\u062a\u0627\u0631\u06cc \u06a9\u0631\u06cc\u0645\u0647
languages.sg=\u0633\u0627\u0646\u06af\u0648\u06cc\u06cc
-languages.myn=\u0645\u0627\u06cc\u0627\u06cc\u06cc\u06a9
languages.sd=\u0633\u0646\u062f\u06cc
+languages.udm=\u0627\u0648\u062f\u0645\u0648\u0631\u062a\u06cc
languages.sc=\u0633\u0627\u0631\u062f\u06cc\u0646\u06cc\u0627\u06cc\u06cc
languages.sa=\u0633\u0646\u0633\u06a9\u0631\u06cc\u062a
-languages.ang=\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc \u0628\u0627\u0633\u062a\u0627\u0646 (\u062d\u062f\u0648\u062f \u06f4\u06f5\u06f0-\u06f1\u06f1\u06f0\u06f0 \u0645.)
-languages.fr=\u0641\u0631\u0627\u0646\u0633\u0648\u06cc
-languages.gaa=\u06af\u0627
-languages.fo=\u0641\u0627\u0631\u0648\u06cc\u06cc
languages.rw=\u06a9\u06cc\u0646\u06cc\u0627\u0631\u0648\u0627\u0646\u062f\u0627\u06cc\u06cc
-languages.gmh=\u0622\u0644\u0645\u0627\u0646\u06cc \u0639\u0644\u06cc\u0627\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u062d\u062f\u0648\u062f \u06f1\u06f0\u06f5\u06f0-\u06f1\u06f5\u06f0\u06f0)
+languages.nwc=\u0646\u0648\u0627\u0631\u06cc\u0627\u06cc\u06cc \u06a9\u0644\u0627\u0633\u06cc\u06a9
languages.ru=\u0631\u0648\u0633\u06cc
+languages.ro=\u0631\u0648\u0645\u0627\u0646\u06cc\u0627\u06cc\u06cc
+languages.rn=\u0631\u0648\u0646\u062f\u06cc\u0627\u06cc\u06cc
+languages.rm=\u0631\u062a\u0648\u2010\u0631\u0648\u0645\u06cc\u0627\u06cc\u06cc
+languages.mdf=\u0645\u06a9\u0634\u0627\u06cc\u06cc
+languages.tiv=\u062a\u06cc\u0648\u06cc
+languages.ady=\u0622\u062f\u06cc\u062c\u06cc\u0627\u06cc\u06cc
+languages.zun=\u0632\u0648\u0646\u06cc\u0627\u06cc\u06cc
+languages.kpe=\u06a9\u067e\u0644\u0647\u200c\u0627\u06cc
+languages.qu=\u06a9\u0686\u0648\u0627\u06cc\u06cc
+languages.tig=\u062a\u06cc\u06af\u0631\u0647\u200c\u0627\u06cc
+languages.son=\u0633\u0648\u0646\u063a\u0627\u06cc\u06cc
+languages.cpp=\u06a9\u0631\u06cc\u0648\u0644\u200c\u0647\u0627 \u0648 \u067e\u06cc\u062c\u06cc\u0646\u200c\u0647\u0627\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u067e\u0631\u062a\u063a\u0627\u0644\u06cc (\u062f\u06cc\u06af\u0631)
+languages.sog=\u0633\u063a\u062f\u06cc
+languages.ada=\u0622\u062f\u0627\u0646\u06af\u0645\u0647\u200c\u0627\u06cc
+languages.cpf=\u06a9\u0631\u06cc\u0648\u0644\u200c\u0647\u0627 \u0648 \u067e\u06cc\u062c\u06cc\u0646\u200c\u0647\u0627\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0641\u0631\u0627\u0646\u0633\u0648\u06cc (\u062f\u06cc\u06af\u0631)
+languages.hit=\u0647\u06cc\u062a\u06cc
+languages.cpe=\u06a9\u0631\u06cc\u0648\u0644\u200c\u0647\u0627 \u0648 \u067e\u06cc\u062c\u06cc\u0646\u200c\u0647\u0627\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0627\u0646\u06af\u0644\u06cc\u0633\u06cc (\u062f\u06cc\u06af\u0631)
+languages.got=\u06af\u0648\u062a\u06cc\u06a9
+languages.hil=\u0647\u06cc\u0644\u06cc\u200c\u06af\u0627\u06cc\u0646\u0648\u0646\u06cc
+languages.kok=\u06a9\u0646\u06a9\u0627\u0646\u06cc
+languages.gon=\u06af\u0648\u0646\u062f\u06cc
+languages.din=\u062f\u06cc\u0646\u06a9\u0627\u06cc\u06cc
+languages.nub=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0646\u0648\u0628\u06cc\u0627\u06cc\u06cc
+languages.pt=\u067e\u0631\u062a\u063a\u0627\u0644\u06cc
+languages.ps=\u067e\u0634\u062a\u0648
+languages.fur=\u0641\u0631\u06cc\u0648\u0644\u06cc\u0627\u06cc\u06cc
+languages.phn=\u0641\u0646\u06cc\u0642\u06cc
+languages.goh=\u0622\u0644\u0645\u0627\u0646\u06cc \u0639\u0644\u06cc\u0627\u06cc \u0628\u0627\u0633\u062a\u0627\u0646
+languages.snk=\u0633\u0648\u0646\u06cc\u0646\u06a9\u0647\u200c\u0627\u06cc
+languages.cop=\u0642\u0628\u0637\u06cc
+languages.yap=\u06cc\u0627\u067e\u06cc
+languages.ach=\u0622\u0686\u0648\u0644\u06cc\u0627\u06cc\u06cc
+languages.yao=\u06cc\u0627\u0626\u0648\u06cc\u06cc
+languages.phi=\u0641\u06cc\u0644\u06cc\u067e\u06cc\u0646\u06cc (\u062f\u06cc\u06af\u0631)
+languages.pl=\u0644\u0647\u0633\u062a\u0627\u0646\u06cc
+languages.ace=\u0622\u0686\u0626\u06cc
+languages.pi=\u067e\u0627\u0644\u06cc
+languages.pa=\u067e\u0646\u062c\u0627\u0628\u06cc
+languages.bug=\u0628\u0648\u06af\u06cc\u0627\u06cc\u06cc
+languages.bua=\u0628\u0648\u0631\u06cc\u0627\u062a\u06cc
+languages.mas=\u0645\u0627\u0633\u0627\u06cc\u06cc
+languages.os=\u0622\u0633\u06cc
+languages.map=\u0622\u0633\u062a\u0631\u0648\u0646\u06cc\u0632\u06cc\u0627\u06cc\u06cc\u200c (\u062f\u06cc\u06af\u0631)
+languages.or=\u0627\u0648\u0631\u06cc\u0647\u200c\u0627\u06cc
+languages.man=\u0645\u0627\u0646\u062f\u06cc\u0646\u06af\u0648\u06cc\u06cc
+languages.mai=\u0645\u0627\u06cc\u062f\u06cc\u0644\u06cc
+languages.oj=\u0627\u0648\u062c\u06cc\u0628\u0648\u0627\u06cc\u06cc
+languages.mag=\u0645\u0627\u06af\u0627\u0647\u06cc\u0627\u06cc\u06cc
+languages.mad=\u0645\u0627\u062f\u0648\u0631\u0627\u06cc\u06cc
+languages.btk=\u0628\u0627\u062a\u0627\u06a9\u06cc
+languages.nso=\u0633\u0648\u062a\u0648\u06cc\u06cc \u0634\u0645\u0627\u0644\u06cc
+languages.myv=\u0627\u0631\u0632\u06cc\u0627\u06cc\u06cc
+languages.ny=\u0646\u06cc\u0627\u0646\u062c\u0627\u06cc\u06cc\u061b \u0686\u0648\u0627\u06cc\u06cc
+languages.myn=\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0645\u0627\u06cc\u0627\u06cc\u06cc\u06a9
+languages.nv=\u0646\u0627\u0648\u0627\u0647\u0648\u06cc\u06cc
+languages.kmb=\u06a9\u06cc\u0645\u0628\u0648\u0646\u062f\u0648\u06cc\u06cc
+languages.nr=\u0627\u0646\u062f\u0647\u200c\u0628\u0644\u0647\u200c\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc
+languages.gmh=\u0622\u0644\u0645\u0627\u0646\u06cc \u0639\u0644\u06cc\u0627\u06cc \u0645\u06cc\u0627\u0646\u0647
+languages.no=\u0646\u0631\u0648\u0698\u06cc
+languages.nn=\u0646\u0631\u0633 \u062c\u062f\u06cc\u062f \u0646\u0631\u0648\u0698\u06cc
+languages.nl=\u0647\u0644\u0646\u062f\u06cc
+languages.root=\u0631\u06cc\u0634\u0647
+languages.ng=\u0646\u062f\u0648\u0646\u06af\u0627\u06cc\u06cc
+languages.sla=\u0627\u0633\u0644\u0627\u0648\u06cc (\u062f\u06cc\u06af\u0631)
+languages.ne=\u0646\u067e\u0627\u0644\u06cc
+languages.nd=\u0627\u0646\u062f\u0647\u200c\u0628\u0644\u0647\u200c\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc
+languages.nb=\u0628\u0648\u06a9\u0633\u0645\u0627\u0644 \u0646\u0631\u0648\u0698\u06cc
+languages.na=\u0646\u0627\u0626\u0648\u0631\u0648\u06cc\u06cc
+languages.tem=\u062a\u06cc\u0645\u0646\u0647\u200c\u0627\u06cc
+languages.my=\u0628\u0631\u0645\u0647\u200c\u0627\u06cc
+languages.lez=\u0644\u0632\u06af\u06cc
+languages.mt=\u0645\u0627\u0644\u062a\u06cc
+languages.ms=\u0645\u0627\u0644\u0632\u06cc\u0627\u06cc\u06cc
+languages.peo=\u0641\u0627\u0631\u0633\u06cc \u0628\u0627\u0633\u062a\u0627\u0646
+languages.mr=\u0645\u0631\u0627\u062a\u06cc
+languages.fro=\u0641\u0631\u0627\u0646\u0633\u0648\u06cc \u0628\u0627\u0633\u062a\u0627\u0646
+languages.mo=\u0645\u0648\u0644\u062f\u0627\u0648\u06cc\u0627\u06cc\u06cc
+languages.mn=\u0645\u063a\u0648\u0644\u06cc
+languages.frm=\u0641\u0631\u0627\u0646\u0633\u0648\u06cc \u0645\u06cc\u0627\u0646\u0647
+languages.ml=\u0645\u0627\u0644\u0627\u06cc\u0627\u0644\u0627\u0645\u06cc
+languages.jrb=\u0639\u0631\u0628\u06cc \u06cc\u0647\u0648\u062f\u06cc
+languages.mk=\u0645\u0642\u062f\u0648\u0646\u06cc
+languages.mi=\u0645\u0627\u0626\u0648\u0631\u06cc\u0627\u06cc\u06cc
+languages.mh=\u0645\u0627\u0631\u0634\u0627\u0644\u06cc
+languages.mg=\u0645\u0627\u0644\u0627\u06af\u0627\u0633\u06cc\u0627\u06cc\u06cc
+languages.lv=\u0644\u062a\u0648\u0646\u06cc\u0627\u06cc\u06cc
+languages.lu=\u0644\u0648\u0628\u0627\u06cc\u06cc\u2010\u06a9\u0627\u062a\u0627\u0646\u06af\u0627
+languages.lt=\u0644\u06cc\u062a\u0648\u0627\u0646\u06cc\u0627\u06cc\u06cc
+languages.del=\u062f\u0644\u0627\u0648\u0627\u0631\u06cc
+languages.lo=\u0644\u0627\u0626\u0648\u0633\u06cc
+languages.ln=\u0644\u06cc\u0646\u06af\u0627\u0644\u0627
+languages.li=\u0644\u06cc\u0645\u0628\u0648\u0631\u06af\u06cc
+languages.lg=\u06af\u0627\u0646\u062f\u0627\u06cc\u06cc
+languages.lb=\u0644\u0648\u06af\u0632\u0627\u0645\u0628\u0648\u0631\u06af\u06cc
+languages.la=\u0644\u0627\u062a\u06cc\u0646\u06cc
+languages.jpr=\u0641\u0627\u0631\u0633\u06cc \u06cc\u0647\u0648\u062f\u06cc
+languages.sit=\u0686\u06cc\u0646 \u0648 \u062a\u0628\u062a\u06cc (\u062f\u06cc\u06af\u0631)
+languages.ky=\u0642\u0631\u0642\u06cc\u0632\u06cc
+languages.kw=\u06a9\u0631\u0646\u0648\u0627\u0644\u06cc
+languages.kv=\u06a9\u0648\u0645\u06cc\u0627\u06cc\u06cc
+languages.ku=\u06a9\u0631\u062f\u06cc
+languages.sio=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0633\u0648\u06cc\u06cc
+languages.ks=\u06a9\u0634\u0645\u06cc\u0631\u06cc
+languages.kr=\u06a9\u0627\u0646\u0648\u0631\u06cc\u0627\u06cc\u06cc
+languages.ko=\u06a9\u0631\u0647\u200c\u0627\u06cc
+languages.kn=\u06a9\u0627\u0646\u0627\u062f\u0647\u200c\u0627\u06cc
+languages.km=\u062e\u0645\u0631\u06cc
+languages.kl=\u06af\u0631\u06cc\u0646\u0644\u0646\u062f\u06cc
+languages.kk=\u0642\u0632\u0627\u0642\u06cc
+languages.rom=\u0631\u0648\u0645\u0627\u0646\u0648\u06cc\u06cc
+languages.sid=\u0633\u06cc\u062f\u0627\u0645\u0648\u06cc\u06cc
+languages.ki=\u06a9\u06cc\u06a9\u0648\u06cc\u0648\u06cc\u06cc
+languages.kg=\u06a9\u0646\u06af\u0648\u06cc\u06cc
+languages.non=\u0646\u0631\u0633 \u0628\u0627\u0633\u062a\u0627\u0646
+languages.ka=\u06af\u0631\u062c\u06cc
+languages.mus=\u06a9\u0631\u06cc\u06a9\u06cc
+languages.roa=\u0631\u0648\u0645\u06cc\u0627\u06cc\u06cc (\u062f\u06cc\u06af\u0631)
+languages.nog=\u0646\u063a\u0627\u06cc\u06cc
+languages.mun=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0645\u0648\u0646\u062f\u0627\u06cc\u06cc
+languages.mul=\u0686\u0646\u062f\u06cc\u0646 \u0632\u0628\u0627\u0646
+languages.jv=\u062c\u0627\u0648\u0647\u200c\u0627\u06cc
+languages.gil=\u06af\u06cc\u0644\u0628\u0631\u062a\u06cc
+languages.znd=\u0632\u0627\u0646\u062f\u0647\u200c\u0627\u06cc
+languages.shn=\u0634\u0627\u0646\u06cc
+languages.fon=\u0641\u0648\u0646\u06cc
+languages.xal=\u0642\u0644\u0645\u0648\u0642\u06cc
+languages.aus=\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0627\u0633\u062a\u0631\u0627\u0644\u06cc\u0627\u06cc\u06cc
+languages.kho=\u062e\u062a\u0646\u06cc
+languages.ja=\u0698\u0627\u067e\u0646\u06cc
+languages.khi=\u062e\u0648\u0627\u0633\u06cc (\u062f\u06cc\u06af\u0631)
+languages.chy=\u0634\u0627\u06cc\u0627\u0646\u06cc
+languages.pau=\u067e\u0627\u0644\u0627\u0626\u0648\u06cc\u06cc
+languages.tai=\u062a\u0627\u06cc\u06cc (\u062f\u06cc\u06af\u0631)
+languages.iu=\u0627\u06cc\u0646\u0648\u06a9\u062a\u06cc\u062a\u0648\u062a
+languages.pap=\u067e\u0627\u067e\u06cc\u0627\u0645\u0646\u062a\u0648
+languages.it=\u0627\u06cc\u062a\u0627\u0644\u06cc\u0627\u06cc\u06cc
+languages.sgn=\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0646\u0634\u0627\u0646\u0647\u200c\u0627\u06cc
+languages.kha=\u062e\u0627\u0632\u06cc\u0627\u06cc\u06cc
+languages.is=\u0627\u06cc\u0633\u0644\u0646\u062f\u06cc
+languages.chr=\u0686\u0631\u0648\u06a9\u06cc\u0627\u06cc\u06cc
+languages.pam=\u067e\u0627\u0645\u067e\u0627\u0646\u06af\u0627\u06cc\u06cc
+languages.chp=\u0686\u06cc\u067e\u0647\u200c\u0648\u06cc\u0647\u200c\u0627\u06cc
+languages.pal=\u067e\u0647\u0644\u0648\u06cc
+languages.cho=\u0686\u0648\u06a9\u062a\u0648\u06cc\u06cc
+languages.chm=\u0645\u0627\u0631\u06cc\u0627\u06cc\u06cc
+languages.tyv=\u062a\u0648\u0648\u0627\u06cc\u06cc
+languages.bnt=\u0628\u0627\u0646\u062a\u0648\u06cc\u06cc (\u062f\u06cc\u06af\u0631)
+languages.pag=\u067e\u0627\u0646\u06af\u0627\u0633\u06cc\u0646\u0627\u0646\u06cc
+languages.ik=\u0627\u06cc\u0646\u0648\u067e\u06cc\u06a9
+languages.haw=\u0647\u0627\u0648\u0627\u0626\u06cc\u0627\u06cc\u06cc
+languages.ii=\u06cc\u06cc \u0633\u06cc\u0686\u0648\u0627\u0646
+languages.ig=\u0627\u06cc\u06af\u0628\u0648\u06cc\u06cc
+languages.sga=\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc \u0628\u0627\u0633\u062a\u0627\u0646
+languages.paa=\u067e\u0627\u067e\u0648\u0627\u06cc\u06cc (\u062f\u06cc\u06af\u0631)
+languages.id=\u0627\u0646\u062f\u0648\u0646\u0632\u06cc\u0627\u06cc\u06cc
+languages.lah=\u0644\u0627\u0647\u0646\u062f\u0627
+languages.ia=\u0645\u06cc\u0627\u0646\u200c\u0632\u0628\u0627\u0646
+languages.lad=\u0644\u0627\u062f\u06cc\u0646\u0648
+languages.hai=\u0647\u0627\u06cc\u062f\u0627\u06cc\u06cc
+languages.hz=\u0647\u0631\u06cc\u0631\u0648\u06cc\u06cc
+languages.hy=\u0627\u0631\u0645\u0646\u06cc
+languages.ath=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0622\u062a\u0627\u067e\u0627\u0633\u06a9\u0627\u06cc\u06cc
+languages.hu=\u0645\u062c\u0627\u0631\u06cc
+languages.ht=\u0647\u0627\u0626\u06cc\u062a\u06cc\u0627\u06cc\u06cc
+languages.dak=\u062f\u0627\u06a9\u0648\u062a\u0627\u06cc\u06cc
+languages.hr=\u06a9\u0631\u0648\u0627\u062a\u06cc
+languages.hi=\u0647\u0646\u062f\u06cc
+languages.dyu=\u062f\u0627\u06cc\u0648\u0644\u0627\u06cc\u06cc
+languages.he=\u0639\u0628\u0631\u06cc
+languages.ha=\u0647\u0648\u0633\u06cc\u0627\u06cc\u06cc
+languages.wen=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0635\u064f\u0631\u0628\u06cc
+languages.gv=\u0645\u0627\u0646\u06cc
+languages.gu=\u06af\u062c\u0631\u0627\u062a\u06cc
+languages.sem=\u0633\u0627\u0645\u06cc (\u062f\u06cc\u06af\u0631)
+languages.sel=\u0633\u0644\u06a9\u0648\u067e\u06cc
+languages.iro=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0627\u06cc\u0631\u0648\u06a9\u0648\u0627\u06cc\u06cc
+languages.gn=\u06af\u0648\u0627\u0631\u0627\u0646\u06cc
+languages.gl=\u06af\u0627\u0644\u06cc\u0633\u06cc\u0627\u06cc\u06cc
+languages.arw=\u0622\u0631\u0627\u0648\u0627\u06a9\u06cc
+languages.gd=\u06af\u06cc\u0644\u06cc \u0627\u0633\u06a9\u0627\u062a\u0644\u0646\u062f\u06cc
+languages.art=\u0633\u0627\u062e\u062a\u06af\u06cc (\u062f\u06cc\u06af\u0631)
+languages.gez=\u06af\u06cc\u200c\u0626\u0632\u06cc
+languages.ira=\u0627\u06cc\u0631\u0627\u0646\u06cc (\u062f\u06cc\u06af\u0631)
+languages.ga=\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc
+languages.arp=\u0622\u0631\u0627\u067e\u0627\u0647\u0648\u06cc\u06cc
+languages.arn=\u0622\u0631\u0648\u06a9\u0627\u0646\u06cc\u0627\u06cc\u06cc
+languages.fy=\u0641\u0631\u06cc\u0632\u06cc
+languages.gem=\u0698\u0631\u0645\u0646\u06cc (\u062f\u06cc\u06af\u0631)
+languages.ypk=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u06cc\u0648\u067e\u06cc\u06a9\u06cc
+languages.fr=\u0641\u0631\u0627\u0646\u0633\u0648\u06cc
+languages.arc=\u0622\u0631\u0627\u0645\u06cc
+languages.fo=\u0641\u0627\u0631\u0648\u06cc\u06cc
+languages.cel=\u0633\u0644\u062a\u06cc (\u062f\u06cc\u06af\u0631)
languages.fj=\u0641\u06cc\u062c\u06cc\u0627\u06cc\u06cc
-languages.cai=\u0633\u0631\u062e\u200c\u067e\u0648\u0633\u062a\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u0645\u0631\u06a9\u0632\u06cc (\u063a\u06cc\u0631\u0647)
languages.fi=\u0641\u0646\u0644\u0627\u0646\u062f\u06cc
-languages.ro=\u0631\u0648\u0645\u0627\u0646\u06cc\u0627\u06cc\u06cc
+languages.ff=\u0641\u0648\u0644\u0627\u06cc\u06cc
+languages.ceb=\u0633\u0628\u0648\u06cc\u06cc
languages.fa=\u0641\u0627\u0631\u0633\u06cc
-languages.peo=\u0641\u0627\u0631\u0633\u06cc \u0642\u062f\u06cc\u0645 (\u062d\u062f\u0648\u062f \u06f6\u06f0\u06f0-\u06f4\u06f0\u06f0 \u0642.\u0645.)
languages.eu=\u0628\u0627\u0633\u06a9\u06cc
+languages.sco=\u0627\u0633\u06a9\u0627\u062a\u0644\u0646\u062f\u06cc
languages.et=\u0627\u0633\u062a\u0648\u0646\u06cc\u0627\u06cc\u06cc
languages.es=\u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc
languages.eo=\u0627\u0633\u067e\u0631\u0627\u0646\u062a\u0648
languages.en=\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc
languages.el=\u06cc\u0648\u0646\u0627\u0646\u06cc
-languages.qu=\u06a9\u0686\u0648\u0627\u06cc\u06cc
-languages.jrb=\u0639\u0631\u0628\u06cc \u06cc\u0647\u0648\u062f\u06cc
-languages.fro=\u0641\u0631\u0627\u0646\u0633\u0648\u06cc \u0642\u062f\u06cc\u0645 (\u06f8\u06f4\u06f2-\u062d\u062f\u0648\u062f \u06f1\u06f4\u06f0\u06f0 \u0645.)
-languages.frm=\u0641\u0631\u0627\u0646\u0633\u0648\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u062d\u062f\u0648\u062f \u06f1\u06f4\u06f0\u06f0-\u06f1\u06f6\u06f0\u06f0 \u0645.)
-languages.dz=\u0628\u0648\u062a\u0627\u0646\u06cc
-languages.nds=\u0622\u0644\u0645\u0627\u0646\u06cc \u0633\u0641\u0644\u06cc\u061b \u0633\u0627\u06a9\u0633\u0648\u0646 \u0633\u0641\u0644\u0628
-languages.dra=\u062f\u0631\u0627\u0648\u06cc\u062f\u06cc (\u063a\u06cc\u0631\u0647)
-languages.pt=\u067e\u0631\u062a\u063a\u0627\u0644\u06cc
-languages.ps=\u067e\u0634\u062a\u0648
+languages.tut=\u0622\u0644\u062a\u0627\u06cc\u06cc\u06a9 (\u062f\u06cc\u06af\u0631)
+languages.niu=\u0646\u06cc\u0648\u06cc\u06cc
+languages.tup=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u062a\u0648\u067e\u06cc\u0627\u06cc\u06cc
+languages.ee=\u0627\u0648\u0647\u200c\u0627\u06cc
+languages.tum=\u062a\u0648\u0645\u0628\u0648\u06a9\u0627\u06cc\u06cc
+languages.mos=\u0645\u0627\u0633\u06cc\u0627\u06cc\u06cc
+languages.dz=\u062c\u0648\u0646\u062e\u0627\u06cc\u06cc
+languages.fiu=\u0641\u06cc\u0646 \u0648 \u0627\u0648\u06af\u0631\u0627\u06cc\u06cc (\u062f\u06cc\u06af\u0631)
+languages.lus=\u0644\u0648\u0634\u0647\u200c\u0627\u06cc
+languages.moh=\u0645\u0648\u0647\u0627\u06a9\u06cc
+languages.luo=\u0644\u0648\u0626\u0648\u06cc\u06cc
+languages.lun=\u0644\u0648\u0646\u062f\u0627\u06cc\u06cc
+languages.apa=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0622\u067e\u0627\u0686\u06cc\u0627\u06cc\u06cc
languages.de=\u0622\u0644\u0645\u0627\u0646\u06cc
-languages.sit=\u0686\u06cc\u0646 \u0648 \u062a\u0628\u062a\u06cc (\u063a\u06cc\u0631\u0647)
-languages.pl=\u0644\u0647\u0633\u062a\u0627\u0646\u06cc
+languages.lua=\u0644\u0648\u0628\u0627\u06cc\u06cc\u2010\u0644\u0648\u0644\u0648\u0627
+languages.bik=\u0628\u06cc\u06a9\u0648\u0644\u06cc
+languages.und=\u0646\u0627\u0645\u0634\u062e\u0635
languages.da=\u062f\u0627\u0646\u0645\u0627\u0631\u06a9\u06cc
-languages.pi=\u067e\u0627\u0644\u06cc
-languages.sux=\u0633\u0648\u0645\u0631\u06cc
-languages.jpr=\u0641\u0627\u0631\u0633\u06cc \u06cc\u0647\u0648\u062f\u06cc
+languages.dum=\u0647\u0644\u0646\u062f\u06cc \u0645\u06cc\u0627\u0646\u0647
+languages.wak=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0648\u0627\u06a9\u0627\u0634\u06cc
+languages.sat=\u0633\u0627\u0646\u062a\u0627\u0644\u06cc
languages.cy=\u0648\u06cc\u0644\u0632\u06cc
languages.cv=\u0686\u0648\u0648\u0627\u0634\u06cc
-languages.pa=\u067e\u0646\u062c\u0627\u0628\u06cc
+languages.kbd=\u06a9\u0627\u0628\u0627\u0631\u062f\u06cc\u0646\u06cc
languages.cu=\u0627\u0633\u0644\u0627\u0648\u06cc \u06a9\u0644\u06cc\u0633\u0627\u06cc\u06cc
languages.cs=\u0686\u06a9\u06cc
-languages.mis=\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0645\u062a\u0641\u0631\u0642\u0647
+languages.cr=\u06a9\u0631\u06cc\u0627\u06cc\u06cc
+languages.sal=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0633\u0627\u0644\u06cc\u0634\u06cc
+languages.dua=\u062f\u0648\u0622\u0644\u0627\u06cc\u06cc
+languages.sai=\u0633\u0631\u062e\u067e\u0648\u0633\u062a\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc (\u062f\u06cc\u06af\u0631)
+languages.mnc=\u0645\u0627\u0646\u0686\u0648\u06cc\u06cc
+languages.sah=\u06cc\u0627\u0642\u0648\u062a\u06cc
+languages.gba=\u06af\u0628\u0627\u06cc\u0627\u06cc\u06cc
+languages.inh=\u0627\u06cc\u0646\u06af\u0648\u0634\u06cc
+languages.sad=\u0633\u0627\u0646\u062f\u0627\u0648\u0647\u200c\u0627\u06cc
languages.ch=\u0686\u0627\u0645\u0648\u0631\u0648\u06cc\u06cc
-languages.or=\u0627\u0648\u0631\u06cc\u0647\u200c\u0627\u06cc
+languages.bho=\u0628\u0648\u062c\u067e\u0648\u0631\u06cc
+languages.ine=\u0647\u0646\u062f \u0648 \u0627\u0631\u0648\u067e\u0627\u06cc\u06cc (\u062f\u06cc\u06af\u0631)
+languages.enm=\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc \u0645\u06cc\u0627\u0646\u0647
languages.ce=\u0686\u0686\u0646\u06cc
+languages.inc=\u0647\u0646\u062f\u06cc\u06a9 (\u062f\u06cc\u06af\u0631)
+languages.kar=\u06a9\u0627\u0631\u0646\u06cc
languages.ca=\u06a9\u0627\u062a\u0627\u0644\u0648\u0646\u06cc\u0627\u06cc\u06cc
-languages.mul=\u0686\u0646\u062f\u06cc\u0646 \u0632\u0628\u0627\u0646
+languages.umb=\u0627\u0645\u0628\u0646\u062f\u0648\u06cc\u06cc
+languages.syr=\u0633\u0631\u06cc\u0627\u0646\u06cc
+languages.kam=\u06a9\u0627\u0645\u0628\u0627\u06cc\u06cc
+languages.tsi=\u062a\u0633\u06cc\u0645\u200c\u0634\u06cc\u0627\u0646\u06cc
+languages.ang=\u0627\u0646\u06af\u0644\u06cc\u0633\u06cc \u0628\u0627\u0633\u062a\u0627\u0646
+languages.cau=\u0642\u0641\u0642\u0627\u0632\u06cc (\u062f\u06cc\u06af\u0631)
+languages.kac=\u06a9\u0627\u0686\u06cc\u0646\u06cc
+languages.kab=\u0642\u0628\u0627\u06cc\u0644\u06cc
languages.bs=\u0628\u0648\u0633\u0646\u06cc\u0627\u06cc\u06cc
+languages.kaa=\u0642\u0631\u0647\u200c\u0642\u0627\u0644\u067e\u0627\u0642\u06cc
+languages.br=\u0628\u0631\u062a\u0627\u0646\u06cc\u0627\u06cc\u06cc
+languages.car=\u06a9\u0627\u0631\u06cc\u0628\u06cc
languages.bo=\u062a\u0628\u062a\u06cc
languages.bn=\u0628\u0646\u06af\u0627\u0644\u06cc
-languages.nv=\u0646\u0627\u0648\u0627\u0647\u0648\u06cc\u06cc
+languages.bm=\u0628\u0627\u0645\u0628\u0627\u0631\u0627\u06cc\u06cc
+languages.gaa=\u06af\u0627\u06cc\u06cc
languages.bi=\u0628\u06cc\u0633\u0644\u0627\u0645\u0627
+languages.cai=\u0633\u0631\u062e\u067e\u0648\u0633\u062a\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u0645\u0631\u06a9\u0632\u06cc (\u062f\u06cc\u06af\u0631)
languages.bh=\u0628\u06cc\u0647\u0627\u0631\u06cc
-languages.nr=\u0627\u0646\u062f\u0647\u200c\u0628\u0644\u0647\u200c\u0627\u06cc \u062c\u0646\u0648\u0628\u06cc
languages.bg=\u0628\u0644\u063a\u0627\u0631\u06cc
languages.be=\u0628\u0644\u0648\u0631\u0648\u0633\u06cc
-languages.no=\u0646\u0631\u0648\u0698\u06cc
-languages.nn=\u0646\u06cc\u0646\u0648\u0631\u0633\u06a9 \u0646\u0631\u0648\u0698\u06cc
-languages.nl=\u0647\u0644\u0646\u062f\u06cc
-languages.ba=\u0628\u0627\u0634\u06a9\u06cc\u0631
+languages.cad=\u06a9\u0627\u062f\u0648\u06cc\u06cc
+languages.ba=\u0628\u0627\u0634\u063a\u06cc\u0631\u06cc
languages.zu=\u0632\u0648\u0644\u0648\u06cc\u06cc
-languages.sgn=\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0646\u0634\u0627\u0646\u0647\u200c\u0627\u06cc
-languages.az=\u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646\u06cc
-languages.ne=\u0646\u067e\u0627\u0644\u06cc
+languages.hsb=\u0635\u064f\u0631\u0628\u06cc \u0639\u0644\u06cc\u0627
+languages.az=\u062a\u0631\u06a9\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646\u06cc
languages.ay=\u0622\u06cc\u0645\u0627\u0631\u0627\u06cc\u06cc
-languages.nd=\u0627\u0646\u062f\u0647\u200c\u0628\u0644\u0647\u200c\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc
-languages.nb=\u0628\u0648\u06a9\u0633\u0645\u0627\u0644 \u0646\u0631\u0648\u0698\u06cc
-languages.pal=\u067e\u0647\u0644\u0648\u06cc
-languages.ota=\u062a\u0631\u06a9\u06cc (\u0627\u0645\u067e\u0631\u0627\u062a\u0648\u0631\u06cc \u0639\u062b\u0645\u0627\u0646\u06cc)
-languages.aus=\u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0627\u0633\u062a\u0631\u0627\u0644\u06cc\u0627\u06cc\u06cc
-languages.na=\u0646\u0627\u0626\u0648\u0631\u0648\u06cc\u06cc
+languages.av=\u0622\u0648\u0627\u0631\u06cc
languages.as=\u0622\u0633\u0627\u0645\u06cc
languages.ar=\u0639\u0631\u0628\u06cc
+languages.dsb=\u0635\u064f\u0631\u0628\u06cc \u0633\u0641\u0644\u06cc
+languages.elx=\u0639\u06cc\u0644\u0627\u0645\u06cc
+languages.ilo=\u0627\u06cc\u0644\u0648\u06a9\u0648\u06cc\u06cc
languages.zh=\u0686\u06cc\u0646\u06cc
-languages.sga=\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc \u0628\u0627\u0633\u062a\u0627\u0646 (\u062a\u0627 \u06f9\u06f0\u06f0 \u0645.)
-languages.my=\u0628\u0631\u0645\u0647\u200c\u0627\u06cc
languages.am=\u0627\u0645\u0647\u0631\u06cc
-languages.nai=\u0633\u0631\u062e\u200c\u067e\u0648\u0633\u062a\u06cc \u0627\u0645\u0631\u06cc\u06a9\u0627\u06cc \u0634\u0645\u0627\u0644\u06cc (\u063a\u06cc\u0631\u0647)
-languages.paa=\u067e\u0627\u067e\u0648\u0627\u06cc\u06cc (\u063a\u06cc\u0631\u0647)
-languages.mt=\u0645\u0627\u0644\u062a\u06cc
-languages.ms=\u0645\u0627\u0644\u0632\u06cc\u0627\u06cc\u06cc
-languages.chr=\u0686\u0631\u0648\u06a9\u06cc
-languages.mr=\u0645\u0631\u0627\u062a\u06cc
+languages.pra=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u067e\u0631\u0627\u06a9\u0631\u06cc\u062a\u06cc
+languages.new=\u0646\u0648\u0627\u0631\u06cc\u0627\u06cc\u06cc
+languages.za=\u0686\u0648\u0627\u0646\u06af\u06cc
languages.af=\u0622\u0641\u0631\u06cc\u06a9\u0627\u0646\u0633
languages.ae=\u0627\u0648\u0633\u062a\u0627\u06cc\u06cc
-languages.haw=\u0647\u0627\u0648\u0627\u0626\u06cc\u0627\u06cc\u06cc
-languages.mo=\u0645\u0648\u0644\u062f\u0627\u0648\u06cc\u0627\u06cc\u06cc
-languages.mn=\u0645\u063a\u0648\u0644\u06cc
languages.ab=\u0622\u0628\u062e\u0627\u0632\u06cc
-languages.ml=\u0645\u0627\u0644\u0627\u06cc\u0627\u0644\u0627\u0645\u06cc
languages.aa=\u0622\u0641\u0627\u0631\u06cc
-languages.mk=\u0645\u0642\u062f\u0648\u0646\u06cc
-languages.root=\u0631\u06cc\u0634\u0647
-languages.mi=\u0645\u0627\u0626\u0648\u0631\u06cc\u0627\u06cc\u06cc
-languages.mh=\u0645\u0627\u0631\u0634\u0627\u0644\u06cc
-languages.mg=\u0645\u0627\u0644\u0627\u06af\u0627\u0633\u06cc\u0627\u06cc\u06cc
-languages.mga=\u0627\u06cc\u0631\u0644\u0646\u062f\u06cc \u0645\u06cc\u0627\u0646\u0647 (\u06f9\u06f0\u06f0-\u06f1\u06f2\u06f0\u06f0 \u0645.)
languages.yo=\u06cc\u0648\u0631\u0648\u0628\u0627\u06cc\u06cc
-languages.egy=\u0645\u0635\u0631\u06cc (\u0628\u0627\u0633\u062a\u0627\u0646\u06cc)
+languages.alg=\u0632\u0628\u0627\u0646\u0647\u0627\u06cc \u0622\u0644\u06af\u0648\u0646\u06a9\u06cc\u0646\u06cc
+languages.ale=\u0622\u0644\u0626\u0648\u062a\u06cc
+languages.mkh=\u0645\u0648\u0646\u200c\u062e\u0645\u0631\u06cc (\u062f\u06cc\u06af\u0631)
languages.yi=\u06cc\u062f\u06cc
-languages.bat=\u0628\u0627\u0644\u062a\u06cc\u06a9\u06cc (\u063a\u06cc\u0631\u0647)
-languages.lv=\u0644\u062a\u0648\u0646\u06cc\u0627\u06cc\u06cc
-languages.dak=\u062f\u0627\u06a9\u0648\u062a\u0627\u06cc\u06cc
-languages.lt=\u0644\u06cc\u062a\u0648\u0627\u0646\u06cc\u0627\u06cc\u06cc
-languages.lo=\u0644\u0627\u0626\u0648\u0633\u06cc
-languages.bal=\u0628\u0644\u0648\u0686\u06cc
-languages.ln=\u0644\u06cc\u0646\u06af\u0627\u0644\u0627
-languages.sem=\u0633\u0627\u0645\u06cc
+languages.dra=\u062f\u0631\u0627\u0648\u06cc\u062f\u06cc (\u062f\u06cc\u06af\u0631)
+languages.ber=\u0628\u0631\u0628\u0631\u06cc (\u062f\u06cc\u06af\u0631)
+languages.nds=\u0622\u0644\u0645\u0627\u0646\u06cc \u0633\u0641\u0644\u06cc
+languages.bem=\u0628\u0645\u0628\u0627\u06cc\u06cc
+languages.bej=\u0628\u062c\u0627\u06cc\u06cc
+variants.1901=\u0631\u0633\u0645\u200c\u0627\u0644\u062e\u0637 \u0633\u0646\u062a\u06cc \u0622\u0644\u0645\u0627\u0646\u06cc
+variants.GUOYU=\u0645\u0627\u0646\u062f\u0627\u0631\u06cc\u0646 \u06cc\u0627 \u0686\u06cc\u0646\u06cc \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f
+variants.1996=\u0631\u0633\u0645\u200c\u0627\u0644\u062e\u0637 \u0622\u0644\u0645\u0627\u0646\u06cc \u06f1\u06f9\u06f9\u06f6 \u0645\u06cc\u0644\u0627\u062f\u06cc
+variants.REVISED=\u0631\u0633\u0645\u200c\u0627\u0644\u062e\u0637 \u062a\u062c\u062f\u06cc\u062f\u0646\u0638\u0631\u0634\u062f\u0647
diff --git a/resource/gnu/java/locale/LocaleInformation_fa_AF.properties b/resource/gnu/java/locale/LocaleInformation_fa_AF.properties
index 9bbb2fb9d..cd856885b 100644
--- a/resource/gnu/java/locale/LocaleInformation_fa_AF.properties
+++ b/resource/gnu/java/locale/LocaleInformation_fa_AF.properties
@@ -6,27 +6,41 @@
# This file was automatically generated by gnu.localegen from CLDR.
percent=\u066a
-exponential=\u00d7\u06f1\u06f0^
minusSign=\u2212
zeroDigit=\u06f0
decimalSeparator=\u066b
groupingSeparator=\u066c
-currencyFormat=#,##0 \u00a4;-#,##0 \u00a4
-shortMonths=\u062c\u0646\u0648®\u0641\u0628\u0631®®\u0627\u067e\u0631®\u0645\u0640\u06cc®\u062c\u0648\u0646®\u062c\u0648\u0644®\u0627\u06af\u0633®®®\u0646\u0648\u0645®\u062f\u0633\u0645®®
+percentFormat='\u202a'#,##0%'\u202c'
+currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
+currenciesDisplayName.NOK=\u06a9\u0631\u0648\u0646 \u0646\u0627\u0631\u0648\u06cc
+currenciesDisplayName.BND=\u062f\u0627\u0644\u0631 \u0628\u0631\u0648\u0646\u06cc
+currenciesDisplayName.SGD=\u062f\u0627\u0644\u0631 \u0633\u06cc\u0646\u06af\u0627\u067e\u0648\u0631
+currenciesDisplayName.JPY=\u06cc\u0646 \u062c\u0627\u067e\u0627\u0646
+currenciesDisplayName.NLG=\u06af\u06cc\u0644\u062f\u0631 \u0647\u0627\u0644\u0646\u062f
+currenciesDisplayName.DKK=\u06a9\u0631\u0648\u0646 \u062f\u0646\u0645\u0627\u0631\u06a9
+currenciesDisplayName.CHF=\u0641\u0631\u0627\u0646\u06a9 \u0633\u0648\u06cc\u0633
+currenciesDisplayName.AUD=\u062f\u0627\u0644\u0631 \u0622\u0633\u062a\u0631\u0627\u0644\u06cc\u0627
+currenciesDisplayName.USD=\u062f\u0627\u0644\u0631 \u0627\u0645\u0631\u06cc\u06a9\u0627
+currenciesDisplayName.MXN=\u067e\u0632\u0648\u06cc \u0645\u06a9\u0633\u06cc\u06a9\u0648
+currenciesDisplayName.SEK=\u06a9\u0631\u0648\u0646 \u0633\u0648\u06cc\u062f\u0646
+currenciesDisplayName.BYR=\u0631\u0648\u0628\u0644 \u0631\u0648\u0633\u06cc\u0647\u0654 \u0633\u0641\u06cc\u062f
+currenciesDisplayName.TJS=\u0633\u0627\u0645\u0627\u0646\u06cc \u062a\u0627\u062c\u06a9\u0633\u062a\u0627\u0646
+currenciesDisplayName.CAD=\u062f\u0627\u0644\u0631 \u06a9\u0627\u0646\u0627\u062f\u0627
+shortMonths=®®®®®®®®®®®®®
months=\u062c\u0646\u0648\u0631\u06cc®\u0641\u0628\u0631\u0648\u0631\u06cc®\u0645\u0627\u0631\u0686®\u0627\u067e\u0631\u06cc\u0644®\u0645\u06cc®\u062c\u0648\u0646®\u062c\u0648\u0644\u0627\u06cc®\u0627\u06af\u0633\u062a®\u0633\u067e\u062a\u0645\u0628\u0631®\u0627\u06a9\u062a\u0648\u0628\u0631®\u0646\u0648\u0645\u0628\u0631®\u062f\u0633\u0645\u0628\u0631®®
firstDayOfWeek=sat
zoneStrings=Asia/Kabul®AFT®\u0648\u0642\u062a \u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646®AFT®\u0648\u0642\u062a \u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646®©
territories.AU=\u0622\u0633\u062a\u0631\u0627\u0644\u06cc\u0627
territories.GY=\u06af\u06cc\u0627\u0646\u0627
-territories.GW=\u06af\u06cc\u0646\u06cc\u0627 \u0628\u06cc\u0633\u0627\u0626\u0648
territories.AR=\u0627\u0631\u062c\u0646\u062a\u0627\u06cc\u0646
+territories.GW=\u06af\u06cc\u0646\u06cc\u0627 \u0628\u06cc\u0633\u0627\u0626\u0648
territories.MZ=\u0645\u0648\u0632\u0645\u0628\u06cc\u0642
-territories.MY=\u0645\u0627\u0644\u06cc\u0632\u06cc\u0627
-territories.GT=\u06af\u0648\u0627\u062a\u06cc\u0645\u0627\u0644\u0627
territories.AO=\u0627\u0646\u06af\u0648\u0644\u0627
+territories.GT=\u06af\u0648\u0627\u062a\u06cc\u0645\u0627\u0644\u0627
+territories.MY=\u0645\u0627\u0644\u06cc\u0632\u06cc\u0627
territories.MX=\u0645\u06a9\u0633\u06cc\u06a9\u0648
-territories.GQ=\u06af\u06cc\u0646\u06cc\u0627 \u0627\u0633\u062a\u0648\u0627\u06cc\u06cc
territories.AL=\u0627\u0644\u0628\u0627\u0646\u06cc\u0627
+territories.GQ=\u06af\u06cc\u0646\u06cc\u0627 \u0627\u0633\u062a\u0648\u0627\u06cc\u06cc
territories.MT=\u0645\u0627\u0644\u062a\u0627
territories.GN=\u06af\u06cc\u0646\u06cc\u0627
territories.MR=\u0645\u0648\u0631\u06cc\u062a\u0627\u0646\u06cc\u0627
@@ -34,9 +48,8 @@ territories.SV=\u0627\u0644\u0633\u0644\u0648\u0627\u062f\u0648\u0631
territories.AG=\u0627\u0646\u062a\u06cc\u06af\u0648\u0627 \u0648 \u0628\u0627\u0631\u0628\u0648\u062f\u0627
territories.ST=\u0633\u0627\u0626\u0648 \u062a\u0648\u0645\u0647 \u0648 \u067e\u0631\u06cc\u0646\u0633\u06cc\u067e
territories.AE=\u0627\u0645\u0627\u0631\u0627\u062a \u0645\u062a\u062d\u062f\u0647\u0654 \u0639\u0631\u0628\u06cc
-territories.MN=\u0645\u0646\u06af\u0648\u0644\u06cc\u0627
territories.AD=\u0627\u0646\u062f\u0648\u0631\u0627
-territories.YU=\u06cc\u0648\u06af\u0648\u0633\u0644\u0627\u0648\u06cc\u0627
+territories.MN=\u0645\u0646\u06af\u0648\u0644\u06cc\u0627
territories.SO=\u0633\u0648\u0645\u0627\u0644\u06cc\u0647
territories.SN=\u0633\u06cc\u0646\u06cc\u06af\u0627\u0644
territories.GD=\u06af\u0631\u06cc\u0646\u0627\u062f\u0627
@@ -65,13 +78,13 @@ territories.KN=\u0633\u0646\u062a \u06a9\u06cc\u062a\u0633 \u0648 \u0646\u06cc\u
territories.KM=\u06a9\u0648\u0645\u0648\u0631
territories.EE=\u0627\u0633\u062a\u0648\u0646\u06cc\u0627
territories.WS=\u0633\u0627\u0645\u0648\u0622\u06cc \u063a\u0631\u0628\u06cc
-territories.KH=\u06a9\u0645\u067e\u0648\u0686\u06cc\u0627
territories.EC=\u0627\u06a9\u0648\u0627\u062f\u0648\u0631
+territories.KH=\u06a9\u0645\u067e\u0648\u0686\u06cc\u0627
territories.KG=\u0642\u0631\u063a\u0632\u0633\u062a\u0627\u0646
territories.KE=\u06a9\u06cc\u0646\u06cc\u0627
territories.PY=\u067e\u0627\u0631\u0627\u06af\u0648\u0627\u06cc
-territories.JP=\u062c\u0627\u067e\u0627\u0646
territories.DK=\u062f\u0646\u0645\u0627\u0631\u06a9
+territories.JP=\u062c\u0627\u067e\u0627\u0646
territories.PT=\u067e\u0631\u062a\u06af\u0627\u0644
territories.PL=\u067e\u0648\u0644\u0646\u062f
territories.PG=\u067e\u0627\u067e\u0648\u0627 \u0646\u06cc\u0648 \u06af\u06cc\u0646\u06cc\u0627
@@ -97,15 +110,15 @@ territories.BS=\u0628\u0647\u0627\u0645\u0627\u0633
territories.BR=\u0628\u0631\u0627\u0632\u06cc\u0644
territories.UA=\u0627\u06a9\u0631\u0627\u06cc\u0646
territories.NZ=\u0632\u06cc\u0644\u0627\u0646\u062f \u062c\u062f\u06cc\u062f
-territories.HT=\u0647\u0627\u06cc\u062a\u06cc
territories.BO=\u0628\u0648\u0644\u06cc\u0648\u06cc\u0627
+territories.HT=\u0647\u0627\u06cc\u062a\u06cc
territories.BN=\u0628\u0631\u0648\u0646\u06cc
territories.HR=\u06a9\u0631\u0648\u0634\u06cc\u0627
territories.HN=\u0647\u0627\u0646\u062f\u0648\u0631\u0627\u0633
territories.BG=\u0628\u0644\u063a\u0627\u0631\u06cc\u0627
territories.NP=\u0646\u06cc\u067e\u0627\u0644
-territories.NO=\u0646\u0627\u0631\u0648\u06cc
territories.BE=\u0628\u0644\u062c\u06cc\u0645
+territories.NO=\u0646\u0627\u0631\u0648\u06cc
territories.BD=\u0628\u0646\u06af\u0644\u0647\u200c\u062f\u06cc\u0634
territories.ZW=\u0632\u06cc\u0645\u0628\u0627\u0628\u0648\u06cc
territories.NL=\u0647\u0627\u0644\u0646\u062f
@@ -119,13 +132,13 @@ languages.no=\u0646\u0627\u0631\u0648\u06cc\u0698\u06cc
languages.nl=\u0647\u0627\u0644\u0646\u062f\u06cc
languages.it=\u0627\u06cc\u062a\u0627\u0644\u0648\u06cc
languages.tg=\u062a\u0627\u062c\u06a9\u06cc
-languages.ne=\u0646\u06cc\u067e\u0627\u0644\u06cc
languages.is=\u0622\u06cc\u0633\u0644\u0646\u062f\u06cc
+languages.ne=\u0646\u06cc\u067e\u0627\u0644\u06cc
languages.fi=\u0641\u0646\u0644\u0646\u062f\u06cc
languages.id=\u0627\u0646\u062f\u0648\u0646\u06cc\u0632\u06cc\u0627\u06cc\u06cc
languages.sv=\u0633\u0648\u06cc\u062f\u0646\u06cc
-languages.fa=\u062f\u0631\u06cc
languages.pt=\u067e\u0631\u062a\u06af\u0627\u0644\u06cc
+languages.fa=\u062f\u0631\u06cc
languages.mn=\u0645\u063a\u0644\u06cc
languages.pl=\u067e\u0648\u0644\u0646\u062f\u06cc
languages.ky=\u0642\u0631\u063a\u0632\u06cc
diff --git a/resource/gnu/java/locale/LocaleInformation_fa_IR.properties b/resource/gnu/java/locale/LocaleInformation_fa_IR.properties
index 10d9d2af7..c9620355a 100644
--- a/resource/gnu/java/locale/LocaleInformation_fa_IR.properties
+++ b/resource/gnu/java/locale/LocaleInformation_fa_IR.properties
@@ -6,10 +6,9 @@
# This file was automatically generated by gnu.localegen from CLDR.
percent=\u066a
-exponential=\u00d7\u06f1\u06f0^
zeroDigit=\u06f0
decimalSeparator=\u066b
groupingSeparator=\u066c
percentFormat=%#,##0
-currencyFormat=#,##0 \u00a4;\u2212#,##0 \u00a4
+currencyFormat=#,##0.00 \u00a4;\u2212#,##0.00 \u00a4
firstDayOfWeek=sat
diff --git a/resource/gnu/java/locale/LocaleInformation_fi.properties b/resource/gnu/java/locale/LocaleInformation_fi.properties
index 2fb990ec0..8e6a34064 100644
--- a/resource/gnu/java/locale/LocaleInformation_fi.properties
+++ b/resource/gnu/java/locale/LocaleInformation_fi.properties
@@ -6,786 +6,376 @@
# This file was automatically generated by gnu.localegen from CLDR.
decimalSeparator=,
-groupingSeparator=\u00a0
+groupingSeparator=
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=Jordanian dinaari
-currenciesDisplayName.BOV=Bolivian mvdol
-currenciesDisplayName.XAU=Kulta
-currenciesDisplayName.FOK=F\u00e4rsaarten kruunu
-currenciesDisplayName.LBP=Libanonin punta
-currenciesDisplayName.EUR=euro
-currenciesDisplayName.VND=Vietnamin dong
-currenciesDisplayName.TZS=Tansanian shillinki
-currenciesDisplayName.BOP=Bolivian peso
-currenciesDisplayName.KHR=Kambod\u017ean riel
-currenciesDisplayName.XAM=Aasian rahayksikk\u00f6 (AMU)
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Kambod\u017ean vanha riel
-currenciesDisplayName.ZMP=Zambian punta
-currenciesDisplayName.AUP=Australian punta
-currenciesDisplayName.XAF=CFA-frangi BEAC
-currenciesDisplayName.MTP=Maltan punta
-currenciesDisplayName.GHR=Ghanan revalvoitu cedi
-currenciesDisplayName.ZMK=Zambian kwacha
-currenciesDisplayName.XAD=Aasian dinaarin UA
-currenciesDisplayName.GHP=Ghanan punta
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Ghanan vanha cedi
-currenciesDisplayName.MTL=Maltan liira
-currenciesDisplayName.AUD=Australian dollari
-currenciesDisplayName.USS=Yhdysvaltain dollari (Sama p\u00e4iv\u00e4)
-currenciesDisplayName.ITL=Italian liira
-currenciesDisplayName.USN=Yhdysvaltain dollari (Seuraava p\u00e4iv\u00e4)
-currenciesDisplayName.GHC=Ghanan cedi
-currenciesDisplayName.SGD=Singaporen dollari
-currenciesDisplayName.PAB=Panaman balboa
-currenciesDisplayName.LAK=Laosin kip
-currenciesDisplayName.KGS=Kirgistanin som
-currenciesDisplayName.CHF=Sveitsin frangi
-currenciesDisplayName.ATS=It\u00e4vallan shillinki
-currenciesDisplayName.USD=Yhdysvaltain dollari
-currenciesDisplayName.ETD=Etiopian dollari
-currenciesDisplayName.BND=Brunein dollari
-currenciesDisplayName.JMP=Jamaikan punta
-currenciesDisplayName.ETB=Etiopian birr
-currenciesDisplayName.DZG=Algerian franc germinal
-currenciesDisplayName.DZF=Algerian uusi frangi
-currenciesDisplayName.DZD=Algerian dinaari
-currenciesDisplayName.PYG=Paraguayn guarani
-currenciesDisplayName.LYP=Libyan punta
-currenciesDisplayName.JMD=Jamaikan dollari
-currenciesDisplayName.ISK=Islannin kruunu
-currenciesDisplayName.ESP=Espanjan peseta
-currenciesDisplayName.BMP=Bermudan punta
-currenciesDisplayName.LYD=Libyan dinaari
-currenciesDisplayName.LYB=Libyan sotilasvallan liira
-currenciesDisplayName.BMD=Bermudan dollari
-currenciesDisplayName.NLG=Alankomaiden guldeni
-currenciesDisplayName.MRO=Mauritanian ouguiya
-currenciesDisplayName.IRR=Iranin rial
-currenciesDisplayName.SEK=Ruotsin kruunu
-currenciesDisplayName.ERN=Eritrean nakfa
+currenciesDisplayName.YDD=Jemenin dinaari
+currenciesDisplayName.TWD=Taiwanin uusi dollari
currenciesDisplayName.KES=Kenian shillinki
-currenciesDisplayName.CFF=Keski-Afrikan tasavallan CFA-frangi
+currenciesDisplayName.BYB=Valko-Ven\u00e4j\u00e4n uusi rupla (1994-1999)
+currenciesDisplayName.LKR=Sri Lankan rupia
+currenciesDisplayName.RWF=Ruandan frangi
+currenciesDisplayName.TJS=Tad\u017eikistanin somoni
+currenciesDisplayName.SDP=Sudanin punta
+currenciesDisplayName.TJR=Tad\u017eikistanin rupla
+currenciesDisplayName.ERN=Eritrean nakfa
+currenciesDisplayName.AFN=Afgaani
+currenciesDisplayName.GRD=Kreikan drakhma
+currenciesDisplayName.IEP=Irlannin punta
currenciesDisplayName.ARS=Argentiinan peso
+currenciesDisplayName.SDD=Sudanin dinaari
currenciesDisplayName.ARP=Argentiinan peso (1983-1985)
-currenciesDisplayName.ARM=Argentiinan peso moneda nacional
-currenciesDisplayName.TWD=Taiwanin uusi dollari
-currenciesDisplayName.SDP=Sudanin punta
currenciesDisplayName.GEL=Georgian lari
+currenciesDisplayName.AFA=Afgaani (1927-2002)
currenciesDisplayName.GEK=Georgian kuponkilari
-currenciesDisplayName.MQF=Martiniquen frangi
+currenciesDisplayName.CRC=Costa Rican colon
currenciesDisplayName.FKP=Falklandinsaarten punta
+currenciesDisplayName.EEK=Viron kruunu
+currenciesDisplayName.HKD=Hongkongin dollari
+currenciesDisplayName.MDL=Moldovan leu
currenciesDisplayName.ARA=Argentiinan austral
-currenciesDisplayName.SDD=Sudanin dinaari
currenciesDisplayName.IQD=Irakin dinaari
-currenciesDisplayName.TVD=Tuvalun dollari
currenciesDisplayName.SCR=Seychellien rupia
+currenciesDisplayName.VUV=Vanuatun vatu
+currenciesDisplayName.DKK=Tanskan kruunu
+currenciesDisplayName.KPW=Pohjois-Korean won
+currenciesDisplayName.GQE=P\u00e4iv\u00e4ntasaajan Guinean ekwele guineana
+currenciesDisplayName.IDR=Indonesian rupia
currenciesDisplayName.LVR=Latvian rupla
-currenciesDisplayName.FJP=Fid\u017ein punta
+currenciesDisplayName.SOS=Somalian shillinki
+currenciesDisplayName.AED=Arabiemiirikuntien dirhami
+currenciesDisplayName.BWP=Botswanan pula
currenciesDisplayName.LVL=Latvian lati
-currenciesDisplayName.CDL=Kongon zaire
-currenciesDisplayName.CDG=Kongon tasavallan frangi
-currenciesDisplayName.CDF=Kongon kongolainen frangi
-currenciesDisplayName.FJD=Fid\u017ein dollari
+currenciesDisplayName.RUR=Ven\u00e4j\u00e4n rupla (1991-1998)
currenciesDisplayName.NIO=Nicaraguan cordoba oro
+currenciesDisplayName.ADP=Andorran peseta
+currenciesDisplayName.FJD=Fid\u017ein dollari
currenciesDisplayName.MOP=Macaon pataca
-currenciesDisplayName.NIG=Nicaraguan kultacordoba
+currenciesDisplayName.RUB=Ven\u00e4j\u00e4n rupla
+currenciesDisplayName.CDF=Kongon kongolainen frangi
currenciesDisplayName.NIC=Nicaraguan cordoba
-currenciesDisplayName.XTR=COMECONin siirrett\u00e4v\u00e4 rupla
-currenciesDisplayName.FIN=Suomen markka (1860-1962)
-currenciesDisplayName.FIM=Suomen markka
+currenciesDisplayName.DJF=Djiboutin frangi
+currenciesDisplayName.ECV=Ecuadorin UVC
currenciesDisplayName.SBD=Salomonsaarten dollari
+currenciesDisplayName.UZS=Uzbekistanin som
+currenciesDisplayName.ECS=Ecuadorin sucre
+currenciesDisplayName.PHP=Filippiinien peso
+currenciesDisplayName.THB=Thaimaan baht
currenciesDisplayName.LUF=Luxemburgin frangi
-currenciesDisplayName.TTO=Trinidadin ja Tobagon vanha dollari
-currenciesDisplayName.AOS=Angolan escudo
-currenciesDisplayName.AOR=Angolan kwanza reajustado (1995-1999)
-currenciesDisplayName.MNT=Mongolian tugrik
-currenciesDisplayName.HUF=Unkarin forintti
-currenciesDisplayName.BIF=Burundin frangi
-currenciesDisplayName.AON=Angolan uusi kwanza (1990-2000)
-currenciesDisplayName.AOK=Angolan kwanza (1977-1990)
+currenciesDisplayName.FIM=Suomen markka
currenciesDisplayName.TTD=Trinidadin ja Tobagon dollari
currenciesDisplayName.SZL=Swazimaan lilangeni
-currenciesDisplayName.NHF=Uusien-Hebridien CFP-frangi
-currenciesDisplayName.GBP=Iso-Britannian sterling-punta
-currenciesDisplayName.SAS=Saudi-Arabian itsen\u00e4inen rial
+currenciesDisplayName.MNT=Mongolian tugrik
currenciesDisplayName.SAR=Saudi-Arabian rial
+currenciesDisplayName.UAK=Ukrainan karbovanetz
+currenciesDisplayName.UAH=Ukrainan hryvnia
+currenciesDisplayName.HUF=Unkarin forintti
+currenciesDisplayName.COP=Kolumbian peso
+currenciesDisplayName.QAR=Qatarin rial
currenciesDisplayName.LTT=Liettuan talonas
-currenciesDisplayName.INR=Intian rupia
currenciesDisplayName.PTE=Portugalin escudo
-currenciesDisplayName.AOA=Angolan kwanza
-currenciesDisplayName.PTC=Portugalin conto
+currenciesDisplayName.AOR=Angolan kwanza reajustado (1995-1999)
+currenciesDisplayName.UYU=Uruguayn peso uruguayo
+currenciesDisplayName.GBP=Iso-Britannian sterling-punta
+currenciesDisplayName.BIF=Burundin frangi
+currenciesDisplayName.INR=Intian rupia
+currenciesDisplayName.ZRZ=Zairen zaire
+currenciesDisplayName.AON=Angolan uusi kwanza (1990-2000)
currenciesDisplayName.LTL=Liettuan liti
-currenciesDisplayName.KZT=Kazakhstanin tenge
-currenciesDisplayName.KZR=Kazakhstanin rupla
-currenciesDisplayName.VGD=Brittil\u00e4isten Neitsytsaarten dollari
-currenciesDisplayName.NGP=Nigerian punta
-currenciesDisplayName.MMX=Myanmarin dollarin FEC
+currenciesDisplayName.XFU=Ranskan UIC-frangi
+currenciesDisplayName.KZT=Kazakstanin tenge
+currenciesDisplayName.MZM=Mosambikin metical
+currenciesDisplayName.UYP=Uruguayn peso (1975-1993)
+currenciesDisplayName.AOK=Angolan kwanza (1977-1990)
+currenciesDisplayName.BUK=Burman kyat
+currenciesDisplayName.GNS=Guinean syli
+currenciesDisplayName.XFO=Ranskan kulta frangi
+currenciesDisplayName.PGK=Papua-Uuden-Guinean kina
+currenciesDisplayName.SYP=Syyrian punta
+currenciesDisplayName.MZE=Mosambikin escudo
+currenciesDisplayName.OMR=Omanin rial
currenciesDisplayName.NGN=Nigerian naira
+currenciesDisplayName.ZRN=Zairen uusi zaire
+currenciesDisplayName.AOA=Angolan kwanza
+currenciesDisplayName.CNY=Kiinan yuan renminbi
+currenciesDisplayName.MAF=Marokon frangi
+currenciesDisplayName.GNF=Guinean frangi
currenciesDisplayName.HTG=Haitin gourde
-currenciesDisplayName.SYP=Syyrian punta
-currenciesDisplayName.PSP=Palestiinan punta
-currenciesDisplayName.BHD=Bahrainin dinaari
+currenciesDisplayName.MAD=Marokon dirhami
+currenciesDisplayName.TRY=Turkin uusi liira
currenciesDisplayName.MMK=Myanmarin kyat
+currenciesDisplayName.MYR=Malesian ringgit
+currenciesDisplayName.LSL=Lesothon loti
+currenciesDisplayName.XEU=Euroopan valuuttayksikk\u00f6
+currenciesDisplayName.BHD=Bahrainin dinaari
+currenciesDisplayName.SLL=Sierra Leonen leone
+currenciesDisplayName.BTN=Bhutanin ngultrum
+currenciesDisplayName.TRL=Turkin liira
+currenciesDisplayName.KMF=Komorien frangi
currenciesDisplayName.ANG=Alankomaiden Antillien guldeni
currenciesDisplayName.CZK=T\u0161ekin koruna
-currenciesDisplayName.IMP=Mansaaren sterling-punta
-currenciesDisplayName.BGX=Bulgarian lev FEC
-currenciesDisplayName.LSL=Lesothon loti
-currenciesDisplayName.GAF=Gabonin CFA-frangi
-currenciesDisplayName.BGO=Bulgarian lev (1879-1952)
+currenciesDisplayName.AZM=Azerbaid\u017eanin manat
+currenciesDisplayName.KYD=Caymansaarten dollari
+currenciesDisplayName.GMD=Gambian dalasi
currenciesDisplayName.BGN=Bulgarian uusi lev
-currenciesDisplayName.BGM=Bulgarian sosialistinen lev
currenciesDisplayName.CAD=Kanadan dollari
+currenciesDisplayName.MXV=Meksikon UDI
currenciesDisplayName.BGL=Bulgarian kova leva
-currenciesDisplayName.TRL=Turkin liira
-currenciesDisplayName.KYD=Caymansaarten dollari
-currenciesDisplayName.CYP=Kyproksen punta
+currenciesDisplayName.VEB=Venezuelan bolivar
+currenciesDisplayName.MLF=Malin frangi
currenciesDisplayName.ILS=Israelin uusi sekeli
+currenciesDisplayName.MXP=Meksikon hopeapeso (1861-1992)
+currenciesDisplayName.PES=Perun sol
currenciesDisplayName.GYD=Guyanan dollari
-currenciesDisplayName.AMD=Armenian dram
+currenciesDisplayName.MXN=Meksikon peso
currenciesDisplayName.ILP=Israelin punta
-currenciesDisplayName.MLF=Malin frangi
-currenciesDisplayName.ILL=Israelin sekeli
-currenciesDisplayName.VEB=Venezuelan bolivar
-currenciesDisplayName.ALX=Albanian dollarin FEC
+currenciesDisplayName.SKK=Slovakin koruna
+currenciesDisplayName.CYP=Kyproksen punta
+currenciesDisplayName.XDR=erityisnosto-oikeus
+currenciesDisplayName.PEN=Perun uusi sol
currenciesDisplayName.LRD=Liberian dollari
-currenciesDisplayName.ALV=Albanian lek valute
+currenciesDisplayName.PEI=Perun inti
+currenciesDisplayName.AMD=Armenian dram
+currenciesDisplayName.BSD=Bahaman dollari
currenciesDisplayName.HRK=Kroatian kuna
-currenciesDisplayName.REF=Reunionin frangi
+currenciesDisplayName.CLP=Chilen peso
currenciesDisplayName.HRD=Kroatian dinaari
-currenciesDisplayName.ALL=Albanian lek
-currenciesDisplayName.JEP=Jerseyn sterling-punta
-currenciesDisplayName.ALK=Albanian lek (1946-1961)
-currenciesDisplayName.MKN=Makedonian dinaari (1992-1993)
-currenciesDisplayName.VDP=Pohjois-Vietnamin viet minh piastre dong viet
-currenciesDisplayName.VDN=Pohjois-Vietnamin uusi dong
-currenciesDisplayName.MKD=Makedonian dinaari
-currenciesDisplayName.VDD=Pohjois-Vietnamin piastre dong viet
-currenciesDisplayName.TPP=Timorin pataca
currenciesDisplayName.XPF=CFP-frangi
-currenciesDisplayName.BEL=Belgian frangi (rahoitus)
-currenciesDisplayName.GWP=Guinea-Bissaun peso
-currenciesDisplayName.KWD=Kuwaitin dinaari
-currenciesDisplayName.GWM=Portugalin Guinean mil reis
-currenciesDisplayName.BEF=Belgian frangi
+currenciesDisplayName.FRF=Ranskan frangi
+currenciesDisplayName.BRR=Brasilian cruzeiro
+currenciesDisplayName.MKD=Makedonian dinaari
+currenciesDisplayName.CLF=Chilen unidades de fomento
+currenciesDisplayName.ALL=Albanian lek
+currenciesDisplayName.BRN=Brasilian uusi cruzado
+currenciesDisplayName.MWK=Malawin kwacha
+currenciesDisplayName.BRL=Brasilian real
currenciesDisplayName.TPE=Timorin escudo
-currenciesDisplayName.BEC=Belgian frangi (vaihdettava)
-currenciesDisplayName.GWE=Portugalin Guinean escudo
+currenciesDisplayName.BRE=Brasilian cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Brasilian cruzado
+currenciesDisplayName.BRB=Brasilian uusi cruzeiro (1967-1986)
+currenciesDisplayName.DEM=Saksan markka
+currenciesDisplayName.KWD=Kuwaitin dinaari
+currenciesDisplayName.XCD=It\u00e4-Karibian dollari
+currenciesDisplayName.NPR=Nepalin rupia
+currenciesDisplayName.GWP=Guinea-Bissaun peso
+currenciesDisplayName.YUN=Jugoslavian vaihdettava dinaari
currenciesDisplayName.SVC=El Salvadorin colon
-currenciesDisplayName.CWG=Curacaon guldeni
-currenciesDisplayName.BDT=Bangladeshin taka
-currenciesDisplayName.TOS=Tongan sterling-punta
-currenciesDisplayName.TOP=Tongan pa\u02bbanga
+currenciesDisplayName.YUM=Jugoslavian uusi dinaari
+currenciesDisplayName.BEL=Belgian frangi (rahoitus)
+currenciesDisplayName.SIT=Slovenian tolar
+currenciesDisplayName.JPY=Japanin jeni
currenciesDisplayName.XOF=CFA-frangi BCEAO
+currenciesDisplayName.MVR=Malediivien rufiyaa
+currenciesDisplayName.GWE=Portugalin Guinean escudo
+currenciesDisplayName.BEF=Belgian frangi
+currenciesDisplayName.TOP=Tongan pa\u02bbanga
+currenciesDisplayName.YUD=Jugoslavian kova dinaari
+currenciesDisplayName.BEC=Belgian frangi (vaihdettava)
currenciesDisplayName.SUR=Neuvostoliiton rupla
-currenciesDisplayName.SUN=Neuvostoliiton uusi rupla
-currenciesDisplayName.NCF=Uuden-Kaledonian franc germinal
-currenciesDisplayName.CVE=Kap Verden escudo
-currenciesDisplayName.XNF=Ranskan Antillien CFA-frangi
+currenciesDisplayName.ROL=Romanian lei
+currenciesDisplayName.DDM=It\u00e4-Saksan ostmark
+currenciesDisplayName.BDT=Bangladeshin taka
+currenciesDisplayName.XBD=EUA (XBD)
+currenciesDisplayName.AWG=Aruban guldeni
+currenciesDisplayName.XBC=EUA (XBC)
+currenciesDisplayName.XBB=Euroopan rahayksikk\u00f6 (EMU)
+currenciesDisplayName.XBA=EURCO
+currenciesDisplayName.NOK=Norjan kruunu
+currenciesDisplayName.MUR=Mauritiuksen rupia
currenciesDisplayName.ZAR=Etel\u00e4-Afrikan randi
-currenciesDisplayName.DOP=Dominikaanisen tasavallan peso
-currenciesDisplayName.CUX=Kuuban FEC
-currenciesDisplayName.ZAP=Etel\u00e4-Afrikan punta
+currenciesDisplayName.SHP=Saint Helenan punta
+currenciesDisplayName.XAU=kulta
currenciesDisplayName.ZAL=Etel\u00e4-Afrikan randi (rahoitus)
+currenciesDisplayName.VND=Vietnamin dong
+currenciesDisplayName.TZS=Tansanian shillinki
+currenciesDisplayName.GIP=Gibraltarin punta
currenciesDisplayName.TND=Tunisian dinaari
-currenciesDisplayName.CUP=Kuuban peso
-currenciesDisplayName.GUF=Ranskan Guyanan franc guiana
+currenciesDisplayName.CVE=Kap Verden escudo
currenciesDisplayName.UGX=Ugandan shillinki
-currenciesDisplayName.LNR=Ceylonin rupia
-currenciesDisplayName.AIF=Affarsin ja Issasin frangi
-currenciesDisplayName.VAL=Vatikaanin kaupungin liira
-currenciesDisplayName.STE=S\u00e3o Tom\u00e9n ja Princip\u00e9n escudo
+currenciesDisplayName.ZMK=Sambian kwacha
+currenciesDisplayName.JOD=Jordanian dinaari
+currenciesDisplayName.XAF=CFA-frangi BEAC
+currenciesDisplayName.LBP=Libanonin punta
currenciesDisplayName.UGS=Ugandan shillinki (1966-1987)
currenciesDisplayName.STD=S\u00e3o Tom\u00e9n ja Princip\u00e9n dobra
-currenciesDisplayName.MHD=Marshallinsaarten dollari
-currenciesDisplayName.NZP=Uuden-Seelannin punta
currenciesDisplayName.WST=L\u00e4nsi-Samoan tala
-currenciesDisplayName.WSP=L\u00e4nsi-Samoan punta
-currenciesDisplayName.HNL=Hondurasin lempira
-currenciesDisplayName.XMF=Ranskan em\u00e4maan uusi frangi
+currenciesDisplayName.KHR=Kambod\u017ean riel
+currenciesDisplayName.EUR=euro
+currenciesDisplayName.DOP=Dominikaanisen tasavallan peso
+currenciesDisplayName.BOV=Bolivian mvdol
+currenciesDisplayName.MTP=Maltan punta
+currenciesDisplayName.USS=Yhdysvaltain dollari (sama p\u00e4iv\u00e4)
+currenciesDisplayName.BOP=Bolivian peso
+currenciesDisplayName.MTL=Maltan liira
+currenciesDisplayName.CUP=Kuuban peso
currenciesDisplayName.TMM=Turkmenistanin manat
-currenciesDisplayName.GTQ=Guatemalan quetzal
+currenciesDisplayName.USN=Yhdysvaltain dollari (seuraava p\u00e4iv\u00e4)
+currenciesDisplayName.SGD=Singaporen dollari
currenciesDisplayName.NZD=Uuden-Seelannin dollari
-currenciesDisplayName.SSP=Skotlannin punta
-currenciesDisplayName.BBD=Barbadosin dollari
+currenciesDisplayName.USD=Yhdysvaltain dollari
+currenciesDisplayName.HNL=Hondurasin lempira
+currenciesDisplayName.BOB=boliviano
+currenciesDisplayName.ITL=Italian liira
+currenciesDisplayName.PAB=Panaman balboa
+currenciesDisplayName.GTQ=Guatemalan quetzal
+currenciesDisplayName.LAK=Laosin kip
+currenciesDisplayName.GHC=Ghanan cedi
+currenciesDisplayName.AUD=Australian dollari
currenciesDisplayName.NAD=Namibian dollari
+currenciesDisplayName.KGS=Kirgistanin som
currenciesDisplayName.MGF=Madagaskarin frangi
+currenciesDisplayName.CHF=Sveitsin frangi
+currenciesDisplayName.BBD=Barbadosin dollari
currenciesDisplayName.MGA=Madagaskarin ariary
-currenciesDisplayName.EGP=Egyptin punta
-currenciesDisplayName.BZH=Brittil\u00e4isen Hondurasin dollari
+currenciesDisplayName.PYG=Paraguayn guarani
currenciesDisplayName.PLZ=Puolan zloty (1950-1995)
-currenciesDisplayName.BAN=Bosnia-Hertsegovinan uusi dinaari
-currenciesDisplayName.PLX=Puolan US-dollarin FEC
-currenciesDisplayName.BAM=Bosnia-Hertsegovinan vaihdettava markka
-currenciesDisplayName.BZD=Belizen dollari
-currenciesDisplayName.BAD=Bosnia-Hertsegovinan dinaari
-currenciesDisplayName.PLN=Puolan zloty
currenciesDisplayName.YER=Jemenin rial
+currenciesDisplayName.ATS=It\u00e4vallan shillinki
+currenciesDisplayName.ETB=Etiopian birr
+currenciesDisplayName.BND=Brunein dollari
+currenciesDisplayName.JMD=Jamaikan dollari
+currenciesDisplayName.EGP=Egyptin punta
+currenciesDisplayName.PLN=Puolan zloty
+currenciesDisplayName.DZD=Algerian dinaari
+currenciesDisplayName.ISK=Islannin kruunu
currenciesDisplayName.SRG=Surinamin guldeni
-currenciesDisplayName.CSK=T\u0161ekkoslovakian kova koruna
+currenciesDisplayName.LYD=Libyan dinaari
+currenciesDisplayName.BZD=Belizen dollari
+currenciesDisplayName.BAM=Bosnia-Hertsegovinan vaihdettava markka
+currenciesDisplayName.ESP=Espanjan peseta
currenciesDisplayName.KRW=Etel\u00e4-Korean won
+currenciesDisplayName.NLG=Alankomaiden guldeni
+currenciesDisplayName.MRO=Mauritanian ouguiya
+currenciesDisplayName.BAD=Bosnia-Hertsegovinan dinaari
+currenciesDisplayName.ZWD=Zimbabwen dollari
+currenciesDisplayName.SEK=Ruotsin kruunu
+currenciesDisplayName.CSK=T\u0161ekkoslovakian kova koruna
currenciesDisplayName.BYR=Valko-Ven\u00e4j\u00e4n rupla
-currenciesDisplayName.YEI=Jemenin imadi rial
-currenciesDisplayName.BYL=Valko-Ven\u00e4j\u00e4n rupla (1992-1994)
-currenciesDisplayName.CSC=T\u0161ekkoslovakian koruna
-currenciesDisplayName.KRO=Etel\u00e4-Korean vanha won
-currenciesDisplayName.KRH=Etel\u00e4-Korean hwan
-currenciesDisplayName.BYB=Valko-Ven\u00e4j\u00e4n uusi rupla (1994-1999)
-currenciesDisplayName.SQS=Somalimaan shillinki
-currenciesDisplayName.GRN=Kreikan uusi drakhma
+currenciesDisplayName.IRR=Iranin rial
currenciesDisplayName.PKR=Pakistanin rupia
-currenciesDisplayName.AFN=Afgaani
-currenciesDisplayName.ZWD=Zimbabwen dollari
-currenciesDisplayName.LKR=Sri Lankan rupia
-currenciesDisplayName.GRD=Kreikan drakhma
-currenciesDisplayName.IEP=Irlannin punta
-currenciesDisplayName.AFA=Afgaani (1927-2002)
-currenciesDisplayName.YDD=Jemenin dinaari
-currenciesDisplayName.RWF=Ruandan frangi
-currenciesDisplayName.CRC=Costa Rican colon
-currenciesDisplayName.TJS=Tad\u017eikistanin somoni
-currenciesDisplayName.TJR=Tad\u017eikistanin rupla
-currenciesDisplayName.EEK=Viron kruunu
-currenciesDisplayName.GQP=P\u00e4iv\u00e4ntasaajan Guinean peseta guineana
-currenciesDisplayName.MDR=Moldovan kuponkirupla
-currenciesDisplayName.HKD=Hong Kongin dollari
-currenciesDisplayName.DKK=Tanskan kruunu
-currenciesDisplayName.MDL=Moldovan leu
-currenciesDisplayName.GQF=P\u00e4iv\u00e4ntasaajan Guinean frangi
-currenciesDisplayName.GQE=P\u00e4iv\u00e4ntasaajan Guinean ekwele guineana
-currenciesDisplayName.IDR=Indonesian rupia
-currenciesDisplayName.AED=Arabiemiirikuntien dirhami
-currenciesDisplayName.KPW=Pohjois-Korean won
-currenciesDisplayName.IDN=Indonesian uusi rupia
-currenciesDisplayName.BWP=Botswanan pula
-currenciesDisplayName.MDC=Moldovan kuponkileu
-currenciesDisplayName.IDJ=Indonesian java rupia
-currenciesDisplayName.KPP=Pohjois-Korean kansan won
-currenciesDisplayName.IDG=Indonesian nica guldeni
-currenciesDisplayName.VUV=Vanuatun vatu
-currenciesDisplayName.XID=Islamin dinaari
-currenciesDisplayName.SOS=Somalin shillinki
-currenciesDisplayName.ADP=Andorran peseta
-currenciesDisplayName.RUR=Ven\u00e4j\u00e4n rupla (1991-1998)
-currenciesDisplayName.GPF=Guadeloupen frangi
-currenciesDisplayName.DJF=Djiboutin frangi
-currenciesDisplayName.ADD=Andorran dinaari
-currenciesDisplayName.MCG=Monacon franc germinal
-currenciesDisplayName.MCF=Monacon uusi frangi
-currenciesDisplayName.ECV=Ecuadorin UVC
-currenciesDisplayName.ECS=Ecuadorin sucre
-currenciesDisplayName.LIF=Liechtensteinin frangi
-currenciesDisplayName.RUB=Ven\u00e4j\u00e4n rupla
-currenciesDisplayName.PHP=Filippiinien peso
-currenciesDisplayName.UZS=Uzbekistanin som
-currenciesDisplayName.COP=Kolumbian peso
-currenciesDisplayName.THB=Thaimaan baht
-currenciesDisplayName.IBP=Pohjois-Irlannin punta
-currenciesDisplayName.BUR=Burman rupia
-currenciesDisplayName.COF=Kongon CFA-frangi
-currenciesDisplayName.BUK=Burman kyat
-currenciesDisplayName.COB=Kolumbian paperipeso
-currenciesDisplayName.UZC=Uzbekistanin kuponkisom
-currenciesDisplayName.UAK=Ukrainan karbovanetz
-currenciesDisplayName.QAR=Qatarin rial
-currenciesDisplayName.UAH=Ukrainan hryvnia
-currenciesDisplayName.GNS=Guinean syli
-currenciesDisplayName.CNY=Kiinan yuan renminbi
-currenciesDisplayName.MZM=Mosambikin metical
-currenciesDisplayName.CNX=Kiinan US-dollarin FEC
-currenciesDisplayName.UYU=Uruguayn peso uruguayo
-currenciesDisplayName.GNI=Guinean frangi (1960-1972)
-currenciesDisplayName.SML=San Marinon liira
-currenciesDisplayName.CNP=Kiinan jen min piao yuan
-currenciesDisplayName.MZE=Mosambikin escudo
-currenciesDisplayName.GNF=Guinean frangi
-currenciesDisplayName.OMS=Omanin rial saidi
-currenciesDisplayName.PGK=Papua-Uuden-Guinean kina
-currenciesDisplayName.OMR=Omanin rial
-currenciesDisplayName.UYP=Uruguayn peso (1975-1993)
-currenciesDisplayName.XFU=Ranskan UIC-frangi
-currenciesDisplayName.BTR=Bhutanin rupia
-currenciesDisplayName.ZRZ=Zairen zaire
-currenciesDisplayName.MAF=Marokon frangi
-currenciesDisplayName.MAD=Marokon dirhami
-currenciesDisplayName.BTN=Bhutanin ngultrum
-currenciesDisplayName.XFO=Ranskan kulta frangi
-currenciesDisplayName.UYF=Uruguayn peso fuerte
-currenciesDisplayName.MYR=Malesian ringgit
-currenciesDisplayName.ZRN=Zairen uusi zaire
-currenciesDisplayName.AZM=Azerbaid\u017eanin manat
-currenciesDisplayName.GMP=Gambian punta
-currenciesDisplayName.KMF=Komorien frangi
-currenciesDisplayName.SLL=Sierra Leonen leone
-currenciesDisplayName.GMD=Gambian dalasi
-currenciesDisplayName.XEU=Euroopan valuuttayksikk\u00f6
-currenciesDisplayName.BSP=Bahaman punta
-currenciesDisplayName.CMF=Kamerunin CFA-frangi
-currenciesDisplayName.MXV=Meksikon UDI
-currenciesDisplayName.XEF=CFA-frangi BCEAEC
-currenciesDisplayName.BSD=Bahaman dollari
-currenciesDisplayName.MXP=Meksikon hopeapeso (1861-1992)
-currenciesDisplayName.MXN=Meksikon peso
-currenciesDisplayName.PES=Perun sol
-currenciesDisplayName.GLK=Gr\u00f6nlannin kruunu
-currenciesDisplayName.BRZ=Brazilian cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Perun uusi sol
-currenciesDisplayName.CLP=Chilen peso
-currenciesDisplayName.SKK=Slovakin koruna
-currenciesDisplayName.PEI=Perun inti
-currenciesDisplayName.BRR=Brasilian cruzeiro
-currenciesDisplayName.XDR=Erityiset nosto-oikeudet
-currenciesDisplayName.FRG=Ranskan franc germinal/franc poincare
-currenciesDisplayName.FRF=Ranskan frangi
-currenciesDisplayName.BRN=Brasilian uusi cruzado
-currenciesDisplayName.CLF=Chilen unidades de fomento
-currenciesDisplayName.CLE=Chilen escudo
-currenciesDisplayName.BRL=Brasilian real
-currenciesDisplayName.CLC=Chilen condor
-currenciesDisplayName.BRE=Brasilian cruzeiro (1990-1993)
-currenciesDisplayName.DES=Saksan sperrmark
-currenciesDisplayName.MWP=Malawin punta
-currenciesDisplayName.BRC=Brasilian cruzado
-currenciesDisplayName.BRB=Brasilian uusi cruzeiro (1967-1986)
-currenciesDisplayName.MWK=Malawin kwacha
-currenciesDisplayName.PDR=Transdniestrian rupla
-currenciesDisplayName.DEM=Saksan markka
-currenciesDisplayName.TDF=T\u0161adin CFA-frangi
-currenciesDisplayName.PDN=Transdniestrian uusi rupla
-currenciesDisplayName.PDK=Transdniestrian kuponkirupla
-currenciesDisplayName.NPR=Nepalin rupia
-currenciesDisplayName.CKD=Cookinsaarten dollari
-currenciesDisplayName.JPY=Japanin jeni
-currenciesDisplayName.MVR=Malediivien rufiyaa
-currenciesDisplayName.XCF=CFA uusi frangi
-currenciesDisplayName.MVP=Malediivien rupia
-currenciesDisplayName.XCD=It\u00e4-Karibian dollari
-currenciesDisplayName.SIT=Slovenian tolar
-currenciesDisplayName.YUR=Jugoslavian uudistettu dinaari
-currenciesDisplayName.AWG=Aruban guldeni
-currenciesDisplayName.YUO=Jugoslavian lokakuun dinaari
-currenciesDisplayName.DDM=It\u00e4-Saksan ostmark
-currenciesDisplayName.YUN=Jugoslavian vaihdettava dinaari
-currenciesDisplayName.YUM=Jugoslavian uusi dinaari
-currenciesDisplayName.TCC=Turks- ja Caicossaarten crown
-currenciesDisplayName.YUG=Jugoslavian 1994 dinaari
-currenciesDisplayName.YUF=Jugoslavian liittovaltion dinaari
-currenciesDisplayName.RON=Romanian uusi lei
-currenciesDisplayName.YUD=Jugoslavian kova dinaari
-currenciesDisplayName.ROL=Romanian lei
-currenciesDisplayName.SIB=Slovenian tolar bons
-currenciesDisplayName.NOK=Norjan kruunu
-currenciesDisplayName.MUR=Mauritiuksen rupia
-currenciesDisplayName.XBD=EUA (XBD)
-currenciesDisplayName.GIP=Gibraltarin punta
-currenciesDisplayName.VNS=Vietnamin kansallinen dong
-currenciesDisplayName.XBC=EUA (XBC)
-currenciesDisplayName.VNR=Vietnamin tasavallan dong
-currenciesDisplayName.XBB=Euroopan rahayksikk\u00f6 (EMU)
-currenciesDisplayName.XBA=EURCO
-currenciesDisplayName.KID=Kiribatin dollari
-currenciesDisplayName.SHP=Saint Helenan punta
-currenciesDisplayName.VNN=Vietnamin uusi dong
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Bermudan dollari
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=mk
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.FIM=mk
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.CNP=CNP
-currenciesSymbol.MZE=MZE
currenciesSymbol.GNF=GF
-currenciesSymbol.OMS=OMS
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=tammi®helmi®maalis®huhti®touko®kes\u00e4®hein\u00e4®elo®syys®loka®marras®joulu®®
months=tammikuu®helmikuu®maaliskuu®huhtikuu®toukokuu®kes\u00e4kuu®hein\u00e4kuu®elokuu®syyskuu®lokakuu®marraskuu®joulukuu®®
shortWeekdays=®su®ma®ti®ke®to®pe®la®
weekdays=®sunnuntai®maanantai®tiistai®keskiviikko®torstai®perjantai®lauantai®
minNumberOfDaysInFirstWeek=4
firstDayOfWeek=mon
-eras=eaa.®jaa.®
-ampms=ap.®ip.®
+eras=eKr.®jKr.®
+ampms=epp.®jpp.®
shortDateFormat=d.M.yyyy
mediumDateFormat=d.M.yyyy
longDateFormat=d. MMMM'ta 'yyyy
-fullDateFormat=d. MMMM'ta 'yyyy
+fullDateFormat=EEEE'na 'd. MMMM'ta 'yyyy
shortTimeFormat=H.mm
mediumTimeFormat=H.mm.ss
-longTimeFormat=H.mm.ss z
+longTimeFormat='klo 'H.mm.ss
fullTimeFormat=H.mm.ss z
-zoneStrings=America/Indianapolis®EST®It\u00e4inen normaaliaika®EST®It\u00e4inen normaaliaika®©America/Halifax®AST®Atlantin normaaliaika®ADT®Atlantin kes\u00e4aika®©Pacific/Honolulu®HST®Havaijin normaaliaika®HST®Havaijin normaaliaika®©America/Denver®MST®Kalliovuorten normaaliaika®MDT®Kalliovuorten kes\u00e4aika®©America/Anchorage®AST®Alaskan normaaliaika®ADT®Alaskan kes\u00e4aika®©America/St_Johns®CNT®Newfoundlandin normaaliaika®CDT®Newfoundlandin kes\u00e4aika®©Africa/Casablanca®GMT®Greenwichin aika®GMT®Greenwichin aika®©America/Chicago®CST®Keskinen normaaliaika®CDT®Keskinen kes\u00e4aika®©Asia/Shanghai®CTT®Kiinan normaaliaika®CDT®Kiinan normaaliaika®©Asia/Tokyo®JST®Japanin normaaliaika®JST®Japanin normaaliaika®©America/New_York®EST®It\u00e4inen normaaliaika®EDT®It\u00e4inen kes\u00e4aika®©Europe/Bucharest®EET®It\u00e4-Euroopan normaaliaika®EEST®It\u00e4-Euroopan kes\u00e4aika®©America/Los_Angeles®PST®Tyynenmeren normaaliaika®PDT®Tyynenmeren kes\u00e4aika®©America/Phoenix®MST®Kalliovuorten normaaliaika®MST®Kalliovuorten normaaliaika®©Etc/GMT®GMT®Greenwichin aika®GMT®Greenwichin aika®©Asia/Jerusalem®IST®Israelin normaaliaika®IDT®Israelin kes\u00e4aika®©Europe/Paris®CET®Keski-Euroopan normaaliaika®CEST®Keski-Euroopan kes\u00e4aika®©
-territories.TL=Timor-Leste
+zoneStrings=Pacific/Honolulu®HST®Havaijin normaaliaika®HST®Havaijin normaaliaika®©Europe/Bucharest®EET®It\u00e4-Euroopan normaaliaika®EEST®It\u00e4-Euroopan kes\u00e4aika®©America/Los_Angeles®PST®Yhdysvaltain Tyynenmeren normaaliaika®PDT®Yhdysvaltain Tyynenmeren kes\u00e4aika®©America/Denver®MST®Kalliovuorten normaaliaika®MDT®Kalliovuorten kes\u00e4aika®©Asia/Jerusalem®IST®Israelin normaaliaika®IDT®Israelin kes\u00e4aika®©America/Phoenix®MST®Kalliovuorten normaaliaika®MST®Kalliovuorten normaaliaika®©America/Chicago®CST®Yhdysvaltain keskinen normaaliaika>®CDT®Yhdysvaltain keskinen kes\u00e4aika®©America/Indianapolis®EST®Yhdysvaltain it\u00e4inen normaaliaika®EST®Yhdysvaltain it\u00e4inen normaaliaika®©America/St_Johns®CNT®Newfoundlandin normaaliaika®CDT®Newfoundlandin kes\u00e4aika®©America/Anchorage®AST®Alaskan normaaliaika®ADT®Alaskan kes\u00e4aika®©Asia/Shanghai®CTT®Kiinan normaaliaika®CTT®Kiinan normaaliaika®©Asia/Tokyo®JST®Japanin normaaliaika®JST®Japanin normaaliaika®©Europe/Paris®CET®Keski-Euroopan normaaliaika®CEST®Keski-Euroopan kes\u00e4aika®©America/New_York®EST®Yhdysvaltain it\u00e4inen normaaliaika®EDT®Yhdysvaltain it\u00e4inen kes\u00e4aika®©America/Halifax®AST®Kanadan Atlantin normaaliaika®ADT®Kanadan Atlantin kes\u00e4aika®©Africa/Casablanca®GMT®Greenwichin aika®GMT®Greenwichin aika®©
+territories.TL=It\u00e4-Timor
territories.TK=Tokelau
territories.TJ=Tad\u017eikistan
territories.TH=Thaimaa
territories.TG=Togo
-territories.TF=Ranskan etel\u00e4iset alueet
+territories.TF=Ranskan ulkopuoliset etel\u00e4iset alueet
territories.GY=Guyana
territories.TD=T\u0161ad
territories.TC=Turks- ja Caicossaaret
@@ -802,10 +392,12 @@ territories.GN=Guinea
territories.GM=Gambia
territories.GL=Gr\u00f6nlanti
territories.SV=El Salvador
+territories.062=etel\u00e4inen Keski-Aasia
territories.ST=S\u00e3o Tom\u00e9 ja Pr\u00edncipe
+territories.061=Polynesia
territories.GI=Gibraltar
territories.GH=Ghana
-territories.SR=Suriname
+territories.SR=Surinam
territories.GF=Ranskan Guayana
territories.GE=Georgia
territories.SO=Somalia
@@ -826,9 +418,12 @@ territories.SC=Seychellit
territories.SB=Salomonsaaret
territories.SA=Saudi-Arabia
territories.FR=Ranska
+territories.057=Mikronesia
territories.FO=F\u00e4rsaaret
territories.FM=Mikronesia
territories.RW=Ruanda
+territories.054=Melanesia
+territories.053=Australia ja Uusi-Seelanti
territories.FK=Falklandinsaaret
territories.RU=Ven\u00e4j\u00e4
territories.FJ=Fid\u017ei
@@ -838,20 +433,26 @@ territories.RE=R\u00e9union
territories.ET=Etiopia
territories.ES=Espanja
territories.ER=Eritrea
+territories.833=Mansaari
territories.EH=L\u00e4nsi-Sahara
territories.EG=Egypti
+territories.830=Kanaalisaaret
territories.EE=Viro
+territories.QO=tuntematon
territories.EC=Ecuador
territories.DZ=Algeria
territories.QA=Qatar
+territories.039=Etel\u00e4-Eurooppa
territories.DO=Dominikaaninen tasavalta
territories.PY=Paraguay
+territories.035=Kaakkois-Aasia
territories.DM=Dominica
territories.PW=Palau
territories.DK=Tanska
territories.DJ=Djibouti
territories.PT=Portugali
territories.PS=Palestiina
+territories.030=It\u00e4-Aasia
territories.PR=Puerto Rico
territories.DE=Saksa
territories.PN=Pitcairn
@@ -868,17 +469,20 @@ territories.CX=Joulusaari
territories.CV=Kap Verde
territories.PA=Panama
territories.CU=Kuuba
+territories.CS=Serbia ja Montenegro
territories.CR=Costa Rica
+territories.029=Karibia
territories.CO=Kolumbia
territories.CN=Kiina
territories.CM=Kamerun
territories.CL=Chile
territories.CK=Cookinsaaret
territories.CI=Norsunluurannikko
+territories.021=Pohjois-Amerikka
territories.CH=Sveitsi
-territories.CG=Kongo
+territories.CG=Kongo (Brazzaville)
territories.CF=Keski-Afrikan tasavalta
-territories.CD=Kongon demokraattinen tasavalta
+territories.CD=Kongo (Kinshasa)
territories.CC=Kookossaaret
territories.OM=Oman
territories.CA=Kanada
@@ -889,13 +493,20 @@ territories.BV=Bouvet\u2019nsaari
territories.BT=Bhutan
territories.BS=Bahama
territories.BR=Brasilia
+territories.019=Amerikka
+territories.018=etel\u00e4inen Afrikka
territories.NZ=Uusi-Seelanti
territories.BO=Bolivia
+territories.017=Keski-Afrikka
territories.BN=Brunei
territories.BM=Bermuda
+territories.015=Pohjois-Afrikka
+territories.014=It\u00e4-Afrikka
+territories.013=V\u00e4li-Amerikka
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=L\u00e4nsi-Afrikka
territories.BH=Bahrain
territories.NR=Nauru
territories.BG=Bulgaria
@@ -913,6 +524,7 @@ territories.NG=Nigeria
territories.NF=Norfolkinsaari
territories.AZ=Azerbaid\u017ean
territories.NE=Niger
+territories.AX=Ahvenanmaa
territories.NC=Uusi-Kaledonia
territories.AW=Aruba
territories.ZM=Sambia
@@ -921,19 +533,23 @@ territories.AU=Australia
territories.AT=It\u00e4valta
territories.AS=Amerikan Samoa
territories.AR=Argentiina
+territories.009=Oseania
territories.AQ=Antarktis
territories.MZ=Mosambik
territories.AO=Angola
territories.MY=Malesia
territories.AN=Alankomaiden Antillit
territories.MX=Meksiko
+territories.005=Etel\u00e4-Amerikka
territories.AM=Armenia
territories.MW=Malawi
territories.AL=Albania
territories.MV=Malediivit
territories.ZA=Etel\u00e4-Afrikka
territories.MU=Mauritius
+territories.002=Afrikka
territories.MT=Malta
+territories.001=maailma
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauritania
@@ -942,13 +558,12 @@ territories.MQ=Martinique
territories.AF=Afganistan
territories.MP=Pohjois-Mariaanit
territories.AE=Arabiemiirikunnat
-territories.MO=Macaon erityishallintoalue
+territories.MO=Macao, Kiinan erityishallintoalue
territories.AD=Andorra
territories.MN=Mongolia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Makedonia
-territories.YU=Jugoslavia
territories.YT=Mayotte
territories.MH=Marshallinsaaret
territories.MG=Madagaskar
@@ -958,10 +573,14 @@ territories.MA=Marokko
territories.YE=Jemen
territories.LY=Libya
territories.LV=Latvia
+territories.155=L\u00e4nsi-Eurooppa
territories.LU=Luxemburg
+territories.154=Pohjois-Eurooppa
territories.LT=Liettua
territories.LS=Lesotho
territories.LR=Liberia
+territories.151=It\u00e4-Eurooppa
+territories.150=Eurooppa
territories.LK=Sri Lanka
territories.LI=Liechtenstein
territories.LC=Saint Lucia
@@ -970,6 +589,8 @@ territories.LA=Laos
territories.KZ=Kazakstan
territories.KY=Caymansaaret
territories.KW=Kuwait
+territories.145=L\u00e4nsi-Aasia
+territories.142=Aasia
territories.KR=Korean tasavalta
territories.KP=Pohjois-Korea
territories.KN=Saint Kitts ja Nevis
@@ -989,7 +610,7 @@ territories.VI=Yhdysvaltain Neitsytsaaret
territories.VG=Brittil\u00e4iset Neitsytsaaret
territories.VE=Venezuela
territories.VC=Saint Vincent ja Grenadiinit
-territories.VA=Vatikaani
+territories.VA=Vatikaanivaltio
territories.IT=Italia
territories.IS=Islanti
territories.IR=Iran
@@ -1010,39 +631,39 @@ territories.HT=Haiti
territories.HR=Kroatia
territories.TZ=Tansania
territories.HN=Honduras
-territories.HM=Heard ja McDonaldinsaaret
+territories.HM=Heard- ja McDonaldinsaaret
territories.TW=Taiwan
territories.TV=Tuvalu
-territories.HK=Hongkongin erityishallintoalue
+territories.HK=Hongkong, Kiinan erityishallintoalue
territories.TT=Trinidad ja Tobago
territories.TR=Turkki
territories.TO=Tonga
territories.TN=Tunisia
territories.TM=Turkmenistan
-languages.gwi=gwit\u015fin
languages.akk=akkadi
+languages.gwi=gwich\u2019in
languages.eka=ekajuk
-languages.xh=kafferi
+languages.xh=xhosa
languages.sux=sumeri
languages.sus=susu
-languages.mis=sekalaiset kielet
+languages.mis=luokittelemattomat kielet
languages.loz=lozi
-languages.tog=tonga
+languages.tog=tonga (Malawi)
languages.pon=pohnpei
languages.min=minangkabau
languages.suk=sukuma
languages.wo=wolof
-languages.lol=mongo
languages.kut=kutenai
+languages.lol=mongo
languages.mic=micmac
languages.wa=valloni
-languages.kum=kumukki
-languages.zap=zapoteekki
-languages.cus=muut kuusilaiset kielet
-languages.jbo=lojba
+languages.kum=kumykki
+languages.zap=sapoteekki
+languages.cus=muut kuu\u0161ilaiset kielet
languages.doi=dogri
+languages.jbo=lojban
languages.vo=volap\u00fck
-languages.oto=otomangelaiset kielet
+languages.oto=otomi-kielet
languages.vi=vietnam
languages.rar=rarotonga
languages.ve=venda
@@ -1050,11 +671,11 @@ languages.rap=rapanui
languages.raj=rajasthani
languages.ota=osmani
languages.nzi=nzima
-languages.nap=napolin italia
+languages.nap=napoli
languages.uz=uzbekki
languages.uga=ugarit
-languages.tmh=tama\u0161ek
-languages.nai=muut Pohjois-Amerikan intiaanikielet
+languages.tmh=tamashek
+languages.nai=Pohjois-Amerikan intiaanikielet
languages.nah=nahuatl
languages.ur=urdu
languages.fat=fanti
@@ -1062,9 +683,9 @@ languages.uk=ukraina
languages.egy=muinaisegypti
languages.ug=uiguuri
languages.fan=fang
-languages.ssa=muut nilosaharalaiset kielet
-languages.mga=keski-iiri
+languages.ssa=muut niilil\u00e4is-saharalaiset kielet
languages.bat=muut balttilaiset kielet
+languages.mga=keski-iiri
languages.nyo=nyoro
languages.bas=basa
languages.nyn=nyankole
@@ -1072,36 +693,37 @@ languages.nym=nyamwezi
languages.hmn=hmong
languages.ban=bali
languages.osa=osage
-languages.bal=balut\u0161i
+languages.bal=belut\u0161i
languages.ty=tahiti
-languages.bai=bamileke
+languages.bai=bamileke-kielet
languages.tw=twi
languages.srr=serer
languages.tli=tlingit
+languages.tlh=klingon
languages.tt=tataari
languages.ts=tsonga
languages.bad=banda
languages.tr=turkki
-languages.to=Tonga-saarten tonga
+languages.to=tonga (Tonga)
languages.tn=tswana
languages.tl=tagalog
languages.tk=turkmeeni
-languages.ti=tigrinja
+languages.ti=tigrinya
languages.th=thai
languages.kru=kurukh
languages.tg=tad\u017eikki
languages.byn=blin
languages.te=telugu
+languages.csb=ka\u0161ubi
languages.kro=kru-kielet
-languages.csb=kashubi
-languages.ta=tamili
+languages.ta=tamil
languages.tkl=tokelau
languages.efi=efik
-languages.sw=suahili
+languages.sw=swahili
languages.sv=ruotsi
languages.su=sunda
-languages.krc=karachay-balkar
-languages.st=etel\u00e4sotho
+languages.krc=karat\u0161ai-balkaari
+languages.st=sotho, etel\u00e4-
languages.ss=swazi
languages.sr=serbia
languages.sq=albania
@@ -1115,44 +737,45 @@ languages.sl=sloveeni
languages.grc=muinaiskreikka
languages.sk=slovakki
languages.grb=grebo
-languages.si=singaleesi
+languages.si=sinhali
languages.sh=serbokroatia
-languages.crh=krimin turkki; krimin tataari
languages.afa=muut afroaasialaiset kielet
+languages.crh=krimintataari; kriminturkki
languages.sg=sango
-languages.se=pohjoissaame
+languages.se=saame, pohjois-
languages.sd=sindhi
languages.udm=udmurtti
languages.sc=sardi
-languages.sa=sanskriitti
+languages.sa=sanskrit
languages.rw=ruanda
+languages.nwc=klassinen newari
languages.ru=ven\u00e4j\u00e4
languages.mdr=mandar
languages.ro=romania
languages.rn=rundi
languages.rm=retoromaani
languages.mdf=mok\u0161a
-languages.ady=adyghe
+languages.ady=adyge
languages.zun=zuni
languages.kpe=kpelle
-languages.qu=ket\u0161ua
+languages.qu=quechua
languages.tig=tigre
languages.son=songhai
languages.cpp=muut portugaliin perustuvat kreolit ja pidginit
languages.sog=sogdi
languages.ada=adangme
-languages.kos=kosrae
-languages.hit=heetti
languages.cpf=muut ranskaan perustuvat kreolit ja pidginit
-languages.cpe=pidginenglanti
+languages.hit=heetti
+languages.kos=kosrae
+languages.cpe=muut englantiin perustuvat kreolit ja pidginit
languages.him=himachali
-languages.kok=konkani
-languages.hil=ilongo
languages.got=gootti
+languages.hil=hiligaynon
+languages.kok=konkani
languages.gor=gorontalo
languages.gon=gondi
languages.din=dinka
-languages.nub=nuubialaiset kielet
+languages.nub=nubialaiset kielet
languages.pt=portugali
languages.ps=pa\u0161to
languages.fur=friuli
@@ -1160,24 +783,23 @@ languages.phn=foinikia
languages.goh=muinaisyl\u00e4saksa
languages.snk=soninke
languages.cop=kopti
-languages.yap=jap
-languages.yao=jao
-languages.phi=muut filippiinil\u00e4iskielet
+languages.ach=acholi
+languages.phi=muut filippiinil\u00e4iset kielet
languages.pl=puola
languages.ace=aceh
-languages.pi=pali
-languages.pa=punjabi
+languages.pi=paali
+languages.pa=panjabi
languages.bug=bugi
languages.iba=iban
-languages.sms=koltansaame
+languages.sms=saame, koltan-
languages.bua=burjaatti
languages.mas=maasai
-languages.smn=inarinsaame
+languages.smn=saame, inarin-
languages.os=osseetti
-languages.map=austronesia
-languages.or=orija
+languages.map=muut austronesialaiset kielet
+languages.or=oriya
languages.man=mandingo
-languages.smj=luulajan saame
+languages.smj=saame, luulajan-
languages.smi=muut saamen kielet
languages.mak=makassar
languages.om=oromo
@@ -1185,28 +807,28 @@ languages.mai=maithili
languages.oj=ojibwa
languages.mag=magahi
languages.mad=madura
-languages.sma=etel\u00e4saame
-languages.oc=oksitaani, provensaali
-languages.nso=pedi
-languages.btk=batakki
+languages.sma=saame, etel\u00e4-
+languages.oc=oksitaani
+languages.nso=sotho, pohjois-
+languages.btk=batak
languages.myv=ers\u00e4
languages.dgr=dogrib
-languages.ny=njand\u017ea, t\u0161ewa
-languages.myn=maya
-languages.nv=navaho
+languages.ny=nyanja
+languages.myn=maya-kielet
+languages.nv=navajo
languages.kmb=kimbundu
-languages.nr=etel\u00e4ndebele
+languages.nr=ndebele, etel\u00e4-
languages.gmh=keskiyl\u00e4saksa
languages.no=norja
-languages.nn=uusnorja
+languages.nn=norja (nynorsk)
languages.nl=hollanti
languages.ng=ndonga
languages.sla=muut slaavilaiset kielet
languages.ne=nepali
-languages.nd=pohjoisndebele
-languages.cmc=t\u0161am
+languages.nd=ndebele, pohjois-
+languages.cmc=cham-kielet
languages.tet=tetum
-languages.nb=kirjanorja
+languages.nb=norja (bokm\u00e5l)
languages.na=nauru
languages.ter=tereno
languages.tem=temne
@@ -1217,25 +839,25 @@ languages.peo=muinaispersia
languages.ms=malaiji
languages.mr=marathi
languages.fro=muinaisranska
-languages.mo=moldova
-languages.frm=keskiranska
+languages.mo=moldavia
languages.mn=mongoli
+languages.frm=keskiranska
+languages.ml=malayalam
languages.jrb=juutalaisarabia
-languages.ml=malajalam
languages.mk=makedonia
languages.mi=maori
-languages.mh=marshalli
-languages.mg=malagasi
+languages.mh=marshall
+languages.mg=malagassi
languages.mwr=marwari
-languages.bra=brad\u017e
-languages.den=slaavi
+languages.bra=braj
languages.lv=latvia
-languages.lu=katangan luba
-languages.del=delaware
+languages.den=slave
+languages.lu=luba (Katanga)
languages.lt=liettua
+languages.del=delaware
languages.lo=lao
languages.ln=lingala
-languages.li=limburgi
+languages.li=limburg
languages.ewo=ewondo
languages.lg=ganda
languages.lb=luxemburg
@@ -1247,181 +869,180 @@ languages.ky=kirgiisi
languages.kw=korni
languages.kv=komi
languages.ku=kurdi
-languages.sio=siouxilaiset kielet
-languages.ks=ka\u0161miri
+languages.sio=sioux-kielet
+languages.ks=kashmiri
languages.kr=kanuri
languages.awa=awadhi
languages.ko=korea
languages.kn=kannada
languages.km=khmer
-languages.kl=gr\u00f6nlanti
+languages.kl=kalaallisut; gr\u00f6nlanti
languages.kk=kazakki
languages.rom=romani
-languages.kj=kuanjama
+languages.kj=kwanyama
languages.sid=sidamo
languages.ki=kikuju
languages.kg=kongo
-languages.non=muinaisskandinaavi
+languages.non=muinaisnorja
languages.ka=georgia
-languages.mus=muskogi
+languages.mus=creek
languages.roa=muut romaaniset kielet
languages.nog=nogai
languages.mun=mundakielet
-languages.mul=monikielinen
+languages.mul=monia kieli\u00e4
languages.jv=jaava
languages.gil=kiribati
languages.znd=zande
-languages.shn=\u0161an
-languages.fon=fong
+languages.shn=shan
languages.xal=kalmukki
languages.aus=australialaiset kielet
languages.kho=khotani
languages.ja=japani
-languages.khi=muut khoisankielet
+languages.khi=muut khoisan-kielet
languages.pau=palau
languages.chy=cheyenne
languages.tai=muut thaikielet
-languages.iu=eskimo
+languages.iu=inuktitut
languages.pap=papiamentu
languages.it=italia
languages.sgn=viittomakielet
-languages.is=islanti
languages.kha=khasi
+languages.is=islanti
languages.chr=cherokee
languages.pam=pampanga
languages.pal=pahlavi
-languages.chp=chipewya
-languages.io=ido
+languages.chp=chipewyan
languages.cho=choctaw
-languages.chn=chinook
+languages.io=ido
+languages.chn=chinook-jargon
languages.chm=mari
-languages.tyv=tuviini
-languages.bnt=bantu
+languages.tyv=tuva
+languages.bnt=muut bantukielet
languages.pag=pangasinan
-languages.ik=inupiak
-languages.chk=truk
-languages.ii=pohjois-ji
+languages.chk=chuuk
+languages.ik=i\u00f1upiak
languages.haw=havaiji
+languages.ii=sichuanin-yi
languages.lam=lamba
-languages.ig=igbo
languages.chg=t\u0161agatai
+languages.ig=igbo
languages.sga=muinaisiiri
languages.paa=muut papualaiskielet
languages.ie=interlingue
languages.id=indonesia
languages.lah=lahnda
-languages.day=dajakki
languages.chb=chibcha
+languages.day=dayak
languages.ia=interlingua
-languages.lad=juutalaisespanja
-languages.hz=herero
-languages.hai=haida
+languages.lad=ladino; juutalaisespanja
languages.dar=dargva
+languages.hai=haida
+languages.hz=herero
languages.hy=armenia
languages.ath=athabasca-kielet
languages.hu=unkari
languages.ht=haiti
-languages.dak=sioux
+languages.dak=dakota
languages.hr=kroatia
languages.ho=hiri-motu
languages.hi=hindi
-languages.dyu=djula
+languages.dyu=dyula
languages.he=heprea
-languages.ast=astuuri
+languages.ast=asturia
languages.ha=hausa
-languages.wen=sorbi
+languages.wen=sorbin kielet
languages.gv=manx
languages.gu=gud\u017earati
languages.sem=muut seemil\u00e4iset kielet
languages.sel=selkuppi
-languages.iro=irokeesi
+languages.iro=irokeesikielet
languages.gn=guarani
languages.gl=galicia
languages.arw=arawak
-languages.gez=etiopia
-languages.art=muut tekokielet
languages.gd=gaeli
-languages.ira=iran
+languages.art=muut keinotekoiset kielet
+languages.gez=ge\u2019ez
+languages.ira=muut iranilaiset kielet
languages.ga=iiri
languages.arp=arapaho
languages.arn=araukaani
languages.fy=friisi
languages.bla=mustajalka
languages.gem=muut germaaniset kielet
-languages.ypk=juppik-kielet
-languages.arc=aramea
+languages.ypk=jupikkikielet
languages.fr=ranska
+languages.arc=aramea
languages.fo=f\u00e4\u00e4ri
languages.cel=muut kelttil\u00e4iset kielet
languages.fj=fid\u017ei
languages.fi=suomi
languages.ff=fulani
languages.tvl=tuvalu
-languages.ceb=sebuano
-languages.fa=persia
+languages.ceb=cebuano
+languages.fa=farsi; persia
languages.eu=baski
languages.sco=skotti
-languages.et=eesti
+languages.et=viro
languages.es=espanja
languages.eo=esperanto
languages.en=englanti
languages.el=kreikka
languages.tut=muut altailaiset kielet
languages.niu=niue
-languages.tup=tupilaiset kielet
+languages.tup=tupi-kielet
languages.ee=ewe
languages.tum=tumbuka
-languages.mos=mosi
-languages.dz=bhutani
+languages.mos=mossi
+languages.dz=dzongkha
languages.nic=muut nigeril\u00e4is-kongolaiset kielet
-languages.lus=lushai
+languages.dv=divehi
languages.fiu=muut suomalais-ugrilaiset kielet
-languages.dv=malediivi
+languages.lus=lushai
languages.nia=nias
languages.moh=mohawk
languages.lun=lunda
-languages.apa=apassi
-languages.lui=luiseno
+languages.apa=apa\u0161\u0161ikielet
+languages.lui=luise\u00f1o
languages.hup=hupa
languages.bin=bini
languages.de=saksa
-languages.lua=luba
-languages.bik=bicol
+languages.lua=luba (Lulua)
+languages.bik=bikol
languages.was=washo
-languages.und=m\u00e4\u00e4rittelem\u00e4t\u00f6n
+languages.und=m\u00e4\u00e4ritt\u00e4m\u00e4t\u00f6n
languages.war=waray
languages.da=tanska
languages.dum=keskihollanti
languages.wal=walamo
languages.mno=manobo-kielet
-languages.wak=wakasilaiset kielet
+languages.wak=wakash-kielet
languages.sat=santali
languages.cy=kymri
languages.sas=sasak
-languages.kbd=kabardi
languages.cv=t\u0161uvassi
+languages.kbd=kabardi
languages.cu=kirkkoslaavi
languages.mni=manipuri
-languages.cs=tsekki
-languages.sam=l\u00e4nsiaramea
+languages.cs=t\u0161ekki
+languages.sam=samarianaramea
languages.cr=cree
-languages.sal=sali\u0161
+languages.sal=sali\u0161ilaiset kielet
languages.dua=duala
languages.co=korsika
languages.sai=muut Etel\u00e4-Amerikan intiaanikielet
languages.mnc=mant\u0161u
languages.sah=jakuutti
-languages.kaw=kavi
+languages.gba=gbaya
languages.inh=inguu\u0161i
-languages.gba=gbaja
+languages.kaw=kavi
languages.sad=sandawe
languages.ch=chamorro
+languages.bho=bhojpuri
languages.ine=muut indoeurooppalaiset kielet
-languages.bho=bhod\u017epuri
languages.enm=keskienglanti
-languages.kar=karen
-languages.inc=muut intialaiset kielet
languages.ce=t\u0161et\u0161eeni
+languages.inc=muut indoarjalaiset kielet
+languages.kar=karen
languages.gay=gayo
languages.ca=katalaani
languages.umb=umbundu
@@ -1429,19 +1050,19 @@ languages.syr=syyria
languages.kam=kamba
languages.tsi=tsimshian
languages.ang=muinaisenglanti
-languages.kac=d\u017eingpho
languages.cau=muut kaukasialaiset kielet
+languages.kac=kachin
languages.kab=kabyyli
-languages.kaa=karakalpakki
languages.bs=bosnia
-languages.car=karib
+languages.kaa=karakalpakki
languages.br=bretoni
+languages.car=karibi
languages.bo=tiibet
languages.bn=bengali
languages.bm=bambara
-languages.gaa=ga
-languages.cai=muut Keski-Amerikan intiaanikielet
+languages.gaa=g\u00e3
languages.bi=bislama
+languages.cai=muut Keski-Amerikan intiaanikielet
languages.bh=bihari
languages.bg=bulgaria
languages.be=valkoven\u00e4j\u00e4
@@ -1450,18 +1071,18 @@ languages.ba=baski
languages.zu=zulu
languages.zen=zenaga
languages.pro=muinaisprovensaali
-languages.hsb=yl\u00e4-sorbi
+languages.hsb=yl\u00e4sorbi
languages.az=azeri
-languages.ay=aimara
+languages.ay=aymara
languages.av=avaari
languages.as=assami
-languages.dsb=ala-sorbi
languages.ar=arabia
-languages.ilo=iloko
+languages.dsb=alasorbi
languages.elx=elami
+languages.ilo=iloko
languages.zh=kiina
languages.an=aragonia
-languages.pra=prakriitit
+languages.pra=prakrit-kielet
languages.am=amhara
languages.new=newari
languages.ak=akan
@@ -1474,10 +1095,10 @@ languages.yo=joruba
languages.alg=algonkin-kielet
languages.ale=aleutti
languages.mkh=muut mon-khmer-kielet
-languages.yi=jiddi
+languages.yi=jiddi\u0161
languages.dra=muut dravidakielet
-languages.ber=berberi
+languages.ber=muut berberikielet
languages.nds=alasaksa
languages.bem=bemba
-languages.bej=bedauje
+languages.bej=beja
languages.tpi=tok-pisin
diff --git a/resource/gnu/java/locale/LocaleInformation_fo.properties b/resource/gnu/java/locale/LocaleInformation_fo.properties
index 7d9011375..6818933f9 100644
--- a/resource/gnu/java/locale/LocaleInformation_fo.properties
+++ b/resource/gnu/java/locale/LocaleInformation_fo.properties
@@ -7,7 +7,6 @@
decimalSeparator=,
groupingSeparator=.
-currenciesDisplayName.DKK=DKK
currenciesSymbol.DKK=kr
shortMonths=jan®feb®mar®apr®mai®jun®jul®aug®sep®okt®nov®des®®
months=januar®februar®mars®apr\u00edl®mai®juni®juli®august®september®oktober®november®desember®®
@@ -19,8 +18,8 @@ longDateFormat=d. MMM yyyy
fullDateFormat=EEEE dd MMMM yyyy
territories.AU=Avstralia
territories.TD=Kjad
-territories.GY=Gujana
territories.AT=Eysturr\u00edki
+territories.GY=Gujana
territories.GW=Guinea Bissau
territories.AQ=Antarktis
territories.MZ=Mosambik
@@ -53,8 +52,8 @@ territories.YE=Jemen
territories.FR=Frakland
territories.LV=Lettland
territories.LU=Luksemborg
-territories.LT=Litava
territories.FO=F\u00f8royar
+territories.LT=Litava
territories.LS=Lesoto
territories.RW=Ruanda
territories.FM=Mikronesia
@@ -75,8 +74,8 @@ territories.KM=Komorooyggjarnar
territories.EG=Egyptaland
territories.EE=Estland
territories.WS=S\u00e1moa
-territories.KH=Kambodja
territories.EC=Ekvador
+territories.KH=Kambodja
territories.KG=Kirgisia
territories.KE=Kenja
territories.QA=Katar
@@ -98,19 +97,19 @@ territories.CU=Kuba
territories.VC=Saint Vinsent og Grenadinoyggjar
territories.CR=Kosta Rika
territories.VA=Vatikan
-territories.IT=Italia
territories.CO=Kolombia
-territories.IS=\u00cdsland
+territories.IT=Italia
territories.CN=Kina
+territories.IS=\u00cdsland
territories.CM=Kamerun
-territories.IQ=Irak
territories.CL=Kili
+territories.IQ=Irak
territories.UZ=Usbekistan
territories.UY=Uruguei
territories.CI=F\u00edlabeinsstrondin
territories.CH=Sveis
-territories.IL=\u00cdsrael
territories.CG=Kongo
+territories.IL=\u00cdsrael
territories.CF=Mi\u00f0afrikal\u00fd\u00f0veldi\u00f0
territories.US=Sambandsr\u00edki Amerika
territories.CA=Kanada
diff --git a/resource/gnu/java/locale/LocaleInformation_fr.properties b/resource/gnu/java/locale/LocaleInformation_fr.properties
index 67e8ba966..d89b6feaa 100644
--- a/resource/gnu/java/locale/LocaleInformation_fr.properties
+++ b/resource/gnu/java/locale/LocaleInformation_fr.properties
@@ -9,765 +9,287 @@ decimalSeparator=,
groupingSeparator=\u00a0
currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
localPatternChars=GaMjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=dinar jordanien
-currenciesDisplayName.BOV=Bolivian Mvdol
-currenciesDisplayName.XAU=Or
-currenciesDisplayName.FOK=Faeroe Islands Kronur
-currenciesDisplayName.LBP=livre libanaise
-currenciesDisplayName.EUR=euro
-currenciesDisplayName.VND=dong
-currenciesDisplayName.TZS=shilling de Tanzanie
-currenciesDisplayName.BOP=peso bolivien
-currenciesDisplayName.KHR=riel
-currenciesDisplayName.XAM=unit\u00e9 mon\u00e9taire asiatique
-currenciesDisplayName.BOL=boliviano (1863-1962)
-currenciesDisplayName.KHO=vieux riel
-currenciesDisplayName.ZMP=livre zambienne
-currenciesDisplayName.AUP=livre australienne
-currenciesDisplayName.XAF=franc CFA (BEAC)
-currenciesDisplayName.MTP=livre maltaise
-currenciesDisplayName.GHR=cedi revaloris\u00e9
-currenciesDisplayName.ZMK=kwacha
-currenciesDisplayName.XAD=dinar asiatique (unit\u00e9 de compte)
-currenciesDisplayName.GHP=livre ghan\u00e9enne
-currenciesDisplayName.BOB=boliviano
-currenciesDisplayName.GHO=ancien cedi
-currenciesDisplayName.MTL=lire maltaise
-currenciesDisplayName.AUD=dollar australien
-currenciesDisplayName.USS=dollar des Etats-Unis (jour m\u00eame)
-currenciesDisplayName.ITL=lire italienne
-currenciesDisplayName.USN=dollar des Etats-Unis (jour suivant)
-currenciesDisplayName.GHC=c\u00e9di
-currenciesDisplayName.SGD=dollar de Singapour
-currenciesDisplayName.PAB=balboa
-currenciesDisplayName.LAK=kip
-currenciesDisplayName.KGS=som du Kyrgystan
-currenciesDisplayName.CHF=franc suisse
-currenciesDisplayName.ATS=schilling autrichien
-currenciesDisplayName.USD=dollar des \u00c9tats-Unis
-currenciesDisplayName.ETD=dollar \u00e9thiopien
-currenciesDisplayName.BND=dollar de Brunei
-currenciesDisplayName.JMP=livre jama\u00efcaine
-currenciesDisplayName.ETB=birr
-currenciesDisplayName.DZG=franc germinal alg\u00e9rien
-currenciesDisplayName.DZF=nouveau franc alg\u00e9rien
-currenciesDisplayName.DZD=dinar alg\u00e9rien
-currenciesDisplayName.PYG=guarani
-currenciesDisplayName.LYP=livre libyenne
-currenciesDisplayName.JMD=dollar jama\u00efcain
-currenciesDisplayName.ISK=couronne islandaise
-currenciesDisplayName.ESP=peseta espagnole
-currenciesDisplayName.BMP=livre des Bermudes
-currenciesDisplayName.LYD=dinar Iibyen
-currenciesDisplayName.LYB=lire de l\u2019autori\u00e9 militaire britannique de Libye
-currenciesDisplayName.BMD=dollar des Bermudes
-currenciesDisplayName.NLG=florin n\u00e9erlandais
-currenciesDisplayName.MRO=ouguija
-currenciesDisplayName.IRR=rial iranien
-currenciesDisplayName.SEK=couronne su\u00e9doise
-currenciesDisplayName.ERN=Eritrean Nakfa
+currenciesDisplayName.YDD=dinar du Y\u00e9men
+currenciesDisplayName.TWD=dollar ta\u00efwanais
currenciesDisplayName.KES=shilling du Kenya
-currenciesDisplayName.CFF=franc CFA de la R\u00e9publique du Centre Afrique
+currenciesDisplayName.BYB=nouveau rouble bi\u00e9lorusse (1994-1999)
+currenciesDisplayName.LKR=roupie de Sri Lanka
+currenciesDisplayName.RWF=franc du Rwanda
+currenciesDisplayName.TJS=somoni du Tadjikistan
+currenciesDisplayName.SDP=livre soudanaise
+currenciesDisplayName.TJR=rouble du Tadjikistan
+currenciesDisplayName.ERN=Eritrean Nakfa
+currenciesDisplayName.AFN=afghani
+currenciesDisplayName.GRD=drachme
+currenciesDisplayName.IEP=livre irlandaise
currenciesDisplayName.ARS=peso argentin
+currenciesDisplayName.SDD=dinar soudanais
currenciesDisplayName.ARP=peso argentin (1983-1985)
-currenciesDisplayName.ARM=Argentine Peso Moneda Nacional
-currenciesDisplayName.TWD=dollar ta\u00efwanais
-currenciesDisplayName.SDP=livre soudanaise
currenciesDisplayName.GEL=lari
+currenciesDisplayName.AFA=afghani
currenciesDisplayName.GEK=Georgian Kupon Larit
-currenciesDisplayName.MQF=franc martiniquais
+currenciesDisplayName.CRC=colon
currenciesDisplayName.FKP=livre des Falkland (Malvinas)
+currenciesDisplayName.EEK=couronne estonienne
+currenciesDisplayName.HKD=dollar de Hong Kong
+currenciesDisplayName.MDL=leu moldave
currenciesDisplayName.ARA=austral
-currenciesDisplayName.SDD=dinar soudanais
currenciesDisplayName.IQD=dinar irakien
-currenciesDisplayName.TVD=dollar du Tuvalu
currenciesDisplayName.SCR=roupie des Seychelles
+currenciesDisplayName.VUV=vatu
+currenciesDisplayName.DKK=couronne danoise
+currenciesDisplayName.KPW=won nord-cor\u00e9en
+currenciesDisplayName.GQE=ekw\u00e9l\u00e9
+currenciesDisplayName.IDR=rupiah
currenciesDisplayName.LVR=rouble letton
-currenciesDisplayName.FJP=livre de Fiji
+currenciesDisplayName.SOS=shilling de Somalie
+currenciesDisplayName.AED=dirham des \u00c9mirats arabes unis
+currenciesDisplayName.BWP=pula
currenciesDisplayName.LVL=lats letton
-currenciesDisplayName.CDL=Congolese Zaire
-currenciesDisplayName.CDG=franc de la R\u00e9publique Congolaise
-currenciesDisplayName.CDF=franc congolais
-currenciesDisplayName.FJD=dollar de Fidji
+currenciesDisplayName.RUR=rouble de Russie (1991-1998)
currenciesDisplayName.NIO=cordoba d\u2019or
+currenciesDisplayName.ADP=peseta andorrane
+currenciesDisplayName.FJD=dollar de Fidji
currenciesDisplayName.MOP=pataca
-currenciesDisplayName.NIG=cordoba d\u2019or
+currenciesDisplayName.RUB=rouble
+currenciesDisplayName.CDF=franc congolais
currenciesDisplayName.NIC=cordoba
-currenciesDisplayName.XTR=rouble transf\u00e9rable du COMECON
-currenciesDisplayName.FIN=mark finlandais (1860-1962)
-currenciesDisplayName.FIM=mark finlandais
+currenciesDisplayName.DJF=franc de Djibouti
+currenciesDisplayName.ECV=unit\u00e9 de valeur constante \u00e9quatoriale (UVC)
currenciesDisplayName.SBD=dollar de Salomon
+currenciesDisplayName.UZS=sum
+currenciesDisplayName.ECS=sucre
+currenciesDisplayName.PHP=peso philippin
+currenciesDisplayName.THB=baht
currenciesDisplayName.LUF=franc luxembourgeois
-currenciesDisplayName.TTO=vieux dollar de la Trinit\u00e9
-currenciesDisplayName.AOS=escudo angolais
-currenciesDisplayName.AOR=kwanza angolais r\u00e9ajust\u00e9 (1995-1999)
-currenciesDisplayName.MNT=tugrik
-currenciesDisplayName.HUF=forint
-currenciesDisplayName.BIF=franc du Burundi
-currenciesDisplayName.AON=nouveau kwanza angolais (1990-2000)
-currenciesDisplayName.AOK=kwanza angolais (1977-1990)
+currenciesDisplayName.FIM=mark finlandais
currenciesDisplayName.TTD=dollar de la Trinit\u00e9
currenciesDisplayName.SZL=lilangeni
-currenciesDisplayName.NHF=franc CFP des Nouvelles H\u00e9brides
-currenciesDisplayName.GBP=livre sterling
-currenciesDisplayName.SAS=riyal saoudien
+currenciesDisplayName.MNT=tugrik
currenciesDisplayName.SAR=riyal s\u00e9oudien
+currenciesDisplayName.UAK=karbovanetz
+currenciesDisplayName.UAH=hryvnia
+currenciesDisplayName.HUF=forint
+currenciesDisplayName.COP=peso colombien
+currenciesDisplayName.QAR=rial du Qatar
currenciesDisplayName.LTT=Talonas de Lithuanie
-currenciesDisplayName.INR=roupie indienne
currenciesDisplayName.PTE=escudo portugais
-currenciesDisplayName.AOA=kwanza angolais
-currenciesDisplayName.PTC=conto portugais
+currenciesDisplayName.AOR=kwanza angolais r\u00e9ajust\u00e9 (1995-1999)
+currenciesDisplayName.UYU=peso uruguayen
+currenciesDisplayName.GBP=livre sterling
+currenciesDisplayName.BIF=franc du Burundi
+currenciesDisplayName.INR=roupie indienne
+currenciesDisplayName.ZRZ=za\u00efre
+currenciesDisplayName.AON=nouveau kwanza angolais (1990-2000)
currenciesDisplayName.LTL=Lita de Lithuanian
+currenciesDisplayName.XFU=franc UIC
currenciesDisplayName.KZT=tenge du Kazakhstan
-currenciesDisplayName.KZR=rouble du Kazakhstan
-currenciesDisplayName.VGD=dollar des \u00eeles Vierges britanniques
-currenciesDisplayName.NGP=livre nig\u00e9riane
-currenciesDisplayName.MMX=dollar de Myanmar (certificat de devises \u00e9trang\u00e8res)
+currenciesDisplayName.MZM=m\u00e9tical
+currenciesDisplayName.UYP=peso uruguayen (1975-1993)
+currenciesDisplayName.AOK=kwanza angolais (1977-1990)
+currenciesDisplayName.BUK=kyat
+currenciesDisplayName.GNS=syli
+currenciesDisplayName.XFO=franc or
+currenciesDisplayName.PGK=kina
+currenciesDisplayName.SYP=livre syrienne
+currenciesDisplayName.MZE=escudo du Mozambique
+currenciesDisplayName.OMR=rial omani
currenciesDisplayName.NGN=naira
+currenciesDisplayName.ZRN=nouveau za\u00efre
+currenciesDisplayName.AOA=kwanza angolais
+currenciesDisplayName.CNY=Yuan Ren-min-bi
+currenciesDisplayName.MAF=franc marocain
+currenciesDisplayName.GNF=franc guin\u00e9en
currenciesDisplayName.HTG=gourde
-currenciesDisplayName.SYP=livre syrienne
-currenciesDisplayName.PSP=livre palestinienne
-currenciesDisplayName.BHD=dinar de Bahrein
+currenciesDisplayName.MAD=dirham marocain
currenciesDisplayName.MMK=Myanmar Kyat
+currenciesDisplayName.MYR=ringgit
+currenciesDisplayName.LSL=Lesotho Loti
+currenciesDisplayName.XEU=unit\u00e9 de compte europ\u00e9enne (ECU)
+currenciesDisplayName.BHD=dinar de Bahrein
+currenciesDisplayName.SLL=l\u00e9one
+currenciesDisplayName.BTN=ngultrum
+currenciesDisplayName.TRL=livre turque
+currenciesDisplayName.KMF=franc des Comores
currenciesDisplayName.ANG=florin des Antilles n\u00e9erl.
currenciesDisplayName.CZK=couronne tch\u00e8que
-currenciesDisplayName.IMP=livre sterling de l\u2019Ile de Man
-currenciesDisplayName.BGX=lev (certificat de devises \u00e9trang\u00e8res)
-currenciesDisplayName.LSL=Lesotho Loti
-currenciesDisplayName.GAF=franc CFA gabonnais
-currenciesDisplayName.BGO=lev (1879-1952)
+currenciesDisplayName.AZM=Azerbaijanian Manat
+currenciesDisplayName.KYD=dollar des \u00eeles Ca\u00efmans
+currenciesDisplayName.GMD=dalasie
currenciesDisplayName.BGN=nouveau lef
-currenciesDisplayName.BGM=lev de Bulgarie socialiste
currenciesDisplayName.CAD=dollar canadien
+currenciesDisplayName.MXV=unit\u00e9 de conversion mexicaine (UDI)
currenciesDisplayName.BGL=lev
-currenciesDisplayName.TRL=livre turque
-currenciesDisplayName.KYD=dollar des \u00eeles Ca\u00efmans
-currenciesDisplayName.CYP=livre cypriote
+currenciesDisplayName.VEB=bolivar
+currenciesDisplayName.MLF=franc malien
currenciesDisplayName.ILS=sh\u00e9kel
+currenciesDisplayName.MXP=peso d\u2019argent mexicain (1861-1992)
+currenciesDisplayName.PES=sol p\u00e9ruvien
currenciesDisplayName.GYD=dollar de Guyane
-currenciesDisplayName.AMD=dram arm\u00e9nien
currenciesDisplayName.ILP=livre isra\u00e9lienne
-currenciesDisplayName.MLF=franc malien
-currenciesDisplayName.ILL=sh\u00e9kel
-currenciesDisplayName.VEB=bolivar
-currenciesDisplayName.ALX=dollar albanais (certificat de devises \u00e9trang\u00e8res)
+currenciesDisplayName.SKK=couronne slovaque
+currenciesDisplayName.CYP=livre cypriote
+currenciesDisplayName.PEN=nouveau sol p\u00e9ruvien
currenciesDisplayName.LRD=dollar lib\u00e9rien
-currenciesDisplayName.ALV=Albanian Lek Valute
+currenciesDisplayName.PEI=Inti p\u00e9ruvien
+currenciesDisplayName.AMD=dram arm\u00e9nien
+currenciesDisplayName.BSD=dollar des Bahamas
currenciesDisplayName.HRK=kuna
-currenciesDisplayName.REF=franc de la R\u00e9union
+currenciesDisplayName.CLP=peso chilien
currenciesDisplayName.HRD=dinar croate
-currenciesDisplayName.ALL=lek albanais
-currenciesDisplayName.JEP=livre sterling de Jersey
-currenciesDisplayName.ALK=lek albanais (1946-1961)
-currenciesDisplayName.MKN=dinar mac\u00e9donien (1992-1993)
-currenciesDisplayName.VDP=North Vietnam Viet Minh Piastre Dong Viet
-currenciesDisplayName.VDN=nouveau dong nord-vietnamien
-currenciesDisplayName.MKD=dinar mac\u00e9donien
-currenciesDisplayName.VDD=North Vietnam Piastre Dong Viet
-currenciesDisplayName.TPP=pataca de Timor
currenciesDisplayName.XPF=franc CFP
-currenciesDisplayName.BEL=franc belge (financier)
-currenciesDisplayName.GWP=peso de Guin\u00e9e-Bissau
-currenciesDisplayName.KWD=dinar koweitien
-currenciesDisplayName.GWM=Portuguese Guinea Mil Reis
-currenciesDisplayName.BEF=franc belge
+currenciesDisplayName.FRF=franc fran\u00e7ais
+currenciesDisplayName.BRR=cruzeiro
+currenciesDisplayName.MKD=dinar mac\u00e9donien
+currenciesDisplayName.CLF=Chilean Unidades de Fomento
+currenciesDisplayName.ALL=lek albanais
+currenciesDisplayName.BRN=nouveau cruzado
+currenciesDisplayName.MWK=kwacha
+currenciesDisplayName.BRL=r\u00e9al
currenciesDisplayName.TPE=escudo de Timor
-currenciesDisplayName.BEC=franc belge (convertible)
-currenciesDisplayName.GWE=Escudo de Guin\u00e9e Portugaise
+currenciesDisplayName.BRE=cruzeiro (1990-1993)
+currenciesDisplayName.BRC=cruzeiro
+currenciesDisplayName.BRB=nouveau cruzeiro (1967-1986)
+currenciesDisplayName.DEM=deutsche mark
+currenciesDisplayName.KWD=dinar koweitien
+currenciesDisplayName.XCD=dollar des Cara\u00efbes
+currenciesDisplayName.NPR=roupie du N\u00e9pal
+currenciesDisplayName.GWP=peso de Guin\u00e9e-Bissau
+currenciesDisplayName.YUN=dinar yougoslave convertible
currenciesDisplayName.SVC=colon
-currenciesDisplayName.CWG=florin de Curacao
-currenciesDisplayName.BDT=taka
-currenciesDisplayName.TOS=livre sterling du Tonga
-currenciesDisplayName.TOP=pa\u02bbanga
+currenciesDisplayName.YUM=dinar yougoslave Noviy
+currenciesDisplayName.BEL=franc belge (financier)
+currenciesDisplayName.SIT=tolar slov\u00e8ne
+currenciesDisplayName.JPY=yen
currenciesDisplayName.XOF=franc CFA (BCEAO)
+currenciesDisplayName.MVR=roupie des Maldives
+currenciesDisplayName.GWE=Escudo de Guin\u00e9e Portugaise
+currenciesDisplayName.BEF=franc belge
+currenciesDisplayName.TOP=pa\u02bbanga
+currenciesDisplayName.YUD=nouveau dinar yougoslave
+currenciesDisplayName.BEC=franc belge (convertible)
currenciesDisplayName.SUR=rouble de C.E.I.
-currenciesDisplayName.SUN=nouveau rouble sovi\u00e9tique
-currenciesDisplayName.NCF=franc Germinal de Nouvelle Cal\u00e9donie
-currenciesDisplayName.CVE=escudo du Cap-Vert
-currenciesDisplayName.XNF=franc CFA antillais
+currenciesDisplayName.ROL=leu
+currenciesDisplayName.DDM=mark est-allemand
+currenciesDisplayName.BDT=taka
+currenciesDisplayName.XBD=unit\u00e9 de compte europ\u00e9enne (XBD)
+currenciesDisplayName.AWG=florin d\u2019Aruba
+currenciesDisplayName.XBC=unit\u00e9 de compte europ\u00e9enne (XBC)
+currenciesDisplayName.XBB=unit\u00e9 mon\u00e9taire europ\u00e9enne
+currenciesDisplayName.XBA=unit\u00e9 composite europ\u00e9enne
+currenciesDisplayName.NOK=couronne norv\u00e9gienne
+currenciesDisplayName.MUR=roupie de l\u2019\u00eele Maurice
currenciesDisplayName.ZAR=rand
-currenciesDisplayName.DOP=peso dominicain
-currenciesDisplayName.CUX=certificat de devises \u00e9trang\u00e8res de Cuba
-currenciesDisplayName.ZAP=livre sud-africaine
+currenciesDisplayName.SHP=livre de Sainte-H\u00e9l\u00e8ne
+currenciesDisplayName.XAU=Or
currenciesDisplayName.ZAL=rand sud-africain (financier)
+currenciesDisplayName.VND=dong
+currenciesDisplayName.TZS=shilling de Tanzanie
+currenciesDisplayName.GIP=livre de Gibraltar
currenciesDisplayName.TND=dinar tunisien
-currenciesDisplayName.CUP=peso cubain
-currenciesDisplayName.GUF=franc guyanais
+currenciesDisplayName.CVE=escudo du Cap-Vert
currenciesDisplayName.UGX=shilling ougandais
-currenciesDisplayName.LNR=roupie de Ceylan
-currenciesDisplayName.AIF=franc Affars et Issas
-currenciesDisplayName.VAL=lire du Vatican
-currenciesDisplayName.STE=escudo de Sao Tom\u00e9 et Principe
+currenciesDisplayName.ZMK=kwacha
+currenciesDisplayName.JOD=dinar jordanien
+currenciesDisplayName.XAF=franc CFA (BEAC)
+currenciesDisplayName.LBP=livre libanaise
currenciesDisplayName.UGS=shilling ougandais (1966-1987)
currenciesDisplayName.STD=dobra
-currenciesDisplayName.MHD=dollar des \u00eeles Marshall
-currenciesDisplayName.NZP=livre n\u00e9o-z\u00e9landaise
currenciesDisplayName.WST=tala
-currenciesDisplayName.WSP=livre du Samoa
-currenciesDisplayName.HNL=lempira
-currenciesDisplayName.XMF=nouveau franc m\u00e9tropolitain
+currenciesDisplayName.KHR=riel
+currenciesDisplayName.EUR=euro
+currenciesDisplayName.DOP=peso dominicain
+currenciesDisplayName.BOV=Bolivian Mvdol
+currenciesDisplayName.MTP=livre maltaise
+currenciesDisplayName.USS=dollar des Etats-Unis (jour m\u00eame)
+currenciesDisplayName.BOP=peso bolivien
+currenciesDisplayName.MTL=lire maltaise
+currenciesDisplayName.CUP=peso cubain
currenciesDisplayName.TMM=Turkmenistan Manat
-currenciesDisplayName.GTQ=quetzal
+currenciesDisplayName.USN=dollar des Etats-Unis (jour suivant)
+currenciesDisplayName.SGD=dollar de Singapour
currenciesDisplayName.NZD=dollar n\u00e9o-z\u00e9landais
-currenciesDisplayName.SSP=livre \u00e9cossaise
-currenciesDisplayName.BBD=dollar de Barbade
+currenciesDisplayName.USD=dollar des \u00c9tats-Unis
+currenciesDisplayName.HNL=lempira
+currenciesDisplayName.BOB=boliviano
+currenciesDisplayName.ITL=lire italienne
+currenciesDisplayName.PAB=balboa
+currenciesDisplayName.GTQ=quetzal
+currenciesDisplayName.LAK=kip
+currenciesDisplayName.GHC=c\u00e9di
+currenciesDisplayName.AUD=dollar australien
currenciesDisplayName.NAD=dollar de Namibie
+currenciesDisplayName.KGS=som du Kyrgystan
currenciesDisplayName.MGF=franc malgache
+currenciesDisplayName.CHF=franc suisse
+currenciesDisplayName.BBD=dollar de Barbade
currenciesDisplayName.MGA=ariary malgache
-currenciesDisplayName.EGP=livre \u00e9gyptienne
-currenciesDisplayName.BZH=dollar du Honduras britannique
+currenciesDisplayName.PYG=guarani
currenciesDisplayName.PLZ=zloty (1950-1995)
-currenciesDisplayName.BAN=nouveau dinar de Bosnie-Herzegovine
-currenciesDisplayName.PLX=dollar US polonais (certificat de devises \u00e9trang\u00e8res)
-currenciesDisplayName.BAM=mark convertible de Bosnie-Herzegovine
-currenciesDisplayName.BZD=dollar de B\u00e9lize
-currenciesDisplayName.BAD=dinar de Bosnie-Herzegovine
currenciesDisplayName.YER=riyal du Y\u00e9men
+currenciesDisplayName.ATS=schilling autrichien
+currenciesDisplayName.ETB=birr
+currenciesDisplayName.BND=dollar de Brunei
+currenciesDisplayName.JMD=dollar jama\u00efcain
+currenciesDisplayName.EGP=livre \u00e9gyptienne
+currenciesDisplayName.DZD=dinar alg\u00e9rien
+currenciesDisplayName.ISK=couronne islandaise
currenciesDisplayName.SRG=florin du Surinam
-currenciesDisplayName.CSK=couronne tch\u00e8que
+currenciesDisplayName.LYD=dinar Iibyen
+currenciesDisplayName.BZD=dollar de B\u00e9lize
+currenciesDisplayName.BAM=mark convertible de Bosnie-Herzegovine
+currenciesDisplayName.ESP=peseta espagnole
currenciesDisplayName.KRW=won sud-cor\u00e9en
+currenciesDisplayName.NLG=florin n\u00e9erlandais
+currenciesDisplayName.MRO=ouguija
+currenciesDisplayName.BAD=dinar de Bosnie-Herzegovine
+currenciesDisplayName.ZWD=dollar du Zimbabwe
+currenciesDisplayName.SEK=couronne su\u00e9doise
+currenciesDisplayName.CSK=couronne tch\u00e8que
currenciesDisplayName.BYR=rouble bi\u00e9lorusse
-currenciesDisplayName.YEI=riyal du Y\u00e9men
-currenciesDisplayName.BYL=rouble bi\u00e9lorusse (1992-1994)
-currenciesDisplayName.CSC=couronne tch\u00e8que
-currenciesDisplayName.KRO=vieux won
-currenciesDisplayName.KRH=hwan
-currenciesDisplayName.BYB=nouveau rouble bi\u00e9lorusse (1994-1999)
-currenciesDisplayName.SQS=shilling de Somalie
-currenciesDisplayName.GRN=nouveau drachme
+currenciesDisplayName.IRR=rial iranien
currenciesDisplayName.PKR=roupie du Pakistan
-currenciesDisplayName.AFN=afghani
-currenciesDisplayName.ZWD=dollar du Zimbabwe
-currenciesDisplayName.LKR=roupie de Sri Lanka
-currenciesDisplayName.GRD=drachme
-currenciesDisplayName.IEP=livre irlandaise
-currenciesDisplayName.AFA=afghani
-currenciesDisplayName.YDD=dinar du Y\u00e9men
-currenciesDisplayName.RWF=franc du Rwanda
-currenciesDisplayName.CRC=colon
-currenciesDisplayName.TJS=somoni du Tadjikistan
-currenciesDisplayName.TJR=rouble du Tadjikistan
-currenciesDisplayName.EEK=couronne estonienne
-currenciesDisplayName.GQP=peseta de Guin\u00e9e Equatoriale
-currenciesDisplayName.MDR=rouble moldave
-currenciesDisplayName.HKD=dollar de Hong Kong
-currenciesDisplayName.DKK=couronne danoise
-currenciesDisplayName.MDL=leu moldave
-currenciesDisplayName.GQF=franco de Guin\u00e9e Equatoriale
-currenciesDisplayName.GQE=ekw\u00e9l\u00e9
-currenciesDisplayName.IDR=rupiah
-currenciesDisplayName.AED=dirham des \u00c9mirats arabes unis
-currenciesDisplayName.KPW=won nord-cor\u00e9en
-currenciesDisplayName.IDN=nouvelle roupie indon\u00e9sienne
-currenciesDisplayName.BWP=pula
-currenciesDisplayName.MDC=Moldovan Leu Cupon
-currenciesDisplayName.IDJ=roupie de Java
-currenciesDisplayName.KPP=won du peuple nord-cor\u00e9en
-currenciesDisplayName.IDG=florin de Nica
-currenciesDisplayName.VUV=vatu
-currenciesDisplayName.XID=dinar musulman
-currenciesDisplayName.SOS=shilling de Somalie
-currenciesDisplayName.ADP=peseta andorrane
-currenciesDisplayName.RUR=rouble de Russie (1991-1998)
-currenciesDisplayName.GPF=franc guadeloup\u00e9en
-currenciesDisplayName.DJF=franc de Djibouti
-currenciesDisplayName.ADD=diner andorran
-currenciesDisplayName.MCG=franc Germinal mon\u00e9gasque
-currenciesDisplayName.MCF=nouveau franc marocain
-currenciesDisplayName.ECV=unit\u00e9 de valeur constante \u00e9quatoriale (UVC)
-currenciesDisplayName.ECS=sucre
-currenciesDisplayName.LIF=franc du Liechtenstein
-currenciesDisplayName.PHP=peso philippin
-currenciesDisplayName.UZS=sum
-currenciesDisplayName.COP=peso colombien
-currenciesDisplayName.THB=baht
-currenciesDisplayName.IBP=livre d\u2019Irlande du Nord
-currenciesDisplayName.BUR=roupie de Birmanie
-currenciesDisplayName.COF=franc CFA congolais
-currenciesDisplayName.BUK=kyat
-currenciesDisplayName.COB=Colombian Paper Peso
-currenciesDisplayName.UZC=Uzbekistan Coupon Som
-currenciesDisplayName.UAK=karbovanetz
-currenciesDisplayName.QAR=rial du Qatar
-currenciesDisplayName.UAH=hryvnia
-currenciesDisplayName.GNS=syli
-currenciesDisplayName.CNY=Yuan Ren-min-bi
-currenciesDisplayName.MZM=m\u00e9tical
-currenciesDisplayName.CNX=dollar US chinois (certificat de devises \u00e9trang\u00e8res)
-currenciesDisplayName.UYU=peso uruguayen
-currenciesDisplayName.GNI=franc guin\u00e9en (1960-1972)
-currenciesDisplayName.SML=lire de Saint-Marin
-currenciesDisplayName.CNP=Chinese Jen Min Piao Yuan
-currenciesDisplayName.MZE=escudo du Mozambique
-currenciesDisplayName.GNF=franc guin\u00e9en
-currenciesDisplayName.OMS=Oman Rial Saidi
-currenciesDisplayName.PGK=kina
-currenciesDisplayName.OMR=rial omani
-currenciesDisplayName.UYP=peso uruguayen (1975-1993)
-currenciesDisplayName.XFU=franc UIC
-currenciesDisplayName.BTR=roupie de Bhoutan
-currenciesDisplayName.ZRZ=za\u00efre
-currenciesDisplayName.MAF=franc marocain
-currenciesDisplayName.MAD=dirham marocain
-currenciesDisplayName.BTN=ngultrum
-currenciesDisplayName.XFO=franc or
-currenciesDisplayName.UYF=peso fort uruguayen
-currenciesDisplayName.MYR=ringgit
-currenciesDisplayName.ZRN=nouveau za\u00efre
-currenciesDisplayName.AZM=Azerbaijanian Manat
-currenciesDisplayName.GMP=livre de Gambie
-currenciesDisplayName.KMF=franc des Comores
-currenciesDisplayName.SLL=l\u00e9one
-currenciesDisplayName.GMD=dalasie
-currenciesDisplayName.XEU=unit\u00e9 de compte europ\u00e9enne (ECU)
-currenciesDisplayName.BSP=livre des Bahamas
-currenciesDisplayName.CMF=franc CFA camerounais
-currenciesDisplayName.MXV=unit\u00e9 de conversion mexicaine (UDI)
-currenciesDisplayName.XEF=franc CFA (BCEAEC)
-currenciesDisplayName.BSD=dollar des Bahamas
-currenciesDisplayName.MXP=peso d\u2019argent mexicain (1861-1992)
-currenciesDisplayName.PES=sol p\u00e9ruvien
-currenciesDisplayName.GLK=couronne du Groenland
-currenciesDisplayName.BRZ=cruzeiro (1942-1967)
-currenciesDisplayName.PEN=nouveau sol p\u00e9ruvien
-currenciesDisplayName.CLP=peso chilien
-currenciesDisplayName.SKK=couronne slovaque
-currenciesDisplayName.PEI=Inti p\u00e9ruvien
-currenciesDisplayName.BRR=cruzeiro
-currenciesDisplayName.FRG=franc germinal/franc Poincar\u00e9
-currenciesDisplayName.FRF=franc fran\u00e7ais
-currenciesDisplayName.BRN=nouveau cruzado
-currenciesDisplayName.CLF=Chilean Unidades de Fomento
-currenciesDisplayName.CLE=escudo chilien
-currenciesDisplayName.BRL=r\u00e9al
-currenciesDisplayName.CLC=condor chilien
-currenciesDisplayName.BRE=cruzeiro (1990-1993)
-currenciesDisplayName.DES=sperrmark allemand
-currenciesDisplayName.MWP=livre de Malawi
-currenciesDisplayName.BRC=cruzeiro
-currenciesDisplayName.BRB=nouveau cruzeiro (1967-1986)
-currenciesDisplayName.MWK=kwacha
-currenciesDisplayName.PDR=rouble moldave
-currenciesDisplayName.DEM=deutsche mark
-currenciesDisplayName.TDF=franc CFA du Tchad
-currenciesDisplayName.PDN=nouveau rouble moldave
-currenciesDisplayName.PDK=Transdniestria Ruble Kupon
-currenciesDisplayName.NPR=roupie du N\u00e9pal
-currenciesDisplayName.CKD=dollar des \u00eeles Cook
-currenciesDisplayName.JPY=yen
-currenciesDisplayName.MVR=roupie des Maldives
-currenciesDisplayName.XCF=nouveau franc CFA
-currenciesDisplayName.MVP=roupie des Maldives
-currenciesDisplayName.XCD=dollar des Cara\u00efbes
-currenciesDisplayName.SIT=tolar slov\u00e8ne
-currenciesDisplayName.YUR=dinar yougoslave r\u00e9form\u00e9
-currenciesDisplayName.AWG=florin d\u2019Aruba
-currenciesDisplayName.YUO=dinar yougoslave d\u2019Octobre
-currenciesDisplayName.DDM=mark est-allemand
-currenciesDisplayName.YUN=dinar yougoslave convertible
-currenciesDisplayName.YUM=dinar yougoslave Noviy
-currenciesDisplayName.TCC=couronne des \u00eeles Turks et Ca\u00efques
-currenciesDisplayName.YUG=dinar yougoslave 1994
-currenciesDisplayName.YUF=dinar de la F\u00e9d\u00e9ration Yougoslave
-currenciesDisplayName.RON=nouveau leu
-currenciesDisplayName.YUD=nouveau dinar yougoslave
-currenciesDisplayName.ROL=leu
-currenciesDisplayName.SIB=bons de tolar slov\u00e8ne
-currenciesDisplayName.NOK=couronne norv\u00e9gienne
-currenciesDisplayName.MUR=roupie de l\u2019\u00eele Maurice
-currenciesDisplayName.XBD=unit\u00e9 de compte europ\u00e9enne (XBD)
-currenciesDisplayName.GIP=livre de Gibraltar
-currenciesDisplayName.VNS=dong national du Vietnam
-currenciesDisplayName.XBC=unit\u00e9 de compte europ\u00e9enne (XBC)
-currenciesDisplayName.VNR=dong de la R\u00e9publique Vietnamienne
-currenciesDisplayName.XBB=unit\u00e9 mon\u00e9taire europ\u00e9enne
-currenciesDisplayName.XBA=unit\u00e9 composite europ\u00e9enne
-currenciesDisplayName.KID=dollar de Kiribati
-currenciesDisplayName.SHP=livre de Sainte-H\u00e9l\u00e8ne
-currenciesDisplayName.VNN=nouveau dong vietnamien
-currenciesSymbol.JOD=JOD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LBP
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=TZS
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=KHR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=AUD
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=SGD
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
+currenciesDisplayName.BMD=dollar des Bermudes
+currenciesSymbol.BYR=Rbl
currenciesSymbol.CHF=sFr.
-currenciesSymbol.ATS=ATS
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=ETB
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DZD
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=JMD
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=BMD
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=MRO
-currenciesSymbol.IRR=IRR
-currenciesSymbol.SEK=SEK
-currenciesSymbol.ERN=ERN
-currenciesSymbol.KES=KES
-currenciesSymbol.CFF=CFF
currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=TWD
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
-currenciesSymbol.IQD=IQD
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SCR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=FJD
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
-currenciesSymbol.SBD=SBD
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=MNT
-currenciesSymbol.HUF=HUF
-currenciesSymbol.BIF=BIF
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
-currenciesSymbol.TTD=TTD
-currenciesSymbol.SZL=SZL
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
-currenciesSymbol.SAR=SAR
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=SYP
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BHD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=ANG
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=CAD
-currenciesSymbol.BGL=BGL
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=CYP
-currenciesSymbol.ILS=ILS
currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=VEB
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
+currenciesSymbol.AFN=Af
+currenciesSymbol.FRF=F
+currenciesSymbol.GEL=lari
currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=XPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KWD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=FB
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
-currenciesSymbol.BDT=BDT
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=TOP
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
-currenciesSymbol.CVE=CVE
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=ZAR
-currenciesSymbol.DOP=DOP
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=STD
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
-currenciesSymbol.HNL=HNL
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
-currenciesSymbol.GTQ=GTQ
-currenciesSymbol.NZD=NZD
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BBD
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZD
-currenciesSymbol.BAD=BAD
-currenciesSymbol.YER=YER
-currenciesSymbol.SRG=SRG
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=PKR
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=LKR
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IEP
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=CRC
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HKD
-currenciesSymbol.DKK=DKK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=IDR
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VUV
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=SOS
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=COP
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QAR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=CNY
-currenciesSymbol.MZM=MZM
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
+currenciesSymbol.KZT=T
currenciesSymbol.GNF=GF
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
-currenciesSymbol.OMR=OMR
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=MYR
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
-currenciesSymbol.KMF=KMF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=CLP
-currenciesSymbol.SKK=SKK
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=F
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
+currenciesSymbol.UYU=Ur$
+currenciesSymbol.BEF=FB
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MKD=MDen
+currenciesSymbol.LSL=M
+currenciesSymbol.AMD=dram
+currenciesSymbol.TRL=TL
currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MWK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=NPR
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=XCD
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=ROL
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NOK
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.NAD=N$
+currenciesSymbol.LYD=LD
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.BAM=KM
+currenciesSymbol.BOB=Bs
shortMonths=janv.®f\u00e9vr.®mars®avr.®mai®juin®juil.®ao\u00fbt®sept.®oct.®nov.®d\u00e9c.®®
months=janvier®f\u00e9vrier®mars®avril®mai®juin®juillet®ao\u00fbt®septembre®octobre®novembre®d\u00e9cembre®®
shortWeekdays=®dim.®lun.®mar.®mer.®jeu.®ven.®sam.®
weekdays=®dimanche®lundi®mardi®mercredi®jeudi®vendredi®samedi®
minNumberOfDaysInFirstWeek=4
firstDayOfWeek=mon
-eras=av. J.-C.®ap. J.-C.®
+eras=av. J.-C.®apr. J.-C.®
shortDateFormat=dd/MM/yy
mediumDateFormat=d MMM yy
longDateFormat=d MMMM yyyy
fullDateFormat=EEEE d MMMM yyyy
fullTimeFormat=HH' h 'mm z
-zoneStrings=America/Indianapolis®HNE (\u00c9UA)®Heure normale de l\u2019Est (\u00c9UA)®HAE (\u00c9UA)®Heure avanc\u00e9e de l\u2019Est (\u00c9UA)®©America/Halifax®HNA®Heure normale de l\u2019Atlantique®HAA®Heure avanc\u00e9e de l\u2019Atlantique®©Pacific/Honolulu®HST®Heure normale d\u2019Hawa\u00ef®HDT®Heure avanc\u00e9e d\u2019Hawa\u00ef®©America/Denver®HNR (\u00c9UA)®Heure normale des Rocheuses (\u00c9UA)®HAR (\u00c9UA)®Heure avanc\u00e9e des Rocheuses (\u00c9UA)®©America/Winnipeg®HNC®Heure normale du Centre®HAC®Heure avanc\u00e9e du Centre®©America/Anchorage®HNAK®Heure normale de l\u2019Alaska®HAAK®Heure avanc\u00e9e de l\u2019Alaska®©America/Montreal®HNE®Heure normale de l\u2019Est®HAE®Heure avanc\u00e9e de l\u2019Est®©America/St_Johns®HNT®Heure normale de Terre-Neuve®HAT®Heure avanc\u00e9e de Terre-Neuve®©America/Edmonton®HNR®Heure normale des Rocheuses®HAR®Heure avanc\u00e9e des Rocheuses®©America/Chicago®HNC (\u00c9UA)®Heure normale du Centre (\u00c9UA)®HAC (\u00c9UA)®Heure avanc\u00e9e du Centre (\u00c9UA)®©Asia/Shanghai®HNC®Heure normale de Chine®HAC®Heure avanc\u00e9e de Chine®©America/Vancouver®HNP®Heure normale du Pacifique®HAP®Heure avanc\u00e9e du Pacifique®©Asia/Tokyo®HNJ®Heure normale du Japon®HAJ®Heure avanc\u00e9e du Japon®©America/New_York®HNE (\u00c9UA)®Heure normale de l\u2019Est (\u00c9UA)®HAE (\u00c9UA)®Heure avanc\u00e9e de l\u2019Est (\u00c9UA)®©Europe/Bucharest®HEE®Heure normale de l\u2019Europe de l\u2019Est®HAEE®Heure avanc\u00e9e de l\u2019Europe de l\u2019Est®©America/Los_Angeles®HNP (\u00c9UA)®Heure normale du Pacifique (\u00c9UA)®HAP (\u00c9UA)®Heure avanc\u00e9e du Pacifique (\u00c9UA)®©America/Phoenix®HNR (\u00c9UA)®Heure normale des Rocheuses (\u00c9UA)®HAR (\u00c9UA)®Heure avanc\u00e9e des Rocheuses (\u00c9UA)®©Etc/GMT®GMT®Temps Moyen de Greenwich®GMT®Temps Moyen de Greenwich®©Asia/Jerusalem®HNI®Heure normale d\u2019Isra\u00ebl®HAI®Heure avanc\u00e9e d\u2019Isra\u00ebl®©Europe/Paris®HNEC®Heure normale de l\u2019Europe centrale®HAEC®Heure avanc\u00e9e de l\u2019Europe centrale®©
+zoneStrings=Pacific/Honolulu®HST®Heure normale d\u2019Hawa\u00ef®HDT®Heure avanc\u00e9e d\u2019Hawa\u00ef®©Europe/Bucharest®HEE®Heure normale de l\u2019Europe de l\u2019Est®HAEE®Heure avanc\u00e9e de l\u2019Europe de l\u2019Est®©America/Montreal®HNE®Heure normale de l\u2019Est®HAE®Heure avanc\u00e9e de l\u2019Est®©America/Los_Angeles®HNP (\u00c9UA)®Heure normale du Pacifique (\u00c9UA)®HAP (\u00c9UA)®Heure avanc\u00e9e du Pacifique (\u00c9UA)®©America/Vancouver®HNP®Heure normale du Pacifique®HAP®Heure avanc\u00e9e du Pacifique®©America/Denver®HNR (\u00c9UA)®Heure normale des Rocheuses (\u00c9UA)®HAR (\u00c9UA)®Heure avanc\u00e9e des Rocheuses (\u00c9UA)®©America/Winnipeg®HNC®Heure normale du Centre®HAC®Heure avanc\u00e9e du Centre®©America/Edmonton®HNR®Heure normale des Rocheuses®HAR®Heure avanc\u00e9e des Rocheuses®©Asia/Jerusalem®HNI®Heure normale d\u2019Isra\u00ebl®HAI®Heure avanc\u00e9e d\u2019Isra\u00ebl®©America/Phoenix®HNR (\u00c9UA)®Heure normale des Rocheuses (\u00c9UA)®HAR (\u00c9UA)®Heure avanc\u00e9e des Rocheuses (\u00c9UA)®©America/Chicago®HNC (\u00c9UA)®Heure normale du Centre (\u00c9UA)®HAC (\u00c9UA)®Heure avanc\u00e9e du Centre (\u00c9UA)®©America/Indianapolis®HNE (\u00c9UA)®Heure normale de l\u2019Est (\u00c9UA)®HAE (\u00c9UA)®Heure avanc\u00e9e de l\u2019Est (\u00c9UA)®©America/St_Johns®HNT®Heure normale de Terre-Neuve®HAT®Heure avanc\u00e9e de Terre-Neuve®©America/Anchorage®HNAK®Heure normale de l\u2019Alaska®HAAK®Heure avanc\u00e9e de l\u2019Alaska®©Asia/Shanghai®HNC®Heure normale de Chine®HAC®Heure avanc\u00e9e de Chine®©Asia/Tokyo®HNJ®Heure normale du Japon®HAJ®Heure avanc\u00e9e du Japon®©Europe/Paris®HNEC®Heure normale de l\u2019Europe centrale®HAEC®Heure avanc\u00e9e de l\u2019Europe centrale®©America/New_York®HNE (\u00c9UA)®Heure normale de l\u2019Est (\u00c9UA)®HAE (\u00c9UA)®Heure avanc\u00e9e de l\u2019Est (\u00c9UA)®©America/Halifax®HNA®Heure normale de l\u2019Atlantique®HAA®Heure avanc\u00e9e de l\u2019Atlantique®©
territories.TL=Timor-Leste
territories.TK=Tokelau
territories.TJ=Tadjikistan
@@ -792,8 +314,8 @@ territories.GL=Groenland
territories.SV=El Salvador
territories.062=Asie centrale et du Sud
territories.ST=Sao Tom\u00e9-et-Principe
-territories.GI=Gibraltar
territories.061=Polyn\u00e9sie
+territories.GI=Gibraltar
territories.GH=Ghana
territories.SR=Suriname
territories.GF=Guyane fran\u00e7aise
@@ -816,13 +338,13 @@ territories.SC=Seychelles
territories.SB=\u00celes Salomon
territories.SA=Arabie saoudite
territories.FR=France
-territories.FO=\u00celes F\u00e9ro\u00e9
territories.057=Micron\u00e9sie
+territories.FO=\u00celes F\u00e9ro\u00e9
territories.FM=Micron\u00e9sie
territories.RW=Rwanda
territories.054=M\u00e9lan\u00e9sie
-territories.FK=\u00celes Falkland (Malvinas)
territories.053=Australie et Nouvelle-Z\u00e9lande
+territories.FK=\u00celes Falkland (Malvinas)
territories.RU=Russie
territories.FJ=Fidji
territories.FI=Finlande
@@ -831,19 +353,20 @@ territories.RE=R\u00e9union
territories.ET=\u00c9thiopie
territories.ES=Espagne
territories.ER=\u00c9rythr\u00e9e
-territories.EH=Sahara occidental
territories.833=\u00cele de Man
+territories.EH=Sahara occidental
territories.EG=\u00c9gypte
-territories.EE=Estonie
territories.830=\u00celes Anglo-Normandes
+territories.EE=Estonie
+territories.QO=Autre Oc\u00e9anie
territories.EC=\u00c9quateur
territories.DZ=Alg\u00e9rie
territories.QA=Qatar
territories.039=Europe m\u00e9ridionale
territories.DO=R\u00e9publique dominicaine
territories.PY=Paraguay
-territories.DM=Dominique
territories.035=Asie du Sud-Est
+territories.DM=Dominique
territories.PW=Palaos
territories.DK=Danemark
territories.DJ=Djibouti
@@ -866,6 +389,7 @@ territories.CX=\u00cele Christmas
territories.CV=Cap Vert
territories.PA=Panama
territories.CU=Cuba
+territories.CS=Serbie-et-Mont\u00e9n\u00e9gro
territories.CR=Costa Rica
territories.029=Cara\u00efbes
territories.CO=Colombie
@@ -873,8 +397,8 @@ territories.CN=Chine
territories.CM=Cameroun
territories.CL=Chili
territories.CK=\u00celes Cook
-territories.021=Am\u00e9rique du Nord
territories.CI=C\u00f4te d\u2019Ivoire
+territories.021=Am\u00e9rique du Nord
territories.CH=Suisse
territories.CG=Congo
territories.CF=R\u00e9publique centrafricaine
@@ -893,25 +417,24 @@ territories.BR=Br\u00e9sil
territories.019=Am\u00e9riques
territories.018=Afrique australe
territories.NZ=Nouvelle-Z\u00e9lande
-territories.017=Afrique centrale
territories.BO=Bolivie
+territories.017=Afrique centrale
territories.BN=Brunei
-territories.015=Afrique septentrionale
territories.BM=Bermudes
+territories.015=Afrique septentrionale
territories.014=Afrique orientale
territories.013=Am\u00e9rique centrale
territories.NU=Niu\u00e9
territories.BJ=Benin
-territories.011=Afrique occidentale
territories.BI=Burundi
-territories.172=Commonwealth of Independent States
+territories.011=Afrique occidentale
territories.BH=Bahre\u00efn
+territories.172=Commonwealth of Independent States
territories.NR=Nauru
territories.BG=Bulgarie
territories.BF=Burkina Faso
territories.NP=N\u00e9pal
territories.BE=Belgique
-territories.ZZ=Autre Oc\u00e9anie
territories.NO=Norv\u00e8ge
territories.BD=Bangladesh
territories.BB=Barbade
@@ -932,15 +455,15 @@ territories.AU=Australie
territories.AT=Autriche
territories.AS=Samoa am\u00e9ricaines
territories.AR=Argentine
-territories.AQ=Antarctique
territories.009=Oc\u00e9anie
+territories.AQ=Antarctique
territories.MZ=Mozambique
territories.AO=Angola
territories.MY=Malaisie
territories.AN=Antilles n\u00e9erlandaises
territories.MX=Mexique
-territories.AM=Arm\u00e9nie
territories.005=Am\u00e9rique du Sud
+territories.AM=Arm\u00e9nie
territories.MW=Malawi
territories.AL=Albanie
territories.MV=Maldives
@@ -949,8 +472,8 @@ territories.ZA=Afrique du Sud
territories.MU=Maurice
territories.002=Afrique
territories.MT=Malte
-territories.AI=Anguilla
territories.001=Monde
+territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauritanie
territories.AG=Antigua-et-Barbuda
@@ -964,7 +487,6 @@ territories.MN=Mongolie
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Mac\u00e9doine
-territories.YU=Yougoslavie
territories.YT=Mayotte
territories.MH=\u00celes Marshall
territories.MG=Madagascar
@@ -1041,10 +563,9 @@ territories.TR=Turquie
territories.TO=Tonga
territories.TN=Tunisie
territories.TM=Turkmenistan
-languages.gwi=gwich\u02bbin
languages.akk=akkadien
+languages.gwi=gwich\u02bcin
languages.eka=ekajuk
-languages.ijo=ijo
languages.xh=xhosa
languages.sux=sum\u00e9rien
languages.sus=soussou
@@ -1055,20 +576,20 @@ languages.pon=pohnpei
languages.min=minangkabau
languages.suk=sukuma
languages.wo=wolof
-languages.lol=mongo
languages.kut=kutenai
+languages.lol=mongo
languages.mic=micmac
languages.wa=wallon
languages.kum=koumyk
languages.zap=zapot\u00e8que
languages.cus=couchitiques (autre)
-languages.jbo=lojban
languages.doi=dogra
+languages.jbo=lojban
languages.vo=volap\u00fck
languages.oto=langues otomangues
languages.vi=vietnamien
languages.vai=va\u00ef
-languages.rar=rarotongan
+languages.rar=Rarotonga
languages.ve=venda
languages.rap=rapanui
languages.raj=rajasthani
@@ -1087,8 +608,8 @@ languages.egy=\u00e9gyptien (ancien)
languages.ug=ou\u00efgour
languages.fan=fang
languages.ssa=nilo-sahariennes (autre)
-languages.mga=irlandais moyen (900-1200)
languages.bat=baltique (autre)
+languages.mga=irlandais moyen (900-1200)
languages.nyo=nyoro
languages.bas=bassa
languages.nyn=nyankol\u00e9
@@ -1116,8 +637,8 @@ languages.kru=kurukh
languages.tg=tadjik
languages.byn=blin
languages.te=t\u00e9lougou
-languages.kro=kru
languages.csb=cashubian
+languages.kro=kru
languages.ta=tamoul
languages.tkl=tokelau
languages.efi=efik
@@ -1141,8 +662,8 @@ languages.sk=slovaque
languages.grb=grebo
languages.si=singhalais
languages.sh=serbo-croate
-languages.crh=turc de Crim\u00e9e; tatar de Crim\u00e9e
languages.afa=afro-asiatique (autre)
+languages.crh=turc de Crim\u00e9e; tatar de Crim\u00e9e
languages.sg=sango
languages.se=sami du Nord
languages.sd=sindhi
@@ -1156,7 +677,6 @@ languages.ro=roumain
languages.rn=roundi
languages.rm=rh\u00e9to-roman
languages.mdf=moksa
-languages.tiv=tiv
languages.ady=adygu\u00e9
languages.zun=zuni
languages.kpe=kpell\u00e9
@@ -1166,14 +686,14 @@ languages.son=songhai
languages.cpp=pidgin portugais (autre)
languages.sog=sogdien
languages.ada=adangme
-languages.kos=kusaien
-languages.hit=hittite
languages.cpf=pidgin fran\u00e7ais (autre)
+languages.hit=hittite
+languages.kos=kusaien
languages.cpe=pidgin anglais (autre)
languages.him=himachali
-languages.kok=konkani
-languages.hil=hiligaynon
languages.got=gotique
+languages.hil=hiligaynon
+languages.kok=konkani
languages.gor=gorontalo
languages.gon=gondi
languages.din=dinka
@@ -1187,7 +707,6 @@ languages.snk=sonink\u00e9
languages.cop=copte
languages.yap=yapois
languages.ach=acoli
-languages.yao=yao
languages.phi=philippines (autre)
languages.pl=polonais
languages.ace=aceh
@@ -1218,7 +737,7 @@ languages.btk=batak
languages.myv=erzya
languages.dgr=dogrib
languages.ny=nyanja
-languages.myn=langue maya
+languages.myn=langues maya
languages.nv=navaho
languages.kmb=kiMboundou
languages.nr=nd\u00e9b\u00e9l\u00e9 du Sud
@@ -1231,7 +750,7 @@ languages.ng=ndonga
languages.sla=slaves (autre)
languages.ne=n\u00e9palais
languages.nd=nd\u00e9b\u00e9l\u00e9 du Nord
-languages.cmc=chames, langues
+languages.cmc=langues chames
languages.tet=tetum
languages.nb=bokm\u00e5l norv\u00e9gien
languages.na=nauruan
@@ -1240,26 +759,26 @@ languages.tem=temne
languages.my=birman
languages.lez=lezghien
languages.mt=maltais
-languages.peo=perse, vieux (ca. 600-400 av. J.-C.)
+languages.peo=vieux perser (ca. 600-400 av. J.-C.)
languages.ms=malais
languages.mr=marathe
languages.fro=vieux fran\u00e7ais (842-ca.1400)
languages.mo=moldave
-languages.frm=fran\u00e7ais moyen (ca.1400-1600)
languages.mn=mongol
-languages.jrb=jud\u00e9o-arabe
+languages.frm=fran\u00e7ais moyen (ca.1400-1600)
languages.ml=malayalam
+languages.jrb=jud\u00e9o-arabe
languages.mk=mac\u00e9donien
languages.mi=maori
languages.mh=marshall
languages.mg=malgache
languages.mwr=marwari
languages.bra=braj
-languages.den=slave
languages.lv=letton
+languages.den=slave (athapascan)
languages.lu=luba-katanga
-languages.del=delaware
languages.lt=lituanien
+languages.del=delaware
languages.lo=lao
languages.ln=lingala
languages.li=limbourgeois
@@ -1274,7 +793,7 @@ languages.ky=kirghize
languages.kw=cornique
languages.kv=komi
languages.ku=kurde
-languages.sio=sioux, langues
+languages.sio=langues sioux
languages.ks=kashmiri
languages.kr=kanouri
languages.awa=awadhi
@@ -1283,23 +802,22 @@ languages.kn=kannada
languages.km=khmer
languages.kl=groenlandais
languages.kk=kazakh
-languages.rom=tsigane
+languages.rom=tzigane
languages.kj=kuanyama
languages.sid=sidamo
languages.ki=kikuyu
languages.kg=kongo
-languages.non=norrois, vieux
+languages.non=vieux norrois
languages.ka=g\u00e9orgien
languages.mus=creek
languages.roa=romanes (autre)
languages.nog=noga\u00ef, nogay
-languages.mun=mounda, langues
+languages.mun=langues mounda
languages.mul=langues multiples
languages.jv=javanais
languages.gil=gilbertais
languages.znd=zande
languages.shn=chan
-languages.fon=fon
languages.xal=kalmouk
languages.aus=langues australiennes
languages.kho=khotanais
@@ -1312,38 +830,38 @@ languages.iu=inuktitut
languages.pap=papiamento
languages.it=italien
languages.sgn=langues des signes
-languages.is=islandais
languages.kha=khasi
+languages.is=islandais
languages.chr=cherokee
languages.pam=pampanga
languages.pal=pahlavi
languages.chp=chippewyan
-languages.io=ido
languages.cho=choctaw
+languages.io=ido
languages.chn=jargon chinook
languages.chm=mari
languages.tyv=touva
languages.bnt=bantou
languages.pag=pangasinan
-languages.ik=inupiaq
languages.chk=chuuk
-languages.ii=yi de Sichuan
+languages.ik=inupiaq
languages.haw=hawa\u00efen
+languages.ii=yi de Sichuan
languages.lam=lamba
-languages.ig=igbo
languages.chg=jagataic
+languages.ig=igbo
languages.sga=irlandais ancien (jusqu\u2019\u00e0 900)
languages.paa=papoues (autre)
languages.ie=interlingue
languages.id=indon\u00e9sien
languages.lah=lahnda
-languages.day=dayak
languages.chb=chibcha
+languages.day=dayak
languages.ia=interlingua
languages.lad=ladino
-languages.hz=h\u00e9r\u00e9ro
-languages.hai=haida
languages.dar=dargwa
+languages.hai=haida
+languages.hz=h\u00e9r\u00e9ro
languages.hy=arm\u00e9nien
languages.ath=langues athapascanes
languages.hu=hongrois
@@ -1356,7 +874,7 @@ languages.dyu=dyula
languages.he=h\u00e9breu
languages.ast=asturien
languages.ha=haoussa
-languages.wen=sorabes, langues
+languages.wen=langues sorabes
languages.gv=manx
languages.gu=goudjrati
languages.sem=s\u00e9mitiques (autre)
@@ -1365,9 +883,9 @@ languages.iro=langues iroquoiennes
languages.gn=guarani
languages.gl=galicien
languages.arw=arawak
-languages.gez=gu\u00e8ze
-languages.art=artificielle (autre)
languages.gd=ga\u00e9lique \u00e9cossais
+languages.art=artificielle (autre)
+languages.gez=gu\u00e8ze
languages.ira=iranien
languages.ga=irlandais
languages.arp=arapaho
@@ -1375,9 +893,9 @@ languages.arn=araukan
languages.fy=frison
languages.bla=pieds-noirs
languages.gem=germanique (autre)
-languages.ypk=yupik, langues
-languages.arc=aram\u00e9en
+languages.ypk=langues yupik
languages.fr=fran\u00e7ais
+languages.arc=aram\u00e9en
languages.fo=f\u00e9ro\u00efen
languages.cel=langue celtique (autre)
languages.fj=fidjien
@@ -1395,18 +913,17 @@ languages.en=anglais
languages.el=grec
languages.tut=alta\u00efques (autre)
languages.niu=niu\u00e9
-languages.tup=tupi, langues
+languages.tup=langues tupi
languages.ee=\u00e9w\u00e9
languages.tum=tumbuka
languages.mos=mossi
languages.dz=dzongkha
languages.nic=nig\u00e9ro-congolaise (autre)
-languages.lus=lushai
-languages.fiu=langue finno-ougrienne (autre)
languages.dv=maldivien
+languages.fiu=langue finno-ougrienne (autre)
+languages.lus=lushai
languages.nia=nias
languages.moh=mohawk
-languages.luo=luo
languages.lun=lunda
languages.apa=langues apaches
languages.lui=luiseno
@@ -1421,35 +938,35 @@ languages.war=waray
languages.da=danois
languages.dum=n\u00e9erlandais moyen (ca. 1050-1350)
languages.wal=walamo
-languages.mno=manobo, langues
-languages.wak=wakashennes, langues
+languages.mno=langues manobo
+languages.wak=langues wakashennes
languages.sat=santal
languages.cy=gallois
languages.sas=sasak
-languages.kbd=kabardine
languages.cv=tchouvache
+languages.kbd=kabardine
languages.cu=slavon d\u2019\u00e9glise
languages.mni=manipuri
languages.cs=tch\u00e8que
languages.sam=samaritain
languages.cr=cree
-languages.sal=salisha, langues
+languages.sal=langues salisha
languages.dua=douala
languages.co=corse
languages.sai=indiennes d\u2019Am\u00e9rique du Sud (autre)
languages.mnc=mandchou
languages.sah=iakoute
-languages.kaw=kawi
-languages.inh=ingouche
languages.gba=gbaya
+languages.inh=ingouche
+languages.kaw=kawi
languages.sad=sandawe
languages.ch=chamorro
-languages.ine=langue indo-europ\u00e9enne (autre)
languages.bho=bhojpuri
+languages.ine=langue indo-europ\u00e9enne (autre)
languages.enm=anglais moyen (1100-1500)
-languages.kar=karen
-languages.inc=langue indo-aryenne (autre)
languages.ce=tch\u00e9tch\u00e8ne
+languages.inc=langue indo-aryenne (autre)
+languages.kar=karen
languages.gay=gayo
languages.ca=catalan
languages.umb=umbundu
@@ -1457,19 +974,19 @@ languages.syr=syriaque
languages.kam=kamba
languages.tsi=tsimshian
languages.ang=vieil anglais (ca.450-1100)
-languages.kac=kachin
languages.cau=langue caucasienne (autre)
+languages.kac=kachin
languages.kab=kabyle
-languages.kaa=kara-kalpak
languages.bs=bosniaque
-languages.car=caribe
+languages.kaa=kara-kalpak
languages.br=breton
+languages.car=caribe
languages.bo=tib\u00e9tain
languages.bn=bengali
languages.bm=bambara
languages.gaa=ga
-languages.cai=indien d\u2019Am\u00e9rique Centrale (autre)
languages.bi=bichlamar
+languages.cai=indien d\u2019Am\u00e9rique Centrale (autre)
languages.bh=bihari
languages.bg=bulgare
languages.be=bi\u00e9lorusse
@@ -1477,19 +994,19 @@ languages.cad=caddo
languages.ba=bachkir
languages.zu=zoulou
languages.zen=zenaga
-languages.pro=proven\u00e7al ancien (jusqu\u2019\u00e0 1500)
+languages.pro=vieux proven\u00e7al (jusqu\u2019\u00e0 1500)
languages.hsb=haut-sorabe
languages.az=az\u00e9ri
languages.ay=aymara
languages.av=avar
languages.as=assamais
-languages.dsb=bas-sorabe
languages.ar=arabe
-languages.ilo=iloko
+languages.dsb=bas-sorabe
languages.elx=\u00e9lamite
+languages.ilo=iloko
languages.zh=chinois
languages.an=aragonais
-languages.pra=pr\u00e2krit
+languages.pra=langues pr\u00e2krit
languages.am=amharique
languages.new=newari
languages.ak=akan
diff --git a/resource/gnu/java/locale/LocaleInformation_fr_CA.properties b/resource/gnu/java/locale/LocaleInformation_fr_CA.properties
index 4f614e797..9b0bb02cf 100644
--- a/resource/gnu/java/locale/LocaleInformation_fr_CA.properties
+++ b/resource/gnu/java/locale/LocaleInformation_fr_CA.properties
@@ -8,7 +8,6 @@
currencyFormat=#,##0.00 \u00a4;(#,##0.00\u00a4)
currenciesSymbol.CAD=$
currenciesSymbol.USD=$ US
-minNumberOfDaysInFirstWeek=4
firstDayOfWeek=sun
shortDateFormat=yy-MM-dd
mediumDateFormat=yy-MM-dd
diff --git a/resource/gnu/java/locale/LocaleInformation_ga.properties b/resource/gnu/java/locale/LocaleInformation_ga.properties
index d7e3e12c6..675a84db6 100644
--- a/resource/gnu/java/locale/LocaleInformation_ga.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ga.properties
@@ -6,759 +6,353 @@
# This file was automatically generated by gnu.localegen from CLDR.
localPatternChars=RbMLkUnsSElFtTauKcBeyrAC
-currenciesDisplayName.JOD=D\u00ednear Iord\u00e1nach
-currenciesDisplayName.BOV=Mvdol Bolavach
-currenciesDisplayName.XAU=\u00d3r
-currenciesDisplayName.FOK=Kronur Oile\u00e1in Fhar\u00f3
-currenciesDisplayName.LBP=Punt na Liob\u00e1ine
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Dong V\u00edtneamach
-currenciesDisplayName.TZS=Scilling na Tans\u00e1ine
-currenciesDisplayName.BOP=Peso na Bolaive
-currenciesDisplayName.KHR=Riel na Camb\u00f3ide
-currenciesDisplayName.XAM=Aonad Airgeada\u00edochta na h\u00c1ise
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Sean-Riel na Camb\u00f3ide
-currenciesDisplayName.ZMP=Punt Saimbiach
-currenciesDisplayName.AUP=Punt Astr\u00e1lach
-currenciesDisplayName.XAF=CFA Franc BEAC
-currenciesDisplayName.MTP=Punt Maltach
-currenciesDisplayName.GHR=Cedi Athluachtha Gh\u00e1na
-currenciesDisplayName.ZMK=Kwacha Saimbiach
-currenciesDisplayName.XAD=D\u00ednear \u00c1iseach Unit of Account
-currenciesDisplayName.GHP=Punt Gh\u00e1na
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Sean-Cedi Gh\u00e1na
-currenciesDisplayName.MTL=Lira Maltach
-currenciesDisplayName.AUD=Dollar Astr\u00e1lach
-currenciesDisplayName.USS=Dollar S.A.M. (an la c\u00e9anna)
-currenciesDisplayName.ITL=Lira Iod\u00e1lach
-currenciesDisplayName.USN=Dollar S.A.M. (an ch\u00e9ad l\u00e1 eile)
-currenciesDisplayName.GHC=Cedi Gh\u00e1na
-currenciesDisplayName.SGD=Dollar Singeap\u00f3ir
-currenciesDisplayName.PAB=Balboa Panamach
-currenciesDisplayName.LAK=Kip Laosach
-currenciesDisplayName.KGS=Som na Cirgeast\u00e1ine
-currenciesDisplayName.CHF=Franc na hEilv\u00e9ise
-currenciesDisplayName.ATS=Scilling Ostarach
-currenciesDisplayName.USD=Dollar S.A.M.
-currenciesDisplayName.ETD=Dollar na hAet\u00f3ipe
-currenciesDisplayName.BND=Dollar Bhr\u00fain\u00e9
-currenciesDisplayName.JMP=Punt Iam\u00e1cach
-currenciesDisplayName.ETB=Birr na hAet\u00f3ipe
-currenciesDisplayName.DZG=Franc Germinal Ailg\u00e9rach
-currenciesDisplayName.DZF=Franc Nua Ailg\u00e9rach
-currenciesDisplayName.DZD=D\u00ednear na hAilg\u00e9ire
-currenciesDisplayName.PYG=Guarani Pharagua
-currenciesDisplayName.LYP=Punt Libia
-currenciesDisplayName.JMD=Dollar Iam\u00e1cach
-currenciesDisplayName.ISK=Krona \u00cdoslannach
-currenciesDisplayName.ESP=Peseta Sp\u00e1inneach
-currenciesDisplayName.BMP=Punt Bheirmi\u00fada
-currenciesDisplayName.LYD=D\u00ednear Libia
-currenciesDisplayName.LYB=Lira \u00dadar\u00e1s M\u00edleata Briotanach Libia
-currenciesDisplayName.BMD=Dollar Bheirmi\u00fada
-currenciesDisplayName.NLG=Guilder \u00cdsilt\u00edreach
-currenciesDisplayName.MRO=Ouguiya na Marat\u00e1ine
-currenciesDisplayName.IRR=Rial Iar\u00e1nach
-currenciesDisplayName.SEK=Krona Sualannach
+currenciesDisplayName.YDD=D\u00ednear \u00c9imin
+currenciesDisplayName.TWD=Dollar Nua na T\u00e9av\u00e1ine
currenciesDisplayName.KES=Scilling C\u00e9iniach
-currenciesDisplayName.CFF=CFA Franc Phoblacht na hAfraice L\u00e1ir
+currenciesDisplayName.BYB=R\u00fabal Nua B\u00e9alar\u00faiseach (1994-1999)
+currenciesDisplayName.LKR=R\u00faip\u00ed Sr\u00ed Lanca
+currenciesDisplayName.RWF=Franc Ruanda
+currenciesDisplayName.TJS=Somoni na T\u00e1ids\u00edceast\u00e1ine
+currenciesDisplayName.SDP=Punt na S\u00fad\u00e1ine
+currenciesDisplayName.TJR=R\u00fabal na T\u00e1ids\u00edceast\u00e1ine
+currenciesDisplayName.AFN=Afgain\u00ed
+currenciesDisplayName.GRD=Drachma Gr\u00e9agach
+currenciesDisplayName.IEP=Punt \u00c9ireannach
currenciesDisplayName.ARS=Peso na Airgint\u00edne
+currenciesDisplayName.SDD=D\u00ednear na S\u00fad\u00e1ine
currenciesDisplayName.ARP=Peso na Airgint\u00edne (1983-1985)
-currenciesDisplayName.ARM=Peso Moneda Nacional Airgint\u00edneach
-currenciesDisplayName.TWD=Dollar Nua na T\u00e9av\u00e1ine
-currenciesDisplayName.SDP=Punt na S\u00fad\u00e1ine
currenciesDisplayName.GEL=Lari na Gr\u00faise
+currenciesDisplayName.AFA=Afgain\u00ed (1927-2002)
currenciesDisplayName.GEK=Kupon Larit na Gr\u00faise
-currenciesDisplayName.MQF=Franc Martinique
+currenciesDisplayName.CRC=Colon Ch\u00f3sta R\u00edce
currenciesDisplayName.FKP=Punt Oile\u00e1in Fh\u00e1clainne
+currenciesDisplayName.EEK=Kroon na hEast\u00f3ine
+currenciesDisplayName.HKD=Dollar Hong Cong
+currenciesDisplayName.MDL=Leu Mold\u00f3vach
currenciesDisplayName.ARA=Austral Airgint\u00edneach
-currenciesDisplayName.SDD=D\u00ednear na S\u00fad\u00e1ine
currenciesDisplayName.IQD=D\u00ednear Ir\u00e1cach
-currenciesDisplayName.TVD=Dollar Tuvalu
currenciesDisplayName.SCR=R\u00faip\u00ed na S\u00e9is\u00e9il
+currenciesDisplayName.VUV=Vatu Vanuat\u00fa
+currenciesDisplayName.DKK=Krone Danmhargach
+currenciesDisplayName.KPW=Won na C\u00f3ir\u00e9 Thuaidh
+currenciesDisplayName.GQE=Ekwele Guineana na Guine Me\u00e1nchriosa\u00ed
+currenciesDisplayName.IDR=Rupiah Indin\u00e9iseach
currenciesDisplayName.LVR=R\u00fabal Laitviach
-currenciesDisplayName.FJP=Punt Fhids\u00ed
+currenciesDisplayName.SOS=Scilling na S\u00f3m\u00e1ile
+currenciesDisplayName.AED=Dirham Aontas na n\u00c9im\u00edr\u00edochta\u00ed Arabacha
+currenciesDisplayName.BWP=Pula Botsu\u00e1nach
currenciesDisplayName.LVL=Lats Laitviach
-currenciesDisplayName.CDL=Zaire an Chong\u00f3
-currenciesDisplayName.CDG=Franc Phoblacht an Chong\u00f3
-currenciesDisplayName.CDF=Franc Congolais an Chong\u00f3
-currenciesDisplayName.FJD=Dollar Fhids\u00ed
+currenciesDisplayName.RUR=R\u00fabal R\u00faiseach (1991-1998)
currenciesDisplayName.NIO=Cordoba Oro Nicearagua
+currenciesDisplayName.ADP=Peseta And\u00f3ra
+currenciesDisplayName.FJD=Dollar Fhids\u00ed
currenciesDisplayName.MOP=Pataca Macao
-currenciesDisplayName.NIG=Cordoba \u00d3r Nicearagua
+currenciesDisplayName.RUB=R\u00fabal R\u00faiseach
+currenciesDisplayName.CDF=Franc Congolais an Chong\u00f3
currenciesDisplayName.NIC=Cordoba Nicearagua
-currenciesDisplayName.XTR=R\u00fabal Inaistrithe COMECON
-currenciesDisplayName.FIN=Markka Fionnlannach (1860-1962)
-currenciesDisplayName.FIM=Markka Fionnlannach
+currenciesDisplayName.DJF=Franc Djibouti
+currenciesDisplayName.ECV=Unidad de Valor Constante (UVC) Eacuad\u00f3ir
currenciesDisplayName.SBD=Dollar Oile\u00e1in Solomon
+currenciesDisplayName.UZS=Sum na h\u00daisb\u00e9iceast\u00e1ine
+currenciesDisplayName.ECS=Sucre Eacuad\u00f3ir
+currenciesDisplayName.PHP=Peso Filip\u00edneach
+currenciesDisplayName.THB=Baht na T\u00e9alainne
currenciesDisplayName.LUF=Franc Lucsamburg
-currenciesDisplayName.TTO=Sean-Dollar Oile\u00e1in na Tr\u00edon\u00f3ide agus Tob\u00e1ga
-currenciesDisplayName.AOS=Escudo Ang\u00f3lach
-currenciesDisplayName.AOR=Kwanza Reajustado Ang\u00f3lach (1995-1999)
-currenciesDisplayName.MNT=Tugrik Mong\u00f3lach
-currenciesDisplayName.HUF=Forint Ung\u00e1rach
-currenciesDisplayName.BIF=Franc na Bur\u00faine
-currenciesDisplayName.AON=Kwanza Nua Ang\u00f3lach (1990-2000)
-currenciesDisplayName.AOK=Kwanza Ang\u00f3lach (1977-1990)
+currenciesDisplayName.FIM=Markka Fionnlannach
currenciesDisplayName.TTD=Dollar Oile\u00e1in na Tr\u00edon\u00f3ide agus Tob\u00e1ga
currenciesDisplayName.SZL=Lilangeni na Suasalainne
-currenciesDisplayName.NHF=CFP Franc Nua-Inse Ghall
-currenciesDisplayName.GBP=Punt Steirling
+currenciesDisplayName.MNT=Tugrik Mong\u00f3lach
currenciesDisplayName.SAR=Riyal S\u00e1dach
+currenciesDisplayName.UAK=Karbovanetz \u00dacr\u00e1nach
+currenciesDisplayName.UAH=Hryvnia \u00dacr\u00e1nach
+currenciesDisplayName.HUF=Forint Ung\u00e1rach
+currenciesDisplayName.COP=Peso na Col\u00f3ime
+currenciesDisplayName.QAR=Rial Catarach
currenciesDisplayName.LTT=Talonas Liotu\u00e1nach
-currenciesDisplayName.INR=R\u00faip\u00ed India
currenciesDisplayName.PTE=Escudo Portaing\u00e9lach
-currenciesDisplayName.AOA=Kwanza Ang\u00f3lach
-currenciesDisplayName.PTC=Conto Portaing\u00e9alach
+currenciesDisplayName.AOR=Kwanza Reajustado Ang\u00f3lach (1995-1999)
+currenciesDisplayName.UYU=Peso Uruguayo Uragua
+currenciesDisplayName.GBP=Punt Steirling
+currenciesDisplayName.BIF=Franc na Bur\u00faine
+currenciesDisplayName.INR=R\u00faip\u00ed India
+currenciesDisplayName.ZRZ=Zaire S\u00e1\u00edreach
+currenciesDisplayName.AON=Kwanza Nua Ang\u00f3lach (1990-2000)
currenciesDisplayName.LTL=Lita Liotu\u00e1nach
+currenciesDisplayName.XFU=UIC-Franc Francach
currenciesDisplayName.KZT=Tenge Casacst\u00e1nach
-currenciesDisplayName.KZR=R\u00fabal Casacst\u00e1nach
-currenciesDisplayName.VGD=Dollar Oile\u00e1in Bhriotanacha na Maighdean
-currenciesDisplayName.NGP=Punt N\u00edg\u00e9arach
-currenciesDisplayName.MMX=Teastais Airgeadra Dollar Mhaenmar
+currenciesDisplayName.MZM=Metical M\u00f3saimb\u00edce
+currenciesDisplayName.UYP=Peso Uragua (1975-1993)
+currenciesDisplayName.AOK=Kwanza Ang\u00f3lach (1977-1990)
+currenciesDisplayName.BUK=Kyat Burmach
+currenciesDisplayName.GNS=Syli Guine
+currenciesDisplayName.XFO=Franc \u00d3r Francach
+currenciesDisplayName.PGK=Kina Nua-Ghuine Phapua
+currenciesDisplayName.SYP=Punt Siria
+currenciesDisplayName.MZE=Escudo M\u00f3saimb\u00edce
+currenciesDisplayName.OMR=Rial Omain
currenciesDisplayName.NGN=Naira N\u00edg\u00e9arach
+currenciesDisplayName.ZRN=Zaire Nua S\u00e1\u00edreach
+currenciesDisplayName.AOA=Kwanza Ang\u00f3lach
+currenciesDisplayName.CNY=Yuan Renminbi S\u00edneach
+currenciesDisplayName.MAF=Franc Mharac\u00f3
+currenciesDisplayName.GNF=Franc Guine
currenciesDisplayName.HTG=Gourde H\u00e1it\u00ed
-currenciesDisplayName.SYP=Punt Siria
-currenciesDisplayName.PSP=Punt Pailist\u00edneach
-currenciesDisplayName.BHD=D\u00ednear na Bair\u00e9ine
+currenciesDisplayName.MAD=Dirham Mharac\u00f3
currenciesDisplayName.MMK=Kyat Mhaenmar
+currenciesDisplayName.MYR=Ringgit Malaeisia
+currenciesDisplayName.LSL=Loti Leos\u00f3ta
+currenciesDisplayName.XEU=Aonad Airgeadra Eorpach
+currenciesDisplayName.BHD=D\u00ednear na Bair\u00e9ine
+currenciesDisplayName.SLL=Leone Shiarra Leon
+currenciesDisplayName.BTN=Ngultrum B\u00fat\u00e1nach
+currenciesDisplayName.TRL=Lira Turcach
+currenciesDisplayName.KMF=Franc Chom\u00f3ra
currenciesDisplayName.ANG=Guilder na nAntill\u00ed \u00cdsilt\u00edreach
currenciesDisplayName.CZK=Koruna Phoblacht na Seice
-currenciesDisplayName.IMP=Punt Steirling Oile\u00e1n Mhanann
-currenciesDisplayName.BGX=Teastais Airgeadra\u00ed Lev Bulg\u00e1rach
-currenciesDisplayName.LSL=Loti Leos\u00f3ta
-currenciesDisplayName.GAF=CFA Franc na Gab\u00faine
-currenciesDisplayName.BGO=Lev Bulg\u00e1rach (1879-1952)
+currenciesDisplayName.AZM=Manat Asarbaise\u00e1nach
+currenciesDisplayName.KYD=Dollar Oile\u00e1in Cayman
+currenciesDisplayName.GMD=Dalasi Gaimbia
currenciesDisplayName.BGN=Lev Nua Bulg\u00e1rach
-currenciesDisplayName.BGM=Lev Bulg\u00e1rach S\u00f3isiala\u00edoch
currenciesDisplayName.CAD=Dollar Ceanada
+currenciesDisplayName.MXV=Unidad de Inversion (UDI) Meicsiceo
currenciesDisplayName.BGL=Lev Bulg\u00e1rach Crua
-currenciesDisplayName.TRL=Lira Turcach
-currenciesDisplayName.KYD=Dollar Oile\u00e1in Cayman
-currenciesDisplayName.CYP=Punt na Cipire
+currenciesDisplayName.VEB=Bolivar Veinis\u00e9ala
+currenciesDisplayName.MLF=Franc Mhail\u00ed
currenciesDisplayName.ILS=Sheqel Nua Iosraelach
+currenciesDisplayName.MXP=Peso Airgid Meicsiceo (1861-1992)
+currenciesDisplayName.PES=Sol Pheiri\u00fa
currenciesDisplayName.GYD=Dollar na Gu\u00e1ine
-currenciesDisplayName.AMD=Dram Airm\u00e9anach
+currenciesDisplayName.MXN=Peso Meicsiceo
currenciesDisplayName.ILP=Punt Iosraelach
-currenciesDisplayName.MLF=Franc Mhail\u00ed
-currenciesDisplayName.ILL=Sheqel Iosraelach
-currenciesDisplayName.VEB=Bolivar Veinis\u00e9ala
-currenciesDisplayName.ALX=Teastais Airgeadra\u00ed Dollar na hAlb\u00e1ine
+currenciesDisplayName.SKK=Koruna na Sl\u00f3vaice
+currenciesDisplayName.CYP=Punt na Cipire
+currenciesDisplayName.XDR=Cearta Speisialta Tarraingthe
+currenciesDisplayName.PEN=Sol Nuevo Pheiri\u00fa
currenciesDisplayName.LRD=Dollar na Lib\u00e9ire
-currenciesDisplayName.ALV=Lek Valute Alb\u00e1nach
+currenciesDisplayName.PEI=Inti Pheiri\u00fa
+currenciesDisplayName.AMD=Dram Airm\u00e9anach
+currenciesDisplayName.BSD=Dollar na mBah\u00e1ma\u00ed
currenciesDisplayName.HRK=Kuna Cr\u00f3tach
-currenciesDisplayName.REF=Franc R\u00e9union
+currenciesDisplayName.CLP=Peso na Sile
currenciesDisplayName.HRD=D\u00ednear na Cr\u00f3ite
-currenciesDisplayName.ALL=Lek Alb\u00e1nach
-currenciesDisplayName.JEP=Punt Steirling Gheirs\u00ed
-currenciesDisplayName.ALK=Lek Alb\u00e1nach (1946-1961)
-currenciesDisplayName.MKN=Denar na Macad\u00f3ine (1992-1993)
-currenciesDisplayName.VDP=Viet Minh Piastre Dong Viet V\u00edtneam Thuaidh
-currenciesDisplayName.VDN=Dong Nua V\u00edtneam Thuaidh
-currenciesDisplayName.MKD=Denar na Macad\u00f3ine
-currenciesDisplayName.VDD=Piastre Dong Viet V\u00edtneam Thuaidh
-currenciesDisplayName.TPP=Pataca T\u00edom\u00f3ir
currenciesDisplayName.XPF=CFP Franc
-currenciesDisplayName.BEL=Franc Beilgeach (airgead\u00fail)
-currenciesDisplayName.GWP=Peso Guine-Bhissau
-currenciesDisplayName.KWD=D\u00ednear Cu\u00e1tach
-currenciesDisplayName.GWM=Mil Reis na Guine Portaing\u00e9ala\u00ed
-currenciesDisplayName.BEF=Franc Beilgeach
+currenciesDisplayName.FRF=Franc Francach
+currenciesDisplayName.BRR=Cruzeiro Brasa\u00edleach
+currenciesDisplayName.MKD=Denar na Macad\u00f3ine
+currenciesDisplayName.CLF=Unidades de Fomento na Sile
+currenciesDisplayName.ALL=Lek Alb\u00e1nach
+currenciesDisplayName.BRN=Cruzado Novo Brasa\u00edleach
+currenciesDisplayName.MWK=Kwacha na Mal\u00e1ive
+currenciesDisplayName.BRL=Real Brasa\u00edleach
currenciesDisplayName.TPE=Escudo T\u00edom\u00f3ir
-currenciesDisplayName.BEC=Franc Beilgeach (inathraithe)
-currenciesDisplayName.GWE=Escudo na Guine Portaing\u00e9ala\u00ed
+currenciesDisplayName.BRE=Cruzeiro Brasa\u00edleach (1990-1993)
+currenciesDisplayName.BRC=Cruzado Brasa\u00edleach
+currenciesDisplayName.BRB=Cruzeiro Novo Brasa\u00edleach (1967-1986)
+currenciesDisplayName.DEM=Deutsche Mark
+currenciesDisplayName.KWD=D\u00ednear Cu\u00e1tach
+currenciesDisplayName.XCD=Dollar Oirthear na Cairibe
+currenciesDisplayName.NPR=R\u00faip\u00ed Neipe\u00e1il
+currenciesDisplayName.GWP=Peso Guine-Bhissau
+currenciesDisplayName.YUN=D\u00ednear Inathraithe I\u00fagslavach
currenciesDisplayName.SVC=Colon na Salvad\u00f3ire
-currenciesDisplayName.CWG=Guilder Curacao
-currenciesDisplayName.BDT=Taka Bhanglaid\u00e9iseach
-currenciesDisplayName.TOS=Punt Steirling Tonga
-currenciesDisplayName.TOP=Pa\u02bbanga Tonga
+currenciesDisplayName.YUM=Noviy Dinar I\u00fagslavach
+currenciesDisplayName.BEL=Franc Beilgeach (airgead\u00fail)
+currenciesDisplayName.SIT=Tolar Sl\u00f3v\u00e9nach
+currenciesDisplayName.JPY=Yen Seap\u00e1nach
currenciesDisplayName.XOF=CFA Franc BCEAO
+currenciesDisplayName.MVR=Maldive Islands Rufiyaa
+currenciesDisplayName.GWE=Escudo na Guine Portaing\u00e9ala\u00ed
+currenciesDisplayName.BEF=Franc Beilgeach
+currenciesDisplayName.TOP=Pa\u02bbanga Tonga
+currenciesDisplayName.YUD=D\u00ednear Crua I\u00fagslavach
+currenciesDisplayName.BEC=Franc Beilgeach (inathraithe)
currenciesDisplayName.SUR=R\u00fabal S\u00f3v\u00e9adach
-currenciesDisplayName.SUN=R\u00fabal Nua S\u00f3v\u00e9adach
-currenciesDisplayName.NCF=Franc Germinal na Nua-Chalad\u00f3ine
-currenciesDisplayName.CVE=Escudo na Rinne Verde
-currenciesDisplayName.XNF=CFA Franc na nAntill\u00ed Francach
+currenciesDisplayName.ROL=Leu R\u00f3m\u00e1nach
+currenciesDisplayName.DDM=Ostmark na hOirGhearm\u00e1ine
+currenciesDisplayName.BDT=Taka Bhanglaid\u00e9iseach
+currenciesDisplayName.XBD=Aonad Cuntais Eorpach (XBD)
+currenciesDisplayName.AWG=Guilder Aruba
+currenciesDisplayName.XBC=Aonad Cuntais Eorpach (XBC)
+currenciesDisplayName.XBB=Aonad Airgeada\u00edochta Eorpach
+currenciesDisplayName.XBA=Aonad Ilchodach Eorpach
+currenciesDisplayName.NOK=Krone Ioruach
+currenciesDisplayName.MUR=R\u00faip\u00ed Oile\u00e1n Mhuir\u00eds
currenciesDisplayName.ZAR=Rand na hAfraice Theas
-currenciesDisplayName.DOP=Peso Doimineacach
-currenciesDisplayName.CUX=Teastais Airgeadra\u00ed Ch\u00faba
-currenciesDisplayName.ZAP=Punt na hAfraice Theas
+currenciesDisplayName.SHP=Punt San H\u00e9ilin
+currenciesDisplayName.XAU=\u00d3r
currenciesDisplayName.ZAL=Rand na hAfraice Theas (airgead\u00fail)
+currenciesDisplayName.VND=Dong V\u00edtneamach
+currenciesDisplayName.TZS=Scilling na Tans\u00e1ine
+currenciesDisplayName.GIP=Punt Ghiobr\u00e1ltair
currenciesDisplayName.TND=D\u00ednear na T\u00fain\u00e9ise
-currenciesDisplayName.CUP=Peso C\u00faba
-currenciesDisplayName.GUF=Franc Guiana na Gu\u00e1ine Franca\u00ed
+currenciesDisplayName.CVE=Escudo na Rinne Verde
currenciesDisplayName.UGX=Scilling Uganda
-currenciesDisplayName.LNR=R\u00faip\u00ed na Sioli\u00f3ne
-currenciesDisplayName.AIF=Franc Affars agus Issas
-currenciesDisplayName.VAL=Lira na Vatac\u00e1ine
-currenciesDisplayName.STE=Escudo Sao Tome agus Principe
+currenciesDisplayName.ZMK=Kwacha Saimbiach
+currenciesDisplayName.JOD=D\u00ednear Iord\u00e1nach
+currenciesDisplayName.XAF=CFA Franc BEAC
+currenciesDisplayName.LBP=Punt na Liob\u00e1ine
currenciesDisplayName.UGS=Scilling Uganda (1966-1987)
currenciesDisplayName.STD=Dobra Sao Tome agus Principe
-currenciesDisplayName.MHD=Dollar Oile\u00e1in Marshall
-currenciesDisplayName.NZP=Punt na Nua-Sh\u00e9alainne
currenciesDisplayName.WST=Tala Sam\u00f3 Thiar
-currenciesDisplayName.WSP=Punt Sam\u00f3 Thiar
-currenciesDisplayName.HNL=Lempira Hond\u00farais
-currenciesDisplayName.XMF=Nouveau Franc Ceannchathartha Francach
+currenciesDisplayName.KHR=Riel na Camb\u00f3ide
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Peso Doimineacach
+currenciesDisplayName.BOV=Mvdol Bolavach
+currenciesDisplayName.MTP=Punt Maltach
+currenciesDisplayName.USS=Dollar S.A.M. (an la c\u00e9anna)
+currenciesDisplayName.BOP=Peso na Bolaive
+currenciesDisplayName.MTL=Lira Maltach
+currenciesDisplayName.CUP=Peso C\u00faba
currenciesDisplayName.TMM=Manat na An Tuircm\u00e9anast\u00e1ine
-currenciesDisplayName.GTQ=Quetzal Guatamala
+currenciesDisplayName.USN=Dollar S.A.M. (an ch\u00e9ad l\u00e1 eile)
+currenciesDisplayName.SGD=Dollar Singeap\u00f3ir
currenciesDisplayName.NZD=Dollar na Nua-Sh\u00e9alainne
-currenciesDisplayName.SSP=Punt Albanach
-currenciesDisplayName.BBD=Dollar Bharbad\u00f3is
+currenciesDisplayName.USD=Dollar S.A.M.
+currenciesDisplayName.HNL=Lempira Hond\u00farais
+currenciesDisplayName.BOB=Boliviano
+currenciesDisplayName.ITL=Lira Iod\u00e1lach
+currenciesDisplayName.PAB=Balboa Panamach
+currenciesDisplayName.GTQ=Quetzal Guatamala
+currenciesDisplayName.LAK=Kip Laosach
+currenciesDisplayName.GHC=Cedi Gh\u00e1na
+currenciesDisplayName.AUD=Dollar Astr\u00e1lach
currenciesDisplayName.NAD=Dollar na Namaibe
+currenciesDisplayName.KGS=Som na Cirgeast\u00e1ine
currenciesDisplayName.MGF=Franc Madagascar
+currenciesDisplayName.CHF=Franc na hEilv\u00e9ise
+currenciesDisplayName.BBD=Dollar Bharbad\u00f3is
currenciesDisplayName.MGA=Ariary Madagascar
-currenciesDisplayName.EGP=Punt na h\u00c9igipte
-currenciesDisplayName.BZH=Dollar Hond\u00farais Bhriotanaigh
+currenciesDisplayName.PYG=Guarani Pharagua
currenciesDisplayName.PLZ=Zloty Polannach (1950-1995)
-currenciesDisplayName.BAN=D\u00ednear Nua Bhoisnia-Heirseagaiv\u00e9in
-currenciesDisplayName.PLX=Teastais Airgeadra Dollar SAM Polannach
-currenciesDisplayName.BAM=Marc Inathraithe Bhoisnia-Heirseagaiv\u00e9in
-currenciesDisplayName.BZD=Dollar na Beil\u00edse
-currenciesDisplayName.BAD=D\u00ednear Bhoisnia-Heirseagaiv\u00e9in
-currenciesDisplayName.PLN=Zloty Polannach
currenciesDisplayName.YER=Rial \u00c9imin
+currenciesDisplayName.ATS=Scilling Ostarach
+currenciesDisplayName.ETB=Birr na hAet\u00f3ipe
+currenciesDisplayName.BND=Dollar Bhr\u00fain\u00e9
+currenciesDisplayName.JMD=Dollar Iam\u00e1cach
+currenciesDisplayName.EGP=Punt na h\u00c9igipte
+currenciesDisplayName.PLN=Zloty Polannach
+currenciesDisplayName.DZD=D\u00ednear na hAilg\u00e9ire
+currenciesDisplayName.ISK=Krona \u00cdoslannach
currenciesDisplayName.SRG=Guilder Shuranaim
-currenciesDisplayName.CSK=Koruna Crua na Seicsl\u00f3vaice
+currenciesDisplayName.LYD=D\u00ednear Libia
+currenciesDisplayName.BZD=Dollar na Beil\u00edse
+currenciesDisplayName.BAM=Marc Inathraithe Bhoisnia-Heirseagaiv\u00e9in
+currenciesDisplayName.ESP=Peseta Sp\u00e1inneach
currenciesDisplayName.KRW=Won na C\u00f3ir\u00e9 Theas
+currenciesDisplayName.NLG=Guilder \u00cdsilt\u00edreach
+currenciesDisplayName.MRO=Ouguiya na Marat\u00e1ine
+currenciesDisplayName.BAD=D\u00ednear Bhoisnia-Heirseagaiv\u00e9in
+currenciesDisplayName.ZWD=Dollar Siomb\u00e1bach
+currenciesDisplayName.SEK=Krona Sualannach
+currenciesDisplayName.CSK=Koruna Crua na Seicsl\u00f3vaice
currenciesDisplayName.BYR=R\u00fabal B\u00e9alar\u00faiseach
-currenciesDisplayName.YEI=Imadi Riyal \u00c9imin
-currenciesDisplayName.BYL=R\u00fabal B\u00e9alar\u00faiseach (1992-1994)
-currenciesDisplayName.CSC=Koruna na Seicsl\u00f3vaice
-currenciesDisplayName.KRO=Sean-Won na C\u00f3ir\u00e9 Theas
-currenciesDisplayName.KRH=Hwan na C\u00f3ir\u00e9 Theas
-currenciesDisplayName.BYB=R\u00fabal Nua B\u00e9alar\u00faiseach (1994-1999)
-currenciesDisplayName.GRN=Drachma Nua Gr\u00e9agach
+currenciesDisplayName.IRR=Rial Iar\u00e1nach
currenciesDisplayName.PKR=R\u00faip\u00ed na Pacast\u00e1ine
-currenciesDisplayName.AFN=Afgain\u00ed
-currenciesDisplayName.ZWD=Dollar Siomb\u00e1bach
-currenciesDisplayName.LKR=R\u00faip\u00ed Sr\u00ed Lanca
-currenciesDisplayName.GRD=Drachma Gr\u00e9agach
-currenciesDisplayName.IEP=Punt \u00c9ireannach
-currenciesDisplayName.AFA=Afgain\u00ed (1927-2002)
-currenciesDisplayName.YDD=D\u00ednear \u00c9imin
-currenciesDisplayName.RWF=Franc Ruanda
-currenciesDisplayName.CRC=Colon Ch\u00f3sta R\u00edce
-currenciesDisplayName.TJS=Somoni na T\u00e1ids\u00edceast\u00e1ine
-currenciesDisplayName.TJR=R\u00fabal na T\u00e1ids\u00edceast\u00e1ine
-currenciesDisplayName.EEK=Kroon na hEast\u00f3ine
-currenciesDisplayName.GQP=Peseta Guineana na Guine Me\u00e1nchriosa\u00ed
-currenciesDisplayName.MDR=R\u00fabal C\u00fap\u00f3in Mold\u00f3vach
-currenciesDisplayName.HKD=Dollar Hong Cong
-currenciesDisplayName.DKK=Krone Danmhargach
-currenciesDisplayName.MDL=Leu Mold\u00f3vach
-currenciesDisplayName.GQF=Franco na Guine Me\u00e1nchriosa\u00ed
-currenciesDisplayName.GQE=Ekwele Guineana na Guine Me\u00e1nchriosa\u00ed
-currenciesDisplayName.IDR=Rupiah Indin\u00e9iseach
-currenciesDisplayName.AED=Dirham Aontas na n\u00c9im\u00edr\u00edochta\u00ed Arabacha
-currenciesDisplayName.KPW=Won na C\u00f3ir\u00e9 Thuaidh
-currenciesDisplayName.IDN=Rupiah Nua Indin\u00e9iseach
-currenciesDisplayName.BWP=Pula Botsu\u00e1nach
-currenciesDisplayName.MDC=Leu C\u00fap\u00f3in Mold\u00f3vach
-currenciesDisplayName.IDJ=Java Rupiah Indin\u00e9iseach
-currenciesDisplayName.KPP=Won Na nDaoine na C\u00f3ir\u00e9 Thuaidh
-currenciesDisplayName.IDG=Nica Guilder Indin\u00e9iseach
-currenciesDisplayName.VUV=Vatu Vanuat\u00fa
-currenciesDisplayName.XID=D\u00ednear Ioslamach
-currenciesDisplayName.SOS=Scilling na S\u00f3m\u00e1ile
-currenciesDisplayName.ADP=Peseta And\u00f3ra
-currenciesDisplayName.RUR=R\u00fabal R\u00faiseach (1991-1998)
-currenciesDisplayName.GPF=Franc Guadeloupe
-currenciesDisplayName.DJF=Franc Djibouti
-currenciesDisplayName.ADD=D\u00ednear And\u00f3ra
-currenciesDisplayName.MCG=Franc Germinal Mhonac\u00f3
-currenciesDisplayName.MCF=Franc Nouveau Mhonac\u00f3
-currenciesDisplayName.ECV=Unidad de Valor Constante (UVC) Eacuad\u00f3ir
-currenciesDisplayName.ECS=Sucre Eacuad\u00f3ir
-currenciesDisplayName.LIF=Franc Lichtinst\u00e9in
-currenciesDisplayName.RUB=R\u00fabal R\u00faiseach
-currenciesDisplayName.PHP=Peso Filip\u00edneach
-currenciesDisplayName.UZS=Sum na h\u00daisb\u00e9iceast\u00e1ine
-currenciesDisplayName.COP=Peso na Col\u00f3ime
-currenciesDisplayName.THB=Baht na T\u00e9alainne
-currenciesDisplayName.IBP=Punt Thuaisceart \u00c9ireann
-currenciesDisplayName.BUR=R\u00faip\u00ed Bhurma
-currenciesDisplayName.COF=CFA Franc Chong\u00f3
-currenciesDisplayName.BUK=Kyat Burmach
-currenciesDisplayName.COB=Peso P\u00e1ip\u00e9ir na Col\u00f3ime
-currenciesDisplayName.UZC=Som C\u00fap\u00f3in na h\u00daisb\u00e9iceast\u00e1ine
-currenciesDisplayName.UAK=Karbovanetz \u00dacr\u00e1nach
-currenciesDisplayName.QAR=Rial Catarach
-currenciesDisplayName.UAH=Hryvnia \u00dacr\u00e1nach
-currenciesDisplayName.GNS=Syli Guine
-currenciesDisplayName.CNY=Yuan Renminbi S\u00edneach
-currenciesDisplayName.MZM=Metical M\u00f3saimb\u00edce
-currenciesDisplayName.CNX=Teastais Airgeadra\u00ed Dollar SAM S\u00edneach
-currenciesDisplayName.UYU=Peso Uruguayo Uragua
-currenciesDisplayName.GNI=Franc Guine (1960-1972)
-currenciesDisplayName.SML=Lira San Marino
-currenciesDisplayName.CNP=Jen Min Piao Yuan S\u00edneach
-currenciesDisplayName.MZE=Escudo M\u00f3saimb\u00edce
-currenciesDisplayName.GNF=Franc Guine
-currenciesDisplayName.OMS=Rial Saidi Omain
-currenciesDisplayName.PGK=Kina Nua-Ghuine Phapua
-currenciesDisplayName.OMR=Rial Omain
-currenciesDisplayName.UYP=Peso Uragua (1975-1993)
-currenciesDisplayName.XFU=UIC-Franc Francach
-currenciesDisplayName.BTR=R\u00faip\u00ed na B\u00fat\u00e1ine
-currenciesDisplayName.ZRZ=Zaire S\u00e1\u00edreach
-currenciesDisplayName.MAF=Franc Mharac\u00f3
-currenciesDisplayName.MAD=Dirham Mharac\u00f3
-currenciesDisplayName.BTN=Ngultrum B\u00fat\u00e1nach
-currenciesDisplayName.XFO=Franc \u00d3r Francach
-currenciesDisplayName.UYF=Peso Fuerte Uragua
-currenciesDisplayName.MYR=Ringgit Malaeisia
-currenciesDisplayName.ZRN=Zaire Nua S\u00e1\u00edreach
-currenciesDisplayName.AZM=Manat Asarbaise\u00e1nach
-currenciesDisplayName.GMP=Punt Gaimbia
-currenciesDisplayName.KMF=Franc Chom\u00f3ra
-currenciesDisplayName.SLL=Leone Shiarra Leon
-currenciesDisplayName.GMD=Dalasi Gaimbia
-currenciesDisplayName.XEU=Aonad Airgeadra Eorpach
-currenciesDisplayName.BSP=Punt na mBah\u00e1ma\u00ed
-currenciesDisplayName.CMF=CFA Franc Chamar\u00fain
-currenciesDisplayName.MXV=Unidad de Inversion (UDI) Meicsiceo
-currenciesDisplayName.XEF=CFA Franc BCEAEC
-currenciesDisplayName.BSD=Dollar na mBah\u00e1ma\u00ed
-currenciesDisplayName.MXP=Peso Airgid Meicsiceo (1861-1992)
-currenciesDisplayName.MXN=Peso Meicsiceo
-currenciesDisplayName.PES=Sol Pheiri\u00fa
-currenciesDisplayName.GLK=Krone na Graonlainne
-currenciesDisplayName.BRZ=Cruzeiro Brasa\u00edleach (1942-1967)
-currenciesDisplayName.PEN=Sol Nuevo Pheiri\u00fa
-currenciesDisplayName.CLP=Peso na Sile
-currenciesDisplayName.SKK=Koruna na Sl\u00f3vaice
-currenciesDisplayName.PEI=Inti Pheiri\u00fa
-currenciesDisplayName.BRR=Cruzeiro Brasa\u00edleach
-currenciesDisplayName.XDR=Cearta Speisialta Tarraingthe
-currenciesDisplayName.FRG=Franc Germinal Francach/Franc Poincare
-currenciesDisplayName.FRF=Franc Francach
-currenciesDisplayName.BRN=Cruzado Novo Brasa\u00edleach
-currenciesDisplayName.CLF=Unidades de Fomento na Sile
-currenciesDisplayName.CLE=Escudo na Sile
-currenciesDisplayName.BRL=Real Brasa\u00edleach
-currenciesDisplayName.CLC=Condor na Sile
-currenciesDisplayName.BRE=Cruzeiro Brasa\u00edleach (1990-1993)
-currenciesDisplayName.DES=Sperrmark Gearm\u00e1nach
-currenciesDisplayName.MWP=Punt na Mal\u00e1ive
-currenciesDisplayName.BRC=Cruzado Brasa\u00edleach
-currenciesDisplayName.BRB=Cruzeiro Novo Brasa\u00edleach (1967-1986)
-currenciesDisplayName.MWK=Kwacha na Mal\u00e1ive
-currenciesDisplayName.PDR=Transdniestria R\u00fabal
-currenciesDisplayName.DEM=Deutsche Mark
-currenciesDisplayName.TDF=CFA Franc Sead
-currenciesDisplayName.PDN=R\u00fabal Nua Transdniestria
-currenciesDisplayName.PDK=R\u00fabal Cup\u00f3in Transdniestria
-currenciesDisplayName.NPR=R\u00faip\u00ed Neipe\u00e1il
-currenciesDisplayName.CKD=Dollar Oile\u00e1in Cook
-currenciesDisplayName.JPY=Yen Seap\u00e1nach
-currenciesDisplayName.MVR=Maldive Islands Rufiyaa
-currenciesDisplayName.XCF=CFA Nouveau Franc
-currenciesDisplayName.MVP=Maldive Islands R\u00faip\u00ed
-currenciesDisplayName.XCD=Dollar Oirthear na Cairibe
-currenciesDisplayName.SIT=Tolar Sl\u00f3v\u00e9nach
-currenciesDisplayName.YUR=D\u00ednear Leasaithe I\u00fagslavach
-currenciesDisplayName.AWG=Guilder Aruba
-currenciesDisplayName.YUO=D\u00ednear Dheireadh F\u00f3mhar I\u00fagslavach
-currenciesDisplayName.DDM=Ostmark na hOirGhearm\u00e1ine
-currenciesDisplayName.YUN=D\u00ednear Inathraithe I\u00fagslavach
-currenciesDisplayName.YUM=Noviy Dinar I\u00fagslavach
-currenciesDisplayName.YUG=D\u00ednear 1994 I\u00fagslavach
-currenciesDisplayName.YUF=D\u00ednear Ch\u00f3naidhm na hI\u00fagslaive
-currenciesDisplayName.RON=Leu Nua R\u00f3m\u00e1nach
-currenciesDisplayName.YUD=D\u00ednear Crua I\u00fagslavach
-currenciesDisplayName.ROL=Leu R\u00f3m\u00e1nach
-currenciesDisplayName.SIB=Tolar Bons Sl\u00f3v\u00e9anach
-currenciesDisplayName.NOK=Krone Ioruach
-currenciesDisplayName.MUR=R\u00faip\u00ed Oile\u00e1n Mhuir\u00eds
-currenciesDisplayName.XBD=Aonad Cuntais Eorpach (XBD)
-currenciesDisplayName.GIP=Punt Ghiobr\u00e1ltair
-currenciesDisplayName.VNS=Dong N\u00e1isi\u00fanta V\u00edtneamach
-currenciesDisplayName.XBC=Aonad Cuntais Eorpach (XBC)
-currenciesDisplayName.VNR=Dong Phoblacht V\u00edtneaim
-currenciesDisplayName.XBB=Aonad Airgeada\u00edochta Eorpach
-currenciesDisplayName.XBA=Aonad Ilchodach Eorpach
-currenciesDisplayName.KID=Dollar Chireabait\u00ed
-currenciesDisplayName.SHP=Punt San H\u00e9ilin
-currenciesDisplayName.VNN=Dong Nua V\u00edtneamach
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=A$
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=CHF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
+currenciesDisplayName.BMD=Dollar Bheirmi\u00fada
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=A\u00cd f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
currenciesSymbol.GNF=GF
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=A$
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=A\u00cd f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=Ean®Feabh®M\u00e1rta®Aib®Beal®Meith®I\u00fail®L\u00fan®MF\u00f3mh®DF\u00f3mh®Samh®Noll®®
months=Ean\u00e1ir®Feabhra®M\u00e1rta®Aibre\u00e1n®Bealtaine®Meitheamh®I\u00fail®L\u00fanasa®Me\u00e1n F\u00f3mhair®Deireadh F\u00f3mhair®Samhain®Nollaig®®
shortWeekdays=®Domh®Luan®M\u00e1irt®C\u00e9ad®D\u00e9ar®Aoine®Sath®
weekdays=®D\u00e9 Domhnaigh®D\u00e9 Luain®D\u00e9 M\u00e1irt®D\u00e9 C\u00e9adaoin®D\u00e9ardaoin®D\u00e9 hAoine®D\u00e9 Sathairn®
eras=RC®AD®
ampms=a.m.®p.m.®
-zoneStrings=Etc/GMT®MAG®Me\u00e1n-Am Greenwich®MAG®Me\u00e1n-Am Greenwich®©Europe/Dublin®MAG®Me\u00e1n-Am Greenwich®AS\u00c9®Am Samhraidh na h\u00c9ireann®©Europe/Belfast®MAG®Me\u00e1n-Am Greenwich®ASB®Am Samhraidh na Breataine®©Europe/London®MAG®Me\u00e1n-Am Greenwich®ASB®Am Samhraidh na Breataine®©
+zoneStrings=Europe/Dublin®MAG®Me\u00e1n-Am Greenwich®AS\u00c9®Am Samhraidh na h\u00c9ireann®©Europe/Belfast®MAG®Me\u00e1n-Am Greenwich®ASB®Am Samhraidh na Breataine®©Europe/London®MAG®Me\u00e1n-Am Greenwich®ASB®Am Samhraidh na Breataine®©
territories.TL=T\u00edom\u00f3r-Leste
territories.TK=T\u00f3cal\u00e1
territories.TJ=An T\u00e1ids\u00edceast\u00e1in
@@ -847,6 +441,7 @@ territories.CX=Oile\u00e1n na Nollag
territories.CV=Rinn Verde
territories.PA=Panama
territories.CU=C\u00faba
+territories.CS=An tSeirbia
territories.CR=C\u00f3sta R\u00edce
territories.CO=An Chol\u00f3im
territories.CN=An tS\u00edn
@@ -917,17 +512,16 @@ territories.AI=Anguilla
territories.MS=Montsarat
territories.MR=An Mharat\u00e1in
territories.AG=Antigua agus Barbuda
-territories.MQ=Martinique
territories.AF=An Afganast\u00e1in
-territories.MP=Oile\u00e1in Mariana Thuaidh
+territories.MQ=Martinique
territories.AE=Aontas na n\u00c9im\u00edr\u00edochta\u00ed Arabacha
-territories.MO=Mac\u00e1\u00f3 (R.R.S. na S\u00edne)
+territories.MP=Oile\u00e1in Mariana Thuaidh
territories.AD=And\u00f3ra
+territories.MO=Mac\u00e1\u00f3 (R.R.S. na S\u00edne)
territories.MN=An Mhong\u00f3il
territories.MM=Maenmar
territories.ML=Mail\u00ed
territories.MK=An Mhacad\u00f3in
-territories.YU=An I\u00fagslaiv
territories.YT=Mayotte
territories.MH=Oile\u00e1in Marshall
territories.MG=Madagascar
@@ -1001,8 +595,8 @@ territories.TM=An Tuircm\u00e9anast\u00e1in
languages.es=Sp\u00e1innis
languages.kw=Cornais
languages.eo=Esperanto
-languages.ks=Caism\u00edris
languages.en=B\u00e9arla
+languages.ks=Caism\u00edris
languages.el=Gr\u00e9igis
languages.qu=Ceatsuais
languages.ko=C\u00f3ir\u00e9is
@@ -1025,8 +619,8 @@ languages.cu=Slavais na hEaglaise
languages.cs=Seicis
languages.cr=Cra\u00edais
languages.iu=Ion\u00faitis
-languages.it=Iod\u00e1ilis
languages.co=Corsaicis
+languages.it=Iod\u00e1ilis
languages.is=\u00cdoslainnais
languages.haw=Hav\u00e1\u00edais
languages.uz=\u00daisb\u00e9icis
@@ -1086,11 +680,11 @@ languages.sr=Seirbis
languages.sq=Alb\u00e1inis
languages.ml=Mail\u00e9alaimis
languages.ab=Abc\u00e1isis
-languages.mk=Macad\u00f3inis
languages.aa=Afar
+languages.mk=Macad\u00f3inis
languages.so=Som\u00e1lais
-languages.mi=Maorais
languages.gd=Gaeilge na hAlban
+languages.mi=Maorais
languages.sm=Sam\u00f3is
languages.sl=Sl\u00f3v\u00e9inis
languages.mg=Malag\u00e1sais
@@ -1105,16 +699,16 @@ languages.sc=Saird\u00ednis
languages.sa=Sanscrait
languages.fr=Fraincis
languages.lv=Laitvis
-languages.lt=Liotu\u00e1inis
languages.fo=Far\u00f3is
+languages.lt=Liotu\u00e1inis
languages.ru=R\u00faisis
-languages.lo=Laosais
languages.fj=Fidsis
+languages.lo=Laosais
languages.fi=Fionnlainnis
languages.ro=Rom\u00e1inis
languages.fa=Peirsis
languages.lb=Leitseabuirgis
languages.la=Laidin
languages.eu=Bascais
-languages.ky=Cirgeasais
languages.et=East\u00f3inis
+languages.ky=Cirgeasais
diff --git a/resource/gnu/java/locale/LocaleInformation_gez.properties b/resource/gnu/java/locale/LocaleInformation_gez.properties
new file mode 100644
index 000000000..8e841da86
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_gez.properties
@@ -0,0 +1,298 @@
+# LocaleInformation_gez.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currenciesDisplayName.INR=\u12e8\u1215\u1295\u12f5 \u1229\u1352
+currenciesDisplayName.RUB=\u12e8\u122b\u123b \u1229\u1265\u120d
+currenciesDisplayName.JPY=\u12e8\u1303\u1353\u1295 \u12e8\u1295
+currenciesDisplayName.BRL=\u12e8\u1265\u122b\u12da\u120d \u122a\u120d
+currenciesDisplayName.CNY=\u12e8\u127b\u12ed\u1293 \u12e9\u12a0\u1295 \u1228\u1295\u121a\u1295\u1262
+currenciesDisplayName.USD=\u12e8\u12a0\u121c\u122a\u12ab\u1295 \u12f6\u120b\u122d
+currenciesDisplayName.EUR=\u12a0\u12cd\u122e
+currenciesDisplayName.ETB=\u12e8\u12a2\u1275\u12ee\u1335\u12eb \u1265\u122d
+currenciesDisplayName.GBP=\u12e8\u12a5\u1295\u130d\u120a\u12dd \u1353\u12cd\u1295\u12f5 \u1235\u1270\u122d\u120a\u1295\u130d
+currenciesSymbol.ETB=$
+currenciesSymbol.CNY=Y
+currenciesSymbol.USD=USD
+currenciesSymbol.BRL=R$
+shortMonths=\u1320\u1210\u1228®\u12a8\u1270\u1270®\u1218\u1308\u1260®\u12a0\u1280\u12d8®\u130d\u1295\u1263®\u1220\u1295\u12e8®\u1210\u1218\u1208®\u1290\u1210\u1230®\u12a8\u1228\u1218®\u1320\u1240\u1218®\u1280\u12f0\u1228®\u1280\u1220\u1220®®
+months=\u1320\u1210\u1228®\u12a8\u1270\u1270®\u1218\u1308\u1260®\u12a0\u1280\u12d8®\u130d\u1295\u1263\u1275®\u1220\u1295\u12e8®\u1210\u1218\u1208®\u1290\u1210\u1230®\u12a8\u1228\u1218®\u1320\u1240\u1218®\u1280\u12f0\u1228®\u1280\u1220\u1220®®
+shortWeekdays=®\u12a5\u1281\u12f5®\u1230\u1291\u12ed®\u1220\u1209\u1235®\u122b\u1265\u12d5®\u1210\u1219\u1235®\u12d3\u122d\u1260®\u1240\u12f3\u121a®
+weekdays=®\u12a5\u1281\u12f5®\u1230\u1291\u12ed®\u1220\u1209\u1235®\u122b\u1265\u12d5®\u1210\u1219\u1235®\u12d3\u122d\u1260®\u1240\u12f3\u121a\u1275®
+firstDayOfWeek=sat
+eras=\u12d3/\u12d3®\u12d3/\u121d®
+ampms=\u133d\u1263\u1215®\u121d\u1234\u1275®
+territories.AU=\u12a0\u12cd\u1235\u1275\u122c\u120a\u12eb
+territories.TD=\u127b\u12f5
+territories.AT=\u12a6\u1235\u1275\u122a\u12eb
+territories.GY=\u1309\u12eb\u1293
+territories.AR=\u12a0\u122d\u1300\u1295\u1272\u1293
+territories.GW=\u1262\u1233\u12ce
+territories.MY=\u121b\u120c\u12e2\u12eb
+territories.MX=\u121c\u12ad\u1232\u12ae
+territories.AN=\u1294\u12d8\u122d\u120b\u1295\u12f5\u1235\u1361\u12a0\u1295\u1272\u120d\u1235
+territories.AM=\u12a0\u122d\u121c\u1292\u12eb
+territories.GR=\u130d\u122a\u12ad
+territories.ZA=\u12f0\u1261\u1265\u1361\u12a0\u134d\u122a\u12ab
+territories.AL=\u12a0\u120d\u1263\u1292\u12eb
+territories.GQ=\u12a2\u12b3\u1276\u122a\u12eb\u120d\u1361\u130a\u1292
+territories.MU=\u121b\u1229\u1238\u1235
+territories.SY=\u1232\u122a\u12eb
+territories.MT=\u121b\u120d\u1273
+territories.GN=\u130a\u1292
+territories.MR=\u121e\u122a\u1274\u1292\u12eb
+territories.GM=\u130b\u121d\u1262\u12eb
+territories.MO=\u121b\u12ab\u12ce
+territories.AE=\u12e8\u1270\u1263\u1260\u1229\u1275\u1361\u12a0\u1228\u1265\u1361\u12a4\u121d\u122c\u1275\u1235
+territories.MN=\u121e\u1295\u130e\u120a\u12eb
+territories.AD=\u12a0\u1295\u12f6\u122b
+territories.MK=\u121b\u12a8\u12f6\u1292\u12eb
+territories.GF=\u12e8\u1348\u1228\u1295\u1233\u12ed\u1361\u1309\u12ca\u12a0\u1293
+territories.SO=\u1231\u121b\u120c
+territories.GE=\u1306\u122d\u1302\u12eb
+territories.SN=\u1234\u1294\u130b\u120d
+territories.GB=\u12a5\u1295\u130d\u120a\u12dd
+territories.SK=\u1235\u120e\u126b\u12aa\u12eb
+territories.SI=\u1235\u120e\u126c\u1292\u12eb
+territories.MD=\u121e\u120d\u12f6\u126b
+territories.SG=\u1232\u1295\u130b\u1356\u122d
+territories.MA=\u121e\u122e\u12ae
+territories.SE=\u1235\u12ca\u12f5\u1295
+territories.SD=\u1231\u12f3\u1295
+territories.SA=\u1233\u12cd\u12f5\u12a0\u1228\u1262\u12eb
+territories.YE=\u12e8\u1218\u1295
+territories.LY=\u120a\u1262\u12eb
+territories.FR=\u1348\u1228\u1295\u1233\u12ed
+territories.LV=\u120b\u1275\u126a\u12eb
+territories.LT=\u120a\u1271\u12cc\u1292\u12eb
+territories.FM=\u121a\u12ad\u122e\u1294\u12e2\u12eb
+territories.RU=\u122b\u123a\u12eb
+territories.FJ=\u134a\u1302
+territories.FI=\u134a\u1295\u120b\u1295\u12f5
+territories.RO=\u122e\u121c\u1292\u12eb
+territories.LB=\u120a\u1263\u1296\u1235
+territories.ET=\u12a2\u1275\u12ee\u1335\u12eb
+territories.ES=\u1235\u1354\u1295
+territories.KW=\u12ad\u12cc\u1275
+territories.ER=\u12a4\u122d\u1275\u122b
+territories.KR=\u1230\u121c\u1295\u1361\u12ae\u122a\u12eb
+territories.KP=\u12f0\u1261\u1265\u1361\u12ae\u122a\u12eb
+territories.EH=\u121d\u12d5\u122b\u1263\u12ca\u1361\u1233\u1205\u122b
+territories.KM=\u12ae\u121e\u122e\u1235
+territories.EG=\u130d\u1265\u133d
+territories.EE=\u12a4\u1235\u1276\u1292\u12eb
+territories.EC=\u12a2\u12b3\u12f6\u122d
+territories.KH=\u12ab\u121d\u1266\u12f2\u12eb
+territories.DZ=\u12a0\u120d\u1304\u122a\u12eb
+territories.DO=\u12f6\u121a\u1292\u12ad\u1361\u122a\u1351\u1265\u120a\u12ad
+territories.DM=\u12f6\u121a\u1292\u12ab
+territories.DK=\u12f4\u1295\u121b\u122d\u12ad
+territories.JP=\u1303\u1353\u1295
+territories.JO=\u1306\u122d\u12f3\u1295
+territories.PR=\u1356\u122d\u1273\u1361\u122a\u12ae
+territories.JM=\u1303\u121b\u12ed\u12ab
+territories.DE=\u1300\u122d\u1218\u1295
+territories.PL=\u1356\u120b\u1295\u12f5
+territories.PG=\u1353\u1351\u12cb\u1361\u1292\u12cd\u1361\u130a\u1292
+territories.PF=\u12e8\u1348\u1228\u1295\u1233\u12ed\u1361\u1356\u120a\u1294\u12e2\u12eb
+territories.PE=\u1354\u1229
+territories.CZ=\u127c\u12ad\u1361\u122a\u1351\u1265\u120a\u12ad
+territories.VI=\u12e8\u12a0\u121c\u122a\u12ab\u1361\u1268\u122d\u1302\u1295\u1361\u12f0\u1234\u1276\u127d
+territories.CY=\u1233\u12ed\u1355\u1228\u1235
+territories.VG=\u12e8\u12a5\u1295\u130d\u120a\u12dd\u1361\u12f5\u1295\u130d\u120d\u1361\u12f0\u1234\u1276\u127d
+territories.CV=\u12ac\u1355\u1361\u126c\u122d\u12f4
+territories.VE=\u126c\u1295\u12d9\u12cc\u120b
+territories.CS=\u1230\u122d\u1262\u12eb
+territories.CO=\u12ae\u120e\u121d\u1262\u12eb
+territories.IT=\u1323\u120a\u12eb\u1295
+territories.CN=\u127b\u12ed\u1293
+territories.IS=\u12a0\u12ed\u1235\u120b\u1295\u12f5
+territories.CM=\u12ab\u121c\u1229\u1295
+territories.CL=\u127a\u120a
+territories.IQ=\u12a2\u122b\u1245
+territories.UZ=\u12e9\u12dd\u1260\u12aa\u1235\u1273\u1295
+territories.IN=\u1205\u1295\u12f5
+territories.CH=\u1235\u12ca\u12d8\u122d\u120b\u1295\u12f5
+territories.IL=\u12a5\u1235\u122b\u12a4\u120d
+territories.CF=\u12e8\u1218\u12ab\u12a8\u1208\u129b\u12cd\u1361\u12a0\u134d\u122a\u12ab\u1361\u122a\u1350\u1265\u120a\u12ad
+territories.US=\u12a0\u121c\u122a\u12ab
+territories.IE=\u12a0\u12e8\u122d\u120b\u1295\u12f5
+territories.ID=\u12a2\u1295\u12f6\u1294\u12e2\u12eb
+territories.BZ=\u1264\u120a\u12d8
+territories.BY=\u1264\u120b\u1229\u1235
+territories.UG=\u12e9\u130b\u1295\u12f3
+territories.BT=\u1261\u1205\u1273\u1295
+territories.BR=\u1265\u122b\u12da\u120d
+territories.NZ=\u1292\u12cd\u1361\u12da\u120b\u1295\u12f5
+territories.HU=\u1200\u1295\u130b\u122a
+territories.BO=\u1266\u120a\u126a\u12eb
+territories.HT=\u1200\u12ed\u1272
+territories.BM=\u1264\u122d\u1219\u12f3
+territories.HR=\u12ad\u122e\u12a4\u123d\u12eb
+territories.TZ=\u1273\u1295\u12db\u1292\u12eb
+territories.BH=\u1263\u1205\u122c\u1295
+territories.BG=\u1261\u120d\u130c\u122a\u12eb
+territories.NP=\u1294\u1353\u120d
+territories.HK=\u1206\u1295\u130d\u1361\u12ae\u1295\u130d
+territories.TT=\u1275\u122a\u1292\u12f3\u12f5\u1361\u12a5\u1293\u1361\u1276\u1263\u130e
+territories.NO=\u1296\u122d\u12cc
+territories.BE=\u1264\u120d\u1304\u121d
+territories.TR=\u1271\u122d\u12ad
+territories.NL=\u1294\u12d8\u122d\u120b\u1295\u12f5
+territories.BB=\u1263\u122d\u1264\u12f6\u1235
+territories.BA=\u1266\u1235\u1292\u12eb\u1361\u12a5\u1293\u1361\u1204\u122d\u12de\u130e\u126a\u1292\u12eb
+territories.TN=\u1271\u1292\u12da\u12eb
+territories.TL=\u121d\u1235\u122b\u1245\u1361\u1272\u121e\u122d
+territories.NG=\u1293\u12ed\u1304\u122a\u12eb
+territories.TJ=\u1273\u1303\u12aa\u1235\u1273\u1295
+territories.AZ=\u12a0\u12d8\u122d\u1263\u1303\u1295
+territories.ZM=\u12db\u121d\u1262\u12eb
+territories.TH=\u1273\u12ed\u120b\u1295\u12f5
+territories.NC=\u1292\u12cd\u1361\u12ab\u120c\u12f6\u1292\u12eb
+territories.TF=\u12e8\u1348\u1228\u1295\u1233\u12ed\u1361\u12f0\u1261\u1263\u12ca\u1361\u130d\u12db\u1276\u127d
+territories.NA=\u1293\u121a\u1262\u12eb
+languages.es=\u1235\u1353\u1292\u123d
+languages.ku=\u12a9\u122d\u12f5\u123d\u129b
+languages.eo=\u12a4\u1235\u1350\u122b\u1295\u1276
+languages.en=\u12a5\u1295\u130d\u120a\u12dd\u129b
+languages.ks=\u12ab\u123d\u121a\u122d\u129b
+languages.el=\u130d\u122a\u12ad\u129b
+languages.qu=\u12b5\u127f\u129b
+languages.ko=\u12ae\u122a\u12eb\u129b
+languages.kn=\u12ab\u1293\u12f3\u129b
+languages.km=\u12ad\u1218\u122d\u129b
+languages.kl=\u12ab\u120b\u120a\u1231\u1275\u129b
+languages.kk=\u12ab\u12db\u12ad\u129b
+languages.wo=\u12ce\u120e\u134d\u129b
+languages.ka=\u130a\u12ee\u122d\u130a\u12eb\u1295
+languages.dz=\u12f5\u12de\u1295\u130d\u12bb\u129b
+languages.jv=\u1303\u126b\u1295\u129b
+languages.pt=\u1356\u122d\u1271\u130b\u120a\u129b
+languages.ps=\u1351\u123d\u1276\u129b
+languages.de=\u1300\u122d\u1218\u1295
+languages.pl=\u1356\u120a\u123d
+languages.da=\u12f4\u1292\u123d
+languages.vo=\u126e\u120b\u1351\u12ad\u129b
+languages.ja=\u1303\u1353\u1295\u129b
+languages.vi=\u126a\u1275\u1293\u121d\u129b
+languages.cy=\u12c8\u120d\u123d
+languages.pa=\u1353\u1295\u1303\u1262\u129b
+languages.cs=\u127c\u12ad\u129b
+languages.iu=\u12a5\u1291\u12ad\u1272\u1271\u1275\u129b
+languages.co=\u12ae\u122d\u1232\u12ab\u129b
+languages.it=\u1323\u120a\u12eb\u1295\u129b
+languages.is=\u12a0\u12ed\u1235\u120b\u1295\u12f5\u129b
+languages.uz=\u12a1\u12dd\u1260\u12ad\u129b
+languages.or=\u12a6\u122a\u12eb\u129b
+languages.ik=\u12a5\u1291\u1352\u12eb\u1245\u129b
+languages.ur=\u12a1\u122d\u12f1\u129b
+languages.om=\u12a6\u122e\u121d\u129b
+languages.ca=\u12ab\u1273\u120b\u1295\u129b
+languages.ie=\u12a5\u1295\u1270\u122d\u120a\u1295\u130d\u12c8
+languages.id=\u12a5\u1295\u12f6\u1292\u1232\u129b
+languages.uk=\u12e9\u12ad\u1228\u1292\u129b
+languages.ia=\u12a2\u1295\u1274\u122d\u120a\u1295\u1313
+languages.oc=\u12a6\u12aa\u1273\u1295\u129b
+languages.ug=\u12a1\u12ca\u130d\u1201\u122d\u129b
+languages.hy=\u12a0\u122d\u1218\u1293\u12ca
+languages.br=\u1265\u122c\u1276\u1295\u129b
+languages.hu=\u1200\u1295\u130b\u122a\u129b
+languages.bo=\u1275\u1260\u1275\u1295\u129b
+languages.bn=\u1260\u1295\u130b\u120a\u129b
+languages.hr=\u12ad\u122e\u123d\u12eb\u1295\u129b
+languages.bi=\u1262\u1235\u120b\u121d\u129b
+languages.tw=\u1275\u12ca\u129b
+languages.bh=\u1262\u1203\u122a
+languages.bg=\u1261\u120d\u130b\u122a\u129b
+languages.tt=\u1273\u1273\u122d\u129b
+languages.no=\u1296\u122d\u12cc\u1302\u12eb\u1295
+languages.be=\u1264\u120b\u122b\u123b\u129b
+languages.ts=\u133e\u1295\u130b\u129b
+languages.hi=\u1210\u1295\u12f5\u129b
+languages.tr=\u1271\u122d\u12ad\u129b
+languages.nl=\u12f0\u127d
+languages.zu=\u12d9\u1209\u129b
+languages.ba=\u1263\u1235\u12aa\u122d\u129b
+languages.to=\u1276\u1295\u130b
+languages.he=\u12d5\u1265\u122b\u1235\u1325
+languages.tn=\u133d\u12cb\u1293\u12ca\u129b
+languages.tl=\u1273\u130b\u120e\u1308\u129b
+languages.tk=\u1271\u122d\u12ad\u1218\u1295\u129b
+languages.ha=\u1203\u12cd\u1233\u129b
+languages.ne=\u1294\u1353\u120a\u129b
+languages.az=\u12a0\u12dc\u122d\u1263\u12ed\u1303\u1295\u129b
+languages.ti=\u1275\u130d\u122d\u129b
+languages.ay=\u12a0\u12eb\u121b\u122d\u129b
+languages.th=\u1273\u12ed\u129b
+languages.tg=\u1273\u1302\u12aa\u129b
+languages.na=\u1293\u12a1\u1229
+languages.te=\u1270\u1209\u1309\u129b
+languages.zh=\u127b\u12ed\u1295\u129b
+languages.as=\u12a0\u1233\u121c\u12db\u12ca
+languages.ar=\u12d0\u122d\u1262\u129b
+languages.ta=\u1273\u121a\u120d\u129b
+languages.gu=\u1309\u1303\u122d\u1272\u129b
+languages.my=\u1261\u122d\u121b\u129b
+languages.am=\u12a0\u121d\u1210\u1228\u129b
+languages.za=\u12e1\u12cb\u1295\u130d\u129b
+languages.mt=\u121b\u120d\u1272\u1235\u129b
+languages.ms=\u121b\u120b\u12ed\u129b
+languages.gn=\u1313\u122b\u1292\u129b
+languages.byn=\u1265\u120a\u1295
+languages.sw=\u1235\u12cb\u1202\u120a\u129b
+languages.mr=\u121b\u122b\u12da\u129b
+languages.sv=\u1235\u12ca\u12f5\u1295\u129b
+languages.gl=\u130b\u1208\u130b\u129b
+languages.su=\u1231\u12f3\u1295\u129b
+languages.af=\u12a0\u134d\u122a\u1243\u1295\u1235\u129b
+languages.st=\u1236\u12de\u129b
+languages.mo=\u121e\u120d\u12f3\u126b\u12ca\u1293
+languages.ss=\u1235\u12cb\u1272\u129b
+languages.mn=\u121e\u1295\u130e\u120b\u12ca\u129b
+languages.gez=\u130d\u12d5\u12dd\u129b
+languages.sr=\u1230\u122d\u1262\u129b
+languages.sq=\u120d\u1264\u1292\u129b
+languages.ml=\u121b\u120b\u12eb\u120b\u121d\u129b
+languages.ab=\u12a0\u1265\u1210\u12da\u129b
+languages.mk=\u121b\u12a8\u12f6\u1292\u129b
+languages.aa=\u12a0\u134b\u122d\u129b
+languages.so=\u1231\u121b\u120d\u129b
+languages.sn=\u123e\u1293\u129b
+languages.mi=\u121b\u12ee\u122a\u129b
+languages.gd=\u12a5\u1235\u12ae\u1275\u1235\u1361\u130c\u120d\u12ad\u129b
+languages.sm=\u1233\u121e\u12a0\u129b
+languages.sl=\u1235\u120e\u126a\u129b
+languages.mg=\u121b\u120b\u130b\u1235\u129b
+languages.tig=\u1275\u130d\u1228
+languages.sk=\u1235\u120e\u126b\u12ad\u129b
+languages.ga=\u12a0\u12ed\u122a\u123d
+languages.yo=\u12ee\u1229\u1263\u12ca\u129b
+languages.si=\u1235\u1295\u1203\u120d\u129b
+languages.sg=\u1233\u1295\u130e\u129b
+languages.yi=\u12ed\u12f2\u123b\u12ca\u129b
+languages.sd=\u1232\u1295\u12f5\u1202\u129b
+languages.fy=\u134d\u122a\u1235\u129b
+languages.sid=\u1232\u12f3\u121d\u129b
+languages.sa=\u1233\u1295\u1235\u12ad\u122a\u1275\u129b
+languages.fr=\u1348\u1228\u1295\u1233\u12ed\u129b
+languages.lv=\u120b\u1275\u126a\u12eb\u1295
+languages.fo=\u134b\u122e\u129b
+languages.lt=\u120a\u1271\u12a0\u1292\u12eb\u1295
+languages.rw=\u12aa\u1295\u12eb\u122d\u12cb\u1295\u12f5\u129b
+languages.ru=\u122b\u123d\u129b
+languages.fj=\u134a\u1302\u129b
+languages.lo=\u120b\u12cd\u1235\u129b
+languages.fi=\u134a\u1292\u123d
+languages.ln=\u120a\u1295\u130b\u120b\u129b
+languages.ro=\u122e\u121b\u1292\u12eb\u1295
+languages.rn=\u1229\u1295\u12f2\u129b
+languages.rm=\u122e\u121b\u1295\u1235
+languages.fa=\u1350\u122d\u1232\u12eb\u129b
+languages.la=\u120b\u1272\u1295\u129b
+languages.xh=\u12de\u1233\u129b
+languages.eu=\u1263\u1235\u12ad\u129b
+languages.et=\u12a4\u1235\u1276\u1292\u12a0\u1295
+languages.ky=\u12aa\u122d\u130a\u12dd\u129b
diff --git a/resource/gnu/java/locale/LocaleInformation_gez_ER.properties b/resource/gnu/java/locale/LocaleInformation_gez_ER.properties
new file mode 100644
index 000000000..b522e0bed
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_gez_ER.properties
@@ -0,0 +1,19 @@
+# LocaleInformation_gez_ER.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+groupingSeparator=\u12c8
+currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
+currenciesSymbol.ERN=$
+currenciesSymbol.USD=US$
+shortDateFormat=dd/MM/yy
+mediumDateFormat=dd-MMM-yyyy
+longDateFormat=dd MMMM yyyy
+fullDateFormat=EEEE\u1365 dd MMMM \u1218\u12d3\u120d\u1275 yyyy G
+shortTimeFormat=h:mm a
+mediumTimeFormat=h:mm:ss a
+longTimeFormat=h:mm:ss a
+fullTimeFormat=h:mm:ss a
diff --git a/resource/gnu/java/locale/LocaleInformation_gez_ET.properties b/resource/gnu/java/locale/LocaleInformation_gez_ET.properties
new file mode 100644
index 000000000..dbcace969
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_gez_ET.properties
@@ -0,0 +1,18 @@
+# LocaleInformation_gez_ET.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+groupingSeparator=\u12c8
+currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
+currenciesSymbol.USD=US$
+shortDateFormat=dd/MM/yy
+mediumDateFormat=dd-MMM-yyyy
+longDateFormat=dd MMMM yyyy
+fullDateFormat=EEEE\u1365 dd MMMM \u1218\u12d3\u120d\u1275 yyyy G
+shortTimeFormat=h:mm a
+mediumTimeFormat=h:mm:ss a
+longTimeFormat=h:mm:ss a
+fullTimeFormat=h:mm:ss a
diff --git a/resource/gnu/java/locale/LocaleInformation_gl.properties b/resource/gnu/java/locale/LocaleInformation_gl.properties
index 3fff31dca..a0b700684 100644
--- a/resource/gnu/java/locale/LocaleInformation_gl.properties
+++ b/resource/gnu/java/locale/LocaleInformation_gl.properties
@@ -7,7 +7,6 @@
decimalSeparator=,
groupingSeparator=.
-currenciesDisplayName.ESP=ESP
currenciesSymbol.ESP=\u20a7
shortMonths=Xan®Feb®Mar®Abr®Mai®Xu\u00f1®Xul®Ago®Set®Out®Nov®Dec®®
months=Xaneiro®Febreiro®Marzo®Abril®Maio®Xu\u00f1o®Xullo®Agosto®Setembro®Outubro®Novembro®Decembro®®
diff --git a/resource/gnu/java/locale/LocaleInformation_gu.properties b/resource/gnu/java/locale/LocaleInformation_gu.properties
index b8c09a37a..8627e5ca6 100644
--- a/resource/gnu/java/locale/LocaleInformation_gu.properties
+++ b/resource/gnu/java/locale/LocaleInformation_gu.properties
@@ -14,12 +14,12 @@ weekdays=®\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0®\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0
ampms=\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u00a0\u0aae\u0aa7\u0acd\u0aaf\u0abe\u0ab9\u0acd\u0aa8®\u0a89\u0aa4\u0acd\u0aa4\u0ab0\u00a0\u0aae\u0aa7\u0acd\u0aaf\u0abe\u0ab9\u0acd\u0aa8®
territories.TR=\u0aa4\u0ac1\u0ab0\u0acd\u0a95\u0ab8\u0acd\u0aa4\u0abe\u0aa8
territories.IN=\u0aad\u0abe\u0ab0\u0aa4
-territories.CN=\u0a9a\u0ac0\u0aa8
territories.GE=\u0a9c\u0acd\u0aaf\u0acb\u0ab0\u0acd\u0a9c\u0ac0\u0aaf\u0abe
+territories.CN=\u0a9a\u0ac0\u0aa8
territories.DE=\u0a9c\u0aae\u0abf\u0aa8\u0ac0
territories.NP=\u0aa8\u0ac7\u0aaa\u0abe\u0ab3
territories.TM=\u0aa4\u0ac1\u0ab0\u0acd\u0a95\u0acd\u0aae\u0aa8\u0abf\u0ab8\u0acd\u0aa4\u0abe\u0aa8
territories.US=\u0ab8\u0a82\u0aaf\u0ac1\u0a95\u0aa4 \u0ab0\u0abe\u0a9c\u0acd\u0aaf \u0a85\u0aae\u0ac7\u0ab0\u0abf\u0a95\u0abe
-territories.EG=\u0aae\u0abf\u0ab8\u0ab0
territories.PK=\u0a95\u0ab0\u0abe\u0a82\u0a9a\u0ac0
+territories.EG=\u0aae\u0abf\u0ab8\u0ab0
languages.gu=\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0
diff --git a/resource/gnu/java/locale/LocaleInformation_gu_IN.properties b/resource/gnu/java/locale/LocaleInformation_gu_IN.properties
index d5e24e62a..7d93216c6 100644
--- a/resource/gnu/java/locale/LocaleInformation_gu_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_gu_IN.properties
@@ -5,8 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
firstDayOfWeek=mon
shortDateFormat=d-MM-yy
mediumDateFormat=dd-MM-yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_haw.properties b/resource/gnu/java/locale/LocaleInformation_haw.properties
new file mode 100644
index 000000000..ab0beb642
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_haw.properties
@@ -0,0 +1,32 @@
+# LocaleInformation_haw.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+shortMonths=Ian.®Pep.®Mal.®\u02bbAp.®Mei®Iun.®Iul.®\u02bbAu.®Kep.®\u02bbOk.®Now.®Kek.®®
+months=Ianuali®Pepeluali®Malaki®\u02bbApelila®Mei®Iune®Iulai®\u02bbAukake®Kepakemapa®\u02bbOkakopa®Nowemapa®Kekemapa®®
+shortWeekdays=®LP®P1®P2®P3®P4®P5®P6®
+weekdays=®L\u0101pule®Po\u02bbakahi®Po\u02bbalua®Po\u02bbakolu®Po\u02bbah\u0101®Po\u02bbalima®Po\u02bbaono®
+territories.IT=\u02bb\u012ak\u0101lia
+territories.FR=Palani
+territories.RU=L\u016bkia
+territories.CN=Kina
+territories.US=\u02bbAmelika Hui P\u016b \u02bbIa
+territories.IN=\u02bb\u012ania
+territories.IL=\u02bbIsera\u02bbela
+territories.AU=N\u016bh\u014dlani
+territories.MX=Mekiko
+territories.IE=\u02bbIlelani
+territories.CA=Kanak\u0101
+territories.GR=Helene
+territories.JP=I\u0101pana
+territories.DK=Kenemaka
+territories.NZ=Aotearoa
+territories.DE=Kelem\u0101nia
+territories.PH=\u02bb\u0100ina Pilipino
+territories.ES=Kepania
+territories.GB=Aupuni M\u014d\u02bb\u012b Hui P\u016b \u02bbIa
+territories.NL=H\u014dlani
+languages.haw=\u02bb\u014dlelo Hawai\u02bbi
diff --git a/resource/gnu/java/locale/LocaleInformation_haw_US.properties b/resource/gnu/java/locale/LocaleInformation_haw_US.properties
new file mode 100644
index 000000000..c3299cf90
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_haw_US.properties
@@ -0,0 +1,16 @@
+# LocaleInformation_haw_US.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currencyFormat=\u00a4#,##0.00;(\u00a4#,##0.00)
+shortDateFormat=d/M/yy
+mediumDateFormat=d MMM yyyy
+longDateFormat=d MMMM yyyy
+fullDateFormat=EEEE, d MMMM yyyy
+shortTimeFormat=h:mm a
+mediumTimeFormat=h:mm:ss a
+longTimeFormat=h:mm:ss a z
+fullTimeFormat=h:mm:ss a z
diff --git a/resource/gnu/java/locale/LocaleInformation_he.properties b/resource/gnu/java/locale/LocaleInformation_he.properties
index afdc95502..4195ce248 100644
--- a/resource/gnu/java/locale/LocaleInformation_he.properties
+++ b/resource/gnu/java/locale/LocaleInformation_he.properties
@@ -6,7 +6,16 @@
# This file was automatically generated by gnu.localegen from CLDR.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
+currenciesDisplayName.INR=\u05e8\u05d5\u05e4\u05d9 \u05d4\u05d5\u05d3\u05d9\u05ea
+currenciesDisplayName.RUB=\u05e8\u05d5\u05d1\u05dc
+currenciesDisplayName.JPY=\u05d9\u05df
+currenciesDisplayName.BRL=\u05e8\u05d9\u05d0\u05dc \u05d1\u05e8\u05d6\u05d9\u05dc\u05d0\u05d9
+currenciesDisplayName.CNY=\u05d9\u05d5\u05d0\u05df
+currenciesDisplayName.USD=\u05d3\u05d5\u05dc\u05e8 \u05d0\u05de\u05e8\u05d9\u05e7\u05d0\u05d9
currenciesDisplayName.ILS=\u05e9\"\u05d7
+currenciesDisplayName.EUR=\u05d9\u05d5\u05e8\u05d5
+currenciesDisplayName.TRY=\u05dc\u05d9\u05e8\u05d4 \u05d8\u05d5\u05e8\u05e7\u05d9\u05ea \u05d7\u05d3\u05e9\u05d4
+currenciesDisplayName.GBP=\u05dc\u05d9\u05e8\u05d4 \u05e9\u05d8\u05e8\u05dc\u05d9\u05e0\u05d2
currenciesSymbol.ILS=\u20aa
shortMonths=\u05d9\u05e0\u05d5®\u05e4\u05d1\u05e8®\u05de\u05e8\u05e5®\u05d0\u05e4\u05e8®\u05de\u05d0\u05d9®\u05d9\u05d5\u05e0®\u05d9\u05d5\u05dc®\u05d0\u05d5\u05d2®\u05e1\u05e4\u05d8®\u05d0\u05d5\u05e7®\u05e0\u05d5\u05d1®\u05d3\u05e6\u05de®®
months=\u05d9\u05e0\u05d5\u05d0\u05e8®\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8®\u05de\u05e8\u05e5®\u05d0\u05e4\u05e8\u05d9\u05dc®\u05de\u05d0\u05d9®\u05d9\u05d5\u05e0\u05d9®\u05d9\u05d5\u05dc\u05d9®\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8®\u05e1\u05e4\u05d8\u05de\u05d1\u05e8®\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8®\u05e0\u05d5\u05d1\u05de\u05d1\u05e8®\u05d3\u05e6\u05de\u05d1\u05e8®®
@@ -17,229 +26,258 @@ shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MM/yyyy
longDateFormat=d MMMM yyyy
fullDateFormat=EEEE d MMMM yyyy
-territories.TL=\u05de\u05d6\u05e8\u05d7 \u05d8\u05d9\u05de\u05d5\u05e8
+territories.TL=\u05d8\u05d9\u05de\u05d5\u05e8 \u05d4\u05de\u05d6\u05e8\u05d7\u05d9\u05ea
territories.TK=\u05d8\u05d5\u05e7\u05dc\u05d0\u05d5
-territories.TJ=\u05d8\u05d2\u05f3\u05d9\u05e7\u05d9\u05e1\u05d8\u05df
-territories.TH=\u05ea\u05d0\u05d9\u05dc\u05e0\u05d3
+territories.TJ=\u05d8\u05d2\u05f3\u05d9\u05e7\u05d9\u05e1\u05d8\u05d0\u05df
+territories.TH=\u05ea\u05d0\u05d9\u05d9\u05dc\u05e0\u05d3
territories.TG=\u05d8\u05d5\u05d2\u05d5
territories.TF=\u05d8\u05e8\u05d9\u05d8\u05d5\u05e8\u05d9\u05d5\u05ea \u05d3\u05e8\u05d5\u05de\u05d9\u05d5\u05ea \u05e9\u05dc \u05e6\u05e8\u05e4\u05ea
territories.GY=\u05d2\u05d9\u05d0\u05e0\u05d4
territories.TD=\u05e6\u05f3\u05d0\u05d3
-territories.TC=\u05d0\u05d9\u05d9 \u05d8\u05d5\u05e8\u05e7\u05e1 \u05d5\u05e7\u05d0\u05d9\u05e7\u05d5\u05e1
+territories.TC=\u05d8\u05e8\u05e7\u05e1 \u05d5\u05e7\u05d9\u05d9\u05e7\u05d5\u05e1, \u05d0\u05d9\u05d9
territories.GW=\u05d2\u05d9\u05e0\u05d9\u05d0\u05d4-\u05d1\u05d9\u05e1\u05d0\u05d5
territories.GU=\u05d2\u05d5\u05d0\u05dd
-territories.GT=\u05d2\u05d5\u05d5\u05d8\u05de\u05d0\u05dc\u05d4
-territories.GS=\u05d4\u05d0\u05d9 \u05d2\u05f3\u05d5\u05e8\u05d2\u05f3\u05d9\u05d4 \u05d4\u05d3\u05e8\u05d5\u05de\u05d9\u05ea \u05d5\u05d0\u05d9\u05d9 \u05e1\u05e0\u05d3\u05d5\u05d5\u05d9\u05e5\u05f3 \u05d4\u05d3\u05e8\u05d5\u05de\u05d9\u05d9\u05dd
+territories.GT=\u05d2\u05d5\u05d5\u05d0\u05d8\u05de\u05d0\u05dc\u05d4
+territories.GS=\u05d2\u05f3\u05d5\u05e8\u05d2\u05f3\u05d9\u05d4 \u05d4\u05d3\u05e8\u05d5\u05de\u05d9\u05ea \u05d5\u05d0\u05d9\u05d9 \u05e1\u05e0\u05d3\u05d5\u05d5\u05d9\u05e5\u05f3 \u05d4\u05d3\u05e8\u05d5\u05de\u05d9\u05d9\u05dd
territories.GR=\u05d9\u05d5\u05d5\u05df
territories.GQ=\u05d2\u05d9\u05e0\u05d9\u05d0\u05d4 \u05d4\u05de\u05e9\u05d5\u05d5\u05e0\u05d9\u05ea
territories.GP=\u05d2\u05d5\u05d5\u05d0\u05d3\u05dc\u05d5\u05e4
-territories.SZ=\u05e1\u05d5\u05d5\u05d6\u05d9\u05dc\u05e0\u05d3
-territories.SY=\u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4 \u05d4\u05e2\u05e8\u05d1\u05d9\u05ea \u05d4\u05e1\u05d5\u05e8\u05d9\u05ea
+territories.SZ=\u05e1\u05d5\u05d5\u05d0\u05d6\u05d9\u05dc\u05e0\u05d3
+territories.SY=\u05e1\u05d5\u05e8\u05d9\u05d4
territories.GN=\u05d2\u05d9\u05e0\u05d9\u05d0\u05d4
territories.GM=\u05d2\u05de\u05d1\u05d9\u05d4
-territories.GL=\u05d2\u05e8\u05d9\u05e0\u05dc\u05e0\u05d3
-territories.SV=\u05d0\u05dc \u05e1\u05dc\u05d1\u05d0\u05d3\u05d5\u05e8
-territories.ST=\u05e1\u05df \u05ea\u05d5\u05de\u05d4 \u05d5\u05e4\u05e8\u05d9\u05e0\u05e1\u05d9\u05e4\u05d4
+territories.GL=\u05d2\u05e8\u05e0\u05dc\u05e0\u05d3
+territories.SV=\u05d0\u05dc \u05e1\u05dc\u05d5\u05d5\u05d0\u05d3\u05d5\u05e8
+territories.062=\u05d3\u05e8\u05d5\u05dd-\u05de\u05e8\u05db\u05d6 \u05d0\u05e1\u05d9\u05d4
+territories.ST=\u05e1\u05d0\u05d5 \u05d8\u05d5\u05de\u05d4 \u05d5\u05e4\u05e8\u05d9\u05e0\u05e1\u05d9\u05e4\u05d4
+territories.061=\u05e4\u05d5\u05dc\u05d9\u05e0\u05d6\u05d9\u05d4
territories.GI=\u05d2\u05d9\u05d1\u05e8\u05dc\u05d8\u05e8
territories.GH=\u05d2\u05d0\u05e0\u05d4
territories.SR=\u05e1\u05d5\u05e8\u05d9\u05e0\u05d0\u05dd
territories.GF=\u05d2\u05d9\u05d0\u05e0\u05d4 \u05d4\u05e6\u05e8\u05e4\u05ea\u05d9\u05ea
territories.GE=\u05d2\u05e8\u05d5\u05d6\u05d9\u05d4
-territories.SO=\u05e1\u05d5\u05de\u05dc\u05d9\u05d4
-territories.GD=\u05d2\u05e8\u05e0\u05d3\u05d4
-territories.SN=\u05e1\u05e0\u05d2\u05dc
-territories.SM=\u05e1\u05df \u05de\u05e8\u05d9\u05e0\u05d5
+territories.SO=\u05e1\u05d5\u05de\u05d0\u05dc\u05d9\u05d4
+territories.GD=\u05d2\u05e8\u05e0\u05d0\u05d3\u05d4
+territories.SN=\u05e1\u05e0\u05d2\u05d0\u05dc
+territories.SM=\u05e1\u05d0\u05df \u05de\u05d0\u05e8\u05d9\u05e0\u05d5
territories.GB=\u05d1\u05e8\u05d9\u05d8\u05e0\u05d9\u05d4
territories.SL=\u05e1\u05d9\u05d9\u05e8\u05d4 \u05dc\u05d0\u05d5\u05e0\u05d4
-territories.GA=\u05d2\u05d1\u05d5\u05df
+territories.GA=\u05d2\u05d0\u05d1\u05d5\u05df
territories.SK=\u05e1\u05dc\u05d5\u05d1\u05e7\u05d9\u05d4
-territories.SJ=\u05e1\u05d5\u05d5\u05dc\u05d1\u05d0\u05e8\u05d3 \u05d5\u05d6\u05f3\u05d0\u05df \u05de\u05d0\u05d9\u05d9\u05df
+territories.SJ=\u05e1\u05d5\u05d5\u05d0\u05dc\u05d1\u05e8\u05d3 \u05d5\u05d9\u05d0\u05df \u05de\u05d0\u05d9\u05d9\u05df
territories.SI=\u05e1\u05dc\u05d5\u05d1\u05e0\u05d9\u05d4
-territories.SH=\u05e1\u05d9\u05d9\u05e0\u05d8 \u05d4\u05dc\u05e0\u05d4
+territories.SH=\u05e1\u05e0\u05d8 \u05d4\u05dc\u05e0\u05d4
territories.SG=\u05e1\u05d9\u05e0\u05d2\u05e4\u05d5\u05e8
territories.SE=\u05e9\u05d5\u05d5\u05d3\u05d9\u05d4
-territories.SD=\u05e1\u05d5\u05d3\u05df
-territories.SC=\u05d0\u05d9\u05d9 \u05e1\u05d9\u05d9\u05e9\u05dc
-territories.SB=\u05d0\u05d9\u05d9 \u05e9\u05dc\u05de\u05d4
+territories.SD=\u05e1\u05d5\u05d3\u05d0\u05df
+territories.SC=\u05e1\u05d9\u05d9\u05e9\u05dc
+territories.SB=\u05e9\u05dc\u05de\u05d4, \u05d0\u05d9\u05d9
territories.SA=\u05e2\u05e8\u05d1 \u05d4\u05e1\u05e2\u05d5\u05d3\u05d9\u05ea
territories.FR=\u05e6\u05e8\u05e4\u05ea
-territories.FO=\u05d0\u05d9\u05d9 \u05e4\u05d0\u05e8\u05d5
-territories.FM=\u05de\u05d0\u05d5\u05e8\u05d9\u05e6\u05d9\u05d5\u05e1, \u05d4\u05de\u05d3\u05d9\u05e0\u05d5\u05ea \u05d4\u05de\u05d0\u05d5\u05d2\u05d3\u05d5\u05ea \u05e9\u05dc
+territories.057=\u05de\u05e7\u05e8\u05d5\u05e0\u05d6\u05d9\u05d4
+territories.FO=\u05e4\u05e8\u05d5\u05d0\u05e8, \u05d0\u05d9\u05d9
+territories.FM=\u05de\u05d9\u05e7\u05e8\u05d5\u05e0\u05d6\u05d9\u05d4
territories.RW=\u05e8\u05d5\u05d0\u05e0\u05d3\u05d4
-territories.FK=\u05d0\u05d9\u05d9 \u05e4\u05d5\u05e7\u05dc\u05e0\u05d3
-territories.RU=\u05d7\u05d1\u05e8 \u05d4\u05de\u05d3\u05d9\u05e0\u05d5\u05ea \u05d4\u05e8\u05d5\u05e1\u05d9\u05d5\u05ea
+territories.054=\u05de\u05dc\u05e0\u05e1\u05d9\u05d4
+territories.053=\u05d0\u05d5\u05e1\u05d8\u05e8\u05dc\u05d9\u05d4 \u05d5\u05e0\u05d9\u05d5-\u05d6\u05d9\u05dc\u05e0\u05d3
+territories.FK=\u05e4\u05d5\u05e7\u05dc\u05e0\u05d3, \u05d0\u05d9\u05d9
+territories.RU=\u05e8\u05d5\u05e1\u05d9\u05d4, \u05d4\u05e4\u05d3\u05e8\u05e6\u05d9\u05d4 \u05e9\u05dc
territories.FJ=\u05e4\u05d9\u05d2\u05f3\u05d9
territories.FI=\u05e4\u05d9\u05e0\u05dc\u05e0\u05d3
territories.RO=\u05e8\u05d5\u05de\u05e0\u05d9\u05d4
territories.RE=\u05e8\u05d0\u05d5\u05e0\u05d9\u05d5\u05df
territories.ET=\u05d0\u05ea\u05d9\u05d5\u05e4\u05d9\u05d4
territories.ES=\u05e1\u05e4\u05e8\u05d3
-territories.ER=\u05d0\u05e8\u05d9\u05ea\u05e8\u05d9\u05d0\u05d4
+territories.ER=\u05d0\u05e8\u05d9\u05d8\u05e8\u05d0\u05d4
territories.EH=\u05e1\u05d4\u05e8\u05d4 \u05d4\u05de\u05e2\u05e8\u05d1\u05d9\u05ea
territories.EG=\u05de\u05e6\u05e8\u05d9\u05dd
+territories.830=\u05d0\u05d9\u05d9 \u05e7\u05e0\u05dc
territories.EE=\u05d0\u05e1\u05d8\u05d5\u05e0\u05d9\u05d4
territories.EC=\u05d0\u05e7\u05d5\u05d5\u05d0\u05d3\u05d5\u05e8
territories.DZ=\u05d0\u05dc\u05d2\u05f3\u05d9\u05e8\u05d9\u05d4
-territories.QA=\u05e7\u05d8\u05e8
+territories.QA=\u05e7\u05d0\u05d8\u05d0\u05e8
+territories.039=\u05d3\u05e8\u05d5\u05dd \u05d0\u05d9\u05e8\u05d5\u05e4\u05d4
territories.DO=\u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4 \u05d4\u05d3\u05d5\u05de\u05d9\u05e0\u05d9\u05e7\u05e0\u05d9\u05ea
-territories.PY=\u05e4\u05e8\u05d0\u05d2\u05d5\u05d5\u05d0\u05d9
+territories.PY=\u05e4\u05e8\u05d2\u05d5\u05d5\u05d0\u05d9
+territories.035=\u05d3\u05e8\u05d5\u05dd-\u05de\u05d6\u05e8\u05d7 \u05d0\u05e1\u05d9\u05d4
territories.DM=\u05d3\u05d5\u05de\u05d9\u05e0\u05d9\u05e7\u05d4
-territories.PW=\u05e4\u05dc\u05d0\u05d5
+territories.PW=\u05e4\u05d0\u05dc\u05d0\u05d5
territories.DK=\u05d3\u05e0\u05de\u05e8\u05e7
territories.DJ=\u05d2\u05f3\u05d9\u05d1\u05d5\u05d8\u05d9
territories.PT=\u05e4\u05d5\u05e8\u05d8\u05d5\u05d2\u05dc
territories.PS=\u05d4\u05e8\u05e9\u05d5\u05ea \u05d4\u05e4\u05dc\u05e9\u05ea\u05d9\u05e0\u05d9\u05ea
-territories.PR=\u05e4\u05d5\u05e8\u05d8\u05d5 \u05e8\u05d9\u05e7\u05d5
+territories.030=\u05de\u05d6\u05e8\u05d7 \u05d0\u05e1\u05d9\u05d4
+territories.PR=\u05e4\u05d5\u05d0\u05e8\u05d8\u05d5 \u05e8\u05d9\u05e7\u05d5
territories.DE=\u05d2\u05e8\u05de\u05e0\u05d9\u05d4
-territories.PN=\u05e4\u05d9\u05d8\u05e7\u05d9\u05d9\u05e8\u05df
+territories.PN=\u05e4\u05d9\u05d8\u05e7\u05e8\u05df
territories.PM=\u05e1\u05e0\u05d8 \u05e4\u05d9\u05d9\u05e8 \u05d5\u05de\u05d9\u05e7\u05dc\u05d5\u05df
territories.PL=\u05e4\u05d5\u05dc\u05d9\u05df
-territories.PK=\u05e4\u05e7\u05d9\u05e1\u05d8\u05df
+territories.PK=\u05e4\u05e7\u05d9\u05e1\u05d8\u05d0\u05df
territories.PH=\u05e4\u05d9\u05dc\u05d9\u05e4\u05d9\u05e0\u05d9\u05dd
-territories.PG=\u05e4\u05e4\u05d5\u05d0\u05d4 \u05d2\u05d9\u05e0\u05d9\u05d0\u05d4 \u05d4\u05d7\u05d3\u05e9\u05d4
+territories.PG=\u05e4\u05d0\u05e4\u05d5\u05d0\u05d4 \u05e0\u05d9\u05d5-\u05d2\u05d9\u05e0\u05d9\u05d0\u05d4
territories.PF=\u05e4\u05d5\u05dc\u05d9\u05e0\u05d6\u05d9\u05d4 \u05d4\u05e6\u05e8\u05e4\u05ea\u05d9\u05ea
-territories.CZ=\u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4 \u05d4\u05e6\u05f3\u05db\u05d9\u05ea
+territories.CZ=\u05e6\u05f3\u05db\u05d9\u05d4, \u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4 \u05e9\u05dc
territories.PE=\u05e4\u05e8\u05d5
territories.CY=\u05e7\u05e4\u05e8\u05d9\u05e1\u05d9\u05df
-territories.CX=\u05d0\u05d9\u05d9 \u05db\u05e8\u05d9\u05e1\u05d8\u05de\u05e1
-territories.CV=\u05e7\u05d9\u05d9\u05e4 \u05d5\u05e8\u05d3\u05d4
+territories.CX=\u05e7\u05e8\u05d9\u05e1\u05de\u05e1, \u05d0\u05d9
+territories.CV=\u05e7\u05d0\u05e4 \u05d5\u05e8\u05d3\u05d4
territories.PA=\u05e4\u05e0\u05de\u05d4
territories.CU=\u05e7\u05d5\u05d1\u05d4
+territories.CS=\u05e1\u05e8\u05d1\u05d9\u05d4 \u05d5\u05de\u05d5\u05e0\u05d8\u05e0\u05d2\u05e8\u05d5
territories.CR=\u05e7\u05d5\u05e1\u05d8\u05d4 \u05e8\u05d9\u05e7\u05d4
+territories.029=\u05e7\u05e8\u05d9\u05d1\u05d9\u05d9\u05dd
territories.CO=\u05e7\u05d5\u05dc\u05d5\u05de\u05d1\u05d9\u05d4
territories.CN=\u05e1\u05d9\u05df
-territories.CM=\u05e7\u05de\u05e8\u05d5\u05df
+territories.CM=\u05e7\u05d0\u05de\u05e8\u05d5\u05df
territories.CL=\u05e6\u05f3\u05d9\u05dc\u05d4
-territories.CK=\u05d0\u05d9\u05d9 \u05e7\u05d5\u05e7
+territories.CK=\u05e7\u05d5\u05e7, \u05d0\u05d9\u05d9
territories.CI=\u05d7\u05d5\u05e3 \u05d4\u05e9\u05e0\u05d4\u05d1
+territories.021=\u05e6\u05e4\u05d5\u05df \u05d0\u05de\u05e8\u05d9\u05e7\u05d4
territories.CH=\u05e9\u05d5\u05d5\u05d9\u05d9\u05e5
territories.CG=\u05e7\u05d5\u05e0\u05d2\u05d5
territories.CF=\u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4 \u05e9\u05dc \u05de\u05e8\u05db\u05d6 \u05d0\u05e4\u05e8\u05d9\u05e7\u05d4
territories.CD=\u05e7\u05d5\u05e0\u05d2\u05d5, \u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4 \u05d4\u05d3\u05de\u05d5\u05e7\u05e8\u05d8\u05d9\u05ea \u05e9\u05dc
-territories.CC=\u05d0\u05d9\u05d9 \u05e7\u05d5\u05e7\u05d5\u05e1 (\u05e7\u05d9\u05dc\u05d9\u05e0\u05d2)
-territories.OM=\u05e2\u05d5\u05de\u05df
+territories.CC=\u05e7\u05d5\u05e7\u05d5\u05e1, \u05d0\u05d9\u05d9
+territories.OM=\u05e2\u05d5\u05de\u05d0\u05df
territories.CA=\u05e7\u05e0\u05d3\u05d4
territories.BZ=\u05d1\u05dc\u05d9\u05d6
-territories.BY=\u05d1\u05dc\u05e8\u05d5\u05e1
-territories.BW=\u05d1\u05d5\u05d8\u05e1\u05d5\u05d5\u05d0\u05e0\u05d4
-territories.BV=\u05d4\u05d0\u05d9 \u05d1\u05d5\u05d1\u05d4
-territories.BT=\u05d1\u05d5\u05d8\u05d0\u05df
-territories.BS=\u05d1\u05d4\u05d0\u05de\u05d4
+territories.BY=\u05d1\u05dc\u05d0\u05e8\u05d5\u05e1
+territories.BW=\u05d1\u05d5\u05e6\u05d5\u05d5\u05d0\u05e0\u05d4
+territories.BV=\u05d1\u05d5\u05d1\u05d4, \u05d0\u05d9
+territories.BT=\u05d1\u05d4\u05d5\u05d8\u05d0\u05df
+territories.BS=\u05d1\u05d0\u05d4\u05d0\u05de\u05d4, \u05d0\u05d9\u05d9
territories.BR=\u05d1\u05e8\u05d6\u05d9\u05dc
+territories.019=\u05d0\u05de\u05e8\u05d9\u05e7\u05d5\u05ea
+territories.018=\u05d3\u05e8\u05d5\u05dd \u05d0\u05e4\u05e8\u05d9\u05e7\u05d4
territories.NZ=\u05e0\u05d9\u05d5 \u05d6\u05d9\u05dc\u05e0\u05d3
territories.BO=\u05d1\u05d5\u05dc\u05d9\u05d1\u05d9\u05d4
-territories.BN=\u05d1\u05e8\u05d5\u05e0\u05d9\u05d9 \u05d3\u05d0\u05e8\u05e1\u05dc\u05d0\u05dd
+territories.017=\u05de\u05e8\u05db\u05d6 \u05d0\u05e4\u05e8\u05d9\u05e7\u05d4
+territories.BN=\u05d1\u05e8\u05d5\u05e0\u05d9\u05d9 \u05d3\u05d0\u05e8\u05d5\u05e1\u05d0\u05dc\u05d0\u05dd
territories.BM=\u05d1\u05e8\u05de\u05d5\u05d3\u05d4
-territories.NU=\u05e0\u05d9\u05d5\u05d5\u05d4
+territories.015=\u05e6\u05e4\u05d5\u05df \u05d0\u05e4\u05e8\u05d9\u05e7\u05d4
+territories.014=\u05de\u05d6\u05e8\u05d7 \u05d0\u05e4\u05e8\u05d9\u05e7\u05d4
+territories.013=\u05de\u05e8\u05db\u05d6 \u05d0\u05de\u05e8\u05d9\u05e7\u05d4
+territories.NU=\u05e0\u05d9\u05d0\u05d5
territories.BJ=\u05d1\u05e0\u05d9\u05df
territories.BI=\u05d1\u05d5\u05e8\u05d5\u05e0\u05d3\u05d9
-territories.BH=\u05d1\u05d7\u05e8\u05d9\u05d9\u05df
+territories.011=\u05de\u05e2\u05e8\u05d1 \u05d0\u05e4\u05e8\u05d9\u05e7\u05d4
+territories.BH=\u05d1\u05d7\u05e8\u05d9\u05df
territories.NR=\u05e0\u05d0\u05d5\u05e8\u05d5
territories.BG=\u05d1\u05d5\u05dc\u05d2\u05e8\u05d9\u05d4
territories.BF=\u05d1\u05d5\u05e8\u05e7\u05d9\u05e0\u05d4 \u05e4\u05d0\u05e1\u05d5
territories.NP=\u05e0\u05e4\u05d0\u05dc
territories.BE=\u05d1\u05dc\u05d2\u05d9\u05d4
territories.NO=\u05e0\u05d5\u05e8\u05d5\u05d5\u05d2\u05d9\u05d4
-territories.BD=\u05d1\u05e0\u05d2\u05dc\u05d3\u05e9
+territories.BD=\u05d1\u05e0\u05d2\u05dc\u05d0\u05d3\u05e9
territories.BB=\u05d1\u05e8\u05d1\u05d3\u05d5\u05e1
-territories.ZW=\u05d6\u05d9\u05de\u05d1\u05d1\u05d5\u05d5\u05d4
+territories.ZW=\u05d6\u05d9\u05de\u05d1\u05d0\u05d1\u05d5\u05d5\u05d4
territories.NL=\u05d4\u05d5\u05dc\u05e0\u05d3
-territories.BA=\u05d1\u05d5\u05e1\u05e0\u05d9\u05d4 \u05d4\u05e8\u05e6\u05d2\u05d5\u05d1\u05d9\u05e0\u05d4
-territories.NI=\u05e0\u05d9\u05e7\u05e8\u05d0\u05d2\u05d5\u05d5\u05d4
+territories.BA=\u05d1\u05d5\u05e1\u05e0\u05d9\u05d4 \u05d5\u05d4\u05e8\u05e6\u05d2\u05d5\u05d1\u05d9\u05e0\u05d4
+territories.NI=\u05e0\u05d9\u05e7\u05d0\u05e8\u05d0\u05d2\u05d5\u05d0\u05d4
territories.NG=\u05e0\u05d9\u05d2\u05e8\u05d9\u05d4
-territories.NF=\u05d0\u05d9\u05d9 \u05e0\u05d5\u05e8\u05e4\u05e7
-territories.AZ=\u05d0\u05d6\u05e8\u05d1\u05d9\u05d9\u05d2\u05f3\u05df
+territories.NF=\u05e0\u05d5\u05e8\u05e4\u05d5\u05e7, \u05d0\u05d9\u05d9
+territories.AZ=\u05d0\u05d6\u05e8\u05d1\u05d9\u05d9\u05d2\u05f3\u05d0\u05df
territories.NE=\u05e0\u05d9\u05d6\u05f3\u05e8
+territories.AX=\u05d0\u05d9\u05d9 \u05d0\u05dc\u05e0\u05d3
territories.NC=\u05e7\u05dc\u05d3\u05d5\u05e0\u05d9\u05d4 \u05d4\u05d7\u05d3\u05e9\u05d4
territories.AW=\u05d0\u05e8\u05d5\u05d1\u05d4
territories.ZM=\u05d6\u05de\u05d1\u05d9\u05d4
-territories.NA=\u05e0\u05de\u05d9\u05d1\u05d9\u05d4
+territories.NA=\u05e0\u05d0\u05de\u05d9\u05d1\u05d9\u05d4
territories.AU=\u05d0\u05d5\u05e1\u05d8\u05e8\u05dc\u05d9\u05d4
territories.AT=\u05d0\u05d5\u05e1\u05d8\u05e8\u05d9\u05d4
territories.AS=\u05e1\u05de\u05d5\u05d0\u05d4 \u05d4\u05d0\u05de\u05e8\u05d9\u05e7\u05e0\u05d9\u05ea
territories.AR=\u05d0\u05e8\u05d2\u05e0\u05d8\u05d9\u05e0\u05d4
+territories.009=\u05d0\u05d5\u05e7\u05d9\u05e0\u05d9\u05d4
territories.AQ=\u05d0\u05e0\u05d8\u05d0\u05e8\u05e7\u05d8\u05d9\u05e7\u05d4
territories.MZ=\u05de\u05d5\u05d6\u05de\u05d1\u05d9\u05e7
territories.AO=\u05d0\u05e0\u05d2\u05d5\u05dc\u05d4
territories.MY=\u05de\u05dc\u05d6\u05d9\u05d4
-territories.AN=\u05d4\u05d0\u05d9\u05e0\u05d8\u05d9\u05dc\u05d9\u05dd \u05d4\u05d4\u05d5\u05dc\u05e0\u05d3\u05d9\u05d9\u05dd
-territories.MX=\u05de\u05db\u05e1\u05d9\u05e7\u05d5
+territories.AN=\u05d0\u05e0\u05d8\u05d9\u05dc\u05d9\u05dd \u05d4\u05d5\u05dc\u05e0\u05d3\u05d9\u05d9\u05dd
+territories.MX=\u05de\u05e7\u05e1\u05d9\u05e7\u05d5
+territories.005=\u05d3\u05e8\u05d5\u05dd \u05d0\u05de\u05e8\u05d9\u05e7\u05d4
territories.AM=\u05d0\u05e8\u05de\u05e0\u05d9\u05d4
territories.MW=\u05de\u05dc\u05d0\u05d5\u05d5\u05d9
territories.AL=\u05d0\u05dc\u05d1\u05e0\u05d9\u05d4
-territories.MV=\u05de\u05dc\u05d3\u05d9\u05d1\u05d0\u05e1
+territories.MV=\u05de\u05dc\u05d3\u05d9\u05d1\u05d9\u05dd
territories.ZA=\u05d3\u05e8\u05d5\u05dd \u05d0\u05e4\u05e8\u05d9\u05e7\u05d4
territories.MU=\u05de\u05d0\u05d5\u05e8\u05d9\u05e6\u05d9\u05d5\u05e1
+territories.002=\u05d0\u05e4\u05e8\u05d9\u05e7\u05d4
territories.MT=\u05de\u05dc\u05d8\u05d4
-territories.AI=\u05d0\u05e0\u05d2\u05d9\u05dc\u05d4
-territories.MS=\u05de\u05d5\u05e0\u05d8\u05e1\u05e8\u05d0\u05d8
+territories.001=\u05e2\u05d5\u05dc\u05dd
+territories.AI=\u05d0\u05e0\u05d2\u05d5\u05d5\u05d9\u05dc\u05d4
+territories.MS=\u05de\u05d5\u05e0\u05e1\u05e8\u05d0\u05d8
territories.MR=\u05de\u05d0\u05d5\u05e8\u05d9\u05d8\u05e0\u05d9\u05d4
territories.AG=\u05d0\u05e0\u05d8\u05d9\u05d2\u05d5\u05d0\u05d4 \u05d5\u05d1\u05e8\u05d1\u05d5\u05d3\u05d4
territories.MQ=\u05de\u05e8\u05d8\u05d9\u05e0\u05d9\u05e7
-territories.AF=\u05d0\u05e4\u05d2\u05e0\u05d9\u05e1\u05d8\u05df
-territories.MP=\u05d0\u05d9\u05d9 \u05de\u05e8\u05d9\u05d0\u05e0\u05d4 \u05d4\u05e6\u05e4\u05d5\u05e0\u05d9\u05d9\u05dd
-territories.AE=\u05d0\u05d9\u05d7\u05d5\u05d3 \u05d4\u05d0\u05de\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d4\u05e2\u05e8\u05d1\u05d9\u05d5\u05ea
-territories.MO=\u05de\u05e7\u05d0\u05d5 S.A.R. \u05e9\u05dc \u05e1\u05d9\u05df
+territories.AF=\u05d0\u05e4\u05d2\u05e0\u05d9\u05e1\u05d8\u05d0\u05df
+territories.MP=\u05de\u05e8\u05d9\u05d0\u05e0\u05d4 \u05d4\u05e6\u05e4\u05d5\u05e0\u05d9\u05d9\u05dd, \u05d0\u05d9\u05d9
+territories.AE=\u05d1\u05e8\u05d9\u05ea \u05d4\u05d0\u05de\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d4\u05e2\u05e8\u05d1\u05d9\u05d5\u05ea
+territories.MO=\u05de\u05e7\u05d0\u05d5 S.A.R.\u200e \u05e9\u05dc \u05e1\u05d9\u05df
territories.AD=\u05d0\u05e0\u05d3\u05d5\u05e8\u05d4
territories.MN=\u05de\u05d5\u05e0\u05d2\u05d5\u05dc\u05d9\u05d4
-territories.MM=\u05de\u05d9\u05e0\u05de\u05d0\u05e8
+territories.MM=\u05de\u05d9\u05d9\u05d0\u05e0\u05de\u05d0\u05e8
territories.ML=\u05de\u05d0\u05dc\u05d9
-territories.MK=\u05de\u05e7\u05d3\u05d5\u05e0\u05d9\u05d4, \u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4 \u05e9\u05dc
-territories.YU=\u05d9\u05d5\u05d2\u05d5\u05e1\u05dc\u05d1\u05d9\u05d4
-territories.YT=\u05de\u05d9\u05d5\u05d8\u05d4
-territories.MH=\u05d0\u05d9\u05d9 \u05de\u05e8\u05e9\u05dc
+territories.MK=\u05de\u05e7\u05d3\u05d5\u05e0\u05d9\u05d4
+territories.YT=\u05de\u05d0\u05d9\u05d5\u05d8
+territories.MH=\u05de\u05e8\u05e9\u05dc, \u05d0\u05d9\u05d9
territories.MG=\u05de\u05d3\u05d2\u05e1\u05e7\u05e8
-territories.MD=\u05de\u05d5\u05dc\u05d3\u05d5\u05d1\u05d4, \u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4
-territories.MC=\u05de\u05d5\u05e0\u05e7\u05d5
+territories.MD=\u05de\u05d5\u05dc\u05d3\u05d5\u05d1\u05d4
+territories.MC=\u05de\u05d5\u05e0\u05d0\u05e7\u05d5
territories.MA=\u05de\u05e8\u05d5\u05e7\u05d5
territories.YE=\u05ea\u05d9\u05de\u05df
territories.LY=\u05dc\u05d5\u05d1
territories.LV=\u05dc\u05d8\u05d1\u05d9\u05d4
+territories.155=\u05de\u05e2\u05e8\u05d1 \u05d0\u05d9\u05e8\u05d5\u05e4\u05d4
territories.LU=\u05dc\u05d5\u05e7\u05e1\u05de\u05d1\u05d5\u05e8\u05d2
+territories.154=\u05e6\u05e4\u05d5\u05df \u05d0\u05d9\u05e8\u05d5\u05e4\u05d4
territories.LT=\u05dc\u05d9\u05d8\u05d0
-territories.LS=\u05dc\u05e1\u05d5\u05d8\u05d5
+territories.LS=\u05dc\u05e1\u05d5\u05ea\u05d5
territories.LR=\u05dc\u05d9\u05d1\u05e8\u05d9\u05d4
+territories.151=\u05de\u05d6\u05e8\u05d7 \u05d0\u05d9\u05e8\u05d5\u05e4\u05d4
+territories.150=\u05d0\u05d9\u05e8\u05d5\u05e4\u05d4
territories.LK=\u05e1\u05e8\u05d9 \u05dc\u05e0\u05e7\u05d4
territories.LI=\u05dc\u05d9\u05db\u05d8\u05e0\u05e9\u05d8\u05d9\u05d9\u05df
-territories.LC=\u05e1\u05e0\u05d8 \u05dc\u05d5\u05e9\u05d9\u05d4
+territories.LC=\u05e1\u05e0\u05d8 \u05dc\u05d5\u05e1\u05d9\u05d4
territories.LB=\u05dc\u05d1\u05e0\u05d5\u05df
-territories.LA=\u05dc\u05d0\u05d5\u05e1, \u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4 \u05d4\u05d3\u05de\u05e7\u05d5\u05e8\u05d8\u05d9\u05ea \u05d4\u05e2\u05de\u05de\u05d9\u05ea
-territories.KZ=\u05e7\u05d6\u05d7\u05e1\u05d8\u05df
-territories.KY=\u05d0\u05d9\u05d9 \u05e7\u05d9\u05d9\u05de\u05d0\u05df
-territories.KW=\u05db\u05d5\u05d5\u05d9\u05ea
-territories.KR=\u05e7\u05d5\u05e8\u05d9\u05d0\u05d4, \u05d3\u05e8\u05d5\u05dd
-territories.KP=\u05e7\u05d5\u05e8\u05d9\u05d0\u05d4, \u05e6\u05e4\u05d5\u05df
-territories.KN=\u05e1\u05e0\u05d8 \u05e7\u05d9\u05d8\u05e1 \u05d5\u05e0\u05d9\u05d1\u05e1
+territories.LA=\u05dc\u05d0\u05d5\u05e1
+territories.KZ=\u05e7\u05d6\u05d0\u05d7\u05e1\u05d8\u05d0\u05df
+territories.KY=\u05e7\u05d9\u05d9\u05de\u05d0\u05df, \u05d0\u05d9\u05d9
+territories.KW=\u05db\u05d5\u05d5\u05d9\u05d9\u05ea
+territories.145=\u05de\u05d6\u05e8\u05d7 \u05d0\u05e1\u05d9\u05d4
+territories.142=\u05d0\u05e1\u05d9\u05d4
+territories.KR=\u05e7\u05d5\u05e8\u05d9\u05d0\u05d4 \u05d4\u05d3\u05e8\u05d5\u05de\u05d9\u05ea
+territories.KP=\u05e7\u05d5\u05e8\u05d9\u05d0\u05d4 \u05d4\u05e6\u05e4\u05d5\u05e0\u05d9\u05ea
+territories.KN=\u05e1\u05e0\u05d8 \u05e7\u05d9\u05d8\u05e1 \u05d5\u05e0\u05d5\u05d5\u05d9\u05e1
territories.KM=\u05e7\u05d5\u05de\u05d5\u05e8\u05d5\u05e1
territories.KI=\u05e7\u05d9\u05e8\u05d9\u05d1\u05d0\u05d8\u05d9
territories.WS=\u05e1\u05de\u05d5\u05d0\u05d4
territories.KH=\u05e7\u05de\u05d1\u05d5\u05d3\u05d9\u05d4
-territories.KG=\u05e7\u05d9\u05e8\u05d2\u05d9\u05d6\u05e1\u05d8\u05df
+territories.KG=\u05e7\u05d9\u05e8\u05d2\u05d9\u05d6\u05e1\u05d8\u05d0\u05df
territories.KE=\u05e7\u05e0\u05d9\u05d4
-territories.WF=\u05d5\u05d0\u05dc\u05d9\u05e1 \u05d5\u05e4\u05d5\u05d8\u05d5\u05e0\u05d4
+territories.WF=\u05d5\u05d5\u05dc\u05d9\u05e1 \u05d5\u05e4\u05d5\u05d8\u05d5\u05e0\u05d4
territories.JP=\u05d9\u05e4\u05df
territories.JO=\u05d9\u05e8\u05d3\u05df
-territories.JM=\u05d2\u05f3\u05de\u05d9\u05d9\u05e7\u05d4
+territories.JM=\u05d2\u05f3\u05d0\u05de\u05d9\u05d9\u05e7\u05d4
territories.VU=\u05d5\u05d0\u05e0\u05d5\u05d0\u05d8\u05d5
territories.VN=\u05d5\u05d9\u05d9\u05d8\u05e0\u05d0\u05dd
-territories.VI=\u05d0\u05d9\u05d9 \u05d4\u05d1\u05ea\u05d5\u05dc\u05d4 \u05d4\u05d0\u05de\u05e8\u05d9\u05e7\u05e0\u05d9\u05d9\u05dd
-territories.VG=\u05d0\u05d9\u05d9 \u05d4\u05d1\u05ea\u05d5\u05dc\u05d4 \u05d4\u05d1\u05e8\u05d9\u05d8\u05d9\u05d9\u05dd
+territories.VI=\u05d1\u05ea\u05d5\u05dc\u05d4, \u05d0\u05d9\u05d9 (\u05d0\u05e8\u05d4\"\u05d1)
+territories.VG=\u05d1\u05ea\u05d5\u05dc\u05d4, \u05d0\u05d9\u05d9 (\u05d1\u05e8\u05d9\u05d8\u05d9\u05d9\u05dd)
territories.VE=\u05d5\u05e0\u05e6\u05d5\u05d0\u05dc\u05d4
-territories.VC=\u05e1\u05e0\u05d8 \u05d5\u05d9\u05e0\u05e1\u05e0\u05d8 \u05d5\u05d4\u05d2\u05e8\u05e0\u05d3\u05d9\u05e0\u05d9\u05dd
-territories.VA=\u05d4\u05d5\u05d5\u05ea\u05d9\u05e7\u05df
+territories.VC=\u05e1\u05e0\u05d8 \u05d5\u05d9\u05e0\u05e1\u05e0\u05d8 \u05d5\u05d0\u05d9\u05d9 \u05d2\u05e8\u05e0\u05d0\u05d3\u05d9\u05df
+territories.VA=\u05d5\u05d8\u05d9\u05e7\u05d0\u05df
territories.IT=\u05d0\u05d9\u05d8\u05dc\u05d9\u05d4
territories.IS=\u05d0\u05d9\u05e1\u05dc\u05e0\u05d3
-territories.IR=\u05d0\u05d9\u05e8\u05d0\u05df, \u05d4\u05e8\u05e4\u05d5\u05d1\u05dc\u05d9\u05e7\u05d4 \u05d4\u05d0\u05d9\u05e1\u05dc\u05de\u05d9\u05ea
+territories.IR=\u05d0\u05d9\u05e8\u05d0\u05df
territories.IQ=\u05e2\u05d9\u05e8\u05e7
-territories.UZ=\u05d0\u05d5\u05d6\u05d1\u05e7\u05d9\u05e1\u05d8\u05df
-territories.IO=\u05d4\u05d8\u05e8\u05d9\u05d8\u05d5\u05e8\u05d9\u05d4 \u05d4\u05d1\u05e8\u05d9\u05d8\u05d9\u05ea \u05d1\u05d0\u05d5\u05e7\u05d9\u05e0\u05d5\u05e1 \u05d4\u05d4\u05d5\u05d3\u05d9
+territories.UZ=\u05d0\u05d5\u05d6\u05d1\u05e7\u05d9\u05e1\u05d8\u05d0\u05df
+territories.IO=\u05d8\u05e8\u05d9\u05d8\u05d5\u05e8\u05d9\u05d4 \u05d1\u05e8\u05d9\u05d8\u05d9\u05ea \u05d1\u05d0\u05d5\u05e7\u05d9\u05d0\u05e0\u05d5\u05e1 \u05d4\u05d4\u05d5\u05d3\u05d9
territories.UY=\u05d0\u05d5\u05e8\u05d5\u05d2\u05d5\u05d5\u05d0\u05d9
territories.IN=\u05d4\u05d5\u05d3\u05d5
territories.IL=\u05d9\u05e9\u05e8\u05d0\u05dc
territories.US=\u05d0\u05e8\u05e6\u05d5\u05ea \u05d4\u05d1\u05e8\u05d9\u05ea
territories.IE=\u05d0\u05d9\u05e8\u05dc\u05e0\u05d3
territories.ID=\u05d0\u05d9\u05e0\u05d3\u05d5\u05e0\u05d6\u05d9\u05d4
-territories.UM=\u05d0\u05d9\u05d9\u05dd \u05e7\u05d8\u05e0\u05d9\u05dd \u05e9\u05dc\u05d7\u05d5\u05e3 \u05d0\u05e8\u05e6\u05d5\u05ea \u05d4\u05d1\u05e8\u05d9\u05ea
+territories.UM=\u05d0\u05d9\u05d9\u05dd \u05e9\u05d5\u05e0\u05d9\u05dd \u05e9\u05dc \u05d0\u05e8\u05e6\u05d5\u05ea \u05d4\u05d1\u05e8\u05d9\u05ea \u05d1\u05d0\u05d5\u05e7\u05d9\u05d0\u05e0\u05d5\u05e1 \u05d4\u05e9\u05e7\u05d8
territories.UG=\u05d0\u05d5\u05d2\u05e0\u05d3\u05d4
territories.UA=\u05d0\u05d5\u05e7\u05e8\u05d0\u05d9\u05e0\u05d4
territories.HU=\u05d4\u05d5\u05e0\u05d2\u05e8\u05d9\u05d4
@@ -247,15 +285,15 @@ territories.HT=\u05d4\u05d0\u05d9\u05d8\u05d9
territories.HR=\u05e7\u05e8\u05d5\u05d0\u05d8\u05d9\u05d4
territories.TZ=\u05d8\u05e0\u05d6\u05e0\u05d9\u05d4
territories.HN=\u05d4\u05d5\u05e0\u05d3\u05d5\u05e8\u05e1
-territories.HM=\u05d0\u05d9\u05d9 \u05d4\u05e8\u05d3 \u05d5\u05d0\u05d9\u05d9 \u05de\u05e7\u05d3\u05d5\u05e0\u05dc\u05e0\u05d3
-territories.TW=\u05d8\u05d9\u05d5\u05d5\u05d0\u05df
+territories.HM=\u05d4\u05e8\u05d3 \u05d5\u05de\u05e7\u05d3\u05d5\u05e0\u05dc\u05e0\u05d3, \u05d0\u05d9\u05d9
+territories.TW=\u05d8\u05d9\u05d9\u05d5\u05d5\u05d0\u05df
territories.TV=\u05d8\u05d5\u05d1\u05d0\u05dc\u05d5
-territories.HK=\u05d4\u05d5\u05e0\u05d2 \u05e7\u05d5\u05e0\u05d2 S.A.R. \u05e9\u05dc \u05e1\u05d9\u05df
-territories.TT=\u05d8\u05e8\u05d9\u05e0\u05d9\u05d3\u05d3 \u05d5\u05d8\u05d5\u05d1\u05d2\u05d5
+territories.HK=\u05d4\u05d5\u05e0\u05d2 \u05e7\u05d5\u05e0\u05d2 S.A.R.\u200e \u05e9\u05dc \u05e1\u05d9\u05df
+territories.TT=\u05d8\u05e8\u05d9\u05e0\u05d9\u05d3\u05d0\u05d3 \u05d5\u05d8\u05d5\u05d1\u05d2\u05d5
territories.TR=\u05d8\u05d5\u05e8\u05e7\u05d9\u05d4
territories.TO=\u05d8\u05d5\u05e0\u05d2\u05d4
territories.TN=\u05d8\u05d5\u05e0\u05d9\u05e1\u05d9\u05d4
-territories.TM=\u05d8\u05d5\u05e8\u05e7\u05de\u05e0\u05d9\u05e1\u05d8\u05df
+territories.TM=\u05d8\u05d5\u05e8\u05e7\u05de\u05e0\u05d9\u05e1\u05d8\u05d0\u05df
languages.es=\u05e1\u05e4\u05e8\u05d3\u05d9\u05ea
languages.mul=\u05de\u05e1\u05e4\u05e8 \u05e9\u05e4\u05d5\u05ea
languages.eo=\u05d0\u05e1\u05e4\u05e8\u05e0\u05d8\u05d5
@@ -264,8 +302,8 @@ languages.el=\u05d9\u05d5\u05d5\u05e0\u05d9\u05ea
languages.ko=\u05e7\u05d5\u05e8\u05d9\u05d0\u05e0\u05d9\u05ea
languages.sgn=\u05e9\u05e4\u05ea \u05e1\u05d9\u05de\u05e0\u05d9\u05dd
languages.ka=\u05d2\u05e8\u05d5\u05d6\u05d9\u05e0\u05d9\u05ea
-languages.pt=\u05e4\u05d5\u05e8\u05d8\u05d5\u05d2\u05d6\u05d9\u05ea
languages.nap=\u05e0\u05e4\u05d5\u05dc\u05d9\u05d8\u05e0\u05d9\u05ea
+languages.pt=\u05e4\u05d5\u05e8\u05d8\u05d5\u05d2\u05d6\u05d9\u05ea
languages.mas=\u05de\u05d0\u05e1\u05d0\u05d9\u05ea
languages.de=\u05d2\u05e8\u05de\u05e0\u05d9\u05ea
languages.pl=\u05e4\u05d5\u05dc\u05e0\u05d9\u05ea
@@ -276,8 +314,8 @@ languages.cs=\u05e6\u05f3\u05db\u05d9\u05ea
languages.lad=\u05dc\u05d3\u05d9\u05e0\u05d5
languages.it=\u05d0\u05d9\u05d8\u05dc\u05e7\u05d9\u05ea
languages.is=\u05d0\u05d9\u05e1\u05dc\u05e0\u05d3\u05d9\u05ea
-languages.aus=\u05e9\u05e4\u05d5\u05ea \u05d0\u05d5\u05e1\u05d8\u05e8\u05dc\u05d9\u05d5\u05ea
languages.myn=\u05de\u05d0\u05d9\u05d4
+languages.aus=\u05e9\u05e4\u05d5\u05ea \u05d0\u05d5\u05e1\u05d8\u05e8\u05dc\u05d9\u05d5\u05ea
languages.ca=\u05e7\u05d8\u05dc\u05d5\u05e0\u05d9\u05ea
languages.id=\u05d0\u05d9\u05e0\u05d3\u05d5\u05e0\u05d6\u05d9\u05ea
languages.uk=\u05d0\u05d5\u05e7\u05e8\u05d0\u05d9\u05e0\u05d9\u05ea
@@ -309,13 +347,13 @@ languages.af=\u05d0\u05e4\u05e8\u05d9\u05e7\u05e0\u05d9\u05ea
languages.mo=\u05de\u05d5\u05dc\u05d3\u05d1\u05d9\u05ea
languages.mn=\u05de\u05d5\u05e0\u05d2\u05d5\u05dc\u05d9\u05ea
languages.sr=\u05e1\u05e8\u05d1\u05d9\u05ea
-languages.mk=\u05de\u05e7\u05d3\u05d5\u05e0\u05d9\u05ea
languages.aa=\u05d0\u05ea\u05d9\u05d5\u05e4\u05d9\u05ea
-languages.mi=\u05de\u05d0\u05d5\u05e8\u05d9\u05ea
+languages.mk=\u05de\u05e7\u05d3\u05d5\u05e0\u05d9\u05ea
languages.gd=\u05e1\u05e7\u05d5\u05d8\u05d9\u05ea \u05d2\u05d0\u05dc\u05d9\u05ea
+languages.mi=\u05de\u05d0\u05d5\u05e8\u05d9\u05ea
languages.sl=\u05e1\u05dc\u05d5\u05d1\u05e0\u05d9\u05ea
-languages.sk=\u05e1\u05dc\u05d5\u05d1\u05e7\u05d9\u05ea
languages.ga=\u05d0\u05d9\u05e8\u05d9\u05ea
+languages.sk=\u05e1\u05dc\u05d5\u05d1\u05e7\u05d9\u05ea
languages.sh=\u05e1\u05e8\u05d1\u05d5-\u05e7\u05e8\u05d5\u05d0\u05d8\u05d9\u05ea
languages.yi=\u05d9\u05d9\u05d3\u05d9\u05e9
languages.sa=\u05e1\u05e0\u05e1\u05e7\u05e8\u05d9\u05ea
diff --git a/resource/gnu/java/locale/LocaleInformation_hi.properties b/resource/gnu/java/locale/LocaleInformation_hi.properties
index 1ccc2a8f2..5add44754 100644
--- a/resource/gnu/java/locale/LocaleInformation_hi.properties
+++ b/resource/gnu/java/locale/LocaleInformation_hi.properties
@@ -39,8 +39,8 @@ territories.SD=\u0938\u0942\u0921\u093e\u0928
territories.SA=\u0938\u090a\u0926\u0940 \u0905\u0930\u092c
territories.FR=\u092b\u094d\u0930\u093e\u0902\u0938
territories.RW=\u0930\u0942\u0906\u0923\u094d\u0921\u093e
-territories.RU=\u0930\u0942\u0938
territories.FJ=\u092b\u093f\u091c\u0940
+territories.RU=\u0930\u0942\u0938
territories.FI=\u092b\u093f\u0928\u0932\u0948\u0902\u0921
territories.RO=\u0930\u094b\u092e\u093e\u0928\u093f\u092f\u093e
territories.ET=\u0907\u0925\u093f\u092f\u094b\u092a\u093f\u092f\u093e
@@ -64,11 +64,11 @@ territories.PK=\u092a\u093e\u0915\u093f\u0938\u094d\u0924\u093e\u0928
territories.PH=\u092b\u093f\u0932\u0940\u092a\u093f\u0902\u0938
territories.PG=\u092a\u093e\u092a\u0941\u0906 \u0928\u094d\u092f\u0942 \u0917\u093f\u0928\u0940
territories.CZ=\u091a\u0947\u0915 \u0917\u0923\u0930\u093e\u091c\u094d\u092f
-territories.PE=\u092a\u0947\u0930\u0942
territories.CY=\u0938\u093e\u0907\u092a\u094d\u0930\u0938
+territories.PE=\u092a\u0947\u0930\u0942
territories.CV=\u0915\u0948\u092a \u0935\u0930\u094d\u0924
-territories.PA=\u092a\u0928\u093e\u092e\u093e
territories.CU=\u0915\u094d\u092f\u0942\u092c\u093e
+territories.PA=\u092a\u0928\u093e\u092e\u093e
territories.CR=\u0915\u094b\u0938\u094d\u091f\u093e\u0930\u0940\u0915\u093e
territories.CO=\u0915\u094b\u0932\u092e\u094d\u092c\u093f\u092f\u093e
territories.CN=\u091a\u0940\u0928
@@ -103,19 +103,19 @@ territories.ZM=\u091c\u093e\u092e\u094d\u092c\u093f\u092f\u093e
territories.AU=\u0911\u0938\u094d\u091f\u094d\u0930\u0947\u0932\u093f\u092f\u093e
territories.AT=\u0911\u0938\u094d\u091f\u094d\u0930\u093f\u092f\u093e
territories.AR=\u0905\u0930\u094d\u091c\u0947\u0928\u094d\u091f\u0940\u0928\u093e
-territories.MZ=\u092e\u094b\u091c\u093e\u092e\u094d\u092c\u093f\u0915
territories.AO=\u0905\u0902\u0917\u094b\u0932\u093e
+territories.MZ=\u092e\u094b\u091c\u093e\u092e\u094d\u092c\u093f\u0915
territories.MY=\u092e\u0932\u0947\u0936\u093f\u092f\u093e
-territories.MX=\u092e\u0947\u0915\u094d\u0938\u093f\u0915\u094b
territories.AM=\u0906\u0930\u094d\u092e\u0947\u0928\u093f\u092f\u093e
-territories.MW=\u092e\u0932\u093e\u0935\u0940
+territories.MX=\u092e\u0947\u0915\u094d\u0938\u093f\u0915\u094b
territories.AL=\u0905\u0932\u094d\u092c\u093e\u0928\u093f\u092f\u093e
+territories.MW=\u092e\u0932\u093e\u0935\u0940
territories.MV=\u092e\u093e\u0932\u0926\u0940\u0935
territories.ZA=\u0926\u0915\u094d\u0937\u093f\u0923 \u0905\u092b\u094d\u0930\u0940\u0915\u093e
territories.MU=\u092e\u094c\u0930\u093f\u0938
territories.MT=\u092e\u093e\u0932\u094d\u091f\u093e
-territories.MR=\u092e\u0949\u0930\u093f\u091f\u093e\u0928\u093f\u092f\u093e
territories.AG=\u090f\u0928\u094d\u091f\u093f\u0917\u0941\u0935\u093e \u0914\u0930 \u092c\u093e\u0930\u092c\u0942\u0921\u093e
+territories.MR=\u092e\u0949\u0930\u093f\u091f\u093e\u0928\u093f\u092f\u093e
territories.AF=\u0905\u092b\u0917\u093e\u0928\u093f\u0938\u094d\u0924\u093e\u0928
territories.AE=\u0938\u0902\u092f\u0941\u0915\u094d\u0924 \u0905\u0930\u092c \u0905\u092e\u0940\u0930\u093e\u0924
territories.AD=\u0905\u0928\u094d\u0921\u094b\u0930\u093e
@@ -185,14 +185,14 @@ territories.TM=\u0924\u0941\u0930\u094d\u0915\u092e\u0947\u0928\u093f\u0938\u094
languages.es=\u0938\u094d\u092a\u0947\u0928\u093f\u0936
languages.ku=\u0915\u0941\u0930\u0926\u0940\u0936
languages.eo=\u090f\u0938\u094d\u092a\u0947\u0930\u093e\u0928\u094d\u0924\u094b
-languages.ks=\u0915\u093e\u0936\u094d\u092e\u093f\u0930\u0940
languages.en=\u0905\u0902\u0917\u094d\u0930\u0947\u091c\u0940
+languages.ks=\u0915\u093e\u0936\u094d\u092e\u093f\u0930\u0940
languages.el=\u0917\u094d\u0930\u0940\u0915
languages.qu=\u0915\u094d\u0935\u0947\u0936\u0941\u0906
languages.ko=\u0915\u094b\u0930\u0940\u092f\u0928\u094d
languages.kn=\u0915\u0928\u094d\u0928\u0921\u093c
-languages.kok=\u0915\u094b\u0902\u0915\u0923\u0940
languages.km=\u0915\u0948\u092e\u094d\u092c\u094b\u0921\u093f\u092f\u0928\u094d
+languages.kok=\u0915\u094b\u0902\u0915\u0923\u0940
languages.kl=\u0917\u094d\u0930\u0940\u0928\u0932\u0948\u0902\u0921\u093f\u0915
languages.kk=\u0915\u095b\u093e\u0916
languages.wo=\u0935\u094b\u0932\u094b\u092b
@@ -212,8 +212,8 @@ languages.cy=\u0935\u0947\u0932\u094d\u0936
languages.pa=\u092a\u0902\u091c\u093e\u092c\u0940
languages.cs=\u091a\u0947\u0915
languages.iu=\u0907\u0928\u0942\u0915\u0940\u091f\u0942\u0924\u094d
-languages.it=\u0908\u091f\u093e\u0932\u093f\u092f\u0928\u094d
languages.co=\u0915\u094b\u0930\u094d\u0938\u0940\u0915\u0928
+languages.it=\u0908\u091f\u093e\u0932\u093f\u092f\u0928\u094d
languages.is=\u0906\u0908\u0938\u094d\u0932\u0948\u0902\u0921\u093f\u0915\u094d
languages.uz=\u0909\u095b\u092c\u0947\u0915\u094d
languages.or=\u0909\u0921\u093c\u093f\u092f\u093e
@@ -306,15 +306,15 @@ languages.fy=\u092b\u094d\u0930\u0940\u091c\u093c\u0928\u094d
languages.sa=\u0938\u0902\u0938\u094d\u0915\u0943\u0924
languages.fr=\u092b\u094d\u0930\u0947\u0902\u091a
languages.lv=\u0932\u093e\u091f\u0935\u093f\u092f\u0928\u094d (\u0932\u0947\u091f\u094d\u091f\u0940\u0936)
-languages.lt=\u0932\u093f\u0925\u0941\u0928\u093f\u092f\u0928\u094d
languages.fo=\u092b\u093f\u0930\u094b\u095b\u0940
+languages.lt=\u0932\u093f\u0925\u0941\u0928\u093f\u092f\u0928\u094d
languages.rw=\u0915\u093f\u0928\u094d\u092f\u093e\u0930\u0935\u093e\u0923\u094d\u0921\u093e
languages.root=\u0936\u093f\u0916\u0930
languages.ru=\u0930\u0941\u0938\u0940
-languages.lo=\u0932\u093e\u0913\u0925\u0940\u092f\u0928\u094d
languages.fj=\u095e\u0940\u091c\u0940
-languages.ln=\u0932\u093f\u0902\u0917\u093e\u0932\u093e
+languages.lo=\u0932\u093e\u0913\u0925\u0940\u092f\u0928\u094d
languages.fi=\u092b\u093f\u0928\u093f\u0936
+languages.ln=\u0932\u093f\u0902\u0917\u093e\u0932\u093e
languages.ro=\u0930\u0942\u092e\u093e\u0928\u0940\u092f\u0928\u094d
languages.rn=\u0915\u093f\u0930\u0942\u0928\u094d\u0926\u0940
languages.rm=\u0930\u0939\u0947\u092f\u094d\u091f\u094b-\u0930\u094b\u092e\u093e\u0928\u094d\u0938
@@ -322,5 +322,5 @@ languages.fa=\u092a\u0930\u094d\u0936\u093f\u092f\u0928\u094d
languages.la=\u0932\u0948\u091f\u0940\u0928
languages.xh=\u0937\u094b\u0938\u093e
languages.eu=\u092c\u093e\u0938\u094d\u0915\u094d
-languages.ky=\u0915\u093f\u0930\u0918\u093f\u095b
languages.et=\u0910\u0938\u094d\u0924\u094b\u0928\u093f\u092f\u0928\u094d
+languages.ky=\u0915\u093f\u0930\u0918\u093f\u095b
diff --git a/resource/gnu/java/locale/LocaleInformation_hi_IN.properties b/resource/gnu/java/locale/LocaleInformation_hi_IN.properties
index c5e3fdacd..7afb589b1 100644
--- a/resource/gnu/java/locale/LocaleInformation_hi_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_hi_IN.properties
@@ -5,8 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
firstDayOfWeek=mon
shortDateFormat=d-M-yy
mediumDateFormat=dd-MM-yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_hr.properties b/resource/gnu/java/locale/LocaleInformation_hr.properties
index 91089003e..5ea7f5ae6 100644
--- a/resource/gnu/java/locale/LocaleInformation_hr.properties
+++ b/resource/gnu/java/locale/LocaleInformation_hr.properties
@@ -9,54 +9,42 @@ decimalSeparator=,
groupingSeparator=.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
currenciesDisplayName.YDD=jemenski dinar
-currenciesDisplayName.KES=Kenijski \u0161iling
currenciesDisplayName.TWD=Novotajvanski dolar
+currenciesDisplayName.KES=Kenijski \u0161iling
currenciesDisplayName.LKR=Sri Lanka Rupee
currenciesDisplayName.TJS=Tad\u017eikistanski somoni
-currenciesDisplayName.ERN=Eritrean Nakfa
currenciesDisplayName.SDP=Sudanska funta
+currenciesDisplayName.ERN=Eritrean Nakfa
currenciesDisplayName.GRD=Gr\u010dka drahma
currenciesDisplayName.IEP=Irska funta
currenciesDisplayName.ARS=Argentinski pezo
-currenciesDisplayName.MQF=Martinique Franc
-currenciesDisplayName.ARP=Argentinski pezo (1983-1985)
currenciesDisplayName.SDD=Sudanski dinar
+currenciesDisplayName.ARP=Argentinski pezo (1983-1985)
currenciesDisplayName.GEL=Gruzijski lari
currenciesDisplayName.GEK=Georgian Kupon Larit
currenciesDisplayName.CRC=Kostarikanski kolon
-currenciesDisplayName.MDR=Moldovan Ruble Cupon
currenciesDisplayName.FKP=Falklandska funta
-currenciesDisplayName.GQP=Equatorial Guinea Peseta Guineana
currenciesDisplayName.EEK=Estonian Kroon
-currenciesDisplayName.MDL=Moldovski lej
currenciesDisplayName.HKD=Honkon\u0161ki dolar
+currenciesDisplayName.MDL=Moldovski lej
currenciesDisplayName.IQD=Ira\u010dki dinar
currenciesDisplayName.SCR=Sej\u0161elska rupija
-currenciesDisplayName.GQF=Equatorial Guinea Franco
currenciesDisplayName.DKK=Danska kruna
-currenciesDisplayName.IDR=Indonezijska rupija
currenciesDisplayName.GQE=Equatorial Guinea Ekwele Guineana
-currenciesDisplayName.MDC=Moldovan Leu Cupon
-currenciesDisplayName.SOS=Somalijski \u0161iling
+currenciesDisplayName.IDR=Indonezijska rupija
currenciesDisplayName.LVR=Latvian Ruble
+currenciesDisplayName.SOS=Somalijski \u0161iling
currenciesDisplayName.LVL=Latvian Lats
currenciesDisplayName.RUR=Ruska rublja (1991-1998)
-currenciesDisplayName.FJP=Fid\u017eijska funta
-currenciesDisplayName.MCG=Monaco Franc Germinal
-currenciesDisplayName.MCF=Monaco Franc Nouveau
-currenciesDisplayName.MOP=Macao Pataca
-currenciesDisplayName.GPF=Guadeloupe Franc
currenciesDisplayName.FJD=Fid\u017eijski dolar
+currenciesDisplayName.MOP=Macao Pataca
currenciesDisplayName.RUB=Ruska rublja
currenciesDisplayName.DJF=Djibouti Franc
-currenciesDisplayName.LIF=Lihten\u0161tajnski franak
-currenciesDisplayName.SBD=Solomonskooto\u010dni dolar
currenciesDisplayName.ECV=Ecuador Unidad de Valor Constante (UVC)
-currenciesDisplayName.TTO=Trinidadtoba\u0161ki stari dolar
+currenciesDisplayName.SBD=Solomonskooto\u010dni dolar
currenciesDisplayName.ECS=Ecuador Sucre
currenciesDisplayName.PHP=Filipinski pezo
currenciesDisplayName.LUF=Luksembur\u0161ki franak
-currenciesDisplayName.FIN=Finska marka (1860-1962)
currenciesDisplayName.FIM=Finska marka
currenciesDisplayName.TTD=Trinidadtoba\u0161ki dolar
currenciesDisplayName.SZL=Lilangeni
@@ -66,96 +54,73 @@ currenciesDisplayName.HUF=Ma\u0111arska forinta
currenciesDisplayName.COP=Kolumbijski pezo
currenciesDisplayName.LTT=Lithuanian Talonas
currenciesDisplayName.PTE=Portugalski eskudo
-currenciesDisplayName.PTC=Portugalski konto
currenciesDisplayName.GBP=Britanska funta
-currenciesDisplayName.ZRZ=Zairski zair
currenciesDisplayName.INR=Indijska rupija
+currenciesDisplayName.ZRZ=Zairski zair
currenciesDisplayName.LTL=Lithuanian Lita
-currenciesDisplayName.UYP=Urugvajski pezo (1975-1993)
-currenciesDisplayName.MZM=Mozambique Metical
currenciesDisplayName.KZT=Kazakhstan Tenge
-currenciesDisplayName.KZR=Kazakhstan Ruble
+currenciesDisplayName.MZM=Mozambique Metical
+currenciesDisplayName.UYP=Urugvajski pezo (1975-1993)
currenciesDisplayName.AOK=Angolska kvanza (1977-1990)
currenciesDisplayName.GNS=Guinea Syli
currenciesDisplayName.SYP=Sirijska funta
-currenciesDisplayName.OMR=Omanski rijal
-currenciesDisplayName.NGP=Nigerijska funta
currenciesDisplayName.MZE=Mozambique Escudo
-currenciesDisplayName.ZRN=Zairski novi zair
+currenciesDisplayName.OMR=Omanski rijal
currenciesDisplayName.NGN=Nigerijska naira
-currenciesDisplayName.PSP=Palestinska funta
+currenciesDisplayName.ZRN=Zairski novi zair
currenciesDisplayName.AOA=Angolska kvanza
-currenciesDisplayName.GNI=Gvinejski franak (1960-1972)
+currenciesDisplayName.CNY=Kineski Yuan Renminbi
currenciesDisplayName.MAF=Morokanski franak
currenciesDisplayName.GNF=Gvinejski franak
-currenciesDisplayName.MAD=Morokanski dirham
currenciesDisplayName.HTG=Haitian Gourde
-currenciesDisplayName.CNP=Chinese Jen Min Piao Yuan
+currenciesDisplayName.MAD=Morokanski dirham
+currenciesDisplayName.TRY=Nova Turska Lira
currenciesDisplayName.MMK=Myanmar Kyat
currenciesDisplayName.MYR=Malaysian Ringgit
currenciesDisplayName.LSL=Lesotho Loti
currenciesDisplayName.TRL=Turska lira
currenciesDisplayName.KMF=Comoro Franc
currenciesDisplayName.CZK=\u010ce\u0161ka kruna
-currenciesDisplayName.GMP=Gambijska funta
currenciesDisplayName.AZM=Azerbejd\u017eanski manat
currenciesDisplayName.KYD=Kajmanski dolar
currenciesDisplayName.GMD=Gambia Dalasi
currenciesDisplayName.CAD=Kanadski dolar
currenciesDisplayName.VEB=Venezuelski bolivar
currenciesDisplayName.MLF=Mali Franc
-currenciesDisplayName.MXP=Meksi\u010dki srebrni pezo (1861-1992)
currenciesDisplayName.ILS=Novi izraelski \u0161ekel
+currenciesDisplayName.MXP=Meksi\u010dki srebrni pezo (1861-1992)
currenciesDisplayName.PES=Peruanski sol
-currenciesDisplayName.MXN=Meksi\u010dki pezo
currenciesDisplayName.GYD=Guyana Dollar
+currenciesDisplayName.MXN=Meksi\u010dki pezo
currenciesDisplayName.ILP=Israelska funta
-currenciesDisplayName.CYP=Ciparska funta
currenciesDisplayName.SKK=Slova\u010dka kruna
+currenciesDisplayName.CYP=Ciparska funta
currenciesDisplayName.PEN=Peruanski novi sol
-currenciesDisplayName.ILL=Israelski \u0161ekel
currenciesDisplayName.LRD=Liberijski dolar
currenciesDisplayName.PEI=Peruanski inti
currenciesDisplayName.AMD=Armenian Dram
-currenciesDisplayName.GLK=Grenlandska kruna
currenciesDisplayName.HRK=Kuna
-currenciesDisplayName.MKN=Makedonski denar (1992-1993)
-currenciesDisplayName.HRD=Hrvatski dinar
currenciesDisplayName.CLP=\u010cileanski pezo
-currenciesDisplayName.ALV=Albanian Lek Valute
-currenciesDisplayName.FRG=French Franc Germinal/Franc Poincare
+currenciesDisplayName.HRD=Hrvatski dinar
currenciesDisplayName.FRF=Francuski franak
-currenciesDisplayName.MWP=Malawi Pound
currenciesDisplayName.MKD=Makedonski denar
-currenciesDisplayName.TPP=Timor Pataca
-currenciesDisplayName.PDR=Transdniestria Ruble
currenciesDisplayName.CLF=Chilean Unidades de Fomento
currenciesDisplayName.ALL=Albanski lek
currenciesDisplayName.MWK=Malawi Kwacha
-currenciesDisplayName.ALK=Albanski lek (1946-1961)
-currenciesDisplayName.PDK=Transdniestria Ruble Kupon
+currenciesDisplayName.BRL=Brazilski Real
currenciesDisplayName.TPE=Timorski eskudo
-currenciesDisplayName.DES=German Sperrmark
currenciesDisplayName.DEM=Njema\u010dka marka
-currenciesDisplayName.YUR=Jugoslavenski reformirani dinar
currenciesDisplayName.KWD=Kuvajtski dinar
currenciesDisplayName.NPR=Nepalska rupija
currenciesDisplayName.GWP=Gvinejskobisauski pezo
-currenciesDisplayName.YUO=Jugoslavenski oktobarski dinar
currenciesDisplayName.YUN=Jugoslavenski konvertibilni dinar
currenciesDisplayName.YUM=Jugoslavenski novi dinar
-currenciesDisplayName.GWM=Portuguese Guinea Mil Reis
currenciesDisplayName.SIT=Slovenski tolar
currenciesDisplayName.JPY=Japanski jen
-currenciesDisplayName.YUG=Jugoslavenski dinar 1994
-currenciesDisplayName.YUF=Jugoslavenski federalni dinar
currenciesDisplayName.BEF=Belgijski franak
-currenciesDisplayName.YUD=Jugoslavenski \u010dvrsti dinar
currenciesDisplayName.GWE=Portuguese Guinea Escudo
-currenciesDisplayName.RON=Rumunjski novi lej
+currenciesDisplayName.YUD=Jugoslavenski \u010dvrsti dinar
currenciesDisplayName.ROL=Rumunjski lej
-currenciesDisplayName.CWG=Curacao Guilder
-currenciesDisplayName.SIB=Slovenia Tolar Bons
currenciesDisplayName.BDT=Taka
currenciesDisplayName.DDM=East German Ostmark
currenciesDisplayName.XBB=Europska monetarna jedinica
@@ -163,305 +128,142 @@ currenciesDisplayName.XBA=Europska slo\u017eena jedinica
currenciesDisplayName.NOK=Norve\u0161ka kruna
currenciesDisplayName.MUR=Mauricijska rupija
currenciesDisplayName.ZAR=Ju\u017enoafri\u010dki rand
-currenciesDisplayName.ZAP=Ju\u017enoafri\u010dka funta
currenciesDisplayName.XAU=Zlato
currenciesDisplayName.ZAL=Ju\u017enoafri\u010dki rand (financijski)
currenciesDisplayName.VND=Viejetnamski dong
-currenciesDisplayName.KID=Kiribati Dollar
currenciesDisplayName.TZS=Tanzanijski \u0161iling
currenciesDisplayName.GIP=Gibraltarska funta
-currenciesDisplayName.ZMP=Zambijska funta
currenciesDisplayName.TND=Tuniski dinar
currenciesDisplayName.CVE=Zelenortski eskudo
currenciesDisplayName.UGX=Ugandski \u0161iling
currenciesDisplayName.ZMK=Zambijska kva\u010da
currenciesDisplayName.JOD=Jordanski dinar
currenciesDisplayName.UGS=Ugandski \u0161iling (1966-1987)
-currenciesDisplayName.FOK=Faeroe Islands Kronur
currenciesDisplayName.KHR=Cambodian Riel
currenciesDisplayName.DOP=Dominikanski pezo
currenciesDisplayName.EUR=Euro
-currenciesDisplayName.LNR=Ceylon Rupee
-currenciesDisplayName.KHO=Cambodian Old Riel
-currenciesDisplayName.GUF=French Guyana Franc Guiana
currenciesDisplayName.MTP=Malte\u0161ka funta
currenciesDisplayName.USS=Ameri\u010dki dolar (isti dan)
-currenciesDisplayName.MHD=Marshall Islands Dollar
-currenciesDisplayName.NZP=Novozelandska funta
currenciesDisplayName.CUP=Kubanski pezo
currenciesDisplayName.MTL=Malte\u0161ka lira
currenciesDisplayName.TMM=Turkmenistanski manat
currenciesDisplayName.USN=Ameri\u010dki dolar (sljede\u0107i dan)
-currenciesDisplayName.SSP=\u0160kotska funta
currenciesDisplayName.SGD=Singapurski dolar
currenciesDisplayName.NZD=Novozelandski dolar
currenciesDisplayName.USD=Ameri\u010dki dolar
currenciesDisplayName.HNL=Hodura\u0161ka lempira
-currenciesDisplayName.ITL=Talijanska lira
currenciesDisplayName.PAB=Panamska balboa
+currenciesDisplayName.ITL=Talijanska lira
currenciesDisplayName.GTQ=Kvecal
-currenciesDisplayName.AUD=Australski dolar
-currenciesDisplayName.LAK=Laotian Kip
currenciesDisplayName.NAD=Namibijski dolar
+currenciesDisplayName.LAK=Laotian Kip
+currenciesDisplayName.AUD=Australski dolar
currenciesDisplayName.KGS=Kyrgystan Som
-currenciesDisplayName.BBD=Barbadoski dolar
currenciesDisplayName.CHF=\u0160vicarski franak
+currenciesDisplayName.BBD=Barbadoski dolar
currenciesDisplayName.PYG=Paragvajski gvarani
-currenciesDisplayName.JMP=Jamai\u010danska funta
currenciesDisplayName.PLZ=Poljska zlota (1950-1995)
currenciesDisplayName.YER=Jemenski rial
currenciesDisplayName.ATS=Austrijski \u0161iling
-currenciesDisplayName.ETD=Etiopski dolar
-currenciesDisplayName.LYP=Libijska funta
currenciesDisplayName.ETB=Etiopski bir
currenciesDisplayName.BND=Brunejski dolar
-currenciesDisplayName.DZG=Algerian Franc Germinal
-currenciesDisplayName.DZF=Algerian New Franc
-currenciesDisplayName.YEI=Yemeni Imadi Riyal
-currenciesDisplayName.EGP=Egipatska funta
-currenciesDisplayName.JMD=Jamai\u010danski dolar
currenciesDisplayName.PLN=Poljska zlota
+currenciesDisplayName.JMD=Jamai\u010danski dolar
+currenciesDisplayName.EGP=Egipatska funta
currenciesDisplayName.DZD=Al\u017eirski dinar
-currenciesDisplayName.ISK=Islandska kruna
currenciesDisplayName.SRG=Surinamski gulden
+currenciesDisplayName.ISK=Islandska kruna
currenciesDisplayName.LYD=Libijski dinar
currenciesDisplayName.BAM=Konvertibilna marka
currenciesDisplayName.ESP=\u0160panjolska pezeta
currenciesDisplayName.NLG=Nizozemski gulden
currenciesDisplayName.MRO=Mauritanska ouguja
-currenciesDisplayName.BMP=Bermudska funta
currenciesDisplayName.ZWD=Zimbabveanski dolar
currenciesDisplayName.SEK=\u0160vedska kruna
currenciesDisplayName.CSK=Czechoslovak Hard Koruna
currenciesDisplayName.IRR=Iranski rijal
currenciesDisplayName.PKR=Pakistanska rupija
currenciesDisplayName.BMD=Bermudski dolar
-currenciesDisplayName.CSC=\u010ce\u0161ka kruna
-currenciesSymbol.YDD=YDD
currenciesSymbol.KES=K Sh
-currenciesSymbol.TWD=NT$
currenciesSymbol.LKR=SL Re
-currenciesSymbol.TJS=TJS
-currenciesSymbol.ERN=ERN
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GRD=GRD
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.MKD=MDen
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.MQF=MQF
-currenciesSymbol.ARP=ARP
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AMD=dram
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.CRC=C
-currenciesSymbol.MDR=MDR
-currenciesSymbol.FKP=FKP
-currenciesSymbol.GQP=GQP
-currenciesSymbol.EEK=EEK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.HKD=HK$
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.SCR=SR
-currenciesSymbol.GQF=GQF
-currenciesSymbol.DKK=DKr
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
currenciesSymbol.IDR=Rp
-currenciesSymbol.GQE=GQE
-currenciesSymbol.MDC=MDC
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.LVR=LVR
-currenciesSymbol.LVL=LVL
-currenciesSymbol.RUR=RUR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.MOP=MOP
-currenciesSymbol.GPF=GPF
-currenciesSymbol.FJD=F$
-currenciesSymbol.RUB=RUB
-currenciesSymbol.DJF=DF
-currenciesSymbol.LIF=LIF
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.ECV=ECV
-currenciesSymbol.TTO=TTO
-currenciesSymbol.ECS=ECS
-currenciesSymbol.PHP=PHP
-currenciesSymbol.LUF=LUF
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.MNT=Tug
-currenciesSymbol.UAH=UAH
-currenciesSymbol.HUF=Ft
-currenciesSymbol.COP=Col$
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.PTC=PTC
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.INR=INR
-currenciesSymbol.LTL=LTL
-currenciesSymbol.UYP=UYP
-currenciesSymbol.MZM=Mt
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.AOK=AOK
-currenciesSymbol.GNS=GNS
-currenciesSymbol.SYP=LS
-currenciesSymbol.OMR=RO
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MZE=MZE
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.NGN=NGN
-currenciesSymbol.PSP=PSP
-currenciesSymbol.AOA=AOA
-currenciesSymbol.GNI=GNI
-currenciesSymbol.MAF=MAF
-currenciesSymbol.GNF=GF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.HTG=HTG
-currenciesSymbol.CNP=CNP
-currenciesSymbol.MMK=MMK
-currenciesSymbol.MYR=RM
-currenciesSymbol.LSL=M
-currenciesSymbol.TRL=TL
-currenciesSymbol.KMF=CF
-currenciesSymbol.CZK=CZK
-currenciesSymbol.GMP=GMP
-currenciesSymbol.AZM=AZM
-currenciesSymbol.KYD=KYD
-currenciesSymbol.GMD=GMD
-currenciesSymbol.CAD=Can$
-currenciesSymbol.VEB=Be
-currenciesSymbol.MLF=MLF
-currenciesSymbol.MXP=MXP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.PES=PES
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.GYD=G$
-currenciesSymbol.ILP=ILP
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.SKK=Sk
-currenciesSymbol.PEN=PEN
-currenciesSymbol.ILL=ILL
-currenciesSymbol.LRD=LRD
-currenciesSymbol.PEI=PEI
-currenciesSymbol.AMD=dram
-currenciesSymbol.GLK=GLK
-currenciesSymbol.HRK=HRK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.HRD=HRD
-currenciesSymbol.CLP=Ch$
-currenciesSymbol.ALV=ALV
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.MWP=MWP
-currenciesSymbol.MKD=MDen
-currenciesSymbol.TPP=TPP
-currenciesSymbol.PDR=PDR
-currenciesSymbol.CLF=CLF
-currenciesSymbol.ALL=lek
-currenciesSymbol.MWK=MK
-currenciesSymbol.ALK=ALK
-currenciesSymbol.PDK=PDK
-currenciesSymbol.TPE=TPE
-currenciesSymbol.DES=DES
-currenciesSymbol.DEM=DEM
-currenciesSymbol.YUR=YUR
-currenciesSymbol.KWD=KD
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.GWP=GWP
-currenciesSymbol.YUO=YUO
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.GWM=GWM
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.YUD=YUD
-currenciesSymbol.GWE=GWE
-currenciesSymbol.BEF=BF
-currenciesSymbol.RON=RON
-currenciesSymbol.ROL=leu
-currenciesSymbol.CWG=CWG
-currenciesSymbol.SIB=SIB
+currenciesSymbol.FJD=F$
currenciesSymbol.BDT=Tk
-currenciesSymbol.DDM=DDM
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.ZAR=R
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.XAU=XAU
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.VND=VND
-currenciesSymbol.KID=KID
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.GIP=GIP
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.TND=TND
-currenciesSymbol.CVE=CVEsc
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.ZMK=ZMK
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
currenciesSymbol.JOD=JD
-currenciesSymbol.UGS=UGS
-currenciesSymbol.FOK=FOK
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
currenciesSymbol.KHR=CR
-currenciesSymbol.DOP=RD$
-currenciesSymbol.LNR=LNR
-currenciesSymbol.KHO=KHO
-currenciesSymbol.GUF=GUF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.USS=USS
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.CUP=CUP
+currenciesSymbol.SYP=LS
currenciesSymbol.MTL=Lm
-currenciesSymbol.TMM=TMM
-currenciesSymbol.USN=USN
-currenciesSymbol.SSP=SSP
-currenciesSymbol.SGD=S$
+currenciesSymbol.MZM=Mt
+currenciesSymbol.CVE=CVEsc
+currenciesSymbol.YER=YRl
+currenciesSymbol.HUF=Ft
currenciesSymbol.NZD=$NZ
-currenciesSymbol.USD=US$
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
+currenciesSymbol.DOP=RD$
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.PAB=PAB
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
+currenciesSymbol.GNF=GF
+currenciesSymbol.LSL=M
+currenciesSymbol.PLN=Zl
+currenciesSymbol.VEB=Be
+currenciesSymbol.KMF=CF
+currenciesSymbol.SEK=SKr
currenciesSymbol.AUD=$A
-currenciesSymbol.LAK=LAK
-currenciesSymbol.NAD=N$
-currenciesSymbol.KGS=som
-currenciesSymbol.BBD=BDS$
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
+currenciesSymbol.SKK=Sk
currenciesSymbol.CHF=SwF
-currenciesSymbol.PYG=PYG
-currenciesSymbol.JMP=JMP
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.YER=YRl
-currenciesSymbol.ATS=ATS
-currenciesSymbol.ETD=ETD
-currenciesSymbol.LYP=LYP
currenciesSymbol.ETB=Br
-currenciesSymbol.BND=BND
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.YEI=YEI
-currenciesSymbol.EGP=EGP
-currenciesSymbol.JMD=J$
-currenciesSymbol.PLN=Zl
-currenciesSymbol.DZD=DA
-currenciesSymbol.ISK=ISK
-currenciesSymbol.SRG=Sf
-currenciesSymbol.LYD=LD
-currenciesSymbol.BAM=KM
-currenciesSymbol.ESP=ESP
-currenciesSymbol.NLG=NLG
currenciesSymbol.MRO=UM
-currenciesSymbol.BMP=BMP
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.SEK=SKr
-currenciesSymbol.CSK=CSK
-currenciesSymbol.IRR=RI
+currenciesSymbol.BBD=BDS$
currenciesSymbol.PKR=Pra
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.CSC=CSC
+currenciesSymbol.TWD=NT$
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=sij®vel®o\u017eu®tra®svi®lip®srp®kol®ruj®lis®stu®pro®®
months=sije\u010danj®velja\u010da®o\u017eujak®travanj®svibanj®lipanj®srpanj®kolovoz®rujan®listopad®studeni®prosinac®®
shortWeekdays=®ned®pon®uto®sri®\u010det®pet®sub®
@@ -493,7 +295,9 @@ territories.GN=Gvineja
territories.GM=Gambija
territories.GL=Greenland
territories.SV=El Salvador
+territories.062=Ju\u017eno-centralna Azija
territories.ST=Sveti Toma i Prinsipe
+territories.061=Polinezija
territories.GI=Gibraltar
territories.GH=Gana
territories.SR=Surinam
@@ -517,9 +321,12 @@ territories.SC=Sej\u0161eli
territories.SB=Salamunovi Otoci
territories.SA=Saudijska Arabija
territories.FR=Francuska
+territories.057=Micronezija
territories.FO=Farski Otoci
territories.FM=Mikronezija, Federalne Dr\u017eave
territories.RW=Ruanda
+territories.054=Melanezija
+territories.053=Australija i Novi Zeland
territories.FK=Falklandski Otoci
territories.RU=Ruska Federacija
territories.FJ=Fid\u017ei
@@ -529,20 +336,26 @@ territories.RE=Reunion
territories.ET=Etiopija
territories.ES=\u0160panjolska
territories.ER=Eritreja
+territories.833=Otok Man
territories.EH=Zapadna Sahara
territories.EG=Egipat
+territories.830=Kanalski otoci
territories.EE=Estonija
+territories.QO=Ostala oceanija
territories.EC=Ekvador
territories.DZ=Al\u017eir
territories.QA=Katar
+territories.039=Ju\u017ena Europa
territories.DO=Dominikanska Republika
territories.PY=Paragvaj
+territories.035=Jugoisto\u010dna Azija
territories.DM=Dominika
territories.PW=Palau
territories.DK=Danska
territories.DJ=D\u017eibuti
territories.PT=Portugal
territories.PS=Palestinska Teritoija
+territories.030=Isto\u010dna Azija
territories.PR=Portoriko
territories.DE=Njema\u010dka
territories.PN=Pitcairn
@@ -559,13 +372,16 @@ territories.CX=Bo\u017ei\u0107ni Otoci
territories.CV=Zeleni Rt
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Srbija i Crna Gora
territories.CR=Kostarika
+territories.029=Karibi
territories.CO=Kolumbija
territories.CN=Kina
territories.CM=Kamerun
territories.CL=\u010cile
territories.CK=Kukovi Otoci
territories.CI=Obala Bjelokosti
+territories.021=Sjeverna Amerika
territories.CH=\u0160vicarska
territories.CG=Kongo
territories.CF=Srednjoafri\u010dka Republika
@@ -580,13 +396,20 @@ territories.BV=Otok Bouvet
territories.BT=Butan
territories.BS=Bahami
territories.BR=Brazil
+territories.019=Amerike
+territories.018=Ju\u017ena Afrika
territories.NZ=Novi Zeland
territories.BO=Bolivija
+territories.017=Sredi\u0161nja Afrika
territories.BN=Brunei Darussalam
territories.BM=Bermuda
+territories.015=Sjeverna Afrika
+territories.014=Isto\u010dna Afrika
+territories.013=Centralna Amerika
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Zapadna Afrika
territories.BH=Bahrein
territories.NR=Nauru
territories.BG=Bugarska
@@ -604,6 +427,7 @@ territories.NG=Nigerija
territories.NF=Norfol\u0161ki Otoci
territories.AZ=Azerbajd\u017ean
territories.NE=Niger
+territories.AX=Alandski otoci
territories.NC=Nova Kaledonija
territories.AW=Aruba
territories.ZM=Zambija
@@ -612,19 +436,23 @@ territories.AU=Australija
territories.AT=Austrija
territories.AS=Ameri\u010dka Samoa
territories.AR=Argentina
+territories.009=Oceanija
territories.AQ=Antarktik
territories.MZ=Mozambik
territories.AO=Angola
territories.MY=Malezija
territories.AN=Nizozemski Antili
territories.MX=Meksiko
+territories.005=Ju\u017ena Amerika
territories.AM=Armenija
territories.MW=Malavi
territories.AL=Albanija
territories.MV=Maldivi
territories.ZA=Ju\u017ena Afrika
territories.MU=Mauricijus
+territories.002=Afrika
territories.MT=Malta
+territories.001=Svijet
territories.AI=Anguila
territories.MS=Montserat
territories.MR=Mauritanija
@@ -639,7 +467,6 @@ territories.MN=Mongolija
territories.MM=Mijanma
territories.ML=Mali
territories.MK=Makedonija, Republika
-territories.YU=Jugoslavija
territories.YT=Majote
territories.MH=Mar\u0161alovi Otoci
territories.MG=Madagaskar
@@ -649,10 +476,14 @@ territories.MA=Maroko
territories.YE=Jemen
territories.LY=Libijska Arapska D\u017eamahirija
territories.LV=Latvija
+territories.155=Zapadna Europa
territories.LU=Luksemburg
+territories.154=Sjeverna Europa
territories.LT=Litva
territories.LS=Lesoto
territories.LR=Liberija
+territories.151=Isto\u010dna Europa
+territories.150=Europa
territories.LK=\u0160ri Lanka
territories.LI=Lihten\u0161tajn
territories.LC=Sveta Lucija
@@ -661,6 +492,8 @@ territories.LA=Laoska Narodna Demokratska Republika
territories.KZ=Kazakstan
territories.KY=Kajmanski Otoci
territories.KW=Kuvajt
+territories.145=Zapadna Azija
+territories.142=Azija
territories.KR=Koreja, Ju\u017ena
territories.KP=Koreja, Sjeverna
territories.KN=Sveti Kristofor i Nevis
@@ -729,17 +562,17 @@ languages.de=njema\u010dki
languages.pl=poljski
languages.sl=slovenski
languages.sk=slova\u010dki
-languages.da=danski
languages.art=umjetni (ostali)
+languages.da=danski
languages.ga=irski
languages.vi=vijetnamski
languages.ja=japanski
languages.gmh=njema\u010dki, srednji visoki (ca.1050-1500)
languages.sla=slavenski (drugi)
-languages.cy=vel\u0161ki
languages.egy=egipatski (anti\u010dki)
-languages.fy=frizijski
+languages.cy=vel\u0161ki
languages.cel=keltski (ostali)
+languages.fy=frizijski
languages.cu=crkvenoslavenski
languages.cs=\u010de\u0161ki
languages.lv=latvijski
@@ -760,11 +593,11 @@ languages.goh=njema\u010dki, stari visoki (ca.750-1050)
languages.bat=balti\u010dki (ostali)
languages.hy=armenski
languages.ang=engleski, stari (ca.450-1100)
-languages.fro=francuski, stari (842-ca.1400)
languages.et=estonijski
+languages.fro=francuski, stari (842-ca.1400)
languages.hu=ma\u0111arski
-languages.grc=gr\u010dki, anti\u010dki (do 1453)
languages.es=\u0161panjolski
+languages.grc=gr\u010dki, anti\u010dki (do 1453)
languages.frm=francuski, srednji (ca.1400-1600)
languages.hr=hrvatski
languages.eo=esperanto
diff --git a/resource/gnu/java/locale/LocaleInformation_hu.properties b/resource/gnu/java/locale/LocaleInformation_hu.properties
index 6abe64d5e..ded78ef3b 100644
--- a/resource/gnu/java/locale/LocaleInformation_hu.properties
+++ b/resource/gnu/java/locale/LocaleInformation_hu.properties
@@ -8,764 +8,354 @@
decimalSeparator=,
groupingSeparator=\u00a0
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=Jord\u00e1niai d\u00edn\u00e1r
-currenciesDisplayName.BOV=Bol\u00edviai mvdol
-currenciesDisplayName.XAU=Arany
-currenciesDisplayName.FOK=Fer\u00f6er-szigeteki korona
-currenciesDisplayName.LBP=Libanoni font
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Vietn\u00e1mi dong
-currenciesDisplayName.TZS=Tanz\u00e1niai shilling
-currenciesDisplayName.BOP=Bol\u00edviai peso
-currenciesDisplayName.KHR=Kambodzsai riel
-currenciesDisplayName.XAM=Asian Monetary Unit
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Kambodzsai r\u00e9gi riel
-currenciesDisplayName.ZMP=Zambiai font
-currenciesDisplayName.AUP=Ausztr\u00e1l font
-currenciesDisplayName.XAF=CFA frank BEAC
-currenciesDisplayName.MTP=M\u00e1ltai font
-currenciesDisplayName.GHR=Gh\u00e1nai \u00fajra\u00e9rt\u00e9kelt cedi
-currenciesDisplayName.ZMK=Zambiai kwacha
-currenciesDisplayName.XAD=Asian Dinar Unit of Account
-currenciesDisplayName.GHP=Gh\u00e1nai font
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Gh\u00e1nai r\u00e9gi cedi
-currenciesDisplayName.MTL=M\u00e1ltai l\u00edra
-currenciesDisplayName.AUD=Ausztr\u00e1l doll\u00e1r
-currenciesDisplayName.USS=USA doll\u00e1r (aznapi)
-currenciesDisplayName.ITL=Olasz l\u00edra
-currenciesDisplayName.USN=USA doll\u00e1r (k\u00f6vetkez\u0151 napi)
-currenciesDisplayName.GHC=Gh\u00e1nai cedi
-currenciesDisplayName.SGD=Szingap\u00fari doll\u00e1r
-currenciesDisplayName.PAB=Panamai balboa
-currenciesDisplayName.LAK=Laoszi kip
-currenciesDisplayName.KGS=Kirgiziszt\u00e1ni szom
-currenciesDisplayName.CHF=Sv\u00e1jci frank
-currenciesDisplayName.ATS=Osztr\u00e1k schilling
-currenciesDisplayName.USD=USA doll\u00e1r
-currenciesDisplayName.ETD=Eti\u00f3piai doll\u00e1r
-currenciesDisplayName.BND=Brunei doll\u00e1r
-currenciesDisplayName.JMP=Jamaikai font
-currenciesDisplayName.ETB=Eti\u00f3piai birr
-currenciesDisplayName.DZG=Alg\u00e9riai kezdeti frank
-currenciesDisplayName.DZF=Alg\u00e9riai \u00faj frank
-currenciesDisplayName.DZD=Alg\u00e9riai d\u00edn\u00e1r
-currenciesDisplayName.PYG=Paraguayi guarani
-currenciesDisplayName.LYP=L\u00edbiai font
-currenciesDisplayName.JMD=Jamaikai doll\u00e1r
-currenciesDisplayName.ISK=Izlandi korona
-currenciesDisplayName.ESP=Spanyol peseta
-currenciesDisplayName.BMP=Bermudai font
-currenciesDisplayName.LYD=L\u00edbiai d\u00edn\u00e1r
-currenciesDisplayName.LYB=L\u00edbiai brit katonai fennhat\u00f3s\u00e1gi l\u00edra
-currenciesDisplayName.BMD=Bermudai doll\u00e1r
-currenciesDisplayName.NLG=Holland forint
-currenciesDisplayName.MRO=Maurit\u00e1niai ouguiya
-currenciesDisplayName.IRR=Ir\u00e1ni rial
-currenciesDisplayName.SEK=Sv\u00e9d korona
-currenciesDisplayName.ERN=Eritreai nakfa
+currenciesDisplayName.YDD=Jemeni d\u00edn\u00e1r
+currenciesDisplayName.TWD=Tajvani \u00faj doll\u00e1r
currenciesDisplayName.KES=Kenyai shilling
-currenciesDisplayName.CFF=K\u00f6z\u00e9p-afrikai CFA frank
+currenciesDisplayName.BYB=Feh\u00e9rorosz \u00faj rubel (1994-1999)
+currenciesDisplayName.LKR=Sri Lankai r\u00fapia
+currenciesDisplayName.RWF=Ruandai frank
+currenciesDisplayName.TJS=T\u00e1dzsikiszt\u00e1ni somoni
+currenciesDisplayName.SDP=Szud\u00e1ni font
+currenciesDisplayName.TJR=T\u00e1dzsikiszt\u00e1ni rubel
+currenciesDisplayName.ERN=Eritreai nakfa
+currenciesDisplayName.AFN=Afghani
+currenciesDisplayName.GRD=G\u00f6r\u00f6g drachma
+currenciesDisplayName.IEP=\u00cdr font
currenciesDisplayName.ARS=Peso
+currenciesDisplayName.SDD=Szud\u00e1ni d\u00edn\u00e1r
currenciesDisplayName.ARP=Argent\u00edn peso (1983-1985)
-currenciesDisplayName.ARM=Argent\u00edn peso moneda nacional
-currenciesDisplayName.TWD=Tajvani \u00faj doll\u00e1r
-currenciesDisplayName.SDP=Szud\u00e1ni font
currenciesDisplayName.GEL=Gr\u00faz lari
+currenciesDisplayName.AFA=Afghani (1927-2002)
currenciesDisplayName.GEK=Gr\u00faz kupon larit
-currenciesDisplayName.MQF=Martiniquei frank
+currenciesDisplayName.CRC=Costa Ricai colon
currenciesDisplayName.FKP=Falkland-szigeteki font
+currenciesDisplayName.EEK=\u00c9szt korona
+currenciesDisplayName.HKD=Hongkongi doll\u00e1r
+currenciesDisplayName.MDL=Moldov\u00e1n lei
currenciesDisplayName.ARA=Argent\u00edn austral
-currenciesDisplayName.SDD=Szud\u00e1ni d\u00edn\u00e1r
currenciesDisplayName.IQD=Iraki d\u00edn\u00e1r
-currenciesDisplayName.TVD=Tuvalui doll\u00e1r
currenciesDisplayName.SCR=Seychelle-szigeteki r\u00fapia
+currenciesDisplayName.VUV=Vanuatui vatu
+currenciesDisplayName.DKK=D\u00e1n korona
+currenciesDisplayName.KPW=\u00c9szak-koreai won
+currenciesDisplayName.GQE=Egyenl\u00edt\u0151i-guineai ekwele guineana
+currenciesDisplayName.IDR=Indon\u00e9z r\u00fapia
currenciesDisplayName.LVR=Lett rubel
-currenciesDisplayName.FJP=Fidzsi font
+currenciesDisplayName.SOS=Szom\u00e1li shilling
+currenciesDisplayName.AED=EAE dirham
+currenciesDisplayName.BWP=Botswanai pula
currenciesDisplayName.LVL=Lett lats
-currenciesDisplayName.CDL=Kong\u00f3i zaire
-currenciesDisplayName.CDG=Kong\u00f3i k\u00f6zt\u00e1rsas\u00e1gi frank
-currenciesDisplayName.CDF=Kong\u00f3i frank
-currenciesDisplayName.FJD=Fidzsi doll\u00e1r
+currenciesDisplayName.RUR=Orosz rubel (1991-1998)
currenciesDisplayName.NIO=Nikaraguai cordoba oro
+currenciesDisplayName.ADP=Andorrai peseta
+currenciesDisplayName.FJD=Fidzsi doll\u00e1r
currenciesDisplayName.MOP=Macaoi pataca
-currenciesDisplayName.NIG=Nikaraguai arany cordoba
+currenciesDisplayName.RUB=Orosz rubel
+currenciesDisplayName.CDF=Kong\u00f3i frank
currenciesDisplayName.NIC=Nikaraguai cordoba
-currenciesDisplayName.XTR=COMECON Transferable Ruble
-currenciesDisplayName.FIN=Finn markka (1860-1962)
-currenciesDisplayName.FIM=Finn markka
+currenciesDisplayName.DJF=Dzsibuti frank
+currenciesDisplayName.ECV=Ecuadori Unidad de Valor Constante (UVC)
currenciesDisplayName.SBD=Salamon-szigeteki doll\u00e1r
+currenciesDisplayName.UZS=\u00dczbegiszt\u00e1ni szum
+currenciesDisplayName.ECS=Ecuadori sucre
+currenciesDisplayName.PHP=F\u00fcl\u00f6p-szigeteki peso
+currenciesDisplayName.THB=Thai baht
currenciesDisplayName.LUF=Luxemburgi frank
-currenciesDisplayName.TTO=Trinidad \u00e9s tobagoi r\u00e9gi doll\u00e1r
-currenciesDisplayName.AOS=Angolai escudo
-currenciesDisplayName.AOR=Angolai kwanza reajustado (1995-1999)
-currenciesDisplayName.MNT=Mong\u00f3liai tugrik
-currenciesDisplayName.HUF=Magyar forint
-currenciesDisplayName.BIF=Burundi frank
-currenciesDisplayName.AON=Angolai \u00faj kwanza (1990-2000)
-currenciesDisplayName.AOK=Angolai kwanza (1977-1990)
+currenciesDisplayName.FIM=Finn markka
currenciesDisplayName.TTD=Trinidad \u00e9s tobagoi doll\u00e1r
currenciesDisplayName.SZL=Szv\u00e1zif\u00f6ldi lilangeni
-currenciesDisplayName.NHF=\u00daj-hebrid\u00e1ki CFP frank
-currenciesDisplayName.GBP=Brit font sterling
-currenciesDisplayName.SAS=Sza\u00fadi szuver\u00e9n riyal
+currenciesDisplayName.MNT=Mong\u00f3liai tugrik
currenciesDisplayName.SAR=Sza\u00fadi riyal
+currenciesDisplayName.UAK=Ukr\u00e1n karbovanec
+currenciesDisplayName.UAH=Ukr\u00e1n hrivnya
+currenciesDisplayName.HUF=Magyar forint
+currenciesDisplayName.COP=Kolumbiai peso
+currenciesDisplayName.QAR=Katari rial
currenciesDisplayName.LTT=Litv\u00e1niai talonas
currenciesDisplayName.PTE=Portug\u00e1l escudo
-currenciesDisplayName.AOA=Angolai kwanza
-currenciesDisplayName.PTC=Portug\u00e1l conto
+currenciesDisplayName.AOR=Angolai kwanza reajustado (1995-1999)
+currenciesDisplayName.UYU=Uruguay-i peso uruguayo
+currenciesDisplayName.GBP=Brit font sterling
+currenciesDisplayName.BIF=Burundi frank
+currenciesDisplayName.INR=Indiai r\u00fapia
+currenciesDisplayName.ZRZ=Zairei zaire
+currenciesDisplayName.AON=Angolai \u00faj kwanza (1990-2000)
currenciesDisplayName.LTL=Litv\u00e1niai litas
+currenciesDisplayName.XFU=Francia UIC-frank
currenciesDisplayName.KZT=Kazahszt\u00e1ni tenge
-currenciesDisplayName.KZR=Kazahszt\u00e1ni rubel
-currenciesDisplayName.VGD=Brit virgin-szigeteki doll\u00e1r
-currenciesDisplayName.NGP=Nig\u00e9riai font
-currenciesDisplayName.MMX=Mianmari doll\u00e1r konvertibilis valuta
+currenciesDisplayName.MZM=Mozambik metical
+currenciesDisplayName.UYP=Uruguay-i peso (1975-1993)
+currenciesDisplayName.AOK=Angolai kwanza (1977-1990)
+currenciesDisplayName.BUK=Burmai kyat
+currenciesDisplayName.GNS=Guineai syli
+currenciesDisplayName.XFO=Francia arany frank
+currenciesDisplayName.PGK=P\u00e1pua \u00faj-guineai kina
+currenciesDisplayName.SYP=Sz\u00edriai font
+currenciesDisplayName.MZE=Mozambik escudo
+currenciesDisplayName.OMR=Om\u00e1ni rial
currenciesDisplayName.NGN=Nig\u00e9riai naira
+currenciesDisplayName.ZRN=Zairei \u00faj zaire
+currenciesDisplayName.AOA=Angolai kwanza
+currenciesDisplayName.CNY=K\u00ednai j\u00fcan renminbi
+currenciesDisplayName.MAF=Marokk\u00f3i frank
+currenciesDisplayName.GNF=Guineai frank
currenciesDisplayName.HTG=Haiti gourde
-currenciesDisplayName.SYP=Sz\u00edriai font
-currenciesDisplayName.PSP=Palesztin font
-currenciesDisplayName.BHD=Bahreini din\u00e1r
+currenciesDisplayName.MAD=Marokk\u00f3i dirham
+currenciesDisplayName.TRY=\u00daj t\u00f6r\u00f6k l\u00edra
currenciesDisplayName.MMK=Mianmari kyat
+currenciesDisplayName.MYR=Malajziai ringgit
+currenciesDisplayName.LSL=Lesothoi loti
+currenciesDisplayName.XEU=European Currency Unit
+currenciesDisplayName.BHD=Bahreini din\u00e1r
+currenciesDisplayName.SLL=Sierra Leonei leone
+currenciesDisplayName.BTN=Bhut\u00e1ni ngultrum
+currenciesDisplayName.TRL=T\u00f6r\u00f6k l\u00edra
+currenciesDisplayName.KMF=Comorei frank
currenciesDisplayName.ANG=Holland-antilla forint
currenciesDisplayName.CZK=Cseh korona
-currenciesDisplayName.IMP=Man-szigeti font sterling
-currenciesDisplayName.BGX=Bolg\u00e1r leva konvertibilis valuta
-currenciesDisplayName.LSL=Lesothoi loti
-currenciesDisplayName.GAF=Gaboni CFA frank
-currenciesDisplayName.BGO=Bolg\u00e1r leva (1879-1952)
+currenciesDisplayName.AZM=Azerbajdzs\u00e1ni manat
+currenciesDisplayName.KYD=Kajm\u00e1n-szigeteki doll\u00e1r
+currenciesDisplayName.GMD=Gambiai dalasi
currenciesDisplayName.BGN=Bolg\u00e1r \u00faj leva
-currenciesDisplayName.BGM=Bolg\u00e1r szocialista leva
currenciesDisplayName.CAD=Kanadai doll\u00e1r
+currenciesDisplayName.MXV=Mexik\u00f3i Unidad de Inversion (UDI)
currenciesDisplayName.BGL=Bolg\u00e1r kem\u00e9ny leva
-currenciesDisplayName.TRL=T\u00f6r\u00f6k l\u00edra
-currenciesDisplayName.KYD=Kajm\u00e1n-szigeteki doll\u00e1r
-currenciesDisplayName.CYP=Ciprusi font
+currenciesDisplayName.VEB=Venezuelai bol\u00edvar
+currenciesDisplayName.MLF=Mali frank
currenciesDisplayName.ILS=Izraeli \u00faj s\u00e9kel
+currenciesDisplayName.MXP=Mexik\u00f3i ez\u00fcst peso (1861-1992)
+currenciesDisplayName.PES=Perui sol
currenciesDisplayName.GYD=Guyanai doll\u00e1r
-currenciesDisplayName.AMD=Dram
+currenciesDisplayName.MXN=Mexik\u00f3i peso
currenciesDisplayName.ILP=Izraeli font
-currenciesDisplayName.MLF=Mali frank
-currenciesDisplayName.ILL=Izraeli s\u00e9kel
-currenciesDisplayName.VEB=Venezuelai bol\u00edvar
-currenciesDisplayName.ALX=Alb\u00e1n doll\u00e1r konvertibilis valuta
+currenciesDisplayName.SKK=Szlov\u00e1k korona
+currenciesDisplayName.CYP=Ciprusi font
+currenciesDisplayName.XDR=Special Drawing Rights
+currenciesDisplayName.PEN=Perui sol nuevo
currenciesDisplayName.LRD=Lib\u00e9riai doll\u00e1r
-currenciesDisplayName.ALV=Alb\u00e1n lek valuta
+currenciesDisplayName.PEI=Perui inti
+currenciesDisplayName.AMD=Dram
+currenciesDisplayName.BSD=Bahamai doll\u00e1r
currenciesDisplayName.HRK=Horv\u00e1t kuna
-currenciesDisplayName.REF=R\u00e9unioni frank
+currenciesDisplayName.CLP=Chilei peso
currenciesDisplayName.HRD=Horv\u00e1t d\u00edn\u00e1r
-currenciesDisplayName.ALL=Alb\u00e1n lek
-currenciesDisplayName.JEP=Jersey font sterling
-currenciesDisplayName.ALK=Alb\u00e1n lek (1946-1961)
-currenciesDisplayName.MKN=Macedon d\u00edn\u00e1r (1992-1993)
-currenciesDisplayName.VDP=\u00c9szak-vietn\u00e1mi viet minh piastre dong viet
-currenciesDisplayName.VDN=\u00c9szak-vietn\u00e1mi \u00faj dong
-currenciesDisplayName.MKD=Macedon d\u00edn\u00e1r
-currenciesDisplayName.VDD=\u00c9szak-vietn\u00e1mi piastre dong viet
-currenciesDisplayName.TPP=Timori pataca
currenciesDisplayName.XPF=CFP frank
-currenciesDisplayName.BEL=Belga frank (p\u00e9nz\u00fcgyi)
-currenciesDisplayName.GWP=Guinea-Bissaui peso
-currenciesDisplayName.KWD=Kuvaiti d\u00edn\u00e1r
-currenciesDisplayName.GWM=Portug\u00e1l guinea mil reis
-currenciesDisplayName.BEF=Belga frank
+currenciesDisplayName.FRF=Francia frank
+currenciesDisplayName.BRR=Brazil cruzeiro
+currenciesDisplayName.MKD=Macedon d\u00edn\u00e1r
+currenciesDisplayName.CLF=Chilei unidades de fomento
+currenciesDisplayName.ALL=Alb\u00e1n lek
+currenciesDisplayName.BRN=Brazil cruzado novo
+currenciesDisplayName.MWK=Malawi kwacha
+currenciesDisplayName.BRL=Brazil real
currenciesDisplayName.TPE=Timori escudo
-currenciesDisplayName.BEC=Belga frank (konvertibilis)
-currenciesDisplayName.GWE=Portug\u00e1l guinea escudo
+currenciesDisplayName.BRE=Brazil cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Brazi cruzado
+currenciesDisplayName.BRB=Brazi cruzeiro novo (1967-1986)
+currenciesDisplayName.DEM=N\u00e9met m\u00e1rka
+currenciesDisplayName.KWD=Kuvaiti d\u00edn\u00e1r
+currenciesDisplayName.XCD=Kelet-karibi doll\u00e1r
+currenciesDisplayName.NPR=Nep\u00e1li r\u00fapia
+currenciesDisplayName.GWP=Guinea-Bissaui peso
+currenciesDisplayName.YUN=Jugoszl\u00e1v konvertibilis d\u00edn\u00e1r
currenciesDisplayName.SVC=Salvadori col\u00f3n
-currenciesDisplayName.CWG=Curacaoi forint
-currenciesDisplayName.BDT=Bangladesi taka
-currenciesDisplayName.TOS=Tongai font sterling
+currenciesDisplayName.YUM=Jugoszl\u00e1v \u00faj d\u00edn\u00e1r
+currenciesDisplayName.BEL=Belga frank (p\u00e9nz\u00fcgyi)
+currenciesDisplayName.SIT=Szlov\u00e9n tolar
+currenciesDisplayName.JPY=Jap\u00e1n jen
currenciesDisplayName.XOF=CFA frank BCEAO
+currenciesDisplayName.MVR=Mald\u00edv-szigeteki rufiyaa
+currenciesDisplayName.GWE=Portug\u00e1l guinea escudo
+currenciesDisplayName.BEF=Belga frank
+currenciesDisplayName.YUD=Jugoszl\u00e1v kem\u00e9ny d\u00edn\u00e1r
+currenciesDisplayName.BEC=Belga frank (konvertibilis)
currenciesDisplayName.SUR=Szovjet rubel
-currenciesDisplayName.SUN=Szovjet \u00faj rubel
-currenciesDisplayName.NCF=\u00daj-kaled\u00f3niai frank kezdeti
-currenciesDisplayName.CVE=Cape Verdei escudo
-currenciesDisplayName.XNF=French Antilles CFA Franc
+currenciesDisplayName.ROL=Rom\u00e1n lej
+currenciesDisplayName.DDM=Kelet-N\u00e9met m\u00e1rka
+currenciesDisplayName.BDT=Bangladesi taka
+currenciesDisplayName.XBD=European Unit of Account (XBD)
+currenciesDisplayName.AWG=Arubai forint
+currenciesDisplayName.XBC=European Unit of Account (XBC)
+currenciesDisplayName.XBB=European Monetary Unit
+currenciesDisplayName.XBA=European Composite Unit
+currenciesDisplayName.NOK=Norv\u00e9g korona
+currenciesDisplayName.MUR=Mauritiusi r\u00fapia
currenciesDisplayName.ZAR=D\u00e9l-afrikai rand
-currenciesDisplayName.DOP=Dominikai peso
-currenciesDisplayName.CUX=Kubai konvertibilis valuta
-currenciesDisplayName.ZAP=D\u00e9l-afrikai font
+currenciesDisplayName.SHP=Saint Helena font
+currenciesDisplayName.XAU=Arany
currenciesDisplayName.ZAL=D\u00e9l-afrikai rand (p\u00e9nz\u00fcgyi)
+currenciesDisplayName.VND=Vietn\u00e1mi dong
+currenciesDisplayName.TZS=Tanz\u00e1niai shilling
+currenciesDisplayName.GIP=Gibralt\u00e1ri font
currenciesDisplayName.TND=Tun\u00e9ziai d\u00edn\u00e1r
-currenciesDisplayName.CUP=Kubai peso
-currenciesDisplayName.GUF=Francia Guyanai frank guiana
+currenciesDisplayName.CVE=Cape Verdei escudo
currenciesDisplayName.UGX=Ugandai shilling
-currenciesDisplayName.LNR=Ceyloni r\u00fapia
-currenciesDisplayName.AIF=Affars and Issas Franc
-currenciesDisplayName.VAL=Vatik\u00e1ni l\u00edra
-currenciesDisplayName.STE=Sao tome-i \u00e9s principe-i escudo
+currenciesDisplayName.ZMK=Zambiai kwacha
+currenciesDisplayName.JOD=Jord\u00e1niai d\u00edn\u00e1r
+currenciesDisplayName.XAF=CFA frank BEAC
+currenciesDisplayName.LBP=Libanoni font
currenciesDisplayName.UGS=Ugandai shilling (1966-1987)
currenciesDisplayName.STD=Sao tome-i \u00e9s principe-i dobra
-currenciesDisplayName.MHD=Marshall-szigeteki doll\u00e1r
-currenciesDisplayName.NZP=\u00daj-z\u00e9landi font
currenciesDisplayName.WST=Nyugat-szamoai tala
-currenciesDisplayName.WSP=Nyugat-szamoai font
-currenciesDisplayName.HNL=Hodurasi lempira
-currenciesDisplayName.XMF=French Metropolitan Nouveau Franc
+currenciesDisplayName.KHR=Kambodzsai riel
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Dominikai peso
+currenciesDisplayName.BOV=Bol\u00edviai mvdol
+currenciesDisplayName.MTP=M\u00e1ltai font
+currenciesDisplayName.USS=USA doll\u00e1r (aznapi)
+currenciesDisplayName.BOP=Bol\u00edviai peso
+currenciesDisplayName.MTL=M\u00e1ltai l\u00edra
+currenciesDisplayName.CUP=Kubai peso
currenciesDisplayName.TMM=T\u00fcrkmeniszt\u00e1ni manat
-currenciesDisplayName.GTQ=Guatemalai quetzal
+currenciesDisplayName.USN=USA doll\u00e1r (k\u00f6vetkez\u0151 napi)
+currenciesDisplayName.SGD=Szingap\u00fari doll\u00e1r
currenciesDisplayName.NZD=\u00daj-z\u00e9landi doll\u00e1r
-currenciesDisplayName.SSP=Sk\u00f3t font
-currenciesDisplayName.BBD=Barbadosi doll\u00e1r
+currenciesDisplayName.USD=USA doll\u00e1r
+currenciesDisplayName.HNL=Hodurasi lempira
+currenciesDisplayName.BOB=Boliviano
+currenciesDisplayName.ITL=Olasz l\u00edra
+currenciesDisplayName.PAB=Panamai balboa
+currenciesDisplayName.GTQ=Guatemalai quetzal
+currenciesDisplayName.LAK=Laoszi kip
+currenciesDisplayName.GHC=Gh\u00e1nai cedi
+currenciesDisplayName.AUD=Ausztr\u00e1l doll\u00e1r
currenciesDisplayName.NAD=Nam\u00edbiai doll\u00e1r
+currenciesDisplayName.KGS=Kirgiziszt\u00e1ni szom
currenciesDisplayName.MGF=Madagaszk\u00e1ri frank
+currenciesDisplayName.CHF=Sv\u00e1jci frank
+currenciesDisplayName.BBD=Barbadosi doll\u00e1r
currenciesDisplayName.MGA=Madagaszk\u00e1ri ariary
-currenciesDisplayName.EGP=Egyiptomi font
-currenciesDisplayName.BZH=Brit-hondurasi doll\u00e1r
+currenciesDisplayName.PYG=Paraguayi guarani
currenciesDisplayName.PLZ=Lengyel zloty (1950-1995)
-currenciesDisplayName.BAN=Bosznia-hercegovinai \u00faj d\u00edn\u00e1r
-currenciesDisplayName.PLX=Lengyel USA doll\u00e1r konvertibilis valuta
-currenciesDisplayName.BAM=Bozsnia-hercegovinai konvertibilis m\u00e1rka
-currenciesDisplayName.BZD=Belizei doll\u00e1r
-currenciesDisplayName.BAD=Bosznia-hercegovinai d\u00edn\u00e1r
-currenciesDisplayName.PLN=Lengyel zloty
currenciesDisplayName.YER=Jemeni rial
+currenciesDisplayName.ATS=Osztr\u00e1k schilling
+currenciesDisplayName.ETB=Eti\u00f3piai birr
+currenciesDisplayName.BND=Brunei doll\u00e1r
+currenciesDisplayName.JMD=Jamaikai doll\u00e1r
+currenciesDisplayName.EGP=Egyiptomi font
+currenciesDisplayName.PLN=Lengyel zloty
+currenciesDisplayName.DZD=Alg\u00e9riai d\u00edn\u00e1r
+currenciesDisplayName.ISK=Izlandi korona
currenciesDisplayName.SRG=Suriname-i gulden
-currenciesDisplayName.CSK=Csehszlov\u00e1k kem\u00e9ny korona
+currenciesDisplayName.LYD=L\u00edbiai d\u00edn\u00e1r
+currenciesDisplayName.BZD=Belizei doll\u00e1r
+currenciesDisplayName.BAM=Bozsnia-hercegovinai konvertibilis m\u00e1rka
+currenciesDisplayName.ESP=Spanyol peseta
currenciesDisplayName.KRW=D\u00e9l-koreai won
+currenciesDisplayName.NLG=Holland forint
+currenciesDisplayName.MRO=Maurit\u00e1niai ouguiya
+currenciesDisplayName.BAD=Bosznia-hercegovinai d\u00edn\u00e1r
+currenciesDisplayName.ZWD=Zimbabwei doll\u00e1r
+currenciesDisplayName.SEK=Sv\u00e9d korona
+currenciesDisplayName.CSK=Csehszlov\u00e1k kem\u00e9ny korona
currenciesDisplayName.BYR=Feh\u00e9rorosz rubel
-currenciesDisplayName.YEI=Jemeni imadi riyal
-currenciesDisplayName.BYL=Feh\u00e9rorosz rubel (1992-1994)
-currenciesDisplayName.CSC=Csehszlov\u00e1k korona
-currenciesDisplayName.KRO=D\u00e9l-koreai r\u00e9gi won
-currenciesDisplayName.KRH=D\u00e9l-koreai hwan
-currenciesDisplayName.BYB=Feh\u00e9rorosz \u00faj rubel (1994-1999)
-currenciesDisplayName.SQS=Szom\u00e1lf\u00f6ldi shilling
-currenciesDisplayName.GRN=G\u00f6r\u00f6g \u00faj drachma
+currenciesDisplayName.IRR=Ir\u00e1ni rial
currenciesDisplayName.PKR=Pakiszt\u00e1ni r\u00fapia
-currenciesDisplayName.AFN=Afghani
-currenciesDisplayName.ZWD=Zimbabwei doll\u00e1r
-currenciesDisplayName.LKR=Sri Lankai r\u00fapia
-currenciesDisplayName.GRD=G\u00f6r\u00f6g drachma
-currenciesDisplayName.IEP=\u00cdr font
-currenciesDisplayName.AFA=Afghani (1927-2002)
-currenciesDisplayName.YDD=Jemeni d\u00edn\u00e1r
-currenciesDisplayName.RWF=Ruandai frank
-currenciesDisplayName.CRC=Costa Ricai colon
-currenciesDisplayName.TJS=T\u00e1dzsikiszt\u00e1ni somoni
-currenciesDisplayName.TJR=T\u00e1dzsikiszt\u00e1ni rubel
-currenciesDisplayName.EEK=\u00c9szt korona
-currenciesDisplayName.GQP=Egyenl\u00edt\u0151i-guineai peseta guineana
-currenciesDisplayName.MDR=Moldov\u00e1n rubel kupon
-currenciesDisplayName.HKD=Hongkongi doll\u00e1r
-currenciesDisplayName.DKK=D\u00e1n korona
-currenciesDisplayName.MDL=Moldov\u00e1n lei
-currenciesDisplayName.GQF=Egyenl\u00edt\u0151i-guineai franco
-currenciesDisplayName.GQE=Egyenl\u00edt\u0151i-guineai ekwele guineana
-currenciesDisplayName.IDR=Indon\u00e9z r\u00fapia
-currenciesDisplayName.AED=EAE dirham
-currenciesDisplayName.KPW=\u00c9szak-koreai won
-currenciesDisplayName.IDN=Indon\u00e9z \u00faj r\u00fapia
-currenciesDisplayName.BWP=Botswanai pula
-currenciesDisplayName.MDC=Moldov\u00e1n lei kupon
-currenciesDisplayName.IDJ=Indon\u00e9z j\u00e1va r\u00fapia
-currenciesDisplayName.KPP=\u00c9szak-koreai n\u00e9pi won
-currenciesDisplayName.IDG=Indon\u00e9z nica guilder
-currenciesDisplayName.VUV=Vanuatui vatu
-currenciesDisplayName.XID=Iszl\u00e1m d\u00edn\u00e1r
-currenciesDisplayName.SOS=Szom\u00e1li shilling
-currenciesDisplayName.ADP=Andorrai peseta
-currenciesDisplayName.RUR=Orosz rubel (1991-1998)
-currenciesDisplayName.GPF=Guadeloupei frank
-currenciesDisplayName.DJF=Dzsibuti frank
-currenciesDisplayName.ADD=Andorrai d\u00edn\u00e1r
-currenciesDisplayName.MCG=Monacoi frank kezdeti
-currenciesDisplayName.MCF=Monacoi frank \u00faj
-currenciesDisplayName.ECV=Ecuadori Unidad de Valor Constante (UVC)
-currenciesDisplayName.ECS=Ecuadori sucre
-currenciesDisplayName.LIF=Liechtensteini frank
-currenciesDisplayName.RUB=Orosz rubel
-currenciesDisplayName.PHP=F\u00fcl\u00f6p-szigeteki peso
-currenciesDisplayName.UZS=\u00dczbegiszt\u00e1ni szum
-currenciesDisplayName.COP=Kolumbiai peso
-currenciesDisplayName.THB=Thai baht
-currenciesDisplayName.IBP=\u00c9szak\u00edr font
-currenciesDisplayName.BUR=Burmai r\u00fapia
-currenciesDisplayName.COF=Kong\u00f3i CFA frank
-currenciesDisplayName.BUK=Burmai kyat
-currenciesDisplayName.COB=Kolumbiai pap\u00edr peso
-currenciesDisplayName.UZC=\u00dczbegiszt\u00e1ni kupon som
-currenciesDisplayName.UAK=Ukr\u00e1n karbovanec
-currenciesDisplayName.QAR=Katari rial
-currenciesDisplayName.UAH=Ukr\u00e1n hrivnya
-currenciesDisplayName.GNS=Guineai syli
-currenciesDisplayName.CNY=K\u00ednai j\u00fcan renminbi
-currenciesDisplayName.MZM=Mozambik metical
-currenciesDisplayName.CNX=K\u00ednai USA doll\u00e1r konvertibilis valuta
-currenciesDisplayName.UYU=Uruguay-i peso uruguayo
-currenciesDisplayName.GNI=Guineai frank (1960-1972)
-currenciesDisplayName.SML=San Marinoi l\u00edra
-currenciesDisplayName.CNP=K\u00ednai jen min piao j\u00fcan
-currenciesDisplayName.MZE=Mozambik escudo
-currenciesDisplayName.GNF=Guineai frank
-currenciesDisplayName.OMS=Om\u00e1ni rial saidi
-currenciesDisplayName.PGK=P\u00e1pua \u00faj-guineai kina
-currenciesDisplayName.OMR=Om\u00e1ni rial
-currenciesDisplayName.UYP=Uruguay-i peso (1975-1993)
-currenciesDisplayName.XFU=Francia UIC-frank
-currenciesDisplayName.BTR=Bhut\u00e1ni r\u00fapia
-currenciesDisplayName.ZRZ=Zairei zaire
-currenciesDisplayName.MAF=Marokk\u00f3i frank
-currenciesDisplayName.MAD=Marokk\u00f3i dirham
-currenciesDisplayName.BTN=Bhut\u00e1ni ngultrum
-currenciesDisplayName.XFO=Francia arany frank
-currenciesDisplayName.UYF=Uruguay-i peso fuerte
-currenciesDisplayName.MYR=Malajziai ringgit
-currenciesDisplayName.ZRN=Zairei \u00faj zaire
-currenciesDisplayName.AZM=Azerbajdzs\u00e1ni manat
-currenciesDisplayName.GMP=Gambiai font
-currenciesDisplayName.KMF=Comorei frank
-currenciesDisplayName.SLL=Sierra Leonei leone
-currenciesDisplayName.GMD=Gambiai dalasi
-currenciesDisplayName.XEU=European Currency Unit
-currenciesDisplayName.BSP=Bahamai font
-currenciesDisplayName.CMF=Cameruni CFA frank
-currenciesDisplayName.MXV=Mexik\u00f3i Unidad de Inversion (UDI)
-currenciesDisplayName.XEF=CFA frank BCEAEC
-currenciesDisplayName.BSD=Bahamai doll\u00e1r
-currenciesDisplayName.MXP=Mexik\u00f3i ez\u00fcst peso (1861-1992)
-currenciesDisplayName.MXN=Mexik\u00f3i peso
-currenciesDisplayName.PES=Perui sol
-currenciesDisplayName.GLK=Gr\u00f6nlandi korona
-currenciesDisplayName.BRZ=Brazil cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Perui sol nuevo
-currenciesDisplayName.CLP=Chilei peso
-currenciesDisplayName.SKK=Szlov\u00e1k korona
-currenciesDisplayName.PEI=Perui inti
-currenciesDisplayName.BRR=Brazil cruzeiro
-currenciesDisplayName.XDR=Special Drawing Rights
-currenciesDisplayName.FRG=Francia frank kezdeti/Frank poincare
-currenciesDisplayName.FRF=Francia frank
-currenciesDisplayName.BRN=Brazil cruzado novo
-currenciesDisplayName.CLF=Chilei unidades de fomento
-currenciesDisplayName.CLE=Chilei escudo
-currenciesDisplayName.BRL=Brazil real
-currenciesDisplayName.CLC=Chilei condor
-currenciesDisplayName.BRE=Brazil cruzeiro (1990-1993)
-currenciesDisplayName.DES=German Sperrmark
-currenciesDisplayName.MWP=Malawi font
-currenciesDisplayName.BRC=Brazi cruzado
-currenciesDisplayName.BRB=Brazi cruzeiro novo (1967-1986)
-currenciesDisplayName.MWK=Malawi kwacha
-currenciesDisplayName.PDR=Transzdnyeszteri rubel
-currenciesDisplayName.DEM=N\u00e9met m\u00e1rka
-currenciesDisplayName.TDF=Cs\u00e1di CFA frank
-currenciesDisplayName.PDN=Transzdnyeszteri \u00faj rubel
-currenciesDisplayName.PDK=Transzdnyeszteri rubel kupon
-currenciesDisplayName.NPR=Nep\u00e1li r\u00fapia
-currenciesDisplayName.CKD=Cook-szigeteki doll\u00e1r
-currenciesDisplayName.JPY=Jap\u00e1n jen
-currenciesDisplayName.MVR=Mald\u00edv-szigeteki rufiyaa
-currenciesDisplayName.XCF=CFA \u00faj frank
-currenciesDisplayName.MVP=Mald\u00edv-szigeteki r\u00fapia
-currenciesDisplayName.XCD=Kelet-karibi doll\u00e1r
-currenciesDisplayName.SIT=Szlov\u00e9n tolar
-currenciesDisplayName.YUR=Jugoszl\u00e1v reform d\u00edn\u00e1r
-currenciesDisplayName.AWG=Arubai forint
-currenciesDisplayName.YUO=Jugoszl\u00e1v okt\u00f3beri d\u00edn\u00e1r
-currenciesDisplayName.DDM=Kelet-N\u00e9met m\u00e1rka
-currenciesDisplayName.YUN=Jugoszl\u00e1v konvertibilis d\u00edn\u00e1r
-currenciesDisplayName.YUM=Jugoszl\u00e1v \u00faj d\u00edn\u00e1r
-currenciesDisplayName.TCC=Turks \u00e9s caicosi korona
-currenciesDisplayName.YUG=Jugoszl\u00e1v 1994-es d\u00edn\u00e1r
-currenciesDisplayName.YUF=Jugoszl\u00e1v sz\u00f6vets\u00e9gi d\u00edn\u00e1r
-currenciesDisplayName.RON=Rom\u00e1n \u00faj lej
-currenciesDisplayName.YUD=Jugoszl\u00e1v kem\u00e9ny d\u00edn\u00e1r
-currenciesDisplayName.ROL=Rom\u00e1n lej
-currenciesDisplayName.SIB=Szlov\u00e9n tolar bons
-currenciesDisplayName.NOK=Norv\u00e9g korona
-currenciesDisplayName.MUR=Mauritiusi r\u00fapia
-currenciesDisplayName.XBD=European Unit of Account (XBD)
-currenciesDisplayName.GIP=Gibralt\u00e1ri font
-currenciesDisplayName.VNS=Vietn\u00e1mi nemzeti dong
-currenciesDisplayName.XBC=European Unit of Account (XBC)
-currenciesDisplayName.VNR=Vietn\u00e1mi k\u00f6zt\u00e1rsas\u00e1gi dong
-currenciesDisplayName.XBB=European Monetary Unit
-currenciesDisplayName.XBA=European Composite Unit
-currenciesDisplayName.KID=Kiribati doll\u00e1r
-currenciesDisplayName.SHP=Saint Helena font
-currenciesDisplayName.VNN=Vietn\u00e1mi \u00faj dong
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Bermudai doll\u00e1r
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
currenciesSymbol.GNF=GF
-currenciesSymbol.OMS=OMS
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=jan.®febr.®m\u00e1rc.®\u00e1pr.®m\u00e1j.®j\u00fan.®j\u00fal.®aug.®szept.®okt.®nov.®dec.®®
months=janu\u00e1r®febru\u00e1r®m\u00e1rcius®\u00e1prilis®m\u00e1jus®j\u00fanius®j\u00falius®augusztus®szeptember®okt\u00f3ber®november®december®®
shortWeekdays=®V®H®K®Sze®Cs®P®Szo®
weekdays=®vas\u00e1rnap®h\u00e9tf\u0151®kedd®szerda®cs\u00fct\u00f6rt\u00f6k®p\u00e9ntek®szombat®
firstDayOfWeek=mon
-eras=i.e.®i.u.®
+eras=i. e.®i. sz.®
ampms=DE®DU®
shortDateFormat=yyyy.MM.dd.
mediumDateFormat=yyyy.MM.dd.
@@ -775,6 +365,7 @@ shortTimeFormat=H:mm
mediumTimeFormat=H:mm:ss
longTimeFormat=H:mm:ss z
fullTimeFormat=H:mm:ss z
+zoneStrings=Europe/Paris®k\u00f6z\u00e9p-eur\u00f3pai id\u0151®k\u00f6z\u00e9p-eur\u00f3pai ny\u00e1ri id\u0151®©
territories.TL=Kelet-Timor
territories.TK=Tokelau
territories.TJ=Tadzsikiszt\u00e1n
@@ -797,7 +388,9 @@ territories.GN=Guinea
territories.GM=Gambia
territories.GL=Gr\u00f6nland
territories.SV=El Salvador
+territories.062=D\u00e9lk\u00f6z\u00e9p-\u00c1zsia
territories.ST=Saint Tome \u00e9s Principe
+territories.061=Polin\u00e9zia
territories.GI=Gibralt\u00e1r
territories.GH=Ghana
territories.SR=Suriname
@@ -821,9 +414,12 @@ territories.SC=Seychelles
territories.SB=Salamon-szigetek
territories.SA=Szaud-Ar\u00e1bia
territories.FR=Franciaorsz\u00e1g
+territories.057=Mikron\u00e9zia
territories.FO=Fer\u00f6er-szigetek
territories.FM=Mikron\u00e9zia, Sz\u00f6vets\u00e9gi \u00c1llamok
territories.RW=Ruanda
+territories.054=Melan\u00e9zia
+territories.053=Ausztr\u00e1lia \u00e9s \u00daj-Z\u00e9land
territories.FK=Falkland-szigetek
territories.RU=Orosz K\u00f6zt\u00e1rsas\u00e1g
territories.FJ=Fidzsi
@@ -833,20 +429,26 @@ territories.RE=Reunion (francia)
territories.ET=Eti\u00f3pia
territories.ES=Spanyolorsz\u00e1g
territories.ER=Eritrea
+territories.833=Man-sziget
territories.EH=Nyugat Szahara
territories.EG=Egyiptom
+territories.830=Csatorna-szigetek
territories.EE=\u00c9sztorsz\u00e1g
+territories.QO=K\u00fcls\u0151-\u00d3ce\u00e1nia
territories.EC=Ecuador
territories.DZ=Alg\u00e9ria
territories.QA=Katar
+territories.039=D\u00e9l-Eur\u00f3pa
territories.DO=Dominikai K\u00f6zt\u00e1rsas\u00e1g
territories.PY=Paraguay
+territories.035=D\u00e9lkelet-\u00c1zsia
territories.DM=Dominika
territories.PW=Palau
territories.DK=D\u00e1nia
territories.DJ=Dzsibuti
territories.PT=Portug\u00e1lia
territories.PS=Paleszt\u00edn Ter\u00fclet
+territories.030=Kelet-\u00c1zsia
territories.PR=Puerto Rico
territories.DE=N\u00e9metorsz\u00e1g
territories.PN=Pitcairn-sziget
@@ -863,13 +465,16 @@ territories.CX=Kar\u00e1csony-szigetek
territories.CV=Z\u00f6ld-foki K\u00f6zt\u00e1rsas\u00e1g
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Serbia \u00e9s Montenegro
territories.CR=Costa Rica
+territories.029=Karib-tenger
territories.CO=Kolumbia
territories.CN=K\u00edna
territories.CM=Kamerun
territories.CL=Chile
territories.CK=Cook-szigetek
territories.CI=Elef\u00e1ntcsontpart
+territories.021=\u00c9szak-Amerika
territories.CH=Sv\u00e1jc
territories.CG=Kong\u00f3
territories.CF=K\u00f6z\u00e9p-afrikai K\u00f6zt\u00e1rsas\u00e1g
@@ -884,13 +489,20 @@ territories.BV=Bouvet-sziget
territories.BT=Bhut\u00e1n
territories.BS=Baham\u00e1k
territories.BR=Braz\u00edlia
+territories.019=Amerika
+territories.018=D\u00e9l-Afrika
territories.NZ=\u00daj-Z\u00e9land
territories.BO=Bol\u00edvia
+territories.017=K\u00f6z\u00e9p-Afrika
territories.BN=Brunei Darussalam
territories.BM=Bermuda
+territories.015=\u00c9szak-Afrika
+territories.014=Kelet-Afrika
+territories.013=K\u00f6z\u00e9p-Amerika
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Nyugat-Afrika
territories.BH=Bahrain
territories.NR=Nauru
territories.BG=Bulg\u00e1ria
@@ -908,6 +520,7 @@ territories.NG=Nig\u00e9ria
territories.NF=Norfolk-sziget
territories.AZ=Azerbajdzs\u00e1n
territories.NE=Niger
+territories.AX=Aland-szigetek
territories.NC=\u00daj Kaled\u00f3nia (francia)
territories.AW=Aruba
territories.ZM=Zambia
@@ -916,19 +529,23 @@ territories.AU=Ausztr\u00e1lia
territories.AT=Ausztria
territories.AS=Amerikai Szamoa
territories.AR=Argent\u00edna
+territories.009=\u00d3ce\u00e1nia
territories.AQ=Antarktisz
territories.MZ=Mozambik
territories.AO=Angola
territories.MY=Malajzia
territories.AN=Holland Antill\u00e1k
territories.MX=Mexik\u00f3
+territories.005=D\u00e9l-Amerika
territories.AM=\u00d6rm\u00e9nyorsz\u00e1g
territories.MW=Malawi
territories.AL=Alb\u00e1nia
territories.MV=Mald\u00edv-szigetek
territories.ZA=D\u00e9l-Afrika
territories.MU=Mauritius
+territories.002=Afrika
territories.MT=M\u00e1lta
+territories.001=Vil\u00e1g
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Maurit\u00e1nia
@@ -943,7 +560,6 @@ territories.MN=Mong\u00f3lia
territories.MM=Mianmar
territories.ML=Mali
territories.MK=Maced\u00f3nia, K\u00f6zt\u00e1rsas\u00e1g
-territories.YU=Jugoszl\u00e1via
territories.YT=Mayotte
territories.MH=Marshall-szigetek
territories.MG=Madagaszk\u00e1r
@@ -953,10 +569,14 @@ territories.MA=Marokk\u00f3
territories.YE=Jemen
territories.LY=L\u00edbiai Arab Jamahiriya
territories.LV=Lettorsz\u00e1g
+territories.155=Nyugat-Eur\u00f3pa
territories.LU=Luxemburg
+territories.154=\u00c9szak-Eur\u00f3pa
territories.LT=Litv\u00e1nia
territories.LS=Lesotho
territories.LR=Lib\u00e9ria
+territories.151=Kelet-Eur\u00f3pa
+territories.150=Eur\u00f3pa
territories.LK=Sri Lanka
territories.LI=Liechtenstein
territories.LC=Saint Lucia
@@ -965,6 +585,8 @@ territories.LA=Laoszi N\u00e9pi Demokratikus K\u00f6zt\u00e1rsas\u00e1g
territories.KZ=Kazahszt\u00e1n
territories.KY=Kajm\u00e1n-szigetek
territories.KW=Kuwait
+territories.145=Nyugat-\u00c1zsia
+territories.142=\u00c1zsia
territories.KR=Korea, D\u00e9l
territories.KP=Korea, \u00c9szak
territories.KN=Saint Kitts \u00e9s Nevis
@@ -1017,8 +639,8 @@ territories.TM=T\u00fcrkmeniszt\u00e1n
languages.es=spanyol
languages.ku=kurd
languages.eo=eszperant\u00f3
-languages.ks=kasm\u00edri
languages.en=angol
+languages.ks=kasm\u00edri
languages.el=g\u00f6r\u00f6g
languages.qu=kecsua
languages.ko=koreai
@@ -1042,8 +664,8 @@ languages.cy=walesi
languages.pa=pandzs\u00e1bi
languages.cs=cseh
languages.iu=inuktitut
-languages.it=olasz
languages.co=korzikai
+languages.it=olasz
languages.is=izlandi
languages.uz=\u00fczb\u00e9g
languages.or=orija
@@ -1119,8 +741,8 @@ languages.mk=maced\u00f3n
languages.aa=afar
languages.so=szom\u00e1li
languages.sn=sona
-languages.mi=maori
languages.gd=sk\u00f3t (gael)
+languages.mi=maori
languages.sm=szamoai
languages.sl=szlov\u00e9n
languages.mg=madagaszk\u00e1ri
@@ -1136,14 +758,14 @@ languages.fy=fr\u00edz
languages.sa=szanszkrit
languages.fr=francia
languages.lv=lett
-languages.lt=litv\u00e1n
languages.fo=fer\u00f6eri
+languages.lt=litv\u00e1n
languages.rw=kiruanda
languages.ru=orosz
-languages.lo=laoszi
languages.fj=fidzsi
-languages.ln=lingala
+languages.lo=laoszi
languages.fi=finn
+languages.ln=lingala
languages.ro=rom\u00e1n
languages.rn=kirundi
languages.rm=r\u00e9torom\u00e1n
@@ -1151,5 +773,5 @@ languages.fa=perzsa
languages.la=latin
languages.xh=hosza
languages.eu=baszk
-languages.ky=kirgiz
languages.et=\u00e9szt
+languages.ky=kirgiz
diff --git a/resource/gnu/java/locale/LocaleInformation_hy.properties b/resource/gnu/java/locale/LocaleInformation_hy.properties
index 72f157665..6d6a3cc2e 100644
--- a/resource/gnu/java/locale/LocaleInformation_hy.properties
+++ b/resource/gnu/java/locale/LocaleInformation_hy.properties
@@ -82,11 +82,12 @@ territories.PK=\u054a\u0561\u056f\u056b\u057d\u057f\u0561\u0576
territories.PH=\u0556\u056b\u056c\u056b\u057a\u056b\u0576\u0576\u0565\u0580
territories.PG=\u054a\u0561\u057a\u0578\u0582\u0561 \u0546\u0578\u0580 \u0533\u057e\u056b\u0576\u0565\u0561
territories.CZ=\u0549\u0565\u056d\u056b\u0561\u0575\u056b \u0540\u0561\u0576\u0580\u0561\u057a\u0565\u057f\u0578\u0582\u0569\u0575\u0578\u0582\u0576
-territories.PE=\u054a\u0565\u0580\u0578\u0582
territories.CY=\u053f\u056b\u057a\u0580\u0578\u057d
+territories.PE=\u054a\u0565\u0580\u0578\u0582
territories.CV=\u053f\u0561\u0562\u0578-\u054e\u0565\u0580\u0564\u0565
-territories.PA=\u054a\u0561\u0576\u0561\u0574\u0561
territories.CU=\u053f\u0578\u0582\u0562\u0561
+territories.PA=\u054a\u0561\u0576\u0561\u0574\u0561
+territories.CS=\u054d\u0565\u0580\u0562\u056b\u0561
territories.CR=\u053f\u0578\u057d\u057f\u0561-\u054c\u056b\u056f\u0561
territories.CO=\u053f\u0578\u056c\u0578\u0582\u0574\u0562\u056b\u0561
territories.CN=\u0549\u056b\u0576\u0561\u057d\u057f\u0561\u0576
@@ -104,45 +105,45 @@ territories.BW=\u0532\u0578\u057f\u057d\u057e\u0561\u0576\u0561
territories.BT=\u0532\u0578\u0582\u057f\u0561\u0576
territories.BS=\u0532\u0561\u0570\u0561\u0574\u0576\u0565\u0580
territories.BR=\u0532\u0580\u0561\u0566\u056b\u056c\u056b\u0561
-territories.NZ=\u0546\u0578\u0580 \u0536\u0565\u056c\u0561\u0576\u0564\u056b\u0561
territories.BO=\u0532\u0578\u056c\u056b\u057e\u056b\u0561
+territories.NZ=\u0546\u0578\u0580 \u0536\u0565\u056c\u0561\u0576\u0564\u056b\u0561
territories.BN=\u0532\u0580\u0578\u0582\u0576\u0565\u0575
territories.BJ=\u0532\u0565\u0576\u056b\u0576
territories.BI=\u0532\u0578\u0582\u0580\u0578\u0582\u0576\u0564\u056b
territories.BH=\u0532\u0561\u0570\u0580\u0565\u0575\u0576
-territories.NR=\u0546\u0561\u0578\u0582\u0580\u0578\u0582
territories.BG=\u0532\u0578\u0582\u056c\u0572\u0561\u0580\u056b\u0561
+territories.NR=\u0546\u0561\u0578\u0582\u0580\u0578\u0582
territories.BF=\u0532\u0578\u0582\u0580\u056f\u056b\u0576\u0561 \u0556\u0561\u057d\u0578
-territories.NP=\u0546\u0565\u057a\u0561\u056c
territories.BE=\u0532\u0565\u056c\u0563\u056b\u0561
-territories.NO=\u0546\u0578\u0580\u057e\u0565\u0563\u056b\u0561
+territories.NP=\u0546\u0565\u057a\u0561\u056c
territories.BD=\u0532\u0561\u0576\u0563\u056c\u0561\u0564\u0565\u0577
+territories.NO=\u0546\u0578\u0580\u057e\u0565\u0563\u056b\u0561
territories.BB=\u0532\u0561\u0580\u0562\u0561\u0564\u0578\u057d
territories.ZW=\u0536\u056b\u0574\u0562\u0561\u0562\u057e\u0565
-territories.NL=\u0546\u056b\u0564\u0565\u0580\u056c\u0561\u0576\u0564\u0565\u0580
territories.BA=\u0532\u0578\u057d\u0576\u056b\u0561-\u0540\u0565\u0580\u0581\u0565\u0563\u0578\u057e\u056b\u0576\u0561
+territories.NL=\u0546\u056b\u0564\u0565\u0580\u056c\u0561\u0576\u0564\u0565\u0580
territories.NI=\u0546\u056b\u056f\u0561\u0580\u0561\u0563\u0578\u0582\u0561
territories.NG=\u0546\u056b\u0563\u0565\u0580\u056b\u0561
territories.AZ=\u0531\u0564\u0580\u0562\u0565\u057b\u0561\u0576
territories.NE=\u0546\u056b\u0563\u0565\u0580
territories.ZM=\u0536\u0561\u0574\u0562\u056b\u0561
-territories.AU=\u0531\u057e\u057d\u057f\u0580\u0561\u056c\u056b\u0561
territories.NA=\u0546\u0561\u0574\u056b\u0562\u056b\u0561
+territories.AU=\u0531\u057e\u057d\u057f\u0580\u0561\u056c\u056b\u0561
territories.AT=\u0531\u057e\u057d\u057f\u0580\u056b\u0561
territories.AR=\u0531\u0580\u0563\u0565\u0576\u057f\u056b\u0576\u0561
-territories.MZ=\u0544\u0578\u0566\u0561\u0574\u0562\u056b\u056f
territories.AO=\u0531\u0576\u0563\u0578\u056c\u0561
+territories.MZ=\u0544\u0578\u0566\u0561\u0574\u0562\u056b\u056f
territories.MY=\u0544\u0561\u056c\u0561\u0575\u0566\u056b\u0561
-territories.MX=\u0544\u0565\u0584\u057d\u056b\u056f\u0561
territories.AM=\u0540\u0561\u0575\u0561\u057d\u057f\u0561\u0576\u056b \u0540\u0561\u0576\u0580\u0561\u057a\u0565\u057f\u0578\u0582\u0569\u056b\u0582\u0576
-territories.MW=\u0544\u0561\u056c\u0561\u057e\u056b
+territories.MX=\u0544\u0565\u0584\u057d\u056b\u056f\u0561
territories.AL=\u0531\u056c\u0562\u0561\u0576\u056b\u0561
+territories.MW=\u0544\u0561\u056c\u0561\u057e\u056b
territories.MV=\u0544\u0561\u056c\u0564\u056b\u057e\u0576\u0565\u0580
territories.ZA=\u0540\u0561\u0580\u0561\u057e\u0561\u0575\u056b\u0576 \u0531\u0586\u0580\u056b\u056f\u0561
territories.MU=\u0544\u0561\u057e\u0580\u056b\u057f\u0578\u057d
territories.MT=\u0544\u0561\u056c\u0569\u0561
-territories.MR=\u0544\u0561\u057e\u0580\u056b\u057f\u0561\u0576\u056b\u0561
territories.AG=\u0531\u0576\u057f\u056b\u0563\u0578\u0582\u0561-\u0532\u0561\u0580\u0562\u0578\u0582\u0564\u0561
+territories.MR=\u0544\u0561\u057e\u0580\u056b\u057f\u0561\u0576\u056b\u0561
territories.AF=\u0531\u0586\u0572\u0561\u0576\u057d\u057f\u0561\u0576
territories.AE=\u0544\u056b\u0561\u0581\u0575\u0561\u056c \u0531\u0580\u0561\u0562\u0561\u056f\u0561\u0576 \u0537\u0574\u056b\u0580\u0561\u0569\u0576\u0565\u0580
territories.AD=\u0531\u0576\u0564\u0578\u0580\u0561
@@ -150,7 +151,6 @@ territories.MN=\u0544\u0578\u0576\u0572\u0578\u056c\u056b\u0561
territories.MM=\u0544\u0575\u0561\u0576\u0574\u0561
territories.ML=\u0544\u0561\u056c\u056b
territories.MK=\u0544\u0561\u056f\u0565\u0564\u0578\u0576\u056b\u0561
-territories.YU=\u054d\u0565\u0580\u0562\u056b\u0561
territories.MH=\u0544\u0561\u0580\u0577\u0561\u056c\u0575\u0561\u0576 \u056f\u0572\u0566\u056b\u0576\u0565\u0580
territories.MG=\u0544\u0561\u0564\u0561\u0563\u0561\u057d\u056f\u0561\u0580
territories.MD=\u0544\u0578\u056c\u0564\u0578\u057e\u0561
diff --git a/resource/gnu/java/locale/LocaleInformation_id.properties b/resource/gnu/java/locale/LocaleInformation_id.properties
index 473705ed7..bd017211b 100644
--- a/resource/gnu/java/locale/LocaleInformation_id.properties
+++ b/resource/gnu/java/locale/LocaleInformation_id.properties
@@ -8,7 +8,6 @@
decimalSeparator=,
groupingSeparator=.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.IDR=IDR
currenciesSymbol.IDR=Rp
shortMonths=Jan®Feb®Mar®Apr®Mei®Jun®Jul®Agu®Sep®Okt®Nov®Des®®
months=Januari®Februari®Maret®April®Mei®Juni®Juli®Agustus®September®Oktober®November®Desember®®
@@ -100,6 +99,7 @@ territories.CX=Pulau Christmas
territories.CV=Tanjung Verde
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Serbia
territories.CR=Kosta Rika
territories.CO=Kolombia
territories.CN=Cina
@@ -168,19 +168,18 @@ territories.MU=Mauritius
territories.MT=Malta
territories.AI=Anguilla
territories.MS=Montserrat
-territories.MR=Mauritania
territories.AG=Antigua dan Barbuda
-territories.MQ=Martinique
+territories.MR=Mauritania
territories.AF=Afghanistan
-territories.MP=Kepualuan Mariana Utara
+territories.MQ=Martinique
territories.AE=Uni Emirat Arab
-territories.MO=Makao S.A.R. Cina
+territories.MP=Kepualuan Mariana Utara
territories.AD=Andora
+territories.MO=Makao S.A.R. Cina
territories.MN=Mongolia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Macedonia
-territories.YU=Yugoslavia
territories.YT=Mayotte
territories.MH=Kepulauan Marshall
territories.MG=Madagaskar
@@ -249,8 +248,8 @@ territories.TR=Turkey
territories.TO=Tonga
territories.TN=Tunisia
territories.TM=Turkmenistan
-languages.ast=Astur
languages.lb=Luxembourg
+languages.ast=Astur
languages.la=Latin
languages.xh=Xhosa
languages.ky=Kirghiz
@@ -271,8 +270,8 @@ languages.grc=Yunani Kuno (sd 1453)
languages.wo=Wolof
languages.art=Buatan (Lainnya)
languages.ka=Georgian
-languages.gem=Jermanik (Lainnya)
languages.arn=Araucan
+languages.gem=Jermanik (Lainnya)
languages.afa=Afro-Asiatik (Lainnya)
languages.jv=Jawa
languages.wa=Walloon
@@ -290,8 +289,8 @@ languages.ik=Inupiaq
languages.ii=Sichuan Yi
languages.ur=Urdu
languages.ig=Igbo
-languages.kos=Kosrae
languages.ie=Interlingue
+languages.kos=Kosrae
languages.id=Bahasa Indonesia
languages.ia=Interlingua
languages.uk=Ukrainian
@@ -313,8 +312,8 @@ languages.tt=Tatar
languages.hi=Hindi
languages.ts=Tsonga
languages.tr=Turkish
-languages.cop=Koptik
languages.he=Ibrani
+languages.cop=Koptik
languages.tn=Tswana
languages.tl=Tagalog
languages.ha=Hausa
@@ -358,23 +357,23 @@ languages.sc=Sardinian
languages.sa=Sanskrit
languages.cau=Kaukasia (Lainnya)
languages.ang=Inggris Kuno (kl.450-1100)
-languages.car=Karib
languages.fr=Perancis
+languages.car=Karib
languages.fo=Faro
languages.rw=Kinyarwanda
languages.gmh=Jerman, Abad Pertengahan (kl.1050-1500)
languages.ru=Russian
languages.fj=Fiji
-languages.cai=India Amerika Tengah (Lainnnya)
languages.fi=Finlandia
+languages.cai=India Amerika Tengah (Lainnnya)
languages.ff=Fulah
languages.ro=Romanian
languages.rn=Rundi
languages.rm=Rhaeto-Romance
languages.fa=Persia
languages.peo=Persia Kuno (kl.600-400 SM.)
-languages.lez=Lezghia
languages.eu=Basque
+languages.lez=Lezghia
languages.et=Estonian
languages.es=Spanyol
languages.eo=Esperanto
@@ -414,8 +413,8 @@ languages.ca=Catalan
languages.oj=Ojibwa
languages.bs=Bosnia
languages.br=Breton
-languages.gil=Gilbert
languages.bo=Tibet
+languages.gil=Gilbert
languages.ny=Nyanja; Chichewa; Chewa
languages.bn=Bengal
languages.bm=Bambara
@@ -465,10 +464,10 @@ languages.mga=Irlandia Abad Pertengahan (900-1200)
languages.yo=Yoruba
languages.egy=Mesir Kuno
languages.yi=Yiddish
-languages.bat=Baltik (Lainnya)
languages.lv=Latvian
-languages.ath=Bahasa-bahasa Athapaska
+languages.bat=Baltik (Lainnya)
languages.lu=Luba-Katanga
+languages.ath=Bahasa-bahasa Athapaska
languages.lt=Lithuania
languages.ban=Balin
languages.lo=Lao
diff --git a/resource/gnu/java/locale/LocaleInformation_is.properties b/resource/gnu/java/locale/LocaleInformation_is.properties
index 1d950b989..c3ca54f41 100644
--- a/resource/gnu/java/locale/LocaleInformation_is.properties
+++ b/resource/gnu/java/locale/LocaleInformation_is.properties
@@ -8,191 +8,133 @@
decimalSeparator=,
groupingSeparator=.
currenciesDisplayName.YDD=Jemenskur denari
-currenciesDisplayName.GRN=Drakma, N\u00fd
currenciesDisplayName.TWD=Ta\u00edvanskur dalur
currenciesDisplayName.LKR=Sr\u00edl\u00f6nsk r\u00fap\u00eda
-currenciesDisplayName.TJS=Tajikistan Somoni
currenciesDisplayName.RWF=Rwandan Franc
-currenciesDisplayName.TJR=Tadsjiksk r\u00fabla
+currenciesDisplayName.TJS=Tajikistan Somoni
currenciesDisplayName.SDP=S\u00fadanskt pund
+currenciesDisplayName.TJR=Tadsjiksk r\u00fabla
currenciesDisplayName.GRD=Drakma
currenciesDisplayName.IEP=\u00cdrskt pund
-currenciesDisplayName.CFF=Mi\u00f0afr\u00edskur franki
currenciesDisplayName.ARS=Argent\u00edskur pesi
-currenciesDisplayName.ARP=Argent\u00edskur pesi (1983-1985)
currenciesDisplayName.SDD=S\u00fadanskur denari
-currenciesDisplayName.ARM=Argent\u00edskur pesi (1899-1970)
+currenciesDisplayName.ARP=Argent\u00edskur pesi (1983-1985)
currenciesDisplayName.FKP=Falklenskt pund
currenciesDisplayName.EEK=Eistnesk kr\u00f3na
-currenciesDisplayName.TVD=T\u00faval\u00faskur dalur
currenciesDisplayName.HKD=Hong Kong-dalur
-currenciesDisplayName.IQD=\u00cdrakskur denari
currenciesDisplayName.ARA=Argentine Austral
+currenciesDisplayName.IQD=\u00cdrakskur denari
currenciesDisplayName.SCR=Seychelles r\u00fap\u00eda
-currenciesDisplayName.XID=\u00cdslamskur denari
currenciesDisplayName.VUV=Vanuatu Vatu
-currenciesDisplayName.KPW=Nor\u00f0urk\u00f3reskt vonn
currenciesDisplayName.DKK=D\u00f6nsk kr\u00f3na
+currenciesDisplayName.KPW=Nor\u00f0urk\u00f3reskt vonn
currenciesDisplayName.IDR=Ind\u00f3nes\u00edsk r\u00fap\u00eda
currenciesDisplayName.LVR=Lettnesk r\u00fabla
-currenciesDisplayName.KPP=Nor\u00f0urk\u00f3reskt vonn (1947-1959)
currenciesDisplayName.AED=Arab\u00edskt d\u00edrham
currenciesDisplayName.LVL=Lat
currenciesDisplayName.RUR=R\u00fassnesk r\u00fabla
-currenciesDisplayName.FJP=F\u00eddjeyskt pund
-currenciesDisplayName.MOP=Macao Pataca
-currenciesDisplayName.FJD=F\u00eddjeyskur dalur
currenciesDisplayName.ADP=Andorrskur peseti
+currenciesDisplayName.FJD=F\u00eddjeyskur dalur
+currenciesDisplayName.MOP=Macao Pataca
+currenciesDisplayName.RUB=R\u00fassnesk r\u00fabla
currenciesDisplayName.DJF=Djibouti Franc
currenciesDisplayName.SBD=Sal\u00f3monseyskur dalur
-currenciesDisplayName.ADD=Andorrskur denari
-currenciesDisplayName.TTO=Tr\u00ednidad og T\u00f3bag\u00f3-dalur, eldri
currenciesDisplayName.ECS=Ecuador Sucre
currenciesDisplayName.THB=Bat
currenciesDisplayName.LUF=L\u00faxemborgarfranki
currenciesDisplayName.FIM=Finnskt mark
currenciesDisplayName.TTD=Tr\u00ednidad og T\u00f3bag\u00f3-dalur
currenciesDisplayName.MNT=T\u00far\u00edkur
-currenciesDisplayName.UAK=Ukrainian Karbovanetz
currenciesDisplayName.SAR=S\u00e1diarab\u00edskt r\u00edal
+currenciesDisplayName.UAK=Ukrainian Karbovanetz
currenciesDisplayName.UAH=Hrinja
currenciesDisplayName.HUF=F\u00f3rinta
-currenciesDisplayName.IBP=Nor\u00f0ur\u00edrskt pund
currenciesDisplayName.COP=K\u00f3lumb\u00edskur pesi
currenciesDisplayName.LTT=Lithuanian Talonas
-currenciesDisplayName.VGD=J\u00f3mfr\u00faaeyjadalur
currenciesDisplayName.PTE=Port\u00fagalskur sk\u00fati
-currenciesDisplayName.AOS=Ang\u00f3lskur sk\u00fati
currenciesDisplayName.GBP=Sterlingspund
currenciesDisplayName.INR=Indversk r\u00fap\u00eda
-currenciesDisplayName.XFU=Franskur franki, UIC
currenciesDisplayName.LTL=L\u00edt
+currenciesDisplayName.XFU=Franskur franki, UIC
currenciesDisplayName.KZT=Kazakhstan Tenge
-currenciesDisplayName.COF=Mi\u00f0afr\u00edskur franki, Kong\u00f3
-currenciesDisplayName.KZR=Kazakhstan Ruble
-currenciesDisplayName.COB=K\u00f3lumb\u00edskur papp\u00edrspesi
currenciesDisplayName.BUK=B\u00farmverskt kjat
currenciesDisplayName.XFO=Franskur gullfranki
currenciesDisplayName.SYP=S\u00fdrlenskt pund
-currenciesDisplayName.OMR=\u00d3manskt r\u00edal
-currenciesDisplayName.NGP=N\u00edger\u00edskt pund
currenciesDisplayName.MZE=M\u00f3samb\u00edskur sk\u00fati
-currenciesDisplayName.MMX=Mjanmarskt gjaldeyrissk\u00edrteini \u00ed Bandar\u00edkjad\u00f6lum
+currenciesDisplayName.OMR=\u00d3manskt r\u00edal
currenciesDisplayName.NGN=Nigerian Naira
-currenciesDisplayName.PSP=Palest\u00ednskt pund
currenciesDisplayName.CNY=J\u00faan
-currenciesDisplayName.CNX=K\u00ednverskt gjaldeyrissk\u00edrteini \u00ed Bandar\u00edkjad\u00f6lum
-currenciesDisplayName.GNI=G\u00edneufranki (1960-1972)
currenciesDisplayName.MAF=Marokk\u00f3skur franki
currenciesDisplayName.GNF=G\u00edneufranki
currenciesDisplayName.MAD=Marokk\u00f3skt d\u00edrham
+currenciesDisplayName.TRY=N\u00fd, tyrknesk l\u00edra
currenciesDisplayName.MMK=Mjanmarskt kjat
currenciesDisplayName.MYR=Malaysian Ringgit
currenciesDisplayName.LSL=Lesotho Loti
currenciesDisplayName.TRL=Tyrknesk l\u00edra
currenciesDisplayName.KMF=K\u00f3moreyskur franki
-currenciesDisplayName.GAF=Mi\u00f0afr\u00edskur franki, Gabon
-currenciesDisplayName.CZK=T\u00e9kknesk kr\u00f3na
currenciesDisplayName.ANG=Hollenskt Antillugyllini
-currenciesDisplayName.GMP=Gamb\u00edskt pund
-currenciesDisplayName.BGX=B\u00falgarskt gjaldeyrissk\u00edrteini \u00ed lef
-currenciesDisplayName.XEF=Mi\u00f0afr\u00edskur franki, BCEAEC
+currenciesDisplayName.CZK=T\u00e9kknesk kr\u00f3na
currenciesDisplayName.KYD=Caymaneyskur dalur
-currenciesDisplayName.BGO=Lef (1879-1952)
currenciesDisplayName.BGN=Lef, n\u00fdtt
-currenciesDisplayName.MXV=Mex\u00edk\u00f3skur pesi, UDI
currenciesDisplayName.CAD=Kanad\u00edskur dalur
-currenciesDisplayName.BGM=Lef (1952-1962)
+currenciesDisplayName.MXV=Mex\u00edk\u00f3skur pesi, UDI
currenciesDisplayName.BGL=Lef
currenciesDisplayName.VEB=Venezuelan Bolivar
currenciesDisplayName.MLF=Mal\u00edskur franki
-currenciesDisplayName.MXP=Mex\u00edk\u00f3skur silfurpesi (1861-1992)
currenciesDisplayName.ILS=Sikill
-currenciesDisplayName.BSP=Bahameyskt pund
-currenciesDisplayName.MXN=Mex\u00edk\u00f3skur pesi
+currenciesDisplayName.MXP=Mex\u00edk\u00f3skur silfurpesi (1861-1992)
currenciesDisplayName.GYD=Gv\u00e6janskur dalur
-currenciesDisplayName.CMF=Mi\u00f0afr\u00edskur franki, Kamer\u00fan
+currenciesDisplayName.MXN=Mex\u00edk\u00f3skur pesi
currenciesDisplayName.ILP=\u00cdsraelskt pund
-currenciesDisplayName.CYP=K\u00fdpverskt pund
currenciesDisplayName.SKK=Sl\u00f3vak\u00edsk kr\u00f3na
+currenciesDisplayName.CYP=K\u00fdpverskt pund
currenciesDisplayName.XDR=S\u00e9rst\u00f6k dr\u00e1ttarr\u00e9ttindi
-currenciesDisplayName.ILL=Israeli Sheqel
currenciesDisplayName.LRD=L\u00edber\u00edskur dalur
currenciesDisplayName.AMD=Dramm
currenciesDisplayName.BSD=Bahameyskur dalur
-currenciesDisplayName.GLK=Gr\u00e6nlensk kr\u00f3na
currenciesDisplayName.HRK=K\u00fana
-currenciesDisplayName.MKN=Maked\u00f3nskur denari (1992-1993)
-currenciesDisplayName.ALX=Albanskt gjaldeyrissk\u00edrteini \u00ed Bandar\u00edkjad\u00f6lum
currenciesDisplayName.CLP=Chileskur pesi
-currenciesDisplayName.JEP=Jerseyskt pund
-currenciesDisplayName.ALV=Lek Valute (1992-1993)
currenciesDisplayName.XPF=P\u00f3lines\u00edskur franki
currenciesDisplayName.FRF=Franskur franki
-currenciesDisplayName.MWP=Malav\u00edskt pund
-currenciesDisplayName.TDF=Mi\u00f0afr\u00edskur franki, Tsjad
currenciesDisplayName.MKD=Maked\u00f3nskur denari
-currenciesDisplayName.TPP=Timor Pataca
currenciesDisplayName.CLF=Chilean Unidades de Fomento
-currenciesDisplayName.CLE=Chileskur sk\u00fati
currenciesDisplayName.ALL=Lek
-currenciesDisplayName.ALK=Lek (1946-1961)
currenciesDisplayName.BRL=Brasil\u00edskt r\u00edal
currenciesDisplayName.TPE=T\u00edmorskur sk\u00fati
-currenciesDisplayName.DES=German Sperrmark
-currenciesDisplayName.XCF=Mi\u00f0afr\u00edskur franki, n\u00fdr
currenciesDisplayName.DEM=\u00de\u00fdskt mark
-currenciesDisplayName.XCD=Austur-Kar\u00edbahafsdalur
currenciesDisplayName.KWD=K\u00faveiskur denari
-currenciesDisplayName.YUM=J\u00fag\u00f3slavneskur denari
+currenciesDisplayName.XCD=Austur-Kar\u00edbahafsdalur
currenciesDisplayName.SVC=El Salvador Colon
-currenciesDisplayName.GWM=Portuguese Guinea Mil Reis
+currenciesDisplayName.YUM=J\u00fag\u00f3slavneskur denari
currenciesDisplayName.SIT=Sl\u00f3venskur dalur
currenciesDisplayName.JPY=Jen
currenciesDisplayName.XOF=Mi\u00f0afr\u00edskur franki, BCEAO
-currenciesDisplayName.TOS=Tongverskt sterlingspund
currenciesDisplayName.BEF=Belg\u00edskur franki
currenciesDisplayName.GWE=Port\u00fagalskur, g\u00edneskur sk\u00fati
-currenciesDisplayName.TCC=Turk- og Caicoseysk kr\u00f3na
-currenciesDisplayName.CKD=Cookseyskur dalur
currenciesDisplayName.SUR=Soviet Rouble
currenciesDisplayName.ROL=R\u00famenskt lei
currenciesDisplayName.DDM=Austur\u00fe\u00fdskt mark
currenciesDisplayName.NOK=Norsk kr\u00f3na
-currenciesDisplayName.XNF=Mi\u00f0afr\u00edskur franki, Antillur
currenciesDisplayName.SHP=Helenskt pund
-currenciesDisplayName.ZAP=Su\u00f0urafr\u00edskt pund
currenciesDisplayName.ZAL=Rand (vi\u00f0skipta)
-currenciesDisplayName.KID=K\u00edribat\u00edskur dalur
currenciesDisplayName.TZS=Tanzanian Shilling
currenciesDisplayName.GIP=G\u00edbraltarspund
-currenciesDisplayName.ZMP=Samb\u00edskt pund
currenciesDisplayName.CVE=Gr\u00e6nh\u00f6f\u00f0eyskur sk\u00fati
currenciesDisplayName.ZMK=Zambian Kwacha
currenciesDisplayName.XAF=Mi\u00f0afr\u00edskur franki, BEAC
currenciesDisplayName.LBP=L\u00edbanskt pund
-currenciesDisplayName.STE=Sa\u00f3 T\u00f3me og Prins\u00edpe sk\u00fati
currenciesDisplayName.STD=Sao Tome and Principe Dobra
-currenciesDisplayName.FOK=F\u00e6reysk kr\u00f3na
currenciesDisplayName.DOP=D\u00f3min\u00edskur pesi
currenciesDisplayName.EUR=Euro
currenciesDisplayName.BOV=Bolivian Mvdol
-currenciesDisplayName.CUX=K\u00fabverskt gjaldeyrissk\u00edrteini
-currenciesDisplayName.LNR=Ceylon Rupee
-currenciesDisplayName.WSP=Sam\u00f3skt pund
-currenciesDisplayName.XMF=K\u00f3moreyskur franki, CFA
currenciesDisplayName.MTP=Maltneskt pund
currenciesDisplayName.USS=Bandar\u00edkjadalur (sama dag)
-currenciesDisplayName.MHD=Marshalleyskur dalur
currenciesDisplayName.BOP=B\u00f3liv\u00edskur pesi
-currenciesDisplayName.NZP=N\u00fdsj\u00e1lenskt pund
currenciesDisplayName.CUP=K\u00fabverskur pesi
currenciesDisplayName.MTL=Meltnesk l\u00edra
currenciesDisplayName.TMM=T\u00farkmenskt manat
currenciesDisplayName.USN=Bandar\u00edkjadalur (n\u00e6sta dag)
-currenciesDisplayName.GHP=Ganverskt pund
-currenciesDisplayName.SSP=Skoskt pund
-currenciesDisplayName.AUP=\u00c1stralskt pund
currenciesDisplayName.SGD=Singap\u00farskur dalur
currenciesDisplayName.NZD=N\u00fdsj\u00e1lenskur dalur
currenciesDisplayName.USD=Bandar\u00edkjadalur
@@ -206,261 +148,100 @@ currenciesDisplayName.MGF=Madagaskur franki
currenciesDisplayName.BBD=Barbadoskur dalur
currenciesDisplayName.CHF=Svissneskur franki
currenciesDisplayName.MGA=Madagascar Ariary
-currenciesDisplayName.JMP=Jama\u00edskt pund
currenciesDisplayName.PLZ=Slot
-currenciesDisplayName.PLX=P\u00f3lskt gjaldeyrissk\u00edrteini \u00ed Bandar\u00edkjad\u00f6lum
currenciesDisplayName.YER=Jemenskt r\u00edal
currenciesDisplayName.ATS=Austurr\u00edskur skildingur
-currenciesDisplayName.ETD=E\u00fe\u00ed\u00f3p\u00edskur dalur
-currenciesDisplayName.LYP=L\u00edb\u00edskt pund
currenciesDisplayName.BND=Br\u00faneiskur dalur
-currenciesDisplayName.YEI=Jemenskt r\u00edal (1904-1964)
-currenciesDisplayName.EGP=Egypskt pund
currenciesDisplayName.JMD=Jama\u00edskur dalur
-currenciesDisplayName.ISK=\u00cdslensk kr\u00f3na
+currenciesDisplayName.EGP=Egypskt pund
currenciesDisplayName.SRG=Suriname Guilder
-currenciesDisplayName.BZH=Hond\u00farskur dalur
+currenciesDisplayName.ISK=\u00cdslensk kr\u00f3na
currenciesDisplayName.LYD=L\u00edb\u00edskur denari
currenciesDisplayName.BZD=Bel\u00edskur dalur
currenciesDisplayName.ESP=Sp\u00e6nskur peseti
-currenciesDisplayName.KRW=Su\u00f0urk\u00f3reskt vonn
currenciesDisplayName.NLG=Hollenskt gyllini
+currenciesDisplayName.KRW=Su\u00f0urk\u00f3reskt vonn
currenciesDisplayName.MRO=Mauritania Ouguiya
-currenciesDisplayName.BMP=Berm\u00fadeyskt pund
currenciesDisplayName.ZWD=Simbabveskur dalur
currenciesDisplayName.SEK=S\u00e6nsk kr\u00f3na
-currenciesDisplayName.KRO=Su\u00f0urk\u00f3reskt vonn (1947-1953)
currenciesDisplayName.CSK=T\u00e9kknesk kr\u00f3na, eldri
currenciesDisplayName.IRR=\u00cdranskt r\u00edal
currenciesDisplayName.PKR=Pakist\u00f6nsk r\u00fap\u00eda
currenciesDisplayName.BMD=Berm\u00fadeyskur dalur
-currenciesDisplayName.KRH=South Korean Hwan
-currenciesDisplayName.CSC=T\u00e9kknesk kr\u00f3na (1945-1953)
-currenciesSymbol.YDD=YDD
-currenciesSymbol.GRN=GRN
-currenciesSymbol.TWD=NT$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.TJS=TJS
-currenciesSymbol.RWF=RWF
-currenciesSymbol.TJR=TJR
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.SDD=SDD
-currenciesSymbol.ARM=ARM
-currenciesSymbol.FKP=FKP
-currenciesSymbol.EEK=EEK
-currenciesSymbol.TVD=TVD
-currenciesSymbol.HKD=HK$
-currenciesSymbol.IQD=ID
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SCR=SR
-currenciesSymbol.XID=XID
-currenciesSymbol.VUV=VT
-currenciesSymbol.KPW=KPW
-currenciesSymbol.DKK=DKr
-currenciesSymbol.IDR=Rp
-currenciesSymbol.LVR=LVR
-currenciesSymbol.KPP=KPP
-currenciesSymbol.AED=AED
-currenciesSymbol.LVL=LVL
-currenciesSymbol.RUR=RUR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.MOP=MOP
-currenciesSymbol.FJD=F$
-currenciesSymbol.ADP=ADP
-currenciesSymbol.DJF=DF
-currenciesSymbol.SBD=SI$
-currenciesSymbol.ADD=ADD
-currenciesSymbol.TTO=TTO
-currenciesSymbol.ECS=ECS
-currenciesSymbol.THB=THB
-currenciesSymbol.LUF=LUF
-currenciesSymbol.FIM=FIM
-currenciesSymbol.TTD=TT$
-currenciesSymbol.MNT=Tug
-currenciesSymbol.UAK=UAK
-currenciesSymbol.SAR=SRl
-currenciesSymbol.UAH=UAH
-currenciesSymbol.HUF=Ft
-currenciesSymbol.IBP=IBP
-currenciesSymbol.COP=Col$
-currenciesSymbol.LTT=LTT
-currenciesSymbol.VGD=VGD
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOS=AOS
-currenciesSymbol.INR=INR
-currenciesSymbol.XFU=XFU
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.COF=COF
-currenciesSymbol.KZR=KZR
-currenciesSymbol.COB=COB
-currenciesSymbol.BUK=BUK
-currenciesSymbol.XFO=XFO
-currenciesSymbol.SYP=LS
-currenciesSymbol.OMR=RO
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MZE=MZE
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.PSP=PSP
-currenciesSymbol.CNY=Y
-currenciesSymbol.CNX=CNX
-currenciesSymbol.GNI=GNI
-currenciesSymbol.MAF=MAF
-currenciesSymbol.GNF=GF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.MYR=RM
-currenciesSymbol.LSL=M
-currenciesSymbol.TRL=TL
-currenciesSymbol.KMF=CF
-currenciesSymbol.GAF=GAF
-currenciesSymbol.CZK=CZK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.GMP=GMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.XEF=XEF
-currenciesSymbol.KYD=KYD
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.MXV=MXV
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGM=BGM
currenciesSymbol.BGL=lev
-currenciesSymbol.VEB=Be
-currenciesSymbol.MLF=MLF
-currenciesSymbol.MXP=MXP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.BSP=BSP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.GYD=G$
-currenciesSymbol.CMF=CMF
-currenciesSymbol.ILP=ILP
+currenciesSymbol.XCD=EC$
+currenciesSymbol.LKR=SL Re
currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.SKK=Sk
-currenciesSymbol.XDR=XDR
-currenciesSymbol.ILL=ILL
-currenciesSymbol.LRD=LRD
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
currenciesSymbol.AMD=dram
-currenciesSymbol.BSD=BSD
-currenciesSymbol.GLK=GLK
-currenciesSymbol.HRK=HRK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.ALX=ALX
currenciesSymbol.CLP=Ch$
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALV=ALV
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.FRF=FRF
-currenciesSymbol.MWP=MWP
-currenciesSymbol.TDF=TDF
-currenciesSymbol.MKD=MDen
-currenciesSymbol.TPP=TPP
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.ALL=lek
-currenciesSymbol.ALK=ALK
-currenciesSymbol.BRL=R$
-currenciesSymbol.TPE=TPE
-currenciesSymbol.DES=DES
-currenciesSymbol.XCF=XCF
-currenciesSymbol.DEM=DEM
-currenciesSymbol.XCD=EC$
currenciesSymbol.KWD=KD
-currenciesSymbol.YUM=YUM
-currenciesSymbol.SVC=SVC
-currenciesSymbol.GWM=GWM
-currenciesSymbol.SIT=SIT
-currenciesSymbol.XOF=XOF
-currenciesSymbol.TOS=TOS
-currenciesSymbol.BEF=BF
-currenciesSymbol.GWE=GWE
-currenciesSymbol.TCC=TCC
-currenciesSymbol.CKD=CKD
-currenciesSymbol.SUR=SUR
currenciesSymbol.ROL=leu
-currenciesSymbol.DDM=DDM
-currenciesSymbol.NOK=NKr
-currenciesSymbol.XNF=XNF
-currenciesSymbol.SHP=SHP
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.KID=KID
+currenciesSymbol.IQD=ID
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
currenciesSymbol.TZS=T Sh
-currenciesSymbol.GIP=GIP
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.CVE=CVEsc
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAF=XAF
-currenciesSymbol.LBP=LL
-currenciesSymbol.STE=STE
+currenciesSymbol.SBD=SI$
+currenciesSymbol.NOK=NKr
+currenciesSymbol.BEF=BF
+currenciesSymbol.TTD=TT$
currenciesSymbol.STD=Db
-currenciesSymbol.FOK=FOK
-currenciesSymbol.DOP=RD$
-currenciesSymbol.BOV=BOV
-currenciesSymbol.CUX=CUX
-currenciesSymbol.LNR=LNR
-currenciesSymbol.WSP=WSP
-currenciesSymbol.XMF=XMF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.USS=USS
-currenciesSymbol.MHD=MHD
-currenciesSymbol.BOP=BOP
-currenciesSymbol.NZP=NZP
-currenciesSymbol.CUP=CUP
-currenciesSymbol.MTL=Lm
-currenciesSymbol.TMM=TMM
-currenciesSymbol.USN=USN
-currenciesSymbol.GHP=GHP
-currenciesSymbol.SSP=SSP
-currenciesSymbol.AUP=AUP
+currenciesSymbol.SAR=SRl
+currenciesSymbol.FJD=F$
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.USD=US$
currenciesSymbol.SGD=S$
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.CVE=CVEsc
+currenciesSymbol.YER=YRl
+currenciesSymbol.HUF=Ft
currenciesSymbol.NZD=$NZ
-currenciesSymbol.USD=US$
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
+currenciesSymbol.DOP=RD$
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.PAB=PAB
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
+currenciesSymbol.GNF=GF
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.CNY=Y
+currenciesSymbol.KMF=CF
+currenciesSymbol.SEK=SKr
currenciesSymbol.AUD=$A
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.CHF=SwF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.JMP=JMP
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.PLX=PLX
-currenciesSymbol.YER=YRl
-currenciesSymbol.ATS=ATS
-currenciesSymbol.ETD=ETD
-currenciesSymbol.LYP=LYP
-currenciesSymbol.BND=BND
-currenciesSymbol.YEI=YEI
-currenciesSymbol.EGP=EGP
+currenciesSymbol.LYD=LD
currenciesSymbol.JMD=J$
+currenciesSymbol.SKK=Sk
currenciesSymbol.ISK=kr.
-currenciesSymbol.SRG=Sf
-currenciesSymbol.BZH=BZH
-currenciesSymbol.LYD=LD
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.ESP=ESP
-currenciesSymbol.KRW=KRW
-currenciesSymbol.NLG=NLG
+currenciesSymbol.CHF=SwF
currenciesSymbol.MRO=UM
-currenciesSymbol.BMP=BMP
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.SEK=SKr
-currenciesSymbol.KRO=KRO
-currenciesSymbol.CSK=CSK
-currenciesSymbol.IRR=RI
+currenciesSymbol.BBD=BDS$
currenciesSymbol.PKR=Pra
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.KRH=KRH
-currenciesSymbol.CSC=CSC
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.CAD=Can$
shortMonths=jan®feb®mar®apr®ma\u00ed®j\u00fan®j\u00fal®\u00e1g\u00fa®sep®okt®n\u00f3v®des®®
months=jan\u00faar®febr\u00faar®mars®apr\u00edl®ma\u00ed®j\u00fan\u00ed®j\u00fal\u00ed®\u00e1g\u00fast®september®okt\u00f3ber®n\u00f3vember®desember®®
shortWeekdays=®sun®m\u00e1n®\u00feri®mi\u00f0®fim®f\u00f6s®lau®
@@ -491,7 +272,9 @@ territories.GN=G\u00ednea
territories.GM=Gamb\u00eda
territories.GL=Gr\u00e6nland
territories.SV=El Salvador
+territories.062=Sy\u00f0ri mi\u00f0-As\u00eda
territories.ST=Sa\u00f3 T\u00f3me og Prins\u00edpe
+territories.061=P\u00f3l\u00fdnes\u00eda
territories.GI=G\u00edbraltar
territories.GH=Gana
territories.SR=S\u00far\u00ednam
@@ -515,9 +298,12 @@ territories.SC=Seychelleseyjar
territories.SB=Sal\u00f3monseyjar
territories.SA=S\u00e1di-Arab\u00eda
territories.FR=Frakkland
+territories.057=M\u00edkr\u00f3nes\u00eda
territories.FO=F\u00e6reyjar
territories.FM=Mikr\u00f3nes\u00eda
territories.RW=R\u00faanda
+territories.054=Melanes\u00eda
+territories.053=\u00c1stral\u00eda og N\u00fdja-Sj\u00e1land
territories.FK=Falklandseyjar
territories.RU=R\u00fassland
territories.FJ=F\u00eddjieyjar
@@ -527,20 +313,26 @@ territories.RE=R\u00e9union
territories.ET=E\u00fe\u00ed\u00f3p\u00eda
territories.ES=Sp\u00e1nn
territories.ER=Er\u00edtrea
+territories.833=M\u00f6n
territories.EH=Vestur-Sahara
territories.EG=Egyptaland
+territories.830=Ermasundseyjar
territories.EE=Eistland
+territories.QO=Ytri Eyja\u00e1lfa
territories.EC=Ekvador
territories.DZ=Als\u00edr
territories.QA=Katar
+territories.039=Su\u00f0ur-Evr\u00f3pa
territories.DO=D\u00f3min\u00edska l\u00fd\u00f0veldi\u00f0
territories.PY=Paragv\u00e6
+territories.035=Su\u00f0austur-As\u00eda
territories.DM=D\u00f3min\u00edka
territories.PW=Pal\u00e1
territories.DK=Danm\u00f6rk
territories.DJ=Dj\u00edb\u00fat\u00ed
territories.PT=Port\u00fagal
territories.PS=Palest\u00edna
+territories.030=Austur-As\u00eda
territories.PR=P\u00faert\u00f3 R\u00edk\u00f3
territories.DE=\u00de\u00fdskaland
territories.PN=Pitcairn
@@ -555,13 +347,18 @@ territories.PE=Per\u00fa
territories.CY=K\u00fdpur
territories.CX=J\u00f3laey
territories.CV=Gr\u00e6nh\u00f6f\u00f0aeyjar
+territories.PA=Panama
territories.CU=K\u00faba
+territories.CS=Serb\u00eda
territories.CR=Kostar\u00edka
+territories.029=Kar\u00edbahaf
territories.CO=K\u00f3lumb\u00eda
territories.CN=K\u00edna
territories.CM=Kamer\u00fan
+territories.CL=Chile
territories.CK=Cookseyjar
territories.CI=F\u00edlabeinsstr\u00f6ndin
+territories.021=Nor\u00f0ur-Amer\u00edka
territories.CH=Sviss
territories.CG=Vestur-Kong\u00f3
territories.CF=Mi\u00f0-Afr\u00edkul\u00fd\u00f0veldi\u00f0
@@ -576,13 +373,20 @@ territories.BV=Bouveteyja
territories.BT=B\u00fatan
territories.BS=Bahamaeyjar
territories.BR=Brasil\u00eda
+territories.019=Amer\u00edka
+territories.018=Su\u00f0ur-Afr\u00edka
territories.NZ=N\u00fdja-Sj\u00e1land
territories.BO=B\u00f3liv\u00eda
+territories.017=Mi\u00f0-Afr\u00edka
territories.BN=Br\u00fanei
territories.BM=Berm\u00fadaeyjar
+territories.015=Nor\u00f0ur-Afr\u00edka
+territories.014=Austur-Afr\u00edka
+territories.013=Mi\u00f0-Amer\u00edka
territories.NU=Niue
territories.BJ=Ben\u00edn
territories.BI=B\u00far\u00fand\u00ed
+territories.011=Vestur-Afr\u00edka
territories.BH=Barein
territories.NR=N\u00e1r\u00fa
territories.BG=B\u00falgar\u00eda
@@ -592,6 +396,7 @@ territories.BE=Belg\u00eda
territories.NO=Noregur
territories.BD=Bangladess
territories.BB=Barbados
+territories.ZW=Simbabve
territories.NL=Ni\u00f0url\u00f6nd
territories.BA=Bosn\u00eda og Herseg\u00f3v\u00edna
territories.NI=N\u00edkaragva
@@ -599,6 +404,7 @@ territories.NG=N\u00edger\u00eda
territories.NF=Norfolkeyja
territories.AZ=Aserba\u00eddsjan
territories.NE=N\u00edger
+territories.AX=\u00c1landseyjar
territories.NC=N\u00fdja-Kaled\u00f3n\u00eda
territories.AW=Ar\u00faba
territories.ZM=Samb\u00eda
@@ -607,19 +413,23 @@ territories.AU=\u00c1stral\u00eda
territories.AT=Austurr\u00edki
territories.AS=Bandar\u00edska Sam\u00f3a
territories.AR=Argent\u00edna
+territories.009=Eyja\u00e1lfa
territories.AQ=Su\u00f0urskautslandi\u00f0
territories.MZ=M\u00f3samb\u00edk
territories.AO=Ang\u00f3la
territories.MY=Malas\u00eda
territories.AN=Hollensku Antillur
territories.MX=Mex\u00edk\u00f3
+territories.005=Su\u00f0ur-Amer\u00edka
territories.AM=Armen\u00eda
territories.MW=Malav\u00ed
territories.AL=Alban\u00eda
territories.MV=Mald\u00edveyjar
territories.ZA=Su\u00f0ur-Afr\u00edka
territories.MU=M\u00e1rit\u00edus
+territories.002=Afr\u00edka
territories.MT=Malta
+territories.001=Heimur
territories.AI=Angvilla
territories.MS=Montserrat
territories.MR=M\u00e1ritan\u00eda
@@ -634,7 +444,6 @@ territories.MN=Mong\u00f3l\u00eda
territories.MM=Mjanmar
territories.ML=Mal\u00ed
territories.MK=Maked\u00f3n\u00eda
-territories.YU=J\u00fag\u00f3slav\u00eda
territories.YT=Mayotte
territories.MH=Marshalleyjar
territories.MG=Madagaskar
@@ -644,10 +453,14 @@ territories.MA=Marokk\u00f3
territories.YE=Jemen
territories.LY=L\u00edb\u00eda
territories.LV=Lettland
+territories.155=Vestur-Evr\u00f3pa
territories.LU=L\u00faxemborg
+territories.154=Nor\u00f0ur-Evr\u00f3pa
territories.LT=Lith\u00e1en
territories.LS=Les\u00f3t\u00f3
territories.LR=L\u00edber\u00eda
+territories.151=Austur-Evr\u00f3pa
+territories.150=Evr\u00f3pa
territories.LK=Sr\u00ed Lanka
territories.LI=Liechtenstein
territories.LC=Sankti L\u00fas\u00eda
@@ -656,6 +469,8 @@ territories.LA=Laos
territories.KZ=Kasakstan
territories.KY=Caymaneyjar
territories.KW=K\u00faveit
+territories.145=Vestur-As\u00eda
+territories.142=As\u00eda
territories.KR=Su\u00f0ur-K\u00f3rea
territories.KP=Nor\u00f0ur-K\u00f3rea
territories.KN=Sankti Krist\u00f3fer og Nevis
@@ -705,8 +520,8 @@ territories.TR=Tyrkland
territories.TO=Tonga
territories.TN=T\u00fanis
territories.TM=T\u00farkmenistan
-languages.gwi=Gv\u00eds\u00edn
languages.akk=Akkad\u00edska
+languages.gwi=Gv\u00eds\u00edn
languages.eka=Ekaj\u00fak
languages.ijo=\u00cdj\u00f3
languages.xh=S\u00f3sa
@@ -719,15 +534,15 @@ languages.pon=Ponpeiska
languages.min=M\u00ednangkab\u00e1
languages.suk=S\u00fak\u00fama
languages.wo=Volof
-languages.lol=Mong\u00f3
languages.kut=K\u00fatena\u00ed
+languages.lol=Mong\u00f3
languages.mic=Mikmak
languages.wa=Vall\u00f3nska
languages.kum=K\u00fam\u00edk
languages.zap=Sap\u00f3tek
languages.cus=K\u00fasit\u00edsk m\u00e1l (\u00f6nnur)
-languages.jbo=Lojban
languages.doi=Dogr\u00ed
+languages.jbo=Lojban
languages.vo=Volap\u00fck
languages.oto=\u00d3tomm\u00e1l
languages.vi=V\u00edetnamska
@@ -751,8 +566,8 @@ languages.egy=Fornegypska
languages.ug=\u00da\u00edg\u00far
languages.fan=Fang
languages.ssa=N\u00edl\u00f3saharam\u00e1l (\u00f6nnur)
-languages.mga=Mi\u00f0\u00edrska (900-1200)
languages.bat=Baltnesk m\u00e1l (\u00f6nnur)
+languages.mga=Mi\u00f0\u00edrska (900-1200)
languages.nyo=Nj\u00f3r\u00f3
languages.bas=Basa
languages.nyn=Njank\u00f3le
@@ -780,8 +595,8 @@ languages.kru=K\u00far\u00fak
languages.tg=Tadsjikska
languages.byn=Bl\u00edn
languages.te=Tel\u00fag\u00fa
-languages.kro=Kr\u00fa
languages.csb=Kas\u00fab\u00edska
+languages.kro=Kr\u00fa
languages.ta=Tam\u00edlska
languages.tkl=T\u00f3kel\u00e1ska
languages.efi=Ef\u00edk
@@ -805,8 +620,8 @@ languages.sk=Sl\u00f3vak\u00edska
languages.grb=Gerb\u00f3
languages.si=Singales\u00edska
languages.sh=Serb\u00f3kr\u00f3at\u00edska
-languages.crh=Kr\u00edmtyrkneska
languages.afa=Afr\u00f3as\u00edsk m\u00e1l (\u00f6nnur)
+languages.crh=Kr\u00edmtyrkneska
languages.sg=Sang\u00f3
languages.se=Nor\u00f0ursam\u00edska
languages.sd=Sind\u00ed
@@ -830,14 +645,14 @@ languages.son=Songha\u00ed
languages.cpp=Kre\u00f3l- og pidginm\u00e1l \u00e1 port\u00fag\u00f6lskum grunni
languages.sog=Sogd\u00eden
languages.ada=Adangme
-languages.kos=Kosraska
-languages.hit=Hettit\u00edska
languages.cpf=Kre\u00f3l- og pidginm\u00e1l \u00e1 fr\u00f6nskum grunni
+languages.hit=Hettit\u00edska
+languages.kos=Kosraska
languages.cpe=Kre\u00f3l- og pidginm\u00e1l \u00e1 enskum grunni
languages.him=H\u00edmasjal\u00ed
-languages.kok=Konkan\u00ed
-languages.hil=H\u00edliga\u00ednon
languages.got=Gotneska
+languages.hil=H\u00edliga\u00ednon
+languages.kok=Konkan\u00ed
languages.gor=Gorontal\u00f3
languages.gon=Gond\u00ed
languages.din=Dinka
@@ -908,21 +723,21 @@ languages.ms=Mala\u00edska
languages.mr=Marat\u00ed
languages.fro=Fornfranska (842 - um 1400)
languages.mo=Mold\u00f3vska
-languages.frm=Mi\u00f0franska (um 1400-1600)
languages.mn=Mong\u00f3lska
-languages.jrb=Gy\u00f0ingaarab\u00edska
+languages.frm=Mi\u00f0franska (um 1400-1600)
languages.ml=Malajalam
+languages.jrb=Gy\u00f0ingaarab\u00edska
languages.mk=Maked\u00f3nska
languages.mi=Ma\u00f3r\u00ed
languages.mh=Marshallska
languages.mg=Malagas\u00edska
languages.mwr=Marvar\u00ed
languages.bra=Bra\u00ed
-languages.den=Slav
languages.lv=Lettneska
+languages.den=Slav
languages.lu=L\u00fabakatanga
-languages.del=Delaver
languages.lt=Lith\u00e1\u00edska
+languages.del=Delaver
languages.lo=La\u00f3
languages.ln=Lingala
languages.li=Limb\u00farg\u00edska
@@ -975,38 +790,38 @@ languages.iu=In\u00faktit\u00fat
languages.pap=Pap\u00edament\u00f3
languages.it=\u00cdtalska
languages.sgn=T\u00e1knm\u00e1l
-languages.is=\u00cdslenska
languages.kha=Kas\u00ed
+languages.is=\u00cdslenska
languages.chr=Sjer\u00f3k\u00ed
languages.pam=Pampanga
languages.pal=Palav\u00ed
languages.chp=S\u00edpev\u00edska
-languages.io=\u00cdd\u00f3
languages.cho=Sjokt\u00e1
+languages.io=\u00cdd\u00f3
languages.chn=S\u00edn\u00fak
languages.chm=Mar\u00ed
languages.tyv=T\u00fav\u00ednska
languages.bnt=Bant\u00fam\u00e1l
languages.pag=Pangas\u00ednm\u00e1l
-languages.ik=\u00cdn\u00fap\u00edak
languages.chk=Sj\u00fak\u00edska
-languages.ii=S\u00eds\u00faanj\u00ed
+languages.ik=\u00cdn\u00fap\u00edak
languages.haw=Hava\u00edska
+languages.ii=S\u00eds\u00faanj\u00ed
languages.lam=Lamba
-languages.ig=\u00cdgb\u00f3
languages.chg=Sjagata\u00ed
+languages.ig=\u00cdgb\u00f3
languages.sga=Forn\u00edrska (til 900)
languages.paa=Pap\u00fask m\u00e1l (\u00f6nnur)
languages.ie=Interlingva
languages.id=Ind\u00f3nes\u00edska
languages.lah=Landa
-languages.day=Dajak
languages.chb=S\u00edbsja
+languages.day=Dajak
languages.ia=Interlingva
languages.lad=Lad\u00ednska
-languages.hz=Herer\u00f3
-languages.hai=Ha\u00edda
languages.dar=Dargva
+languages.hai=Ha\u00edda
+languages.hz=Herer\u00f3
languages.hy=Armenska
languages.ath=Atapask\u00edsk m\u00e1l
languages.hu=Ungverska
@@ -1028,9 +843,9 @@ languages.iro=\u00cdr\u00f3kesk m\u00e1l
languages.gn=Gvaran\u00ed
languages.gl=Gallegska
languages.arw=Aravakska
-languages.gez=G\u00eds
-languages.art=Al\u00fej\u00f3\u00f0am\u00e1l (\u00f6nnur)
languages.gd=Skosk gel\u00edska
+languages.art=Al\u00fej\u00f3\u00f0am\u00e1l (\u00f6nnur)
+languages.gez=G\u00eds
languages.ira=\u00cdranska
languages.ga=\u00cdrska
languages.arp=Arapah\u00f3
@@ -1039,8 +854,8 @@ languages.fy=Fr\u00edsneska
languages.bla=Siksika
languages.gem=Germ\u00f6nsk m\u00e1l (\u00f6nnur)
languages.ypk=J\u00fap\u00edsk m\u00e1l
-languages.arc=Arame\u00edska
languages.fr=Franska
+languages.arc=Arame\u00edska
languages.fo=F\u00e6reyska
languages.cel=Keltnesk (\u00f6nnur)
languages.fj=F\u00eddjeyska
@@ -1064,9 +879,9 @@ languages.tum=T\u00famb\u00faka
languages.mos=Moss\u00ed
languages.dz=Dsongka
languages.nic=N\u00edgerkord\u00f3fanm\u00e1l (\u00f6nnur)
-languages.lus=L\u00fasa\u00ed
-languages.fiu=Finnsk\u00fagr\u00edsk m\u00e1l (\u00f6nnur)
languages.dv=D\u00edveh\u00ed
+languages.fiu=Finnsk\u00fagr\u00edsk m\u00e1l (\u00f6nnur)
+languages.lus=L\u00fasa\u00ed
languages.nia=N\u00edas
languages.moh=M\u00f3h\u00edska
languages.luo=L\u00fa\u00f3
@@ -1089,8 +904,8 @@ languages.wak=Vakasm\u00e1l
languages.sat=Santal\u00ed
languages.cy=Velska
languages.sas=Sasak
-languages.kbd=Kabard\u00edska
languages.cv=Sj\u00favas
+languages.kbd=Kabard\u00edska
languages.cu=Kirkjuslavneska
languages.mni=Man\u00edp\u00far\u00ed
languages.cs=T\u00e9kkneska
@@ -1102,17 +917,17 @@ languages.co=Kors\u00edska
languages.sai=Ind\u00ed\u00e1nam\u00e1l Su\u00f0ur-Amer\u00edku (\u00f6nnur)
languages.mnc=Mansj\u00fa
languages.sah=Jak\u00fat
-languages.kaw=Kav\u00ed
-languages.inh=Ing\u00fas
languages.gba=Gbaja
+languages.inh=Ing\u00fas
+languages.kaw=Kav\u00ed
languages.sad=Sandave
languages.ch=Kamorr\u00f3
-languages.ine=Ind\u00f3evr\u00f3psk m\u00e1l (\u00f6nnur)
languages.bho=Bojp\u00far\u00ed
+languages.ine=Ind\u00f3evr\u00f3psk m\u00e1l (\u00f6nnur)
languages.enm=Mi\u00f0enska (1100-1500)
-languages.kar=Karen
-languages.inc=Indversk m\u00e1l (\u00f6nnur)
languages.ce=Tsjetsjenska
+languages.inc=Indversk m\u00e1l (\u00f6nnur)
+languages.kar=Karen
languages.gay=Gaj\u00f3
languages.ca=Katal\u00f3nska
languages.umb=\u00damb\u00fand\u00fa
@@ -1120,19 +935,19 @@ languages.syr=S\u00fdrlenska
languages.kam=Kamba
languages.tsi=Tsims\u00edska
languages.ang=Fornenska (um 450-1100)
-languages.kac=Kas\u00edn
languages.cau=K\u00e1kasusm\u00e1l (\u00f6nnur)
+languages.kac=Kas\u00edn
languages.kab=Kab\u00edle
-languages.kaa=Karakalpak
languages.bs=Bosn\u00edska
-languages.car=Kar\u00edbam\u00e1l
+languages.kaa=Karakalpak
languages.br=Bret\u00f3nska
+languages.car=Kar\u00edbam\u00e1l
languages.bo=T\u00edbeska
languages.bn=Bengalska
languages.bm=Bambara
languages.gaa=Ga
-languages.cai=Ind\u00ed\u00e1nam\u00e1l Mi\u00f0-Amer\u00edku (\u00f6nnur)
languages.bi=B\u00edslama
+languages.cai=Ind\u00ed\u00e1nam\u00e1l Mi\u00f0-Amer\u00edku (\u00f6nnur)
languages.bh=B\u00edhar\u00ed
languages.bg=B\u00falgarska
languages.be=Hv\u00edtr\u00fassneska
@@ -1146,10 +961,10 @@ languages.az=Aserska
languages.ay=A\u00edmara
languages.av=Avar\u00edska
languages.as=Assamska
-languages.dsb=L\u00e1gsorbneska
languages.ar=Arab\u00edska
-languages.ilo=\u00cdlok\u00f3
+languages.dsb=L\u00e1gsorbneska
languages.elx=Elam\u00edt
+languages.ilo=\u00cdlok\u00f3
languages.zh=K\u00ednverska
languages.an=Aragonska
languages.pra=Prakr\u00edtm\u00e1l
diff --git a/resource/gnu/java/locale/LocaleInformation_it.properties b/resource/gnu/java/locale/LocaleInformation_it.properties
index 75adf3d25..f2662faf0 100644
--- a/resource/gnu/java/locale/LocaleInformation_it.properties
+++ b/resource/gnu/java/locale/LocaleInformation_it.properties
@@ -7,760 +7,328 @@
decimalSeparator=,
groupingSeparator=.
-currenciesDisplayName.JOD=Dinaro Giordano
-currenciesDisplayName.BOV=Mvdol Boliviano
-currenciesDisplayName.XAU=Oro
-currenciesDisplayName.FOK=Kronur delle Isole Faeroe
-currenciesDisplayName.LBP=Sterlina Libanese
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Dong Vietnamita
-currenciesDisplayName.TZS=Scellino della Tanzania
-currenciesDisplayName.BOP=Peso Boliviano
-currenciesDisplayName.KHR=Riel Cambogiano
-currenciesDisplayName.XAM=Unit\u00e0 Monetaria Asiatica
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Vecchio riel cambogiano
-currenciesDisplayName.ZMP=Sterlina dello Zambia
-currenciesDisplayName.AUP=Sterlina Australiana
-currenciesDisplayName.XAF=Franco CFA BEAC
-currenciesDisplayName.MTP=Sterlina Maltese
-currenciesDisplayName.GHR=Cedi rivalutato del Ghana
-currenciesDisplayName.ZMK=Kwacha dello Zambia
-currenciesDisplayName.XAD=Unit\u00e0 di conto in dinari asiatica
-currenciesDisplayName.GHP=Sterlina del Ghana
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Vecchi cedi del Ghana
-currenciesDisplayName.MTL=Lira Maltese
-currenciesDisplayName.AUD=Dollaro Australiano
-currenciesDisplayName.USS=Dollaro Statunitense (Same day)
-currenciesDisplayName.ITL=Lira Italiana
-currenciesDisplayName.USN=Dollaro Statunitense (Next day)
-currenciesDisplayName.GHC=Cedi del Ghana
-currenciesDisplayName.SGD=Dollaro di Singapore
-currenciesDisplayName.PAB=Balboa di Panama
-currenciesDisplayName.LAK=Kip Laotiano
-currenciesDisplayName.KGS=Som Kirghiso
-currenciesDisplayName.CHF=Franco Svizzero
-currenciesDisplayName.ATS=Scellino Austriaco
-currenciesDisplayName.USD=Dollaro Statunitense
-currenciesDisplayName.ETD=Dollaro Etiopico
-currenciesDisplayName.BND=Dollaro del Brunei
-currenciesDisplayName.JMP=Sterlina Giamaicana
-currenciesDisplayName.ETB=Birr Etiopico
-currenciesDisplayName.DZG=Franco germinale algerino
-currenciesDisplayName.DZF=Nuovo franco algerino
-currenciesDisplayName.DZD=Dinaro Algerino
-currenciesDisplayName.PYG=Guarani del Paraguay
-currenciesDisplayName.LYP=Sterlina Libica
-currenciesDisplayName.JMD=Dollaro Giamaicano
-currenciesDisplayName.ISK=Corona Islandese
-currenciesDisplayName.ESP=Peseta Spagnola
-currenciesDisplayName.BMP=Sterlina delle Bermuda
-currenciesDisplayName.LYD=Dinaro Libico
-currenciesDisplayName.LYB=Lira libica della British Military Authority
-currenciesDisplayName.BMD=Dollaro delle Bermuda
-currenciesDisplayName.NLG=Fiorino Olandese
-currenciesDisplayName.MRO=Ouguiya della Mauritania
-currenciesDisplayName.IRR=Rial Iraniano
-currenciesDisplayName.SEK=Corona Svedese
-currenciesDisplayName.ERN=Nakfa Eritreo
+currenciesDisplayName.YDD=Dinaro dello Yemen
+currenciesDisplayName.TWD=Nuovo dollaro taiwanese
currenciesDisplayName.KES=Scellino Keniota
-currenciesDisplayName.CFF=Franco CFA della Repubblica dell\u2019Africa Centrale
+currenciesDisplayName.BYB=Nuovo Rublo Bielorussia (1994-1999)
+currenciesDisplayName.LKR=Rupia di Sri Lanka
+currenciesDisplayName.RWF=Franco Ruandese
+currenciesDisplayName.TJS=Somoni del Tajikistan
+currenciesDisplayName.SDP=Sterlina Sudanese
+currenciesDisplayName.TJR=Rublo del Tajikistan
+currenciesDisplayName.ERN=Nakfa Eritreo
+currenciesDisplayName.AFN=Afgani
+currenciesDisplayName.GRD=Dracma Greca
+currenciesDisplayName.IEP=Lira Irlandese
currenciesDisplayName.ARS=Peso Argentino
+currenciesDisplayName.SDD=Dinaro Sudanese
currenciesDisplayName.ARP=Peso Argentino (vecchio Cod.)
-currenciesDisplayName.ARM=Peso Moneda Nacional argentino
-currenciesDisplayName.TWD=Nuovo dollaro taiwanese
-currenciesDisplayName.SDP=Sterlina Sudanese
currenciesDisplayName.GEL=Lari Georgiano
+currenciesDisplayName.AFA=Afgani (1927-2002)
currenciesDisplayName.GEK=Kupon Larit Georgiano
-currenciesDisplayName.MQF=Franco della Martinica
+currenciesDisplayName.CRC=Col\u00f3n Costaricano
currenciesDisplayName.FKP=Sterlina delle Falkland
+currenciesDisplayName.EEK=Corona dell\u2019Estonia
+currenciesDisplayName.HKD=Dollaro di Hong Kong
+currenciesDisplayName.MDL=Leu Moldavo
currenciesDisplayName.ARA=Austral Argentino
-currenciesDisplayName.SDD=Dinaro Sudanese
currenciesDisplayName.IQD=Dinaro Iracheno
-currenciesDisplayName.TVD=Dollaro di Tuvalu
currenciesDisplayName.SCR=Rupia delle Seychelles
+currenciesDisplayName.VUV=Vatu di Vanuatu
+currenciesDisplayName.DKK=Corona Danese
+currenciesDisplayName.KPW=Won Nordcoreano
+currenciesDisplayName.GQE=Ekwele della Guinea Equatoriale
+currenciesDisplayName.IDR=Rupia Indiana
currenciesDisplayName.LVR=Rublo Lettone
-currenciesDisplayName.FJP=Sterlina delle Figi
+currenciesDisplayName.SOS=Scellino Somalo
+currenciesDisplayName.AED=Dirham degli Emirati Arabi Uniti
+currenciesDisplayName.BWP=Pula del Botswana
currenciesDisplayName.LVL=Lat Lettone
-currenciesDisplayName.CDL=Zaire Congolese
-currenciesDisplayName.CDG=Franco della Repubblica Congolese
-currenciesDisplayName.CDF=Franco Congolese
-currenciesDisplayName.FJD=Dollaro delle Figi
+currenciesDisplayName.RUR=Rublo della CSI
currenciesDisplayName.NIO=C\u00f3rdoba oro nicaraguense
+currenciesDisplayName.ADP=Peseta Andorrana
+currenciesDisplayName.FJD=Dollaro delle Figi
currenciesDisplayName.MOP=Pataca di Macao
-currenciesDisplayName.NIG=C\u00f3rdoba d\u2019oro nicaraguense
+currenciesDisplayName.RUB=Rublo Russo
+currenciesDisplayName.CDF=Franco Congolese
currenciesDisplayName.NIC=Cordoba Nicaraguense
-currenciesDisplayName.XTR=Rublo Trasferibile COMECON
-currenciesDisplayName.FIN=Markka Finlandese (1860-1962)
-currenciesDisplayName.FIM=Markka Finlandese
+currenciesDisplayName.DJF=Franco Gibutiano
+currenciesDisplayName.ECV=Unidad de Valor Constante (UVC) dell\u2019Ecuador
currenciesDisplayName.SBD=Dollaro delle Isole Solomon
+currenciesDisplayName.UZS=Sum dell\u2019Uzbekistan
+currenciesDisplayName.ECS=Sucre dell\u2019Ecuador
+currenciesDisplayName.PHP=Peso delle Filippine
+currenciesDisplayName.THB=Baht Tailandese
currenciesDisplayName.LUF=Franco del Lussemburgo
-currenciesDisplayName.TTO=Vecchio dollaro di Trinidad e Tobago
-currenciesDisplayName.AOS=Escudo Angolano
-currenciesDisplayName.AOR=Kwanza Reajustado Angolano (1995-1999)
-currenciesDisplayName.MNT=Tugrik Mongolo
-currenciesDisplayName.HUF=Fiorino Ungherese
-currenciesDisplayName.BIF=Franco del Burundi
-currenciesDisplayName.AON=Nuovo Kwanza Angolano (1990-2000)
-currenciesDisplayName.AOK=Kwanza Angolano (1977-1990)
+currenciesDisplayName.FIM=Markka Finlandese
currenciesDisplayName.TTD=Dollaro di Trinidad e Tobago
currenciesDisplayName.SZL=Lilangeni dello Swaziland
-currenciesDisplayName.NHF=Franco CFP delle Nuove Ebridi
-currenciesDisplayName.GBP=Sterlina Inglese
-currenciesDisplayName.SAS=Riyal sovrano saudita
+currenciesDisplayName.MNT=Tugrik Mongolo
currenciesDisplayName.SAR=Ryal Saudita
+currenciesDisplayName.UAK=Karbovanetz Ucraino
+currenciesDisplayName.UAH=Hrivna Ucraina
+currenciesDisplayName.HUF=Fiorino Ungherese
+currenciesDisplayName.COP=Peso Colombiano
+currenciesDisplayName.QAR=Rial del Qatar
currenciesDisplayName.LTT=Talonas Lituani
-currenciesDisplayName.INR=Rupia Indiana
currenciesDisplayName.PTE=Escudo Portoghese
-currenciesDisplayName.AOA=Kwanza Angolano
-currenciesDisplayName.PTC=Conto Portoghese
+currenciesDisplayName.AOR=Kwanza Reajustado Angolano (1995-1999)
+currenciesDisplayName.UYU=Peso Uruguayo uruguaiano
+currenciesDisplayName.GBP=Sterlina Inglese
+currenciesDisplayName.BIF=Franco del Burundi
+currenciesDisplayName.INR=Rupia Indiana
+currenciesDisplayName.ZRZ=Zaire dello Zaire
+currenciesDisplayName.AON=Nuovo Kwanza Angolano (1990-2000)
currenciesDisplayName.LTL=Lita Lituana
+currenciesDisplayName.XFU=Franco UIC Francese
currenciesDisplayName.KZT=Tenge Kazaco
-currenciesDisplayName.KZR=Rublo Kazaco
-currenciesDisplayName.VGD=Dollaro delle Isole Vergini britanniche
-currenciesDisplayName.NGP=Sterlina Nigeriana
-currenciesDisplayName.MMX=Certificati di cambio esteri in dollari Myanmar
+currenciesDisplayName.MZM=Metical del Mozambico
+currenciesDisplayName.UYP=Peso Uruguaiano (1975-1993)
+currenciesDisplayName.AOK=Kwanza Angolano (1977-1990)
+currenciesDisplayName.BUK=Kyat Birmano
+currenciesDisplayName.GNS=Syli della Guinea
+currenciesDisplayName.XFO=Franco Oro Francese
+currenciesDisplayName.PGK=Kina della Papua Nuova Guinea
+currenciesDisplayName.SYP=Sterlina Siriana
+currenciesDisplayName.MZE=Escudo del Mozambico
+currenciesDisplayName.OMR=Rial Omanita
currenciesDisplayName.NGN=Naira Nigeriana
+currenciesDisplayName.ZRN=Nuovo Zaire dello Zaire
+currenciesDisplayName.AOA=Kwanza Angolano
+currenciesDisplayName.CNY=Renmimbi Cinese
+currenciesDisplayName.MAF=Franco Marocchino
+currenciesDisplayName.GNF=Franco della Guinea
currenciesDisplayName.HTG=Gourde Haitiano
-currenciesDisplayName.SYP=Sterlina Siriana
-currenciesDisplayName.PSP=Sterlina della Palestina
-currenciesDisplayName.BHD=Dinaro del Bahraini
+currenciesDisplayName.MAD=Dirham Marocchino
currenciesDisplayName.MMK=Kyat di Myanmar
+currenciesDisplayName.MYR=Ringgit della Malesia
+currenciesDisplayName.LSL=Loti del Lesotho
+currenciesDisplayName.XEU=Unit\u00e0 Monetaria Europea
+currenciesDisplayName.BHD=Dinaro del Bahraini
+currenciesDisplayName.SLL=Leone della Sierra Leone
+currenciesDisplayName.BTN=Ngultrum Butanese
+currenciesDisplayName.TRL=Lira Turca
+currenciesDisplayName.KMF=Franco Comoriano
currenciesDisplayName.ANG=Fiorino delle Antille Olandesi
currenciesDisplayName.CZK=Corona Ceca
-currenciesDisplayName.IMP=Lira Sterlina dell\u2019Isola di Man
-currenciesDisplayName.BGX=Certificati di cambio esteri in Lev bulgari
-currenciesDisplayName.LSL=Loti del Lesotho
-currenciesDisplayName.GAF=Franco CFA Gabon
-currenciesDisplayName.BGO=Lev Bulgaro (1879-1952)
+currenciesDisplayName.AZM=Manat Azero
+currenciesDisplayName.KYD=Dollaro delle Isole Cayman
+currenciesDisplayName.GMD=Dalasi del Gambia
currenciesDisplayName.BGN=Nuovo Lev Bulgaro
-currenciesDisplayName.BGM=Lev Bulgaro Socialista
currenciesDisplayName.CAD=Dollaro Canadese
+currenciesDisplayName.MXV=Unidad de Inversion (UDI) Messicana
currenciesDisplayName.BGL=Lev Bulgaro
-currenciesDisplayName.TRL=Lira Turca
-currenciesDisplayName.KYD=Dollaro delle Isole Cayman
-currenciesDisplayName.CYP=Sterlina Cipriota
+currenciesDisplayName.VEB=Bolivar Venezuelano
+currenciesDisplayName.MLF=Franco di Mali
currenciesDisplayName.ILS=Nuovo sheqel israeliano
+currenciesDisplayName.MXP=Peso messicano d\u2019argento (1861-1992)
+currenciesDisplayName.PES=Sol Peruviano
currenciesDisplayName.GYD=Dollaro della Guyana
-currenciesDisplayName.AMD=Dram Armeno
+currenciesDisplayName.MXN=Peso Messicano
currenciesDisplayName.ILP=Sterlina Israeliana
-currenciesDisplayName.MLF=Franco di Mali
-currenciesDisplayName.ILL=Sheqel Israeliano
-currenciesDisplayName.VEB=Bolivar Venezuelano
-currenciesDisplayName.ALX=Certificati di cambio esteri albanesi in dollari
+currenciesDisplayName.SKK=Corona Slovacca
+currenciesDisplayName.CYP=Sterlina Cipriota
+currenciesDisplayName.XDR=Diritti Speciali di Incasso
+currenciesDisplayName.PEN=Sol Nuevo Peruviano
currenciesDisplayName.LRD=Dollaro Liberiano
-currenciesDisplayName.ALV=Lek Valute Albanese
+currenciesDisplayName.PEI=Inti Peruviano
+currenciesDisplayName.AMD=Dram Armeno
+currenciesDisplayName.BSD=Dollaro delle Bahamas
currenciesDisplayName.HRK=Kuna Croata
-currenciesDisplayName.REF=Franco di Reunion
+currenciesDisplayName.CLP=Peso Cileno
currenciesDisplayName.HRD=Dinaro Croato
-currenciesDisplayName.ALL=Lek Albanese
-currenciesDisplayName.JEP=Lira Sterlina di Jersey
-currenciesDisplayName.ALK=Lek Albanese (1946-1961)
-currenciesDisplayName.MKN=Dinaro Macedone (1992-1993)
-currenciesDisplayName.VDP=Viet Minh Piastre Dong Viet nordvietnamita
-currenciesDisplayName.VDN=Nuovo Dong nordvietnamita
-currenciesDisplayName.MKD=Dinaro Macedone
-currenciesDisplayName.VDD=Piastre Dong Viet nordvietnamita
-currenciesDisplayName.TPP=Pataca di Timor
currenciesDisplayName.XPF=Franco CFP
-currenciesDisplayName.BEL=Franco Belga (finanziario)
-currenciesDisplayName.GWP=Peso della Guinea-Bissau
-currenciesDisplayName.KWD=Dinaro Kuwaitiano
-currenciesDisplayName.GWM=Mil Reis della Guinea portoghese
-currenciesDisplayName.BEF=Franco Belga
+currenciesDisplayName.FRF=Franco Francese
+currenciesDisplayName.BRR=Cruzeiro Brasiliano
+currenciesDisplayName.MKD=Dinaro Macedone
+currenciesDisplayName.CLF=Unidades de Fomento Chilene
+currenciesDisplayName.ALL=Lek Albanese
+currenciesDisplayName.BRN=Cruzado Novo Brasiliano
+currenciesDisplayName.MWK=Kwacha Malawiano
+currenciesDisplayName.BRL=Real Brasiliano
currenciesDisplayName.TPE=Escudo di Timor
-currenciesDisplayName.BEC=Franco Belga (convertibile)
-currenciesDisplayName.GWE=Escudo della Guinea portoghese
+currenciesDisplayName.BRE=Cruzeiro Brasiliano (1990-1993)
+currenciesDisplayName.BRC=Cruzado Brasiliano
+currenciesDisplayName.BRB=Cruzeiro Novo Brasiliano (1967-1986)
+currenciesDisplayName.DEM=Marco Tedesco
+currenciesDisplayName.KWD=Dinaro Kuwaitiano
+currenciesDisplayName.XCD=Dollaro dei Caraibi Orientali
+currenciesDisplayName.NPR=Rupia Nepalese
+currenciesDisplayName.GWP=Peso della Guinea-Bissau
+currenciesDisplayName.YUN=Dinaro Convertibile Yugoslavo
currenciesDisplayName.SVC=Col\u00f3n Salvadoregno
-currenciesDisplayName.CWG=Guilder del Curacao
-currenciesDisplayName.BDT=Taka Bangladese
-currenciesDisplayName.TOS=Lira sterlina di Tonga
-currenciesDisplayName.TOP=Pa\u02bbanga di Tonga
+currenciesDisplayName.YUM=Dinaro Noviy Yugoslavo
+currenciesDisplayName.BEL=Franco Belga (finanziario)
+currenciesDisplayName.SIT=Tallero Sloveno
+currenciesDisplayName.JPY=Yen Giapponese
currenciesDisplayName.XOF=Franco CFA BCEAO
+currenciesDisplayName.MVR=Rufiyaa delle Maldive
+currenciesDisplayName.GWE=Escudo della Guinea portoghese
+currenciesDisplayName.BEF=Franco Belga
+currenciesDisplayName.TOP=Pa\u02bbanga di Tonga
+currenciesDisplayName.YUD=Dinaro Forte Yugoslavo
+currenciesDisplayName.BEC=Franco Belga (convertibile)
currenciesDisplayName.SUR=Rublo Sovietico
-currenciesDisplayName.SUN=Nuovo rublo sovietico
-currenciesDisplayName.NCF=Franco germinale della Nuova Caledonia
-currenciesDisplayName.CVE=Escudo del Capo Verde
-currenciesDisplayName.XNF=Franco CFA delle Antille Francesi
+currenciesDisplayName.ROL=Leu della Romania
+currenciesDisplayName.DDM=Ostmark della Germania Orientale
+currenciesDisplayName.BDT=Taka Bangladese
+currenciesDisplayName.XBD=Unit\u00e0 di acconto europea (XBD)
+currenciesDisplayName.AWG=Fiorino di Aruba
+currenciesDisplayName.XBC=Unit\u00e0 di acconto europea (XBC)
+currenciesDisplayName.XBB=Unit\u00e0 monetaria europea
+currenciesDisplayName.XBA=Unit\u00e0 composita europea
+currenciesDisplayName.NOK=Corona Norvegese
+currenciesDisplayName.MUR=Rupia Mauriziana
currenciesDisplayName.ZAR=Rand Sudafricano
-currenciesDisplayName.DOP=Peso Dominicano
-currenciesDisplayName.CUX=Certificati di cambio esteri cubani
-currenciesDisplayName.ZAP=Sterlina Sudafricana
+currenciesDisplayName.SHP=Sterlina di Sant\u2019Elena
+currenciesDisplayName.XAU=Oro
currenciesDisplayName.ZAL=Rand Sudafricano (finanziario)
+currenciesDisplayName.VND=Dong Vietnamita
+currenciesDisplayName.TZS=Scellino della Tanzania
+currenciesDisplayName.GIP=Sterlina di Gibilterra
currenciesDisplayName.TND=Dinaro Tunisino
-currenciesDisplayName.CUP=Peso Cubano
-currenciesDisplayName.GUF=Franco Guiana della Guyana francese
+currenciesDisplayName.CVE=Escudo del Capo Verde
currenciesDisplayName.UGX=Scellino Ugandese
-currenciesDisplayName.LNR=Rupia di Ceylon
-currenciesDisplayName.AIF=Franco di Affars e Issas
-currenciesDisplayName.VAL=Lira della Citt\u00e0 del Vaticano
-currenciesDisplayName.STE=Escudo di S\u00e3o Tom\u00e9 e Principe
+currenciesDisplayName.ZMK=Kwacha dello Zambia
+currenciesDisplayName.JOD=Dinaro Giordano
+currenciesDisplayName.XAF=Franco CFA BEAC
+currenciesDisplayName.LBP=Sterlina Libanese
currenciesDisplayName.UGS=Scellino Ugandese (1966-1987)
currenciesDisplayName.STD=Dobra di S\u00e3o Tom\u00e9 e Principe
-currenciesDisplayName.MHD=Dollaro delle Isole Marshall
-currenciesDisplayName.NZP=Sterlina Neozelandese
currenciesDisplayName.WST=Tala della Samoa Occidentale
-currenciesDisplayName.WSP=Sterlina della Samoa Occidentale
-currenciesDisplayName.HNL=Lempira Hoduregno
-currenciesDisplayName.XMF=Nouveau Franc francese metropolitano
+currenciesDisplayName.KHR=Riel Cambogiano
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Peso Dominicano
+currenciesDisplayName.BOV=Mvdol Boliviano
+currenciesDisplayName.MTP=Sterlina Maltese
+currenciesDisplayName.USS=Dollaro Statunitense (Same day)
+currenciesDisplayName.BOP=Peso Boliviano
+currenciesDisplayName.MTL=Lira Maltese
+currenciesDisplayName.CUP=Peso Cubano
currenciesDisplayName.TMM=Manat Turkmeno
-currenciesDisplayName.GTQ=Quetzal Guatemalteco
+currenciesDisplayName.USN=Dollaro Statunitense (Next day)
+currenciesDisplayName.SGD=Dollaro di Singapore
currenciesDisplayName.NZD=Dollaro Neozelandese
-currenciesDisplayName.SSP=Sterlina Scozzese
-currenciesDisplayName.BBD=Dollaro di Barbados
+currenciesDisplayName.USD=Dollaro Statunitense
+currenciesDisplayName.HNL=Lempira Hoduregno
+currenciesDisplayName.BOB=Boliviano
+currenciesDisplayName.ITL=Lira Italiana
+currenciesDisplayName.PAB=Balboa di Panama
+currenciesDisplayName.GTQ=Quetzal Guatemalteco
+currenciesDisplayName.LAK=Kip Laotiano
+currenciesDisplayName.GHC=Cedi del Ghana
+currenciesDisplayName.AUD=Dollaro Australiano
currenciesDisplayName.NAD=Dollaro Namibiano
+currenciesDisplayName.KGS=Som Kirghiso
currenciesDisplayName.MGF=Franco Malgascio
+currenciesDisplayName.CHF=Franco Svizzero
+currenciesDisplayName.BBD=Dollaro di Barbados
currenciesDisplayName.MGA=Ariary Malgascio
-currenciesDisplayName.EGP=Sterlina Egiziana
-currenciesDisplayName.BZH=Dollaro Honduras Britannico
+currenciesDisplayName.PYG=Guarani del Paraguay
currenciesDisplayName.PLZ=Zloty Polacco (1950-1995)
-currenciesDisplayName.BAN=Nuovo Dinar Bosnia-Herzegovina
-currenciesDisplayName.PLX=Certificati di cambio esteri polacchi in dollari statunitensi
-currenciesDisplayName.BAM=Marco Conv. Bosnia-Erzegovina
-currenciesDisplayName.BZD=Dollaro Belize
-currenciesDisplayName.BAD=Dinar Bosnia-Herzegovina
-currenciesDisplayName.PLN=Zloty Polacco
currenciesDisplayName.YER=Rial dello Yemen
+currenciesDisplayName.ATS=Scellino Austriaco
+currenciesDisplayName.ETB=Birr Etiopico
+currenciesDisplayName.BND=Dollaro del Brunei
+currenciesDisplayName.JMD=Dollaro Giamaicano
+currenciesDisplayName.EGP=Sterlina Egiziana
+currenciesDisplayName.PLN=Zloty Polacco
+currenciesDisplayName.DZD=Dinaro Algerino
+currenciesDisplayName.ISK=Corona Islandese
currenciesDisplayName.SRG=Fiorino del Suriname
-currenciesDisplayName.CSK=Corona forte cecoslovacca
+currenciesDisplayName.LYD=Dinaro Libico
+currenciesDisplayName.BZD=Dollaro Belize
+currenciesDisplayName.BAM=Marco Conv. Bosnia-Erzegovina
+currenciesDisplayName.ESP=Peseta Spagnola
currenciesDisplayName.KRW=Won Sudcoreano
+currenciesDisplayName.NLG=Fiorino Olandese
+currenciesDisplayName.MRO=Ouguiya della Mauritania
+currenciesDisplayName.BAD=Dinar Bosnia-Herzegovina
+currenciesDisplayName.ZWD=Dollaro dello Zimbabwe
+currenciesDisplayName.SEK=Corona Svedese
+currenciesDisplayName.CSK=Corona forte cecoslovacca
currenciesDisplayName.BYR=Rublo Bielorussia
-currenciesDisplayName.YEI=Riyal Imadi dello Yemen
-currenciesDisplayName.BYL=Rublo Bielorussia (1992-1994)
-currenciesDisplayName.CSC=Corona Cecoslovacca
-currenciesDisplayName.KRO=Vecchi won sudcoreano
-currenciesDisplayName.KRH=Hwan sudcoreano
-currenciesDisplayName.BYB=Nuovo Rublo Bielorussia (1994-1999)
-currenciesDisplayName.SQS=Scellino del Somaliland
-currenciesDisplayName.GRN=Nuova dracma greca
+currenciesDisplayName.IRR=Rial Iraniano
currenciesDisplayName.PKR=Rupia del Pakistan
-currenciesDisplayName.AFN=Afgani
-currenciesDisplayName.ZWD=Dollaro dello Zimbabwe
-currenciesDisplayName.LKR=Rupia di Sri Lanka
-currenciesDisplayName.GRD=Dracma Greca
-currenciesDisplayName.IEP=Lira Irlandese
-currenciesDisplayName.AFA=Afgani (1927-2002)
-currenciesDisplayName.YDD=Dinaro dello Yemen
-currenciesDisplayName.RWF=Franco Ruandese
-currenciesDisplayName.CRC=Col\u00f3n Costaricano
-currenciesDisplayName.TJS=Somoni del Tajikistan
-currenciesDisplayName.TJR=Rublo del Tajikistan
-currenciesDisplayName.EEK=Corona dell\u2019Estonia
-currenciesDisplayName.GQP=Peseta Guineana della Guinea Equatoriale
-currenciesDisplayName.MDR=Coupon Rublo della Moldavia
-currenciesDisplayName.HKD=Dollaro di Hong Kong
-currenciesDisplayName.DKK=Corona Danese
-currenciesDisplayName.MDL=Leu Moldavo
-currenciesDisplayName.GQF=Franco della Guinea Equatoriale
-currenciesDisplayName.GQE=Ekwele della Guinea Equatoriale
-currenciesDisplayName.IDR=Rupia Indiana
-currenciesDisplayName.AED=Dirham degli Emirati Arabi Uniti
-currenciesDisplayName.KPW=Won Nordcoreano
-currenciesDisplayName.IDN=Nuova rupia indonesiana
-currenciesDisplayName.BWP=Pula del Botswana
-currenciesDisplayName.MDC=Coupon Leu della Moldavia
-currenciesDisplayName.IDJ=Rupia indonesiana di Java
-currenciesDisplayName.KPP=Won della Repubblica popolare democratica nordcoreana
-currenciesDisplayName.IDG=Fiorino Nica indonesiano
-currenciesDisplayName.VUV=Vatu di Vanuatu
-currenciesDisplayName.XID=Dinaro Islamico
-currenciesDisplayName.SOS=Scellino Somalo
-currenciesDisplayName.ADP=Peseta Andorrana
-currenciesDisplayName.RUR=Rublo della CSI
-currenciesDisplayName.GPF=Franco della Guadalupa
-currenciesDisplayName.DJF=Franco Gibutiano
-currenciesDisplayName.ADD=Diner Andorrano
-currenciesDisplayName.MCG=Franco germinale di Monaco
-currenciesDisplayName.MCF=Franc Nouveau di Monaco
-currenciesDisplayName.ECV=Unidad de Valor Constante (UVC) dell\u2019Ecuador
-currenciesDisplayName.ECS=Sucre dell\u2019Ecuador
-currenciesDisplayName.LIF=Franco del Liechtenstein
-currenciesDisplayName.RUB=Rublo Russo
-currenciesDisplayName.PHP=Peso delle Filippine
-currenciesDisplayName.UZS=Sum dell\u2019Uzbekistan
-currenciesDisplayName.COP=Peso Colombiano
-currenciesDisplayName.THB=Baht Tailandese
-currenciesDisplayName.IBP=Sterlina dell\u2019Irlanda del Nord
-currenciesDisplayName.BUR=Rupia Birmana
-currenciesDisplayName.COF=Franco CFA del Congo
-currenciesDisplayName.BUK=Kyat Birmano
-currenciesDisplayName.COB=Peso in banconote colombiano
-currenciesDisplayName.UZC=Som Coupon dell\u2019Uzbekistan
-currenciesDisplayName.UAK=Karbovanetz Ucraino
-currenciesDisplayName.QAR=Rial del Qatar
-currenciesDisplayName.UAH=Hrivna Ucraina
-currenciesDisplayName.GNS=Syli della Guinea
-currenciesDisplayName.CNY=Renmimbi Cinese
-currenciesDisplayName.MZM=Metical del Mozambico
-currenciesDisplayName.CNX=Certificati di cambio esteri cinesi in dollari statunitensi
-currenciesDisplayName.UYU=Peso Uruguayo uruguaiano
-currenciesDisplayName.GNI=Franco della Guinea (1960-1972)
-currenciesDisplayName.SML=Lira di San Marino
-currenciesDisplayName.CNP=Jen Min Piao Yuan Cinese
-currenciesDisplayName.MZE=Escudo del Mozambico
-currenciesDisplayName.GNF=Franco della Guinea
-currenciesDisplayName.OMS=Rial Saidi dell\u2019Oman
-currenciesDisplayName.PGK=Kina della Papua Nuova Guinea
-currenciesDisplayName.OMR=Rial Omanita
-currenciesDisplayName.UYP=Peso Uruguaiano (1975-1993)
-currenciesDisplayName.XFU=Franco UIC Francese
-currenciesDisplayName.BTR=Rupia Butanese
-currenciesDisplayName.ZRZ=Zaire dello Zaire
-currenciesDisplayName.MAF=Franco Marocchino
-currenciesDisplayName.MAD=Dirham Marocchino
-currenciesDisplayName.BTN=Ngultrum Butanese
-currenciesDisplayName.XFO=Franco Oro Francese
-currenciesDisplayName.UYF=Peso Fuerte dell\u2019Uruguaiano
-currenciesDisplayName.MYR=Ringgit della Malesia
-currenciesDisplayName.ZRN=Nuovo Zaire dello Zaire
-currenciesDisplayName.AZM=Manat Azero
-currenciesDisplayName.GMP=Sterlina del Gambia
-currenciesDisplayName.KMF=Franco Comoriano
-currenciesDisplayName.SLL=Leone della Sierra Leone
-currenciesDisplayName.GMD=Dalasi del Gambia
-currenciesDisplayName.XEU=Unit\u00e0 Monetaria Europea
-currenciesDisplayName.BSP=Libra delle Bahamas
-currenciesDisplayName.CMF=Franco CFA del Camerun
-currenciesDisplayName.MXV=Unidad de Inversion (UDI) Messicana
-currenciesDisplayName.XEF=Franco CFA BCEAEC
-currenciesDisplayName.BSD=Dollaro delle Bahamas
-currenciesDisplayName.MXP=Peso messicano d\u2019argento (1861-1992)
-currenciesDisplayName.MXN=Peso Messicano
-currenciesDisplayName.PES=Sol Peruviano
-currenciesDisplayName.GLK=Corona della Groenlandia
-currenciesDisplayName.BRZ=Cruzeiro Brasiliano (1942-1967)
-currenciesDisplayName.PEN=Sol Nuevo Peruviano
-currenciesDisplayName.CLP=Peso Cileno
-currenciesDisplayName.SKK=Corona Slovacca
-currenciesDisplayName.PEI=Inti Peruviano
-currenciesDisplayName.BRR=Cruzeiro Brasiliano
-currenciesDisplayName.XDR=Diritti Speciali di Incasso
-currenciesDisplayName.FRG=Franco germinale/franco Poincare francese
-currenciesDisplayName.FRF=Franco Francese
-currenciesDisplayName.BRN=Cruzado Novo Brasiliano
-currenciesDisplayName.CLF=Unidades de Fomento Chilene
-currenciesDisplayName.CLE=Escudo Cileno
-currenciesDisplayName.BRL=Real Brasiliano
-currenciesDisplayName.CLC=Condor Cileno
-currenciesDisplayName.BRE=Cruzeiro Brasiliano (1990-1993)
-currenciesDisplayName.DES=Sperrmark Tedesco
-currenciesDisplayName.MWP=Sterlina Malawiana
-currenciesDisplayName.BRC=Cruzado Brasiliano
-currenciesDisplayName.BRB=Cruzeiro Novo Brasiliano (1967-1986)
-currenciesDisplayName.MWK=Kwacha Malawiano
-currenciesDisplayName.PDR=Rublo della Transdniestria
-currenciesDisplayName.DEM=Marco Tedesco
-currenciesDisplayName.TDF=Franco CFA del Chad
-currenciesDisplayName.PDN=Nuovo rublo della Transdniestria
-currenciesDisplayName.PDK=Coupon in rubli della Transdniestria
-currenciesDisplayName.NPR=Rupia Nepalese
-currenciesDisplayName.CKD=Dollaro delle Isole Cook
-currenciesDisplayName.JPY=Yen Giapponese
-currenciesDisplayName.MVR=Rufiyaa delle Maldive
-currenciesDisplayName.XCF=Nuovo Franco CFA
-currenciesDisplayName.MVP=Rupia delle Maldive
-currenciesDisplayName.XCD=Dollaro dei Caraibi Orientali
-currenciesDisplayName.SIT=Tallero Sloveno
-currenciesDisplayName.YUR=Dinaro Riformato Yugoslavo
-currenciesDisplayName.AWG=Fiorino di Aruba
-currenciesDisplayName.YUO=Dinaro di Ottobre Yugoslavo
-currenciesDisplayName.DDM=Ostmark della Germania Orientale
-currenciesDisplayName.YUN=Dinaro Convertibile Yugoslavo
-currenciesDisplayName.YUM=Dinaro Noviy Yugoslavo
-currenciesDisplayName.TCC=Corona di Turks e Caicos
-currenciesDisplayName.YUG=Dinaro 1994 Yugoslavo
-currenciesDisplayName.YUF=Dinaro della Federazione Yugoslava
-currenciesDisplayName.RON=Nuovo Leu della Romania
-currenciesDisplayName.YUD=Dinaro Forte Yugoslavo
-currenciesDisplayName.ROL=Leu della Romania
-currenciesDisplayName.SIB=Tallero Bons Sloveno
-currenciesDisplayName.NOK=Corona Norvegese
-currenciesDisplayName.MUR=Rupia Mauriziana
-currenciesDisplayName.XBD=Unit\u00e0 di acconto europea (XBD)
-currenciesDisplayName.GIP=Sterlina di Gibilterra
-currenciesDisplayName.VNS=Dong Nazionale Vietnamita
-currenciesDisplayName.XBC=Unit\u00e0 di acconto europea (XBC)
-currenciesDisplayName.VNR=Dong della Repubblica Vietnamita
-currenciesDisplayName.XBB=Unit\u00e0 monetaria europea
-currenciesDisplayName.XBA=Unit\u00e0 composita europea
-currenciesDisplayName.KID=Dollaro di Kiribati
-currenciesDisplayName.SHP=Sterlina di Sant\u2019Elena
-currenciesDisplayName.VNN=Nuovo dong vietnamita
-currenciesSymbol.JOD=JOD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=BOB
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=AUD
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=SGD
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SFr.
-currenciesSymbol.ATS=ATS
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SEK
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Dollaro delle Bermuda
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=ARS
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=HUF
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.UGX=U Sh
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
-currenciesSymbol.SAR=SAR
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=lev
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=CAD
-currenciesSymbol.BGL=BGL
-currenciesSymbol.TRL=TRL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=CYP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BEF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.STD=Db
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=ZAR
+currenciesSymbol.YER=YRl
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
+currenciesSymbol.BIF=Fbu
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.GNF=GF
+currenciesSymbol.LSL=M
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
+currenciesSymbol.VEB=Be
+currenciesSymbol.KMF=CF
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
+currenciesSymbol.SKK=Sk
+currenciesSymbol.CHF=SFr.
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HKD
-currenciesSymbol.DKK=DKK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=CNY
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.GNF=GF
-currenciesSymbol.OMS=OMS
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
-currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=CLP
-currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=BRL
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=ROL
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NOK
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.BGN=lev
shortMonths=gen®feb®mar®apr®mag®giu®lug®ago®set®ott®nov®dic®®
months=gennaio®febbraio®marzo®aprile®maggio®giugno®luglio®agosto®settembre®ottobre®novembre®dicembre®®
shortWeekdays=®dom®lun®mar®mer®gio®ven®sab®
@@ -773,7 +341,7 @@ shortDateFormat=dd/MM/yy
mediumDateFormat=dd/MMM/yy
longDateFormat=dd MMMM yyyy
fullDateFormat=EEEE d MMMM yyyy
-zoneStrings=America/Indianapolis®EST®Ora Standard Orientale®EST®Ora Standard Orientale®©America/Halifax®AST®Ora Standard Atlantico®ADT®Ora Legale Atlantico®©Pacific/Honolulu®HST®Ora Standard Hawaii®HST®Ora Standard Hawaii®©America/Denver®MST®Ora Standard Mountain®MDT®Ora Legale Mountain®©America/Anchorage®AST®Ora Standard Alaska®ADT®Ora Legale Alaska®©America/St_Johns®CNT®Ora Standard Newfoundland®CDT®Ora Legale Newfoundland®©Africa/Casablanca®GMT®Ora Meridiano Greenwich®GMT®Ora Meridiano Greenwich®©America/Chicago®CST®Ora Standard Centrale®CDT®Ora Legale Centrale®©Asia/Shanghai®CTT®Ora Standard Cina®CDT®Ora Standard Cina®©Asia/Tokyo®JST®Ora Standard Giappone®JST®Ora Standard Giappone®©America/New_York®EST®Ora Standard Orientale®EDT®Ora Legale Orientale®©Europe/Bucharest®EET®Ora Standard Europa Orientale®EEST®Ora Legale Europa Orientale®©America/Los_Angeles®PST®Ora Standard Pacifico®PDT®Ora Legale Pacifico®©America/Phoenix®MST®Ora Standard Mountain®MST®Ora Standard Mountain®©Etc/GMT®GMT®Ora Meridiano Greenwich®GMT®Ora Meridiano Greenwich®©Asia/Jerusalem®IST®Ora Standard Israele®IDT®Ora Legale Israele®©Europe/Paris®CET®Ora Standard Centrale Europeo®CEST®Ora Legale Centrale Europeo®©
+zoneStrings=Europe/Paris®CET®Ora Standard Centrale Europeo®CEST®Ora Legale Centrale Europeo®©Pacific/Honolulu®HST®Ora Standard Hawaii®HST®Ora Standard Hawaii®©America/Denver®MST®Ora Standard Mountain®MDT®Ora Legale Mountain®©Asia/Jerusalem®IST®Ora Standard Israele®IDT®Ora Legale Israele®©America/Anchorage®AST®Ora Standard Alaska®ADT®Ora Legale Alaska®©Africa/Casablanca®GMT®Ora Meridiano Greenwich®GMT®Ora Meridiano Greenwich®©America/Phoenix®MST®Ora Standard Mountain®MST®Ora Standard Mountain®©America/Los_Angeles®PST®Ora Standard Pacifico®PDT®Ora Legale Pacifico®©America/Chicago®CST®Ora Standard Centrale®CDT®Ora Legale Centrale®©America/Halifax®AST®Ora Standard Atlantico®ADT®Ora Legale Atlantico®©America/St_Johns®CNT®Ora Standard Newfoundland®CDT®Ora Legale Newfoundland®©America/New_York®EST®Ora Standard Orientale®EDT®Ora Legale Orientale®©Asia/Shanghai®CTT®Ora Standard Cina®CDT®Ora Standard Cina®©Asia/Tokyo®JST®Ora Standard Giappone®JST®Ora Standard Giappone®©Europe/Bucharest®EET®Ora Standard Europa Orientale®EEST®Ora Legale Europa Orientale®©America/Indianapolis®EST®Ora Standard Orientale®EST®Ora Standard Orientale®©
territories.TL=Timor Est
territories.TK=Tokelau
territories.TJ=Tagikistan
@@ -825,7 +393,7 @@ territories.FM=Micronesia
territories.RW=Ruanda
territories.FK=Isole Falkland
territories.RU=Federazione Russa
-territories.FJ=Fiji
+territories.FJ=Figi
territories.FI=Finlandia
territories.RO=Romania
territories.RE=R\u00e9union
@@ -858,10 +426,11 @@ territories.PF=Polinesia Francese
territories.CZ=Repubblica Ceca
territories.PE=Per\u00f9
territories.CY=Cipro
-territories.CX=Isola Christmas
+territories.CX=Isola di Christmas
territories.CV=Capo Verde
territories.PA=Panama
territories.CU=Cuba
+territories.CS=Serbia e Montenegro
territories.CR=Costa Rica
territories.CO=Colombia
territories.CN=Cina
@@ -918,31 +487,30 @@ territories.AR=Argentina
territories.AQ=Antartide
territories.MZ=Mozambico
territories.AO=Angola
-territories.MY=Malesia
+territories.MY=Malaysia
territories.AN=Antille Olandesi
territories.MX=Messico
territories.AM=Armenia
territories.MW=Malawi
territories.AL=Albania
territories.MV=Maldive
-territories.ZA=Sud Africa
-territories.MU=Mauritius
+territories.ZA=Sudafrica
+territories.MU=Maurizio
territories.MT=Malta
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauritania
territories.AG=Antigua e Barbuda
-territories.MQ=Martinica
territories.AF=Afghanistan
-territories.MP=Isole Marianne Settentrionali
+territories.MQ=Martinica
territories.AE=Emirati Arabi Uniti
-territories.MO=Regione Amministrativa Speciale di Macao, Cina
+territories.MP=Isole Marianne Settentrionali
territories.AD=Andorra
+territories.MO=Regione Amministrativa Speciale di Macao, Cina
territories.MN=Mongolia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Macedonia, Repubblica
-territories.YU=Yugoslavia
territories.YT=Mayotte
territories.MH=Isole Marshall
territories.MG=Madagascar
@@ -1013,8 +581,8 @@ territories.TR=Turchia
territories.TO=Tonga
territories.TN=Tunisia
territories.TM=Turkmenistan
-languages.gwi=gwich\u02bbin
languages.akk=accado
+languages.gwi=gwich\u02bcin
languages.eka=ekajuka
languages.xh=xosa
languages.sux=sumero
@@ -1026,15 +594,15 @@ languages.pon=ponape
languages.min=menangkabau
languages.suk=sukuma
languages.wo=volof
-languages.lol=lolo (bantu)
languages.kut=kutenai
+languages.lol=lolo (bantu)
languages.mic=micmac
-languages.wa=walloon
+languages.wa=vallone
languages.kum=kumyk
languages.zap=zapotec
languages.cus=cuscitica (altra lingua)
-languages.jbo=lojban
languages.doi=dogri
+languages.jbo=lojban
languages.vo=volap\u00fck
languages.oto=lingue otomi
languages.vi=vietnamita
@@ -1056,8 +624,8 @@ languages.uk=ucraino
languages.egy=egiziano (antico)
languages.ug=uigurico
languages.ssa=nilo-sahariana (altra lingua)
-languages.mga=irlandese medio (900-1200)
languages.bat=baltica (altra lingua)
+languages.mga=irlandese medio (900-1200)
languages.nyo=nyoro
languages.bas=basa
languages.nyn=nyankole
@@ -1085,8 +653,8 @@ languages.kru=kurukh
languages.tg=tagicco
languages.byn=blin
languages.te=telugu
-languages.kro=kru
languages.csb=kashubian
+languages.kro=kru
languages.ta=tamil
languages.tkl=tokelau
languages.efi=efik
@@ -1110,8 +678,8 @@ languages.sk=slovacco
languages.grb=gerbo
languages.si=singalese
languages.sh=serbo-croato
-languages.crh=turco crimeo; tatar crimeo
languages.afa=afro-asiatica (altra lingua)
+languages.crh=turco crimeo; tatar crimeo
languages.sg=sango
languages.se=sami del nord
languages.sd=sindhi
@@ -1121,7 +689,7 @@ languages.sa=sanscrito
languages.rw=kinyarwanda
languages.ru=russo
languages.mdr=mandar
-languages.ro=romeno
+languages.ro=rumeno
languages.rn=rundi
languages.rm=lingua rhaeto-romance
languages.mdf=moksha
@@ -1134,14 +702,14 @@ languages.son=songhai
languages.cpp=creolo e pidgins, basato sul portoghese (altra lingua)
languages.sog=sogdiano
languages.ada=adangme
-languages.kos=Kosraean
-languages.hit=hittite
languages.cpf=creolo e pidgins, basato sul francese (altra lingua)
+languages.hit=hittite
+languages.kos=Kosraean
languages.cpe=creolo e pidgins, basato sull\u2019inglese (altra lingua)
languages.him=himachali
-languages.kok=konkani
-languages.hil=hiligayna
languages.got=gotico
+languages.hil=hiligayna
+languages.kok=konkani
languages.gor=gorontalo
languages.gon=gondi
languages.din=dinca
@@ -1196,7 +764,7 @@ languages.nn=norvegese nynorsk
languages.nl=olandese
languages.ng=ndonga
languages.sla=slavo (altra lingua)
-languages.ne=nepali
+languages.ne=nepalese
languages.nd=ndebele del nord
languages.cmc=lingue chamic
languages.tet=tetum
@@ -1204,32 +772,32 @@ languages.nb=norvegese bokm\u00e5l
languages.na=nauru
languages.ter=tereno
languages.tem=temne
-languages.my=burmese
+languages.my=birmano
languages.lez=lezghian
languages.mt=maltese
languages.peo=antico persiano (600-400 A.C.)
-languages.ms=malay
+languages.ms=malese
languages.mr=marathi
languages.fro=francese, antico (842-ca.1400)
languages.mo=moldavo
-languages.frm=francese, medio (ca.1400-1600)
languages.mn=mongolo
-languages.jrb=giudeo arabo
+languages.frm=francese, medio (ca.1400-1600)
languages.ml=malayalam
+languages.jrb=giudeo arabo
languages.mk=macedone
languages.mi=maori
languages.mh=marshallese
-languages.mg=malagasy
+languages.mg=malgascio
languages.mwr=marwari
languages.bra=braj
-languages.den=slave
languages.lv=lettone
+languages.den=slave
languages.lu=luba-katanga
-languages.del=delaware
languages.lt=lituano
+languages.del=delaware
languages.lo=lao
languages.ln=lingala
-languages.li=limburgish
+languages.li=limburgese
languages.ewo=ewondo
languages.lg=ganda
languages.lb=lussemburghese
@@ -1278,42 +846,42 @@ languages.iu=inuktitut
languages.pap=papiamento
languages.it=italiano
languages.sgn=lingue sign
-languages.is=islandese
languages.kha=khasi
+languages.is=islandese
languages.chr=cherokee
languages.pam=pampanga
languages.pal=pahlavi
languages.chp=chipewyan
-languages.io=ido
languages.cho=choctaw
+languages.io=ido
languages.chn=gergo chinook
languages.chm=mari
languages.tyv=tuvinian
languages.bnt=bantu
languages.pag=pangasinan
-languages.ik=inupiak
languages.chk=chuukese
-languages.ii=sichuan yi
+languages.ik=inupiak
languages.haw=hawaiano
+languages.ii=sichuan yi
languages.lam=lamba
-languages.ig=igbo
languages.chg=ciagataico
+languages.ig=igbo
languages.sga=irlandese, antico (fino al \u2019900)
languages.paa=papuano-australiano (altra lingua)
languages.ie=interlingue
languages.id=indonesiano
languages.lah=lahnda
-languages.day=dayak
languages.chb=chibcha
+languages.day=dayak
languages.ia=interlingua
languages.lad=ladino
-languages.hz=herero
-languages.hai=haida
languages.dar=dargwa
+languages.hai=haida
+languages.hz=herero
languages.hy=armeno
languages.ath=lingue athabaska
languages.hu=ungherese
-languages.ht=haitian
+languages.ht=haitiano
languages.dak=dakota
languages.hr=croato
languages.ho=hiri motu
@@ -1331,9 +899,9 @@ languages.iro=lingue irochesi
languages.gn=guarana
languages.gl=galiziano
languages.arw=aruaco
-languages.gez=geez
-languages.art=artificiale (altra lingua)
languages.gd=gaelico scozzese
+languages.art=artificiale (altra lingua)
+languages.gez=geez
languages.ira=iraniana
languages.ga=irlandese
languages.arp=arapaho
@@ -1342,8 +910,8 @@ languages.fy=frisone
languages.bla=siksika
languages.gem=germanica (altra lingua)
languages.ypk=lingue yupik
-languages.arc=aramaico
languages.fr=francese
+languages.arc=aramaico
languages.fo=faroese
languages.cel=celtica altra lingua
languages.fj=figiano
@@ -1367,9 +935,9 @@ languages.tum=tumbuka
languages.mos=mossi
languages.dz=dzongkha
languages.nic=niger - cordofan (altra lingua)
-languages.lus=lushai
-languages.fiu=ugrofinnica (altra lingua)
languages.dv=divehi
+languages.fiu=ugrofinnica (altra lingua)
+languages.lus=lushai
languages.moh=mohawk
languages.luo=luo (Kenia e Tanzania)
languages.lun=lunda
@@ -1391,8 +959,8 @@ languages.wak=lingue wakash
languages.sat=santali
languages.cy=gallese
languages.sas=sasak
-languages.kbd=kabardia
languages.cv=chuvash
+languages.kbd=kabardia
languages.cu=slavo della Chiesa
languages.mni=manipuri
languages.cs=ceco
@@ -1404,17 +972,17 @@ languages.co=corso
languages.sai=indiano del Sud America (altra lingua)
languages.mnc=manchu
languages.sah=yakut
-languages.kaw=kawi
-languages.inh=ingush
languages.gba=gbaya
+languages.inh=ingush
+languages.kaw=kawi
languages.sad=sandawe
languages.ch=chamorro
-languages.ine=indoeuropea (altra lingua)
languages.bho=bhojpuri
+languages.ine=indoeuropea (altra lingua)
languages.enm=inglese, medio (1100-1500)
-languages.kar=karen
-languages.inc=indiana (altra lingua)
languages.ce=ceceno
+languages.inc=indiana (altra lingua)
+languages.kar=karen
languages.gay=gayo
languages.ca=catalano
languages.umb=mbundu
@@ -1422,19 +990,19 @@ languages.syr=siriaco
languages.kam=kamba
languages.tsi=tsimshian
languages.ang=inglese, antico (ca.450-1100)
-languages.kac=kachin
languages.cau=caucasica (altra lingua)
+languages.kac=kachin
languages.kab=kabyle
-languages.kaa=kara-kalpak
languages.bs=bosniaco
-languages.car=caribico
+languages.kaa=kara-kalpak
languages.br=bretone
+languages.car=caribico
languages.bo=tibetano
languages.bn=bengalese
languages.bm=bambara
languages.gaa=ga
-languages.cai=indiana dell\u2019America Centrale (altra lingua)
languages.bi=bislama
+languages.cai=indiana dell\u2019America Centrale (altra lingua)
languages.bh=bihari
languages.bg=bulgaro
languages.be=bielorusso
@@ -1448,10 +1016,10 @@ languages.az=azerbaigiano
languages.ay=aymara
languages.av=avaro
languages.as=assamese
-languages.dsb=basso sorabo
languages.ar=arabo
-languages.ilo=ilocano
+languages.dsb=basso sorabo
languages.elx=elamitico
+languages.ilo=ilocano
languages.zh=cinese
languages.an=aragonese
languages.pra=pracrito
diff --git a/resource/gnu/java/locale/LocaleInformation_ja.properties b/resource/gnu/java/locale/LocaleInformation_ja.properties
index a01596638..3dfc726ba 100644
--- a/resource/gnu/java/locale/LocaleInformation_ja.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ja.properties
@@ -6,755 +6,258 @@
# This file was automatically generated by gnu.localegen from CLDR.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=\u30e8\u30eb\u30c0\u30f3 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.BOV=\u30dc\u30ea\u30d3\u30a2 Mvdol
-currenciesDisplayName.XAU=\u91d1
-currenciesDisplayName.FOK=\u30d5\u30a7\u30ed\u30fc\u8af8\u5cf6 \u30af\u30ed\u30fc\u30ca
-currenciesDisplayName.LBP=\u30ec\u30d0\u30ce\u30f3 \u30dd\u30f3\u30c9
-currenciesDisplayName.EUR=\u30e6\u30fc\u30ed
-currenciesDisplayName.VND=\u30d9\u30c8\u30ca\u30e0 \u30c9\u30f3
-currenciesDisplayName.TZS=\u30bf\u30f3\u30b6\u30cb\u30a2 \u30b7\u30ea\u30f3\u30b0
-currenciesDisplayName.BOP=\u30dc\u30ea\u30d3\u30a2 \u30da\u30bd
-currenciesDisplayName.KHR=\u30ab\u30f3\u30dc\u30b8\u30a2 \u30ea\u30a8\u30eb
-currenciesDisplayName.XAM=\u30a2\u30b8\u30a2\u901a\u8ca8\u5358\u4f4d (AMU)
-currenciesDisplayName.BOL=\u30dc\u30ea\u30d3\u30a2 \u30dc\u30ea\u30d3\u30a2\u30ce (1863-1962)
-currenciesDisplayName.KHO=\u30ab\u30f3\u30dc\u30b8\u30a2 \u65e7\u30ea\u30a8\u30eb
-currenciesDisplayName.ZMP=\u30b6\u30f3\u30d3\u30a2 \u30dd\u30f3\u30c9
-currenciesDisplayName.AUP=\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2 \u30dd\u30f3\u30c9
-currenciesDisplayName.XAF=CFA \u30d5\u30e9\u30f3 BEAC
-currenciesDisplayName.MTP=\u30de\u30eb\u30bf \u30dd\u30f3\u30c9
-currenciesDisplayName.GHR=\u30ac\u30fc\u30ca \u65b0\u30bb\u30c7\u30a3
-currenciesDisplayName.XAD=\u30a2\u30b8\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb\u52d8\u5b9a\u5358\u4f4d
-currenciesDisplayName.GHP=\u30ac\u30fc\u30ca \u30dd\u30f3\u30c9
-currenciesDisplayName.BOB=\u30dc\u30ea\u30d3\u30a2\u30ce
-currenciesDisplayName.GHO=\u30ac\u30fc\u30ca \u65e7\u30bb\u30c7\u30a3
-currenciesDisplayName.MTL=\u30de\u30eb\u30bf \u30ea\u30e9
-currenciesDisplayName.AUD=\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2 \u30c9\u30eb
-currenciesDisplayName.USS=\u7c73\u30c9\u30eb (\u5f53\u65e5)
-currenciesDisplayName.ITL=\u30a4\u30bf\u30ea\u30a2 \u30ea\u30e9
-currenciesDisplayName.USN=\u7c73\u30c9\u30eb (\u7fcc\u65e5)
-currenciesDisplayName.GHC=\u30ac\u30fc\u30ca \u30bb\u30c7\u30a3
-currenciesDisplayName.SGD=\u30b7\u30f3\u30ac\u30dd\u30fc\u30eb \u30c9\u30eb
-currenciesDisplayName.PAB=\u30d1\u30ca\u30de \u30d0\u30eb\u30dc\u30a2
-currenciesDisplayName.LAK=\u30e9\u30aa\u30b9 \u30ad\u30fc\u30d7
-currenciesDisplayName.KGS=\u30ad\u30eb\u30ae\u30b9\u30bf\u30f3 \u30bd\u30e0
-currenciesDisplayName.CHF=\u30b9\u30a4\u30b9 \u30d5\u30e9\u30f3
-currenciesDisplayName.USD=\u7c73\u30c9\u30eb
-currenciesDisplayName.ETD=\u30a8\u30c1\u30aa\u30d4\u30a2 \u30c9\u30eb
-currenciesDisplayName.BND=\u30d6\u30eb\u30cd\u30a4 \u30c9\u30eb
-currenciesDisplayName.JMP=\u30b8\u30e3\u30de\u30a4\u30ab \u30dd\u30f3\u30c9
-currenciesDisplayName.ETB=\u30a8\u30c1\u30aa\u30d4\u30a2 \u30d6\u30eb
-currenciesDisplayName.DZG=\u30a2\u30eb\u30b8\u30a7\u30ea\u30a2 \u30d5\u30e9\u30f3 (DZG)
-currenciesDisplayName.DZF=\u30a2\u30eb\u30b8\u30a7\u30ea\u30a2 \u65b0\u30d5\u30e9\u30f3
-currenciesDisplayName.DZD=\u30a2\u30eb\u30b8\u30a7\u30ea\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.PYG=\u30d1\u30e9\u30b0\u30a2\u30a4 \u30b0\u30a2\u30e9\u30cb
-currenciesDisplayName.LYP=\u30ea\u30d4\u30a2 \u30dd\u30f3\u30c9
-currenciesDisplayName.JMD=\u30b8\u30e3\u30de\u30a4\u30ab \u30c9\u30eb
-currenciesDisplayName.ISK=\u30a2\u30a4\u30b9\u30e9\u30f3\u30c9 \u30af\u30ed\u30fc\u30ca
-currenciesDisplayName.ESP=\u30b9\u30da\u30a4\u30f3 \u30da\u30bb\u30bf
-currenciesDisplayName.BMP=\u30d0\u30df\u30e5\u30fc\u30c0 \u30dd\u30f3\u30c9
-currenciesDisplayName.LYD=\u30ea\u30d3\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.LYB=\u30ea\u30d3\u30a2 \u30ea\u30e9 (British Military Authority)
-currenciesDisplayName.BMD=\u30d0\u30df\u30e5\u30fc\u30c0 \u30c9\u30eb
-currenciesDisplayName.NLG=\u30aa\u30e9\u30f3\u30c0 \u30ae\u30eb\u30c0\u30fc
-currenciesDisplayName.MRO=\u30e2\u30fc\u30ea\u30bf\u30cb\u30a2 \u30a6\u30ae\u30a2
-currenciesDisplayName.IRR=\u30a4\u30e9\u30f3 \u30ea\u30a2\u30eb
-currenciesDisplayName.SEK=\u30b9\u30a6\u30a7\u30fc\u30c7\u30f3 \u30af\u30ed\u30fc\u30ca
-currenciesDisplayName.ERN=\u30a8\u30ea\u30c8\u30ea\u30a2 \u30ca\u30af\u30d5\u30a1
+currenciesDisplayName.YDD=\u30a4\u30a8\u30e1\u30f3 \u30c7\u30a3\u30ca\u30fc\u30eb
+currenciesDisplayName.TWD=\u65b0\u53f0\u6e7e\u30c9\u30eb
currenciesDisplayName.KES=\u30b1\u30cb\u30a2 \u30b7\u30ea\u30f3\u30b0
-currenciesDisplayName.CFF=\u4e2d\u592e\u30a2\u30d5\u30ea\u30ab\u5171\u548c\u56fd CFA \u30d5\u30e9\u30f3
+currenciesDisplayName.BYB=\u30d9\u30e9\u30eb\u30fc\u30b7 \u30eb\u30fc\u30d6\u30eb (BYB\u30011994-1999)
+currenciesDisplayName.LKR=\u30b9\u30ea\u30e9\u30f3\u30ab \u30eb\u30d4\u30fc
+currenciesDisplayName.RWF=\u30eb\u30ef\u30f3\u30c0 \u30d5\u30e9\u30f3
+currenciesDisplayName.TJS=\u30bf\u30b8\u30ad\u30b9\u30bf\u30f3 \u30bd\u30e2\u30cb
+currenciesDisplayName.SDP=\u30b9\u30fc\u30c0\u30f3 \u30dd\u30f3\u30c9
+currenciesDisplayName.TJR=\u30bf\u30b8\u30ad\u30b9\u30bf\u30f3 \u30eb\u30fc\u30d6\u30eb
+currenciesDisplayName.ERN=\u30a8\u30ea\u30c8\u30ea\u30a2 \u30ca\u30af\u30d5\u30a1
+currenciesDisplayName.AFN=\u30a2\u30d5\u30ac\u30cb\u30fc
+currenciesDisplayName.GRD=\u30ae\u30ea\u30b7\u30e3 \u30c9\u30e9\u30af\u30de
+currenciesDisplayName.IEP=\u30a2\u30a4\u30ea\u30c3\u30b7\u30e5 \u30dd\u30f3\u30c9
currenciesDisplayName.ARS=\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3 \u30da\u30bd
+currenciesDisplayName.SDD=\u30b9\u30fc\u30c0\u30f3 \u30c7\u30a3\u30ca\u30fc\u30eb
currenciesDisplayName.ARP=\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3 \u30da\u30bd (1983-1985)
-currenciesDisplayName.ARM=\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3 \u30da\u30bd (MN)
-currenciesDisplayName.TWD=\u65b0\u53f0\u6e7e\u30c9\u30eb
-currenciesDisplayName.SDP=\u30b9\u30fc\u30c0\u30f3 \u30dd\u30f3\u30c9
currenciesDisplayName.GEL=\u30b0\u30eb\u30b8\u30a2 \u30e9\u30ea
+currenciesDisplayName.AFA=\u30a2\u30d5\u30ac\u30cb\u30fc (1927-2002)
currenciesDisplayName.GEK=\u30b0\u30eb\u30b8\u30a2 \u30af\u30fc\u30dd\u30f3 \u30e9\u30ea
-currenciesDisplayName.MQF=\u30de\u30eb\u30c6\u30a3\u30cb\u30fc\u30af\u5cf6 \u30d5\u30e9\u30f3
+currenciesDisplayName.CRC=\u30b3\u30b9\u30bf\u30ea\u30ab \u30b3\u30ed\u30f3
currenciesDisplayName.FKP=\u30d5\u30a9\u30fc\u30af\u30e9\u30f3\u30c9\uff08\u30de\u30eb\u30d3\u30ca\u30b9\uff09\u8af8\u5cf6 \u30dd\u30f3\u30c9
+currenciesDisplayName.EEK=\u30a8\u30b9\u30c8\u30cb\u30a2 \u30af\u30eb\u30fc\u30f3
+currenciesDisplayName.HKD=\u9999\u6e2f\u30c9\u30eb
+currenciesDisplayName.MDL=\u30e2\u30eb\u30c9\u30d0 \u30ec\u30a4
currenciesDisplayName.ARA=\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3 \u30a2\u30a5\u30b9\u30c8\u30e9\u30fc\u30eb
-currenciesDisplayName.SDD=\u30b9\u30fc\u30c0\u30f3 \u30c7\u30a3\u30ca\u30fc\u30eb
currenciesDisplayName.IQD=\u30a4\u30e9\u30af \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.TVD=\u30c4\u30d0\u30eb \u30c9\u30eb
currenciesDisplayName.SCR=\u30bb\u30a4\u30b7\u30a7\u30eb \u30eb\u30d4\u30fc
+currenciesDisplayName.VUV=\u30d0\u30cc\u30a2\u30c4 \u30d0\u30c4
+currenciesDisplayName.DKK=\u30c7\u30f3\u30de\u30fc\u30af \u30af\u30ed\u30fc\u30cd
+currenciesDisplayName.KPW=\u5317\u671d\u9bae \u30a6\u30a9\u30f3
+currenciesDisplayName.GQE=\u8d64\u9053\u30ae\u30cb\u30a2 \u30ae\u30cb\u30fc
+currenciesDisplayName.IDR=\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2 \u30eb\u30d4\u30a2
currenciesDisplayName.LVR=\u30e9\u30c8\u30d3\u30a2 \u30eb\u30fc\u30d6\u30eb
-currenciesDisplayName.FJP=\u30d5\u30a3\u30b8\u30fc\u8af8\u5cf6 \u30dd\u30f3\u30c9
+currenciesDisplayName.SOS=\u30bd\u30de\u30ea\u30a2 \u30b7\u30ea\u30f3\u30b0
+currenciesDisplayName.AED=UAE \u30c7\u30a3\u30eb\u30cf\u30e0
+currenciesDisplayName.BWP=\u30dc\u30c4\u30ef\u30ca \u30d7\u30e9
currenciesDisplayName.LVL=\u30e9\u30c8\u30d3\u30a2 \u30e9\u30c3\u30c4
-currenciesDisplayName.CDL=\u30b3\u30f3\u30b4 \u30b6\u30a4\u30fc\u30eb
-currenciesDisplayName.CDG=\u30b3\u30f3\u30b4\u5171\u548c\u56fd \u30d5\u30e9\u30f3
-currenciesDisplayName.CDF=\u30b3\u30f3\u30b4 \u30d5\u30e9\u30f3
-currenciesDisplayName.FJD=\u30d5\u30a3\u30b8\u30fc\u8af8\u5cf6 \u30c9\u30eb
+currenciesDisplayName.RUR=\u30ed\u30b7\u30a2 \u30eb\u30fc\u30d6\u30eb (1991-1998)
currenciesDisplayName.NIO=\u30cb\u30ab\u30e9\u30b0\u30a2 \u30b3\u30eb\u30c9\u30d0 \u30aa\u30ed
+currenciesDisplayName.ADP=\u30a2\u30f3\u30c9\u30e9 \u30da\u30bb\u30bf
+currenciesDisplayName.FJD=\u30d5\u30a3\u30b8\u30fc\u8af8\u5cf6 \u30c9\u30eb
currenciesDisplayName.MOP=\u30de\u30ab\u30aa \u30d1\u30bf\u30ab
-currenciesDisplayName.NIG=\u30cb\u30ab\u30e9\u30b0\u30a2 \u30b3\u30eb\u30c9\u30d0 (NIG)
+currenciesDisplayName.RUB=\u30ed\u30b7\u30a2 \u30eb\u30fc\u30d6\u30eb
+currenciesDisplayName.CDF=\u30b3\u30f3\u30b4 \u30d5\u30e9\u30f3
currenciesDisplayName.NIC=\u30cb\u30ab\u30e9\u30b0\u30a2 \u30b3\u30eb\u30c9\u30d0
-currenciesDisplayName.XTR=\u30b3\u30e1\u30b3\u30f3\u632f\u66ff\u30eb\u30fc\u30d6\u30eb
-currenciesDisplayName.FIN=\u30d5\u30a3\u30f3\u30e9\u30f3\u30c9 \u30de\u30eb\u30ab (1860-1962)
-currenciesDisplayName.FIM=\u30d5\u30a3\u30f3\u30e9\u30f3\u30c9 \u30de\u30eb\u30ab
+currenciesDisplayName.DJF=\u30b8\u30d6\u30c1 \u30d5\u30e9\u30f3
+currenciesDisplayName.ECV=\u30a8\u30af\u30a2\u30c9\u30eb UVC
currenciesDisplayName.SBD=\u30bd\u30ed\u30e2\u30f3\u8af8\u5cf6 \u30c9\u30eb
+currenciesDisplayName.UZS=\u30a6\u30ba\u30d9\u30ad\u30b9\u30bf\u30f3 \u30b9\u30e0
+currenciesDisplayName.ECS=\u30a8\u30af\u30a2\u30c9\u30eb \u30b9\u30af\u30ec
+currenciesDisplayName.PHP=\u30d5\u30a3\u30ea\u30d4\u30f3 \u30da\u30bd
+currenciesDisplayName.THB=\u30bf\u30a4 \u30d0\u30fc\u30c4
currenciesDisplayName.LUF=\u30eb\u30af\u30bb\u30f3\u30d6\u30eb\u30b0 \u30d5\u30e9\u30f3
-currenciesDisplayName.TTO=\u30c8\u30ea\u30cb\u30c0\u30fc\u30c9\u30c8\u30d0\u30b4 \u65e7\u30c9\u30eb
-currenciesDisplayName.AOS=\u30a2\u30f3\u30b4\u30e9 \u30a8\u30b9\u30af\u30fc\u30c9
-currenciesDisplayName.AOR=\u30a2\u30f3\u30b4\u30e9 \u65e7\u30af\u30ef\u30f3\u30b6 (1995-1999)
-currenciesDisplayName.MNT=\u30e2\u30f3\u30b4\u30eb \u30c8\u30b0\u30ed\u30b0
-currenciesDisplayName.HUF=\u30cf\u30f3\u30ac\u30ea\u30fc \u30d5\u30a9\u30ea\u30f3\u30c8
-currenciesDisplayName.BIF=\u30d6\u30eb\u30f3\u30b8 \u30d5\u30e9\u30f3
-currenciesDisplayName.AON=\u30a2\u30f3\u30b4\u30e9 \u65b0\u30af\u30ef\u30f3\u30b6 (1990-2000)
-currenciesDisplayName.AOK=\u30af\u30ef\u30f3\u30b6 (1977-1990)
+currenciesDisplayName.FIM=\u30d5\u30a3\u30f3\u30e9\u30f3\u30c9 \u30de\u30eb\u30ab
currenciesDisplayName.TTD=\u30c8\u30ea\u30cb\u30c0\u30fc\u30c9\u30c8\u30d0\u30b4 \u30c9\u30eb
currenciesDisplayName.SZL=\u30b9\u30ef\u30b8\u30e9\u30f3\u30c9 \u30ea\u30e9\u30f3\u30b2\u30cb
-currenciesDisplayName.NHF=\u30cb\u30e5\u30fc\u30d8\u30d6\u30ea\u30c7\u30a3\u30fc\u30ba\u8af8\u5cf6 CFP \u30d5\u30e9\u30f3
-currenciesDisplayName.GBP=\u82f1\u56fd\u30dd\u30f3\u30c9
-currenciesDisplayName.SAS=\u30b5\u30a6\u30b8 \u30ea\u30e4\u30eb (SAS)
+currenciesDisplayName.MNT=\u30e2\u30f3\u30b4\u30eb \u30c8\u30b0\u30ed\u30b0
currenciesDisplayName.SAR=\u30b5\u30a6\u30b8 \u30ea\u30e4\u30eb
+currenciesDisplayName.UAK=\u30a6\u30af\u30e9\u30a4\u30ca \u30ab\u30eb\u30dc\u30d0\u30cd\u30c4
+currenciesDisplayName.UAH=\u30a6\u30af\u30e9\u30a4\u30ca \u30b0\u30ea\u30d6\u30ca
+currenciesDisplayName.HUF=\u30cf\u30f3\u30ac\u30ea\u30fc \u30d5\u30a9\u30ea\u30f3\u30c8
+currenciesDisplayName.COP=\u30b3\u30ed\u30f3\u30d3\u30a2 \u30da\u30bd
+currenciesDisplayName.QAR=\u30ab\u30bf\u30fc\u30eb \u30ea\u30a2\u30eb
currenciesDisplayName.LTT=\u30ea\u30c8\u30a2\u30cb\u30a2 \u30bf\u30ed\u30ca
-currenciesDisplayName.INR=\u30a4\u30f3\u30c9 \u30eb\u30d4\u30fc
currenciesDisplayName.PTE=\u30dd\u30eb\u30c8\u30ac\u30eb \u30a8\u30b9\u30af\u30fc\u30c9
-currenciesDisplayName.AOA=\u30af\u30ef\u30f3\u30b6 (AOA)
-currenciesDisplayName.PTC=\u30dd\u30eb\u30c8\u30ac\u30eb \u30b3\u30f3\u30c8
+currenciesDisplayName.AOR=\u30a2\u30f3\u30b4\u30e9 \u65e7\u30af\u30ef\u30f3\u30b6 (1995-1999)
+currenciesDisplayName.UYU=\u30a6\u30eb\u30b0\u30a2\u30a4 \u30da\u30bd
+currenciesDisplayName.GBP=\u82f1\u56fd\u30dd\u30f3\u30c9
+currenciesDisplayName.BIF=\u30d6\u30eb\u30f3\u30b8 \u30d5\u30e9\u30f3
+currenciesDisplayName.INR=\u30a4\u30f3\u30c9 \u30eb\u30d4\u30fc
+currenciesDisplayName.ZRZ=\u30b6\u30a4\u30fc\u30eb \u30b6\u30a4\u30fc\u30eb
+currenciesDisplayName.AON=\u30a2\u30f3\u30b4\u30e9 \u65b0\u30af\u30ef\u30f3\u30b6 (1990-2000)
currenciesDisplayName.LTL=\u30ea\u30c8\u30a2\u30cb\u30a2 \u30ea\u30bf\u30b9
+currenciesDisplayName.XFU=\u30d5\u30e9\u30f3\u30b9 UIC \u30d5\u30e9\u30f3
currenciesDisplayName.KZT=\u30ab\u30b6\u30d5\u30b9\u30bf\u30f3 \u30c6\u30f3\u30b2
-currenciesDisplayName.KZR=\u30ab\u30b6\u30d5\u30b9\u30bf\u30f3 \u30eb\u30fc\u30d6\u30eb
-currenciesDisplayName.VGD=\u82f1\u9818\u30d0\u30fc\u30b8\u30f3\u8af8\u5cf6 \u30c9\u30eb
-currenciesDisplayName.NGP=\u30ca\u30a4\u30b8\u30a7\u30ea\u30a2 \u30dd\u30f3\u30c9
-currenciesDisplayName.MMX=\u30df\u30e3\u30f3\u30de\u30fc \u30c9\u30eb (FEC)
+currenciesDisplayName.MZM=\u30e2\u30b6\u30f3\u30d4\u30fc\u30af \u30e1\u30c6\u30a3\u30ab\u30eb
+currenciesDisplayName.UYP=\u30a6\u30eb\u30b0\u30a2\u30a4 \u30da\u30bd (1975-1993)
+currenciesDisplayName.AOK=\u30af\u30ef\u30f3\u30b6 (1977-1990)
+currenciesDisplayName.BUK=\u30d3\u30eb\u30de \u30c1\u30e3\u30c3\u30c8
+currenciesDisplayName.GNS=\u30ae\u30cb\u30a2 \u30b7\u30ea\u30fc
+currenciesDisplayName.XFO=\u30d5\u30e9\u30f3\u30b9 \u30d5\u30e9\u30f3 (XFO)
+currenciesDisplayName.PGK=\u30d1\u30d7\u30a2\u30cb\u30e5\u30fc\u30ae\u30cb\u30a2 \u30ad\u30ca
+currenciesDisplayName.SYP=\u30b7\u30ea\u30a2 \u30dd\u30f3\u30c9
+currenciesDisplayName.MZE=\u30e2\u30b6\u30f3\u30d4\u30fc\u30af \u30a8\u30b9\u30af\u30fc\u30c9
+currenciesDisplayName.OMR=\u30aa\u30de\u30fc\u30f3 \u30ea\u30a2\u30eb
currenciesDisplayName.NGN=\u30ca\u30a4\u30b8\u30a7\u30ea\u30a2 \u30ca\u30a4\u30e9
+currenciesDisplayName.ZRN=\u30b6\u30a4\u30fc\u30eb \u65b0\u30b6\u30a4\u30fc\u30eb
+currenciesDisplayName.AOA=\u30af\u30ef\u30f3\u30b6 (AOA)
+currenciesDisplayName.CNY=\u4e2d\u56fd\u4eba\u6c11\u5143
+currenciesDisplayName.MAF=\u30e2\u30ed\u30c3\u30b3 \u30d5\u30e9\u30f3
+currenciesDisplayName.GNF=\u30ae\u30cb\u30a2 \u30d5\u30e9\u30f3
currenciesDisplayName.HTG=\u30cf\u30a4\u30c1 \u30b0\u30fc\u30eb\u30c9
-currenciesDisplayName.SYP=\u30b7\u30ea\u30a2 \u30dd\u30f3\u30c9
-currenciesDisplayName.PSP=\u30d1\u30ec\u30b9\u30c1\u30ca \u30dd\u30f3\u30c9
-currenciesDisplayName.BHD=\u30d0\u30fc\u30ec\u30fc\u30f3 \u30c7\u30a3\u30ca\u30fc\u30eb
+currenciesDisplayName.MAD=\u30e2\u30ed\u30c3\u30b3 \u30c7\u30a3\u30eb\u30cf\u30e0
+currenciesDisplayName.TRY=\u65b0\u30c8\u30eb\u30b3\u30ea\u30e9
currenciesDisplayName.MMK=\u30df\u30e3\u30f3\u30de\u30fc \u30c1\u30e3\u30c3\u30c8
+currenciesDisplayName.MYR=\u30de\u30ec\u30fc\u30b7\u30a2 \u30ea\u30f3\u30ae\u30c3\u30c8
+currenciesDisplayName.LSL=\u30ec\u30bd\u30c8 \u30ed\u30c6\u30a3
+currenciesDisplayName.XEU=\u30e8\u30fc\u30ed\u30c3\u30d1\u901a\u8ca8\u5358\u4f4d
+currenciesDisplayName.BHD=\u30d0\u30fc\u30ec\u30fc\u30f3 \u30c7\u30a3\u30ca\u30fc\u30eb
+currenciesDisplayName.SLL=\u30b7\u30a8\u30e9\u30ec\u30aa\u30cd \u30ec\u30aa\u30f3
+currenciesDisplayName.BTN=\u30d6\u30fc\u30bf\u30f3 \u30cb\u30e5\u30eb\u30bf\u30e0
+currenciesDisplayName.TRL=\u30c8\u30eb\u30b3 \u30ea\u30e9
+currenciesDisplayName.KMF=\u30b3\u30e2\u30ed \u30d5\u30e9\u30f3
currenciesDisplayName.ANG=\u30aa\u30e9\u30f3\u30c0\u9818\u30a2\u30f3\u30c6\u30a3\u30eb \u30ae\u30eb\u30c0\u30fc
currenciesDisplayName.CZK=\u30c1\u30a7\u30b3 \u30b3\u30eb\u30ca
-currenciesDisplayName.IMP=\u30de\u30f3\u5cf6 \u30dd\u30f3\u30c9
-currenciesDisplayName.BGX=\u30d6\u30eb\u30ac\u30ea\u30a2 \u30ec\u30d5 (FEC)
-currenciesDisplayName.LSL=\u30ec\u30bd\u30c8 \u30ed\u30c6\u30a3
-currenciesDisplayName.GAF=\u30ac\u30dc\u30f3 CFA \u30d5\u30e9\u30f3
-currenciesDisplayName.BGO=\u30d6\u30eb\u30ac\u30ea\u30a2 \u30ec\u30d5 (1879-1952)
+currenciesDisplayName.AZM=\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3 \u30de\u30ca\u30c8
+currenciesDisplayName.KYD=\u30b1\u30a4\u30de\u30f3\u8af8\u5cf6 \u30c9\u30eb
+currenciesDisplayName.GMD=\u30ac\u30f3\u30d3\u30a2 \u30c0\u30e9\u30b7
currenciesDisplayName.BGN=\u30d6\u30eb\u30ac\u30ea\u30a2 \u65b0\u30ec\u30d5
-currenciesDisplayName.BGM=\u30d6\u30eb\u30ac\u30ea\u30a2 \u30ec\u30d5 (BGM)
currenciesDisplayName.CAD=\u30ab\u30ca\u30c0 \u30c9\u30eb
+currenciesDisplayName.MXV=\u30e1\u30ad\u30b7\u30b3 UDI
currenciesDisplayName.BGL=\u30d6\u30eb\u30ac\u30ea\u30a2 \u30ec\u30d5 (BGL)
-currenciesDisplayName.TRL=\u30c8\u30eb\u30b3 \u30ea\u30e9
-currenciesDisplayName.KYD=\u30b1\u30a4\u30de\u30f3\u8af8\u5cf6 \u30c9\u30eb
-currenciesDisplayName.CYP=\u30ad\u30d7\u30ed\u30b9 \u30dd\u30f3\u30c9
+currenciesDisplayName.VEB=\u30d9\u30cd\u30ba\u30a8\u30e9 \u30dc\u30ea\u30d0\u30eb
+currenciesDisplayName.MLF=\u30de\u30ea \u30d5\u30e9\u30f3
currenciesDisplayName.ILS=\u30a4\u30b9\u30e9\u30a8\u30eb\u65b0\u30b7\u30a7\u30b1\u30eb
+currenciesDisplayName.MXP=\u30e1\u30ad\u30b7\u30b3 \u30da\u30bd (MXP\u30011861-1992)
+currenciesDisplayName.PES=\u30da\u30eb\u30fc \u30bd\u30eb
currenciesDisplayName.GYD=\u30ac\u30a4\u30a2\u30ca \u30c9\u30eb
-currenciesDisplayName.AMD=\u30a2\u30eb\u30e1\u30cb\u30a2 \u30c9\u30e9\u30e0
+currenciesDisplayName.MXN=\u30e1\u30ad\u30b7\u30b3 \u30da\u30bd
currenciesDisplayName.ILP=\u30a4\u30b9\u30e9\u30a8\u30eb \u30dd\u30f3\u30c9
-currenciesDisplayName.MLF=\u30de\u30ea \u30d5\u30e9\u30f3
-currenciesDisplayName.ILL=\u30a4\u30b9\u30e9\u30a8\u30eb \u30b7\u30a7\u30b1\u30eb
-currenciesDisplayName.VEB=\u30d9\u30cd\u30ba\u30a8\u30e9 \u30dc\u30ea\u30d0\u30eb
-currenciesDisplayName.ALX=\u30a2\u30eb\u30d0\u30cb\u30a2 \u30ec\u30af (f)
+currenciesDisplayName.SKK=\u30b9\u30ed\u30d0\u30ad\u30a2 \u30b3\u30eb\u30ca
+currenciesDisplayName.CYP=\u30ad\u30d7\u30ed\u30b9 \u30dd\u30f3\u30c9
+currenciesDisplayName.XDR=\u7279\u5225\u5f15\u304d\u51fa\u3057\u6a29 (Special Drawing Rights)
+currenciesDisplayName.PEN=\u30da\u30eb\u30fc \u65b0\u30bd\u30eb
currenciesDisplayName.LRD=\u30ea\u30d9\u30ea\u30a2 \u30c9\u30eb
-currenciesDisplayName.ALV=\u30a2\u30eb\u30d0\u30cb\u30a2 \u30ec\u30af (Valute)
+currenciesDisplayName.PEI=\u30da\u30eb\u30fc \u30a4\u30f3\u30c6\u30a3
+currenciesDisplayName.AMD=\u30a2\u30eb\u30e1\u30cb\u30a2 \u30c9\u30e9\u30e0
+currenciesDisplayName.BSD=\u30d0\u30cf\u30de \u30c9\u30eb
currenciesDisplayName.HRK=\u30af\u30ed\u30a2\u30c1\u30a2 \u30af\u30fc\u30ca
-currenciesDisplayName.REF=\u30ec\u30e6\u30cb\u30aa\u30f3\u5cf6 \u30d5\u30e9\u30f3
+currenciesDisplayName.CLP=\u30c1\u30ea \u30da\u30bd
currenciesDisplayName.HRD=\u30af\u30ed\u30a2\u30c1\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.ALL=\u30a2\u30eb\u30d0\u30cb\u30a2 \u30ec\u30af
-currenciesDisplayName.JEP=\u30b8\u30e3\u30fc\u30b8\u30fc\u5cf6 \u30dd\u30f3\u30c9
-currenciesDisplayName.ALK=\u30a2\u30eb\u30d0\u30cb\u30a2 \u30ec\u30af (1946-1961)
-currenciesDisplayName.MKN=\u30de\u30b1\u30c9\u30cb\u30a2 \u30c7\u30ca\u30eb (1992-1993)
-currenciesDisplayName.VDP=\u5317\u30d9\u30c8\u30ca\u30e0 \u30c9\u30f3 (VDP)
-currenciesDisplayName.VDN=\u5317\u30d9\u30c8\u30ca\u30e0 \u65b0\u30c9\u30f3
-currenciesDisplayName.MKD=\u30de\u30b1\u30c9\u30cb\u30a2 \u30c7\u30ca\u30eb
-currenciesDisplayName.VDD=\u5317\u30d9\u30c8\u30ca\u30e0 \u30c9\u30f3 (VDD)
-currenciesDisplayName.TPP=\u30c6\u30a3\u30e2\u30fc\u30eb \u30d1\u30bf\u30ab
currenciesDisplayName.XPF=CFP \u30d5\u30e9\u30f3
-currenciesDisplayName.BEL=\u30d9\u30eb\u30ae\u30fc \u30d5\u30e9\u30f3 (BEL)
-currenciesDisplayName.GWP=\u30ae\u30cb\u30a2\u30d3\u30b5\u30a6 \u30da\u30bd
-currenciesDisplayName.KWD=\u30af\u30a6\u30a7\u30fc\u30c8 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.GWM=\u30dd\u30eb\u30c8\u30ac\u30eb\u9818\u30ae\u30cb\u30a2 \u30df\u30eb\u30ec\u30a4\u30b9
-currenciesDisplayName.BEF=\u30d9\u30eb\u30ae\u30fc \u30d5\u30e9\u30f3
+currenciesDisplayName.FRF=\u30d5\u30e9\u30f3\u30b9 \u30d5\u30e9\u30f3
+currenciesDisplayName.BRR=\u30d6\u30e9\u30b8\u30eb \u30af\u30eb\u30bc\u30a4\u30ed \u30ec\u30a2\u30eb
+currenciesDisplayName.MKD=\u30de\u30b1\u30c9\u30cb\u30a2 \u30c7\u30ca\u30eb
+currenciesDisplayName.CLF=\u30c1\u30ea \u30a6\u30cb\u30c0 \u30c7 \u30d5\u30a9\u30e1\u30f3\u30c8
+currenciesDisplayName.ALL=\u30a2\u30eb\u30d0\u30cb\u30a2 \u30ec\u30af
+currenciesDisplayName.BRN=\u30d6\u30e9\u30b8\u30eb \u65b0\u30af\u30eb\u30bc\u30a4\u30ed (BRN)
+currenciesDisplayName.MWK=\u30de\u30e9\u30a6\u30a3 \u30af\u30ef\u30c1\u30e3
+currenciesDisplayName.BRL=\u30d6\u30e9\u30b8\u30eb \u30ec\u30a2\u30eb
currenciesDisplayName.TPE=\u30c6\u30a3\u30e2\u30fc\u30eb \u30a8\u30b9\u30af\u30fc\u30c9
-currenciesDisplayName.BEC=\u30d9\u30eb\u30ae\u30fc \u30d5\u30e9\u30f3 (BEC)
-currenciesDisplayName.GWE=\u30dd\u30eb\u30c8\u30ac\u30eb\u9818\u30ae\u30cb\u30a2 \u30a8\u30b9\u30af\u30fc\u30c9
+currenciesDisplayName.BRE=\u30d6\u30e9\u30b8\u30eb \u30af\u30eb\u30bc\u30a4\u30ed (BRE\u30011990-1993)
+currenciesDisplayName.BRC=\u30d6\u30e9\u30b8\u30eb \u30af\u30eb\u30bc\u30a4\u30ed (BRC)
+currenciesDisplayName.BRB=\u30d6\u30e9\u30b8\u30eb \u65b0\u30af\u30eb\u30bc\u30a4\u30ed (BRB\u30011967-1986)
+currenciesDisplayName.DEM=\u30c9\u30a4\u30c4 \u30de\u30eb\u30af
+currenciesDisplayName.KWD=\u30af\u30a6\u30a7\u30fc\u30c8 \u30c7\u30a3\u30ca\u30fc\u30eb
+currenciesDisplayName.XCD=\u6771\u30ab\u30ea\u30d6 \u30c9\u30eb
+currenciesDisplayName.NPR=\u30cd\u30d1\u30fc\u30eb \u30eb\u30d4\u30fc
+currenciesDisplayName.GWP=\u30ae\u30cb\u30a2\u30d3\u30b5\u30a6 \u30da\u30bd
+currenciesDisplayName.YUN=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u65b0\u30c7\u30a3\u30ca\u30fc\u30eb (YUN)
currenciesDisplayName.SVC=\u30a8\u30eb\u30b5\u30eb\u30d0\u30c9\u30eb \u30b3\u30ed\u30f3
-currenciesDisplayName.CWG=\u30ad\u30e5\u30e9\u30bd\u30fc\u5cf6 \u30ae\u30eb\u30c0\u30fc
-currenciesDisplayName.BDT=\u30d0\u30f3\u30b0\u30e9\u30c7\u30b7\u30e5 \u30bf\u30ab
-currenciesDisplayName.TOS=\u30c8\u30f3\u30ac \u30dd\u30f3\u30c9
-currenciesDisplayName.TOP=\u30c8\u30f3\u30ac \u30d1\u30fb\u30a2\u30f3\u30ac
+currenciesDisplayName.YUM=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u30b9\u30fc\u30d1\u30fc \u30c7\u30a3\u30ca\u30fc\u30eb
+currenciesDisplayName.BEL=\u30d9\u30eb\u30ae\u30fc \u30d5\u30e9\u30f3 (BEL)
+currenciesDisplayName.SIT=\u30b9\u30ed\u30d9\u30cb\u30a2 \u30c8\u30e9\u30fc\u30eb
+currenciesDisplayName.JPY=\u5186
currenciesDisplayName.XOF=CFA \u30d5\u30e9\u30f3 BCEAO
+currenciesDisplayName.MVR=\u30e2\u30eb\u30c7\u30a3\u30d6\u8af8\u5cf6 \u30eb\u30d5\u30a3\u30a2
+currenciesDisplayName.GWE=\u30dd\u30eb\u30c8\u30ac\u30eb\u9818\u30ae\u30cb\u30a2 \u30a8\u30b9\u30af\u30fc\u30c9
+currenciesDisplayName.BEF=\u30d9\u30eb\u30ae\u30fc \u30d5\u30e9\u30f3
+currenciesDisplayName.TOP=\u30c8\u30f3\u30ac \u30d1\u30fb\u30a2\u30f3\u30ac
+currenciesDisplayName.YUD=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb (YUD)
+currenciesDisplayName.BEC=\u30d9\u30eb\u30ae\u30fc \u30d5\u30e9\u30f3 (BEC)
currenciesDisplayName.SUR=\u30bd\u9023 \u30eb\u30fc\u30d6\u30eb
-currenciesDisplayName.SUN=\u30bd\u9023 \u65b0\u30eb\u30fc\u30d6\u30eb
-currenciesDisplayName.NCF=\u30cb\u30e5\u30fc\u30ab\u30ec\u30c9\u30cb\u30a2 CFP \u30d5\u30e9\u30f3
-currenciesDisplayName.CVE=\u30ab\u30fc\u30dc\u30d9\u30eb\u30c7 \u30a8\u30b9\u30af\u30fc\u30c9
-currenciesDisplayName.XNF=\u4ecf\u9818\u30a2\u30f3\u30c6\u30a3\u30eb\u8af8\u5cf6 CFA \u30d5\u30e9\u30f3
+currenciesDisplayName.ROL=\u30eb\u30fc\u30de\u30cb\u30a2 \u30ec\u30a4
+currenciesDisplayName.DDM=\u6771\u30c9\u30a4\u30c4 \u30de\u30eb\u30af
+currenciesDisplayName.BDT=\u30d0\u30f3\u30b0\u30e9\u30c7\u30b7\u30e5 \u30bf\u30ab
+currenciesDisplayName.XBD=\u30e8\u30fc\u30ed\u30c3\u30d1\u52d8\u5b9a\u5358\u4f4d (EUA-17)
+currenciesDisplayName.AWG=\u30a2\u30eb\u30d0 \u30ae\u30eb\u30c0\u30fc
+currenciesDisplayName.XBC=\u30e8\u30fc\u30ed\u30c3\u30d1\u52d8\u5b9a\u5358\u4f4d (EUA-9)
+currenciesDisplayName.XBB=\u30e8\u30fc\u30ed\u30c3\u30d1\u901a\u8ca8\u5358\u4f4d (EMU-6)
+currenciesDisplayName.XBA=\u30e8\u30fc\u30ed\u30c3\u30d1\u6df7\u5408\u5358\u4f4d (EURCO)
+currenciesDisplayName.NOK=\u30ce\u30eb\u30a6\u30a7\u30fc \u30af\u30ed\u30fc\u30cd
+currenciesDisplayName.MUR=\u30e2\u30fc\u30ea\u30b7\u30e3\u30b9 \u30eb\u30d4\u30fc
currenciesDisplayName.ZAR=\u5357\u30a2\u30d5\u30ea\u30ab \u30e9\u30f3\u30c9
-currenciesDisplayName.DOP=\u30c9\u30df\u30cb\u30ab \u30da\u30bd
-currenciesDisplayName.CUX=\u30ad\u30e5\u30fc\u30d0 (FEC)
-currenciesDisplayName.ZAP=\u5357\u30a2\u30d5\u30ea\u30ab \u30dd\u30f3\u30c9
+currenciesDisplayName.SHP=\u30bb\u30f3\u30c8\u30d8\u30ec\u30ca\u5cf6 \u30dd\u30f3\u30c9
+currenciesDisplayName.XAU=\u91d1
currenciesDisplayName.ZAL=\u5357\u30a2\u30d5\u30ea\u30ab \u30e9\u30f3\u30c9 (ZAL)
+currenciesDisplayName.VND=\u30d9\u30c8\u30ca\u30e0 \u30c9\u30f3
+currenciesDisplayName.TZS=\u30bf\u30f3\u30b6\u30cb\u30a2 \u30b7\u30ea\u30f3\u30b0
+currenciesDisplayName.GIP=\u30b8\u30d6\u30e9\u30eb\u30bf\u30eb \u30dd\u30f3\u30c9
currenciesDisplayName.TND=\u30c1\u30e5\u30cb\u30b8\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.CUP=\u30ad\u30e5\u30fc\u30d0 \u30da\u30bd
-currenciesDisplayName.GUF=\u4ecf\u9818\u30ae\u30a2\u30ca \u30d5\u30e9\u30f3
+currenciesDisplayName.CVE=\u30ab\u30fc\u30dc\u30d9\u30eb\u30c7 \u30a8\u30b9\u30af\u30fc\u30c9
currenciesDisplayName.UGX=\u30a6\u30ac\u30f3\u30c0 \u30b7\u30ea\u30f3\u30b0
-currenciesDisplayName.LNR=\u30bb\u30a4\u30ed\u30f3 \u30eb\u30d4\u30fc
-currenciesDisplayName.AIF=\u30a2\u30d5\u30a1\u30fc\u30eb\u304a\u3088\u3073\u30a4\u30b5\u30b9 \u30d5\u30e9\u30f3
-currenciesDisplayName.VAL=\u30d0\u30c1\u30ab\u30f3 \u30ea\u30e9
-currenciesDisplayName.STE=\u30b5\u30f3\u30c8\u30e1\u30fb\u30d7\u30ea\u30f3\u30b7\u30da \u30a8\u30b9\u30af\u30fc\u30c9
+currenciesDisplayName.JOD=\u30e8\u30eb\u30c0\u30f3 \u30c7\u30a3\u30ca\u30fc\u30eb
+currenciesDisplayName.XAF=CFA \u30d5\u30e9\u30f3 BEAC
+currenciesDisplayName.LBP=\u30ec\u30d0\u30ce\u30f3 \u30dd\u30f3\u30c9
currenciesDisplayName.UGS=\u30a6\u30ac\u30f3\u30c0 \u30b7\u30ea\u30f3\u30b0 (1966-1987)
currenciesDisplayName.STD=\u30b5\u30f3\u30c8\u30e1\u30fb\u30d7\u30ea\u30f3\u30b7\u30da \u30c9\u30d6\u30e9
-currenciesDisplayName.MHD=\u30de\u30fc\u30b7\u30e3\u30eb\u8af8\u5cf6 \u30c9\u30eb
-currenciesDisplayName.NZP=\u30cb\u30e5\u30fc\u30b8\u30fc\u30e9\u30f3\u30c9 \u30dd\u30f3\u30c9
currenciesDisplayName.WST=\u897f\u30b5\u30e2\u30a2 \u30bf\u30e9
-currenciesDisplayName.WSP=\u897f\u30b5\u30e2\u30a2 \u30dd\u30f3\u30c9
-currenciesDisplayName.HNL=\u30db\u30f3\u30b8\u30e5\u30e9\u30b9 \u30ec\u30f3\u30d4\u30e9
-currenciesDisplayName.XMF=\u30d5\u30e9\u30f3\u30b9 \u65b0\u30d5\u30e9\u30f3 (XMF)
+currenciesDisplayName.KHR=\u30ab\u30f3\u30dc\u30b8\u30a2 \u30ea\u30a8\u30eb
+currenciesDisplayName.EUR=\u30e6\u30fc\u30ed
+currenciesDisplayName.DOP=\u30c9\u30df\u30cb\u30ab \u30da\u30bd
+currenciesDisplayName.BOV=\u30dc\u30ea\u30d3\u30a2 Mvdol
+currenciesDisplayName.MTP=\u30de\u30eb\u30bf \u30dd\u30f3\u30c9
+currenciesDisplayName.USS=\u7c73\u30c9\u30eb (\u5f53\u65e5)
+currenciesDisplayName.BOP=\u30dc\u30ea\u30d3\u30a2 \u30da\u30bd
+currenciesDisplayName.MTL=\u30de\u30eb\u30bf \u30ea\u30e9
+currenciesDisplayName.CUP=\u30ad\u30e5\u30fc\u30d0 \u30da\u30bd
currenciesDisplayName.TMM=\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3 \u30de\u30ca\u30c8
-currenciesDisplayName.GTQ=\u30b0\u30a2\u30c6\u30de\u30e9 \u30b1\u30c4\u30a1\u30eb
+currenciesDisplayName.USN=\u7c73\u30c9\u30eb (\u7fcc\u65e5)
+currenciesDisplayName.SGD=\u30b7\u30f3\u30ac\u30dd\u30fc\u30eb \u30c9\u30eb
currenciesDisplayName.NZD=\u30cb\u30e5\u30fc\u30b8\u30fc\u30e9\u30f3\u30c9 \u30c9\u30eb
-currenciesDisplayName.SSP=\u30b9\u30b3\u30c3\u30c8\u30e9\u30f3\u30c9 \u30dd\u30f3\u30c9
-currenciesDisplayName.BBD=\u30d0\u30eb\u30d0\u30c9\u30b9 \u30c9\u30eb
+currenciesDisplayName.USD=\u7c73\u30c9\u30eb
+currenciesDisplayName.HNL=\u30db\u30f3\u30b8\u30e5\u30e9\u30b9 \u30ec\u30f3\u30d4\u30e9
+currenciesDisplayName.BOB=\u30dc\u30ea\u30d3\u30a2\u30ce
+currenciesDisplayName.ITL=\u30a4\u30bf\u30ea\u30a2 \u30ea\u30e9
+currenciesDisplayName.PAB=\u30d1\u30ca\u30de \u30d0\u30eb\u30dc\u30a2
+currenciesDisplayName.GTQ=\u30b0\u30a2\u30c6\u30de\u30e9 \u30b1\u30c4\u30a1\u30eb
+currenciesDisplayName.LAK=\u30e9\u30aa\u30b9 \u30ad\u30fc\u30d7
+currenciesDisplayName.GHC=\u30ac\u30fc\u30ca \u30bb\u30c7\u30a3
+currenciesDisplayName.AUD=\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2 \u30c9\u30eb
currenciesDisplayName.NAD=\u30ca\u30df\u30d3\u30a2 \u30c9\u30eb
+currenciesDisplayName.KGS=\u30ad\u30eb\u30ae\u30b9\u30bf\u30f3 \u30bd\u30e0
currenciesDisplayName.MGF=\u30de\u30c0\u30ac\u30b9\u30ab\u30eb \u30d5\u30e9\u30f3
+currenciesDisplayName.CHF=\u30b9\u30a4\u30b9 \u30d5\u30e9\u30f3
+currenciesDisplayName.BBD=\u30d0\u30eb\u30d0\u30c9\u30b9 \u30c9\u30eb
currenciesDisplayName.MGA=\u30de\u30c0\u30ac\u30b9\u30ab\u30eb \u30a2\u30ea\u30a2\u30ea
-currenciesDisplayName.EGP=\u30a8\u30b8\u30d7\u30c8 \u30dd\u30f3\u30c9
-currenciesDisplayName.BZH=\u82f1\u9818\u30db\u30f3\u30b8\u30e5\u30e9\u30b9 \u30c9\u30eb
+currenciesDisplayName.PYG=\u30d1\u30e9\u30b0\u30a2\u30a4 \u30b0\u30a2\u30e9\u30cb
currenciesDisplayName.PLZ=\u30dd\u30fc\u30e9\u30f3\u30c9 \u30ba\u30a6\u30a9\u30c6\u30a3 (1950-1995)
-currenciesDisplayName.BAN=\u30dc\u30b9\u30cb\u30a2 \u65b0\u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.PLX=\u30dd\u30fc\u30e9\u30f3\u30c9 \u7c73\u30c9\u30eb (FEC)
-currenciesDisplayName.BAM=\u30dc\u30b9\u30cb\u30a2 \u30de\u30eb\u30af (BAM)
-currenciesDisplayName.BZD=\u30d9\u30ea\u30fc\u30ba \u30c9\u30eb
-currenciesDisplayName.BAD=\u30dc\u30b9\u30cb\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.PLN=\u30dd\u30fc\u30e9\u30f3\u30c9 \u30ba\u30a6\u30a9\u30c6\u30a3
currenciesDisplayName.YER=\u30a4\u30a8\u30e1\u30f3 \u30ea\u30a2\u30eb
+currenciesDisplayName.ETB=\u30a8\u30c1\u30aa\u30d4\u30a2 \u30d6\u30eb
+currenciesDisplayName.BND=\u30d6\u30eb\u30cd\u30a4 \u30c9\u30eb
+currenciesDisplayName.JMD=\u30b8\u30e3\u30de\u30a4\u30ab \u30c9\u30eb
+currenciesDisplayName.EGP=\u30a8\u30b8\u30d7\u30c8 \u30dd\u30f3\u30c9
+currenciesDisplayName.PLN=\u30dd\u30fc\u30e9\u30f3\u30c9 \u30ba\u30a6\u30a9\u30c6\u30a3
+currenciesDisplayName.DZD=\u30a2\u30eb\u30b8\u30a7\u30ea\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb
+currenciesDisplayName.ISK=\u30a2\u30a4\u30b9\u30e9\u30f3\u30c9 \u30af\u30ed\u30fc\u30ca
currenciesDisplayName.SRG=\u30b9\u30ea\u30ca\u30e0 \u30ae\u30eb\u30c0\u30fc
-currenciesDisplayName.CSK=\u30c1\u30a7\u30b3\u30b9\u30ed\u30d0\u30ad\u30a2 \u30b3\u30eb\u30ca (CSK)
+currenciesDisplayName.LYD=\u30ea\u30d3\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb
+currenciesDisplayName.BZD=\u30d9\u30ea\u30fc\u30ba \u30c9\u30eb
+currenciesDisplayName.BAM=\u30dc\u30b9\u30cb\u30a2 \u30de\u30eb\u30af (BAM)
+currenciesDisplayName.ESP=\u30b9\u30da\u30a4\u30f3 \u30da\u30bb\u30bf
currenciesDisplayName.KRW=\u97d3\u56fd \u30a6\u30a9\u30f3
+currenciesDisplayName.NLG=\u30aa\u30e9\u30f3\u30c0 \u30ae\u30eb\u30c0\u30fc
+currenciesDisplayName.MRO=\u30e2\u30fc\u30ea\u30bf\u30cb\u30a2 \u30a6\u30ae\u30a2
+currenciesDisplayName.BAD=\u30dc\u30b9\u30cb\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb
+currenciesDisplayName.ZWD=\u30b8\u30f3\u30d0\u30d6\u30a8 \u30c9\u30eb
+currenciesDisplayName.SEK=\u30b9\u30a6\u30a7\u30fc\u30c7\u30f3 \u30af\u30ed\u30fc\u30ca
+currenciesDisplayName.CSK=\u30c1\u30a7\u30b3\u30b9\u30ed\u30d0\u30ad\u30a2 \u30b3\u30eb\u30ca (CSK)
currenciesDisplayName.BYR=\u30d9\u30e9\u30eb\u30fc\u30b7 \u30eb\u30fc\u30d6\u30eb
-currenciesDisplayName.YEI=\u30a4\u30a8\u30e1\u30f3 \u30ea\u30a2\u30eb (YEI)
-currenciesDisplayName.BYL=\u30d9\u30e9\u30eb\u30fc\u30b7 \u30eb\u30fc\u30d6\u30eb (BYL\u30011992-1994)
-currenciesDisplayName.CSC=\u30c1\u30a7\u30b3\u30b9\u30ed\u30d0\u30ad\u30a2 \u30b3\u30eb\u30ca (CSC)
-currenciesDisplayName.KRO=\u97d3\u56fd \u65e7\u30a6\u30a9\u30f3
-currenciesDisplayName.KRH=\u97d3\u56fd \u30db\u30a2\u30f3
-currenciesDisplayName.BYB=\u30d9\u30e9\u30eb\u30fc\u30b7 \u30eb\u30fc\u30d6\u30eb (BYB\u30011994-1999)
-currenciesDisplayName.SQS=\u30bd\u30de\u30ea\u30e9\u30f3\u30c9 \u30b7\u30ea\u30f3\u30b0
-currenciesDisplayName.GRN=\u30ae\u30ea\u30b7\u30e3 \u65b0\u30c9\u30e9\u30af\u30de
+currenciesDisplayName.IRR=\u30a4\u30e9\u30f3 \u30ea\u30a2\u30eb
currenciesDisplayName.PKR=\u30d1\u30ad\u30b9\u30bf\u30f3 \u30eb\u30d4\u30fc
-currenciesDisplayName.AFN=\u30a2\u30d5\u30ac\u30cb\u30fc
-currenciesDisplayName.ZWD=\u30b8\u30f3\u30d0\u30d6\u30a8 \u30c9\u30eb
-currenciesDisplayName.LKR=\u30b9\u30ea\u30e9\u30f3\u30ab \u30eb\u30d4\u30fc
-currenciesDisplayName.GRD=\u30ae\u30ea\u30b7\u30e3 \u30c9\u30e9\u30af\u30de
-currenciesDisplayName.IEP=\u30a2\u30a4\u30ea\u30c3\u30b7\u30e5 \u30dd\u30f3\u30c9
-currenciesDisplayName.AFA=\u30a2\u30d5\u30ac\u30cb\u30fc (1927-2002)
-currenciesDisplayName.YDD=\u30a4\u30a8\u30e1\u30f3 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.RWF=\u30eb\u30ef\u30f3\u30c0 \u30d5\u30e9\u30f3
-currenciesDisplayName.CRC=\u30b3\u30b9\u30bf\u30ea\u30ab \u30b3\u30ed\u30f3
-currenciesDisplayName.TJS=\u30bf\u30b8\u30ad\u30b9\u30bf\u30f3 \u30bd\u30e2\u30cb
-currenciesDisplayName.TJR=\u30bf\u30b8\u30ad\u30b9\u30bf\u30f3 \u30eb\u30fc\u30d6\u30eb
-currenciesDisplayName.EEK=\u30a8\u30b9\u30c8\u30cb\u30a2 \u30af\u30eb\u30fc\u30f3
-currenciesDisplayName.GQP=\u8d64\u9053\u30ae\u30cb\u30a2 \u30da\u30bb\u30bf
-currenciesDisplayName.MDR=\u30e2\u30eb\u30c9\u30d0 \u30ec\u30a4 \u30af\u30fc\u30dd\u30f3
-currenciesDisplayName.HKD=\u9999\u6e2f\u30c9\u30eb
-currenciesDisplayName.DKK=\u30c7\u30f3\u30de\u30fc\u30af \u30af\u30ed\u30fc\u30cd
-currenciesDisplayName.MDL=\u30e2\u30eb\u30c9\u30d0 \u30ec\u30a4
-currenciesDisplayName.GQF=\u8d64\u9053\u30ae\u30cb\u30a2 \u30d5\u30e9\u30f3
-currenciesDisplayName.GQE=\u8d64\u9053\u30ae\u30cb\u30a2 \u30ae\u30cb\u30fc
-currenciesDisplayName.IDR=\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2 \u30eb\u30d4\u30a2
-currenciesDisplayName.AED=UAE \u30c7\u30a3\u30eb\u30cf\u30e0
-currenciesDisplayName.KPW=\u5317\u671d\u9bae \u30a6\u30a9\u30f3
-currenciesDisplayName.IDN=\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2 \u65b0\u30eb\u30d4\u30a2
-currenciesDisplayName.BWP=\u30dc\u30c4\u30ef\u30ca \u30d7\u30e9
-currenciesDisplayName.MDC=\u30e2\u30eb\u30c9\u30d0 \u30ec\u30a4 \u30af\u30fc\u30dd\u30f3
-currenciesDisplayName.IDJ=\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2 \u30b8\u30e3\u30ef \u30eb\u30d4\u30a2
-currenciesDisplayName.KPP=\u5317\u671d\u9bae \u4eba\u6c11\u30a6\u30a9\u30f3
-currenciesDisplayName.IDG=\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2 \u30cb\u30ab\u30ae\u30eb\u30c0\u30fc
-currenciesDisplayName.VUV=\u30d0\u30cc\u30a2\u30c4 \u30d0\u30c4
-currenciesDisplayName.XID=\u30a4\u30b9\u30e9\u30e0 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.SOS=\u30bd\u30de\u30ea\u30a2 \u30b7\u30ea\u30f3\u30b0
-currenciesDisplayName.ADP=\u30a2\u30f3\u30c9\u30e9 \u30da\u30bb\u30bf
-currenciesDisplayName.RUR=\u30ed\u30b7\u30a2 \u30eb\u30fc\u30d6\u30eb (1991-1998)
-currenciesDisplayName.GPF=\u30b0\u30a2\u30c9\u30eb\u30fc\u30d7 \u30d5\u30e9\u30f3
-currenciesDisplayName.DJF=\u30b8\u30d6\u30c1 \u30d5\u30e9\u30f3
-currenciesDisplayName.ADD=\u30a2\u30f3\u30c9\u30e9 \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.MCG=\u30e2\u30ca\u30b3 \u30d5\u30e9\u30f3 (MCG)
-currenciesDisplayName.MCF=\u30e2\u30ca\u30b3 \u30d5\u30e9\u30f3
-currenciesDisplayName.ECV=\u30a8\u30af\u30a2\u30c9\u30eb UVC
-currenciesDisplayName.ECS=\u30a8\u30af\u30a2\u30c9\u30eb \u30b9\u30af\u30ec
-currenciesDisplayName.LIF=\u30ea\u30d2\u30c6\u30f3\u30b7\u30e5\u30bf\u30a4\u30f3 \u30d5\u30e9\u30f3
-currenciesDisplayName.PHP=\u30d5\u30a3\u30ea\u30d4\u30f3 \u30da\u30bd
-currenciesDisplayName.UZS=\u30a6\u30ba\u30d9\u30ad\u30b9\u30bf\u30f3 \u30b9\u30e0
-currenciesDisplayName.COP=\u30b3\u30ed\u30f3\u30d3\u30a2 \u30da\u30bd
-currenciesDisplayName.THB=\u30bf\u30a4 \u30d0\u30fc\u30c4
-currenciesDisplayName.IBP=\u5317\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9 \u30dd\u30f3\u30c9
-currenciesDisplayName.BUR=\u30d3\u30eb\u30de \u30eb\u30d4\u30fc
-currenciesDisplayName.COF=\u30b3\u30f3\u30b4 CFA \u30d5\u30e9\u30f3
-currenciesDisplayName.BUK=\u30d3\u30eb\u30de \u30c1\u30e3\u30c3\u30c8
-currenciesDisplayName.COB=\u30b3\u30ed\u30f3\u30d3\u30a2 \u30da\u30bd (COB)
-currenciesDisplayName.UZC=\u30a6\u30ba\u30d9\u30ad\u30b9\u30bf\u30f3 \u30b9\u30e0 (UZC)
-currenciesDisplayName.UAK=\u30a6\u30af\u30e9\u30a4\u30ca \u30ab\u30eb\u30dc\u30d0\u30cd\u30c4
-currenciesDisplayName.QAR=\u30ab\u30bf\u30fc\u30eb \u30ea\u30a2\u30eb
-currenciesDisplayName.UAH=\u30a6\u30af\u30e9\u30a4\u30ca \u30b0\u30ea\u30d6\u30ca
-currenciesDisplayName.GNS=\u30ae\u30cb\u30a2 \u30b7\u30ea\u30fc
-currenciesDisplayName.CNY=\u4e2d\u56fd\u4eba\u6c11\u5143
-currenciesDisplayName.MZM=\u30e2\u30b6\u30f3\u30d4\u30fc\u30af \u30e1\u30c6\u30a3\u30ab\u30eb
-currenciesDisplayName.CNX=\u4e2d\u56fd \u7c73\u30c9\u30eb (FEC)
-currenciesDisplayName.UYU=\u30a6\u30eb\u30b0\u30a2\u30a4 \u30da\u30bd
-currenciesDisplayName.GNI=\u30ae\u30cb\u30a2 \u30d5\u30e9\u30f3 (1960-1972)
-currenciesDisplayName.SML=\u30b5\u30f3\u30de\u30ea\u30ce \u30ea\u30e9
-currenciesDisplayName.CNP=\u4e2d\u56fd\u4eba\u6c11\u5143
-currenciesDisplayName.MZE=\u30e2\u30b6\u30f3\u30d4\u30fc\u30af \u30a8\u30b9\u30af\u30fc\u30c9
-currenciesDisplayName.GNF=\u30ae\u30cb\u30a2 \u30d5\u30e9\u30f3
-currenciesDisplayName.OMS=\u30aa\u30de\u30fc\u30f3 \u30ea\u30a2\u30eb (OMS)
-currenciesDisplayName.PGK=\u30d1\u30d7\u30a2\u30cb\u30e5\u30fc\u30ae\u30cb\u30a2 \u30ad\u30ca
-currenciesDisplayName.OMR=\u30aa\u30de\u30fc\u30f3 \u30ea\u30a2\u30eb
-currenciesDisplayName.UYP=\u30a6\u30eb\u30b0\u30a2\u30a4 \u30da\u30bd (1975-1993)
-currenciesDisplayName.XFU=\u30d5\u30e9\u30f3\u30b9 UIC \u30d5\u30e9\u30f3
-currenciesDisplayName.BTR=\u30d6\u30fc\u30bf\u30f3 \u30eb\u30d4\u30fc
-currenciesDisplayName.ZRZ=\u30b6\u30a4\u30fc\u30eb \u30b6\u30a4\u30fc\u30eb
-currenciesDisplayName.MAF=\u30e2\u30ed\u30c3\u30b3 \u30d5\u30e9\u30f3
-currenciesDisplayName.MAD=\u30e2\u30ed\u30c3\u30b3 \u30c7\u30a3\u30eb\u30cf\u30e0
-currenciesDisplayName.BTN=\u30d6\u30fc\u30bf\u30f3 \u30cb\u30e5\u30eb\u30bf\u30e0
-currenciesDisplayName.XFO=\u30d5\u30e9\u30f3\u30b9 \u30d5\u30e9\u30f3 (XFO)
-currenciesDisplayName.UYF=\u30a6\u30eb\u30b0\u30a2\u30a4 \u30da\u30bd (UYF)
-currenciesDisplayName.MYR=\u30de\u30ec\u30fc\u30b7\u30a2 \u30ea\u30f3\u30ae\u30c3\u30c8
-currenciesDisplayName.ZRN=\u30b6\u30a4\u30fc\u30eb \u65b0\u30b6\u30a4\u30fc\u30eb
-currenciesDisplayName.AZM=\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3 \u30de\u30ca\u30c8
-currenciesDisplayName.GMP=\u30ac\u30f3\u30d3\u30a2 \u30dd\u30f3\u30c9
-currenciesDisplayName.KMF=\u30b3\u30e2\u30ed \u30d5\u30e9\u30f3
-currenciesDisplayName.SLL=\u30b7\u30a8\u30e9\u30ec\u30aa\u30cd \u30ec\u30aa\u30f3
-currenciesDisplayName.GMD=\u30ac\u30f3\u30d3\u30a2 \u30c0\u30e9\u30b7
-currenciesDisplayName.XEU=\u30e8\u30fc\u30ed\u30c3\u30d1\u901a\u8ca8\u5358\u4f4d
-currenciesDisplayName.BSP=\u30d0\u30cf\u30de \u30dd\u30f3\u30c9
-currenciesDisplayName.CMF=\u30ab\u30e1\u30eb\u30fc\u30f3 CFA \u30d5\u30e9\u30f3
-currenciesDisplayName.MXV=\u30e1\u30ad\u30b7\u30b3 UDI
-currenciesDisplayName.XEF=CFA \u30d5\u30e9\u30f3 (BCEAEC)
-currenciesDisplayName.BSD=\u30d0\u30cf\u30de \u30c9\u30eb
-currenciesDisplayName.MXP=\u30e1\u30ad\u30b7\u30b3 \u30da\u30bd (MXP\u30011861-1992)
-currenciesDisplayName.MXN=\u30e1\u30ad\u30b7\u30b3 \u30da\u30bd
-currenciesDisplayName.PES=\u30da\u30eb\u30fc \u30bd\u30eb
-currenciesDisplayName.GLK=\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9 \u30af\u30ed\u30fc\u30cd
-currenciesDisplayName.BRZ=\u30d6\u30e9\u30b8\u30eb \u30af\u30eb\u30bc\u30a4\u30ed (BRZ\u30011942-1967)
-currenciesDisplayName.PEN=\u30da\u30eb\u30fc \u65b0\u30bd\u30eb
-currenciesDisplayName.CLP=\u30c1\u30ea \u30da\u30bd
-currenciesDisplayName.SKK=\u30b9\u30ed\u30d0\u30ad\u30a2 \u30b3\u30eb\u30ca
-currenciesDisplayName.PEI=\u30da\u30eb\u30fc \u30a4\u30f3\u30c6\u30a3
-currenciesDisplayName.BRR=\u30d6\u30e9\u30b8\u30eb \u30af\u30eb\u30bc\u30a4\u30ed \u30ec\u30a2\u30eb
-currenciesDisplayName.XDR=\u7279\u5225\u5f15\u304d\u51fa\u3057\u6a29 (Special Drawing Rights)
-currenciesDisplayName.FRG=\u30d5\u30e9\u30f3\u30b9 \u30d5\u30e9\u30f3 (Franc Germinal/Franc Poincare)
-currenciesDisplayName.FRF=\u30d5\u30e9\u30f3\u30b9 \u30d5\u30e9\u30f3
-currenciesDisplayName.BRN=\u30d6\u30e9\u30b8\u30eb \u65b0\u30af\u30eb\u30bc\u30a4\u30ed (BRN)
-currenciesDisplayName.CLF=\u30c1\u30ea \u30a6\u30cb\u30c0 \u30c7 \u30d5\u30a9\u30e1\u30f3\u30c8
-currenciesDisplayName.CLE=\u30c1\u30ea \u30a8\u30b9\u30af\u30fc\u30c9
-currenciesDisplayName.BRL=\u30d6\u30e9\u30b8\u30eb \u30ec\u30a2\u30eb
-currenciesDisplayName.CLC=\u30c1\u30ea \u30da\u30bd (CLC)
-currenciesDisplayName.BRE=\u30d6\u30e9\u30b8\u30eb \u30af\u30eb\u30bc\u30a4\u30ed (BRE\u30011990-1993)
-currenciesDisplayName.DES=\u30c9\u30a4\u30c4 \u30de\u30eb\u30af (Sperrmark)
-currenciesDisplayName.MWP=\u30de\u30e9\u30a6\u30a3 \u30dd\u30f3\u30c9
-currenciesDisplayName.BRC=\u30d6\u30e9\u30b8\u30eb \u30af\u30eb\u30bc\u30a4\u30ed (BRC)
-currenciesDisplayName.BRB=\u30d6\u30e9\u30b8\u30eb \u65b0\u30af\u30eb\u30bc\u30a4\u30ed (BRB\u30011967-1986)
-currenciesDisplayName.MWK=\u30de\u30e9\u30a6\u30a3 \u30af\u30ef\u30c1\u30e3
-currenciesDisplayName.PDR=\u6cbf\u30c9\u30cb\u30a8\u30b9\u30c8\u30eb \u30eb\u30fc\u30d6\u30eb (PDR)
-currenciesDisplayName.DEM=\u30c9\u30a4\u30c4 \u30de\u30eb\u30af
-currenciesDisplayName.TDF=\u30c1\u30e3\u30c9 CFA \u30d5\u30e9\u30f3
-currenciesDisplayName.PDN=\u6cbf\u30c9\u30cb\u30a8\u30b9\u30c8\u30eb \u65b0\u30eb\u30fc\u30d6\u30eb (PDN)
-currenciesDisplayName.PDK=\u6cbf\u30c9\u30cb\u30a8\u30b9\u30c8\u30eb \u30eb\u30fc\u30d6\u30eb (PDK)
-currenciesDisplayName.NPR=\u30cd\u30d1\u30fc\u30eb \u30eb\u30d4\u30fc
-currenciesDisplayName.CKD=\u30af\u30c3\u30af\u8af8\u5cf6 \u30c9\u30eb
-currenciesDisplayName.JPY=\u5186
-currenciesDisplayName.MVR=\u30e2\u30eb\u30c7\u30a3\u30d6\u8af8\u5cf6 \u30eb\u30d5\u30a3\u30a2
-currenciesDisplayName.XCF=CFA \u65b0\u30d5\u30e9\u30f3
-currenciesDisplayName.MVP=\u30e2\u30eb\u30c7\u30a3\u30d6\u8af8\u5cf6 \u30eb\u30d4\u30fc
-currenciesDisplayName.XCD=\u6771\u30ab\u30ea\u30d6 \u30c9\u30eb
-currenciesDisplayName.SIT=\u30b9\u30ed\u30d9\u30cb\u30a2 \u30c8\u30e9\u30fc\u30eb
-currenciesDisplayName.YUR=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb (YUR)
-currenciesDisplayName.AWG=\u30a2\u30eb\u30d0 \u30ae\u30eb\u30c0\u30fc
-currenciesDisplayName.YUO=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb (YUO)
-currenciesDisplayName.DDM=\u6771\u30c9\u30a4\u30c4 \u30de\u30eb\u30af
-currenciesDisplayName.YUN=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u65b0\u30c7\u30a3\u30ca\u30fc\u30eb (YUN)
-currenciesDisplayName.YUM=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u30b9\u30fc\u30d1\u30fc \u30c7\u30a3\u30ca\u30fc\u30eb
-currenciesDisplayName.TCC=\u30bf\u30fc\u30af\u30b9\u30fb\u30ab\u30a4\u30b3\u30b9\u8af8\u5cf6 \u30af\u30ed\u30fc\u30f3
-currenciesDisplayName.YUG=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb (YUG)
-currenciesDisplayName.YUF=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb (YUF)
-currenciesDisplayName.RON=\u30eb\u30fc\u30de\u30cb\u30a2 \u65b0\u30ec\u30a4
-currenciesDisplayName.YUD=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2 \u30c7\u30a3\u30ca\u30fc\u30eb (YUD)
-currenciesDisplayName.ROL=\u30eb\u30fc\u30de\u30cb\u30a2 \u30ec\u30a4
-currenciesDisplayName.SIB=\u30b9\u30ed\u30d9\u30cb\u30a2 \u30c8\u30e9\u30fc\u30eb (SIB)
-currenciesDisplayName.NOK=\u30ce\u30eb\u30a6\u30a7\u30fc \u30af\u30ed\u30fc\u30cd
-currenciesDisplayName.MUR=\u30e2\u30fc\u30ea\u30b7\u30e3\u30b9 \u30eb\u30d4\u30fc
-currenciesDisplayName.XBD=\u30e8\u30fc\u30ed\u30c3\u30d1\u52d8\u5b9a\u5358\u4f4d (EUA-17)
-currenciesDisplayName.GIP=\u30b8\u30d6\u30e9\u30eb\u30bf\u30eb \u30dd\u30f3\u30c9
-currenciesDisplayName.VNS=\u30d9\u30c8\u30ca\u30e0\u81ea\u6cbb\u533a \u30c9\u30f3
-currenciesDisplayName.XBC=\u30e8\u30fc\u30ed\u30c3\u30d1\u52d8\u5b9a\u5358\u4f4d (EUA-9)
-currenciesDisplayName.VNR=\u30d9\u30c8\u30ca\u30e0\u5171\u548c\u56fd \u30c9\u30f3
-currenciesDisplayName.XBB=\u30e8\u30fc\u30ed\u30c3\u30d1\u901a\u8ca8\u5358\u4f4d (EMU-6)
-currenciesDisplayName.XBA=\u30e8\u30fc\u30ed\u30c3\u30d1\u6df7\u5408\u5358\u4f4d (EURCO)
-currenciesDisplayName.KID=\u30ad\u30ea\u30d0\u30b9 \u30c9\u30eb
-currenciesDisplayName.SHP=\u30bb\u30f3\u30c8\u30d8\u30ec\u30ca\u5cf6 \u30dd\u30f3\u30c9
-currenciesDisplayName.VNN=\u30d9\u30c8\u30ca\u30e0 \u65b0\u30c9\u30f3
-currenciesSymbol.JOD=JOD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LBP
-currenciesSymbol.VND=\u0111
-currenciesSymbol.TZS=TZS
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=KHR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=BOB
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=MTL
-currenciesSymbol.AUD=AUD
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=SGD
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=KGS
-currenciesSymbol.CHF=CHF
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=ETB
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DZD
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=JMD
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LYD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=BMD
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=MRO
-currenciesSymbol.IRR=IRR
-currenciesSymbol.SEK=SEK
-currenciesSymbol.ERN=ERN
-currenciesSymbol.KES=KES
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=ARS
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=TWD
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GEL=GEL
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
-currenciesSymbol.IQD=IQD
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SCR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=FJD
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
-currenciesSymbol.SBD=SBD
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=MNT
-currenciesSymbol.HUF=HUF
-currenciesSymbol.BIF=BIF
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
-currenciesSymbol.TTD=TTD
-currenciesSymbol.SZL=SZL
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
-currenciesSymbol.SAR=SAR
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=KZT
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=SYP
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BHD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=ANG
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=LSL
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=CAD
-currenciesSymbol.BGL=BGL
-currenciesSymbol.TRL=TRL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=CYP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=GYD
-currenciesSymbol.AMD=AMD
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=VEB
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=ALL
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MKD
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=XPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KWD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BEF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
-currenciesSymbol.BDT=BDT
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=TOP
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
-currenciesSymbol.CVE=CVE
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=ZAR
-currenciesSymbol.DOP=DOP
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=UGX
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=STD
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
-currenciesSymbol.HNL=HNL
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
-currenciesSymbol.GTQ=GTQ
-currenciesSymbol.NZD=NZD
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BBD
-currenciesSymbol.NAD=NAD
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=BAM
-currenciesSymbol.BZD=BZD
-currenciesSymbol.BAD=BAD
-currenciesSymbol.PLN=PLN
-currenciesSymbol.YER=YER
-currenciesSymbol.SRG=SRG
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=\uffe6
-currenciesSymbol.BYR=BYR
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=PKR
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=ZWD
-currenciesSymbol.LKR=LKR
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IEP
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=CRC
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HKD
-currenciesSymbol.DKK=DKK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=IDR
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VUV
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=SOS
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DJF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=COP
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QAR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=CNY
-currenciesSymbol.MZM=MZM
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=UYU
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
-currenciesSymbol.GNF=GNF
-currenciesSymbol.OMR=OMR
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=BTN
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=MYR
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
-currenciesSymbol.KMF=KMF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MXN
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=CLP
-currenciesSymbol.SKK=SKK
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=BRL
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=NPR
-currenciesSymbol.CKD=CKD
+currenciesDisplayName.BMD=\u30d0\u30df\u30e5\u30fc\u30c0 \u30c9\u30eb
+currenciesSymbol.INR=\u30a4\u30f3\u30c9 \u30eb\u30d4\u30fc
currenciesSymbol.JPY=\uffe5
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
+currenciesSymbol.KRW=\uffe6
+currenciesSymbol.VND=\u0111
+currenciesSymbol.CNY=\u4e2d\u56fd \u5143
currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=ROL
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NOK
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.MWK=MK
+currenciesSymbol.AFN=Af
+shortMonths=1 \u6708®2 \u6708®3 \u6708®4 \u6708®5 \u6708®6 \u6708®7 \u6708®8 \u6708®9 \u6708®10 \u6708®11 \u6708®12 \u6708®®
months=1\u6708®2\u6708®3\u6708®4\u6708®5\u6708®6\u6708®7\u6708®8\u6708®9\u6708®10\u6708®11\u6708®12\u6708®®
shortWeekdays=®\u65e5®\u6708®\u706b®\u6c34®\u6728®\u91d1®\u571f®
weekdays=®\u65e5\u66dc\u65e5®\u6708\u66dc\u65e5®\u706b\u66dc\u65e5®\u6c34\u66dc\u65e5®\u6728\u66dc\u65e5®\u91d1\u66dc\u65e5®\u571f\u66dc\u65e5®
@@ -767,7 +270,7 @@ shortTimeFormat=H:mm
mediumTimeFormat=H:mm:ss
longTimeFormat=H:mm:ss:z
fullTimeFormat=H'\u6642'mm'\u5206'ss'\u79d2'z
-zoneStrings=America/Indianapolis®EST®\u6771\u90e8\u6a19\u6e96\u6642®EST®\u6771\u90e8\u6a19\u6e96\u6642®©America/Halifax®AST®\u5927\u897f\u6d0b\u6a19\u6e96\u6642®ADT®\u5927\u897f\u6d0b\u590f\u6642\u9593®©Pacific/Honolulu®HST®\u30cf\u30ef\u30a4\u6a19\u6e96\u6642®HST®\u30cf\u30ef\u30a4\u6a19\u6e96\u6642®©America/Denver®MST®\u5c71\u5730\u6a19\u6e96\u6642®MDT®\u5c71\u5730\u590f\u6642\u9593®©America/Anchorage®AST®\u30a2\u30e9\u30b9\u30ab\u6a19\u6e96\u6642®ADT®\u30a2\u30e9\u30b9\u30ab\u590f\u6642\u9593®©America/St_Johns®CNT®\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u5cf6\u6a19\u6e96\u6642®CDT®\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u5cf6\u590f\u6642\u9593®©Africa/Casablanca®GMT®\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642®GMT®\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642®©America/Chicago®CST®\u4e2d\u90e8\u6a19\u6e96\u6642®CDT®\u4e2d\u90e8\u590f\u6642\u9593®©Asia/Shanghai®CTT®\u4e2d\u56fd\u6a19\u6e96\u6642®CDT®\u4e2d\u56fd\u6a19\u6e96\u6642®©Asia/Tokyo®JST®\u65e5\u672c\u6a19\u6e96\u6642®JST®\u65e5\u672c\u6a19\u6e96\u6642®©America/New_York®EST®\u6771\u90e8\u6a19\u6e96\u6642®EDT®\u6771\u90e8\u590f\u6642\u9593®©Europe/Bucharest®EET®\u6771\u6b27\u6a19\u6e96\u6642®EEST®\u6771\u6b27\u590f\u6642\u9593®©America/Los_Angeles®PST®\u592a\u5e73\u6d0b\u6a19\u6e96\u6642®PDT®\u592a\u5e73\u6d0b\u590f\u6642\u9593®©America/Phoenix®MST®\u5c71\u5730\u6a19\u6e96\u6642®MST®\u5c71\u5730\u6a19\u6e96\u6642®©Etc/GMT®GMT®\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642®GMT®\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642®©Asia/Jerusalem®IST®\u30a4\u30b9\u30e9\u30a8\u30eb\u6a19\u6e96\u6642®IDT®\u30a4\u30b9\u30e9\u30a8\u30eb\u590f\u6642\u9593®©Europe/Paris®CET®\u4e2d\u6b27\u6a19\u6e96\u6642®CEST®\u4e2d\u6b27\u590f\u6642\u9593®©
+zoneStrings=America/Halifax®AST®\u5927\u897f\u6d0b\u6a19\u6e96\u6642®ADT®\u5927\u897f\u6d0b\u590f\u6642\u9593®©America/Indianapolis®EST®\u6771\u90e8\u6a19\u6e96\u6642®EST®\u6771\u90e8\u6a19\u6e96\u6642®©Europe/Paris®CET®\u4e2d\u6b27\u6a19\u6e96\u6642®CEST®\u4e2d\u6b27\u590f\u6642\u9593®©America/Phoenix®MST®\u5c71\u5730\u6a19\u6e96\u6642®MST®\u5c71\u5730\u6a19\u6e96\u6642®©America/Los_Angeles®PST®\u592a\u5e73\u6d0b\u6a19\u6e96\u6642®PDT®\u592a\u5e73\u6d0b\u590f\u6642\u9593®©Pacific/Honolulu®HST®\u30cf\u30ef\u30a4\u6a19\u6e96\u6642®HST®\u30cf\u30ef\u30a4\u6a19\u6e96\u6642®©America/Denver®MST®\u5c71\u5730\u6a19\u6e96\u6642®MDT®\u5c71\u5730\u590f\u6642\u9593®©Europe/Bucharest®EET®\u6771\u6b27\u6a19\u6e96\u6642®EEST®\u6771\u6b27\u590f\u6642\u9593®©America/New_York®EST®\u6771\u90e8\u6a19\u6e96\u6642®EDT®\u6771\u90e8\u590f\u6642\u9593®©Asia/Tokyo®JST®\u65e5\u672c\u6a19\u6e96\u6642®JST®\u65e5\u672c\u6a19\u6e96\u6642®©America/Anchorage®AST®\u30a2\u30e9\u30b9\u30ab\u6a19\u6e96\u6642®ADT®\u30a2\u30e9\u30b9\u30ab\u590f\u6642\u9593®©Asia/Shanghai®CTT®\u4e2d\u56fd\u6a19\u6e96\u6642®CDT®\u4e2d\u56fd\u6a19\u6e96\u6642®©America/Chicago®CST®\u4e2d\u90e8\u6a19\u6e96\u6642®CDT®\u4e2d\u90e8\u590f\u6642\u9593®©Africa/Casablanca®GMT®\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642®GMT®\u30b0\u30ea\u30cb\u30c3\u30b8\u6a19\u6e96\u6642®©America/St_Johns®CNT®\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u5cf6\u6a19\u6e96\u6642®CDT®\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u5cf6\u590f\u6642\u9593®©Asia/Jerusalem®IST®\u30a4\u30b9\u30e9\u30a8\u30eb\u6a19\u6e96\u6642®IDT®\u30a4\u30b9\u30e9\u30a8\u30eb\u590f\u6642\u9593®©
territories.TL=\u6771\u30c6\u30a3\u30e2\u30fc\u30eb
territories.TK=\u30c8\u30b1\u30e9\u30a6\u8af8\u5cf6
territories.TJ=\u30bf\u30b8\u30ad\u30b9\u30bf\u30f3
@@ -781,7 +284,7 @@ territories.GW=\u30ae\u30cb\u30a2\u30d3\u30b5\u30a6
territories.GU=\u30b0\u30a2\u30e0\u5cf6
territories.GT=\u30b0\u30a2\u30c6\u30de\u30e9
territories.GS=\u5357\u30b8\u30e7\u30fc\u30b8\u30a2\u5cf6\u30fb\u5357\u30b5\u30f3\u30c9\u30a4\u30c3\u30c1\u8af8\u5cf6
-territories.GR=\u30ae\u30ea\u30b7\u30a2
+territories.GR=\u30ae\u30ea\u30b7\u30e3
territories.GQ=\u8d64\u9053\u30ae\u30cb\u30a2
territories.GP=\u30b0\u30a2\u30c9\u30eb\u30fc\u30d7
territories.SZ=\u30b9\u30ef\u30b8\u30e9\u30f3\u30c9
@@ -790,7 +293,9 @@ territories.GN=\u30ae\u30cb\u30a2
territories.GM=\u30ac\u30f3\u30d3\u30a2
territories.GL=\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9
territories.SV=\u30a8\u30eb\u30b5\u30eb\u30d0\u30c9\u30eb
+territories.062=\u5357\u4e2d\u592e\u30a2\u30b8\u30a2
territories.ST=\u30b5\u30f3\u30c8\u30e1\u30fb\u30d7\u30ea\u30f3\u30b7\u30da
+territories.061=\u30dd\u30ea\u30cd\u30b7\u30a2
territories.GI=\u30b8\u30d6\u30e9\u30eb\u30bf\u30eb
territories.GH=\u30ac\u30fc\u30ca
territories.SR=\u30b9\u30ea\u30ca\u30e0
@@ -814,9 +319,12 @@ territories.SC=\u30bb\u30a4\u30b7\u30a7\u30eb
territories.SB=\u30bd\u30ed\u30e2\u30f3\u8af8\u5cf6
territories.SA=\u30b5\u30a6\u30b8\u30a2\u30e9\u30d3\u30a2
territories.FR=\u30d5\u30e9\u30f3\u30b9
+territories.057=\u30df\u30af\u30ed\u30cd\u30b7\u30a2
territories.FO=\u30d5\u30a7\u30ed\u30fc\u8af8\u5cf6
territories.FM=\u30df\u30af\u30ed\u30cd\u30b7\u30a2
territories.RW=\u30eb\u30ef\u30f3\u30c0
+territories.054=\u30e1\u30e9\u30cd\u30b7\u30a2
+territories.053=\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2\u304a\u3088\u3073\u30cb\u30e5\u30fc\u30b8\u30fc\u30e9\u30f3\u30c9
territories.FK=\u30d5\u30a9\u30fc\u30af\u30e9\u30f3\u30c9\u8af8\u5cf6
territories.RU=\u30ed\u30b7\u30a2
territories.FJ=\u30d5\u30a3\u30b8\u30fc
@@ -826,20 +334,26 @@ territories.RE=\u30ec\u30e6\u30cb\u30aa\u30f3\u5cf6
territories.ET=\u30a8\u30c1\u30aa\u30d4\u30a2
territories.ES=\u30b9\u30da\u30a4\u30f3
territories.ER=\u30a8\u30ea\u30c8\u30ea\u30a2
+territories.833=\u30de\u30f3\u5cf6
territories.EH=\u897f\u30b5\u30cf\u30e9
territories.EG=\u30a8\u30b8\u30d7\u30c8
+territories.830=\u30c1\u30e3\u30cd\u30eb\u8af8\u5cf6
territories.EE=\u30a8\u30b9\u30c8\u30cb\u30a2
+territories.QO=\u305d\u306e\u4ed6\u306e\u30aa\u30bb\u30a2\u30cb\u30a2
territories.EC=\u30a8\u30af\u30a2\u30c9\u30eb
territories.DZ=\u30a2\u30eb\u30b8\u30a7\u30ea\u30a2
territories.QA=\u30ab\u30bf\u30fc\u30eb
+territories.039=\u5357\u30e8\u30fc\u30ed\u30c3\u30d1
territories.DO=\u30c9\u30df\u30cb\u30ab\u5171\u548c\u56fd
territories.PY=\u30d1\u30e9\u30b0\u30a2\u30a4
+territories.035=\u6771\u5357\u30a2\u30b8\u30a2
territories.DM=\u30c9\u30df\u30cb\u30ab\u56fd
territories.PW=\u30d1\u30e9\u30aa
territories.DK=\u30c7\u30f3\u30de\u30fc\u30af
territories.DJ=\u30b8\u30d6\u30c1
territories.PT=\u30dd\u30eb\u30c8\u30ac\u30eb
territories.PS=\u30d1\u30ec\u30b9\u30c1\u30ca
+territories.030=\u6771\u30a2\u30b8\u30a2
territories.PR=\u30d7\u30a8\u30eb\u30c8\u30ea\u30b3
territories.DE=\u30c9\u30a4\u30c4
territories.PN=\u30d4\u30c8\u30b1\u30a2\u30f3\u5cf6
@@ -856,13 +370,16 @@ territories.CX=\u30af\u30ea\u30b9\u30de\u30b9\u5cf6
territories.CV=\u30ab\u30fc\u30dc\u30d9\u30eb\u30c7
territories.PA=\u30d1\u30ca\u30de
territories.CU=\u30ad\u30e5\u30fc\u30d0
+territories.CS=\u30bb\u30eb\u30d3\u30a2\u30fb\u30e2\u30f3\u30c6\u30cd\u30b0\u30ed
territories.CR=\u30b3\u30b9\u30bf\u30ea\u30ab
+territories.029=\u30ab\u30ea\u30d6\u6d77
territories.CO=\u30b3\u30ed\u30f3\u30d3\u30a2
territories.CN=\u4e2d\u56fd
territories.CM=\u30ab\u30e1\u30eb\u30fc\u30f3
territories.CL=\u30c1\u30ea
territories.CK=\u30af\u30c3\u30af\u8af8\u5cf6
territories.CI=\u30b3\u30fc\u30c8\u30b8\u30dc\u30a2\u30fc\u30eb
+territories.021=\u5317\u30a2\u30e1\u30ea\u30ab
territories.CH=\u30b9\u30a4\u30b9
territories.CG=\u30b3\u30f3\u30b4
territories.CF=\u4e2d\u592e\u30a2\u30d5\u30ea\u30ab\u5171\u548c\u56fd
@@ -877,13 +394,20 @@ territories.BV=\u30d6\u30fc\u30d9\u5cf6
territories.BT=\u30d6\u30fc\u30bf\u30f3
territories.BS=\u30d0\u30cf\u30de
territories.BR=\u30d6\u30e9\u30b8\u30eb
+territories.019=\u30a2\u30e1\u30ea\u30ab\u5927\u9678
+territories.018=\u5357\u30a2\u30d5\u30ea\u30ab
territories.NZ=\u30cb\u30e5\u30fc\u30b8\u30fc\u30e9\u30f3\u30c9
territories.BO=\u30dc\u30ea\u30d3\u30a2
+territories.017=\u4e2d\u90e8\u30a2\u30d5\u30ea\u30ab
territories.BN=\u30d6\u30eb\u30cd\u30a4
territories.BM=\u30d0\u30fc\u30df\u30e5\u30fc\u30c0
+territories.015=\u5317\u30a2\u30d5\u30ea\u30ab
+territories.014=\u6771\u30a2\u30d5\u30ea\u30ab
+territories.013=\u4e2d\u592e\u30a2\u30e1\u30ea\u30ab
territories.NU=\u30cb\u30a6\u30a8\u5cf6
territories.BJ=\u30d9\u30cb\u30f3
territories.BI=\u30d6\u30eb\u30f3\u30b8
+territories.011=\u897f\u30a2\u30d5\u30ea\u30ab
territories.BH=\u30d0\u30fc\u30ec\u30fc\u30f3
territories.NR=\u30ca\u30a6\u30eb
territories.BG=\u30d6\u30eb\u30ac\u30ea\u30a2
@@ -901,6 +425,7 @@ territories.NG=\u30ca\u30a4\u30b8\u30a7\u30ea\u30a2
territories.NF=\u30ce\u30fc\u30d5\u30a9\u30fc\u30af\u5cf6
territories.AZ=\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3
territories.NE=\u30cb\u30b8\u30a7\u30fc\u30eb
+territories.AX=\u30aa\u30fc\u30e9\u30f3\u30c9\u8af8\u5cf6
territories.NC=\u30cb\u30e5\u30fc\u30ab\u30ec\u30c9\u30cb\u30a2
territories.AW=\u30a2\u30eb\u30d0\u5cf6
territories.ZM=\u30b6\u30f3\u30d3\u30a2
@@ -909,19 +434,23 @@ territories.AU=\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2
territories.AT=\u30aa\u30fc\u30b9\u30c8\u30ea\u30a2
territories.AS=\u7c73\u9818\u30b5\u30e2\u30a2
territories.AR=\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3
+territories.009=\u30aa\u30bb\u30a2\u30cb\u30a2
territories.AQ=\u5357\u6975\u5927\u9678
territories.MZ=\u30e2\u30b6\u30f3\u30d3\u30fc\u30af
territories.AO=\u30a2\u30f3\u30b4\u30e9
territories.MY=\u30de\u30ec\u30fc\u30b7\u30a2
territories.AN=\u30aa\u30e9\u30f3\u30c0\u9818\u30a2\u30f3\u30c6\u30a3\u30eb\u8af8\u5cf6
territories.MX=\u30e1\u30ad\u30b7\u30b3
+territories.005=\u5357\u30a2\u30e1\u30ea\u30ab
territories.AM=\u30a2\u30eb\u30e1\u30cb\u30a2
territories.MW=\u30de\u30e9\u30a6\u30a3
territories.AL=\u30a2\u30eb\u30d0\u30cb\u30a2
territories.MV=\u30e2\u30eb\u30b8\u30d6
territories.ZA=\u5357\u30a2\u30d5\u30ea\u30ab
territories.MU=\u30e2\u30fc\u30ea\u30b7\u30e3\u30b9
+territories.002=\u30a2\u30d5\u30ea\u30ab
territories.MT=\u30de\u30eb\u30bf
+territories.001=\u4e16\u754c
territories.AI=\u30a2\u30f3\u30ae\u30e9
territories.MS=\u30e2\u30f3\u30c8\u30bb\u30e9\u30c8\u5cf6
territories.MR=\u30e2\u30fc\u30ea\u30bf\u30cb\u30a2
@@ -936,7 +465,6 @@ territories.MN=\u30e2\u30f3\u30b4\u30eb
territories.MM=\u30df\u30e3\u30f3\u30de\u30fc
territories.ML=\u30de\u30ea
territories.MK=\u30de\u30b1\u30c9\u30cb\u30a2
-territories.YU=\u30e6\u30fc\u30b4\u30b9\u30e9\u30d3\u30a2
territories.YT=\u30de\u30e8\u30c3\u30c8\u5cf6
territories.MH=\u30de\u30fc\u30b7\u30e3\u30eb\u8af8\u5cf6\u5171\u548c\u56fd
territories.MG=\u30de\u30c0\u30ac\u30b9\u30ab\u30eb
@@ -946,10 +474,14 @@ territories.MA=\u30e2\u30ed\u30c3\u30b3
territories.YE=\u30a4\u30a8\u30e1\u30f3
territories.LY=\u30ea\u30d3\u30a2
territories.LV=\u30e9\u30c8\u30d3\u30a2
+territories.155=\u897f\u30e8\u30fc\u30ed\u30c3\u30d1
territories.LU=\u30eb\u30af\u30bb\u30f3\u30d6\u30eb\u30b0
+territories.154=\u5317\u30e8\u30fc\u30ed\u30c3\u30d1
territories.LT=\u30ea\u30c8\u30a2\u30cb\u30a2
territories.LS=\u30ec\u30bd\u30c8
territories.LR=\u30ea\u30d9\u30ea\u30a2
+territories.151=\u6771\u30e8\u30fc\u30ed\u30c3\u30d1
+territories.150=\u30e8\u30fc\u30ed\u30c3\u30d1
territories.LK=\u30b9\u30ea\u30e9\u30f3\u30ab
territories.LI=\u30ea\u30d2\u30c6\u30f3\u30b7\u30e5\u30bf\u30a4\u30f3
territories.LC=\u30bb\u30f3\u30c8\u30eb\u30b7\u30a2
@@ -958,6 +490,8 @@ territories.LA=\u30e9\u30aa\u30b9
territories.KZ=\u30ab\u30b6\u30d5\u30b9\u30bf\u30f3
territories.KY=\u30b1\u30a4\u30de\u30f3\u8af8\u5cf6
territories.KW=\u30af\u30a6\u30a7\u30fc\u30c8
+territories.145=\u897f\u30a2\u30b8\u30a2
+territories.142=\u30a2\u30b8\u30a2
territories.KR=\u5927\u97d3\u6c11\u56fd
territories.KP=\u671d\u9bae\u6c11\u4e3b\u4e3b\u7fa9\u4eba\u6c11\u5171\u548c\u56fd
territories.KN=\u30bb\u30f3\u30c8\u30af\u30ea\u30b9\u30c8\u30d5\u30a1\u30fc\u30fb\u30cd\u30a4\u30d3\u30b9
@@ -1007,8 +541,8 @@ territories.TR=\u30c8\u30eb\u30b3
territories.TO=\u30c8\u30f3\u30ac
territories.TN=\u30c1\u30e5\u30cb\u30b8\u30a2
territories.TM=\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3
-languages.gwi=\u30af\u30c1\u30f3\u8a9e
languages.akk=\u30a2\u30c3\u30ab\u30c9\u8a9e
+languages.gwi=\u30af\u30c1\u30f3\u8a9e
languages.eka=\u30a8\u30ab\u30b8\u30e5\u30af\u8a9e
languages.ijo=\u30a4\u30b8\u30e7\u30fc\u8a9e
languages.xh=\u30b3\u30b5\u8a9e
@@ -1021,15 +555,15 @@ languages.pon=\u30dd\u30f3\u30da\u30a4\u8a9e
languages.min=\u30df\u30ca\u30f3\u30ab\u30d0\u30a6\u8a9e
languages.suk=\u30b9\u30af\u30de\u8a9e
languages.wo=\u30a6\u30a9\u30ed\u30d5\u8a9e
-languages.lol=\u30e2\u30f3\u30b4\u8a9e
languages.kut=\u30af\u30c6\u30ca\u30a4\u8a9e
+languages.lol=\u30e2\u30f3\u30b4\u8a9e
languages.mic=\u30df\u30af\u30de\u30af\u8a9e
languages.wa=\u30ef\u30ed\u30f3\u8a9e
languages.kum=\u30af\u30e0\u30af\u8a9e
languages.zap=\u30b6\u30dd\u30c6\u30c3\u30af\u8a9e
languages.cus=\u30af\u30b7\u30e5\u8af8\u8a9e
-languages.jbo=Lojban\u8a9e
languages.doi=\u30c9\u30b0\u30ea\u8a9e
+languages.jbo=Lojban\u8a9e
languages.vo=\u30dc\u30e9\u30d4\u30e5\u30af\u8a9e
languages.oto=\u30aa\u30c8\u30df\u8a9e\u65cf
languages.vi=\u30d9\u30c8\u30ca\u30e0\u8a9e
@@ -1053,8 +587,8 @@ languages.egy=\u53e4\u4ee3\u30a8\u30b8\u30d7\u30c8\u8a9e
languages.ug=\u30a6\u30a4\u30b0\u30eb\u8a9e
languages.fan=\u30d5\u30a1\u30f3\u30b0\u8a9e
languages.ssa=\u30ca\u30a4\u30eb\u30fb\u30b5\u30cf\u30e9\u8af8\u8a9e
-languages.mga=\u4e2d\u671f\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u8a9e (900-1200)
languages.bat=\u30d0\u30eb\u30c8\u8af8\u8a9e
+languages.mga=\u4e2d\u671f\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u8a9e (900-1200)
languages.nyo=\u30cb\u30e7\u30ed\u8a9e
languages.bas=\u30d0\u30b5\u8a9e
languages.nyn=\u30cb\u30e3\u30f3\u30b3\u30ec\u8a9e
@@ -1082,8 +616,8 @@ languages.kru=\u30af\u30eb\u30af\u8a9e
languages.tg=\u30bf\u30b8\u30af\u8a9e
languages.byn=\u30d3\u30ea\u30f3\u8a9e
languages.te=\u30c6\u30eb\u30b0\u8a9e
-languages.kro=\u30af\u30eb\u30fc\u8a9e
languages.csb=\u30ab\u30b7\u30e5\u30fc\u30d6\u8a9e
+languages.kro=\u30af\u30eb\u30fc\u8a9e
languages.ta=\u30bf\u30df\u30fc\u30eb\u8a9e
languages.tkl=\u30c8\u30b1\u30e9\u30a6\u8a9e
languages.efi=\u30a8\u30d5\u30a3\u30c3\u30af\u8a9e
@@ -1098,7 +632,7 @@ languages.sq=\u30a2\u30eb\u30d0\u30cb\u30a2\u8a9e
languages.men=\u30e1\u30f3\u30c7\u8a9e
languages.crp=\u305d\u306e\u4ed6\u306e\u6df7\u6210\u8a9e\u30fb\u6df7\u5408\u8a9e
languages.so=\u30bd\u30de\u30ea\u8a9e
-languages.afh=Afrihili\u8a9e
+languages.afh=\u30a2\u30d5\u30ea\u30d2\u30ea\u8a9e
languages.sn=\u30b7\u30e7\u30ca\u8a9e
languages.sm=\u30b5\u30e2\u30a2\u8a9e
languages.sl=\u30b9\u30ed\u30d9\u30cb\u30a2\u8a9e
@@ -1106,9 +640,9 @@ languages.grc=\u53e4\u4ee3\u30ae\u30ea\u30b7\u30e3\u8a9e (1453\u307e\u3067)
languages.sk=\u30b9\u30ed\u30d0\u30ad\u30a2\u8a9e
languages.grb=\u30b0\u30ec\u30dc\u8a9e
languages.si=\u30b7\u30f3\u30cf\u30e9\u8a9e
-languages.sh=\u30bb\u30eb\u30dc\uff1d\u30af\u30ed\u30a2\u30c1\u30a2\u8a9e
-languages.crh=\u30af\u30ea\u30df\u30a2\u30fb\u30c8\u30eb\u30b3\u8a9e\u3001\u30af\u30ea\u30df\u30a2\u30fb\u30bf\u30bf\u30fc\u30eb\u8a9e
-languages.afa=\u30a2\u30d5\u30ed\u30fb\u30a2\u30d5\u30ea\u30ab\u8af8\u8a9e
+languages.sh=\u30bb\u30eb\u30dc\u30fb\u30af\u30ed\u30a2\u30c1\u30a2\u8a9e
+languages.afa=\u30bb\u30e0\u30fb\u30cf\u30e0\u8af8\u8a9e
+languages.crh=\u30af\u30ea\u30df\u30a2\u30fb\u30bf\u30bf\u30fc\u30eb\u8a9e
languages.sg=\u30b5\u30f3\u30b4\u8a9e
languages.se=\u5317\u30b5\u30fc\u30df\u8a9e
languages.sd=\u30b7\u30f3\u30c9\u8a9e
@@ -1120,7 +654,7 @@ languages.ru=\u30ed\u30b7\u30a2\u8a9e
languages.mdr=\u30de\u30f3\u30c0\u30eb\u8a9e
languages.ro=\u30eb\u30fc\u30de\u30cb\u30a2\u8a9e
languages.rn=\u30eb\u30f3\u30b8\u8a9e
-languages.rm=\u30ec\u30c8\uff1d\u30ed\u30de\u30f3\u8a9e
+languages.rm=\u30ec\u30c8\u30fb\u30ed\u30de\u30f3\u8a9e
languages.mdf=\u30e2\u30af\u30b7\u30e3\u8a9e
languages.tiv=\u30c6\u30a3\u30d6\u8a9e
languages.ady=\u30a2\u30c7\u30a3\u30b2\u8a9e
@@ -1132,14 +666,14 @@ languages.son=\u30bd\u30f3\u30ac\u30a4\u8a9e
languages.cpp=\u30dd\u30eb\u30c8\u30ac\u30eb\u8a9e\u304c\u57fa\u76e4\u306e\u6df7\u6210\u8a9e\u30fb\u6df7\u5408\u8a9e
languages.sog=\u30bd\u30b0\u30c9\u8a9e
languages.ada=\u30a2\u30c0\u30f3\u30b0\u30e1\u8a9e
-languages.kos=\u30b3\u30b7\u30e3\u30a8\u8a9e
-languages.hit=\u30d2\u30c3\u30bf\u30a4\u30c8\u8a9e
languages.cpf=\u30d5\u30e9\u30f3\u30b9\u8a9e\u304c\u57fa\u76e4\u306e\u6df7\u6210\u8a9e\u30fb\u6df7\u5408\u8a9e
+languages.hit=\u30d2\u30c3\u30bf\u30a4\u30c8\u8a9e
+languages.kos=\u30b3\u30b7\u30e3\u30a8\u8a9e
languages.cpe=\u82f1\u8a9e\u304c\u57fa\u76e4\u306e\u6df7\u6210\u8a9e\u30fb\u6df7\u5408\u8a9e
languages.him=\u30d2\u30de\u30c1\u30e3\u30eb\u8a9e
-languages.kok=\u30b3\u30f3\u30ab\u30cb\u8a9e
-languages.hil=\u30d2\u30ea\u30ac\u30a4\u30ce\u30f3\u8a9e
languages.got=\u30b4\u30fc\u30c8\u8a9e
+languages.hil=\u30d2\u30ea\u30ac\u30a4\u30ce\u30f3\u8a9e
+languages.kok=\u30b3\u30f3\u30ab\u30cb\u8a9e
languages.gor=\u30b4\u30ed\u30f3\u30bf\u30ed\u8a9e
languages.gon=\u30b4\u30fc\u30f3\u30c7\u30a3\u30fc\u8a9e
languages.din=\u30c7\u30a3\u30f3\u30ab\u8a9e
@@ -1156,17 +690,17 @@ languages.ach=\u30a2\u30c1\u30e7\u30ea\u8a9e
languages.yao=\u30e4\u30aa\u8a9e
languages.phi=\u30d5\u30a3\u30ea\u30d4\u30f3\u8af8\u8a9e
languages.pl=\u30dd\u30fc\u30e9\u30f3\u30c9\u8a9e
-languages.ace=\u30a2\u30c1\u30a7\u8a9e
+languages.ace=\u30a2\u30c1\u30a7\u30fc\u8a9e
languages.pi=\u30d1\u30fc\u30ea\u8a9e
languages.pa=\u30d1\u30f3\u30b8\u30e3\u30d6\u8a9e
-languages.bug=\u30d6\u30ae\u30b9\u8a9e
+languages.bug=\u30d6\u30ae\u8a9e
languages.iba=\u30a4\u30d0\u30f3\u8a9e
languages.sms=\u30b9\u30b3\u30eb\u30c8\u30fb\u30b5\u30fc\u30df\u8a9e
languages.bua=\u30d6\u30ea\u30e4\u30fc\u30c8\u8a9e
languages.mas=\u30de\u30b5\u30a4\u8a9e
languages.smn=\u30a4\u30ca\u30ea\u30fb\u30b5\u30fc\u30df\u8a9e
languages.os=\u30aa\u30bb\u30c8\u8a9e
-languages.map=\u30aa\u30fc\u30b9\u30c8\u30ed\u30cd\u30b7\u30a2\u8a9e
+languages.map=\u30aa\u30fc\u30b9\u30c8\u30ed\u30cd\u30b7\u30a2\u8af8\u8a9e
languages.or=\u30aa\u30ea\u30e4\u30fc\u8a9e
languages.man=\u30de\u30f3\u30c7\u30a3\u30f3\u30b4\u8a9e
languages.smj=\u30eb\u30ec\u30fb\u30b5\u30fc\u30df\u8a9e
@@ -1206,25 +740,25 @@ languages.my=\u30d3\u30eb\u30de\u8a9e
languages.lez=\u30ec\u30ba\u30ae\u8a9e
languages.mt=\u30de\u30eb\u30bf\u8a9e
languages.peo=\u53e4\u4ee3\u30da\u30eb\u30b7\u30a2\u8a9e (\u7d04600-400 B.C.)
-languages.ms=\u30de\u30e9\u30a4\u8a9e
+languages.ms=\u30de\u30ec\u30fc\u8a9e
languages.mr=\u30de\u30e9\u30fc\u30c6\u30a3\u30fc\u8a9e
languages.fro=\u53e4\u30d5\u30e9\u30f3\u30b9\u8a9e (842-\u7d041400)
languages.mo=\u30e2\u30eb\u30c0\u30d3\u30a2\u8a9e
-languages.frm=\u4e2d\u4e16\u30d5\u30e9\u30f3\u30b9\u8a9e (\u7d041400-1600)
languages.mn=\u30e2\u30f3\u30b4\u30eb\u8a9e
+languages.frm=\u4e2d\u4e16\u30d5\u30e9\u30f3\u30b9\u8a9e (\u7d041400-1600)
+languages.ml=\u30de\u30e9\u30e4\u30fc\u30e9\u30e0\u8a9e
languages.jrb=\u30e6\u30c0\u30e4\u30fb\u30a2\u30e9\u30d3\u30a2\u8a9e
-languages.ml=\u30de\u30e9\u30e4\u2015\u30e9\u30e0\u8a9e
languages.mk=\u30de\u30b1\u30c9\u30cb\u30a2\u8a9e
languages.mi=\u30de\u30aa\u30ea\u8a9e
languages.mh=\u30de\u30fc\u30b7\u30e3\u30eb\u8a9e
languages.mg=\u30de\u30e9\u30ac\u30b7\u30fc\u8a9e
languages.mwr=\u30de\u30fc\u30eb\u30ef\u30fc\u30ea\u30fc\u8a9e
languages.bra=\u30d6\u30e9\u30b8\u8a9e
-languages.den=\u30b9\u30ec\u30a4\u30d3\u30fc\u8a9e
languages.lv=\u30e9\u30c8\u30d3\u30a2\u8a9e
+languages.den=\u30b9\u30ec\u30a4\u30d3\u30fc\u8a9e
languages.lu=\u30eb\u30d0\u30fb\u30ab\u30bf\u30f3\u30ac\u8a9e
-languages.del=\u30c7\u30e9\u30a6\u30a7\u30a2\u8a9e
languages.lt=\u30ea\u30c8\u30a2\u30cb\u30a2\u8a9e
+languages.del=\u30c7\u30e9\u30a6\u30a7\u30a2\u8a9e
languages.lo=\u30e9\u30aa\u8a9e
languages.ln=\u30ea\u30f3\u30ac\u30e9\u8a9e
languages.li=\u30ea\u30f3\u30d6\u30eb\u30d5\u8a9e
@@ -1277,38 +811,38 @@ languages.iu=\u30a4\u30cc\u30af\u30a6\u30c6\u30a3\u30c8\u30c3\u30c8\u8a9e
languages.pap=\u30d1\u30d4\u30a2\u30e1\u30f3\u30c8\u8a9e
languages.it=\u30a4\u30bf\u30ea\u30a2\u8a9e
languages.sgn=\u624b\u307e\u306d\u8a00\u8a9e
-languages.is=\u30a2\u30a4\u30b9\u30e9\u30f3\u30c9\u8a9e
languages.kha=\u30ab\u30b7\u8a9e
+languages.is=\u30a2\u30a4\u30b9\u30e9\u30f3\u30c9\u8a9e
languages.chr=\u30c1\u30a7\u30ed\u30ad\u30fc\u8a9e
languages.pam=\u30d1\u30f3\u30d1\u30f3\u30ac\u8a9e
languages.pal=\u30d1\u30d5\u30e9\u30f4\u30a3\u8a9e
languages.chp=\u30c1\u30da\u30ef\u30a4\u30a2\u30f3\u8a9e
-languages.io=\u30a4\u30c9\u8a9e
languages.cho=\u30c1\u30e7\u30af\u30c8\u30fc\u8a9e
-languages.chn=\u30c1\u30cc\u30fc\u30af\u30fb\u30b8\u30e3\u30fc\u30b4\u30f3
+languages.io=\u30a4\u30c9\u8a9e
+languages.chn=\u30d3\u30fc\u30c1\u30fb\u30e9\u30fb\u30de\u30fc \u7b49
languages.chm=\u30de\u30ea\u8a9e
languages.tyv=\u30c8\u30a5\u30f4\u30a1\u8a9e
-languages.bnt=\u30d0\u30f3\u30c8\u30a5\u8a9e
+languages.bnt=\u30d0\u30f3\u30c8\u30a5\u8af8\u8a9e
languages.pag=\u30d1\u30f3\u30ac\u30b7\u30ca\u30f3\u8a9e
-languages.ik=\u30a4\u30cc\u30d4\u30a2\u30c3\u30af\u8a9e
languages.chk=\u30c1\u30e5\u30fc\u30af\u8a9e
-languages.ii=\u56db\u5ddd\u30a4\u8a9e
+languages.ik=\u30a4\u30cc\u30d4\u30a2\u30c3\u30af\u8a9e
languages.haw=\u30cf\u30ef\u30a4\u8a9e
+languages.ii=\u56db\u5ddd\u30a4\u8a9e
languages.lam=\u30e9\u30f3\u30d0\u8a9e
-languages.ig=\u30a4\u30dc\u8a9e
languages.chg=\u30c1\u30e3\u30ac\u30bf\u30a4\u8a9e
+languages.ig=\u30a4\u30dc\u8a9e
languages.sga=\u53e4\u671f\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u8a9e (900\u307e\u3067)
languages.paa=\u30d1\u30d7\u30a2\u8af8\u8a9e
languages.ie=\u56fd\u969b\u8a9e
languages.id=\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2\u8a9e
languages.lah=\u30e9\u30d5\u30f3\u30c0\u30fc\u8a9e
-languages.day=\u30c0\u30e4\u30af\u8a9e
languages.chb=\u30c1\u30d6\u30c1\u30e3\u8a9e
+languages.day=\u30c0\u30e4\u30af\u8a9e
languages.ia=\u56fd\u969b\u8a9e
languages.lad=\u30e9\u30b8\u30ce\u8a9e
-languages.hz=\u30d8\u30ec\u30ed\u8a9e
-languages.hai=\u30cf\u30a4\u30c0\u8a9e
languages.dar=\u30c0\u30eb\u30ac\u30f3\u8a9e
+languages.hai=\u30cf\u30a4\u30c0\u8a9e
+languages.hz=\u30d8\u30ec\u30ed\u8a9e
languages.hy=\u30a2\u30eb\u30e1\u30cb\u30a2\u8a9e
languages.ath=\u30a2\u30b5\u30d1\u30b9\u30ab\u30f3\u8a9e\u65cf
languages.hu=\u30cf\u30f3\u30ac\u30ea\u30fc\u8a9e
@@ -1317,7 +851,7 @@ languages.dak=\u30c0\u30b3\u30bf\u8a9e
languages.hr=\u30af\u30ed\u30a2\u30c1\u30a2\u8a9e
languages.ho=\u30d2\u30ea\u30e2\u30c8\u30a5\u8a9e
languages.hi=\u30d2\u30f3\u30c7\u30a3\u30fc\u8a9e
-languages.dyu=\u30b8\u30e5\u30e9\u8a9e
+languages.dyu=\u30c7\u30a5\u30a6\u30e9\u8a9e
languages.he=\u30d8\u30d6\u30e9\u30a4\u8a9e
languages.ast=\u30a2\u30b9\u30c8\u30a5\u30ea\u30a2\u30b9\u8a9e
languages.ha=\u30cf\u30a6\u30b5\u8a9e
@@ -1330,9 +864,9 @@ languages.iro=\u30a4\u30ed\u30b3\u30a4\u8a9e\u65cf
languages.gn=\u30b0\u30ef\u30e9\u30cb\u8a9e
languages.gl=\u30ac\u30ea\u30b7\u30a2\u8a9e
languages.arw=\u30a2\u30e9\u30ef\u30af\u8a9e
-languages.gez=\u30b2\u30a8\u30ba\u8a9e
-languages.art=\u4eba\u5de5\u8af8\u8a9e
languages.gd=\u30b9\u30b3\u30c3\u30c8\u30e9\u30f3\u30c9\u30fb\u30b2\u30fc\u30eb\u8a9e
+languages.art=\u4eba\u5de5\u8af8\u8a9e
+languages.gez=\u30b2\u30a8\u30ba\u8a9e
languages.ira=\u30a4\u30e9\u30f3\u8a9e
languages.ga=\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u8a9e
languages.arp=\u30a2\u30e9\u30d1\u30db\u30fc\u8a9e
@@ -1341,8 +875,8 @@ languages.fy=\u30d5\u30ea\u30b8\u30a2\u8a9e
languages.bla=\u30b7\u30af\u30b7\u30ab\u8a9e
languages.gem=\u30b2\u30eb\u30de\u30f3\u8af8\u8a9e
languages.ypk=\u30e6\u30d4\u30c3\u30af\u8a9e\u65cf
-languages.arc=\u30a2\u30e9\u30e0\u8a9e
languages.fr=\u30d5\u30e9\u30f3\u30b9\u8a9e
+languages.arc=\u30a2\u30e9\u30e0\u8a9e
languages.fo=\u30d5\u30a7\u30ed\u30fc\u8a9e
languages.cel=\u30b1\u30eb\u30c8\u8af8\u8a9e
languages.fj=\u30d5\u30a3\u30b8\u30fc\u8a9e
@@ -1366,9 +900,9 @@ languages.tum=\u30c8\u30a5\u30f3\u30d6\u30ab\u8a9e
languages.mos=\u30e2\u30b7\u8a9e
languages.dz=\u30d6\u30fc\u30bf\u30f3\u8a9e
languages.nic=\u30cb\u30b8\u30a7\u30fc\u30eb\u30fb\u30b3\u30eb\u30c9\u30d5\u30a1\u30f3\u8af8\u8a9e
-languages.lus=\u30eb\u30b7\u30e3\u30a4\u8a9e
-languages.fiu=\u30d5\u30a3\u30f3\u30fb\u30a6\u30b4\u30eb\u8af8\u8a9e
languages.dv=\u30c7\u30a3\u30f4\u30a7\u30d2\u8a9e
+languages.fiu=\u30d5\u30a3\u30f3\u30fb\u30a6\u30b4\u30eb\u8af8\u8a9e
+languages.lus=\u30eb\u30b7\u30e3\u30a4\u8a9e
languages.nia=\u30cb\u30a2\u30b9\u8a9e
languages.moh=\u30e2\u30fc\u30db\u30fc\u30af\u8a9e
languages.luo=\u30eb\u30aa\u8a9e
@@ -1384,15 +918,15 @@ languages.was=\u30ef\u30b7\u30e7\u8a9e
languages.und=\u975e\u78ba\u5b9a
languages.war=\u30ef\u30e9\u30a4\u8a9e
languages.da=\u30c7\u30f3\u30de\u30fc\u30af\u8a9e
-languages.dum=\u4e2d\u4e16\u30aa\u30e9\u30f3\u30c0\u8a9e (\u7d041050-1350)
+languages.dum=\u4e2d\u4e16\u30aa\u30e9\u30f3\u30c0\u8a9e
languages.wal=\u30ef\u30c3\u30e9\u30e2\u8a9e
languages.mno=\u30de\u30ce\u30dc\u8a9e\u65cf
languages.wak=\u30ef\u30ab\u30b7\u8a9e\u65cf
languages.sat=\u30b5\u30f3\u30bf\u30fc\u30ea\u30fc\u8a9e
languages.cy=\u30a6\u30a7\u30fc\u30eb\u30ba\u8a9e
languages.sas=\u30b5\u30b5\u30af\u8a9e
-languages.kbd=\u30ab\u30d0\u30eb\u30c9\u8a9e
languages.cv=\u30c1\u30e5\u30f4\u30a1\u30b7\u30e5\u8a9e
+languages.kbd=\u30ab\u30d0\u30eb\u30c9\u8a9e
languages.cu=\u6559\u4f1a\u30b9\u30e9\u30d6\u8a9e
languages.mni=\u30de\u30cb\u30d7\u30eb\u8a9e
languages.cs=\u30c1\u30a7\u30b3\u8a9e
@@ -1404,41 +938,41 @@ languages.co=\u30b3\u30eb\u30b7\u30ab\u8a9e
languages.sai=\u5357\u7c73\u30a4\u30f3\u30c7\u30a3\u30a2\u30f3\u8af8\u8a9e
languages.mnc=\u6e80\u5dde\u8a9e
languages.sah=\u30e4\u30af\u30fc\u30c8\u8a9e
-languages.kaw=\u30ab\u30a6\u30a3\u8a9e
-languages.inh=\u30a4\u30f3\u30b0\u30b7\u8a9e
languages.gba=\u30d0\u30e4\u8a9e
+languages.inh=\u30a4\u30f3\u30b0\u30b7\u8a9e
+languages.kaw=\u30ab\u30a6\u30a3\u8a9e
languages.sad=\u30b5\u30f3\u30c0\u30a6\u30a7\u8a9e
languages.ch=\u30c1\u30e3\u30e2\u30ed\u8a9e
+languages.bho=\u30dc\u30fc\u30b8\u30d7\u30ea\u30fc\u8a9e
languages.ine=\u5370\u6b27\u8af8\u8a9e
-languages.bho=\u30dc\u30fc\u30b8\u30e5\u30d7\u30ea\u30fc\u8a9e
-languages.enm=\u4e2d\u4e16\u82f1\u8a9e (1100-1500)
-languages.kar=\u30ab\u30ec\u30f3\u8a9e
-languages.inc=\u30a4\u30f3\u30c9\u8af8\u8a9e
+languages.enm=\u4e2d\u4e16\u82f1\u8a9e
languages.ce=\u30c1\u30a7\u30c1\u30a7\u30f3\u8a9e
+languages.inc=\u30a4\u30f3\u30c9\u8af8\u8a9e
+languages.kar=\u30ab\u30ec\u30f3\u8a9e
languages.gay=\u30ac\u30e8\u8a9e
languages.ca=\u30ab\u30bf\u30ed\u30cb\u30a2\u8a9e
languages.umb=\u30a6\u30f3\u30d6\u30f3\u30c9\u30a5\u8a9e
languages.syr=\u30b7\u30ea\u30a2\u8a9e
languages.kam=\u30ab\u30f3\u30d0\u8a9e
languages.tsi=\u30c1\u30e0\u30b7\u30e5\u8a9e
-languages.ang=\u53e4\u671f\u82f1\u8a9e (\u7d04450-1100)
-languages.kac=\u30ab\u30c1\u30f3\u8a9e
+languages.ang=\u53e4\u671f\u82f1\u8a9e
languages.cau=\u30b3\u30fc\u30ab\u30b5\u30b9\u8af8\u8a9e
+languages.kac=\u30ab\u30c1\u30f3\u8a9e
languages.kab=\u30ab\u30d3\u30eb\u8a9e
-languages.kaa=\u30ab\u30e9\u30fb\u30ab\u30eb\u30d1\u30af\u8a9e
languages.bs=\u30dc\u30b9\u30cb\u30a2\u8a9e
-languages.car=\u30ab\u30ea\u30d6\u8a9e
+languages.kaa=\u30ab\u30e9\u30fb\u30ab\u30eb\u30d1\u30af\u8a9e
languages.br=\u30d6\u30eb\u30c8\u30f3\u8a9e
+languages.car=\u30ab\u30ea\u30d6\u8a9e
languages.bo=\u30c1\u30d9\u30c3\u30c8\u8a9e
languages.bn=\u30d9\u30f3\u30ac\u30eb\u8a9e
languages.bm=\u30d0\u30f3\u30d0\u30e9\u8a9e
languages.gaa=\u30ac\u8a9e
-languages.cai=\u4e2d\u7c73\u30a4\u30f3\u30c7\u30a3\u30a2\u30f3\u8af8\u8a9e
languages.bi=\u30d3\u30b9\u30e9\u30de\u8a9e
-languages.bh=\u30d3\u30cf\u2015\u30eb\u8a9e
+languages.cai=\u4e2d\u7c73\u30a4\u30f3\u30c7\u30a3\u30a2\u30f3\u8af8\u8a9e
+languages.bh=\u30d3\u30cf\u30fc\u30eb\u8a9e
languages.bg=\u30d6\u30eb\u30ac\u30ea\u30a2\u8a9e
languages.be=\u30d9\u30e9\u30eb\u30fc\u30b7\u8a9e
-languages.cad=\u30ab\u30c9\u8a9e
+languages.cad=\u30ab\u30c9\u30fc\u8a9e
languages.ba=\u30d0\u30b7\u30ad\u30fc\u30eb\u8a9e
languages.zu=\u30ba\u30fc\u30eb\u30fc\u8a9e
languages.zen=\u30bc\u30ca\u30ac\u8a9e
@@ -1448,10 +982,10 @@ languages.az=\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3\u8a9e
languages.ay=\u30a2\u30a4\u30de\u30e9\u8a9e
languages.av=\u30a2\u30f4\u30a1\u30eb\u8a9e
languages.as=\u30a2\u30c3\u30b5\u30e0\u8a9e
-languages.dsb=\u4f4e\u30bd\u30eb\u30d3\u30a2\u8a9e
languages.ar=\u30a2\u30e9\u30d3\u30a2\u8a9e
-languages.ilo=\u30a4\u30ed\u30ab\u30ce\u8a9e
+languages.dsb=\u4f4e\u30bd\u30eb\u30d3\u30a2\u8a9e
languages.elx=\u30a8\u30e9\u30e0\u8a9e
+languages.ilo=\u30a4\u30ed\u30ab\u30ce\u8a9e
languages.zh=\u4e2d\u56fd\u8a9e
languages.an=\u30a2\u30e9\u30b4\u30f3\u8a9e
languages.pra=\u30d7\u30e9\u30fc\u30af\u30ea\u30c3\u30c8\u8a9e\u65cf
@@ -1464,15 +998,15 @@ languages.ae=\u30a2\u30f4\u30a7\u30b9\u30bf\u8a9e
languages.ab=\u30a2\u30d6\u30cf\u30ba\u8a9e
languages.aa=\u30a2\u30d5\u30a1\u30fc\u30eb\u8a9e
languages.yo=\u30e8\u30eb\u30d0\u8a9e
-languages.alg=\u30a2\u30eb\u30b4\u30f3\u30ad\u30f3\u8a9e\u65cf
-languages.ale=\u30a2\u30ea\u30e5\u30fc\u30c8\u8a9e
+languages.alg=\u30a2\u30eb\u30b4\u30f3\u30ad\u30a2\u30f3\u8a9e\u65cf
+languages.ale=\u30a2\u30ec\u30a6\u30c8\u8a9e
languages.mkh=\u30e2\u30f3\u30fb\u30af\u30e1\u30fc\u30eb\u8af8\u8a9e
languages.yi=\u30a4\u30c7\u30a3\u30c3\u30b7\u30e5\u8a9e
languages.dra=\u30c9\u30e9\u30f4\u30a3\u30c0\u8af8\u8a9e
-languages.ber=\u30d9\u30eb\u30d9\u30eb\u8a9e
+languages.ber=\u30d9\u30eb\u30d9\u30eb\u8af8\u8a9e
languages.nds=\u4f4e\u5730\u30c9\u30a4\u30c4\u8a9e\u3001\u4f4e\u5730\u30b5\u30af\u30bd\u30f3\u8a9e
languages.bem=\u30d9\u30f3\u30d0\u8a9e
languages.bej=\u30d9\u30b8\u30e3\u8a9e
languages.tpi=\u30c8\u30af\u30fb\u30d4\u30b7\u30f3\u8a9e
-variants.POSIX=\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc
+variants.POSIX=\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf
variants.REVISED=\u6539\u8a02\u7248
diff --git a/resource/gnu/java/locale/LocaleInformation_ja_JP.properties b/resource/gnu/java/locale/LocaleInformation_ja_JP.properties
index d4ca5fa22..2244e890e 100644
--- a/resource/gnu/java/locale/LocaleInformation_ja_JP.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ja_JP.properties
@@ -5,4 +5,4 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4#,##0;-\u00a4#,##0
+currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
diff --git a/resource/gnu/java/locale/LocaleInformation_ka.properties b/resource/gnu/java/locale/LocaleInformation_ka.properties
index 67e66fbdf..c0562be44 100644
--- a/resource/gnu/java/locale/LocaleInformation_ka.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ka.properties
@@ -7,7 +7,6 @@
decimalSeparator=,
groupingSeparator=\u00a0
-currenciesDisplayName.GEL=GEL
currenciesSymbol.GEL=Lari
territories.TJ=\u10e2\u10d0\u10ef\u10d8\u10d9\u10d4\u10d7\u10d8
territories.TH=\u10e2\u10d0\u10d8\u10da\u10d0\u10dc\u10d3\u10d8
@@ -70,11 +69,12 @@ territories.PK=\u10de\u10d0\u10d9\u10d8\u10e1\u10e2\u10d0\u10dc\u10d8
territories.PH=\u10e4\u10d8\u10da\u10d8\u10de\u10d8\u10dc\u10d4\u10d1\u10d8
territories.PG=\u10de\u10d0\u10de\u10e3\u10d0-\u10d0\u10ee\u10d0\u10da\u10d8 \u10d2\u10d5\u10d8\u10dc\u10d4\u10d0
territories.CZ=\u10e9\u10d4\u10ee\u10d4\u10d7\u10d8\u10e1 \u10e0\u10d4\u10e1\u10de\u10e3\u10d1\u10da\u10d8\u10d9\u10d0
-territories.PE=\u10de\u10d4\u10e0\u10e3
territories.CY=\u10d9\u10d5\u10d8\u10de\u10e0\u10dd\u10e1\u10d8
+territories.PE=\u10de\u10d4\u10e0\u10e3
territories.CV=\u10d9\u10d0\u10d1\u10dd-\u10d5\u10d4\u10e0\u10d3\u10d4
-territories.PA=\u10de\u10d0\u10dc\u10d0\u10db\u10d0
territories.CU=\u10d9\u10e3\u10d1\u10d0
+territories.PA=\u10de\u10d0\u10dc\u10d0\u10db\u10d0
+territories.CS=\u10e1\u10d4\u10e0\u10d1\u10d8\u10d0
territories.CR=\u10d9\u10dd\u10e1\u10e2\u10d0-\u10e0\u10d8\u10d9\u10d0
territories.CO=\u10d9\u10dd\u10da\u10e3\u10db\u10d1\u10d8\u10d0
territories.CN=\u10e9\u10d8\u10dc\u10d4\u10d7\u10d8
@@ -92,45 +92,45 @@ territories.BW=\u10d1\u10dd\u10e2\u10e1\u10d5\u10d0\u10dc\u10d0
territories.BT=\u10d1\u10e3\u10e2\u10d0\u10dc\u10d8
territories.BS=\u10d1\u10d0\u10f0\u10d0\u10db\u10d8\u10e1 \u10d9\u10e3\u10dc\u10eb\u10e3\u10da\u10d4\u10d1\u10d8
territories.BR=\u10d1\u10e0\u10d0\u10d6\u10d8\u10da\u10d8\u10d0
-territories.NZ=\u10d0\u10ee\u10d0\u10da\u10d8 \u10d6\u10d4\u10da\u10d0\u10dc\u10d3\u10d8\u10d0
territories.BO=\u10d1\u10dd\u10da\u10d8\u10d5\u10d8\u10d0
+territories.NZ=\u10d0\u10ee\u10d0\u10da\u10d8 \u10d6\u10d4\u10da\u10d0\u10dc\u10d3\u10d8\u10d0
territories.BN=\u10d1\u10e0\u10e3\u10dc\u10d4\u10d8
territories.BJ=\u10d1\u10d4\u10dc\u10d8\u10dc\u10d8
territories.BI=\u10d1\u10e3\u10e0\u10e3\u10dc\u10d3\u10d8
territories.BH=\u10d1\u10d0\u10f0\u10e0\u10d4\u10d8\u10dc\u10d8
-territories.NR=\u10dc\u10d0\u10e3\u10e0\u10e3
territories.BG=\u10d1\u10e3\u10da\u10d2\u10d0\u10e0\u10d4\u10d7\u10d8
+territories.NR=\u10dc\u10d0\u10e3\u10e0\u10e3
territories.BF=\u10d1\u10e3\u10e0\u10d9\u10d8\u10dc\u10d0-\u10e4\u10d0\u10e1\u10dd
-territories.NP=\u10dc\u10d4\u10de\u10d0\u10da\u10d8
territories.BE=\u10d1\u10d4\u10da\u10d2\u10d8\u10d0
-territories.NO=\u10dc\u10dd\u10e0\u10d5\u10d4\u10d2\u10d8\u10d0
+territories.NP=\u10dc\u10d4\u10de\u10d0\u10da\u10d8
territories.BD=\u10d1\u10d0\u10dc\u10d2\u10da\u10d0\u10d3\u10d4\u10e8\u10d8
+territories.NO=\u10dc\u10dd\u10e0\u10d5\u10d4\u10d2\u10d8\u10d0
territories.BB=\u10d1\u10d0\u10e0\u10d1\u10d0\u10d3\u10dd\u10e1\u10d8
territories.ZW=\u10d6\u10d8\u10db\u10d1\u10d0\u10d1\u10d5\u10d4
-territories.NL=\u10dc\u10d8\u10d3\u10d4\u10e0\u10da\u10d0\u10dc\u10d3\u10d4\u10d1\u10d8
territories.BA=\u10d1\u10dd\u10e1\u10dc\u10d8\u10d0 \u10d3\u10d0 \u10f0\u10d4\u10e0\u10ea\u10d4\u10d2\u10dd\u10d5\u10d8\u10dc\u10d0
+territories.NL=\u10dc\u10d8\u10d3\u10d4\u10e0\u10da\u10d0\u10dc\u10d3\u10d4\u10d1\u10d8
territories.NI=\u10dc\u10d8\u10d9\u10d0\u10e0\u10d0\u10d2\u10e3\u10d0
territories.NG=\u10dc\u10d8\u10d2\u10d4\u10e0\u10d8\u10d0
territories.AZ=\u10d0\u10d6\u10d4\u10e0\u10d1\u10d0\u10d8\u10ef\u10d0\u10dc\u10d8
territories.NE=\u10dc\u10d8\u10d2\u10d4\u10e0\u10d8
territories.ZM=\u10d6\u10d0\u10db\u10d1\u10d8\u10d0
-territories.AU=\u10d0\u10d5\u10e1\u10e2\u10e0\u10d0\u10da\u10d8\u10d0
territories.NA=\u10dc\u10d0\u10db\u10d8\u10d1\u10d8\u10d0
+territories.AU=\u10d0\u10d5\u10e1\u10e2\u10e0\u10d0\u10da\u10d8\u10d0
territories.AT=\u10d0\u10d5\u10e1\u10e2\u10e0\u10d8\u10d0
territories.AR=\u10d0\u10e0\u10d2\u10d4\u10dc\u10e2\u10d8\u10dc\u10d0
-territories.MZ=\u10db\u10dd\u10d6\u10d0\u10db\u10d1\u10d8\u10d9\u10d8
territories.AO=\u10d0\u10dc\u10d2\u10dd\u10da\u10d0
+territories.MZ=\u10db\u10dd\u10d6\u10d0\u10db\u10d1\u10d8\u10d9\u10d8
territories.MY=\u10db\u10d0\u10da\u10d0\u10d8\u10d6\u10d8\u10d0
-territories.MX=\u10db\u10d4\u10e5\u10e1\u10d8\u10d9\u10d0
territories.AM=\u10e1\u10d0\u10e1\u10dd\u10db\u10ee\u10d4\u10d7\u10d8
-territories.MW=\u10db\u10d0\u10da\u10d0\u10d5\u10d8
+territories.MX=\u10db\u10d4\u10e5\u10e1\u10d8\u10d9\u10d0
territories.AL=\u10d0\u10da\u10d1\u10d0\u10dc\u10d4\u10d7\u10d8
+territories.MW=\u10db\u10d0\u10da\u10d0\u10d5\u10d8
territories.MV=\u10db\u10d0\u10da\u10d3\u10d8\u10d5\u10d8\u10e1 \u10d9\u10e3\u10dc\u10eb\u10e3\u10da\u10d4\u10d1\u10d8
territories.ZA=\u10e1\u10d0\u10db\u10ee\u10e0\u10d4\u10d7 \u10d0\u10e4\u10e0\u10d8\u10d9\u10d0
territories.MU=\u10db\u10d0\u10d5\u10e0\u10d8\u10d9\u10d8\u10d0
territories.MT=\u10db\u10d0\u10da\u10e2\u10d0
-territories.MR=\u10db\u10d0\u10d5\u10e0\u10d8\u10e2\u10d0\u10dc\u10d8\u10d0
territories.AG=\u10d0\u10dc\u10e2\u10d8\u10d2\u10e3\u10d0 \u10d3\u10d0 \u10d1\u10d0\u10e0\u10d1\u10e3\u10d3\u10d0
+territories.MR=\u10db\u10d0\u10d5\u10e0\u10d8\u10e2\u10d0\u10dc\u10d8\u10d0
territories.AF=\u10d0\u10d5\u10e6\u10d0\u10dc\u10d4\u10d7\u10d8
territories.AE=\u10d0\u10e0\u10d0\u10d1\u10d4\u10d7\u10d8\u10e1 \u10d2\u10d0\u10d4\u10e0\u10d7\u10d8\u10d0\u10dc\u10d4\u10d1\u10e3\u10da\u10d8 \u10d4\u10db\u10d8\u10e0\u10d0\u10e2\u10d4\u10d1\u10d8
territories.AD=\u10d0\u10dc\u10d3\u10dd\u10e0\u10d0
@@ -138,7 +138,6 @@ territories.MN=\u10db\u10dd\u10dc\u10e6\u10dd\u10da\u10d4\u10d7\u10d8
territories.MM=\u10db\u10d8\u10d0\u10dc\u10db\u10d0\u10e0\u10d8
territories.ML=\u10db\u10d0\u10da\u10d8
territories.MK=\u10db\u10d0\u10d9\u10d4\u10d3\u10dd\u10dc\u10d8\u10d0
-territories.YU=\u10e1\u10d4\u10e0\u10d1\u10d8\u10d0
territories.MH=\u10db\u10d0\u10e0\u10e8\u10d0\u10da\u10d8\u10e1 \u10d9\u10e3\u10dc\u10eb\u10e3\u10da\u10d4\u10d1\u10d8
territories.MG=\u10db\u10d0\u10d3\u10d0\u10d2\u10d0\u10e1\u10d9\u10d0\u10e0\u10d8
territories.MD=\u10db\u10dd\u10da\u10d3\u10dd\u10d5\u10d0
diff --git a/resource/gnu/java/locale/LocaleInformation_kk.properties b/resource/gnu/java/locale/LocaleInformation_kk.properties
index ee9c4dd52..0782017cf 100644
--- a/resource/gnu/java/locale/LocaleInformation_kk.properties
+++ b/resource/gnu/java/locale/LocaleInformation_kk.properties
@@ -7,7 +7,6 @@
decimalSeparator=,
groupingSeparator=\u00a0
-currenciesDisplayName.KZT=KZT
currenciesSymbol.KZT=\u0442\u04a3\u0433.
shortMonths=\u049b\u0430\u04a3.®\u0430\u049b\u043f.®\u043d\u0430\u0443.®\u0441\u04d9\u0443.®\u043c\u0430\u043c.®\u043c\u0430\u0443.®\u0448\u0456\u043b.®\u0442\u0430\u043c.®\u049b\u044b\u0440.®\u049b\u0430\u0437.®\u049b\u0430\u0440.®\u0436\u0435\u043b\u0442.®®
months=\u049b\u0430\u04a3\u0442\u0430\u0440®\u0430\u049b\u043f\u0430\u043d®\u043d\u0430\u0443\u0440\u044b\u0437®\u0441\u04d9\u0443\u0456\u0440®\u043c\u0430\u043c\u044b\u0440®\u043c\u0430\u0443\u0441\u044b\u043c®\u0448\u0456\u043b\u0434\u0435®\u0442\u0430\u043c\u044b\u0437®\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a®\u049b\u0430\u0437\u0430\u043d®\u049b\u0430\u0440\u0430\u0448\u0430®\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d®®
diff --git a/resource/gnu/java/locale/LocaleInformation_kl.properties b/resource/gnu/java/locale/LocaleInformation_kl.properties
index 4cad25fad..bee1c6a9d 100644
--- a/resource/gnu/java/locale/LocaleInformation_kl.properties
+++ b/resource/gnu/java/locale/LocaleInformation_kl.properties
@@ -7,7 +7,6 @@
decimalSeparator=,
groupingSeparator=.
-currenciesDisplayName.DKK=DKK
currenciesSymbol.DKK=kr
shortMonths=jan®feb®mar®apr®maj®jun®jul®aug®sep®okt®nov®dec®®
months=januari®februari®martsi®aprili®maji®juni®juli®augustusi®septemberi®oktoberi®novemberi®decemberi®®
diff --git a/resource/gnu/java/locale/LocaleInformation_km.properties b/resource/gnu/java/locale/LocaleInformation_km.properties
index d772ce6be..fc979d33f 100644
--- a/resource/gnu/java/locale/LocaleInformation_km.properties
+++ b/resource/gnu/java/locale/LocaleInformation_km.properties
@@ -13,7 +13,9 @@ currenciesSymbol.KHR=\u17db
shortMonths=\u17e1®\u17e2®\u17e3®\u17e4®\u17e5®\u17e6®\u17e7®\u17e8®\u17e9®\u17e1\u17e0®\u17e1\u17e1®\u17e1\u17e2®®
months=\u1798\u1780\u179a\u17b6®\u1780\u17bb\u1798\u17d2\u1797\u17c8®\u1798\u17b7\u1793\u17b6®\u1798\u17c1\u179f\u17b6®\u17a7\u179f\u1797\u17b6®\u1798\u17b7\u1790\u17bb\u1793\u17b6®\u1780\u1780\u17d2\u1780\u178a\u17b6®\u179f\u17b8\u17a0\u17b6®\u1780\u1789\u17d2\u1789\u17b6®\u178f\u17bb\u179b\u17b6®\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6®\u1792\u17d2\u1793\u17bc®®
shortWeekdays=®\u17a2\u17b6®\u1785®\u17a2®\u1796\u17bb®\u1796\u17d2\u179a®\u179f\u17bb®\u179f®
-weekdays=®\u1790\u17d2\u1784\u17c3\u200b\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799®\u1790\u17d2\u1784\u17c3\u200b\u1785\u17d0\u1793\u17d2\u1791®\u1790\u17d2\u1784\u17c3\u200b\u17a2\u1784\u17d2\u1782\u17b6\u179a®\u1790\u17d2\u1784\u17c3\u200b\u1796\u17bb\u1792®\u1790\u17d2\u1784\u17c3\u200b\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd®\u1790\u17d2\u1784\u17c3\u200b\u179f\u17bb\u1780\u17d2\u179a®\u1790\u17d2\u1784\u17c3\u200b\u179f\u17c5\u179a\u17cd®
+weekdays=®\u1790\u17d2\u1784\u17c3\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799®\u200b\u1790\u17d2\u1784\u17c3\u1785\u17d0\u1793\u17d2\u1791®\u1790\u17d2\u1784\u17c3\u17a2\u1784\u17d2\u1782\u17b6\u179a®\u1790\u17d2\u1784\u17c3\u1796\u17bb\u1792®\u1790\u17d2\u1784\u17c3\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd®\u1790\u17d2\u1784\u17c3\u179f\u17bb\u1780\u17d2\u179a®\u1790\u17d2\u1784\u17c3\u179f\u17c5\u179a\u17cd®
+firstDayOfWeek=mon
+eras=\u1798\u17bb\u1793\u200b\u1782.\u179f.®\u1782.\u179f.®
ampms=\u1796\u17d2\u179a\u17b9\u1780®\u179b\u17d2\u1784\u17b6\u1785®
shortDateFormat=d/M/yyyy
mediumDateFormat=d MMMM yyyy
@@ -55,8 +57,8 @@ territories.SA=\u17a2\u17b6\u179a\u17c9\u17b6\u1794\u17ca\u17b8\u179f\u17b6\u17a
territories.FR=\u1794\u17b6\u179a\u17b6\u17c6\u1784
territories.FM=\u1798\u17b7\u1780\u17d2\u179a\u17bc\u1793\u17c1\u179f\u17ca\u17b8
territories.RW=\u179a\u179c\u17c9\u17b6\u1793\u17cb\u178a\u17b6
-territories.RU=\u179a\u17bc\u179f\u17d2\u179f\u17ca\u17b8
territories.FJ=\u17a0\u17d2\u179c\u17c9\u17b8\u17a0\u17d2\u179f\u17c9\u17b8
+territories.RU=\u179a\u17bc\u179f\u17d2\u179f\u17ca\u17b8
territories.FI=\u17a0\u17d2\u179c\u17b6\u17c6\u1784\u17a1\u1784\u17cb
territories.RO=\u179a\u17bc\u1798\u17c9\u17b6\u1793\u17b8
territories.ET=\u17a2\u17c1\u178f\u17d2\u1799\u17bc\u1796\u17b8
@@ -82,11 +84,11 @@ territories.PK=\u1794\u17c9\u17b6\u1782\u17b8\u179f\u17d2\u1790\u17b6\u1793
territories.PH=\u17a0\u17d2\u179c\u17c9\u17b8\u179b\u17b8\u1796\u17b8\u1793
territories.PG=\u1794\u17c9\u17b6\u1796\u17bc\u17a2\u17b6\u1793\u17bc\u179c\u17c2\u179b\u17a0\u17d2\u1782\u17b8\u178e\u17c1
territories.CZ=\u179f\u17b6\u1792\u17b6\u179a\u178e\u179a\u178a\u17d2\u178b\u1786\u17c1\u1780
-territories.PE=\u1794\u17c9\u17c1\u179a\u17bc
territories.CY=\u179f\u17c9\u17b8\u1796\u179a\u17cd
+territories.PE=\u1794\u17c9\u17c1\u179a\u17bc
territories.CV=\u1780\u17b6\u1794\u179c\u17c2\u179a
-territories.PA=\u1794\u17c9\u17b6\u178e\u17b6\u1798\u17c9\u17b6
territories.CU=\u1782\u17bb\u1799\u1794\u17b6
+territories.PA=\u1794\u17c9\u17b6\u178e\u17b6\u1798\u17c9\u17b6
territories.CR=\u1780\u17bc\u179f\u17d2\u178f\u17b6\u179a\u17b8\u1780\u17b6
territories.CO=\u1780\u17bc\u17a1\u17bb\u17c6\u1794\u17ca\u17b8
territories.CN=\u1785\u17b7\u1793
@@ -104,36 +106,36 @@ territories.BW=\u1794\u17bb\u178f\u179f\u17d2\u179c\u17b6\u178e\u17b6
territories.BT=\u1794\u17ca\u17bc\u178f\u17b6\u1793
territories.BS=\u1794\u17b6\u17a0\u17b6\u1798\u17c9\u17b6
territories.BR=\u1794\u17d2\u179a\u17c1\u179f\u17ca\u17b8\u179b
-territories.NZ=\u1793\u17bc\u179c\u17c2\u179b\u17a0\u17d2\u179f\u17c1\u17a1\u1784\u17cb
territories.BO=\u1794\u17bc\u179b\u17b8\u179c\u17b8
+territories.NZ=\u1793\u17bc\u179c\u17c2\u179b\u17a0\u17d2\u179f\u17c1\u17a1\u1784\u17cb
territories.BN=\u1794\u17ca\u17d2\u179a\u17bb\u1799\u178e\u17c1
territories.BJ=\u1794\u17c1\u178e\u17b6\u17c6\u1784
territories.BI=\u1794\u17ca\u17bc\u179a\u17bb\u1793\u178c\u17b8
territories.BH=\u1794\u17b6\u179a\u17c9\u17c2\u1793
territories.BG=\u1794\u17ca\u17bb\u179b\u17a0\u17d2\u1782\u17b6\u179a\u17b8
territories.BF=\u1794\u17ca\u17bc\u179a\u1782\u17b8\u178e\u17b6\u17a0\u17d2\u179c\u17b6\u179f\u17bc
-territories.NP=\u1793\u17c1\u1794\u17c9\u17b6\u179b\u17cb
territories.BE=\u1794\u17c2\u179b\u17a0\u17d2\u179f\u17c9\u17b7\u1780
-territories.NO=\u1793\u17d0\u179a\u179c\u17c2\u179f
+territories.NP=\u1793\u17c1\u1794\u17c9\u17b6\u179b\u17cb
territories.BD=\u1794\u1784\u17cb\u1780\u17d2\u179b\u17b6\u178a\u17c1\u179f\u17d2\u17a0
+territories.NO=\u1793\u17d0\u179a\u179c\u17c2\u179f
territories.BB=\u1794\u17b6\u179a\u1794\u17b6\u178a\u17bc\u179f
territories.ZW=\u17a0\u17d2\u179f\u17ca\u17b8\u1798\u1794\u17b6\u1794\u179c\u17c9\u17c1
-territories.NL=\u17a0\u17bc\u179b\u17d2\u179b\u1784\u17cb
territories.BA=\u1794\u17bc\u179f\u17d2\u1793\u17c9\u17b8
+territories.NL=\u17a0\u17bc\u179b\u17d2\u179b\u1784\u17cb
territories.NI=\u1793\u17b8\u1780\u17b6\u179a\u17c9\u17b6\u17a0\u17d2\u1782\u17d0\u179a
territories.NG=\u1793\u17b8\u17a0\u17d2\u179f\u17c1\u179a\u17b8\u1799\u17c9\u17b6
territories.AZ=\u17a2\u17b6\u17a0\u17ca\u17d2\u179f\u17c2\u179a\u1794\u17c2\u17a0\u17d2\u179f\u1784\u17cb
territories.NE=\u1793\u17b8\u17a0\u17d2\u179f\u17c1\u179a
territories.ZM=\u17a0\u17d2\u179f\u17b6\u17c6\u1794\u17ca\u17b8
-territories.AU=\u17a2\u17bc\u179f\u17d2\u178f\u17d2\u179a\u17b6\u179b\u17b8
territories.NA=\u178e\u17b6\u1798\u17b8\u1794\u17ca\u17b8
+territories.AU=\u17a2\u17bc\u179f\u17d2\u178f\u17d2\u179a\u17b6\u179b\u17b8
territories.AT=\u17a2\u17bc\u1791\u17d2\u179a\u17b8\u179f
territories.AR=\u17a2\u17b6\u17a0\u17d2\u179f\u1784\u17cb\u1791\u17b8\u1793
-territories.MZ=\u1798\u17c9\u17bc\u17a0\u17d2\u179f\u17b6\u17c6\u1794\u17ca\u17b7\u1780
territories.AO=\u17a2\u1784\u17cb\u17a0\u17d2\u1782\u17c4\u17a1\u17b6
+territories.MZ=\u1798\u17c9\u17bc\u17a0\u17d2\u179f\u17b6\u17c6\u1794\u17ca\u17b7\u1780
territories.MY=\u1798\u17c9\u17b6\u179b\u17c1\u179f\u17c9\u17b8
-territories.MX=\u1798\u17c9\u17b7\u1785\u179f\u17b7\u1780
territories.AM=\u17a2\u17b6\u179a\u1798\u17c1\u1793\u17b8
+territories.MX=\u1798\u17c9\u17b7\u1785\u179f\u17b7\u1780
territories.AL=\u17a2\u17b6\u179b\u17cb\u1794\u17b6\u1793\u17b8
territories.ZA=\u17a2\u17b6\u17a0\u17d2\u179c\u17d2\u179a\u17b7\u1780\u1781\u17b6\u1784\u178f\u17d2\u1794\u17bc\u1784
territories.MU=\u1798\u17c9\u17bc\u179a\u17b8\u1791\u17bb\u179f
@@ -146,7 +148,6 @@ territories.MN=\u1798\u17c9\u17bb\u1784\u17a0\u17d2\u1782\u17c4\u179b\u17b8
territories.MM=\u1798\u17b8\u1799\u17c9\u17b6\u1793\u17cb\u1798\u17c9\u17b6
territories.ML=\u1798\u17c9\u17b6\u179b\u17b8
territories.MK=\u1798\u17c9\u17b6\u179f\u17c1\u178a\u1793
-territories.YU=\u1799\u17bc\u17a0\u17d2\u1782\u17c4\u179f\u17d2\u179b\u17b6\u179c\u17b8
territories.MG=\u1798\u17c9\u17b6\u178a\u17b6\u17a0\u17d2\u1780\u17b6\u179f\u17d2\u1780\u17b6\u179a
territories.MD=\u179f\u17b6\u1792\u17b6\u179a\u178e\u179a\u178a\u17d2\u178b\u1798\u17c9\u17bb\u179b\u178a\u17b6\u179c\u17b8
territories.MC=\u1798\u17c9\u17bc\u178e\u17b6\u1780\u17bc
@@ -240,8 +241,8 @@ languages.bm=\u1797\u17b6\u179f\u17b6\u1794\u17b6\u1798\u17d2\u1794\u17b6\u179a\
languages.bh=\u1797\u17b6\u179f\u17b6\u1794\u17b7\u17a0\u17b6\u179a
languages.bg=\u1797\u17b6\u179f\u17b6\u1794\u17ca\u17bb\u179b\u17a0\u17d2\u1780\u17b6\u179a\u17b8
languages.tt=\u1797\u17b6\u179f\u17b6\u178f\u17b6\u178f\u17b6\u179a
-languages.no=\u1797\u17b6\u179f\u17b6\u1793\u17d0\u179a\u179c\u17c2\u179f
languages.be=\u1797\u17b6\u179f\u17b6\u1794\u17c1\u17a1\u17b6\u179a\u17bb\u179f\u17d2\u179f
+languages.no=\u1797\u17b6\u179f\u17b6\u1793\u17d0\u179a\u179c\u17c2\u179f
languages.hi=\u1797\u17b6\u179f\u17b6\u17a0\u17c9\u17b7\u1793\u178c\u17b8
languages.tr=\u1797\u17b6\u179f\u17b6\u1791\u17bd\u179a\u1782\u17b8
languages.nl=\u1797\u17b6\u179f\u17b6\u17a0\u17bb\u179b\u17d2\u179b\u1784\u17cb
@@ -249,8 +250,8 @@ languages.zu=\u1797\u17b6\u179f\u17b6\u17a0\u17d2\u179f\u17c9\u17bc\u179b\u17bc
languages.to=\u1797\u17b6\u179f\u17b6\u178f\u17bb\u1784\u17a0\u17d2\u1782\u17c4
languages.he=\u1797\u17b6\u179f\u17b6\u17a0\u17c1\u1794\u17d2\u179a\u17b7
languages.tk=\u1797\u17b6\u179f\u17b6\u1791\u17bd\u1782\u1798\u17c1\u1793\u17b8\u179f\u17d2\u178f\u1784\u17cb
-languages.ne=\u1797\u17b6\u179f\u17b6\u1793\u17c1\u1794\u17c9\u17b6\u179b\u17cb
languages.az=\u1797\u17b6\u179f\u17b6\u17a2\u17b6\u17a0\u17ca\u17d2\u179f\u17c2\u179a\u1794\u17c2\u17a0\u17d2\u179f\u1784\u17cb
+languages.ne=\u1797\u17b6\u179f\u17b6\u1793\u17c1\u1794\u17c9\u17b6\u179b\u17cb
languages.ay=\u1797\u17b6\u179f\u17b6\u17a2\u17b8\u1798\u17c9\u17b6\u179a\u17c9\u17b6
languages.th=\u1797\u17b6\u179f\u17b6\u1790\u17c3
languages.tg=\u1797\u17b6\u179f\u17b6\u178f\u17b6\u178a\u17a0\u17d2\u179f\u17c9\u17b8\u1782\u17b8\u179f\u17d2\u178f\u1784\u17cb
@@ -262,24 +263,24 @@ languages.gu=\u1797\u17b6\u179f\u17b6\u17a0\u17d2\u1780\u17bb\u1799\u17c9\u17b6\
languages.an=\u1797\u17b6\u179f\u17b6\u17a2\u17b6\u179a\u17c9\u17b6\u17a0\u17d2\u1782\u17c4\u1793
languages.za=\u1797\u17b6\u179f\u17b6\u1785\u17bd\u1784
languages.mt=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17b6\u179b\u17cb\u178f\u17b6
-languages.ms=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17b6\u179b\u17c1\u179f\u17c9\u17b8
languages.gn=\u1797\u17b6\u179f\u17b6\u17a0\u17d2\u1780\u17bd\u179a\u17c9\u17b6\u1793\u17b8
+languages.ms=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17b6\u179b\u17c1\u179f\u17c9\u17b8
languages.sw=\u1797\u17b6\u179f\u17b6\u179f\u17d2\u179c\u17b6\u17a0\u17c9\u17b8\u179b\u17b8
languages.mr=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17b6\u179a\u17b6\u1792\u17b8
languages.sv=\u1797\u17b6\u179f\u17b6\u179f\u17ca\u17bb\u1799\u17a2\u17c2\u178a
languages.gl=\u1797\u17b6\u179f\u17b6\u17a0\u17d2\u1780\u17b6\u179b\u17b8\u179f\u17c9\u17b8
languages.su=\u1797\u17b6\u17c6\u179f\u17b6\u179f\u17ca\u17bc\u178a\u1784\u17cb
languages.af=\u1797\u17b6\u179f\u17b6\u17a2\u17b6\u17a0\u17d2\u179c\u17d2\u179a\u17b8\u1780\u17b6\u17a2\u17b6\u1793
-languages.mo=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17bb\u179b\u178a\u17b6\u179c\u17b8
languages.ae=\u1797\u17b6\u179f\u17b6\u17a2\u17b6\u179c\u17c2\u179f\u17d2\u178f\u1784\u17cb
+languages.mo=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17bb\u179b\u178a\u17b6\u179c\u17b8
languages.mn=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17bb\u1784\u17a0\u17d2\u1782\u17c4\u179b\u17b8
languages.sq=\u1797\u17b6\u179f\u17b6\u17a2\u17b6\u179b\u17cb\u1794\u17b6\u1793\u17b8
languages.ml=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17b6\u17a1\u17b6\u17a1\u17b6\u1799\u17c9\u17b6\u1793
-languages.mk=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17b6\u179f\u17c1\u178a\u17bc\u1793\u17b8
languages.aa=\u1797\u17b6\u179f\u17b6\u17a2\u17b6\u17a0\u17d2\u179c\u17b6\u179a
+languages.mk=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17b6\u179f\u17c1\u178a\u17bc\u1793\u17b8
languages.so=\u1797\u17b6\u179f\u17b6\u179f\u17bc\u1798\u17c9\u17b6\u179b\u17b8
-languages.mi=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17c4\u179a\u17b8
languages.gd=\u1797\u17b6\u179f\u17b6\u17a0\u17d2\u1780\u17c2\u179b\u17b7\u1782
+languages.mi=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17c4\u179a\u17b8
languages.sm=\u1797\u17b6\u179f\u17b6\u179f\u17b6\u1798\u17bc\u17a2\u17b6
languages.sl=\u1797\u17b6\u179f\u17b6\u179f\u17d2\u179b\u17bc\u179c\u17c9\u17b6\u1793\u17b8
languages.mg=\u1797\u17b6\u179f\u17b6\u1798\u17c9\u17b6\u178a\u17b6\u17a0\u17d2\u1780\u17b6\u179f\u1780\u17b6\u179a
@@ -293,13 +294,13 @@ languages.fr=\u1797\u17b6\u179f\u17b6\u1794\u17b6\u179a\u17b6\u17c6\u1784
languages.lv=\u1797\u17b6\u179f\u17b6\u17a1\u17b6\u178f\u179c\u17b8\u1799\u17c9\u17b6
languages.lt=\u1797\u17b6\u179f\u17b6\u179b\u17b8\u1791\u17bb\u1799\u17a2\u17b6\u1793\u17b8
languages.ru=\u1797\u17b6\u179f\u17b6\u0e23\u0e31\u179a\u17bc\u179f\u17d2\u179f\u17c9\u17b8
-languages.lo=\u1797\u17b6\u179f\u17b6\u17a1\u17b6\u179c
languages.fj=\u17a0\u17d2\u179c\u17c9\u17b8\u17a0\u17d2\u179f\u17c9\u17b8
+languages.lo=\u1797\u17b6\u179f\u17b6\u17a1\u17b6\u179c
languages.fi=\u1797\u17b6\u179f\u17b6\u17a0\u17d2\u179c\u17b6\u17c6\u1784\u17a1\u1784\u17cb
languages.ro=\u1797\u17b6\u179f\u17b6\u179a\u17bc\u1798\u17c9\u17b6\u1793\u17b8
languages.rn=\u1797\u17b6\u179f\u17b6\u179a\u17bc\u1793\u17d2\u178c\u17b8
languages.la=\u1797\u17b6\u179f\u17b6\u17a1\u17b6\u178f\u17c6\u17b6\u1784
languages.xh=\u1797\u17b6\u179f\u17b6\u1783\u179f\u17b6
languages.eu=\u1797\u17b6\u179f\u17b6\u1794\u17b6\u179f\u17d2\u1780\u17c1
-languages.ky=\u1797\u17b6\u179f\u17b6\u1782\u17c0\u179a\u17a0\u17d2\u1782\u17b8\u179f\u17d2\u178f\u1784\u17cb
languages.et=\u1797\u17b6\u179f\u17b6\u17a2\u17c1\u179f\u17d2\u178f\u17bc\u1793\u17b8
+languages.ky=\u1797\u17b6\u179f\u17b6\u1782\u17c0\u179a\u17a0\u17d2\u1782\u17b8\u179f\u17d2\u178f\u1784\u17cb
diff --git a/resource/gnu/java/locale/LocaleInformation_kn.properties b/resource/gnu/java/locale/LocaleInformation_kn.properties
index badc5a178..839c7df02 100644
--- a/resource/gnu/java/locale/LocaleInformation_kn.properties
+++ b/resource/gnu/java/locale/LocaleInformation_kn.properties
@@ -5,7 +5,7 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesSymbol.INR=\u0930\u0941
+currenciesSymbol.INR=\u0cb0\u0cc2
shortMonths=\u0c9c\u0ca8\u0cb5\u0cb0\u0cc0®\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cc0®\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd®\u0c8e\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd®\u0cae\u0cc6®\u0c9c\u0cc2\u0ca8\u0ccd®\u0c9c\u0cc1\u0cb2\u0cc8®\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd®\u0cb8\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd®\u0c85\u0c95\u0ccd\u0c9f\u0ccb\u0cac\u0cb0\u0ccd®\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd®\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd®®
months=\u0c9c\u0ca8\u0cb5\u0cb0\u0cc0®\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cc0®\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd®\u0c8e\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd®\u0cae\u0cc6®\u0c9c\u0cc2\u0ca8\u0ccd®\u0c9c\u0cc1\u0cb2\u0cc8®\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd®\u0cb8\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd®\u0c85\u0c95\u0ccd\u0c9f\u0ccb\u0cac\u0cb0\u0ccd®\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd®\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd®®
shortWeekdays=®\u0cb0.®\u0cb8\u0ccb.®\u0cae\u0c82.®\u0cac\u0cc1.®\u0c97\u0cc1.®\u0cb6\u0cc1.®\u0cb6\u0ca8\u0cbf.®
diff --git a/resource/gnu/java/locale/LocaleInformation_kn_IN.properties b/resource/gnu/java/locale/LocaleInformation_kn_IN.properties
index dd8ef56cd..857c9cca5 100644
--- a/resource/gnu/java/locale/LocaleInformation_kn_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_kn_IN.properties
@@ -5,8 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
firstDayOfWeek=mon
shortDateFormat=d-M-yy
mediumDateFormat=dd-MM-yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_ko.properties b/resource/gnu/java/locale/LocaleInformation_ko.properties
index 86ed71995..ee2974d0b 100644
--- a/resource/gnu/java/locale/LocaleInformation_ko.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ko.properties
@@ -6,699 +6,241 @@
# This file was automatically generated by gnu.localegen from CLDR.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=\uc694\ub974\ub2e8 \ub514\ub098\ub974
-currenciesDisplayName.XAU=\uae08
-currenciesDisplayName.FOK=\ud398\ub85c\uc81c\ub3c4 \ud06c\ub85c\ub108
-currenciesDisplayName.LBP=\ub808\ubc14\ub17c \ud30c\uc6b4\ub4dc
-currenciesDisplayName.EUR=\uc720\ub85c\ud654
-currenciesDisplayName.VND=\ubca0\ud2b8\ub0a8 \ub3d9
-currenciesDisplayName.TZS=\ud0c4\uc790\ub2c8\uc544 \uc2e4\ub9c1
-currenciesDisplayName.BOP=\ubcfc\ub9ac\ube44\uc544\ub178 \ud398\uc18c
-currenciesDisplayName.KHR=\uce84\ubcf4\ub514\uc544 \ub9ac\uc584
-currenciesDisplayName.XAM=\uc544\uc2dc\uc544 \uae30\uae08 \uc5f0\ud569 \ud1b5\ud654 \ub2e8\uc704
-currenciesDisplayName.BOL=\ubcfc\ub9ac\ube44\uc544\ub178 (1863-1962)
-currenciesDisplayName.KHO=\uce84\ubcf4\ub514\uc544 \uad6c\uad8c \ub9ac\uc584
-currenciesDisplayName.ZMP=\uc7d8\ube44\uc544 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.AUP=\ud638\uc8fc \ud30c\uc6b4\ub4dc
-currenciesDisplayName.MTP=\ubab0\ud0c0 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.GHR=\uac00\ub098 \uc7ac\ud3c9\uac00 \uc2dc\ub514
-currenciesDisplayName.ZMK=\uc7d8\ube44\uc544 \ucf70\uccd0
-currenciesDisplayName.XAD=\uc544\uc2dc\uc544 \ub514\ub098\ub974 \uacc4\uc0b0 \ub2e8\uc704
-currenciesDisplayName.GHP=\uac00\ub098 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.BOB=\ubcfc\ub9ac\ube44\uc544\ub178
-currenciesDisplayName.GHO=\uac00\ub098 \uad6c\uad8c \uc2dc\ub514
-currenciesDisplayName.MTL=\ubab0\ud0c0 \ub9ac\ub77c
-currenciesDisplayName.AUD=\ud638\uc8fc \ub2ec\ub7ec
-currenciesDisplayName.ITL=\uc774\ud0c8\ub9ac\uc544 \ub9ac\ub77c
-currenciesDisplayName.GHC=\uac00\ub098 \uc2dc\ub514
-currenciesDisplayName.SGD=\uc2f1\uac00\ud3f4 \ub2ec\ub7ec
-currenciesDisplayName.PAB=\ud30c\ub098\ub9c8 \ubc1c\ubcf4\uc544
-currenciesDisplayName.LAK=\ub77c\uc624\uc2a4 \ud0a4\ud504
-currenciesDisplayName.KGS=\ud0a4\ub974\uae30\uc2a4\uc2a4\ud0c4 \uc19c
-currenciesDisplayName.CHF=\uc2a4\uc704\uc2a4 \ud504\ub791\ub2ec\ub7ec
-currenciesDisplayName.ATS=\ud638\uc8fc \uc2e4\ub9c1
-currenciesDisplayName.USD=\ubbf8\uad6d \ub2ec\ub7ec
-currenciesDisplayName.ETD=\uc774\ub514\uc624\ud53c\uc544 \ub2ec\ub7ec
-currenciesDisplayName.BND=\ubd80\ub8e8\ub098\uc774 \ub2ec\ub7ec
-currenciesDisplayName.JMP=\uc790\uba54\uc774\uce74 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.ETB=\uc774\ub514\uc624\ud53c\uc544 \ube44\ub974
-currenciesDisplayName.DZG=\uc54c\uc81c\ub9ac \ud504\ub791 \uc81c\ub974\ubbf8\ub0a0
-currenciesDisplayName.DZF=\uc54c\uc81c\ub9ac \uc2e0\uad8c \ud504\ub791
-currenciesDisplayName.DZD=\uc54c\uc81c\ub9ac \ub514\ub098\ub974
-currenciesDisplayName.PYG=\ud30c\ub77c\uacfc\uc774 \uacfc\ub77c\ub2c8
-currenciesDisplayName.LYP=\ub9ac\ube44\uc544 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.JMD=\uc790\uba54\uc774\uce74 \ub2ec\ub7ec
-currenciesDisplayName.ISK=\uc544\uc774\uc2ac\ub780\ub4dc \ud06c\ub85c\ub098
-currenciesDisplayName.ESP=\uc2a4\ud398\uc778 \ud398\uc138\ud0c0
-currenciesDisplayName.BMP=\ubc84\ubba4\ub2e4 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.LYD=\ub9ac\ube44\uc544 \ub514\ub098\ub974
-currenciesDisplayName.LYB=\ub9ac\ube44\uc544 \uc601\uad6d \uad70\uc0ac\ub839 \ub9ac\ub77c
-currenciesDisplayName.BMD=\ubc84\ubba4\ub2e4 \ub2ec\ub7ec
-currenciesDisplayName.NLG=\ub124\ub378\ub780\ub4dc \uae38\ub354
-currenciesDisplayName.MRO=\ubaa8\ub9ac\ud0c0\ub2c8 \uc6b0\uae30\uc57c
-currenciesDisplayName.IRR=\uc774\ub780 \ub9ac\uc584
-currenciesDisplayName.SEK=\uc2a4\uc6e8\ub374 \ud06c\ub85c\ub098
-currenciesDisplayName.ERN=\uc5d0\ub9ac\ud2b8\ub9ac\uc544 \ub098\ud06c\ud30c
+currenciesDisplayName.YDD=\uc608\uba58 \ub514\ub098\ub974
+currenciesDisplayName.TWD=\ub300\ub9cc \uc2e0\uad8c \ub2ec\ub7ec
currenciesDisplayName.KES=\ucf00\ub0d0 \uc2e4\ub9c1
+currenciesDisplayName.BYB=\ubca8\ub77c\ub8e8\uc2a4 \uc2e0\uad8c \ub8e8\ube14 (1994-1999)
+currenciesDisplayName.LKR=\uc2a4\ub9ac\ub791\uce74 \ub8e8\ud53c
+currenciesDisplayName.RWF=\ub974\uc644\ub2e4 \ud504\ub791
+currenciesDisplayName.TJS=\ud0c0\uc9c0\ud0a4\uc2a4\ud0c4 \uc18c\ubaa8\ub2c8
+currenciesDisplayName.SDP=\uc218\ub2e8 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.TJR=\ud0c0\uc9c0\ud0a4\uc2a4\ud0c4 \ub8e8\ube14
+currenciesDisplayName.ERN=\uc5d0\ub9ac\ud2b8\ub9ac\uc544 \ub098\ud06c\ud30c
+currenciesDisplayName.AFN=\uc544\ud504\uac00\ub2c8
+currenciesDisplayName.GRD=\uadf8\ub9ac\uc2a4 \ub4dc\ub77c\ud06c\ub9c8
+currenciesDisplayName.IEP=\uc544\uc77c\ub79c\ub4dc \ud30c\uc6b4\ub4dc
currenciesDisplayName.ARS=\uc544\ub974\ud5e8\ud2f0\ub098 \ud398\uc18c
+currenciesDisplayName.SDD=\uc218\ub2e8 \ub514\ub098\ub974
currenciesDisplayName.ARP=\uc544\ub974\ud5e8\ud2f0\ub098 \ud398\uc18c (1983-1985)
-currenciesDisplayName.ARM=\uc544\ub974\ud5e8\ud2f0\ub098 \ud398\uc18c \ubaa8\ub124\ub2e4 \uad6d\uc601
-currenciesDisplayName.TWD=\ub300\ub9cc \uc2e0\uad8c \ub2ec\ub7ec
-currenciesDisplayName.SDP=\uc218\ub2e8 \ud30c\uc6b4\ub4dc
currenciesDisplayName.GEL=\uadf8\ub8e8\uc9c0\uc57c \ub77c\ub9ac
+currenciesDisplayName.AFA=\uc544\ud504\uac00\ub2c8 (1927-2002)
currenciesDisplayName.GEK=\uadf8\ub8e8\uc9c0\uc57c \uc9c0\ud3d0 \ub77c\ub9ac\ud2b8
-currenciesDisplayName.MQF=\ub9d0\ud2f0\ub2c8\ud06c \ud504\ub791
+currenciesDisplayName.CRC=\ucf54\uc2a4\ud0c0\ub9ac\uce74 \ucf5c\ub860
currenciesDisplayName.FKP=\ud3ec\ud074\ub79c\ub4dc\uc81c\ub3c4 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.EEK=\uc5d0\uc2a4\ud1a0\ub2c8\uc544 \ud06c\ub8ec
+currenciesDisplayName.HKD=\ud64d\ucf69 \ub2ec\ub7ec
+currenciesDisplayName.MDL=\ubab0\ub3c4\ubc14 \ub808\uc774
currenciesDisplayName.ARA=\uc544\ub974\ud5e8\ud2f0\ub098 \uc624\uc2a4\ud2b8\ub784
-currenciesDisplayName.SDD=\uc218\ub2e8 \ub514\ub098\ub974
currenciesDisplayName.IQD=\uc774\ub77c\ud06c \ub514\ub098\ub974
-currenciesDisplayName.TVD=\ud22c\ubc1c\ub8e8 \ub2ec\ub7ec
currenciesDisplayName.SCR=\uc138\uc774\uc274 \ub8e8\ud53c
+currenciesDisplayName.VUV=\ubc14\ub204\uc544\ud22c \ubc14\ud22c
+currenciesDisplayName.DKK=\ub374\ub9c8\ud06c \ud06c\ub85c\ub124
+currenciesDisplayName.KPW=\uc870\uc120 \ubbfc\uc8fc\uc8fc\uc758 \uc778\ubbfc \uacf5\ud654\uad6d \uc6d0
+currenciesDisplayName.IDR=\uc778\ub3c4\ub124\uc2dc\uc544 \ub8e8\ud53c\uc544
currenciesDisplayName.LVR=\ub77c\ud2b8\ube44\uc544 \ub8e8\ube14
-currenciesDisplayName.FJP=\ud53c\uc9c0 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.SOS=\uc18c\ub9d0\ub9ac\uc544 \uc2e4\ub9c1
+currenciesDisplayName.AED=\uc544\ub78d\uc5d0\ubbf8\ub808\uc774\ud2b8 \ub514\ub098\ub974
+currenciesDisplayName.BWP=\ubcf4\uce20\uc640\ub098 \ud3f4\ub77c
currenciesDisplayName.LVL=\ub77c\ud2b8\ube44\uc544 \ub77c\ud2b8
-currenciesDisplayName.CDL=\ucf69\uace0 \uc790\uc774\ub974
-currenciesDisplayName.CDG=\ucf69\uace0 \uacf5\ud654\uad6d \ud504\ub791
-currenciesDisplayName.CDF=\ucf69\uace0 \ud504\ub791 \ucf69\uace8\ub77c\uc2a4
-currenciesDisplayName.FJD=\ud53c\uc9c0 \ub2ec\ub7ec
+currenciesDisplayName.RUR=\ub7ec\uc2dc\uc544 \ub8e8\ube14 (1991-1998)
currenciesDisplayName.NIO=\ub2c8\uce74\ub77c\uacfc \ucf54\ub974\ub3c4\ubc14 \uc624\ub85c
+currenciesDisplayName.ADP=\uc548\ub3c4\ub77c \ud398\uc138\ud0c0
+currenciesDisplayName.FJD=\ud53c\uc9c0 \ub2ec\ub7ec
currenciesDisplayName.MOP=\ub9c8\uce74\uc624 \ud30c\ud0c0\uce74
+currenciesDisplayName.RUB=\ub7ec\uc2dc\uc544 \ub8e8\ube14
+currenciesDisplayName.CDF=\ucf69\uace0 \ud504\ub791 \ucf69\uace8\ub77c\uc2a4
currenciesDisplayName.NIC=\ub2c8\uce74\ub77c\uacfc \ucf54\ub974\ub3c4\ubc14
-currenciesDisplayName.FIN=\ud540\ub780\ub4dc \ub9c8\ub974\uce74 (1860-1962)
-currenciesDisplayName.FIM=\ud540\ub780\ub4dc \ub9c8\ub974\uce74
+currenciesDisplayName.DJF=\uc9c0\ubd80\ud2f0 \ud504\ub791
currenciesDisplayName.SBD=\uc194\ub85c\ubaac \uc81c\ub3c4 \ub2ec\ub7ec
+currenciesDisplayName.UZS=\uc6b0\uc988\ubca0\ud0a4\uc2a4\ud0c4 \uc228
+currenciesDisplayName.ECS=\uc5d0\ucfe0\uc544\ub3c4\ub974 \uc218\ud06c\ub808
+currenciesDisplayName.PHP=\ud544\ub9ac\ud540 \ud398\uc18c
+currenciesDisplayName.THB=\ud0dc\uad6d \ubc14\ud2b8
currenciesDisplayName.LUF=\ub8e9\uc148\ubd80\ub974\ud06c \ud504\ub791
-currenciesDisplayName.TTO=\ud2b8\ub9ac\ub2c8\ub2e4\ub4dc \ud1a0\ubc14\uace0 \uad6c\uad8c \ub2ec\ub7ec
-currenciesDisplayName.AOS=\uc559\uace8\ub77c \uc5d0\uc2a4\ucfe0\ub3c4
-currenciesDisplayName.AOR=\uc559\uace8\ub77c \ucf74\uc790 Reajustado (1995-1999)
-currenciesDisplayName.MNT=\ubabd\uace8 \ud22c\uadf8\ub9ad
-currenciesDisplayName.HUF=\ud5dd\uac00\ub9ac \ud3ec\ub9b0\ud2b8
-currenciesDisplayName.BIF=\ubd80\ub8ec\ub514 \ud504\ub791
-currenciesDisplayName.AON=\uc559\uace8\ub77c \uc2e0\uadc4 \ucf74\uc790 (1990-2000)
-currenciesDisplayName.AOK=\uc559\uace8\ub77c \ucf74\uc790 (1977-1990)
+currenciesDisplayName.FIM=\ud540\ub780\ub4dc \ub9c8\ub974\uce74
currenciesDisplayName.TTD=\ud2b8\ub9ac\ub2c8\ub2e4\ub4dc \ud1a0\ubc14\uace0 \ub2ec\ub7ec
currenciesDisplayName.SZL=\uc2a4\uc640\uc9c8\ub780\ub4dc \ub9b4\ub791\uac8c\ub2c8
-currenciesDisplayName.GBP=\uc601\uad6d\ub839 \ud30c\uc6b4\ub4dc \uc2a4\ud138\ub9c1
-currenciesDisplayName.SAS=\uc0ac\uc6b0\ub514\uc544\ub77c\ube44\uc544 \uc790\uce58\ub839 \ub9ac\uc584
+currenciesDisplayName.MNT=\ubabd\uace8 \ud22c\uadf8\ub9ad
currenciesDisplayName.SAR=\uc0ac\uc6b0\ub514\uc544\ub77c\ube44\uc544 \ub9ac\uc584
+currenciesDisplayName.UAH=\uc6b0\ud06c\ub77c\uc774\ub098 \uadf8\ub9ac\ube0c\ub098
+currenciesDisplayName.HUF=\ud5dd\uac00\ub9ac \ud3ec\ub9b0\ud2b8
+currenciesDisplayName.COP=\ucf5c\ub86c\ube44\uc544 \ud398\uc18c
+currenciesDisplayName.QAR=\uce74\ud0c0\ub974 \ub9ac\uc584
currenciesDisplayName.LTT=\ub8e9\uc148\ubd80\ub974\ud06c \ud0c0\ub85c\ub098
-currenciesDisplayName.INR=\uc778\ub3c4 \ub8e8\ud53c
currenciesDisplayName.PTE=\ud3ec\ub974\ud22c\uac08 \uc5d0\uc2a4\ucfe0\ub3c4
-currenciesDisplayName.AOA=\uc559\uace8\ub77c \ucf74\uc790
-currenciesDisplayName.PTC=\ud3ec\ub974\ud22c\uac08 \ucf58\ud1a0
+currenciesDisplayName.AOR=\uc559\uace8\ub77c \ucf74\uc790 Reajustado (1995-1999)
+currenciesDisplayName.UYU=\uc6b0\ub8e8\uacfc\uc774 \ud398\uc18c \uc6b0\ub8e8\uacfc\uc694
+currenciesDisplayName.GBP=\uc601\uad6d\ub839 \ud30c\uc6b4\ub4dc \uc2a4\ud138\ub9c1
+currenciesDisplayName.BIF=\ubd80\ub8ec\ub514 \ud504\ub791
+currenciesDisplayName.INR=\uc778\ub3c4 \ub8e8\ud53c
+currenciesDisplayName.ZRZ=\uc790\uc774\ub974 \uc790\uc774\ub974
+currenciesDisplayName.AON=\uc559\uace8\ub77c \uc2e0\uadc4 \ucf74\uc790 (1990-2000)
currenciesDisplayName.LTL=\ub9ac\ud22c\uc544\ub2c8\uc544 \ub9ac\ud0c0
+currenciesDisplayName.XFU=\ud504\ub791\uc2a4 UIC-\ud504\ub791
currenciesDisplayName.KZT=\uce74\uc790\ud750\uc2a4\ud0c4 \ud150\uac8c
-currenciesDisplayName.KZR=\uce74\uc790\ud750\uc2a4\ud0c4 \ub8e8\ube14
-currenciesDisplayName.VGD=\uc601\uad6d\ub839 \ubc84\uc9c4 \uc544\uc77c\ub79c\ub4dc \ub2ec\ub7ec
-currenciesDisplayName.NGP=\ub2c8\uc81c\ub974 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.MMX=\ubbf8\uc580\ub9c8 \ub2ec\ub7ec \ud0dc\ud658\uad8c
+currenciesDisplayName.MZM=\ubaa8\uc7a0\ube44\ud06c \uba54\ud2f0\uce7c
+currenciesDisplayName.UYP=\uc6b0\ub8e8\uacfc\uc774 \ud398\uc18c (1975-1993)
+currenciesDisplayName.AOK=\uc559\uace8\ub77c \ucf74\uc790 (1977-1990)
+currenciesDisplayName.BUK=\ubc84\ub9c8 \ucc28\ud2b8
+currenciesDisplayName.GNS=\uae30\ub2c8 \uc2dc\ub9ac
+currenciesDisplayName.XFO=\ud504\ub791\uc2a4 Gold \ud504\ub791
+currenciesDisplayName.PGK=\ud30c\ud478\uc544\ub274\uae30\ub2c8 \ud0a4\ub098
+currenciesDisplayName.SYP=\uc2dc\ub9ac\uc544 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.MZE=\ubaa8\uc7a0\ube44\ud06c \uc5d0\uc2a4\ucfe0\ub3c4
+currenciesDisplayName.OMR=\uc624\ub9cc \ub9ac\uc584
currenciesDisplayName.NGN=\ub2c8\uc81c\ub974 \ub098\uc774\ub77c
+currenciesDisplayName.ZRN=\uc790\uc774\ub974 \uc2e0\uad8c \uc790\uc774\ub974
+currenciesDisplayName.AOA=\uc559\uace8\ub77c \ucf74\uc790
+currenciesDisplayName.CNY=\uc911\uad6d \uc704\uc548 \uc778\ubbfc\ud3d0
+currenciesDisplayName.MAF=\ubaa8\ub85c\ucf54 \ud504\ub791
+currenciesDisplayName.GNF=\uae30\ub2c8 \ud504\ub791
currenciesDisplayName.HTG=\ud558\uc774\ud2f0 \uad6c\ub974\ub4dc
-currenciesDisplayName.SYP=\uc2dc\ub9ac\uc544 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.PSP=\ud314\ub808\uc2a4\ud0c0\uc778 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.BHD=\ubc14\ub808\uc778 \ub514\ub098\ub974
+currenciesDisplayName.MAD=\ubaa8\ub85c\ucf54 \ub514\ub818
+currenciesDisplayName.TRY=\uc0c8\ub85c\uc6b4 \ud130\ud0a4 \ub9ac\ub77c
currenciesDisplayName.MMK=\ubbf8\uc580\ub9c8 \ud0a4\uc58f
+currenciesDisplayName.MYR=\ub9d0\ub808\uc774\uc9c0\uc544 \ub9c1\uae30\ud2b8
+currenciesDisplayName.LSL=\ub808\uc18c\ud1a0 \ub85c\ud2f0
+currenciesDisplayName.XEU=\uc720\ub7fd \ud658\uc728 \ub2e8\uc704
+currenciesDisplayName.BHD=\ubc14\ub808\uc778 \ub514\ub098\ub974
+currenciesDisplayName.SLL=\uc2dc\uc5d0\ub77c\ub9ac\uc628 \ub9ac\uc628
+currenciesDisplayName.BTN=\ubd80\ud0c4 \ub20c\ud22c\ub214
+currenciesDisplayName.TRL=\ud130\uae30 \ub9ac\ub77c
+currenciesDisplayName.KMF=\ucf54\ubaa8\ub974 \ud504\ub791
currenciesDisplayName.ANG=\ub124\ub378\ub780\ub4dc \uc548\ud2f8\ub808\uc2a4 \uad74\ub374
currenciesDisplayName.CZK=\uccb4\ucf54 \uacf5\ud654\uad6d \ucf54\ub8e8\ub098
-currenciesDisplayName.IMP=\ub9e8\ub3c4 \ud30c\uc6b4\ub4dc \uc2a4\ud138\ub9c1
-currenciesDisplayName.BGX=\ubd88\uac00\ub9ac\uc544 \ub81b \ud0dc\ud658\uad8c
-currenciesDisplayName.LSL=\ub808\uc18c\ud1a0 \ub85c\ud2f0
-currenciesDisplayName.GAF=\uac00\ubd09 CFA \ud504\ub791
-currenciesDisplayName.BGO=\ubd88\uac00\ub9ac\uc544 \ub81b (1879-1952)
+currenciesDisplayName.AZM=\uc544\uc81c\ub974\ubc14\uc774\uc820 \ub9c8\ub098\ud2b8
+currenciesDisplayName.KYD=\ucf00\uc774\ub9e8 \uc81c\ub3c4 \ub2ec\ub7ec
+currenciesDisplayName.GMD=\uac10\ube44\uc544 \ub2ec\ub77c\uc2dc
currenciesDisplayName.BGN=\ubd88\uac00\ub9ac\uc544 \uc2e0\uad8c \ub81b
-currenciesDisplayName.BGM=\ubd88\uac00\ub9ac\uc544 \uc0ac\ud68c\uc8fc\uc758 \ub81b
currenciesDisplayName.CAD=\uce90\ub098\ub2e4 \ub2ec\ub7ec
currenciesDisplayName.BGL=\ubd88\uac00\ub9ac\uc544 \ub3d9\uc804 \ub81b
-currenciesDisplayName.TRL=\ud130\uae30 \ub9ac\ub77c
-currenciesDisplayName.KYD=\ucf00\uc774\ub9e8 \uc81c\ub3c4 \ub2ec\ub7ec
-currenciesDisplayName.CYP=\uc2f8\uc774\ud504\ub7ec\uc2a4 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.VEB=\ubca0\ub124\uc8fc\uc5d8\ub77c \ubcfc\ub9ac\ubc14\ub974
+currenciesDisplayName.MLF=\ub9d0\ub9ac \ud504\ub791
currenciesDisplayName.ILS=\uc774\uc2a4\ub77c\uc5d8 \uc2e0\uad8c \uc138\ucf08
+currenciesDisplayName.MXP=\uba55\uc2dc\ucf54 \uc2e4\ubc84 \ud398\uc18c (1861-1992)
+currenciesDisplayName.PES=\ud398\ub8e8 \uc194
currenciesDisplayName.GYD=\uac00\uc774\uc544\ub098 \ub2ec\ub7ec
-currenciesDisplayName.AMD=\uc544\ub974\uba54\ub2c8\uc544 \ub4dc\ub78c
+currenciesDisplayName.MXN=\uba55\uc2dc\ucf54 \ud398\uc18c
currenciesDisplayName.ILP=\uc774\uc2a4\ub77c\uc5d8 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.MLF=\ub9d0\ub9ac \ud504\ub791
-currenciesDisplayName.ILL=\uc774\uc2a4\ub77c\uc5d8 \uc138\ucf08
-currenciesDisplayName.VEB=\ubca0\ub124\uc8fc\uc5d8\ub77c \ubcfc\ub9ac\ubc14\ub974
-currenciesDisplayName.ALX=\uc54c\ubc14\ub2c8\uc544 \ub2ec\ub7ec \ud0dc\ud658\uad8c
+currenciesDisplayName.SKK=\uc2ac\ub85c\ubc14\ud0a4\uc544 \ucf54\ub8e8\ub098
+currenciesDisplayName.CYP=\uc2f8\uc774\ud504\ub7ec\uc2a4 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.XDR=\ud2b9\ubcc4\uc778\ucd9c\uad8c
+currenciesDisplayName.PEN=\ud398\ub8e8 \uc194 \ub204\uc5d0\ubcf4
currenciesDisplayName.LRD=\ub77c\uc774\ubca0\ub9ac\uc544 \ub2ec\ub7ec
-currenciesDisplayName.ALV=\uc54c\ubc14\ub2c8\uc544 \ub808\ud06c \ubc1c\ub8e8\ud2b8
+currenciesDisplayName.PEI=\ud398\ub8e8 \uc778\ud2f0
+currenciesDisplayName.AMD=\uc544\ub974\uba54\ub2c8\uc544 \ub4dc\ub78c
+currenciesDisplayName.BSD=\ubc14\ud558\ub9c8 \ub2ec\ub7ec
currenciesDisplayName.HRK=\ud06c\ub85c\uc544\ud2f0\uc544 \ucfe0\ub098
-currenciesDisplayName.REF=\ub9ac\uc720\ub2c8\uc628 \ud504\ub791
+currenciesDisplayName.CLP=\uce60\ub808 \ud398\uc18c
currenciesDisplayName.HRD=\ud06c\ub85c\uc544\ud2f0\uc544 \ub514\ub098\ub974
-currenciesDisplayName.ALL=\uc54c\ubc14\ub2c8\uc544 \ub808\ud06c
-currenciesDisplayName.JEP=\uc800\uc9c0 \ud30c\uc6b4\ub4dc \uc2a4\ud138\ub9c1
-currenciesDisplayName.ALK=\uc54c\ubc14\ub2c8\uc544 \ub808\ud06c (1946-1961)
-currenciesDisplayName.MKN=\ub9c8\ucf00\ub3c4\ub2c8\uc544 \ub514\ub098\ub974 (1992-1993)
-currenciesDisplayName.VDP=\ubd81 \ubca0\ud2b8\ub0a8 \ubca0\ud2b8\ubbfc \ud53c\uc544\uc2a4\ud0c0 \ub3d9 \ubca0\ud2b8
-currenciesDisplayName.VDN=\ubd81 \ubca0\ud2b8\ub0a8 \uc2e0\uad8c \ub3d9
+currenciesDisplayName.FRF=\ud504\ub791\uc2a4 \ud504\ub791
+currenciesDisplayName.BRR=\ube0c\ub77c\uc9c8 \ud06c\ub8e8\uc81c\uc774\ub8e8
currenciesDisplayName.MKD=\ub9c8\ucf00\ub3c4\ub2c8\uc544 \ub514\ub098\ub974
-currenciesDisplayName.VDD=\ubd81 \ubca0\ud2b8\ub0a8 \ud53c\uc544\uc2a4\ud0c0 \ub3d9 \ubca0\ud2b8
-currenciesDisplayName.TPP=\ud2f0\ubaa8\ub974 \ud30c\ud0c0\uce74
-currenciesDisplayName.BEL=\ubca8\uae30\uc5d0 \ud504\ub791 (\uae08\uc735)
-currenciesDisplayName.GWP=\uae30\ub124\ube44\uc3d8 \ud398\uc18c
+currenciesDisplayName.ALL=\uc54c\ubc14\ub2c8\uc544 \ub808\ud06c
+currenciesDisplayName.BRN=\ube0c\ub77c\uc9c8 \ud06c\ub8e8\uc790\ub450 \ub178\ubcf4
+currenciesDisplayName.MWK=\ub9d0\ub77c\uc704 \ucf70\uccd0
+currenciesDisplayName.BRL=\ube0c\ub77c\uc9c8 \ub808\uc54c
+currenciesDisplayName.TPE=\ud2f0\ubaa8\ub974 \uc5d0\uc2a4\ucfe0\ub3c4
+currenciesDisplayName.BRE=\ube0c\ub77c\uc9c8 \ud06c\ub8e8\uc81c\uc774\ub8e8 (1990-1993)
+currenciesDisplayName.BRC=\ube0c\ub77c\uc9c8 \ud06c\ub8e8\uc790\ub450
+currenciesDisplayName.BRB=\ubcfc\ub9ac\ube44\uc544\ub178 \ud06c\ub8e8\uc81c\uc774\ub8e8 \ub178\ubcf4 (1967-1986)
+currenciesDisplayName.DEM=\ub3c5\uc77c \ub9c8\ub974\ud06c
currenciesDisplayName.KWD=\ucfe0\uc6e8\uc774\ud2b8 \ub514\ub098\ub974
-currenciesDisplayName.GWM=\ud3ec\ub974\ud22c\uac08\ub839 \uae30\ub2c8 \ubc00 \ub808\uc774\uc2a4
+currenciesDisplayName.XCD=\ub3d9\uce74\ub9ac\ube0c \ub2ec\ub7ec
+currenciesDisplayName.NPR=\ub124\ud314 \ub8e8\ud53c
+currenciesDisplayName.GWP=\uae30\ub124\ube44\uc3d8 \ud398\uc18c
+currenciesDisplayName.YUN=\uc720\uace0\uc2ac\ub77c\ube44\uc544 \uc804\ud658 \ub514\ub098\ub974
+currenciesDisplayName.SVC=\uc5d8\uc0b4\ubc14\ub3c4\ub974 \ucf5c\ub860
+currenciesDisplayName.YUM=\uc720\uace0\uc2ac\ub77c\ube44\uc544 \ub178\ube44 \ub514\ub098\ub974
+currenciesDisplayName.BEL=\ubca8\uae30\uc5d0 \ud504\ub791 (\uae08\uc735)
+currenciesDisplayName.SIT=\uc2ac\ub85c\ubca0\ub2c8\uc544 \ud1a8\ub77c\ub974
+currenciesDisplayName.JPY=\uc77c\ubcf8 \uc5d4\ud654
+currenciesDisplayName.MVR=\ubab0\ub514\ube0c \uc81c\ub3c4 \ub8e8\ud53c\uc544
+currenciesDisplayName.GWE=\ud3ec\ub974\ud22c\uac08\ub839 \uae30\ub2c8 \uc5d0\uc2a4\ucfe0\ub3c4
currenciesDisplayName.BEF=\ubca8\uae30\uc5d0 \ud504\ub791
-currenciesDisplayName.TPE=\ud2f0\ubaa8\ub974 \uc5d0\uc2a4\ucfe0\ub3c4
+currenciesDisplayName.YUD=\uc720\uace0\uc2ac\ub77c\ube44\uc544 \ub3d9\uc804 \ub514\ub098\ub974
currenciesDisplayName.BEC=\ubca8\uae30\uc5d0 \ud504\ub791 (\ud0dc\ud658)
-currenciesDisplayName.GWE=\ud3ec\ub974\ud22c\uac08\ub839 \uae30\ub2c8 \uc5d0\uc2a4\ucfe0\ub3c4
-currenciesDisplayName.SVC=\uc5d8\uc0b4\ubc14\ub3c4\ub974 \ucf5c\ub860
-currenciesDisplayName.CWG=\ucfe0\ub77c\uce74\uc624 \uae38\ub354
-currenciesDisplayName.BDT=\ubc29\uae00\ub77c\ub370\uc2dc \ud0c0\uce74
-currenciesDisplayName.TOS=\ud1b5\uac00 \ud30c\uc6b4\ub4dc \uc2a4\ud138\ub9c1
currenciesDisplayName.SUR=\uc18c\ub828 \ub8e8\ube14
-currenciesDisplayName.SUN=\uc18c\ub828 \uc2e0\uad8c \ub8e8\ube14
-currenciesDisplayName.NCF=\ub274 \uce7c\ub808\ub3c4\ub2c8\uc544 \ud504\ub791 \uc81c\ub974\ubbf8\ub0a0
-currenciesDisplayName.CVE=\uce74\ubcf4\ubca0\ub974\ub370 \uc5d0\uc2a4\ucfe0\ub3c4
+currenciesDisplayName.ROL=\ub8e8\ub9c8\ub2c8\uc544 \ub808\uc774
+currenciesDisplayName.DDM=\ub3d9\ub3c5 \uc624\uc2a4\ud2b8\ub9c8\ub974\ud06c
+currenciesDisplayName.BDT=\ubc29\uae00\ub77c\ub370\uc2dc \ud0c0\uce74
+currenciesDisplayName.AWG=\uc544\ub8e8\ubc14 \uae38\ub354
+currenciesDisplayName.NOK=\ub178\ub974\uc6e8\uc774 \ud06c\ub85c\ub124
+currenciesDisplayName.MUR=\ubaa8\ub9ac\uc154\uc2a4 \ub8e8\ud53c
currenciesDisplayName.ZAR=\ub0a8\uc544\ud504\ub9ac\uce74 \ub79c\ub4dc
-currenciesDisplayName.DOP=\ub3c4\ubbf8\ub2c8\uce74 \ud398\uc18c
-currenciesDisplayName.CUX=\ucfe0\ubc14 \ud0dc\ud658\uad8c \ub9c8\ub974\ud06c
-currenciesDisplayName.ZAP=\ub0a8\uc544\ud504\ub9ac\uce74 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.SHP=\uc138\uc778\ud2b8\ud5ec\ub808\ub098 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.XAU=\uae08
currenciesDisplayName.ZAL=\ub0a8\uc544\ud504\ub9ac\uce74 \ub79c\ub4dc (\uae08\uc735)
+currenciesDisplayName.VND=\ubca0\ud2b8\ub0a8 \ub3d9
+currenciesDisplayName.TZS=\ud0c4\uc790\ub2c8\uc544 \uc2e4\ub9c1
+currenciesDisplayName.GIP=\uc9c0\ube0c\ub864\ud130 \ud30c\uc6b4\ub4dc
currenciesDisplayName.TND=\ud280\ub2c8\uc9c0 \ub514\ub098\ub974
-currenciesDisplayName.CUP=\ucfe0\ubc14 \ud398\uc18c
-currenciesDisplayName.GUF=\ud504\ub791\uc2a4\ub839 \uac00\uc774\uc544\ub098 \ud504\ub791 \uae30\uc544\ub098
+currenciesDisplayName.CVE=\uce74\ubcf4\ubca0\ub974\ub370 \uc5d0\uc2a4\ucfe0\ub3c4
currenciesDisplayName.UGX=\uc6b0\uac04\ub2e4 \uc2e4\ub9c1
-currenciesDisplayName.LNR=\uc2e4\ub860 \ub8e8\ud53c
-currenciesDisplayName.AIF=\uc544\ud30c\ub974\uc640 \uc774\uc0ac\uc2a4\uc758 \ud504\ub791
-currenciesDisplayName.VAL=\ubc14\ud2f0\uce78 \ub9ac\ub77c
-currenciesDisplayName.STE=\uc0c1\ud22c\uba54 \ud504\ub9b0\uc2dc\ud398 \uc5d0\uc2a4\ucfe0\ub3c4
+currenciesDisplayName.ZMK=\uc7d8\ube44\uc544 \ucf70\uccd0
+currenciesDisplayName.JOD=\uc694\ub974\ub2e8 \ub514\ub098\ub974
+currenciesDisplayName.LBP=\ub808\ubc14\ub17c \ud30c\uc6b4\ub4dc
currenciesDisplayName.UGS=\uc6b0\uac04\ub2e4 \uc2e4\ub9c1 (1966-1987)
currenciesDisplayName.STD=\uc0c1\ud22c\uba54 \ud504\ub9b0\uc2dc\ud398 \ub3c4\ube0c\ub77c
-currenciesDisplayName.MHD=\ub9c8\uc0ec \uad70\ub3c4 \ub2ec\ub7ec
-currenciesDisplayName.NZP=\ub274\uc9c8\ub79c\ub4dc \ud30c\uc6b4\ub4dc
currenciesDisplayName.WST=\uc11c \uc0ac\ubaa8\uc544 \ud0c8\ub77c
-currenciesDisplayName.WSP=\uc11c \uc0ac\ubaa8\uc544 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.HNL=\uc628\ub450\ub77c\uc2a4 \ub818\ud53c\ub77c
-currenciesDisplayName.XMF=\ud504\ub791\uc2a4 \uba54\ud2b8\ub85c\ud3f4\ub9ac\ud0c4 \ub204\ubcf4 \ud504\ub791
+currenciesDisplayName.KHR=\uce84\ubcf4\ub514\uc544 \ub9ac\uc584
+currenciesDisplayName.EUR=\uc720\ub85c\ud654
+currenciesDisplayName.DOP=\ub3c4\ubbf8\ub2c8\uce74 \ud398\uc18c
+currenciesDisplayName.MTP=\ubab0\ud0c0 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.BOP=\ubcfc\ub9ac\ube44\uc544\ub178 \ud398\uc18c
+currenciesDisplayName.MTL=\ubab0\ud0c0 \ub9ac\ub77c
+currenciesDisplayName.CUP=\ucfe0\ubc14 \ud398\uc18c
currenciesDisplayName.TMM=\ud22c\ub974\ud06c\uba54\ub2c8\uc2a4\ud0c4 \ub9c8\ub098\ud2b8
-currenciesDisplayName.GTQ=\uacfc\ud14c\ub9d0\ub77c \ucf00\ud2b8\uc0b4
+currenciesDisplayName.SGD=\uc2f1\uac00\ud3f4 \ub2ec\ub7ec
currenciesDisplayName.NZD=\ub274\uc9c8\ub79c\ub4dc \ub2ec\ub7ec
-currenciesDisplayName.SSP=\uc2a4\ucf54\ud2c0\ub79c\ub4dc \ud30c\uc6b4\ub4dc
-currenciesDisplayName.BBD=\ubc14\ubca0\uc774\ub3c4\uc2a4 \ub2ec\ub7ec
+currenciesDisplayName.USD=\ubbf8\uad6d \ub2ec\ub7ec
+currenciesDisplayName.HNL=\uc628\ub450\ub77c\uc2a4 \ub818\ud53c\ub77c
+currenciesDisplayName.BOB=\ubcfc\ub9ac\ube44\uc544\ub178
+currenciesDisplayName.ITL=\uc774\ud0c8\ub9ac\uc544 \ub9ac\ub77c
+currenciesDisplayName.PAB=\ud30c\ub098\ub9c8 \ubc1c\ubcf4\uc544
+currenciesDisplayName.GTQ=\uacfc\ud14c\ub9d0\ub77c \ucf00\ud2b8\uc0b4
+currenciesDisplayName.LAK=\ub77c\uc624\uc2a4 \ud0a4\ud504
+currenciesDisplayName.GHC=\uac00\ub098 \uc2dc\ub514
+currenciesDisplayName.AUD=\ud638\uc8fc \ub2ec\ub7ec
currenciesDisplayName.NAD=\ub098\ubbf8\ube44\uc544 \ub2ec\ub7ec
+currenciesDisplayName.KGS=\ud0a4\ub974\uae30\uc2a4\uc2a4\ud0c4 \uc19c
currenciesDisplayName.MGF=\ub9c8\ub2e4\uac00\uc2a4\uce74\ub974 \ud504\ub791
+currenciesDisplayName.CHF=\uc2a4\uc704\uc2a4 \ud504\ub791\ub2ec\ub7ec
+currenciesDisplayName.BBD=\ubc14\ubca0\uc774\ub3c4\uc2a4 \ub2ec\ub7ec
currenciesDisplayName.MGA=\ub9c8\ub2e4\uac00\uc2a4\uce74\ub974 \uc544\ub9ac\uc544\ub9ac
-currenciesDisplayName.EGP=\uc774\uc9d1\ud2b8 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.BZH=\uc601\uad6d\ub839 \ud63c\ub450\ub77c\uc2a4 \ub2ec\ub7ec
+currenciesDisplayName.PYG=\ud30c\ub77c\uacfc\uc774 \uacfc\ub77c\ub2c8
currenciesDisplayName.PLZ=\ud3f4\ub780\ub4dc \uc990\ub85c\ud2f0 (1950-1995)
-currenciesDisplayName.BAN=\ubcf4\uc2a4\ub2c8\uc544-\ud5e4\ub974\uccb4\uace0\ube44\ub098 \uc2e0 \ub514\ub098\ub974
-currenciesDisplayName.BAM=\ubcf4\uc2a4\ub2c8\uc544-\ud5e4\ub974\uccb4\uace0\ube44\ub098 \ud0dc\ud658 \ub9c8\ub974\ud06c
-currenciesDisplayName.BZD=\ubca8\ub9ac\uc988 \ub2ec\ub7ec
-currenciesDisplayName.BAD=\ubcf4\uc2a4\ub2c8\uc544-\ud5e4\ub974\uccb4\uace0\ube44\ub098 \ub514\ub098\ub974
-currenciesDisplayName.PLN=\ud3f4\ub780\ub4dc \uc990\ub85c\ud2f0
currenciesDisplayName.YER=\uc608\uba58 \ub9ac\uc54c
+currenciesDisplayName.ATS=\ud638\uc8fc \uc2e4\ub9c1
+currenciesDisplayName.ETB=\uc774\ub514\uc624\ud53c\uc544 \ube44\ub974
+currenciesDisplayName.BND=\ubd80\ub8e8\ub098\uc774 \ub2ec\ub7ec
+currenciesDisplayName.JMD=\uc790\uba54\uc774\uce74 \ub2ec\ub7ec
+currenciesDisplayName.EGP=\uc774\uc9d1\ud2b8 \ud30c\uc6b4\ub4dc
+currenciesDisplayName.PLN=\ud3f4\ub780\ub4dc \uc990\ub85c\ud2f0
+currenciesDisplayName.DZD=\uc54c\uc81c\ub9ac \ub514\ub098\ub974
+currenciesDisplayName.ISK=\uc544\uc774\uc2ac\ub780\ub4dc \ud06c\ub85c\ub098
currenciesDisplayName.SRG=\uc218\ub9ac\ub0a8 \uae38\ub354
-currenciesDisplayName.CSK=\uccb4\ucf54\uc2ac\ub85c\ubc14\ud0a4\uc544 \ub3d9\uc804 \ucf54\ub8e8\ub098
+currenciesDisplayName.LYD=\ub9ac\ube44\uc544 \ub514\ub098\ub974
+currenciesDisplayName.BZD=\ubca8\ub9ac\uc988 \ub2ec\ub7ec
+currenciesDisplayName.BAM=\ubcf4\uc2a4\ub2c8\uc544-\ud5e4\ub974\uccb4\uace0\ube44\ub098 \ud0dc\ud658 \ub9c8\ub974\ud06c
+currenciesDisplayName.ESP=\uc2a4\ud398\uc778 \ud398\uc138\ud0c0
currenciesDisplayName.KRW=\ub300\ud55c\ubbfc\uad6d \uc6d0
+currenciesDisplayName.NLG=\ub124\ub378\ub780\ub4dc \uae38\ub354
+currenciesDisplayName.MRO=\ubaa8\ub9ac\ud0c0\ub2c8 \uc6b0\uae30\uc57c
+currenciesDisplayName.BAD=\ubcf4\uc2a4\ub2c8\uc544-\ud5e4\ub974\uccb4\uace0\ube44\ub098 \ub514\ub098\ub974
+currenciesDisplayName.ZWD=\uc9d0\ube44\ube0c\uc6e8 \ub2ec\ub7ec
+currenciesDisplayName.SEK=\uc2a4\uc6e8\ub374 \ud06c\ub85c\ub098
+currenciesDisplayName.CSK=\uccb4\ucf54\uc2ac\ub85c\ubc14\ud0a4\uc544 \ub3d9\uc804 \ucf54\ub8e8\ub098
currenciesDisplayName.BYR=\ubca8\ub77c\ub8e8\uc2a4 \ub8e8\ube14
-currenciesDisplayName.BYL=\ubca8\ub77c\ub8e8\uc2a4 \ub8e8\ube14 (1992-1994)
-currenciesDisplayName.CSC=\uccb4\ucf54\uc2ac\ub85c\ubc14\ud0a4\uc544 \ucf54\ub8e8\ub098
-currenciesDisplayName.KRO=\ub300\ud55c\ubbfc\uad6d \uad6c\uad8c \uc6d0
-currenciesDisplayName.KRH=\ub300\ud55c\ubbfc\uad6d \ud658
-currenciesDisplayName.BYB=\ubca8\ub77c\ub8e8\uc2a4 \uc2e0\uad8c \ub8e8\ube14 (1994-1999)
-currenciesDisplayName.SQS=\uc18c\ub9d0\ub9ac\ub79c\ub4dc \uc2e4\ub9c1
-currenciesDisplayName.GRN=\uadf8\ub9ac\uc2a4 \uc2e0\uad8c \ub4dc\ub77c\ud06c\ub9c8
+currenciesDisplayName.IRR=\uc774\ub780 \ub9ac\uc584
currenciesDisplayName.PKR=\ud30c\ud0a4\uc2a4\ud0c4 \ub8e8\ud53c
-currenciesDisplayName.AFN=\uc544\ud504\uac00\ub2c8
-currenciesDisplayName.ZWD=\uc9d0\ube44\ube0c\uc6e8 \ub2ec\ub7ec
-currenciesDisplayName.LKR=\uc2a4\ub9ac\ub791\uce74 \ub8e8\ud53c
-currenciesDisplayName.GRD=\uadf8\ub9ac\uc2a4 \ub4dc\ub77c\ud06c\ub9c8
-currenciesDisplayName.IEP=\uc544\uc77c\ub79c\ub4dc \ud30c\uc6b4\ub4dc
-currenciesDisplayName.AFA=\uc544\ud504\uac00\ub2c8 (1927-2002)
-currenciesDisplayName.YDD=\uc608\uba58 \ub514\ub098\ub974
-currenciesDisplayName.RWF=\ub974\uc644\ub2e4 \ud504\ub791
-currenciesDisplayName.CRC=\ucf54\uc2a4\ud0c0\ub9ac\uce74 \ucf5c\ub860
-currenciesDisplayName.TJS=\ud0c0\uc9c0\ud0a4\uc2a4\ud0c4 \uc18c\ubaa8\ub2c8
-currenciesDisplayName.TJR=\ud0c0\uc9c0\ud0a4\uc2a4\ud0c4 \ub8e8\ube14
-currenciesDisplayName.EEK=\uc5d0\uc2a4\ud1a0\ub2c8\uc544 \ud06c\ub8ec
-currenciesDisplayName.GQP=\uc801\ub3c4 \uae30\ub2c8 \ud398\uc138\ud0c0 \uae30\ub2c8\uc544\ub098
-currenciesDisplayName.MDR=\ubab0\ub3c4\ubc14 \ub8e8\ube14 \uc9c0\ud3d0
-currenciesDisplayName.HKD=\ud64d\ucf69 \ub2ec\ub7ec
-currenciesDisplayName.DKK=\ub374\ub9c8\ud06c \ud06c\ub85c\ub124
-currenciesDisplayName.MDL=\ubab0\ub3c4\ubc14 \ub808\uc774
-currenciesDisplayName.GQF=\uc801\ub3c4 \uae30\ub2c8 \ud504\ub791
-currenciesDisplayName.IDR=\uc778\ub3c4\ub124\uc2dc\uc544 \ub8e8\ud53c\uc544
-currenciesDisplayName.AED=\uc544\ub78d\uc5d0\ubbf8\ub808\uc774\ud2b8 \ub514\ub098\ub974
-currenciesDisplayName.KPW=\uc870\uc120 \ubbfc\uc8fc\uc8fc\uc758 \uc778\ubbfc \uacf5\ud654\uad6d \uc6d0
-currenciesDisplayName.IDN=\uc778\ub3c4\ub124\uc2dc\uc544 \uc2e0\uad8c \ub8e8\ud53c\uc544
-currenciesDisplayName.BWP=\ubcf4\uce20\uc640\ub098 \ud3f4\ub77c
-currenciesDisplayName.MDC=\ubab0\ub3c4\ubc14 \ub808\uc774 \uc9c0\ud3d0
-currenciesDisplayName.IDJ=\uc778\ub3c4\ub124\uc2dc\uc544 \uc790\ubc14 \ub8e8\ud53c\uc544
-currenciesDisplayName.KPP=\uc870\uc120 \ubbfc\uc8fc\uc8fc\uc758 \uc778\ubbfc \uacf5\ud654\uad6d \uc6d0
-currenciesDisplayName.IDG=\uc778\ub3c4\ub124\uc2dc\uc544 \ub2c8\uce74 \uae38\ub354
-currenciesDisplayName.VUV=\ubc14\ub204\uc544\ud22c \ubc14\ud22c
-currenciesDisplayName.XID=\uc774\uc2ac\ub78c \ub514\ub098\ub974
-currenciesDisplayName.SOS=\uc18c\ub9d0\ub9ac\uc544 \uc2e4\ub9c1
-currenciesDisplayName.ADP=\uc548\ub3c4\ub77c \ud398\uc138\ud0c0
-currenciesDisplayName.RUR=\ub7ec\uc2dc\uc544 \ub8e8\ube14 (1991-1998)
-currenciesDisplayName.GPF=\uacfc\ub2ec\ub85c\ud504 \ud504\ub791
-currenciesDisplayName.DJF=\uc9c0\ubd80\ud2f0 \ud504\ub791
-currenciesDisplayName.ADD=\uc548\ub3c4\ub77c \ub514\ub124\ub974
-currenciesDisplayName.MCG=\ubaa8\ub098\ucf54 \ud504\ub791 \uc81c\ub974\ubbf8\ub0a0
-currenciesDisplayName.MCF=\ubaa8\ub098\ucf54 \ud504\ub791 \ub204\ubcf4
-currenciesDisplayName.ECS=\uc5d0\ucfe0\uc544\ub3c4\ub974 \uc218\ud06c\ub808
-currenciesDisplayName.LIF=\ub9ac\ud788\ud150\uc288\ud0c0\uc778 \ud504\ub791
-currenciesDisplayName.RUB=\ub7ec\uc2dc\uc544 \ub8e8\ube14
-currenciesDisplayName.PHP=\ud544\ub9ac\ud540 \ud398\uc18c
-currenciesDisplayName.UZS=\uc6b0\uc988\ubca0\ud0a4\uc2a4\ud0c4 \uc228
-currenciesDisplayName.COP=\ucf5c\ub86c\ube44\uc544 \ud398\uc18c
-currenciesDisplayName.THB=\ud0dc\uad6d \ubc14\ud2b8
-currenciesDisplayName.IBP=\ubd81\ubd80 \uc544\uc77c\ub79c\ub4dc \ud30c\uc6b4\ub4dc
-currenciesDisplayName.BUR=\ubc84\ub9c8 \ub8e8\ud53c
-currenciesDisplayName.COF=\ucf69\uace0 CFA \ud504\ub791
-currenciesDisplayName.BUK=\ubc84\ub9c8 \ucc28\ud2b8
-currenciesDisplayName.COB=\ucf5c\ub86c\ube44\uc544 \uc9c0\ud3d0 \ud398\uc18c
-currenciesDisplayName.UZC=\uc6b0\uc988\ubca0\ud0a4\uc2a4\ud0c4 \uc228 \ucfe0\ud3f0
-currenciesDisplayName.QAR=\uce74\ud0c0\ub974 \ub9ac\uc584
-currenciesDisplayName.UAH=\uc6b0\ud06c\ub77c\uc774\ub098 \uadf8\ub9ac\ube0c\ub098
-currenciesDisplayName.GNS=\uae30\ub2c8 \uc2dc\ub9ac
-currenciesDisplayName.CNY=\uc911\uad6d \uc704\uc548 \uc778\ubbfc\ud3d0
-currenciesDisplayName.MZM=\ubaa8\uc7a0\ube44\ud06c \uba54\ud2f0\uce7c
-currenciesDisplayName.UYU=\uc6b0\ub8e8\uacfc\uc774 \ud398\uc18c \uc6b0\ub8e8\uacfc\uc694
-currenciesDisplayName.GNI=\uae30\ub2c8 \ud504\ub791 (1960-1972)
-currenciesDisplayName.SML=\uc0b0\ub9c8\ub9ac\ub178 \ub9ac\ub77c
-currenciesDisplayName.MZE=\ubaa8\uc7a0\ube44\ud06c \uc5d0\uc2a4\ucfe0\ub3c4
-currenciesDisplayName.PGK=\ud30c\ud478\uc544\ub274\uae30\ub2c8 \ud0a4\ub098
-currenciesDisplayName.OMS=\uc624\ub9cc \ub9ac\uc584 \uc0ac\uc774\ub514
-currenciesDisplayName.GNF=\uae30\ub2c8 \ud504\ub791
-currenciesDisplayName.UYP=\uc6b0\ub8e8\uacfc\uc774 \ud398\uc18c (1975-1993)
-currenciesDisplayName.OMR=\uc624\ub9cc \ub9ac\uc584
-currenciesDisplayName.XFU=\ud504\ub791\uc2a4 UIC-\ud504\ub791
-currenciesDisplayName.ZRZ=\uc790\uc774\ub974 \uc790\uc774\ub974
-currenciesDisplayName.BTR=\ubd80\ud0c4 \ub8e8\ud53c
-currenciesDisplayName.MAF=\ubaa8\ub85c\ucf54 \ud504\ub791
-currenciesDisplayName.MAD=\ubaa8\ub85c\ucf54 \ub514\ub818
-currenciesDisplayName.XFO=\ud504\ub791\uc2a4 Gold \ud504\ub791
-currenciesDisplayName.BTN=\ubd80\ud0c4 \ub20c\ud22c\ub214
-currenciesDisplayName.UYF=\uc6b0\ub8e8\uacfc\uc774 \ud398\uc18c \ud478\uc5d0\ub974\ub5bc
-currenciesDisplayName.MYR=\ub9d0\ub808\uc774\uc9c0\uc544 \ub9c1\uae30\ud2b8
-currenciesDisplayName.ZRN=\uc790\uc774\ub974 \uc2e0\uad8c \uc790\uc774\ub974
-currenciesDisplayName.AZM=\uc544\uc81c\ub974\ubc14\uc774\uc820 \ub9c8\ub098\ud2b8
-currenciesDisplayName.GMP=\uac10\ube44\uc544 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.KMF=\ucf54\ubaa8\ub974 \ud504\ub791
-currenciesDisplayName.SLL=\uc2dc\uc5d0\ub77c\ub9ac\uc628 \ub9ac\uc628
-currenciesDisplayName.GMD=\uac10\ube44\uc544 \ub2ec\ub77c\uc2dc
-currenciesDisplayName.XEU=\uc720\ub7fd \ud658\uc728 \ub2e8\uc704
-currenciesDisplayName.BSP=\ubc14\ud558\ub9c8 \ub2ec\ub7ec \ud30c\uc6b4\ub4dc
-currenciesDisplayName.BSD=\ubc14\ud558\ub9c8 \ub2ec\ub7ec
-currenciesDisplayName.MXP=\uba55\uc2dc\ucf54 \uc2e4\ubc84 \ud398\uc18c (1861-1992)
-currenciesDisplayName.MXN=\uba55\uc2dc\ucf54 \ud398\uc18c
-currenciesDisplayName.PES=\ud398\ub8e8 \uc194
-currenciesDisplayName.GLK=\uadf8\ub9b0\ub780\ub4dc \ud06c\ub85c\ub124
-currenciesDisplayName.BRZ=\ube0c\ub77c\uc9c8 \ud06c\ub8e8\uc81c\uc774\ub8e8 (1942-1967)
-currenciesDisplayName.PEN=\ud398\ub8e8 \uc194 \ub204\uc5d0\ubcf4
-currenciesDisplayName.CLP=\uce60\ub808 \ud398\uc18c
-currenciesDisplayName.SKK=\uc2ac\ub85c\ubc14\ud0a4\uc544 \ucf54\ub8e8\ub098
-currenciesDisplayName.PEI=\ud398\ub8e8 \uc778\ud2f0
-currenciesDisplayName.BRR=\ube0c\ub77c\uc9c8 \ud06c\ub8e8\uc81c\uc774\ub8e8
-currenciesDisplayName.XDR=\ud2b9\ubcc4\uc778\ucd9c\uad8c
-currenciesDisplayName.FRG=\ud504\ub791\uc2a4 \ud504\ub791 \uc81c\ub974\ubbf8\ub0a0/\ud504\ub791 \ud3ec\uc559\uce74\ub808
-currenciesDisplayName.FRF=\ud504\ub791\uc2a4 \ud504\ub791
-currenciesDisplayName.BRN=\ube0c\ub77c\uc9c8 \ud06c\ub8e8\uc790\ub450 \ub178\ubcf4
-currenciesDisplayName.CLE=\uce60\ub808 \uc5d0\uc2a4\ucfe0\ub3c4
-currenciesDisplayName.BRL=\ube0c\ub77c\uc9c8 \ub808\uc54c
-currenciesDisplayName.CLC=\uce60\ub808 \ucf58\ub3c4\ub974
-currenciesDisplayName.BRE=\ube0c\ub77c\uc9c8 \ud06c\ub8e8\uc81c\uc774\ub8e8 (1990-1993)
-currenciesDisplayName.DES=\ub3c5\uc77c \uc2a4\ud37c\ub9c8\ub974\ud06c
-currenciesDisplayName.MWP=\ub9d0\ub77c\uc704 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.BRC=\ube0c\ub77c\uc9c8 \ud06c\ub8e8\uc790\ub450
-currenciesDisplayName.BRB=\ubcfc\ub9ac\ube44\uc544\ub178 \ud06c\ub8e8\uc81c\uc774\ub8e8 \ub178\ubcf4 (1967-1986)
-currenciesDisplayName.MWK=\ub9d0\ub77c\uc704 \ucf70\uccd0
-currenciesDisplayName.DEM=\ub3c5\uc77c \ub9c8\ub974\ud06c
-currenciesDisplayName.NPR=\ub124\ud314 \ub8e8\ud53c
-currenciesDisplayName.CKD=\ucfe1 \uc81c\ub3c4 \ub2ec\ub7ec
-currenciesDisplayName.JPY=\uc77c\ubcf8 \uc5d4\ud654
-currenciesDisplayName.MVR=\ubab0\ub514\ube0c \uc81c\ub3c4 \ub8e8\ud53c\uc544
-currenciesDisplayName.MVP=\ubab0\ub514\ube0c \uc81c\ub3c4 \ub8e8\ud53c
-currenciesDisplayName.XCD=\ub3d9\uce74\ub9ac\ube0c \ub2ec\ub7ec
-currenciesDisplayName.SIT=\uc2ac\ub85c\ubca0\ub2c8\uc544 \ud1a8\ub77c\ub974
-currenciesDisplayName.YUR=\uc720\uace0\uc2ac\ub77c\ube44\uc544 \uac1c\ub7c9 \ub514\ub098\ub974
-currenciesDisplayName.AWG=\uc544\ub8e8\ubc14 \uae38\ub354
-currenciesDisplayName.YUO=\uc720\uace0\uc2ac\ub77c\ube44\uc544 10\uc6d4 \ub514\ub098\ub974
-currenciesDisplayName.DDM=\ub3d9\ub3c5 \uc624\uc2a4\ud2b8\ub9c8\ub974\ud06c
-currenciesDisplayName.YUN=\uc720\uace0\uc2ac\ub77c\ube44\uc544 \uc804\ud658 \ub514\ub098\ub974
-currenciesDisplayName.YUM=\uc720\uace0\uc2ac\ub77c\ube44\uc544 \ub178\ube44 \ub514\ub098\ub974
-currenciesDisplayName.TCC=\ud130\ud06c\uc2a4\ucf00\uc774\ucee4\uc2a4 \ud06c\ub77c\uc6b4
-currenciesDisplayName.YUG=\uc720\uace0\uc2ac\ub77c\ube44\uc544 1994 \ub514\ub098\ub974
-currenciesDisplayName.YUF=\uc720\uace0\uc2ac\ub77c\ube44\uc544 \uc5f0\ud569 \ub514\ub098\ub974
-currenciesDisplayName.RON=\ub8e8\ub9c8\ub2c8\uc544 \uc2e0\uad8c \ub808\uc774
-currenciesDisplayName.YUD=\uc720\uace0\uc2ac\ub77c\ube44\uc544 \ub3d9\uc804 \ub514\ub098\ub974
-currenciesDisplayName.ROL=\ub8e8\ub9c8\ub2c8\uc544 \ub808\uc774
-currenciesDisplayName.SIB=\uc2ac\ub85c\ubca0\ub2c8\uc544 \ud1a8\ub77c\ub974 \ubcf8\uc2a4
-currenciesDisplayName.NOK=\ub178\ub974\uc6e8\uc774 \ud06c\ub85c\ub124
-currenciesDisplayName.MUR=\ubaa8\ub9ac\uc154\uc2a4 \ub8e8\ud53c
-currenciesDisplayName.GIP=\uc9c0\ube0c\ub864\ud130 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.VNS=\ubca0\ud2b8\ub0a8 \uad6d\uc601 \ub3d9
-currenciesDisplayName.VNR=\ubca0\ud2b8\ub0a8 \uacf5\ud654\uad6d \ub3d9
-currenciesDisplayName.KID=\ud0a4\ub9ac\ubc14\uc2dc \ub2ec\ub7ec
-currenciesDisplayName.SHP=\uc138\uc778\ud2b8\ud5ec\ub808\ub098 \ud30c\uc6b4\ub4dc
-currenciesDisplayName.VNN=\ubca0\ud2b8\ub0a8 \uc2e0\uad8c \ub3d9
-currenciesSymbol.JOD=JOD
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LBP
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=TZS
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=KHR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=BOB
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=MTL
-currenciesSymbol.AUD=AUD
-currenciesSymbol.ITL=ITL
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=SGD
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=KGS
-currenciesSymbol.CHF=CHF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=ETB
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DZD
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=JMD
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LYD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=BMD
-currenciesSymbol.NLG=NLG
+currenciesDisplayName.BMD=\ubc84\ubba4\ub2e4 \ub2ec\ub7ec
+currenciesSymbol.JPY=\uffe5
currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=IRR
-currenciesSymbol.SEK=SEK
-currenciesSymbol.ERN=ERN
-currenciesSymbol.KES=KES
-currenciesSymbol.ARS=ARS
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=TWD
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GEL=GEL
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
-currenciesSymbol.IQD=IQD
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SCR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=FJD
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIC=NIC
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
-currenciesSymbol.SBD=SBD
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=MNT
-currenciesSymbol.HUF=HUF
-currenciesSymbol.BIF=BIF
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
-currenciesSymbol.TTD=TTD
-currenciesSymbol.SZL=SZL
-currenciesSymbol.SAS=SAS
-currenciesSymbol.SAR=SAR
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=KZT
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=SYP
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BHD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=ANG
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=LSL
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=CAD
-currenciesSymbol.BGL=BGL
-currenciesSymbol.TRL=TRL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=CYP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=GYD
-currenciesSymbol.AMD=AMD
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=VEB
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=ALL
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MKD
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KWD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BEF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
-currenciesSymbol.BDT=BDT
-currenciesSymbol.TOS=TOS
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
-currenciesSymbol.CVE=CVE
-currenciesSymbol.ZAR=ZAR
-currenciesSymbol.DOP=DOP
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=UGX
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=STD
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
-currenciesSymbol.HNL=HNL
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
-currenciesSymbol.GTQ=GTQ
-currenciesSymbol.NZD=NZD
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BBD
-currenciesSymbol.NAD=NAD
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.BAM=BAM
-currenciesSymbol.BZD=BZD
-currenciesSymbol.BAD=BAD
-currenciesSymbol.PLN=PLN
-currenciesSymbol.YER=YER
-currenciesSymbol.SRG=SRG
-currenciesSymbol.CSK=CSK
currenciesSymbol.KRW=\uffe6
-currenciesSymbol.BYR=BYR
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=PKR
-currenciesSymbol.AFN=AFN
-currenciesSymbol.ZWD=ZWD
-currenciesSymbol.LKR=LKR
-currenciesSymbol.GRD=GRD
currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=CRC
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HKD
-currenciesSymbol.DKK=DKK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.IDR=IDR
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VUV
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=SOS
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DJF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=COP
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.QAR=QAR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=CNY
-currenciesSymbol.MZM=MZM
-currenciesSymbol.UYU=UYU
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
-currenciesSymbol.GNF=GNF
-currenciesSymbol.UYP=UYP
-currenciesSymbol.OMR=OMR
-currenciesSymbol.XFU=XFU
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.BTR=BTR
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.XFO=XFO
-currenciesSymbol.BTN=BTN
-currenciesSymbol.UYF=UYF
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.MYR=MYR
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
-currenciesSymbol.KMF=KMF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MXN
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=CLP
-currenciesSymbol.SKK=SKK
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=BRL
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MWK
-currenciesSymbol.DEM=DEM
-currenciesSymbol.NPR=NPR
-currenciesSymbol.CKD=CKD
-currenciesSymbol.JPY=\uffe5
-currenciesSymbol.MVR=MVR
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=XCD
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=ROL
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NOK
-currenciesSymbol.MUR=MUR
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.VNR=VNR
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.ITL=ITL
+currenciesSymbol.USD=US$
shortMonths=1\uc6d4®2\uc6d4®3\uc6d4®4\uc6d4®5\uc6d4®6\uc6d4®7\uc6d4®8\uc6d4®9\uc6d4®10\uc6d4®11\uc6d4®12\uc6d4®®
months=1\uc6d4®2\uc6d4®3\uc6d4®4\uc6d4®5\uc6d4®6\uc6d4®7\uc6d4®8\uc6d4®9\uc6d4®10\uc6d4®11\uc6d4®12\uc6d4®®
shortWeekdays=®\uc77c®\uc6d4®\ud654®\uc218®\ubaa9®\uae08®\ud1a0®
@@ -713,7 +255,7 @@ shortTimeFormat=a hh'\uc2dc' mm'\ubd84'
mediumTimeFormat=a hh'\uc2dc' mm'\ubd84'
longTimeFormat=a hh'\uc2dc' mm'\ubd84' ss'\ucd08'
fullTimeFormat=a hh'\uc2dc' mm'\ubd84' ss'\ucd08' z
-zoneStrings=America/Los_Angeles®PST®\ud0dc\ud3c9\uc591 \ud45c\uc900\uc2dc®PDT®\ud0dc\ud3c9\uc591 \uae30\uc900\uc2dc®©Pacific/Honolulu®HST®\ud558\uc640\uc774 \ud45c\uc900\uc2dc®HST®\ud558\uc640\uc774 \ud45c\uc900\uc2dc®©Etc/GMT®GMT®\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc®GMT®\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc®©America/Phoenix®MST®\uc0b0\uc545 \ud45c\uc900\uc2dc®MST®\uc0b0\uc545 \ud45c\uc900\uc2dc®©Africa/Casablanca®GMT®\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc®GMT®\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc®©America/Denver®MST®\uc0b0\uc545 \ud45c\uc900\uc2dc®MDT®\uc0b0\uc545 \uae30\uc900\uc2dc®©Asia/Jerusalem®IST®\uc774\uc2a4\ub77c\uc5d8 \ud45c\uc900\uc2dc®IDT®\uc774\uc2a4\ub77c\uc5d8 \uae30\uc900\uc2dc®©America/Anchorage®AST®\uc54c\ub798\uc2a4\uce74 \ud45c\uc900\uc2dc®ADT®\uc54c\ub798\uc2a4\uce74 \uae30\uc900\uc2dc®©Europe/Paris®CET®\uc911\ubd80\uc720\ub7fd \ud45c\uc900\uc2dc®CEST®\uc911\ubd80\uc720\ub7fd \uae30\uc900\uc2dc®©America/Indianapolis®EST®\ub3d9\ubd80 \ud45c\uc900\uc2dc®EST®\ub3d9\ubd80 \ud45c\uc900\uc2dc®©Europe/Bucharest®EET®\ub3d9\ubd80\uc720\ub7fd \ud45c\uc900\uc2dc®EEST®\ub3d9\ubd80\uc720\ub7fd \uae30\uc900\uc2dc®©Asia/Tokyo®JST®\uc77c\ubcf8 \ud45c\uc900\uc2dc®JST®\uc77c\ubcf8 \ud45c\uc900\uc2dc®©Asia/Shanghai®CTT®\uc911\uad6d \ud45c\uc900\uc2dc®CDT®\uc911\uad6d \ud45c\uc900\uc2dc®©America/New_York®EST®\ub3d9\ubd80 \ud45c\uc900\uc2dc®EDT®\ub3d9\ubd80 \uae30\uc900\uc2dc®©Asia/Seoul®KST®\ud55c\uad6d\ud45c\uc900\uc2dc®KST®\ud55c\uad6d\ud45c\uc900\uc2dc®©America/Halifax®AST®\ub300\uc11c\uc591 \ud45c\uc900\uc2dc®ADT®\ub300\uc11c\uc591 \uae30\uc900\uc2dc®©America/St_Johns®CNT®\ub274\ud380\ub4e4\ub79c\ub4dc \ud45c\uc900\uc2dc®CDT®\ub274\ud380\ub4e4\ub79c\ub4dc \uae30\uc900\uc2dc®©America/Chicago®CST®\uc911\ubd80 \ud45c\uc900\uc2dc®CDT®\uc911\ubd80 \uae30\uc900\uc2dc®©
+zoneStrings=America/St_Johns®CNT®\ub274\ud380\ub4e4\ub79c\ub4dc \ud45c\uc900\uc2dc®CDT®\ub274\ud380\ub4e4\ub79c\ub4dc \uae30\uc900\uc2dc®©America/Anchorage®AST®\uc54c\ub798\uc2a4\uce74 \ud45c\uc900\uc2dc®ADT®\uc54c\ub798\uc2a4\uce74 \uae30\uc900\uc2dc®©Europe/Paris®CET®\uc911\ubd80\uc720\ub7fd \ud45c\uc900\uc2dc®CEST®\uc911\ubd80\uc720\ub7fd \uae30\uc900\uc2dc®©America/Halifax®AST®\ub300\uc11c\uc591 \ud45c\uc900\uc2dc®ADT®\ub300\uc11c\uc591 \uae30\uc900\uc2dc®©Asia/Shanghai®CTT®\uc911\uad6d \ud45c\uc900\uc2dc®CDT®\uc911\uad6d \ud45c\uc900\uc2dc®©America/New_York®EST®\ub3d9\ubd80 \ud45c\uc900\uc2dc®EDT®\ub3d9\ubd80 \uae30\uc900\uc2dc®©America/Denver®MST®\uc0b0\uc545 \ud45c\uc900\uc2dc®MDT®\uc0b0\uc545 \uae30\uc900\uc2dc®©Africa/Casablanca®GMT®\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc®GMT®\uadf8\ub9ac\ub2c8\uce58 \ud45c\uc900\uc2dc®©America/Los_Angeles®PST®\ud0dc\ud3c9\uc591 \ud45c\uc900\uc2dc®PDT®\ud0dc\ud3c9\uc591 \uae30\uc900\uc2dc®©Asia/Jerusalem®IST®\uc774\uc2a4\ub77c\uc5d8 \ud45c\uc900\uc2dc®IDT®\uc774\uc2a4\ub77c\uc5d8 \uae30\uc900\uc2dc®©Pacific/Honolulu®HST®\ud558\uc640\uc774 \ud45c\uc900\uc2dc®HST®\ud558\uc640\uc774 \ud45c\uc900\uc2dc®©America/Phoenix®MST®\uc0b0\uc545 \ud45c\uc900\uc2dc®MST®\uc0b0\uc545 \ud45c\uc900\uc2dc®©Asia/Tokyo®JST®\uc77c\ubcf8 \ud45c\uc900\uc2dc®JST®\uc77c\ubcf8 \ud45c\uc900\uc2dc®©Europe/Bucharest®EET®\ub3d9\ubd80\uc720\ub7fd \ud45c\uc900\uc2dc®EEST®\ub3d9\ubd80\uc720\ub7fd \uae30\uc900\uc2dc®©America/Chicago®CST®\uc911\ubd80 \ud45c\uc900\uc2dc®CDT®\uc911\ubd80 \uae30\uc900\uc2dc®©Asia/Seoul®KST®\ud55c\uad6d\ud45c\uc900\uc2dc®KST®\ud55c\uad6d\ud45c\uc900\uc2dc®©America/Indianapolis®EST®\ub3d9\ubd80 \ud45c\uc900\uc2dc®EST®\ub3d9\ubd80 \ud45c\uc900\uc2dc®©
territories.TL=\ub3d9\ud2f0\ubaa8\ub974
territories.TK=\ud1a0\ucf08\ub77c\uc6b0
territories.TJ=\ud0c0\uc9c0\ud0a4\uc2a4\ud0c4
@@ -802,6 +344,7 @@ territories.CX=\ud06c\ub9ac\uc2a4\ub9c8\uc2a4\uc12c
territories.CV=\uae4c\ubf40\ubca0\ub974\ub370
territories.PA=\ud30c\ub098\ub9c8
territories.CU=\ucfe0\ubc14
+territories.CS=\uc138\ub974\ube44\uc544 \ubc0f \ubaac\ud14c\ub124\uadf8\ub85c
territories.CR=\ucf54\uc2a4\ud0c0\ub9ac\uce74
territories.CO=\ucf5c\ub86c\ube44\uc544
territories.CN=\uc911\uad6d
@@ -872,17 +415,16 @@ territories.AI=\uc548\uae38\ub77c
territories.MS=\ubaac\ud2b8\uc138\ub77c\ud2b8
territories.MR=\ubaa8\ub9ac\ud0c0\ub2c8
territories.AG=\uc564\ud2f0\uac00 \ubc14\ubd80\ub2e4
-territories.MQ=\ub9d0\ud2f0\ub2c8\ud06c
territories.AF=\uc544\ud504\uac00\ub2c8\uc2a4\ud0c4
-territories.MP=\ubd81\ub9c8\ub9ac\uc544\ub098\uc81c\ub3c4
+territories.MQ=\ub9d0\ud2f0\ub2c8\ud06c
territories.AE=\uc544\ub78d\uc5d0\ubbf8\ub9ac\ud2b8
-territories.MO=\ub9c8\uce74\uc624, \uc911\uad6d \ud2b9\ubcc4\ud589\uc815\uad6c
+territories.MP=\ubd81\ub9c8\ub9ac\uc544\ub098\uc81c\ub3c4
territories.AD=\uc548\ub3c4\ub77c
+territories.MO=\ub9c8\uce74\uc624, \uc911\uad6d \ud2b9\ubcc4\ud589\uc815\uad6c
territories.MN=\ubabd\uace8
territories.MM=\ubbf8\uc580\ub9c8
territories.ML=\ub9d0\ub9ac
territories.MK=\ub9c8\ucf00\ub3c4\ub2c8\uc544\uc5b4
-territories.YU=\uc720\uace0\uc2ac\ub77c\ube44\uc544
territories.YT=\ub9c8\uc694\ud2f0
territories.MH=\ub9c8\uc0ec \uad70\ub3c4
territories.MG=\ub9c8\ub2e4\uac00\uc2a4\uce74\ub974
@@ -953,8 +495,8 @@ territories.TR=\ud130\ud0a4
territories.TO=\ud1b5\uac00
territories.TN=\ud280\ub2c8\uc9c0
territories.TM=\ud22c\ub974\ud06c\uba54\ub2c8\uc2a4\ud0c4
-languages.gwi=\uadf8\uc704\uce5c\uc5b4
languages.akk=\uc544\uce74\ub4dc\uc5b4
+languages.gwi=\uadf8\uc704\uce5c\uc5b4
languages.eka=\uc774\uce74\uc8fd\uc5b4
languages.ijo=\uc774\uc870\uc5b4
languages.xh=\ubc18\ud22c\uc5b4(\ub0a8\uc544\ud504\ub9ac\uce74)
@@ -967,15 +509,15 @@ languages.pon=\ud3fc\ud398\uc774\uc5b4
languages.min=\ubbf8\ub0ad\uce74\ubc14\uc6b0
languages.suk=\uc218\ucfe0\ub9c8\uc871\uc5b4
languages.wo=\uc62c\ub85c\ud504\uc5b4
-languages.lol=\ubabd\uad6c\uc5b4
languages.kut=\ucfe0\ud14c\ub124\uc5b4
+languages.lol=\ubabd\uad6c\uc5b4
languages.mic=\ubbf8\ud06c\ub9e5\uc5b4
languages.wa=\uc648\ub860\uc5b4
languages.kum=\ucfe0\ubbf9\uc5b4
languages.zap=\uc0ac\ud3ec\ud14c\ud06c\uc5b4
languages.cus=\ucfe0\uc2dc\ud2b8\uc81c\uc871\uc5b4 (\uae30\ud0c0)
-languages.jbo=\ub85c\ubc18\uc5b4
languages.doi=\ub3c4\uadf8\ub9ac\uc5b4
+languages.jbo=\ub85c\ubc18\uc5b4
languages.vo=\ubcfc\ub77c\ud4cc\ud06c\uc5b4
languages.oto=\uc624\ud1a0\ubbf8\uc548\uc5b4
languages.vi=\ubca0\ud2b8\ub0a8\uc5b4
@@ -999,8 +541,8 @@ languages.egy=\uc774\uc9d1\ud2b8\uc5b4 (\uace0\ub300)
languages.ug=\uc704\uad6c\ub974\uc5b4
languages.fan=\ud321\uadf8\uc5b4
languages.ssa=\ub2c8\ub85c-\uc0ac\ud558\ub78c\uc5b4 (\uae30\ud0c0)
-languages.mga=\uc544\uc77c\ub79c\ub4dc\uc5b4, \uc911\uc138 (900-1200)
languages.bat=\ubc1c\ud2b8\uc5b4 (\uae30\ud0c0)
+languages.mga=\uc544\uc77c\ub79c\ub4dc\uc5b4, \uc911\uc138 (900-1200)
languages.nyo=\ub274\ub85c\uc5b4
languages.bas=\ubc14\uc0ac\uc5b4
languages.nyn=\ub2c8\uc548\ucf5c\uc5b4
@@ -1028,8 +570,8 @@ languages.kru=\ucfe0\ub974\ud06c\uc5b4
languages.tg=\ud0c0\uc9c0\ud0a4\uc2a4\ud0c4\uc5b4
languages.byn=\ube0c\ub9b0\uc5b4
languages.te=\ud154\ub8e8\uad6c\uc5b4
-languages.kro=\ud06c\ub8e8\uc5b4
languages.csb=\uce74\uc288\ube44\uc544\uc5b4
+languages.kro=\ud06c\ub8e8\uc5b4
languages.ta=\ud0c0\ubc00\uc5b4
languages.tkl=\ud1a0\ucf08\ub77c\uc6b0\uc81c\ub3c4\uc5b4
languages.efi=\uc774\ud53d\uc5b4
@@ -1053,8 +595,8 @@ languages.sk=\uc2ac\ub85c\ubc14\ud0a4\uc544\uc5b4
languages.grb=\uac8c\ub974\ubcf4\uc5b4
languages.si=\uc2a4\ub9ac\ub791\uce74\uc5b4
languages.sh=\uc138\ub974\ubcf4\ud06c\ub85c\uc544\ud2f0\uc544\uc5b4
-languages.crh=\ud06c\ub9ac\ubbfc \ud130\ud0a4\uc5b4; \ud06c\ub9ac\ubbfc \ud0c0\ud0c0\ub974\uc5b4
languages.afa=\uc544\uc2dc\uc544-\uc544\ud504\ub9ac\uce74\uc5b4 (\uae30\ud0c0)
+languages.crh=\ud06c\ub9ac\ubbfc \ud130\ud0a4\uc5b4; \ud06c\ub9ac\ubbfc \ud0c0\ud0c0\ub974\uc5b4
languages.sg=\uc0b0\uace0\uc5b4
languages.se=\ubd81\ubd80 \uc0ac\ubbf8\uc5b4
languages.sd=\uc2e0\ub514\uc5b4
@@ -1078,14 +620,14 @@ languages.son=\uc1a1\uac00\uc774\uc871\uc5b4
languages.cpp=\ud06c\ub808\uc624\ub9ac\uc2a4\uc640 \ud53c\uae34\uc2a4\uc5b4, \ud3ec\ub974\ud22c\uac08\uc5b4-\uae30\ubc18 (\uae30\ud0c0)
languages.sog=\uc18c\uadf8\ub514\uc5d4\uc5b4
languages.ada=\uc544\ub2f9\uba54\uc5b4
-languages.kos=\ucf54\uc2a4\ub77c\uc774\uc5d4\uc5b4
-languages.hit=\ud558\ud0c0\uc774\ud2b8\uc5b4
languages.cpf=\ud06c\ub808\uc624\ub9ac\uc2a4\uc640 \ud53c\uae34\uc2a4\uc5b4, \ud504\ub791\uc2a4\uc5b4-\uae30\ubc18 (\uae30\ud0c0)
+languages.hit=\ud558\ud0c0\uc774\ud2b8\uc5b4
+languages.kos=\ucf54\uc2a4\ub77c\uc774\uc5d4\uc5b4
languages.cpe=\ud06c\ub808\uc624\ub9ac\uc2a4\uc640 \ud53c\uae34\uc2a4\uc5b4, \uc601\uc5b4-\uae30\ubc18 (\uae30\ud0c0)
languages.him=\ud788\ub9c8\ucc28\ub9ac\uc5b4
-languages.kok=\ucf54\uce74\ub2c8\uc5b4
-languages.hil=\ud5e4\ub9ac\uac00\ub1ec\uc5b4
languages.got=\uace0\ud2b8\uc5b4
+languages.hil=\ud5e4\ub9ac\uac00\ub1ec\uc5b4
+languages.kok=\ucf54\uce74\ub2c8\uc5b4
languages.gor=\uace0\ub860\ud0c8\ub85c\uc5b4
languages.gon=\uace4\ub514\uc5b4
languages.din=\ub529\uce74\uc5b4
@@ -1156,21 +698,21 @@ languages.ms=\ub9d0\ub808\uc774\uc5b4
languages.mr=\ub9c8\ub77c\ud2f0\uc5b4
languages.fro=\ud504\ub791\uc2a4\uc5b4, \uace0\ub300 (842-ca.1400)
languages.mo=\ubab0\ub2e4\ube44\uc544\uc5b4
-languages.frm=\ud504\ub791\uc2a4\uc5b4, \uc911\uc138 (ca.1400-1600)
languages.mn=\ubabd\uace8\uc5b4
-languages.jrb=\uc720\ub300-\uc544\ub77c\ube44\uc544\uc5b4
+languages.frm=\ud504\ub791\uc2a4\uc5b4, \uc911\uc138 (ca.1400-1600)
languages.ml=\ub9d0\ub77c\uc584\ub78c\uc5b4
+languages.jrb=\uc720\ub300-\uc544\ub77c\ube44\uc544\uc5b4
languages.mk=\ub9c8\ucf00\ub3c4\ub2c8\uc544\uc5b4
languages.mi=\ub9c8\uc624\ub9ac\uc5b4
languages.mh=\ub9c8\uc15c\uc81c\ub3c4\uc5b4
languages.mg=\ub9c8\ub2e4\uac00\uc2a4\uce74\ub974\uc5b4
languages.mwr=\ub9c8\ub974\uc640\ub9ac\uc5b4
languages.bra=\ube0c\ub77c\uc5b4
-languages.den=\uc2ac\ub77c\ube0c\uc5b4
languages.lv=\ub77c\ud2b8\ube44\uc544\uc5b4
+languages.den=\uc2ac\ub77c\ube0c\uc5b4
languages.lu=\ub8e8\ubc14-\uce74\ud0c4\uac00\uc5b4
-languages.del=\ub378\ub77c\uc6e8\uc5b4\uc5b4
languages.lt=\ub9ac\ud22c\uc544\ub2c8\uc544\uc5b4
+languages.del=\ub378\ub77c\uc6e8\uc5b4\uc5b4
languages.lo=\ub77c\uc624\uc5b4
languages.ln=\ub9c1\uac08\ub77c\uc5b4
languages.li=\ub9bc\ubc84\uac70\uc5b4
@@ -1223,37 +765,37 @@ languages.iu=\uc774\ub205\ud2f0\ud22c\ud2b8\uc5b4
languages.pap=\ud30c\ud53c\uc544\uba3c\ud1a0\uc5b4
languages.it=\uc774\ud0c8\ub9ac\uc544\uc5b4
languages.sgn=\uc218\ud654
-languages.is=\uc544\uc774\uc2ac\ub780\ub4dc\uc5b4
languages.kha=\uce74\uc2dc\uc5b4
+languages.is=\uc544\uc774\uc2ac\ub780\ub4dc\uc5b4
languages.chr=\uccb4\ub85c\ud0a4\uc5b4
languages.pam=\ud31c\ud321\uac00\uc5b4
languages.pal=\ud314\ube4c\ub808\uc5b4
languages.chp=\uce58\ud398\uc6b0\uc580
-languages.io=\uc774\ub3c4\uc5b4
languages.cho=\ucd09\ud1a0\uc5b4
+languages.io=\uc774\ub3c4\uc5b4
languages.chn=\uce58\ub204\ud06c\uc5b4\uc640 \uc601\uc5b4 \ud504\ub791\uc2a4\uc5b4\uc758 \ud63c\uc131\uc5b4
languages.chm=\ub9c8\ub9ac\uc5b4
languages.tyv=\ud22c\ube44\ub2c8\uc548\uc5b4
languages.bnt=\ubc18\ud22c\uc5b4
languages.pag=\ud310\uac00\uc2dc\ub09c\uc5b4
-languages.ik=\uc774\ub204\ud53c\uc544\ud06c\uc5b4
languages.chk=\uce04\ucf00\uc2a4\uc5b4
-languages.ii=\uc2dc\uce04\uc548 \uc774\uc5b4
+languages.ik=\uc774\ub204\ud53c\uc544\ud06c\uc5b4
languages.haw=\ud558\uc640\uc774\uc5b4
+languages.ii=\uc2dc\uce04\uc548 \uc774\uc5b4
languages.lam=\ub78c\ubc14\uc5b4
-languages.ig=\uc774\uadf8\ubcf4\uc5b4
languages.chg=\ucc28\uac00\ud0c0\uc774\uc5b4
+languages.ig=\uc774\uadf8\ubcf4\uc5b4
languages.sga=\uc544\uc77c\ub79c\ub4dc, \uace0\ub300 (900\ub144 \uae4c\uc9c0)
languages.paa=\ud30c\ud478\uc544\uc5b4 (\uae30\ud0c0)
languages.ie=\uc778\ud130\ub9c1\uac8c\uc5b4
languages.id=\uc778\ub3c4\ub124\uc2dc\uc544\uc5b4
languages.lah=\ub77c\ud55c\ub2e4\uc5b4
-languages.day=\ub2e4\uc57c\ud06c\uc5b4
languages.chb=\uce58\ube0c\ucc28\uc5b4
+languages.day=\ub2e4\uc57c\ud06c\uc5b4
languages.ia=\uc778\ud130\ub9c1\uac70
languages.lad=\ub77c\ub514\ub178\uc5b4
-languages.hai=\ud558\uc774\ub2e4\uc5b4
languages.dar=\ub2e4\ub974\uadf8\uc640\uc5b4
+languages.hai=\ud558\uc774\ub2e4\uc5b4
languages.hy=\uc544\ub974\uba54\ub2c8\uc544\uc5b4
languages.ath=\uc544\ud0c0\ubc14\uc2a4\uce74\uc5b4
languages.hu=\ud5dd\uac00\ub9ac\uc5b4
@@ -1275,9 +817,9 @@ languages.iro=\uc774\ub7ec\ucffc\uc774\uc5b4
languages.gn=\uad6c\uc544\ub77c\ub2c8\uc5b4
languages.gl=\uac08\ub9ac\uc2dc\uc544\uc5b4
languages.arw=\uc544\ub77c\uc640\ud06c\uc5b4
-languages.gez=\uac8c\uc774\uc988\uc5b4
-languages.art=\uae30\uacc4\uc5b4 (\uae30\ud0c0)
languages.gd=\uc2a4\ucf54\uac24\ub9ad\uc5b4
+languages.art=\uae30\uacc4\uc5b4 (\uae30\ud0c0)
+languages.gez=\uac8c\uc774\uc988\uc5b4
languages.ira=\uc774\ub780\uc5b4
languages.ga=\uc544\uc77c\ub79c\ub4dc\uc5b4
languages.arp=\uc544\ub77c\ud30c\ud638\uc5b4
@@ -1286,8 +828,8 @@ languages.fy=\ud504\ub9ac\uc9c0\uc544\uc5b4
languages.bla=\uc2dd\uc2dc\uce74\uc5b4
languages.gem=\ub3c5\uc77c\uc5b4 (\uae30\ud0c0)
languages.ypk=\uc57c\ud53d\uc5b4
-languages.arc=\uc544\ub78c\uc5b4
languages.fr=\ud504\ub791\uc2a4\uc5b4
+languages.arc=\uc544\ub78c\uc5b4
languages.fo=\ud398\ub85c\uc2a4\uc5b4
languages.cel=\ucf08\ud2b8\uc5b4 (\uae30\ud0c0)
languages.fj=\ud53c\uc9c0\uc5b4
@@ -1311,9 +853,9 @@ languages.tum=\ud23c\ubd80\uce74\uc5b4
languages.mos=\ubaa8\uc2dc\uc5b4
languages.dz=\ubd80\ud0c4\uc5b4
languages.nic=\ub2c8\uc81c\ub974 - \ucf54\ub974\ub3c4\ud30c\ub2c8\uc544\uc5b4 (\uae30\ud0c0)
-languages.lus=\ub8e8\uc0e4\uc774\uc5b4
-languages.fiu=\ud53c\ub178\uc6b0\uadf8\ub9ac\uc544\uc5b4 (\uae30\ud0c0)
languages.dv=\ub514\ubca0\ud788\uc5b4
+languages.fiu=\ud53c\ub178\uc6b0\uadf8\ub9ac\uc544\uc5b4 (\uae30\ud0c0)
+languages.lus=\ub8e8\uc0e4\uc774\uc5b4
languages.nia=\ub2c8\uc544\uc2a4\uc5b4
languages.moh=\ubaa8\ud638\ud06c\uc5b4
languages.luo=\ub8e8\uc624\uc5b4
@@ -1336,8 +878,8 @@ languages.wak=\uc640\uce74\uc0e8\uc5b4
languages.sat=\uc0b0\ud0c8\ub9ac\uc5b4
languages.cy=\uc6e8\uc77c\uc2a4\uc5b4
languages.sas=\uc0ac\uc0ac\ud06c\uc5b4
-languages.kbd=\uce74\ubc14\ub974\ub514\uc5b4
languages.cv=\ucd94\ubc14\uc2dc\uc5b4
+languages.kbd=\uce74\ubc14\ub974\ub514\uc5b4
languages.cu=\uad50\ud68c\uc2ac\ub77c\ube0c\uc5b4
languages.mni=\ub9c8\ub2c8\ud478\ub9ac\uc5b4
languages.cs=\uccb4\ucf54\uc5b4
@@ -1349,16 +891,16 @@ languages.co=\ucf54\ub974\uc2dc\uce74\uc5b4
languages.sai=\ub0a8\uc544\uba54\ub9ac\uce74 \uc778\ub514\uc5b8\uc5b4 (\uae30\ud0c0)
languages.mnc=\ub9cc\uc8fc\uc5b4
languages.sah=\uc57c\ud050\ud2b8\uc5b4
-languages.kaw=\uce74\uc704\uc5b4
-languages.inh=\uc778\uadc0\uc2dc\uc5b4
languages.gba=\uadf8\ubc14\uc57c\uc5b4
+languages.inh=\uc778\uadc0\uc2dc\uc5b4
+languages.kaw=\uce74\uc704\uc5b4
languages.sad=\uc0b0\ub2e4\uc6e8\uc5b4
languages.ch=\ucc28\ubaa8\ub85c\uc5b4
-languages.ine=\uc778\ub3c4\uc720\ub7fd\uc5b4 (\uae30\ud0c0)
languages.bho=\ud638\uc988\ud478\ub9ac\uc5b4
+languages.ine=\uc778\ub3c4\uc720\ub7fd\uc5b4 (\uae30\ud0c0)
languages.enm=\uc601\uc5b4, \uc911\uc138 (1100-1500)
-languages.kar=\uce74\ub80c\uc5b4
languages.inc=\uc778\ub3c4\uc5b4 (\uae30\ud0c0)
+languages.kar=\uce74\ub80c\uc5b4
languages.gay=\uac00\uc694\uc5b4
languages.ca=\uce74\ud0c8\ub85c\ub2c8\uc544\uc5b4
languages.umb=\uc724\ubc88\ub450\uc5b4
@@ -1366,19 +908,19 @@ languages.syr=\uc2dc\ub9ac\uc544\uc5b4
languages.kam=\uce84\ubc14\uc5b4
languages.tsi=\ud2b8\uc2ec\uc2dc\uc548\uc5b4
languages.ang=\uc774\uc804 \uc601\uc5b4 (ca.450-1100)
-languages.kac=\uce74\uce5c\uc5b4
languages.cau=\uce74\ud504\uce74\uc2a4\uc5b4 (\uae30\ud0c0)
+languages.kac=\uce74\uce5c\uc5b4
languages.kab=\ucee4\ubc14\uc77c\uc5b4
-languages.kaa=\uce74\ub77c\uce7c\ud30c\ud06c\uc5b4
languages.bs=\ubcf4\uc2a4\ub2c8\uc544\uc5b4
-languages.car=\uce74\ub9ac\ube0c\uc5b4
+languages.kaa=\uce74\ub77c\uce7c\ud30c\ud06c\uc5b4
languages.br=\ube0c\ub974\ud0c0\ub274\uc5b4
+languages.car=\uce74\ub9ac\ube0c\uc5b4
languages.bo=\ud2f0\ubca0\ud2b8\uc5b4
languages.bn=\ubcb5\uace8\uc5b4
languages.bm=\ubc24\ubc14\ub77c\uc5b4
languages.gaa=\uac00\uc5b4
-languages.cai=\uc911\uc559 \uc544\uba54\ub9ac\uce74 \uc778\ub514\uc548\uc5b4 (\uae30\ud0c0)
languages.bi=\ube44\uc2ac\ub77c\ub9c8\uc5b4
+languages.cai=\uc911\uc559 \uc544\uba54\ub9ac\uce74 \uc778\ub514\uc548\uc5b4 (\uae30\ud0c0)
languages.bh=\ube44\ud558\ub974\uc5b4
languages.bg=\ubd88\uac00\ub9ac\uc544\uc5b4
languages.be=\ubca8\ub85c\ub8e8\uc2dc\uc5b4
@@ -1392,10 +934,10 @@ languages.az=\uc544\uc81c\ub974\ubc14\uc774\uc794\uc5b4
languages.ay=\uc544\uc774\ub9c8\ub77c\uc5b4
languages.av=\uc544\ubc14\ub9ad\uc5b4
languages.as=\uc544\uc0d8\uc5b4
-languages.dsb=\uc800\uae09 \uc18c\ub974\ube44\uc548\uc5b4
languages.ar=\uc544\ub78d\uc5b4
-languages.ilo=\uc774\ub85c\ucf54\uc5b4
+languages.dsb=\uc800\uae09 \uc18c\ub974\ube44\uc548\uc5b4
languages.elx=\uc5d8\ub78c\uc5b4
+languages.ilo=\uc774\ub85c\ucf54\uc5b4
languages.zh=\uc911\uad6d\uc5b4
languages.an=\uc544\ub77c\uace4\uc5b4
languages.pra=\ud504\ub77c\ud06c\ub9ac\ud2b8\uc5b4
diff --git a/resource/gnu/java/locale/LocaleInformation_kok.properties b/resource/gnu/java/locale/LocaleInformation_kok.properties
new file mode 100644
index 000000000..6e3fe9122
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_kok.properties
@@ -0,0 +1,156 @@
+# LocaleInformation_kok.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currenciesSymbol.INR=\u0930\u0941
+shortMonths=\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940®\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940®\u092e\u093e\u0930\u094d\u091a®\u090f\u092a\u094d\u0930\u093f\u0932®\u092e\u0947®\u091c\u0942\u0928®\u091c\u0941\u0932\u0948®\u0913\u0917\u0938\u094d\u091f®\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930®\u0913\u0915\u094d\u091f\u094b\u092c\u0930®\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930®\u0921\u093f\u0938\u0947\u0902\u092c\u0930®®
+months=\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940®\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940®\u092e\u093e\u0930\u094d\u091a®\u090f\u092a\u094d\u0930\u093f\u0932®\u092e\u0947®\u091c\u0942\u0928®\u091c\u0941\u0932\u0948®\u0913\u0917\u0938\u094d\u091f®\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930®\u0913\u0915\u094d\u091f\u094b\u092c\u0930®\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930®\u0921\u093f\u0938\u0947\u0902\u092c\u0930®®
+shortWeekdays=®\u0930\u0935\u093f®\u0938\u094b\u092e®\u092e\u0902\u0917\u0933®\u092c\u0941\u0927®\u0917\u0941\u0930\u0941®\u0936\u0941\u0915\u094d\u0930®\u0936\u0928\u093f®
+weekdays=®\u0906\u0926\u093f\u0924\u094d\u092f\u0935\u093e\u0930®\u0938\u094b\u092e\u0935\u093e\u0930®\u092e\u0902\u0917\u0933\u093e\u0930®\u092c\u0941\u0927\u0935\u093e\u0930®\u0917\u0941\u0930\u0941\u0935\u093e\u0930®\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930®\u0936\u0928\u093f\u0935\u093e\u0930®
+eras=\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u092a\u0942\u0930\u094d\u0935®\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u0936\u0916\u093e®
+ampms=\u092e.\u092a\u0942.®\u092e.\u0928\u0902.®
+zoneStrings=Asia/Calcutta®IST®\u092d\u093e\u0930\u0924\u0940\u092f \u0938\u092e\u092f®IST®\u092d\u093e\u0930\u0924\u0940\u092f \u0938\u092e\u092f®©
+territories.IN=\u092d\u093e\u0930\u0924
+languages.es=\u0938\u094d\u092a\u093e\u0928\u093f\u0937
+languages.ku=\u0915\u0941\u0930\u094d\u0926\u093f\u0937
+languages.eo=\u0907\u0938\u094d\u092a\u0930\u093e\u0928\u094d\u091f\u094b
+languages.en=\u0906\u0902\u0917\u094d\u0932
+languages.ks=\u0915\u0936\u094d\u092e\u0940\u0930\u0940
+languages.el=\u0917\u094d\u0930\u0940\u0915\u094d
+languages.qu=\u0915\u094d\u0935\u0947\u091a\u094d\u0935\u093e
+languages.ko=\u0915\u094b\u0930\u093f\u092f\u0928\u094d
+languages.kn=\u0915\u0928\u094d\u0928\u0921\u093e
+languages.km=\u0915\u0902\u092c\u094b\u0921\u093f\u092f\u0928
+languages.kok=\u0915\u094b\u0902\u0915\u0923\u0940
+languages.kl=\u0917\u094d\u0930\u0940\u0928\u0932\u093e\u0928\u094d\u0921\u093f\u0915
+languages.kk=\u0915\u091c\u093c\u0916\u094d
+languages.wo=\u0909\u0932\u094b\u092b\u093c
+languages.ka=\u091c\u093e\u0930\u094d\u091c\u093f\u092f\u0928\u094d
+languages.dz=\u092d\u0942\u091f\u093e\u0928\u0940
+languages.jv=\u091c\u093e\u0935\u0928\u0940\u0938\u094d
+languages.pt=\u092a\u094b\u0930\u094d\u091a\u0941\u0917\u0940\u091c\u093c\u094d
+languages.ps=\u092a\u093e\u0937\u094d\u091f\u094b (\u092a\u0941\u0937\u094d\u091f\u094b)
+languages.de=\u091c\u0930\u094d\u092e\u0928
+languages.pl=\u092a\u094b\u0932\u093f\u0937
+languages.da=\u0921\u093e\u0928\u093f\u0937
+languages.vo=\u0913\u0932\u093e\u092a\u0941\u0915
+languages.ja=\u091c\u093e\u092a\u0928\u0940\u0938\u094d
+languages.vi=\u0935\u093f\u092f\u0924\u094d\u0928\u093e\u092e\u0940\u091c\u093c
+languages.cy=\u0935\u0947\u0933\u094d\u0937\u094d
+languages.pa=\u092a\u0902\u091c\u093e\u092c\u0940
+languages.cs=\u091c\u093c\u0947\u0915\u094d
+languages.iu=\u0907\u0928\u094d\u092f\u0941\u0915\u091f\u094d\u091f
+languages.co=\u0915\u094b\u0930\u094d\u0936\u093f\u092f\u0928
+languages.it=\u0907\u091f\u093e\u0932\u093f\u092f\u0928
+languages.is=\u0906\u0908\u0938\u094d\u0932\u093e\u0928\u094d\u0921\u093f\u0915
+languages.uz=\u0909\u091c\u093c\u092c\u0947\u0915
+languages.or=\u0913\u0930\u093f\u092f\u093e
+languages.ik=\u0907\u0928\u0942\u092a\u0947\u092f\u093e\u0915\u094d
+languages.ur=\u0909\u0930\u094d\u0926\u0942
+languages.om=\u0913\u0930\u094b\u092e\u094b (\u0905\u092b\u093e\u0928)
+languages.ca=\u0915\u091f\u0932\u093e\u0928
+languages.ie=\u0907\u0928\u094d\u091f\u0930\u0932\u093f\u0902\u0917\u094d
+languages.id=\u0907\u0928\u094d\u0921\u094b\u0928\u0947\u0937\u093f\u092f\u0928
+languages.uk=\u092f\u0941\u0915\u094d\u0930\u0947\u0928\u093f\u092f\u0928\u094d
+languages.ia=\u0907\u0928\u094d\u091f\u0930\u0932\u093f\u0902\u0917\u094d\u0935\u093e
+languages.oc=\u0913\u0938\u093f\u091f\u093e\u0928\u094d
+languages.ug=\u0909\u0927\u0942\u0930
+languages.hy=\u0906\u0930\u094d\u092e\u0940\u0928\u093f\u092f\u0928\u094d
+languages.br=\u092c\u094d\u0930\u0947\u091f\u0928
+languages.hu=\u0939\u0902\u0917\u0947\u0930\u093f\u092f\u0928\u094d
+languages.bo=\u0924\u093f\u092c\u0947\u0924\u093f\u092f\u0928
+languages.bn=\u092c\u0902\u0917\u093e\u0932\u0940
+languages.hr=\u0915\u094d\u0930\u094b\u092f\u0947\u0937\u093f\u092f\u0928\u094d
+languages.bi=\u092c\u093f\u0938\u0932\u092e\u093e
+languages.tw=\u0924\u094d\u0935\u093f
+languages.bh=\u092c\u0940\u0939\u093e\u0930\u0940
+languages.bg=\u092c\u0932\u094d\u0917\u0947\u0930\u093f\u092f\u0928
+languages.tt=\u0924\u091f\u093e\u0930
+languages.no=\u0928\u094b\u0930\u094d\u0935\u0947\u091c\u093f\u092f\u0928
+languages.be=\u092c\u0948\u0932\u094b\u0930\u0941\u0938\u093f\u092f\u0928\u094d
+languages.ts=\u0924\u094d\u0938\u094b\u0917\u093e
+languages.hi=\u0939\u093f\u0928\u094d\u0926\u0940
+languages.tr=\u0924\u0941\u0930\u094d\u0915\u093f\u0937
+languages.nl=\u0921\u091a\u094d
+languages.zu=\u091c\u0941\u0932\u0942
+languages.ba=\u092c\u0937\u094d\u0915\u093f\u0930
+languages.to=\u0924\u094b\u0902\u0917\u093e
+languages.he=\u0939\u0947\u092c\u094d\u0930\u0941
+languages.tn=\u0938\u0947\u0924\u094d\u0938\u094d\u0935\u093e\u0928\u093e
+languages.tl=\u0924\u0917\u093e\u0932\u094b\u0917
+languages.tk=\u0924\u0941\u0930\u094d\u0915\u092e\u0928
+languages.ha=\u0939\u094c\u0938\u093e
+languages.ne=\u0928\u0947\u092a\u093e\u0933\u0940
+languages.az=\u0905\u091c\u093c\u0930\u092c\u0948\u091c\u093e\u0928\u0940
+languages.ti=\u0924\u093f\u0917\u094d\u0930\u093f\u0928\u094d\u092f\u093e
+languages.ay=\u0910\u092e\u0930\u093e
+languages.th=\u0925\u093e\u0908
+languages.tg=\u0924\u091c\u093f\u0915
+languages.na=\u0928\u094c\u0930\u094b
+languages.te=\u0924\u0947\u0932\u0941\u0917\u0942
+languages.zh=\u091a\u0940\u0928\u0940\u0938\u094d
+languages.as=\u0905\u0938\u093e\u092e\u0940
+languages.ar=\u0905\u0930\u0947\u092c\u093f\u0915\u094d
+languages.ta=\u0924\u092e\u093f\u0933
+languages.gu=\u0917\u0941\u091c\u0930\u093e\u0924\u0940
+languages.my=\u092c\u0930\u094d\u092e\u0940\u091c\u093c\u094d
+languages.am=\u0905\u092e\u0939\u093e\u0930\u093f\u0915\u094d
+languages.za=\u091d\u094d\u0939\u0941\u0928\u094d\u0917
+languages.mt=\u092e\u093e\u0932\u0924\u0940\u0938\u094d
+languages.ms=\u092e\u0932\u092f
+languages.gn=\u0917\u094c\u0930\u093e\u0928\u0940
+languages.sw=\u0938\u094d\u0935\u093e\u0939\u093f\u0932\u0940
+languages.mr=\u092e\u0930\u093e\u0920\u0940
+languages.sv=\u0938\u094d\u0935\u0940\u0926\u0940\u0937
+languages.gl=\u0917\u0947\u0932\u0940\u0936\u093f\u092f\u0928
+languages.su=\u0938\u0941\u0902\u0926\u0928\u0940\u0938
+languages.af=\u0905\u092b\u094d\u0930\u093f\u0915\u093e\u0928\u094d\u0938
+languages.st=\u0938\u0947\u0938\u094b\u0925\u094b
+languages.mo=\u092e\u094b\u0932\u094d\u0921\u093e\u0935\u093f\u092f\u0928\u094d
+languages.ss=\u0938\u093f\u0938\u094d\u0935\u093e\u0924\u0940
+languages.mn=\u092e\u0902\u0917\u094b\u0932\u093f\u092f\u0928\u094d
+languages.sr=\u0938\u0947\u0930\u094d\u092c\u093f\u092f\u0928\u094d
+languages.sq=\u0906\u0932\u094d\u092c\u0947\u0928\u093f\u092f\u0928\u094d
+languages.ml=\u092e\u0933\u093f\u092f\u093e\u0933\u092e
+languages.ab=\u0905\u092c\u0916\u0947\u091c\u093c\u093f\u092f\u0928
+languages.mk=\u092e\u0938\u0940\u0921\u094b\u0928\u093f\u092f\u0928\u094d
+languages.aa=\u0905\u092b\u093e\u0930
+languages.so=\u0938\u094b\u092e\u093e\u0933\u0940
+languages.sn=\u0936\u094b\u0928\u093e
+languages.mi=\u092e\u093e\u0913\u0930\u0940
+languages.gd=\u0938\u094d\u0915\u093e\u091f\u0938\u094d \u0917\u0947\u0932\u093f\u0915\u094d
+languages.sm=\u0938\u092e\u094b\u0928
+languages.sl=\u0938\u094d\u0932\u094b\u0935\u0947\u0928\u093f\u092f\u0928\u094d
+languages.mg=\u092e\u0932\u093e\u0917\u0938\u0940
+languages.sk=\u0938\u094d\u0932\u094b\u0935\u093e\u0915
+languages.ga=\u0910\u0930\u093f\u0937
+languages.yo=\u092f\u0942\u0930\u0941\u092c\u093e
+languages.si=\u0938\u093f\u0928\u094d\u0939\u0932\u0940\u0938\u094d
+languages.sh=\u0938\u0947\u0930\u094d\u092c\u094b-\u0915\u094d\u0930\u094b\u092f\u0947\u0937\u093f\u092f\u0928\u094d
+languages.sg=\u0938\u093e\u0902\u0917\u094d\u0930\u094b
+languages.yi=\u0907\u0926\u094d\u0926\u093f\u0937\u094d
+languages.sd=\u0938\u093f\u0902\u0927\u0940
+languages.fy=\u092b\u094d\u0930\u093f\u0936\u093f\u092f\u0928\u094d
+languages.sa=\u0938\u0902\u0938\u094d\u0915\u0943\u0924
+languages.fr=\u092b\u094d\u0930\u0947\u0928\u094d\u091a
+languages.lv=\u0932\u093e\u091f\u094d\u0935\u093f\u092f\u0928\u094d (\u0932\u0947\u091f\u094d\u091f\u093f\u0937\u094d)
+languages.fo=\u092b\u0947\u0930\u094b\u0938\u094d
+languages.lt=\u0932\u093f\u0925\u0941\u0906\u0928\u093f\u092f\u0928\u094d
+languages.rw=\u0915\u093f\u0928\u094d\u092f\u093e\u0930\u094d\u0935\u093e\u0928\u094d\u0921\u093e
+languages.ru=\u0930\u0937\u094d\u092f\u0928\u094d
+languages.fj=\u092b\u093f\u091c\u0940
+languages.lo=\u0932\u093e\u0913\u0924\u093f\u092f\u0928\u094d
+languages.fi=\u092b\u093f\u0928\u094d\u0928\u093f\u0937\u094d
+languages.ln=\u0932\u093f\u0902\u0917\u093e\u0932\u093e
+languages.ro=\u0930\u094b\u092e\u093e\u0928\u093f\u092f\u0928\u094d
+languages.rn=\u0915\u093f\u0930\u0941\u0928\u094d\u0926\u0940
+languages.rm=\u0930\u0939\u091f\u094b-\u0930\u094b\u092e\u093e\u0928\u094d\u0938\u094d
+languages.fa=\u092a\u0930\u094d\u0937\u093f\u092f\u0928\u094d
+languages.la=\u0932\u093e\u091f\u093f\u0928
+languages.xh=\u091d\u093c\u094c\u0938\u093e
+languages.eu=\u092c\u093e\u0938\u094d\u0915
+languages.et=\u0907\u0938\u094d\u091f\u094b\u0928\u093f\u092f\u0928\u094d
+languages.ky=\u0915\u093f\u0930\u094d\u0917\u093f\u091c\u093c
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_IN.properties b/resource/gnu/java/locale/LocaleInformation_kok_IN.properties
index c814c1caa..64ff6f55d 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_kok_IN.properties
@@ -1,16 +1,18 @@
-# LocaleInformation_ar_IN.properties --
+# LocaleInformation_kok_IN.properties --
# Copyright (C) 1991-2005 Unicode, Inc.
# All rights reserved. Distributed under the Terms of Use
# in http://www.unicode.org/copyright.html.
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
firstDayOfWeek=mon
shortDateFormat=d-M-yy
mediumDateFormat=dd-MM-yyyy
longDateFormat=d MMMM yyyy
fullDateFormat=EEEE d MMMM yyyy
+shortTimeFormat=h:mm a
+mediumTimeFormat=h:mm:ss a
longTimeFormat=h:mm:ss a z
fullTimeFormat=h:mm:ss a z
diff --git a/resource/gnu/java/locale/LocaleInformation_ky.properties b/resource/gnu/java/locale/LocaleInformation_ky.properties
index f736a4997..ae3295179 100644
--- a/resource/gnu/java/locale/LocaleInformation_ky.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ky.properties
@@ -7,7 +7,6 @@
decimalSeparator=,
groupingSeparator=\u00a0
-currenciesDisplayName.KGS=KGS
currenciesSymbol.KGS=\u0441\u043e\u043c
territories.KG=\u041a\u044b\u0440\u0433\u044b\u0437\u0441\u0442\u0430\u043d
languages.ky=\u041a\u044b\u0440\u0433\u044b\u0437
diff --git a/resource/gnu/java/locale/LocaleInformation_lo.properties b/resource/gnu/java/locale/LocaleInformation_lo.properties
index 37eb889bd..cf94908fd 100644
--- a/resource/gnu/java/locale/LocaleInformation_lo.properties
+++ b/resource/gnu/java/locale/LocaleInformation_lo.properties
@@ -12,6 +12,7 @@ shortMonths=\u0ea1.\u0e81.®\u0e81.\u0e9e.®\u0ea1\u0eb5.\u0e99.®\u0ea1.\u0eaa..®\
months=\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99®\u0e81\u0eb8\u0ea1\u0e9e\u0eb2®\u0ea1\u0eb5\u0e99\u0eb2®\u0ec0\u0ea1\u0eaa\u0eb2®\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2®\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2®\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94®\u0eaa\u0eb4\u0e87\u0eab\u0eb2®\u0e81\u0eb1\u0e99\u0e8d\u0eb2®\u0e95\u0eb8\u0ea5\u0eb2®\u0e9e\u0eb0\u0e88\u0eb4\u0e81®\u0e97\u0eb1\u0e99\u0ea7\u0eb2®®
shortWeekdays=®\u0ead\u0eb2.®\u0e88.®\u0ead.®\u0e9e.®\u0e9e\u0eab.®\u0eaa\u0e81.®\u0eaa.®
weekdays=®\u0ea7\u0eb1\u0e99\u0ead\u0eb2\u0e97\u0eb4\u0e94®\u0ea7\u0eb1\u0e99\u0e88\u0eb1\u0e99®\u0ea7\u0eb1\u0e99\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99®\u0ea7\u0eb1\u0e99\u0e9e\u0eb8\u0e94®\u0ea7\u0eb1\u0e99\u0e9e\u0eb0\u0eab\u0eb1\u0e94®\u0ea7\u0eb1\u0e99\u0eaa\u0eb8\u0e81®\u0ea7\u0eb1\u0e99\u0ec0\u0eaa\u0ebb\u0eb2®
+eras=\u0e9b\u0eb5\u0e81\u0ec8\u0ead\u0e99\u0e84\u0eb4\u0e94\u0eaa\u0eb0\u0e81\u0eb2\u0e99\u0e97\u0eb5\u0ec8®\u0e84.\u0eaa.®
ampms=\u0e81\u0ec8\u0ead\u0e99\u0e97\u0ec8\u0ebd\u0e87®\u0eab\u0ea5\u0eb1\u0e87\u0e97\u0ec8\u0ebd\u0e87®
shortDateFormat=d/M/yyyy
mediumDateFormat=d MMM yyyy
@@ -83,13 +84,14 @@ territories.PL=\u0ec2\u0e9b\u0ec1\u0ea5\u0e99
territories.PK=\u0e9b\u0eb2\u0e81\u0eb4\u0eaa\u0e96\u0eb2\u0e99
territories.PH=\u0e9f\u0eb4\u0ea5\u0eb4\u0e9b\u0eb4\u0e99
territories.PG=\u0e9b\u0eb2\u0e9b\u0ebb\u0ea7\u0e99\u0eb4\u0ea7\u0e81\u0eb5\u0e99\u0eb5
-territories.PF=\u0ec0\u0e9f\u0eb1\u0e99\u0ea3\u0ec2\u0e9e\u0ea5\u0eb4\u0e99\u0eb5\u0ec0\u0e8a\u0e8d
territories.CZ=\u0eaa\u0eb2\u0e97\u0eb2\u0ea5\u0eb0\u0e99\u0eb0\u0ea5\u0eb1\u0e94\u0ec0\u0e8a\u0eb1\u0e81
-territories.PE=\u0ec0\u0e9b\u0ea5\u0eb9
+territories.PF=\u0ec0\u0e9f\u0eb1\u0e99\u0ea3\u0ec2\u0e9e\u0ea5\u0eb4\u0e99\u0eb5\u0ec0\u0e8a\u0e8d
territories.CY=\u0ec4\u0e8a\u0e9b\u0eb1\u0ebc\u0e94
+territories.PE=\u0ec0\u0e9b\u0ea5\u0eb9
territories.CV=\u0ec0\u0e84\u0e9a\u0ea7\u0ead\u0e94
-territories.PA=\u0e9b\u0eb2\u0e99\u0eb2\u0ea1\u0eb2
territories.CU=\u0e84\u0eb4\u0ea7\u0e9a\u0eb2
+territories.PA=\u0e9b\u0eb2\u0e99\u0eb2\u0ea1\u0eb2
+territories.CS=\u0ec0\u0e8a\u0eb5\u0ec0\u0e9a\u0e8d
territories.CR=\u0e84\u0ead\u0eaa\u0e95\u0eb2\u0ea5\u0eb4\u0e81\u0eb2
territories.CO=\u0ec2\u0e84\u0ea5\u0eb3\u0ec0\u0e9a\u0e8d
territories.CN=\u0e88\u0eb5\u0e99
@@ -107,58 +109,57 @@ territories.BW=\u0e9a\u0ead\u0eb1\u0e94\u0eaa\u0eb0\u0ea7\u0eb2\u0e99\u0eb2
territories.BT=\u0e9e\u0eb9\u0e96\u0eb2\u0e99
territories.BS=\u0e9a\u0eb2\u0eae\u0eb2\u0ea1\u0eb2\u0eaa
territories.BR=\u0e9a\u0ebc\u0eb2\u0e8a\u0eb4\u0ea7
-territories.NZ=\u0e99\u0eb4\u0ea7\u0e8a\u0eb5\u0ec1\u0ea5\u0e99
territories.BO=\u0ec2\u0e9a\u0ea5\u0eb4\u0ec0\u0ea7\u0e8d
+territories.NZ=\u0e99\u0eb4\u0ea7\u0e8a\u0eb5\u0ec1\u0ea5\u0e99
territories.BN=\u0e9a\u0eb9\u0eae\u0ec4\u0e99
territories.BM=\u0ec0\u0e9a\u0eb5\u0ea1\u0eb4\u0ea7\u0e94\u0eb2
-territories.NU=\u0e99\u0eb5\u0ea2\u0eb9
territories.BJ=\u0ec0\u0e9a\u0e99\u0eb4\u0e99
+territories.NU=\u0e99\u0eb5\u0ea2\u0eb9
territories.BI=\u0e9a\u0eb9\u0ea5\u0eb1\u0e99\u0e95\u0eb4
territories.BH=\u0e9a\u0eb2\u0ec0\u0ea5\u0e99
territories.BG=\u0e9a\u0eb1\u0e87\u0e81\u0eb2\u0ec0\u0ea5\u0e8d
territories.BF=\u0ec0\u0e9a\u0eb5\u0e81\u0eb4\u0e99\u0eb2\u0e9f\u0eb2\u0ec2\u0e8a
-territories.NP=\u0ec0\u0e99\u0e9b\u0eb2\u0e99
territories.BE=\u0ec0\u0e9a\u0ea7\u0ea2\u0ebd\u0ea1
-territories.NO=\u0e99\u0ecd\u0ec0\u0ea7
+territories.NP=\u0ec0\u0e99\u0e9b\u0eb2\u0e99
territories.BD=\u0e9a\u0eb1\u0e87\u0e81\u0eb0\u0ea5\u0eb2\u0ec0\u0e97\u0e94
+territories.NO=\u0e99\u0ecd\u0ec0\u0ea7
territories.BB=\u0e9a\u0eb2\u0e9a\u0eb2\u0e84\u0eb1\u0ead\u0e94
territories.ZW=\u0e8a\u0eb4\u0ea1\u0e9a\u0eb1\u0e9a\u0ec0\u0ea7
-territories.NL=\u0ec0\u0e99\u0ec0\u0e97\u0eb5\u0ec1\u0ea5\u0e99
territories.BA=\u0e9a\u0eb1\u0ead\u0e94\u0eaa\u0ec0\u0e99\u0e8d \u0ec1\u0ea5\u0eb0 \u0ec0\u0eae\u0eb5\u0e94\u0ec2\u0e81\u0ea7\u0eb4\u0ec0\u0e99\u0e8d
+territories.NL=\u0ec0\u0e99\u0ec0\u0e97\u0eb5\u0ec1\u0ea5\u0e99
territories.NI=\u0e99\u0eb4\u0e84\u0eb2\u0ea5\u0eb2\u0e81\u0ebb\u0ea7
territories.NG=\u0ec4\u0e99\u0e88\u0eb5\u0ec0\u0ea5\u0e8d
territories.AZ=\u0ead\u0eb2\u0ec0\u0e8a\u0eb5\u0ec4\u0e9a\u0e88\u0eb1\u0e99
territories.NE=\u0ec4\u0e99\u0ec0\u0e88\u0eb5
-territories.NC=\u0e99\u0eb4\u0ea7\u0e84\u0eb2\u0ea5\u0eb4\u0ec2\u0e84\u0ec0\u0e99\u0e8d
territories.AW=\u0ead\u0eb2\u0ea5\u0eb9\u0e9a\u0eb2
+territories.NC=\u0e99\u0eb4\u0ea7\u0e84\u0eb2\u0ea5\u0eb4\u0ec2\u0e84\u0ec0\u0e99\u0e8d
territories.ZM=\u0ec1\u0e8a\u0ea1\u0ec0\u0e9a\u0e8d
-territories.AU=\u0ead\u0ebb\u0ead\u0e94\u0eaa\u0eb0\u0e95\u0eb2\u0ea5\u0eb5
territories.NA=\u0e99\u0eb2\u0ea1\u0eb4\u0ec0\u0e9a\u0e8d
+territories.AU=\u0ead\u0ebb\u0ead\u0e94\u0eaa\u0eb0\u0e95\u0eb2\u0ea5\u0eb5
territories.AT=\u0ead\u0ebb\u0ead\u0e94\u0eaa\u0eb0\u0ec0\u0e95\u0ebc\u0e8d
territories.AR=\u0ead\u0eb2\u0ec0\u0e88\u0e99\u0e95\u0eb4\u0e99\u0eb2\u0ec8
-territories.MZ=\u0ec2\u0ea1\u0ec1\u0e8a\u0ea1\u0e9a\u0eb4\u0e81
territories.AO=\u0ead\u0eb1\u0e99\u0ec2\u0e81\u0ea5\u0eb2
-territories.MY=\u0ea1\u0eb2\u0ec0\u0ea5\u0ec0\u0e8a\u0e8d
+territories.MZ=\u0ec2\u0ea1\u0ec1\u0e8a\u0ea1\u0e9a\u0eb4\u0e81
territories.AN=\u0ec0\u0e99\u0ec0\u0e97\u0eb5\u0ec1\u0ea5\u0e99\u0ec1\u0ead\u0e99\u0ec0\u0e97\u0eb4\u0e99
-territories.MX=\u0ec1\u0ea1\u0eb1\u0e81\u0e8a\u0eb4\u0ec2\u0e81
+territories.MY=\u0ea1\u0eb2\u0ec0\u0ea5\u0ec0\u0e8a\u0e8d
territories.AM=\u0ead\u0eb2\u0ea1\u0eb4\u0ec0\u0e99\u0e8d
+territories.MX=\u0ec1\u0ea1\u0eb1\u0e81\u0e8a\u0eb4\u0ec2\u0e81
territories.AL=\u0ec1\u0ead\u0ea5\u0ec0\u0e9a\u0ec0\u0e99\u0e8d
territories.ZA=\u0ead\u0eb2\u0e9f\u0eb0\u0ea5\u0eb4\u0e81\u0eb2\u0ec3\u0e95\u0ec9
territories.MU=\u0ea1\u0ecd\u0ea3\u0eb4\u0e95\u0ebd\u0e94
-territories.MT=\u0ea1\u0eb1\u0e99\u0e95\u0eb2
territories.AI=\u0ead\u0eb1\u0e99\u0e81\u0eb4\u0ea5\u0eb2
+territories.MT=\u0ea1\u0eb1\u0e99\u0e95\u0eb2
territories.MS=\u0ea1\u0ead\u0e99\u0ec0\u0e8a\u0eb5\u0ea5\u0eb2\u0e94
territories.MR=\u0ea1\u0ecd\u0ea5\u0eb4\u0e81\u0e97\u0eb2\u0ec0\u0e99\u0e8d
-territories.MQ=\u0ea1\u0eb2\u0e95\u0eb4\u0e99\u0eb4\u0e81
territories.AF=\u0ead\u0eb1\u0e9f\u0e81\u0eb2\u0e99\u0eb4\u0e94\u0eaa\u0eb0\u0e96\u0eb2\u0e99
+territories.MQ=\u0ea1\u0eb2\u0e95\u0eb4\u0e99\u0eb4\u0e81
territories.AE=\u0eaa\u0eb0\u0eab\u0eb0\u0ea5\u0eb1\u0e94\u0ead\u0eb2\u0eab\u0ea5\u0eb1\u0e9a\u0ec0\u0ead\u0ea1\u0eb4\u0ec0\u0ea5\u0e94
-territories.MO=\u0ea1\u0eb2\u0ec0\u0e81\u0ebb\u0ec9\u0eb2
territories.AD=\u0ead\u0eb1\u0e99\u0e94\u0ecd\u0ea5\u0eb2
+territories.MO=\u0ea1\u0eb2\u0ec0\u0e81\u0ebb\u0ec9\u0eb2
territories.MN=\u0ea1\u0ebb\u0e87\u0ec2\u0e81\u0ea5\u0eb5
territories.MM=\u0eaa\u0eb0\u0eab\u0eb0\u0e9e\u0eb2\u0e9a\u0e9e\u0eb0\u0ea1\u0ec9\u0eb2
territories.ML=\u0ea1\u0eb2\u0ea5\u0eb4
territories.MK=\u0ec1\u0ea1\u0e8a\u0eb4\u0ec2\u0e84\u0ec0\u0e99\u0e8d
-territories.YU=\u0ea2\u0eb9\u0ec2\u0e81\u0eaa\u0eb0\u0ea5\u0eb2\u0ec0\u0ea7\u0e8d
territories.YT=\u0ea1\u0eb2\u0ea2\u0ead\u0e94
territories.MG=\u0ea1\u0eb2\u0e84\u0eb2\u0e81\u0eb1\u0eaa\u0e81\u0eb2
territories.MD=\u0ec2\u0ea1\u0e99\u0ec2\u0e84\u0ea7\u0eb2
@@ -221,8 +222,8 @@ territories.TM=\u0ec0\u0e95\u0ea3\u0eb5\u0e81\u0ec0\u0ea1\u0e99\u0eb4\u0eaa\u0eb
languages.es=\u0eaa\u0eb0\u0ec0\u0e9b\u0e99
languages.ku=\u0ec0\u0e84\u0eb5\u0e94
languages.eo=\u0ec0\u0ead\u0eaa\u0ec0\u0e9b\u0eb5\u0ea5\u0eb1\u0e99\u0ec2\u0e95
-languages.ks=\u0e84\u0eb1\u0e94\u0e8a\u0eb0\u0ea1\u0eb5\u0ea5\u0eb5
languages.en=\u0ead\u0eb1\u0e87\u0e81\u0eb4\u0e94
+languages.ks=\u0e84\u0eb1\u0e94\u0e8a\u0eb0\u0ea1\u0eb5\u0ea5\u0eb5
languages.el=\u0e81\u0eb5\u0e81
languages.qu=\u0e84\u0eb4\u0ea7\u0e8a\u0ebb\u0ea7
languages.ko=\u0ec0\u0e81\u0ebb\u0eb2\u0eab\u0ea5\u0eb5
@@ -246,8 +247,8 @@ languages.cy=\u0ec0\u0ea7\u0ea7
languages.pa=\u0e9b\u0eb1\u0e99\u0e88\u0eb2
languages.cs=\u0ec0\u0e8a\u0eb1\u0e81
languages.iu=\u0ec4\u0ead\u0e99\u0eb8\u0e81\u0e95\u0eb4\u0e95\u0eb1\u0e81
-languages.it=\u0ead\u0eb4\u0e95\u0eb2\u0eaa\u0eb4
languages.co=\u0e84\u0ecd\u0e8a\u0eb4\u0e81\u0ec9\u0eb2
+languages.it=\u0ead\u0eb4\u0e95\u0eb2\u0eaa\u0eb4
languages.is=\u0ec4\u0ead\u0ec1\u0ea5\u0e99\u0e94\u0eb4\u0e94
languages.uz=\u0ead\u0eb8\u0e94\u0eaa\u0eb0\u0ec0\u0e9a\u0e94
languages.or=\u0ec2\u0ead\u0ea5\u0eb4\u0e8d\u0eb2
@@ -323,8 +324,8 @@ languages.mk=\u0ec1\u0ea1\u0eb1\u0e81\u0e8a\u0eb4\u0ec2\u0e94\u0ec0\u0e99\u0e8d
languages.aa=\u0ead\u0eb2\u0e9f\u0eb2
languages.so=\u0ec2\u0e8a\u0ea1\u0eb2\u0eaa\u0eb4
languages.sn=\u0ec2\u0e8a\u0e99\u0eb2
-languages.mi=\u0ec0\u0ea1\u0ebb\u0eb2\u0ea5\u0eb5
languages.gd=\u0eaa\u0eb0\u0e81\u0eb1\u0ead\u0e94\u0ec0\u0e84\u0eb5\u0e94
+languages.mi=\u0ec0\u0ea1\u0ebb\u0eb2\u0ea5\u0eb5
languages.sm=\u0e8a\u0eb2\u0ea1\u0ebb\u0ea7
languages.sl=\u0eaa\u0eb0\u0ec2\u0ea5\u0ea7\u0eb2\u0ec0\u0e99\u0e8d
languages.mg=\u0ea1\u0eb2\u0ea5\u0eb2\u0e81\u0eb2\u0e8a\u0eb4
@@ -340,14 +341,14 @@ languages.fy=\u0e9f\u0eb4\u0e99\u0ec1\u0ea5\u0e99
languages.sa=\u0eaa\u0eb1\u0e99\u0eaa\u0eb0\u0e81\u0eb4\u0e94
languages.fr=\u0e9d\u0eb1\u0ec8\u0ea5\u0e87\u0ec0\u0eaa\u0e94
languages.lv=\u0ec1\u0ea5\u0e95\u0eb0\u0ec0\u0ea7\u0e8d(\u0ec0\u0ea5\u0e94\u0e97\u0eb0\u0ea7\u0eb4\u0e94)
-languages.lt=\u0ea5\u0eb4\u0e97\u0ebb\u0ea7\u0ec0\u0e99\u0e8d
languages.fo=\u0e9f\u0eb2\u0ec2\u0ea5\u0e94
+languages.lt=\u0ea5\u0eb4\u0e97\u0ebb\u0ea7\u0ec0\u0e99\u0e8d
languages.rw=\u0e84\u0eb4\u0e99\u0e8d\u0eb2\u0ea7\u0eb1\u0e99\u0e94\u0eb2
languages.ru=\u0ea5\u0eb1\u0e94\u0ec0\u0e8a\u0e8d
-languages.lo=\u0ea5\u0eb2\u0ea7
languages.fj=\u0e9f\u0eb4\u0e88\u0eb4
-languages.ln=\u0ea5\u0eb4\u0e87\u0e81\u0eb2\u0ea5\u0eb2
+languages.lo=\u0ea5\u0eb2\u0ea7
languages.fi=\u0e9f\u0eb4\u0e99
+languages.ln=\u0ea5\u0eb4\u0e87\u0e81\u0eb2\u0ea5\u0eb2
languages.ro=\u0ec2\u0ea5\u0ea1\u0eb1\u0e99
languages.rn=\u0e84\u0eb4\u0ea5\u0eb1\u0e99\u0eaa\u0eb5
languages.rm=\u0ec0\u0ea5\u0ec2\u0e95-\u0ec2\u0ea5\u0ec1\u0ea1\u0e99
@@ -355,5 +356,5 @@ languages.fa=\u0ec0\u0e9b\u0eb5\u0ec0\u0e8a\u0e8d
languages.la=\u0ea5\u0eb2\u0e95\u0eb4\u0e99
languages.xh=\u0ec2\u0e8a\u0eaa\u0eb2
languages.eu=\u0ec1\u0e9a\u0eaa
-languages.ky=\u0ec0\u0e84\u0ea7\u0e81\u0eb4\u0e94
languages.et=\u0ec0\u0ead\u0eaa\u0ec2\u0e95\u0ec0\u0e99\u0e8d
+languages.ky=\u0ec0\u0e84\u0ea7\u0e81\u0eb4\u0e94
diff --git a/resource/gnu/java/locale/LocaleInformation_lo_LA.properties b/resource/gnu/java/locale/LocaleInformation_lo_LA.properties
index 8931e5c2b..8e0b68400 100644
--- a/resource/gnu/java/locale/LocaleInformation_lo_LA.properties
+++ b/resource/gnu/java/locale/LocaleInformation_lo_LA.properties
@@ -5,5 +5,4 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=#,##0%
currencyFormat=\u00a4#,##0.00;\u00a4-#,##0.00
diff --git a/resource/gnu/java/locale/LocaleInformation_lt.properties b/resource/gnu/java/locale/LocaleInformation_lt.properties
index af0f5d0ee..5eea5f1c5 100644
--- a/resource/gnu/java/locale/LocaleInformation_lt.properties
+++ b/resource/gnu/java/locale/LocaleInformation_lt.properties
@@ -8,41 +8,50 @@
decimalSeparator=,
groupingSeparator=.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.LTL=LTL
+currenciesDisplayName.INR=Indijos rupija
+currenciesDisplayName.RUB=Rusijos rublis
+currenciesDisplayName.JPY=Jena
+currenciesDisplayName.BRL=Brazilijos realas
+currenciesDisplayName.CNY=\u017denminbi juanis
+currenciesDisplayName.USD=JAV doleris
+currenciesDisplayName.EUR=Euras
+currenciesDisplayName.LTL=Litas
+currenciesDisplayName.GBP=Svaras sterling\u0173
currenciesSymbol.LTL=Lt
-shortMonths=Sau®Vas®Kov®Bal®Geg®Bir®Lie®Rgp®Rgs®Spa®Lap®Grd®®
-months=Sausio®Vasario®Kovo®Baland\u017eio®Gegu\u017e\u0117s®Bir\u017eelio®Liepos®Rugpj\u016b\u010dio®Rugs\u0117jo®Spalio®Lapkri\u010dio®Gruod\u017eio®®
+shortMonths=Sau®Vas®Kov®Bal®Geg®Bir®Lie®Rgp®Rgs®Spl®Lap®Grd®®
+months=Sausis®Vasaris®Kovas®Balandis®Gegu\u017e\u0117®Bir\u017eelis®Liepa®Rugpj\u016btis®Rugs\u0117jis®Spalis®Lapkritis®Gruodis®®
shortWeekdays=®Sk®Pr®An®Tr®Kt®Pn®\u0160t®
-weekdays=®Sekmadienis®Pirmadienis®Antradienis®Tre\u010diadienis®Ketvirtadienis®Penktadienis®\u0160e\u0161tadienis®
+weekdays=®sekmadienis®pirmadienis®antradienis®tre\u010diadienis®ketvirtadienis®penktadienis®\u0161e\u0161tadienis®
minNumberOfDaysInFirstWeek=4
firstDayOfWeek=mon
-eras=pr.Kr.®po.Kr.®
-shortDateFormat=yyyy.MM.dd
+eras=pr. Kr.®po Kr.®
+ampms=prie\u0161piet®popiet®
+shortDateFormat=yyyy-MM-dd
mediumDateFormat=yyyy.MM.dd
longDateFormat=yyyy 'm.' MMMM d 'd.'
fullDateFormat=yyyy 'm.' MMMM d 'd.',EEEE
territories.TL=Ryt\u0173 Timoras
territories.TK=Tokelau
-territories.TJ=Tad\u017eikija
+territories.TJ=Tad\u017eikistas
territories.TH=Tailandas
territories.TG=Togas
-territories.TF=Pranc\u016bz\u0173 pietin\u0117s teritorijos
-territories.GY=Gviana
+territories.TF=Pranc\u016bzijos Piet\u0173 sritys
+territories.GY=Gajana
territories.TD=\u010cadas
-territories.TC=Turks ir Kaikos salos
-territories.GW=Gvin\u0117ja-Bisau
+territories.TC=Turkso ir Caicoso salos
+territories.GW=Bisau Gvin\u0117ja
territories.GU=Guamas
territories.GT=Gvatemala
-territories.GS=Ryt\u0173 D\u017eord\u017eija ir Ryt\u0173 Sandwich salos
+territories.GS=Piet\u0173 Georgijos ir Piet\u0173 Sandwicho Salos
territories.GR=Graikija
-territories.GQ=Ekvatorin\u0117 Gvin\u0117ja
+territories.GQ=Pusiaujo Gvin\u0117ja
territories.GP=Gvadelup\u0117
territories.SZ=Svazilendas
territories.SY=Sirija
territories.GN=Gvin\u0117ja
territories.GM=Gambija
territories.GL=Grenlandija
-territories.SV=El Salvadoras
+territories.SV=Salvadoras
territories.ST=San Tom\u0117 ir Princip\u0117
territories.GI=Gibraltaras
territories.GH=Gana
@@ -59,7 +68,7 @@ territories.GA=Gabonas
territories.SK=Slovakia
territories.SJ=Svalbardo ir Jan Majen salos
territories.SI=Slov\u0117nija
-territories.SH=\u0160ventoji Elena
+territories.SH=\u0160v. Elenos sala
territories.SG=Singap\u016bras
territories.SE=\u0160vedija
territories.SD=Sudanas
@@ -68,10 +77,10 @@ territories.SB=Saliamono salos
territories.SA=Saudo Arabija
territories.FR=Pranc\u016bzija
territories.FO=Farer\u0173 salos
-territories.FM=Mikronezijos Federacin\u0117s Valstijos
+territories.FM=Mikronezija
territories.RW=Ruanda
-territories.FK=Folklendo salos (Malvinai)
-territories.RU=Rusijos Federacija
+territories.FK=Falklando salos
+territories.RU=Rusija
territories.FJ=Fid\u017eis
territories.FI=Suomija
territories.RO=Rumunija
@@ -95,32 +104,33 @@ territories.PT=Portugalija
territories.PS=Palestinos teritorija
territories.PR=Puerto Rikas
territories.DE=Vokietija
-territories.PN=Pitkernas
+territories.PN=Pitcairnas
territories.PM=Sen Pjeras ir Mikelonas
territories.PL=Lenkija
territories.PK=Pakistanas
territories.PH=Filipinai
territories.PG=Papua Naujoji Gvin\u0117ja
territories.PF=Pranc\u016bz\u0173 Polinezija
-territories.CZ=\u010cekijos respublika
+territories.CZ=\u010cekija
territories.PE=Peru
territories.CY=Kipras
territories.CX=Kal\u0117d\u0173 sala
-territories.CV=\u017daliojo Ky\u0161ulio salos
+territories.CV=\u017daliasis Ky\u0161ulys
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Serbija ir Juodkalnija
territories.CR=Kosta Rika
territories.CO=Kolumbija
territories.CN=Kinija
territories.CM=Kamer\u016bnas
territories.CL=\u010cil\u0117
territories.CK=Kuko salos
-territories.CI=Kot d\u2019Ivuar
+territories.CI=Dramblio Kaulo Krantas
territories.CH=\u0160veicarija
territories.CG=Kongas
territories.CF=Centrin\u0117s Afrikos Respublika
territories.CD=Kongo Demokratin\u0117 Respublika
-territories.CC=Kokos\u0173 salos
+territories.CC=Kokos\u0173 (Keelingo) salos
territories.OM=Omanas
territories.CA=Kanada
territories.BZ=Belizas
@@ -128,17 +138,17 @@ territories.BY=Baltarusija
territories.BW=Botsvana
territories.BV=Bouvet sala
territories.BT=Butanas
-territories.BS=Bahamai
+territories.BS=Bahamos
territories.BR=Brazilija
territories.NZ=Naujoji Zelandija
territories.BO=Bolivija
territories.BN=Brun\u0117jus
-territories.BM=Bermudai
-territories.NU=Niuj\u0117
+territories.BM=Bermuda
+territories.NU=Niue
territories.BJ=Beninas
territories.BI=Burundis
territories.BH=Bahreinas
-territories.NR=Nauru
+territories.NR=Nauru Respublika
territories.BG=Bulgarija
territories.BF=Burkina Fasas
territories.NP=Nepalas
@@ -162,11 +172,12 @@ territories.AU=Australija
territories.AT=Austrija
territories.AS=Amerikos Samoa
territories.AR=Argentina
-territories.AQ=Antarktika
+territories.AQ=Antarktis
territories.MZ=Mozambikas
+territories.200=Serbija ir Juodkalnija
territories.AO=Angola
territories.MY=Malaizija
-territories.AN=Nyderland\u0173 Antilai
+territories.AN=Olandijos Antilai
territories.MX=Meksika
territories.AM=Arm\u0117nija
territories.MW=Malavis
@@ -175,29 +186,28 @@ territories.MV=Maldivai
territories.ZA=Piet\u0173 Afrika
territories.MU=Mauricijus
territories.MT=Malta
-territories.AI=Angvila
-territories.MS=Montserat
+territories.AI=Angilija
+territories.MS=Montserratas
territories.MR=Mauritanija
territories.AG=Antigva ir Barbuda
territories.MQ=Martinika
territories.AF=Afganistanas
-territories.MP=\u0160iaurin\u0117s Marianos salos
territories.AE=Jungtiniai Arab\u0173 Emyratai
-territories.MO=Kinijos S.A.R. Makao
+territories.MP=Marianos \u0161iaurin\u0117s salos
territories.AD=Andora
+territories.MO=Kinijos S.A.R. Makao
territories.MN=Mongolija
-territories.MM=Mjanma
+territories.MM=Mianmaras
territories.ML=Malis
-territories.MK=Makedonijos Respublika
-territories.YU=Jugoslavija
-territories.YT=Majot\u0117
-territories.MH=Mar\u0161alo salos
+territories.MK=Makedonija
+territories.YT=Mayotte\u2019as
+territories.MH=Mar\u0161alo Salos
territories.MG=Madagaskaras
-territories.MD=Moldovos Respublika
+territories.MD=Moldova
territories.MC=Monakas
territories.MA=Marokas
territories.YE=Jemenas
-territories.LY=Libijos Arab\u0173 D\u017eamahirija
+territories.LY=Libija
territories.LV=Latvija
territories.LU=Liuksemburgas
territories.LT=Lietuva
@@ -205,9 +215,9 @@ territories.LS=Lesotas
territories.LR=Liberija
territories.LK=\u0160ri Lanka
territories.LI=Lichten\u0161teinas
-territories.LC=\u0160ventoji Liucija
+territories.LC=Sent Lusija
territories.LB=Libanas
-territories.LA=Laoso Liaudies Demokratin\u0117 Respublika
+territories.LA=Laosas
territories.KZ=Kazachstanas
territories.KY=Kaiman\u0173 salos
territories.KW=Kuveitas
@@ -220,30 +230,30 @@ territories.WS=Samoa
territories.KH=Kambod\u017ea
territories.KG=Kirgiztanas
territories.KE=Kenija
-territories.WF=Valiso ir Futuna salos
+territories.WF=Wallisas ir Futuna
territories.JP=Japonija
territories.JO=Jordanija
territories.JM=Jamaika
territories.VU=Vanuatu
territories.VN=Vietnamas
-territories.VI=JAV Virginijos salos
-territories.VG=Brit\u0173 Virginijos salos
+territories.VI=Mergeli\u0173 salos (JAV)
+territories.VG=Did\u017eiosios Britanijos Mergeli\u0173 salos
territories.VE=Venesuela
territories.VC=\u0160ventasis Vincentas ir Grenadinai
-territories.VA=Vatikano Miesto Valstija
+territories.VA=Vatikanas
territories.IT=Italija
territories.IS=Islandija
-territories.IR=Irano
+territories.IR=Iranas
territories.IQ=Irakas
-territories.UZ=Uzbekija
-territories.IO=Brit\u0173 Indijos vandenyno teritorija
+territories.UZ=Uzbekistanas
+territories.IO=Indijos vandenyno brit\u0173 sritis
territories.UY=Urugvajus
territories.IN=Indija
territories.IL=Izraelis
-territories.US=United States
+territories.US=Jungtin\u0117s Valstijos US
territories.IE=Airija
territories.ID=Indonezija
-territories.UM=JAV antraeil\u0117s teritorijos salos
+territories.UM=Jungtini\u0173 Valstij\u0173 ma\u017eosios aplinkin\u0117s salos
territories.UG=Uganda
territories.UA=Ukraina
territories.HU=Vengrija
@@ -251,8 +261,8 @@ territories.HT=Haitis
territories.HR=Kroatija
territories.TZ=Tanzanija
territories.HN=Hond\u016bras
-territories.HM=Heard ir McDonald salos
-territories.TW=Taivanis
+territories.HM=Heardo salos
+territories.TW=Taivanas
territories.TV=Tuvalu
territories.HK=Kinijos S.A.R.Honkongas
territories.TT=Trinidadas ir Tobagas
@@ -268,9 +278,10 @@ languages.no=Norveg\u0173
languages.el=Graik\u0173
languages.nl=Oland\u0173
languages.bg=Bulgar\u0173
+languages.hi=Hindi
languages.lv=Latvi\u0173
+languages.cs=\u010cek\u0173
languages.he=Hebraj\u0173
-languages.cs=\u010cekijos
languages.it=Ital\u0173
languages.lt=Lietuvi\u0173
languages.fr=Pranc\u016bz\u0173
@@ -285,8 +296,8 @@ languages.pl=Lenk\u0173
languages.sl=Slov\u0117n\u0173
languages.sk=Slovak\u0173
languages.de=Vokie\u010di\u0173
-languages.hu=Vengr\u0173
languages.et=Est\u0173
+languages.hu=Vengr\u0173
languages.es=Ispan\u0173
-languages.hr=Kroat\u0173
languages.da=Dan\u0173
+languages.hr=Kroat\u0173
diff --git a/resource/gnu/java/locale/LocaleInformation_lt_LT.properties b/resource/gnu/java/locale/LocaleInformation_lt_LT.properties
index 1ec73e9de..a7f543a0c 100644
--- a/resource/gnu/java/locale/LocaleInformation_lt_LT.properties
+++ b/resource/gnu/java/locale/LocaleInformation_lt_LT.properties
@@ -5,5 +5,4 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=#,##%
currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
diff --git a/resource/gnu/java/locale/LocaleInformation_lv.properties b/resource/gnu/java/locale/LocaleInformation_lv.properties
index 894bea25e..d032ba0e3 100644
--- a/resource/gnu/java/locale/LocaleInformation_lv.properties
+++ b/resource/gnu/java/locale/LocaleInformation_lv.properties
@@ -8,7 +8,6 @@
decimalSeparator=,
groupingSeparator=\u00a0
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.LVL=LVL
currenciesSymbol.LVL=Ls
shortMonths=Jan®Feb®Mar®Apr®Mai®J\u016bn®J\u016bl®Aug®Sep®Okt®Nov®Dec®®
months=janv\u0101ris®febru\u0101ris®marts®apr\u012blis®maijs®j\u016bnijs®j\u016blijs®augusts®septembris®oktobris®novembris®decembris®®
@@ -108,6 +107,7 @@ territories.CX=Ziemsv\u0113tku sala
territories.CV=Kaboverde
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Serbija un Melnkalne
territories.CR=Kostarika
territories.CO=Kolumbija
territories.CN=\u0136\u012bna
@@ -178,17 +178,16 @@ territories.AI=Angilja
territories.MS=Montserrata
territories.MR=Maurit\u0101nija
territories.AG=Antigva un Barbuda
-territories.MQ=Martinika
territories.AF=Afganist\u0101na
-territories.MP=Zieme\u013cu Marianas
+territories.MQ=Martinika
territories.AE=Apvienotie Ar\u0101bu Emir\u0101ti
-territories.MO=Makao, \u0136\u012bnas \u012bpa\u0161\u0101s p\u0101rvaldes apgabals
+territories.MP=Zieme\u013cu Marianas
territories.AD=Andora
+territories.MO=Makao, \u0136\u012bnas \u012bpa\u0161\u0101s p\u0101rvaldes apgabals
territories.MN=Mongolija
territories.MM=Mjanma
territories.ML=Mali
territories.MK=Ma\u0137edonija
-territories.YU=Dienvidsl\u0101vija
territories.YT=Majota
territories.MH=M\u0101r\u0161ala salas
territories.MG=Madagaskara
@@ -268,8 +267,8 @@ languages.el=grie\u0137u
languages.nl=holandie\u0161u
languages.bg=bulg\u0101ru
languages.lv=latvie\u0161u
-languages.he=ivrits
languages.cs=\u010dehu
+languages.he=ivrits
languages.it=it\u0101lie\u0161u
languages.lt=lietuvie\u0161u
languages.fr=fran\u010du
@@ -284,8 +283,8 @@ languages.pl=po\u013cu
languages.sl=slov\u0113\u0146u
languages.sk=slov\u0101ku
languages.de=v\u0101cu
-languages.hu=ung\u0101ru
languages.et=igau\u0146u
+languages.hu=ung\u0101ru
languages.es=sp\u0101\u0146u
-languages.hr=horv\u0101tu
languages.da=d\u0101\u0146u
+languages.hr=horv\u0101tu
diff --git a/resource/gnu/java/locale/LocaleInformation_mk.properties b/resource/gnu/java/locale/LocaleInformation_mk.properties
index 3dc1cc74e..ea30eeeb9 100644
--- a/resource/gnu/java/locale/LocaleInformation_mk.properties
+++ b/resource/gnu/java/locale/LocaleInformation_mk.properties
@@ -9,481 +9,267 @@ decimalSeparator=,
groupingSeparator=.
localPatternChars=GuMtkHmsSEDFwWahKzUeygAZ
currenciesDisplayName.YDD=\u0408\u0435\u043c\u0435\u043d\u0441\u043a\u0438 \u0434\u0438\u0430\u043d\u0440
-currenciesDisplayName.GRN=\u0413\u0440\u0447\u043a\u0430 \u0434\u0440\u0430\u0445\u043c\u0430
-currenciesDisplayName.KES=\u041a\u0435\u043d\u0438\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.TWD=\u0422\u0430\u0458\u0432\u0430\u043d\u0441\u043a\u0438 \u043d\u043e\u0432 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.LKR=\u0428\u0440\u0438\u043b\u0430\u043d\u043a\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u0458\u0430
+currenciesDisplayName.KES=\u041a\u0435\u043d\u0438\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.BYB=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u0440\u0443\u0431\u0459\u0430 (1994-1999)
-currenciesDisplayName.TJS=\u0422\u0430\u045f\u0438\u043a\u0438\u0441\u0442\u0430\u043d\u0442\u0441\u043a\u0438 \u0441\u043e\u043c\u043e\u043d\u0438
+currenciesDisplayName.LKR=\u0428\u0440\u0438\u043b\u0430\u043d\u043a\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u0458\u0430
currenciesDisplayName.RWF=\u0420\u0443\u0430\u043d\u0434\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.TJR=\u0442\u0430\u045f\u0438\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u0431\u0459\u0430
+currenciesDisplayName.TJS=\u0422\u0430\u045f\u0438\u043a\u0438\u0441\u0442\u0430\u043d\u0442\u0441\u043a\u0438 \u0441\u043e\u043c\u043e\u043d\u0438
currenciesDisplayName.SDP=\u0421\u0443\u0434\u0430\u043d\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.GRD=\u0413\u0440\u0447\u043a\u0430 \u0434\u0440\u0430\u0445\u043c\u0430
+currenciesDisplayName.TJR=\u0442\u0430\u045f\u0438\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u0431\u0459\u0430
currenciesDisplayName.AFN=\u0410\u0432\u0433\u0430\u043d\u0438
+currenciesDisplayName.GRD=\u0413\u0440\u0447\u043a\u0430 \u0434\u0440\u0430\u0445\u043c\u0430
currenciesDisplayName.IEP=\u0418\u0440\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
currenciesDisplayName.ARS=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0441\u043a\u0438 \u041f\u0435\u0437\u043e\u0441
-currenciesDisplayName.ARP=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0441\u043a\u0438 \u041f\u0435\u0437\u043e\u0441 (1983-1985)
currenciesDisplayName.SDD=\u0421\u0443\u0434\u0430\u043d\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.ARP=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0441\u043a\u0438 \u041f\u0435\u0437\u043e\u0441 (1983-1985)
currenciesDisplayName.GEL=\u0413\u0440\u0443\u0437\u0438\u0441\u043a\u0438 \u043b\u0430\u0440\u0438
currenciesDisplayName.AFA=\u0410\u0432\u0433\u0430\u043d\u0438 (1927-2002)
currenciesDisplayName.CRC=\u041a\u043e\u0441\u0442\u0430\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u041a\u043e\u043b\u043e\u043d
currenciesDisplayName.FKP=\u0424\u0430\u043a\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.TVD=\u0422\u0443\u0432\u0430\u043b\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.MDL=\u041c\u043e\u043b\u0434\u0430\u0432\u0441\u043a\u0438 \u043b\u0435\u0443
currenciesDisplayName.HKD=\u0425\u043e\u043d\u0433\u043a\u043e\u0448\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.MDL=\u041c\u043e\u043b\u0434\u0430\u0432\u0441\u043a\u0438 \u043b\u0435\u0443
currenciesDisplayName.IQD=\u0418\u0440\u0430\u0447\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.SCR=\u0421\u0435\u0458\u0448\u0435\u043b\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u0458\u0430
-currenciesDisplayName.XID=\u0418\u0441\u043b\u0430\u043c\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.VUV=\u0412\u0430\u043d\u0430\u0442\u0441\u043a\u0438 \u0432\u0430\u0442\u0443
currenciesDisplayName.KPW=\u0421\u0435\u0432\u0435\u0440\u043d\u043e \u043a\u043e\u0440\u0435\u0458\u0441\u043a\u0438 \u0432\u043e\u043d
-currenciesDisplayName.SOS=\u0421\u043e\u043c\u0430\u043b\u0438\u0458\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.LVR=\u041b\u0430\u0442\u0432\u0438\u0458\u0441\u043a\u0430 \u0440\u0443\u0431\u0459\u0430
+currenciesDisplayName.SOS=\u0421\u043e\u043c\u0430\u043b\u0438\u0458\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.AED=\u0414\u0438\u0440\u0445\u0430\u043c
-currenciesDisplayName.LVL=\u041b\u0430\u0442\u0432\u0438\u0458\u0441\u043a\u0438 \u043b\u0430\u0442
currenciesDisplayName.BWP=\u0411\u043e\u0446\u0432\u0430\u043d\u0442\u0441\u043a\u0430 \u041f\u0443\u043b\u0430
+currenciesDisplayName.LVL=\u041b\u0430\u0442\u0432\u0438\u0458\u0441\u043a\u0438 \u043b\u0430\u0442
currenciesDisplayName.RUR=\u0420\u0443\u0441\u043a\u0430 \u0440\u0443\u0431\u0459\u0430 (1991-1998)
-currenciesDisplayName.FJP=\u0424\u0438\u045f\u0438 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.NIG=\u041d\u0438\u043a\u0430\u0440\u0430\u0433\u0432\u0430\u043d\u0441\u043a\u0430 \u0437\u043b\u0430\u0442\u043d\u0430 \u043a\u043e\u0440\u0434\u043e\u0431\u0430
-currenciesDisplayName.MOP=\u041c\u0430\u043a\u0430\u043e \u043f\u0430\u0442\u0430\u043a\u0430
-currenciesDisplayName.FJD=\u0424\u0438\u045f\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.ADP=\u0410\u043d\u0434\u043e\u0440\u0441\u043a\u0430 \u041f\u0435\u0437\u0435\u0442\u0430
+currenciesDisplayName.FJD=\u0424\u0438\u045f\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.MOP=\u041c\u0430\u043a\u0430\u043e \u043f\u0430\u0442\u0430\u043a\u0430
currenciesDisplayName.RUB=\u0420\u0443\u0441\u043a\u0430 \u0440\u0443\u0431\u0459\u0430
currenciesDisplayName.NIC=\u041d\u0438\u043a\u0430\u0440\u0430\u0433\u0432\u0430\u043d\u0441\u043a\u0430 \u043a\u043e\u0440\u0434\u043e\u0431\u0430
-currenciesDisplayName.LIF=\u041b\u0438\u0445\u043d\u0442\u0435\u043d\u0448\u0442\u0430\u0458\u043d\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.UZS=\u0423\u0417\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0421\u0443\u043c
currenciesDisplayName.SBD=\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.ADD=\u0410\u043d\u0434\u043e\u0440\u0441\u043a\u0438 \u0414\u0438\u043d\u0435\u0440
-currenciesDisplayName.THB=\u0422\u0430\u0438 \u0431\u0430\u0442
+currenciesDisplayName.UZS=\u0423\u0417\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0421\u0443\u043c
currenciesDisplayName.PHP=\u0424\u0438\u043b\u0438\u043f\u0438\u043d\u0441\u043a\u0438 \u043f\u0435\u0437\u043e\u0441
+currenciesDisplayName.THB=\u0422\u0430\u0438 \u0431\u0430\u0442
currenciesDisplayName.LUF=\u041b\u0443\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0448\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.FIN=\u0424\u0438\u043d\u0441\u043a\u0430 \u041c\u0430\u0440\u043a\u0430 (1860-1962)
currenciesDisplayName.FIM=\u0424\u0438\u043d\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.SZL=\u0421\u0432\u0430\u0437\u0438\u043b\u0435\u043d\u0434\u0441\u043a\u0438 \u043b\u0438\u043b\u0430\u0433\u0435\u043d
currenciesDisplayName.MNT=\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u0441\u043a\u0438 \u0442\u0443\u0433\u0440\u0438\u043a
currenciesDisplayName.SAR=\u0421\u0430\u0443\u0434\u0438\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.UAH=\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0430 \u0445\u0440\u0438\u0432\u043d\u0438\u0458\u0430
currenciesDisplayName.HUF=\u0423\u043d\u0433\u0430\u0440\u0441\u043a\u0430 \u0444\u043e\u0440\u0438\u043d\u0442\u0430
-currenciesDisplayName.IBP=\u0421\u0435\u0432\u0435\u0440\u043d\u043e\u0438\u0440\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.QAR=\u041a\u0432\u0430\u0442\u0430\u0440\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.COP=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u0441\u043a\u0438 \u041f\u0435\u0437\u043e\u0441
+currenciesDisplayName.QAR=\u041a\u0432\u0430\u0442\u0430\u0440\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.LTT=\u041b\u0438\u0442\u0432\u0430\u043d\u0438\u0441\u043a\u0438 \u043b\u0438\u0442\u0430\u0437
currenciesDisplayName.PTE=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u043e \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.PTC=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u043e \u043a\u043e\u043d\u0442\u043e
-currenciesDisplayName.AOS=\u0410\u043d\u0433\u043e\u043b\u0441\u043a\u043e \u0435\u0441\u043a\u0443\u0434\u043e
currenciesDisplayName.GBP=\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0430 \u0424\u0443\u043d\u0442\u0430
-currenciesDisplayName.BUR=\u0411\u0443\u0440\u043c\u0435\u0437\u0438\u0441\u043a\u0438 \u0440\u0443\u043f\u0438\u0438
-currenciesDisplayName.ZRZ=\u0417\u0438\u0440\u0441\u043a\u043e \u0437\u0430\u0438\u0440\u0435
-currenciesDisplayName.INR=\u0418\u043d\u0434\u0438\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u0458\u0430
currenciesDisplayName.BIF=\u0411\u0443\u0440\u0438\u043d\u0434\u0438\u0441\u043a\u0438 \u0424\u0440\u0430\u043d\u043a
-currenciesDisplayName.LTL=\u041b\u0438\u0442\u0432\u0430\u043d\u0438\u0441\u043a\u0430 \u043b\u0438\u0442\u0430
+currenciesDisplayName.INR=\u0418\u043d\u0434\u0438\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u0458\u0430
+currenciesDisplayName.ZRZ=\u0417\u0438\u0440\u0441\u043a\u043e \u0437\u0430\u0438\u0440\u0435
currenciesDisplayName.AON=\u0410\u043d\u0433\u043e\u043b\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u041a\u0432\u0430\u043d\u0437\u0430 (1990-2000)
-currenciesDisplayName.UYP=\u0423\u0440\u0443\u0433\u0432\u0430\u0458\u0441\u043a\u043e \u043f\u0435\u0441\u043e (1975-1993)
-currenciesDisplayName.SML=\u0421\u0430\u043d\u043c\u0430\u0440\u0438\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
-currenciesDisplayName.MZM=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u0441\u043a\u0438 \u043c\u0435\u0442\u0438\u043a\u0430\u043b
+currenciesDisplayName.LTL=\u041b\u0438\u0442\u0432\u0430\u043d\u0438\u0441\u043a\u0430 \u043b\u0438\u0442\u0430
currenciesDisplayName.KZT=\u041a\u0430\u0437\u0430\u043a\u0441\u0442\u0430\u043d\u0442\u0441\u043a\u0430 \u0442\u0435\u043d\u0433\u0430
-currenciesDisplayName.KZR=\u041a\u0430\u0437\u0430\u043a\u0441\u0442\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u0431\u0459\u0430
+currenciesDisplayName.MZM=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u0441\u043a\u0438 \u043c\u0435\u0442\u0438\u043a\u0430\u043b
+currenciesDisplayName.UYP=\u0423\u0440\u0443\u0433\u0432\u0430\u0458\u0441\u043a\u043e \u043f\u0435\u0441\u043e (1975-1993)
currenciesDisplayName.AOK=\u0410\u043d\u0433\u043e\u043b\u0441\u043a\u0430 \u041a\u0432\u0430\u043d\u0437\u0430 (1977-1990)
currenciesDisplayName.PGK=\u041f\u0430\u043f\u0443\u0430 \u043d\u043e\u0432\u043e\u0433\u0432\u0438\u043d\u0435\u0458\u0441\u043a\u0438\u0430 \u043a\u0438\u043d\u0430
currenciesDisplayName.SYP=\u0421\u0438\u0440\u0438\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.OMR=\u041e\u043c\u0430\u043d\u0441\u043a\u0438 \u0420\u0438\u0430\u043b
-currenciesDisplayName.NGP=\u041d\u0438\u0433\u0435\u0440\u0438\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
currenciesDisplayName.MZE=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u0441\u043a\u043e \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.ZRN=\u0417\u0430\u0438\u0440\u0441\u043a\u043e \u043d\u043e\u0432\u043e\u0437\u0430\u0438\u0440\u0435
+currenciesDisplayName.OMR=\u041e\u043c\u0430\u043d\u0441\u043a\u0438 \u0420\u0438\u0430\u043b
currenciesDisplayName.NGN=\u041d\u0438\u0433\u0435\u0440\u0438\u0441\u043a\u0430 \u043d\u0430\u0438\u0440\u0430
-currenciesDisplayName.PSP=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
+currenciesDisplayName.ZRN=\u0417\u0430\u0438\u0440\u0441\u043a\u043e \u043d\u043e\u0432\u043e\u0437\u0430\u0438\u0440\u0435
currenciesDisplayName.AOA=\u0410\u043d\u0433\u043e\u043b\u0441\u043a\u0430 \u041a\u0432\u0430\u043d\u0437\u0430
-currenciesDisplayName.GNI=\u0413\u0432\u0438\u043d\u0435\u0458\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a (1960-1972)
currenciesDisplayName.MAF=\u041c\u0430\u0440\u043a\u043e\u043d\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.GNF=\u0413\u0432\u0438\u043d\u0435\u0458\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.MAD=\u041c\u0430\u0440\u043e\u043a\u0430\u043d\u0441\u043a\u0438 \u0414\u0438\u0440\u0445\u0430\u043c
currenciesDisplayName.HTG=\u0425\u0430\u0438\u0442\u0441\u043a\u0438 \u0433\u0443\u0440\u0434
+currenciesDisplayName.MAD=\u041c\u0430\u0440\u043e\u043a\u0430\u043d\u0441\u043a\u0438 \u0414\u0438\u0440\u0445\u0430\u043c
currenciesDisplayName.MYR=\u041c\u0430\u043b\u0430\u0437\u0438\u0441\u043a\u0438 \u0440\u0438\u043d\u0433\u0438\u0442
-currenciesDisplayName.BTR=\u0411\u0443\u0442\u0430\u043d\u0441\u043a\u0438 \u0420\u0443\u043f\u0438\u0438
currenciesDisplayName.LSL=\u041b\u0435\u0441\u043e\u0442\u0441\u043a\u043e \u043b\u043e\u0442\u0438
-currenciesDisplayName.SLL=\u0421\u0438\u0435\u0440\u0430\u043b\u0435\u043e\u043d\u0441\u043a\u043e \u043b\u0435\u043e\u043d\u0435
currenciesDisplayName.BHD=\u0411\u0430\u0445\u0440\u0430\u0438\u043d\u0441\u043a\u0438 \u0414\u0438\u043d\u0430\u0440
+currenciesDisplayName.SLL=\u0421\u0438\u0435\u0440\u0430\u043b\u0435\u043e\u043d\u0441\u043a\u043e \u043b\u0435\u043e\u043d\u0435
currenciesDisplayName.TRL=\u0422\u0443\u0440\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.KMF=\u041a\u043e\u043c\u043e\u0440\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.GAF=\u0413\u0430\u0431\u043e\u043d CFA \u0424\u0440\u0430\u043d\u043a
currenciesDisplayName.CZK=\u0427\u0435\u0448\u043a\u0430 \u043a\u043e\u0440\u043e\u043d\u0430
-currenciesDisplayName.GMP=\u0413\u0430\u043c\u0431\u0438\u0441\u043a\u0430 \u0424\u0443\u043d\u0442\u0430
currenciesDisplayName.GMD=\u0413\u0430\u043c\u0431\u0438\u0441\u043a\u0438 \u0414\u0430\u043b\u0430\u0441\u0438
-currenciesDisplayName.BGO=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0438 \u043b\u0435\u0432(1879-1952)
currenciesDisplayName.BGN=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0438 \u043d\u043e\u0432 \u043b\u0435\u0432
currenciesDisplayName.CAD=\u041a\u0430\u043d\u0430\u0434\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
-currenciesDisplayName.BGM=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0438 \u0441\u043e\u0446\u0438\u0458\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043a\u0438 \u043b\u0435\u0432
currenciesDisplayName.BGL=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0438 \u0446\u0432\u0440\u0441\u0442 \u043b\u0435\u0432
currenciesDisplayName.VEB=\u0412\u0435\u043d\u0435\u0446\u0443\u0435\u043b\u0441\u043a\u0438 \u0431\u043e\u043b\u0438\u0432\u0430\u0440
currenciesDisplayName.MLF=\u041c\u0430\u043b\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.MXP=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u0441\u0440\u0435\u0431\u0440\u0435\u043d \u043f\u0435\u0437\u043e\u0441 (1861-1992)
currenciesDisplayName.ILS=\u0418\u0437\u0440\u0430\u0435\u043b\u0441\u043a\u0438 \u043d\u043e\u0432 \u0448\u0435\u043a\u0435\u043b
+currenciesDisplayName.MXP=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u0441\u0440\u0435\u0431\u0440\u0435\u043d \u043f\u0435\u0437\u043e\u0441 (1861-1992)
currenciesDisplayName.PES=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u043a\u0438 \u0441\u043e\u043b
-currenciesDisplayName.BSP=\u0411\u0430\u0445\u0430\u043c\u0441\u043a\u0430 \u0424\u0443\u043d\u0442\u0430
-currenciesDisplayName.MXN=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u043f\u0435\u0437\u043e\u0441
currenciesDisplayName.GYD=\u0413\u0432\u0438\u0458\u0430\u043d\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
+currenciesDisplayName.MXN=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u043f\u0435\u0437\u043e\u0441
currenciesDisplayName.ILP=\u0418\u0437\u0440\u0435\u043b\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.CYP=\u041a\u0438\u043f\u0430\u0440\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
currenciesDisplayName.SKK=\u0421\u043b\u043e\u0432\u0430\u0447\u043a\u0430 \u043a\u0440\u0443\u043d\u0430
+currenciesDisplayName.CYP=\u041a\u0438\u043f\u0430\u0440\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
currenciesDisplayName.PEN=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u043a\u0438 \u043d\u043e\u0432 \u0441\u043e\u043b
-currenciesDisplayName.ILL=\u0418\u0437\u0440\u0430\u0435\u043b\u0441\u043a\u0438 \u0448\u0435\u043a\u0435\u043b
currenciesDisplayName.LRD=\u041b\u0438\u0431\u0435\u0440\u0438\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.AMD=\u0415\u0440\u043c\u0435\u043d\u0438\u0441\u043a\u0438 \u0414\u0440\u0430\u043c
currenciesDisplayName.BSD=\u0411\u0430\u0445\u0430\u043c\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
-currenciesDisplayName.GLK=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0441\u043a \u043a\u0440\u0443\u043d\u0430
currenciesDisplayName.HRK=\u0425\u0440\u0432\u0430\u0442\u0441\u043a\u0430 \u041a\u0443\u043d\u0430
-currenciesDisplayName.MKN=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0434\u0435\u043d\u0430\u0440 (1992-1993)
currenciesDisplayName.HRD=\u0425\u0440\u0432\u0430\u0442\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.ALV=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0430 \u041b\u0435\u043a \u0412\u0430\u043b\u0443\u0442\u0430
currenciesDisplayName.FRF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.MWP=\u041c\u0430\u043b\u0430\u0432\u0438\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.TDF=\u2018\u0430\u0434\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.MKD=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0434\u0435\u043d\u0430\u0440
-currenciesDisplayName.TPP=\u0422\u0438\u043c\u043e\u0440\u0441\u043a\u0430 \u043f\u0430\u0442\u0430\u043a\u0430
currenciesDisplayName.ALL=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438 \u041b\u0435\u043a
-currenciesDisplayName.ALK=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438 \u043b\u0435\u043a (1946-1961)
currenciesDisplayName.TPE=\u0422\u0438\u043c\u043e\u0440\u0441\u043a\u0438 \u0435\u0441\u043a\u0443\u0434\u043e
currenciesDisplayName.DEM=\u0413\u0435\u0440\u043c\u0430\u043d\u0441\u043a\u0430 \u041c\u0430\u0440\u043a\u0430
-currenciesDisplayName.XCD=\u0418\u0441\u0442\u043e\u0447\u043d\u043e \u043a\u0430\u0440\u0438\u0431\u0438\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.KWD=\u041a\u0443\u0432\u0430\u0458\u0442\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.XCD=\u0418\u0441\u0442\u043e\u0447\u043d\u043e \u043a\u0430\u0440\u0438\u0431\u0438\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.NPR=\u041d\u0435\u043f\u0430\u043b\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u0458\u0430
currenciesDisplayName.GWP=\u0413\u0432\u0438\u043d\u0435\u0458\u0441\u043a\u0438 \u0411\u0438\u0441\u0430\u0443 \u043f\u0435\u0437\u043e\u0441
currenciesDisplayName.YUN=\u0408\u0443\u0433\u043e\u0441\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0431\u0438\u043b\u0435\u043d \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.SVC=\u0415\u043b\u0441\u0430\u0432\u0430\u0434\u043e\u0440\u0441\u043a\u0438 \u043a\u043e\u043b\u043e\u043d
-currenciesDisplayName.SIT=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438 \u0442\u043e\u043b\u0430\u0440
currenciesDisplayName.BEL=\u0411\u0435\u043b\u0433\u0438\u0441\u043a\u0438 \u0424\u0440\u0430\u043d\u043a (\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0441\u043a\u0438)
+currenciesDisplayName.SIT=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438 \u0442\u043e\u043b\u0430\u0440
currenciesDisplayName.JPY=\u0408\u0430\u043f\u043e\u043d\u0441\u043a\u0438 \u0458\u0435\u043d
currenciesDisplayName.BEF=\u0411\u0435\u043b\u0433\u0438\u0441\u043a\u0438 \u0424\u0440\u0430\u043d\u043a
currenciesDisplayName.YUD=\u0408\u0443\u0433\u043e\u0441\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.BEC=\u0411\u0435\u043b\u0433\u0438\u0441\u043a\u0438 \u0424\u0440\u0430\u043d\u043a (\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0431\u0438\u043b\u0435\u043d)
currenciesDisplayName.SUR=\u0421\u043e\u0432\u0435\u0442\u0441\u043a\u0430 \u0440\u0443\u0431\u0459\u0430
-currenciesDisplayName.RON=\u0420\u043e\u043c\u0430\u043d\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u043b\u0435\u0430
currenciesDisplayName.ROL=\u0420\u043e\u043c\u0430\u043d\u0441\u043a\u0430 \u043b\u0435\u0430
-currenciesDisplayName.SUN=\u0421\u043e\u0432\u0435\u0442\u0441\u043a\u0430 \u043d\u043e\u0432\u0430 \u0440\u0443\u0431\u0459\u0430
-currenciesDisplayName.SIB=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438 \u0442\u043e\u043b\u0430\u0440 \u0431\u043e\u043d
-currenciesDisplayName.VNS=\u0412\u0438\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 \u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0435\u043d \u0434\u043e\u043d\u0433
-currenciesDisplayName.VNR=\u0412\u0438\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 \u0440\u0435\u043f\u0443\u0431\u043b\u0438\u0447\u043a\u0438 \u0434\u043e\u043d\u0433
currenciesDisplayName.NOK=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0430 \u043a\u0440\u0443\u043d\u0430
-currenciesDisplayName.VNN=\u0412\u0438\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 \u043d\u043e\u0432 \u0434\u043e\u043d\u0433
currenciesDisplayName.ZAR=\u0408\u0443\u0436\u043d\u043e \u0430\u0444\u0440\u0438\u0447\u043a\u0438 \u0440\u0430\u043d\u0434
-currenciesDisplayName.ZAP=\u0408\u0443\u0436\u043d\u043e \u0430\u0444\u0440\u0438\u0447\u0430 \u0444\u0443\u043d\u0442\u0430
currenciesDisplayName.ZAL=\u0408\u0443\u0436\u043d\u043e \u0430\u0444\u0440\u0438\u0447\u043a\u0438 \u0440\u0430\u043d\u0434(\u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0441\u043a\u0438)
currenciesDisplayName.VND=\u0412\u0438\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 \u0434\u043e\u043d\u0433
-currenciesDisplayName.KID=\u041a\u0438\u0440\u0431\u0430\u0442\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.TZS=\u0422\u0430\u043d\u0437\u0430\u043d\u0438\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.GIP=\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.ZMP=\u0417\u0430\u043c\u0431\u0438\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
currenciesDisplayName.TND=\u0422\u0443\u043d\u0435\u0437\u0438\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.UGX=\u0423\u0433\u0430\u043d\u0434\u0438\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
currenciesDisplayName.ZMK=\u0417\u0430\u043c\u0431\u0438\u0441\u043a\u0430 \u043a\u0432\u0430\u043d\u0447\u0430
currenciesDisplayName.JOD=\u0408\u043e\u0440\u0434\u0430\u043d\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.LBP=\u041b\u0438\u0431\u0438\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.VAL=\u0412\u0430\u0442\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.UGS=\u0423\u0433\u0430\u043d\u0434\u0438\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433 (1966-1987)
currenciesDisplayName.WST=\u0421\u0430\u043c\u043e\u0430 \u0442\u0430\u043b\u0430
currenciesDisplayName.KHR=\u041a\u0430\u043c\u0431\u043e\u045f\u0438\u0441\u043a\u0438 \u0440\u0435\u043b
currenciesDisplayName.DOP=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u0438 \u041f\u0435\u0437\u043e\u0441
currenciesDisplayName.EUR=\u0415\u0432\u0440\u043e
-currenciesDisplayName.LNR=\u0426\u0435\u0458\u043b\u043e\u043d\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u0458\u0430
-currenciesDisplayName.WSP=\u0421\u0430\u043c\u043e\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.KHO=\u041a\u0430\u043c\u0431\u043e\u045f\u0438\u0441\u043a\u0438 \u0441\u0442\u0430\u0440 \u0440\u0435\u043b
currenciesDisplayName.MTP=\u041c\u0430\u043b\u0442\u0438\u0441\u043a\u0430 \u0444\u0438\u043d\u0442\u0430
currenciesDisplayName.USS=\u0421\u0410\u0414 \u0434\u043e\u043b\u0430\u0440 (Same day)
-currenciesDisplayName.NZP=\u041d\u043e\u0432\u043e\u0437\u0435\u043b\u0430\u043d\u0434\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
currenciesDisplayName.CUP=\u041a\u0443\u0431\u0430\u043d\u0441\u043a\u0438 \u043f\u0435\u0437\u043e\u0441
currenciesDisplayName.MTL=\u041c\u0430\u043b\u0442\u0438\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.TMM=\u0422\u0443\u0440\u043c\u0435\u043d\u0442\u0438\u0441\u0442\u0430\u043d\u0442\u0441\u043a\u0438 \u043c\u0430\u0442\u0430\u0442
currenciesDisplayName.USN=\u0421\u0410\u0414 \u0434\u043e\u043b\u0430\u0440 (Next day)
-currenciesDisplayName.GHP=\u0413\u0430\u043d\u0430\u0458\u0441\u043a\u0438 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.SSP=\u0428\u043a\u043e\u0442\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
-currenciesDisplayName.AUP=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0441\u043a\u0430 \u0424\u0443\u043d\u0442\u0430
-currenciesDisplayName.GHO=\u0413\u0430\u043d\u0430\u0458\u0441\u043a\u0438 \u0441\u0442\u0430\u0440\u0438 \u0421\u0435\u0434\u0438
currenciesDisplayName.SGD=\u0421\u0438\u043d\u0433\u0430\u043f\u0443\u0440\u0441\u043a\u0438 \u0434\u043e\u0430\u043b\u0440
currenciesDisplayName.NZD=\u041d\u043e\u0432\u043e\u0437\u0435\u043b\u0430\u043d\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.USD=\u0421\u0410\u0414 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.HNL=\u0425\u043e\u043d\u0434\u0443\u0440\u0441\u043a\u0430 \u043b\u0435\u043c\u043f\u0438\u0440\u0430
-currenciesDisplayName.ITL=\u0418\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u043a\u0441\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.PAB=\u041f\u0430\u043d\u0430\u043c\u0441\u043a\u0430 \u0431\u0430\u043b\u0431\u043e\u0430
+currenciesDisplayName.ITL=\u0418\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u043a\u0441\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.GTQ=\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0441\u043a\u0438 \u043a\u0432\u0435\u0442\u0446\u0430\u043b
-currenciesDisplayName.AUD=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
-currenciesDisplayName.GHC=\u0413\u0430\u043d\u0430\u0458\u0441\u043a\u0438 \u0421\u0435\u0434\u0438
-currenciesDisplayName.LAK=\u041b\u0430\u043e\u0441\u043a\u0438 \u043a\u0438\u043f
currenciesDisplayName.NAD=\u041d\u0430\u043c\u0438\u0431\u0438\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.LAK=\u041b\u0430\u043e\u0441\u043a\u0438 \u043a\u0438\u043f
+currenciesDisplayName.GHC=\u0413\u0430\u043d\u0430\u0458\u0441\u043a\u0438 \u0421\u0435\u0434\u0438
+currenciesDisplayName.AUD=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
currenciesDisplayName.KGS=\u041a\u0438\u0440\u0433\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0438 \u0441\u043e\u043c
-currenciesDisplayName.BBD=\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
currenciesDisplayName.CHF=\u0428\u0432\u0430\u0458\u0446\u0430\u0440\u0441\u043a\u0438 \u0424\u0440\u0430\u043d\u043a
+currenciesDisplayName.BBD=\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
currenciesDisplayName.PYG=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0458\u0441\u043a\u0430 \u0433\u0443\u0430\u0440\u0430\u043d\u0430
-currenciesDisplayName.JMP=\u0408\u0430\u043c\u0430\u0458\u043a\u0430\u043d\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
currenciesDisplayName.PLZ=\u041f\u043e\u043b\u0441\u043a\u0430 \u0437\u043b\u043e\u0442\u0430 (1950-1995)
currenciesDisplayName.YER=\u0408\u0435\u043c\u0435\u043d\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.ATS=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0441\u043a\u0438 \u0428\u0438\u043b\u0438\u043d\u0433
-currenciesDisplayName.ETD=\u0415\u0442\u0438\u043e\u043f\u0438\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
-currenciesDisplayName.LYP=\u041b\u0438\u0431\u0438\u0458\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
currenciesDisplayName.ETB=\u0415\u0442\u0438\u043e\u043f\u0438\u0441\u043a\u0438 \u0411\u0438\u0440
currenciesDisplayName.BND=\u0411\u0440\u0443\u043d\u0435\u0458\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.DZF=\u0410\u043b\u0433\u0435\u0440\u0438\u0441\u043a\u0438 \u043d\u043e\u0432 \u0424\u0440\u0430\u043d\u043a
-currenciesDisplayName.EGP=\u0415\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0430 \u0424\u0443\u043d\u0442\u0430
-currenciesDisplayName.JMD=\u0408\u0430\u043c\u0430\u0458\u043a\u0430\u043d\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.PLN=\u041f\u043e\u043b\u0441\u043a\u0430 \u0437\u043b\u043e\u0442\u0430
+currenciesDisplayName.JMD=\u0408\u0430\u043c\u0430\u0458\u043a\u0430\u043d\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.EGP=\u0415\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0430 \u0424\u0443\u043d\u0442\u0430
currenciesDisplayName.DZD=\u0410\u043b\u0433\u0435\u0440\u0438\u0441\u043a\u0438 \u0414\u0438\u043d\u0430\u0440
currenciesDisplayName.ISK=\u0418\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.SRG=\u0421\u0443\u0440\u0438\u043d\u0430\u043c\u0441\u043a\u0438 \u0433\u0438\u043b\u0434\u0435\u0440
-currenciesDisplayName.BZH=\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u043e \u0425\u043e\u043d\u0434\u0443\u0440\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
currenciesDisplayName.LYD=\u041b\u0438\u0431\u0438\u0458\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.BAN=\u0411\u043e\u0441\u0430\u043d\u0441\u043a\u043e-\u0425\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0441\u043a\u0438 \u043d\u043e\u0432 \u0414\u0438\u043d\u0430\u0440
-currenciesDisplayName.BAM=\u0411\u043e\u0441\u0430\u043d\u0441\u043a\u043e-\u0425\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0441\u043a\u0438 \u0414\u0438\u043d\u0430\u0440 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0431\u0438\u043b\u043d\u0430 \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.BZD=\u0411\u0435\u043b\u0438\u0437\u0438\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
+currenciesDisplayName.BAM=\u0411\u043e\u0441\u0430\u043d\u0441\u043a\u043e-\u0425\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0441\u043a\u0438 \u0414\u0438\u043d\u0430\u0440 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0431\u0438\u043b\u043d\u0430 \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.ESP=\u0428\u043f\u0430\u043d\u0441\u043a\u0430 \u041f\u0435\u0437\u0435\u0442\u0430
-currenciesDisplayName.KRW=\u0408\u0443\u0436\u043d\u043e \u043a\u043e\u0440\u0435\u0458\u0441\u043a\u0438 \u0432\u043e\u043d
currenciesDisplayName.NLG=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0433\u0438\u043b\u0434\u0435\u0440
-currenciesDisplayName.BMP=\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u043a\u0438 \u0444\u0443\u043d\u0442\u0430
+currenciesDisplayName.KRW=\u0408\u0443\u0436\u043d\u043e \u043a\u043e\u0440\u0435\u0458\u0441\u043a\u0438 \u0432\u043e\u043d
currenciesDisplayName.BAD=\u0411\u043e\u0441\u0430\u043d\u0441\u043a\u043e-\u0425\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0441\u043a\u0438 \u0414\u0438\u043d\u0430\u0440
currenciesDisplayName.ZWD=\u0417\u0438\u043c\u0431\u0430\u0431\u0432\u0438\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.SEK=\u0428\u0432\u0435\u0434\u0441\u043a\u0430 \u043a\u0440\u0443\u043d\u0430
-currenciesDisplayName.KRO=\u0408\u0443\u0436\u043d\u043e \u043a\u043e\u0440\u0435\u0458\u0441\u043a\u0438 \u0441\u0442\u0430\u0440 \u0432\u043e\u043d
currenciesDisplayName.CSK=\u0427\u0435\u0445\u043e\u0441\u043b\u043e\u0432\u0430\u0447\u043a\u0430 \u0446\u0432\u0440\u0441\u0442\u0430 \u043a\u043e\u0440\u043e\u043d\u0430
currenciesDisplayName.BYR=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u043a\u0430 \u0420\u0443\u0431\u0459\u0430
currenciesDisplayName.IRR=\u0418\u0440\u0430\u043d\u0441\u043a\u0438 \u0440\u0438\u0430\u043b
currenciesDisplayName.PKR=\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0430 \u0440\u0443\u043f\u0438\u0458\u0430
currenciesDisplayName.BMD=\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u043a\u0438 \u0414\u043e\u043b\u0430\u0440
-currenciesDisplayName.KRH=\u0408\u0443\u0436\u043d\u043e \u043a\u043e\u0440\u0435\u0441\u043a\u0438 \u0445\u0432\u0430\u043d
-currenciesDisplayName.BYL=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u043a\u0430 \u0420\u0443\u0431\u0459\u0430 (1992-1994)
-currenciesDisplayName.CSC=\u0427\u0435\u0445\u043e\u0441\u043b\u043e\u0432\u0430\u0447\u043a\u0430 \u043a\u043e\u0440\u043e\u043d\u0430
-currenciesSymbol.YDD=YDD
-currenciesSymbol.GRN=GRN
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.TWD=NT$
currenciesSymbol.LKR=SL Re
-currenciesSymbol.BYB=BYB
-currenciesSymbol.TJS=TJS
-currenciesSymbol.RWF=RWF
-currenciesSymbol.TJR=TJR
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GRD=GRD
-currenciesSymbol.AFN=Af
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AMD=dram
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.AFA=AFA
-currenciesSymbol.CRC=C
-currenciesSymbol.FKP=FKP
-currenciesSymbol.TVD=TVD
-currenciesSymbol.MDL=MDL
-currenciesSymbol.HKD=HK$
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.SCR=SR
-currenciesSymbol.XID=XID
-currenciesSymbol.VUV=VT
-currenciesSymbol.KPW=KPW
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.LVR=LVR
-currenciesSymbol.AED=AED
-currenciesSymbol.LVL=LVL
-currenciesSymbol.BWP=BWP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.MOP=MOP
-currenciesSymbol.FJD=F$
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUB=RUB
-currenciesSymbol.NIC=NIC
-currenciesSymbol.LIF=LIF
-currenciesSymbol.UZS=UZS
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.ADD=ADD
-currenciesSymbol.THB=THB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.LUF=LUF
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.SZL=E
-currenciesSymbol.MNT=Tug
currenciesSymbol.SAR=SRl
-currenciesSymbol.UAH=UAH
-currenciesSymbol.HUF=Ft
-currenciesSymbol.IBP=IBP
+currenciesSymbol.FJD=F$
currenciesSymbol.QAR=QR
-currenciesSymbol.COP=Col$
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.PTC=PTC
-currenciesSymbol.AOS=AOS
-currenciesSymbol.BUR=BUR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.INR=INR
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.LTL=LTL
-currenciesSymbol.AON=AON
-currenciesSymbol.UYP=UYP
-currenciesSymbol.SML=SML
-currenciesSymbol.MZM=Mt
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.AOK=AOK
-currenciesSymbol.PGK=PGK
-currenciesSymbol.SYP=LS
-currenciesSymbol.OMR=RO
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MZE=MZE
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.NGN=NGN
-currenciesSymbol.PSP=PSP
-currenciesSymbol.AOA=AOA
-currenciesSymbol.GNI=GNI
-currenciesSymbol.MAF=MAF
-currenciesSymbol.GNF=GF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.HTG=HTG
-currenciesSymbol.MYR=RM
-currenciesSymbol.BTR=BTR
-currenciesSymbol.LSL=M
-currenciesSymbol.SLL=SLL
-currenciesSymbol.BHD=BD
-currenciesSymbol.TRL=TL
-currenciesSymbol.KMF=CF
-currenciesSymbol.GAF=GAF
-currenciesSymbol.CZK=CZK
-currenciesSymbol.GMP=GMP
-currenciesSymbol.GMD=GMD
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGM=BGM
-currenciesSymbol.BGL=lev
-currenciesSymbol.VEB=Be
-currenciesSymbol.MLF=MLF
-currenciesSymbol.MXP=MXP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.PES=PES
-currenciesSymbol.BSP=BSP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.GYD=G$
-currenciesSymbol.ILP=ILP
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.SKK=Sk
-currenciesSymbol.PEN=PEN
-currenciesSymbol.ILL=ILL
-currenciesSymbol.LRD=LRD
-currenciesSymbol.AMD=dram
-currenciesSymbol.BSD=BSD
-currenciesSymbol.GLK=GLK
-currenciesSymbol.HRK=HRK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.FRF=FRF
-currenciesSymbol.MWP=MWP
-currenciesSymbol.TDF=TDF
-currenciesSymbol.MKD=MDen
-currenciesSymbol.TPP=TPP
-currenciesSymbol.ALL=lek
-currenciesSymbol.ALK=ALK
-currenciesSymbol.TPE=TPE
-currenciesSymbol.DEM=DEM
-currenciesSymbol.XCD=EC$
-currenciesSymbol.KWD=KD
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.GWP=GWP
-currenciesSymbol.YUN=YUN
-currenciesSymbol.SVC=SVC
-currenciesSymbol.SIT=SIT
-currenciesSymbol.BEL=BEL
-currenciesSymbol.BEF=BF
-currenciesSymbol.YUD=YUD
-currenciesSymbol.BEC=BEC
-currenciesSymbol.SUR=SUR
-currenciesSymbol.RON=RON
-currenciesSymbol.ROL=leu
-currenciesSymbol.SUN=SUN
-currenciesSymbol.SIB=SIB
-currenciesSymbol.VNS=VNS
-currenciesSymbol.VNR=VNR
-currenciesSymbol.NOK=NKr
-currenciesSymbol.VNN=VNN
-currenciesSymbol.ZAR=R
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.VND=VND
-currenciesSymbol.KID=KID
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.GIP=GIP
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.TND=TND
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.JOD=JD
currenciesSymbol.LBP=LL
-currenciesSymbol.VAL=VAL
-currenciesSymbol.UGS=UGS
-currenciesSymbol.WST=WST
+currenciesSymbol.MNT=Tug
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
currenciesSymbol.KHR=CR
-currenciesSymbol.DOP=RD$
-currenciesSymbol.LNR=LNR
-currenciesSymbol.WSP=WSP
-currenciesSymbol.KHO=KHO
-currenciesSymbol.MTP=MTP
-currenciesSymbol.USS=USS
-currenciesSymbol.NZP=NZP
-currenciesSymbol.CUP=CUP
+currenciesSymbol.SYP=LS
currenciesSymbol.MTL=Lm
-currenciesSymbol.TMM=TMM
-currenciesSymbol.USN=USN
-currenciesSymbol.GHP=GHP
-currenciesSymbol.SSP=SSP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.GHO=GHO
-currenciesSymbol.SGD=S$
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
+currenciesSymbol.HUF=Ft
currenciesSymbol.NZD=$NZ
-currenciesSymbol.USD=US$
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
+currenciesSymbol.DOP=RD$
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.PAB=PAB
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
+currenciesSymbol.BIF=Fbu
currenciesSymbol.GTQ=Q
+currenciesSymbol.GNF=GF
+currenciesSymbol.LSL=M
+currenciesSymbol.PLN=Zl
+currenciesSymbol.VEB=Be
+currenciesSymbol.KMF=CF
+currenciesSymbol.SEK=SKr
currenciesSymbol.AUD=$A
-currenciesSymbol.GHC=GHC
-currenciesSymbol.LAK=LAK
-currenciesSymbol.NAD=N$
-currenciesSymbol.KGS=som
-currenciesSymbol.BBD=BDS$
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
+currenciesSymbol.SKK=Sk
currenciesSymbol.CHF=SwF
-currenciesSymbol.PYG=PYG
-currenciesSymbol.JMP=JMP
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.YER=YRl
-currenciesSymbol.ATS=ATS
-currenciesSymbol.ETD=ETD
-currenciesSymbol.LYP=LYP
currenciesSymbol.ETB=Br
-currenciesSymbol.BND=BND
-currenciesSymbol.DZF=DZF
-currenciesSymbol.EGP=EGP
-currenciesSymbol.JMD=J$
-currenciesSymbol.PLN=Zl
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.MXN=MEX$
currenciesSymbol.DZD=DA
-currenciesSymbol.ISK=ISK
-currenciesSymbol.SRG=Sf
-currenciesSymbol.BZH=BZH
-currenciesSymbol.LYD=LD
-currenciesSymbol.BAN=BAN
-currenciesSymbol.BAM=KM
currenciesSymbol.BZD=BZ$
-currenciesSymbol.ESP=ESP
-currenciesSymbol.KRW=KRW
-currenciesSymbol.NLG=NLG
-currenciesSymbol.BMP=BMP
-currenciesSymbol.BAD=BAD
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.SEK=SKr
-currenciesSymbol.KRO=KRO
-currenciesSymbol.CSK=CSK
-currenciesSymbol.BYR=Rbl
currenciesSymbol.IRR=RI
-currenciesSymbol.PKR=Pra
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=\u0458\u0430\u043d.®\u0444\u0435\u0432.®\u043c\u0430\u0440.®\u0430\u043f\u0440.®\u043c\u0430\u0458.®\u0458\u0443\u043d.®\u0458\u0443\u043b.®\u0430\u0432\u0433.®\u0441\u0435\u043f\u0442.®\u043e\u043a\u0442.®\u043d\u043e\u0435\u043c.®\u0434\u0435\u043a\u0435\u043c.®®
months=\u0458\u0430\u043d\u0443\u0430\u0440\u0438®\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438®\u043c\u0430\u0440\u0442®\u0430\u043f\u0440\u0438\u043b®\u043c\u0430\u0458®\u0458\u0443\u043d\u0438®\u0458\u0443\u043b\u0438®\u0430\u0432\u0433\u0443\u0441\u0442®\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438®\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438®\u043d\u043e\u0435\u043c\u0432\u0440\u0438®\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438®®
shortWeekdays=®\u043d\u0435\u0434.®\u043f\u043e\u043d.®\u0432\u0442.®\u0441\u0440\u0435.®\u0447\u0435\u0442.®\u043f\u0435\u0442.®\u0441\u0430\u0431.®
@@ -582,6 +368,7 @@ territories.CX=\u0411\u043e\u0436\u0438\u045c\u043d\u0438 \u041e\u0441\u0442\u04
territories.CV=\u0417\u0435\u043b\u0435\u043d\u043e\u0440\u0442\u0441\u043a\u0438 \u041e\u0441\u0442\u0440\u043e\u0432\u0438
territories.PA=\u041f\u0430\u043d\u0430\u043c\u0430
territories.CU=\u041a\u0443\u0431\u0430
+territories.CS=\u0421\u0440\u0431\u0438\u0458\u0430 \u0438 \u0426\u0440\u043d\u0430 \u0413\u043e\u0440\u0430
territories.CR=\u041a\u043e\u0441\u0442\u0430\u0440\u0438\u043a\u0430
territories.CO=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u0458\u0430
territories.CN=\u041a\u0438\u043d\u0430
@@ -652,17 +439,16 @@ territories.AI=\u0410\u043d\u0433\u0432\u0438\u043b\u0430
territories.MS=\u041c\u043e\u043d\u0441\u0435\u0440\u0430\u0442
territories.MR=\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0438\u0458\u0430
territories.AG=\u0410\u043d\u0442\u0438\u0433\u0443\u0430 \u0438 \u0411\u0430\u0440\u0431\u0443\u0434\u0430
-territories.MQ=\u041c\u0430\u0440\u0442\u0438\u043d\u0438\u043a
territories.AF=\u0410\u0432\u0433\u0430\u043d\u0438\u0441\u0442\u0430\u043d
-territories.MP=\u0421\u0435\u0432\u0435\u0440\u043d\u0438 \u041c\u0430\u0440\u0438\u0458\u0430\u043d\u0438\u043d\u0438 \u041e\u0441\u0442\u0440\u043e\u0432\u0438
+territories.MQ=\u041c\u0430\u0440\u0442\u0438\u043d\u0438\u043a
territories.AE=\u041e\u0431\u0435\u0434\u0438\u043d\u0435\u0442\u0438 \u0410\u0440\u0430\u043f\u0441\u043a\u0438 \u0415\u043c\u0438\u0440\u0430\u0442\u0438
-territories.MO=\u041c\u0430\u043a\u0430\u043e \u0421.\u0410.\u0420 \u041a\u0438\u043d\u0430
+territories.MP=\u0421\u0435\u0432\u0435\u0440\u043d\u0438 \u041c\u0430\u0440\u0438\u0458\u0430\u043d\u0438\u043d\u0438 \u041e\u0441\u0442\u0440\u043e\u0432\u0438
territories.AD=\u0410\u043d\u0434\u043e\u0440\u0430
+territories.MO=\u041c\u0430\u043a\u0430\u043e \u0421.\u0410.\u0420 \u041a\u0438\u043d\u0430
territories.MN=\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u0458\u0430
territories.MM=\u041c\u0443\u0430\u043d\u043c\u0430\u0440
territories.ML=\u041c\u0430\u043b\u0438
territories.MK=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0438\u0458\u0430
-territories.YU=\u0408\u0443\u0433\u043e\u0441\u043b\u0430\u0432\u0438\u0458\u0430
territories.YT=\u041c\u0430\u0458\u043e\u0442\u0435
territories.MH=\u041c\u0430\u0440\u0448\u0430\u043b\u043e\u0432\u0438 \u041e\u0421\u0442\u0440\u043e\u0432\u0438
territories.MG=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440
diff --git a/resource/gnu/java/locale/LocaleInformation_mn.properties b/resource/gnu/java/locale/LocaleInformation_mn.properties
index 789ed3994..42073b688 100644
--- a/resource/gnu/java/locale/LocaleInformation_mn.properties
+++ b/resource/gnu/java/locale/LocaleInformation_mn.properties
@@ -7,13 +7,11 @@
decimalSeparator=,
groupingSeparator=\u00a0
+currenciesSymbol.MNT=\u20ae
shortMonths=\u0445\u0443\u043b®\u04af\u0445\u044d®\u0431\u0430\u0440®\u0442\u0443\u0443®\u043b\u0443\u0443®\u043c\u043e\u0433®\u043c\u043e\u0440®\u0445\u043e\u043d®\u0431\u0438\u0447®\u0442\u0430\u0445®\u043d\u043e\u0445®\u0433\u0430\u0445®®
months=\u0425\u0443\u043b\u0433\u0430\u043d\u0430®\u04ae\u0445\u044d\u0440®\u0411\u0430\u0440®\u0422\u0443\u0443\u043b\u0430\u0439®\u041b\u0443\u0443®\u041c\u043e\u0433\u043e\u0439®\u041c\u043e\u0440\u044c®\u0425\u043e\u043d\u044c®\u0411\u0438\u0447®\u0422\u0430\u0445\u0438\u0430®\u041d\u043e\u0445\u043e\u0439®\u0413\u0430\u0445\u0430\u0439®®
shortWeekdays=®\u041d\u044f®\u0414\u0430®\u041c\u044f®\u041b\u0445®\u041f\u04af®\u0411\u0430®\u0411\u044f®
weekdays=®\u043d\u044f\u043c®\u0434\u0430\u0432\u0430\u0430®\u043c\u044f\u0433\u043c\u0430\u0440®\u043b\u0445\u0430\u0433\u0432\u0430®\u043f\u04af\u0440\u044d\u0432®\u0431\u0430\u0430\u0441\u0430\u043d®\u0431\u044f\u043c\u0431\u0430®
-minNumberOfDaysInFirstWeek=4
-firstDayOfWeek=mon
eras=\u043c.\u044d.\u04e9®\u043c.\u044d.®
-ampms=AM®PM®
territories.MN=\u041c\u043e\u043d\u0433\u043e\u043b \u0443\u043b\u0441
languages.mn=\u041c\u043e\u043d\u0433\u043e\u043b \u0445\u044d\u043b
diff --git a/resource/gnu/java/locale/LocaleInformation_mr.properties b/resource/gnu/java/locale/LocaleInformation_mr.properties
index 58938838b..77dc88cd5 100644
--- a/resource/gnu/java/locale/LocaleInformation_mr.properties
+++ b/resource/gnu/java/locale/LocaleInformation_mr.properties
@@ -10,20 +10,21 @@ shortMonths=\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940®\u092b\u0947\u092c\
months=\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940®\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940®\u092e\u093e\u0930\u094d\u091a®\u090f\u092a\u094d\u0930\u093f\u0932®\u092e\u0947®\u091c\u0942\u0928®\u091c\u0941\u0932\u0948®\u0913\u0917\u0938\u094d\u091f®\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930®\u0913\u0915\u094d\u091f\u094b\u092c\u0930®\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930®\u0921\u093f\u0938\u0947\u0902\u092c\u0930®®
shortWeekdays=®\u0930\u0935\u093f®\u0938\u094b\u092e®\u092e\u0902\u0917\u0933®\u092c\u0941\u0927®\u0917\u0941\u0930\u0941®\u0936\u0941\u0915\u094d\u0930®\u0936\u0928\u093f®
weekdays=®\u0930\u0935\u093f\u0935\u093e\u0930®\u0938\u094b\u092e\u0935\u093e\u0930®\u092e\u0902\u0917\u0933\u0935\u093e\u0930®\u092c\u0941\u0927\u0935\u093e\u0930®\u0917\u0941\u0930\u0941\u0935\u093e\u0930®\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930®\u0936\u0928\u093f\u0935\u093e\u0930®
+eras=\u0908\u0938\u093e\u092a\u0942\u0930\u094d\u0935®\u0938\u0928®
ampms=\u092e.\u092a\u0942.®\u092e.\u0928\u0902.®
zoneStrings=Asia/Calcutta®IST®\u092d\u093e\u0930\u0924\u0940\u092f \u0938\u092e\u092f®IST®\u092d\u093e\u0930\u0924\u0940\u092f \u0938\u092e\u092f®©
territories.IN=\u092d\u093e\u0930\u0924
languages.es=\u0938\u094d\u092a\u093e\u0928\u093f\u0937
languages.ku=\u0915\u0941\u0930\u094d\u0926\u093f\u0937
languages.eo=\u0907\u0938\u094d\u092a\u0930\u093e\u0928\u094d\u091f\u094b
-languages.ks=\u0915\u0936\u094d\u092e\u0940\u0930\u0940
languages.en=\u0907\u0902\u0917\u094d\u0930\u0947\u091c\u0940
+languages.ks=\u0915\u0936\u094d\u092e\u0940\u0930\u0940
languages.el=\u0917\u094d\u0930\u0940\u0915
languages.qu=\u0915\u094d\u0935\u0947\u091a\u0913
languages.ko=\u0915\u094b\u0930\u093f\u092f\u0928\u094d
languages.kn=\u0915\u0928\u094d\u0928\u0921
-languages.kok=\u0915\u094b\u0902\u0915\u0923\u0940
languages.km=\u0915\u0902\u092c\u094b\u0921\u093f\u092f\u0928
+languages.kok=\u0915\u094b\u0902\u0915\u0923\u0940
languages.kl=\u0917\u094d\u0930\u0940\u0928\u0932\u093e\u0928\u094d\u0921\u093f\u0915
languages.kk=\u0915\u091c\u093c\u0915
languages.wo=\u0909\u0932\u094b\u092b
@@ -42,8 +43,8 @@ languages.cy=\u0935\u0947\u0932\u094d\u0937
languages.pa=\u092a\u0902\u091c\u093e\u092c\u0940
languages.cs=\u091c\u093c\u0947\u0915
languages.iu=\u0907\u0928\u0941\u0915\u093f\u091f\u0941\u091f\u094d
-languages.it=\u0907\u091f\u093e\u0932\u093f\u092f\u0928
languages.co=\u0915\u094b\u0930\u094d\u0938\u093f\u0915\u0928
+languages.it=\u0907\u091f\u093e\u0932\u093f\u092f\u0928
languages.is=\u0906\u0908\u0938\u0932\u093e\u0928\u094d\u0921\u093f\u0915
languages.uz=\u0909\u091c\u093c\u092c\u0947\u0915
languages.or=\u0913\u0930\u093f\u092f\u093e
@@ -136,15 +137,15 @@ languages.fy=\u092b\u094d\u0930\u093f\u0938\u093f\u092f\u0928\u094d
languages.sa=\u0938\u0902\u0938\u094d\u0915\u0943\u0924
languages.fr=\u092b\u094d\u0930\u0947\u0928\u094d\u091a
languages.lv=\u0932\u093e\u091f\u094d\u0935\u093f\u092f\u0928\u094d (\u0932\u0947\u091f\u094d\u091f\u093f\u0937)
-languages.lt=\u0932\u093f\u0925\u0941\u0906\u0928\u093f\u092f\u0928\u094d
languages.fo=\u092b\u0947\u0930\u094b\u0938\u094d
+languages.lt=\u0932\u093f\u0925\u0941\u0906\u0928\u093f\u092f\u0928\u094d
languages.rw=\u0915\u093f\u0928\u094d\u092f\u093e\u0930\u094d\u0935\u093e\u0928\u094d\u0921\u093e
languages.root=\u092e\u0930\u093e\u0920\u0940
languages.ru=\u0930\u0937\u094d\u092f\u0928\u094d
-languages.lo=\u0932\u093e\u0913\u0924\u093f\u092f\u0928\u094d
languages.fj=\u092b\u093f\u091c\u0940
-languages.ln=\u0932\u093f\u0902\u0917\u093e\u0932\u093e
+languages.lo=\u0932\u093e\u0913\u0924\u093f\u092f\u0928\u094d
languages.fi=\u092b\u093f\u0928\u094d\u0928\u093f\u0937
+languages.ln=\u0932\u093f\u0902\u0917\u093e\u0932\u093e
languages.ro=\u0930\u094b\u092e\u093e\u0928\u093f\u092f\u0928\u094d
languages.rn=\u0915\u093f\u0930\u0941\u0928\u094d\u0926\u0940
languages.rm=\u0930\u0939\u091f\u094b-\u0930\u094b\u092e\u093e\u0928\u094d\u0938\u094d
@@ -152,5 +153,5 @@ languages.fa=\u092a\u0930\u094d\u0937\u093f\u092f\u0928\u094d
languages.la=\u0932\u093e\u091f\u093f\u0928
languages.xh=\u0915\u094d\u0938\u094d\u0939\u094b\u0938\u093e
languages.eu=\u092c\u093e\u0938\u094d\u0915
-languages.ky=\u0915\u093f\u0930\u094d\u0917\u093f\u091c\u093c
languages.et=\u0907\u0938\u094d\u091f\u094b\u0928\u093f\u092f\u0928\u094d
+languages.ky=\u0915\u093f\u0930\u094d\u0917\u093f\u091c\u093c
diff --git a/resource/gnu/java/locale/LocaleInformation_mr_IN.properties b/resource/gnu/java/locale/LocaleInformation_mr_IN.properties
index d8023c910..3b599a54f 100644
--- a/resource/gnu/java/locale/LocaleInformation_mr_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_mr_IN.properties
@@ -5,8 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
firstDayOfWeek=mon
shortDateFormat=d-M-yy
mediumDateFormat=dd-MM-yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_ms.properties b/resource/gnu/java/locale/LocaleInformation_ms.properties
index 583c683ae..26e7c8e11 100644
--- a/resource/gnu/java/locale/LocaleInformation_ms.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ms.properties
@@ -12,6 +12,7 @@ months=Januari®Februari®Mac®April®Mei®Jun®Julai®Ogos®September®Oktober®November®
shortWeekdays=®Ahd®Isn®Sel®Rab®Kha®Jum®Sab®
weekdays=®Ahad®Isnin®Selasa®Rabu®Khamis®Jumaat®Sabtu®
firstDayOfWeek=mon
+eras=S.M.®T.M.®
territories.TL=Timor-Leste
territories.TK=Tokelau
territories.TJ=Tadjikistan
@@ -100,6 +101,7 @@ territories.CX=Christmas Island
territories.CV=Cape Verde
territories.PA=Panama
territories.CU=Cuba
+territories.CS=Serbia
territories.CR=Kosta Rika
territories.CO=Colombia
territories.CN=Cina
@@ -170,17 +172,16 @@ territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauritania
territories.AG=Antigua dan Barbuda
-territories.MQ=Martinique
territories.AF=Afghanistan
-territories.MP=Northern Mariana Islands
+territories.MQ=Martinique
territories.AE=Emiriah Arab Bersatu
-territories.MO=Macao S.A.R., China
+territories.MP=Northern Mariana Islands
territories.AD=Andorra
+territories.MO=Macao S.A.R., China
territories.MN=Mongolia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Macedonia
-territories.YU=Yugoslavia
territories.YT=Mayotte
territories.MH=Kepulauan Marshall
territories.MG=Madagaskar
diff --git a/resource/gnu/java/locale/LocaleInformation_ms_BN.properties b/resource/gnu/java/locale/LocaleInformation_ms_BN.properties
index d7805f306..52663ae88 100644
--- a/resource/gnu/java/locale/LocaleInformation_ms_BN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ms_BN.properties
@@ -7,7 +7,6 @@
decimalSeparator=,
groupingSeparator=.
-currenciesDisplayName.BND=BND
currenciesSymbol.BND=$
currenciesSymbol.USD=US$
shortDateFormat=dd/MM/yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_mt.properties b/resource/gnu/java/locale/LocaleInformation_mt.properties
index 6d4c75da5..4dfc21b7a 100644
--- a/resource/gnu/java/locale/LocaleInformation_mt.properties
+++ b/resource/gnu/java/locale/LocaleInformation_mt.properties
@@ -15,15 +15,15 @@ minNumberOfDaysInFirstWeek=4
eras=QK®WK®
shortDateFormat=dd/MM/yyyy
mediumDateFormat=dd MMM yyyy
-longDateFormat=d 'ta''' MMMM yyyy
-fullDateFormat=EEEE, d 'ta''' MMMM yyyy
+longDateFormat=d 'ta\u2019' MMMM yyyy
+fullDateFormat=EEEE, d 'ta\u2019' MMMM yyyy
zoneStrings=Europe/Malta®CET®\u0126in \u010aentrali Ewropew®CEST®\u0126in \u010aentrali Ewropew tas-Sajf®©
territories.TL=Timor tal-Lvant
territories.TK=Tokelaw
territories.TJ=Ta\u0121ikistan
territories.TH=Tajlandja
territories.TG=Togo
-territories.TF=Territorji Fran\u010bi\u017ci ta' Nofsinhar
+territories.TF=Territorji Fran\u010bi\u017ci ta\u2019 Nofsinhar
territories.GY=Gujana
territories.TD=\u010aad
territories.TC=Turks and Caicos Islands
@@ -40,7 +40,9 @@ territories.GN=Gineja
territories.GM=Gambja
territories.GL=Grinlandja
territories.SV=El Salvador
+territories.062=Asja t\u2019Isfel \u010aentrali
territories.ST=Sao Tome and Principe
+territories.061=Polinesja
territories.GI=Gibraltar
territories.GH=Gana
territories.SR=Surinam
@@ -64,9 +66,12 @@ territories.SC=Seychelles
territories.SB=Solomon Islands
territories.SA=G\u0127arabja Sawdita
territories.FR=Franza
+territories.057=Mikronesja
territories.FO=G\u017cejjer Faroe
territories.FM=Mikronesja
territories.RW=Rwanda
+territories.054=Melanesja
+territories.053=Awstralja u New Zealand
territories.FK=Falkland Islands
territories.RU=Russja
territories.FJ=Fi\u0121i
@@ -76,20 +81,25 @@ territories.RE=R\u00e9union
territories.ET=Etijopja
territories.ES=Spanja
territories.ER=Eritreja
+territories.833=Isle of Man
territories.EH=Sahara tal-Punent
territories.EG=E\u0121ittu
+territories.830=Channel Islands
territories.EE=Estonja
territories.EC=Ekwador
territories.DZ=Al\u0121erija
territories.QA=Qatar
+territories.039=Ewropa t\u2019Isfel
territories.DO=Republikka Domenikana
territories.PY=Paragwaj
+territories.035=Asja tax-Xlokk
territories.DM=Dominika
territories.PW=Palau
territories.DK=Danimarka
territories.DJ=\u0120ibuti
territories.PT=Portugall
territories.PS=Palestinian Territory
+territories.030=Asja tal-Lvant
territories.PR=Puerto Rico
territories.DE=\u0120ermanja
territories.PN=Pitcairn
@@ -106,13 +116,16 @@ territories.CX=Christmas Island
territories.CV=Kape Verde
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Serbja u Montenegro
territories.CR=Kosta Rika
+territories.029=Karibew
territories.CO=Kolumbja
territories.CN=\u010aina
territories.CM=Kamerun
territories.CL=\u010aili
territories.CK=Cook Islands
-territories.CI=Kosta ta' l-Avorju
+territories.CI=Kosta ta\u2019 l-Avorju
+territories.021=Amerika ta\u2019 Fuq
territories.CH=Svizzera
territories.CG=Kongo
territories.CF=Repubblika Afrikana \u010aentrali
@@ -120,6 +133,7 @@ territories.CD=Democratic Republic of the Congo
territories.CC=Cocos (Keeling) Islands
territories.OM=Oman
territories.CA=Kanada
+territories.419=Amerika Latina u l-Karibew
territories.BZ=Beli\u017ce
territories.BY=Bjelorussja
territories.BW=Botswana
@@ -127,14 +141,22 @@ territories.BV=Bouvet Island
territories.BT=Butan
territories.BS=Ba\u0127amas
territories.BR=Bra\u017cil
+territories.019=Amerika
+territories.018=Affrika t\u2019Isfel
territories.NZ=New Zealand
territories.BO=Bolivja
+territories.017=Affrika Nofsani
territories.BN=Brunej
territories.BM=Bermuda
+territories.015=Affrika ta\u2019 Fuq
+territories.014=Affrika tal-Lvant
+territories.013=Amerika \u010aentrali
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Affrika tal-Punent
territories.BH=Ba\u0127rajn
+territories.172=Commonwealth tal-Istati Independenti
territories.NR=Nauru
territories.BG=Bulgarija
territories.BF=Burkina Faso
@@ -159,26 +181,31 @@ territories.AU=Awstralja
territories.AT=Awstrija
territories.AS=Samoa Amerikana
territories.AR=Ar\u0121entina
+territories.009=O\u010bejanja
territories.AQ=Antarctica
territories.MZ=Mo\u017cambik
territories.AO=Angola
territories.MY=Malasja
territories.AN=Antilles Olandi\u017ci
territories.MX=Messiku
+territories.005=Amerika t\u2019Isfel
territories.AM=Armenja
territories.MW=Malawi
territories.AL=Albanija
territories.MV=Maldives
-territories.ZA=Afrika t'Isfel
+territories.003=Amerika ta\u2019 Fuq
+territories.ZA=Afrika t\u2019Isfel
territories.MU=Mawrizju
+territories.002=Affrika
territories.MT=Malta
+territories.001=Dinja
territories.AI=Angwilla
territories.MS=Montserrat
territories.MR=Mawritanja
territories.AG=Antigua and Barbuda
territories.MQ=Martinik
territories.AF=Afganistan
-territories.MP=G\u017cejjer Marjana ta' Fuq
+territories.MP=G\u017cejjer Marjana ta\u2019 Fuq
territories.AE=Emirati G\u0127arab Maqg\u0127uda
territories.MO=Macao S.A.R., China
territories.AD=Andorra
@@ -186,9 +213,8 @@ territories.MN=Mongolja
territories.MM=Mjanmar
territories.ML=Mali
territories.MK=Ma\u010bedonja
-territories.YU=Jugoslavja
territories.YT=Majotte
-territories.MH=G\u017cejjer ta' Marshall
+territories.MH=G\u017cejjer ta\u2019 Marshall
territories.MG=Madagaskar
territories.MD=Maldova
territories.MC=Monako
@@ -196,10 +222,14 @@ territories.MA=Marokk
territories.YE=Jemen
territories.LY=Libja
territories.LV=Latvja
+territories.155=Ewropa tal-Punent
territories.LU=Lussemburgu
+territories.154=Ewropa ta\u2019 Fuq
territories.LT=Litwanja
territories.LS=Lesoto
territories.LR=Liberja
+territories.151=Ewropa tal-Lvant
+territories.150=Ewropa
territories.LK=Sri Lanka
territories.LI=Liechtenstein
territories.LC=Saint Lucia
@@ -208,8 +238,10 @@ territories.LA=Laos
territories.KZ=Ka\u017cakstan
territories.KY=Cayman Islands
territories.KW=Kuwajt
-territories.KR=Koreja t'Isfel
-territories.KP=Koreja ta' Fuq
+territories.145=Asja tal-Punent
+territories.142=Asja
+territories.KR=Koreja t\u2019Isfel
+territories.KP=Koreja ta\u2019 Fuq
territories.KN=Saint Kitts and Nevis
territories.KM=Komoros
territories.KI=Kiribati
@@ -257,8 +289,8 @@ territories.TR=Turkija
territories.TO=Tonga
territories.TN=Tune\u017c
territories.TM=Turkmenistan
-languages.gwi=Gwi\u010bin
languages.akk=Akkadjen
+languages.gwi=Gwi\u010bin
languages.eka=Ekajuk
languages.ijo=I\u0121o
languages.xh=\u0126o\u017ca
@@ -271,15 +303,15 @@ languages.pon=Ponpejan
languages.min=Minangkabaw
languages.suk=Sukuma
languages.wo=Wolof
-languages.lol=Mongo
languages.kut=Kutenaj
+languages.lol=Mongo
languages.mic=Mikmek
languages.wa=Walloon
languages.kum=Kumiku
languages.zap=\u017bapotek
languages.cus=Kuxtiku (O\u0127ra)
-languages.jbo=Lojban
languages.doi=Dogri
+languages.jbo=Lojban
languages.vo=Volapuk
languages.oto=Lingwi Otomjani
languages.vi=Vjetnami\u017c
@@ -294,7 +326,7 @@ languages.nap=Neapolitan
languages.uz=U\u017cbek
languages.uga=Ugaritiku
languages.tmh=Tamaxek
-languages.nai=Indjan tal-Amerika ta' Fuq (O\u0127ra)
+languages.nai=Indjan tal-Amerika ta\u2019 Fuq (O\u0127ra)
languages.nah=Na\u0127watil
languages.ur=Urdu
languages.fat=Fanti
@@ -303,8 +335,8 @@ languages.egy=E\u0121izzjan (Antik)
languages.ug=Wigur
languages.fan=Fang
languages.ssa=Nilo-Sa\u0127aram
-languages.mga=Irlandi\u017c, Medjevali (900-1200)
languages.bat=Baltiku (O\u0127ra)
+languages.mga=Irlandi\u017c, Medjevali (900-1200)
languages.nyo=Njoro
languages.bas=Basa
languages.nyn=Nyankole
@@ -323,7 +355,7 @@ languages.tt=Tatar
languages.ts=Tsonga
languages.bad=Banda
languages.tr=Tork
-languages.to=Tongan (G\u017cejjer ta' Tonga)
+languages.to=Tongan (G\u017cejjer ta\u2019 Tonga)
languages.tn=Zwana
languages.tl=Tagalog
languages.tk=Turkmeni
@@ -333,8 +365,8 @@ languages.kru=Kurusk
languages.tg=Ta\u0121ik
languages.byn=Blin
languages.te=Telugu
-languages.kro=Kru
languages.csb=Kashubian
+languages.kro=Kru
languages.ta=Tamil
languages.tkl=Tokelau
languages.efi=Efik
@@ -342,7 +374,7 @@ languages.sw=Swa\u0127ili
languages.sv=Svedi\u017c
languages.su=Sundani\u017c
languages.krc=Karachay-Balkar
-languages.st=Soto, t'Isfel
+languages.st=Soto, t\u2019Isfel
languages.ss=Swati
languages.sr=Serb
languages.sq=Albani\u017c
@@ -358,10 +390,10 @@ languages.sk=Slovakk
languages.grb=\u0120erbo
languages.si=Sin\u0127ali\u017c
languages.sh=Serbo-Kroat
-languages.crh=Crimean Turkish; Crimean Tatar
languages.afa=Afro-Asjatiku (O\u0127ra)
+languages.crh=Crimean Turkish; Crimean Tatar
languages.sg=Sango
-languages.se=Sami ta' Fuq
+languages.se=Sami ta\u2019 Fuq
languages.sd=Sindi
languages.udm=Udmurt
languages.sc=Sardinjan
@@ -384,14 +416,14 @@ languages.son=Songaj
languages.cpp=Creoles and pidgins, Portuguese-based (Other)
languages.sog=Sogdien
languages.ada=Adangme
-languages.kos=Kosrejan
-languages.hit=\u0126ittit
languages.cpf=Kreoli u Pi\u0121ini, Bba\u017cat fuq il-Fran\u010bi\u017c (O\u0127ra)
+languages.hit=\u0126ittit
+languages.kos=Kosrejan
languages.cpe=Kreoli u Pi\u0121ini, Bba\u017cat fuq l-Ingli\u017c (O\u0127ra)
languages.him=\u0126ima\u010bali
-languages.kok=Konkani
-languages.hil=Hiligaynon
languages.got=Gotiku
+languages.hil=Hiligaynon
+languages.kok=Konkani
languages.gor=Gorontalo
languages.gon=Gondi
languages.din=Dinka
@@ -431,7 +463,7 @@ languages.mag=Maga\u0127i
languages.mad=Maduri\u017c
languages.sma=Southern Sami
languages.oc=Provenzal (wara 1500)
-languages.nso=Soto, ta' Fuq
+languages.nso=Soto, ta\u2019 Fuq
languages.btk=Batak
languages.myv=Erzya
languages.dgr=Dogrib
@@ -439,7 +471,7 @@ languages.ny=\u010ai\u010bewa; Njan\u0121a
languages.myn=Majan
languages.nv=Nava\u0127o
languages.kmb=Kimbundu
-languages.nr=Ndebele, t'Isfel
+languages.nr=Ndebele, t\u2019Isfel
languages.gmh=\u0120ermaniku, Medjevali Pulit (ca. 1050-1500)
languages.no=Norve\u0121i\u017c
languages.nn=Ninorsk Norve\u0121i\u017c
@@ -448,7 +480,7 @@ languages.root=G\u0127erq
languages.ng=Ndonga
languages.sla=Slavic (Other)
languages.ne=Nepali\u017c
-languages.nd=Ndebele, ta' Fuq
+languages.nd=Ndebele, ta\u2019 Fuq
languages.cmc=Lingwi \u010aamiki
languages.tet=Tetum
languages.nb=Bokmahal Norve\u0121i\u017c
@@ -463,21 +495,21 @@ languages.ms=Malajan
languages.mr=Marati
languages.fro=Fran\u010bi\u017c, Antik (842-ca. 1400)
languages.mo=Moldavjan
-languages.frm=Fran\u010bi\u017c, Medjevali (ca. 1400-1600)
languages.mn=Mongoljan
-languages.jrb=Lhudi-G\u0127arbi
+languages.frm=Fran\u010bi\u017c, Medjevali (ca. 1400-1600)
languages.ml=Malajalam
+languages.jrb=Lhudi-G\u0127arbi
languages.mk=Ma\u010bedonjan
languages.mi=Maori
languages.mh=Marxall
languages.mg=Malaga\u017ci
languages.mwr=Marwari
languages.bra=Braj
-languages.den=Slav
languages.lv=Latvjan (Lettix)
+languages.den=Slav
languages.lu=Luba-Katanga
-languages.del=Delawerjan
languages.lt=Litwanjan
+languages.del=Delawerjan
languages.lo=Lao
languages.ln=Lingaljan
languages.li=Limburgish
@@ -530,38 +562,38 @@ languages.iu=Inukitut
languages.pap=Papjamento
languages.it=Taljan
languages.sgn=Lingwa tas-Sinjali
-languages.is=I\u017clandi\u017c
languages.kha=Kasi
+languages.is=I\u017clandi\u017c
languages.chr=\u010aerokij
languages.pam=Pampamga
languages.pal=Pa\u0127lavi
languages.chp=\u010aipewjan
-languages.io=Ido
languages.cho=\u010aostaw
+languages.io=Ido
languages.chn=\u0120argon ta\u010b-\u010ainuk
languages.chm=Mari
languages.tyv=Tuvinjan
languages.bnt=Bantu
languages.pag=Pangasinjan
-languages.ik=Inupjak
languages.chk=\u010aukese
-languages.ii=Sichuan Yi
+languages.ik=Inupjak
languages.haw=\u0126awajjan
+languages.ii=Sichuan Yi
languages.lam=Lamba
-languages.ig=Igbo
languages.chg=\u010aagataj
+languages.ig=Igbo
languages.sga=Irlandi\u017c, Antik (sa l-900)
languages.paa=Papwan (O\u0127ra)
languages.ie=Interlingue
languages.id=Indone\u017cjan
languages.lah=Landa
-languages.day=Dajak
languages.chb=\u010aib\u010ba
+languages.day=Dajak
languages.ia=Interlingua
languages.lad=Ladino
-languages.hz=\u0126erero
-languages.hai=\u0126ajda
languages.dar=Dargwa
+languages.hai=\u0126ajda
+languages.hz=\u0126erero
languages.hy=Armenjan
languages.ath=Lingwi Atabaskani
languages.hu=Ungeri\u017c
@@ -583,9 +615,9 @@ languages.iro=Lingwi Irogwjani
languages.gn=Gwarani
languages.gl=Gallegjan
languages.arw=Arawak
-languages.gez=Geez
-languages.art=Artifi\u010bjali (O\u0127ra)
languages.gd=Galliku Sko\u010b\u010bi\u017c
+languages.art=Artifi\u010bjali (O\u0127ra)
+languages.gez=Geez
languages.ira=Iranjan
languages.ga=Irlandi\u017c
languages.arp=Arapa\u0127o
@@ -594,8 +626,8 @@ languages.fy=Fri\u017cjan
languages.bla=Siksika
languages.gem=\u0120ermaniku (O\u0127ra)
languages.ypk=Lingwi Jupi\u010bi
-languages.arc=Aramajk
languages.fr=Fran\u010bi\u017c
+languages.arc=Aramajk
languages.fo=Fawri\u017c
languages.cel=Keltiku (O\u0127ra)
languages.fj=Fi\u0121i
@@ -619,9 +651,9 @@ languages.tum=Tumbuka
languages.mos=Mossi
languages.dz=D\u017congka
languages.nic=Ni\u0121erjan - Kordofanjan
-languages.lus=Luxaj
-languages.fiu=Finno - Ugrijan
languages.dv=Dive\u0127i
+languages.fiu=Finno - Ugrijan
+languages.lus=Luxaj
languages.nia=Nijas
languages.moh=Mo\u0127ak
languages.luo=Luwa
@@ -644,8 +676,8 @@ languages.wak=Lingwi Wakaxani
languages.sat=Santali
languages.cy=Welx
languages.sas=Saska
-languages.kbd=Kabardian
languages.cv=\u010auvax
+languages.kbd=Kabardian
languages.cu=Slaviku tal-Knisja
languages.mni=Manipuri
languages.cs=\u010aek
@@ -654,20 +686,20 @@ languages.cr=Krij
languages.sal=Salixan
languages.dua=Dwala
languages.co=Korsiku
-languages.sai=Indjan tal-Amerika t'Isfel (O\u0127ra)
+languages.sai=Indjan tal-Amerika t\u2019Isfel (O\u0127ra)
languages.mnc=Man\u010burjan
languages.sah=Jakut
-languages.kaw=Kawi
-languages.inh=Ingush
languages.gba=Gbaja
+languages.inh=Ingush
+languages.kaw=Kawi
languages.sad=Sandawe
languages.ch=\u010aamorro
-languages.ine=Indo-Ewropew
languages.bho=Bojpuri
+languages.ine=Indo-Ewropew
languages.enm=Ingli\u017c, Medjevali (1100-1500)
-languages.kar=Karen
-languages.inc=Indjan (O\u0127ra)
languages.ce=\u010ae\u010ben
+languages.inc=Indjan (O\u0127ra)
+languages.kar=Karen
languages.gay=Gajo
languages.ca=Katalan
languages.umb=Umbundu
@@ -675,19 +707,19 @@ languages.syr=Sirjan
languages.kam=Kamba
languages.tsi=Zimxjan
languages.ang=Ingli\u017c, Antik (ca.450-1100)
-languages.kac=Ka\u010bin
languages.cau=Kawkasu (O\u0127ra)
+languages.kac=Ka\u010bin
languages.kab=Kabuljan
-languages.kaa=Kara-Kalpak
languages.bs=Bosnijan
-languages.car=Karib
+languages.kaa=Kara-Kalpak
languages.br=Brenton
+languages.car=Karib
languages.bo=Tibetjan
languages.bn=Bengali
languages.bm=Bambara
languages.gaa=Ga
-languages.cai=Amerika \u010aentrali (O\u0127ra)
languages.bi=Bislama
+languages.cai=Amerika \u010aentrali (O\u0127ra)
languages.bh=Bi\u0127ari
languages.bg=Bulgaru
languages.be=Belarussu
@@ -701,10 +733,10 @@ languages.az=A\u017cerbaj\u0121ani
languages.ay=Ajmara
languages.av=Avarik
languages.as=Assamese
-languages.dsb=Lower Sorbian
languages.ar=G\u0127arbi
-languages.ilo=Iloko
+languages.dsb=Lower Sorbian
languages.elx=Elamit
+languages.ilo=Iloko
languages.zh=\u010aini\u017c
languages.an=Aragonese
languages.pra=Lingwi Prakriti
diff --git a/resource/gnu/java/locale/LocaleInformation_nb.properties b/resource/gnu/java/locale/LocaleInformation_nb.properties
index 3c8b0b377..0ce22cd3d 100644
--- a/resource/gnu/java/locale/LocaleInformation_nb.properties
+++ b/resource/gnu/java/locale/LocaleInformation_nb.properties
@@ -8,768 +8,358 @@
decimalSeparator=,
groupingSeparator=\u00a0
percentFormat=#,##0 %
-currenciesDisplayName.JOD=Jordanske dinarer
-currenciesDisplayName.BOV=Boliviansk mvdol
-currenciesDisplayName.XAU=Gull
-currenciesDisplayName.FOK=F\u00e6r\u00f8yske kronur
-currenciesDisplayName.LBP=Libanesiske pund
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Vietnamesiske dong
-currenciesDisplayName.TZS=Tanzanianske shilling
-currenciesDisplayName.BOP=Boliviansk pesos
-currenciesDisplayName.KHR=Kambodsjanske riel
-currenciesDisplayName.XAM=Asian Monetary Unit
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Kambodsjanske gamle riel
-currenciesDisplayName.ZMP=Zambiske pund
-currenciesDisplayName.AUP=Australske pund
-currenciesDisplayName.XAF=CFA Franc BEAC
-currenciesDisplayName.MTP=Maltesiske pund
-currenciesDisplayName.GHR=Ghanesiske revaluerte cedi
-currenciesDisplayName.ZMK=Zambiske kwacha
-currenciesDisplayName.XAD=Asian Dinar Unit of Account
-currenciesDisplayName.GHP=Ghanesiske pund
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Ghanesiske gamle cedi
-currenciesDisplayName.MTL=Maltesiske lira
-currenciesDisplayName.AUD=Australske dollar
-currenciesDisplayName.USS=Amerikanske dollar (samme dag)
-currenciesDisplayName.ITL=Italienske lire
-currenciesDisplayName.USN=Amerikanske dollar (neste dag)
-currenciesDisplayName.GHC=Ghanesiske cedi
-currenciesDisplayName.SGD=Singaporske dollar
-currenciesDisplayName.PAB=Panamanske balboa
-currenciesDisplayName.LAK=Laotiske kip
-currenciesDisplayName.KGS=Kirgisiske som
-currenciesDisplayName.CHF=Sveitsiske franc
-currenciesDisplayName.ATS=\u00d8sterrikske shilling
-currenciesDisplayName.USD=Amerikanske dollar
-currenciesDisplayName.ETD=Etiopiske dollar
-currenciesDisplayName.BND=Bruneiske dollar
-currenciesDisplayName.JMP=Jamaikanske pund
-currenciesDisplayName.ETB=Etiopiske birr
-currenciesDisplayName.DZG=Algeriske franc germinal
-currenciesDisplayName.DZF=Algeriske nye franc
-currenciesDisplayName.DZD=Algeriske dinarer
-currenciesDisplayName.PYG=Paraguayanske guarani
-currenciesDisplayName.LYP=Libyske pund
-currenciesDisplayName.JMD=Jamaikanske dollar
-currenciesDisplayName.ISK=Islandske kronar
-currenciesDisplayName.ESP=Spanske peseta
-currenciesDisplayName.BMP=Bermudiske pund
-currenciesDisplayName.LYD=Libyske dinarer
-currenciesDisplayName.LYB=Libyske British Military Authority-lira
-currenciesDisplayName.BMD=Bermudiske dollar
-currenciesDisplayName.NLG=Nederlandske gylden
-currenciesDisplayName.MRO=Mauritanske ouguiya
-currenciesDisplayName.IRR=Iranske rialer
-currenciesDisplayName.SEK=Svenske kroner
-currenciesDisplayName.ERN=Eritreiske nakfa
+currenciesDisplayName.YDD=Jemenittiske dinarer
+currenciesDisplayName.TWD=Taiwanske nye dollar
currenciesDisplayName.KES=Kenyanske shilling
-currenciesDisplayName.CFF=Sentralafrikanske franc (CFA)
+currenciesDisplayName.BYB=Hviterussiske nye rubler (1994-1999)
+currenciesDisplayName.LKR=Srilankiske rupier
+currenciesDisplayName.RWF=Rwandiske franc
+currenciesDisplayName.TJS=Tadsjikiske somoni
+currenciesDisplayName.SDP=Sudanesiske pund
+currenciesDisplayName.TJR=Tadsjikiske rubler
+currenciesDisplayName.ERN=Eritreiske nakfa
+currenciesDisplayName.AFN=Afghani
+currenciesDisplayName.GRD=Greske drakmer
+currenciesDisplayName.IEP=Irske pund
currenciesDisplayName.ARS=Argentinske pesos
+currenciesDisplayName.SDD=Sudanesiske dinarer
currenciesDisplayName.ARP=Argentinske pesos (1983-1985)
-currenciesDisplayName.ARM=Argentinske Peso Moneda Nacional
-currenciesDisplayName.TWD=Taiwanske nye dollar
-currenciesDisplayName.SDP=Sudanesiske pund
currenciesDisplayName.GEL=Georgiske lari
+currenciesDisplayName.AFA=Afghani (1927-2002)
currenciesDisplayName.GEK=Georgiske kupon larit
-currenciesDisplayName.MQF=Martinique-franc
+currenciesDisplayName.CRC=Costaricanske colon
currenciesDisplayName.FKP=Falklands\u00f8yene-pund
+currenciesDisplayName.EEK=Estiske kroon
+currenciesDisplayName.HKD=Hongkong-dollar
+currenciesDisplayName.MDL=Moldovske leu
currenciesDisplayName.ARA=Argentinske australer
-currenciesDisplayName.SDD=Sudanesiske dinarer
currenciesDisplayName.IQD=Irakske dinarer
-currenciesDisplayName.TVD=Tuvalske dollar
currenciesDisplayName.SCR=Seychelliske rupier
+currenciesDisplayName.VUV=Vanuatisk vatu
+currenciesDisplayName.DKK=Danske kroner
+currenciesDisplayName.KPW=Nordkoreanske won
+currenciesDisplayName.GQE=Ekvatorialguineanske ekwele guineana
+currenciesDisplayName.IDR=Indonesiske rupier
currenciesDisplayName.LVR=Latviske rubler
-currenciesDisplayName.FJP=Fijianske pund
+currenciesDisplayName.SOS=Somaliske shilling
+currenciesDisplayName.AED=UAE dirham
+currenciesDisplayName.BWP=Botswanske pula
currenciesDisplayName.LVL=Latviske lats
-currenciesDisplayName.CDL=Congolesiske zaire
-currenciesDisplayName.CDG=Kongolesiske republikk-franc
-currenciesDisplayName.CDF=Kongolesiske franc (congolais)
-currenciesDisplayName.FJD=Fijianske dollar
+currenciesDisplayName.RUR=Russiske rubler (1991-1998)
currenciesDisplayName.NIO=Nicaraguanske cordoba oro
+currenciesDisplayName.ADP=Andorranske pesetas
+currenciesDisplayName.FJD=Fijianske dollar
currenciesDisplayName.MOP=Makaoske pataca
-currenciesDisplayName.NIG=Nicaraguanske gullcordoba
+currenciesDisplayName.RUB=Russiske rubler
+currenciesDisplayName.CDF=Kongolesiske franc (congolais)
currenciesDisplayName.NIC=Nicaraguanske cordoba
-currenciesDisplayName.XTR=COMECON Transferable Ruble
-currenciesDisplayName.FIN=Finske mark (1860-1962)
-currenciesDisplayName.FIM=Finske mark
+currenciesDisplayName.DJF=Djiboutiske franc
+currenciesDisplayName.ECV=Ecuadorianske Unidad de Valor Constante (UVC)
currenciesDisplayName.SBD=Salomonske dollar
+currenciesDisplayName.UZS=Usbekiske sum
+currenciesDisplayName.ECS=Ecuadorianske sucre
+currenciesDisplayName.PHP=Filippinske pesos
+currenciesDisplayName.THB=Thailandske baht
currenciesDisplayName.LUF=Luxemburgske franc
-currenciesDisplayName.TTO=Trinidadiske gamle dollar
-currenciesDisplayName.AOS=Angolanske escudo
-currenciesDisplayName.AOR=Angolan Kwanza Reajustado (1995-1999)
-currenciesDisplayName.MNT=Mongolske tugrik
-currenciesDisplayName.HUF=Ungarske forinter
-currenciesDisplayName.BIF=Burundiske franc
-currenciesDisplayName.AON=Angolanske ny kwanza (1990-2000)
-currenciesDisplayName.AOK=Angolanske kwanza (1977-1990)
+currenciesDisplayName.FIM=Finske mark
currenciesDisplayName.TTD=Trinidadiske dollar
currenciesDisplayName.SZL=Swazilandske lilangeni
-currenciesDisplayName.NHF=Ny-hebridene CFP-franc
-currenciesDisplayName.GBP=Britiske pund sterling
-currenciesDisplayName.SAS=Saudiarabiske riyaler (1936-1952)
+currenciesDisplayName.MNT=Mongolske tugrik
currenciesDisplayName.SAR=Saudiarabiske riyaler
+currenciesDisplayName.UAK=Ukrainske karbovanetz
+currenciesDisplayName.UAH=Ukrainsle hryvnia
+currenciesDisplayName.HUF=Ungarske forinter
+currenciesDisplayName.COP=Colombianske pesos
+currenciesDisplayName.QAR=Qatarske riyaler
currenciesDisplayName.LTT=Litauiske talonas
-currenciesDisplayName.INR=Indiske rupier
currenciesDisplayName.PTE=Portugisiske escudo
-currenciesDisplayName.AOA=Angolanske kwanza
-currenciesDisplayName.PTC=Portugisiske conto
+currenciesDisplayName.AOR=Angolan Kwanza Reajustado (1995-1999)
+currenciesDisplayName.UYU=Uruguayanske peso uruguayo
+currenciesDisplayName.GBP=Britiske pund sterling
+currenciesDisplayName.BIF=Burundiske franc
+currenciesDisplayName.INR=Indiske rupier
+currenciesDisplayName.ZRZ=Zairiske zaire
+currenciesDisplayName.AON=Angolanske ny kwanza (1990-2000)
currenciesDisplayName.LTL=Litauiske lita
+currenciesDisplayName.XFU=French UIC-Franc
currenciesDisplayName.KZT=Kasakhstanske tenge
-currenciesDisplayName.KZR=Kasakhstanske rubler
-currenciesDisplayName.VGD=De britiske jomfru\u00f8yene-dollar
-currenciesDisplayName.NGP=Nigerianske pund
-currenciesDisplayName.MMX=Myanmarske dollar (FEC)
+currenciesDisplayName.MZM=Mosambikiske metical
+currenciesDisplayName.UYP=Uruguayanske pesos (1975-1993)
+currenciesDisplayName.AOK=Angolanske kwanza (1977-1990)
+currenciesDisplayName.BUK=Burmesiske kyat
+currenciesDisplayName.GNS=Guineanske syli
+currenciesDisplayName.XFO=French Gold Franc
+currenciesDisplayName.PGK=Papuanske kina
+currenciesDisplayName.SYP=Syriske pund
+currenciesDisplayName.MZE=Mosambikiske escudo
+currenciesDisplayName.OMR=Omanske rialer
currenciesDisplayName.NGN=Nigerianske naira
+currenciesDisplayName.ZRN=Zairiske nye zaire
+currenciesDisplayName.AOA=Angolanske kwanza
+currenciesDisplayName.CNY=Kinesiske Yuan Renminbi
+currenciesDisplayName.MAF=Marokkanske franc
+currenciesDisplayName.GNF=Guineanske franc
currenciesDisplayName.HTG=Haitiske gourde
-currenciesDisplayName.SYP=Syriske pund
-currenciesDisplayName.PSP=Palestinske pund
-currenciesDisplayName.BHD=Bahrainske dinarer
+currenciesDisplayName.MAD=Marokkanske dirham
+currenciesDisplayName.TRY=Ny tyrkisk lire
currenciesDisplayName.MMK=Myanmarske kyat
+currenciesDisplayName.MYR=Malaysiske ringgit
+currenciesDisplayName.LSL=Lesothiske loti
+currenciesDisplayName.XEU=European Currency Unit
+currenciesDisplayName.BHD=Bahrainske dinarer
+currenciesDisplayName.SLL=Sierraleonske leone
+currenciesDisplayName.BTN=Bhutanske ngultrum
+currenciesDisplayName.TRL=Tyrkiske lira
+currenciesDisplayName.KMF=Komoriske franc
currenciesDisplayName.ANG=Nederlandske antillegylden
currenciesDisplayName.CZK=Tsjekkiske koruna
-currenciesDisplayName.IMP=Manske pund sterling
-currenciesDisplayName.BGX=Bulgarske lev (FEC)
-currenciesDisplayName.LSL=Lesothiske loti
-currenciesDisplayName.GAF=Gabonske franc (CFA)
-currenciesDisplayName.BGO=Bulgarske lev (1879-1952)
+currenciesDisplayName.AZM=Aserbajdsjanske Manat
+currenciesDisplayName.KYD=Caymanske dollar
+currenciesDisplayName.GMD=Gambiske dalasi
currenciesDisplayName.BGN=Bulgarske lev
-currenciesDisplayName.BGM=Bulgarske sosialist-lev
currenciesDisplayName.CAD=Kanadiske dollar
+currenciesDisplayName.MXV=Meksikanske Unidad de Inversion (UDI)
currenciesDisplayName.BGL=Bulgarske lev (hard)
-currenciesDisplayName.TRL=Tyrkiske lira
-currenciesDisplayName.KYD=Caymanske dollar
-currenciesDisplayName.CYP=Kypriotiske pund
+currenciesDisplayName.VEB=Venezuelanske bolivar
+currenciesDisplayName.MLF=Maliske franc
currenciesDisplayName.ILS=Israelske nye shekler
+currenciesDisplayName.MXP=Meksikanske s\u00f8lvpesos (1861-1992)
+currenciesDisplayName.PES=Peruvianske sol
currenciesDisplayName.GYD=Guyanske dollar
-currenciesDisplayName.AMD=Armenske dram
+currenciesDisplayName.MXN=Meksikanske pesos
currenciesDisplayName.ILP=Israelske pund
-currenciesDisplayName.MLF=Maliske franc
-currenciesDisplayName.ILL=Israelske shekler
-currenciesDisplayName.VEB=Venezuelanske bolivar
-currenciesDisplayName.ALX=Albanske dollar (FEC)
+currenciesDisplayName.SKK=Slovakiske koruna
+currenciesDisplayName.CYP=Kypriotiske pund
+currenciesDisplayName.XDR=Special Drawing Rights
+currenciesDisplayName.PEN=Peruvianske sol nuevo
currenciesDisplayName.LRD=Liberiske dollar
-currenciesDisplayName.ALV=Albanske lek valute
+currenciesDisplayName.PEI=Peruvianske inti
+currenciesDisplayName.AMD=Armenske dram
+currenciesDisplayName.BSD=Bahamske dollar
currenciesDisplayName.HRK=Kroatiske kuna
-currenciesDisplayName.REF=Reunionske franc
+currenciesDisplayName.CLP=Chilenske pesos
currenciesDisplayName.HRD=Kroatiske dinarer
-currenciesDisplayName.ALL=Albanske lek
-currenciesDisplayName.JEP=Jersey pund sterling
-currenciesDisplayName.ALK=Albanske lek (1946-1961)
-currenciesDisplayName.MKN=Makedonske denarer (1992-1993)
-currenciesDisplayName.VDP=Nordvietnamesiske viet minh piastre dong viet
-currenciesDisplayName.VDN=Nordvietnamesiske nye dong
-currenciesDisplayName.MKD=Makedonske denarer
-currenciesDisplayName.VDD=Nordvietnamesiske piastre dong viet
-currenciesDisplayName.TPP=Timoresiske pataca
currenciesDisplayName.XPF=CFP Franc
-currenciesDisplayName.BEL=Belgiske franc (\u00f8konomiske)
-currenciesDisplayName.GWP=Guinea-Bissau-pesos
-currenciesDisplayName.KWD=Kuwaitiske dinarer
-currenciesDisplayName.GWM=Portugisiske Guinea Mil Reis
-currenciesDisplayName.BEF=Belgiske franc
+currenciesDisplayName.FRF=Franske franc
+currenciesDisplayName.BRR=Brasilianske cruzeiro
+currenciesDisplayName.MKD=Makedonske denarer
+currenciesDisplayName.CLF=Chilenske Unidades de Fomento
+currenciesDisplayName.ALL=Albanske lek
+currenciesDisplayName.BRN=Brasilianske cruzado novo
+currenciesDisplayName.MWK=Malawisle kwacha
+currenciesDisplayName.BRL=Brasilianske realer
currenciesDisplayName.TPE=Timoresiske escudo
-currenciesDisplayName.BEC=Belgiske franc (konvertible)
-currenciesDisplayName.GWE=Portugisiske guinea escudo
+currenciesDisplayName.BRE=Brasilianske cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Brasilianske cruzado
+currenciesDisplayName.BRB=Brasiliansk cruzeiro novo (1967-1986)
+currenciesDisplayName.DEM=Tyske mark
+currenciesDisplayName.KWD=Kuwaitiske dinarer
+currenciesDisplayName.XCD=\u00d8stkaribiske dollar
+currenciesDisplayName.NPR=Nepalesiske rupier
+currenciesDisplayName.GWP=Guinea-Bissau-pesos
+currenciesDisplayName.YUN=Jugoslaviske konvertible dinarer
currenciesDisplayName.SVC=Salvadoranske colon
-currenciesDisplayName.CWG=Curacao-gylden
-currenciesDisplayName.BDT=Bangladeshiske taka
-currenciesDisplayName.TOS=Tonganske pund sterling
-currenciesDisplayName.TOP=Tonganske pa\u02bbanga
+currenciesDisplayName.YUM=Jugoslaviske noviy-dinarer
+currenciesDisplayName.BEL=Belgiske franc (\u00f8konomiske)
+currenciesDisplayName.SIT=Slovenske tolar
+currenciesDisplayName.JPY=Japanske yen
currenciesDisplayName.XOF=CFA Franc BCEAO
+currenciesDisplayName.MVR=Maldiviske rufiyaa
+currenciesDisplayName.GWE=Portugisiske guinea escudo
+currenciesDisplayName.BEF=Belgiske franc
+currenciesDisplayName.TOP=Tonganske pa\u02bbanga
+currenciesDisplayName.YUD=Jugoslaviske dinarer (hard)
+currenciesDisplayName.BEC=Belgiske franc (konvertible)
currenciesDisplayName.SUR=Sovjetiske rubler
-currenciesDisplayName.SUN=Sovjetiske nye rubler
-currenciesDisplayName.NCF=Kaledonske franc germinal
-currenciesDisplayName.CVE=Kappverdiske escudo
-currenciesDisplayName.XNF=Franske antiller-franc (CFA)
+currenciesDisplayName.ROL=Rumenske leu
+currenciesDisplayName.DDM=\u00d8sttyske ostmark
+currenciesDisplayName.BDT=Bangladeshiske taka
+currenciesDisplayName.XBD=European Unit of Account (XBD)
+currenciesDisplayName.AWG=Arubiske gylden
+currenciesDisplayName.XBC=European Unit of Account (XBC)
+currenciesDisplayName.XBB=European Monetary Unit
+currenciesDisplayName.XBA=European Composite Unit
+currenciesDisplayName.NOK=Norske kroner
+currenciesDisplayName.MUR=Mauritiske rupier
currenciesDisplayName.ZAR=S\u00f8rafrikanske rand
-currenciesDisplayName.DOP=Dominikanske pesos
-currenciesDisplayName.CUX=Kubanske Foreign Exchange Certificates
-currenciesDisplayName.ZAP=S\u00f8rafrikanske pund
+currenciesDisplayName.SHP=Sankthelenske pund
+currenciesDisplayName.XAU=Gull
currenciesDisplayName.ZAL=S\u00f8rafrikanske rand (\u00f8konomisk)
+currenciesDisplayName.VND=Vietnamesiske dong
+currenciesDisplayName.TZS=Tanzanianske shilling
+currenciesDisplayName.GIP=Gibraltarske pund
currenciesDisplayName.TND=Tunisiske dinarer
-currenciesDisplayName.CUP=Kubanske pesos
-currenciesDisplayName.GUF=Fransk Guyana-franc guiana
+currenciesDisplayName.CVE=Kappverdiske escudo
currenciesDisplayName.UGX=Ugandiske shilling
-currenciesDisplayName.LNR=Ceylonske rupier
-currenciesDisplayName.AIF=Affar og Issa franc
-currenciesDisplayName.VAL=Vatikanstatens lira
-currenciesDisplayName.STE=Sao Tome og Principe-escudo
+currenciesDisplayName.ZMK=Zambiske kwacha
+currenciesDisplayName.JOD=Jordanske dinarer
+currenciesDisplayName.XAF=CFA Franc BEAC
+currenciesDisplayName.LBP=Libanesiske pund
currenciesDisplayName.UGS=Ugandiske shilling (1966-1987)
currenciesDisplayName.STD=Sao Tome og Principe-dobra
-currenciesDisplayName.MHD=Marshall\u00f8yene-dollar
-currenciesDisplayName.NZP=Nyzealandske pund
currenciesDisplayName.WST=Vestsamoisk tala
-currenciesDisplayName.WSP=Vestsamoisk pund
-currenciesDisplayName.HNL=Hoduras Lempira
-currenciesDisplayName.XMF=French Metropolitan Nouveau Franc
+currenciesDisplayName.KHR=Kambodsjanske riel
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Dominikanske pesos
+currenciesDisplayName.BOV=Boliviansk mvdol
+currenciesDisplayName.MTP=Maltesiske pund
+currenciesDisplayName.USS=Amerikanske dollar (samme dag)
+currenciesDisplayName.BOP=Boliviansk pesos
+currenciesDisplayName.MTL=Maltesiske lira
+currenciesDisplayName.CUP=Kubanske pesos
currenciesDisplayName.TMM=Turkmenske manat
-currenciesDisplayName.GTQ=Guatemalanske quetzal
+currenciesDisplayName.USN=Amerikanske dollar (neste dag)
+currenciesDisplayName.SGD=Singaporske dollar
currenciesDisplayName.NZD=Nyzealandske dollar
-currenciesDisplayName.SSP=Skotske pund
-currenciesDisplayName.BBD=Barbadisk dollar
+currenciesDisplayName.USD=Amerikanske dollar
+currenciesDisplayName.HNL=Hoduras Lempira
+currenciesDisplayName.BOB=Boliviano
+currenciesDisplayName.ITL=Italienske lire
+currenciesDisplayName.PAB=Panamanske balboa
+currenciesDisplayName.GTQ=Guatemalanske quetzal
+currenciesDisplayName.LAK=Laotiske kip
+currenciesDisplayName.GHC=Ghanesiske cedi
+currenciesDisplayName.AUD=Australske dollar
currenciesDisplayName.NAD=Namibiske dollar
+currenciesDisplayName.KGS=Kirgisiske som
currenciesDisplayName.MGF=Madagassiske franc
+currenciesDisplayName.CHF=Sveitsiske franc
+currenciesDisplayName.BBD=Barbadisk dollar
currenciesDisplayName.MGA=Madagassiske ariary
-currenciesDisplayName.EGP=Egyptiske pund
-currenciesDisplayName.BZH=Britisk Honduras-dollar
+currenciesDisplayName.PYG=Paraguayanske guarani
currenciesDisplayName.PLZ=Polske zloty (1950-1995)
-currenciesDisplayName.BAN=Bosnia-Hercegovina nye dinarer
-currenciesDisplayName.PLX=Polske US dollar (FEC)
-currenciesDisplayName.BAM=Bosnia-Hercegovina mark (konvertible)
-currenciesDisplayName.BZD=Beliziske dollar
-currenciesDisplayName.BAD=Bosnia-Hercegovina dinarer
-currenciesDisplayName.PLN=Polske zloty
currenciesDisplayName.YER=Jemenittiske rialer
+currenciesDisplayName.ATS=\u00d8sterrikske shilling
+currenciesDisplayName.ETB=Etiopiske birr
+currenciesDisplayName.BND=Bruneiske dollar
+currenciesDisplayName.JMD=Jamaikanske dollar
+currenciesDisplayName.EGP=Egyptiske pund
+currenciesDisplayName.PLN=Polske zloty
+currenciesDisplayName.DZD=Algeriske dinarer
+currenciesDisplayName.ISK=Islandske kronar
currenciesDisplayName.SRG=Surinamske gylden
-currenciesDisplayName.CSK=Tsjekkoslovakiske koruna (hard)
+currenciesDisplayName.LYD=Libyske dinarer
+currenciesDisplayName.BZD=Beliziske dollar
+currenciesDisplayName.BAM=Bosnia-Hercegovina mark (konvertible)
+currenciesDisplayName.ESP=Spanske peseta
currenciesDisplayName.KRW=S\u00f8rkoreanske won
+currenciesDisplayName.NLG=Nederlandske gylden
+currenciesDisplayName.MRO=Mauritanske ouguiya
+currenciesDisplayName.BAD=Bosnia-Hercegovina dinarer
+currenciesDisplayName.ZWD=Zimbabwiske dollar
+currenciesDisplayName.SEK=Svenske kroner
+currenciesDisplayName.CSK=Tsjekkoslovakiske koruna (hard)
currenciesDisplayName.BYR=Hviterussiske rubler
-currenciesDisplayName.YEI=Jemenittiske imadi-riyaler
-currenciesDisplayName.BYL=Hviterussiske rubler (1992-1994)
-currenciesDisplayName.CSC=Tsjekkoslovakiske koruna
-currenciesDisplayName.KRO=S\u00f8rkoreanske gamle won
-currenciesDisplayName.KRH=S\u00f8rkoreanske hwan
-currenciesDisplayName.BYB=Hviterussiske nye rubler (1994-1999)
-currenciesDisplayName.SQS=Somalilandske shilling
-currenciesDisplayName.GRN=Greske nye drakmer
+currenciesDisplayName.IRR=Iranske rialer
currenciesDisplayName.PKR=Pakistanske rupier
-currenciesDisplayName.AFN=Afghani
-currenciesDisplayName.ZWD=Zimbabwiske dollar
-currenciesDisplayName.LKR=Srilankiske rupier
-currenciesDisplayName.GRD=Greske drakmer
-currenciesDisplayName.IEP=Irske pund
-currenciesDisplayName.AFA=Afghani (1927-2002)
-currenciesDisplayName.YDD=Jemenittiske dinarer
-currenciesDisplayName.RWF=Rwandiske franc
-currenciesDisplayName.CRC=Costaricanske colon
-currenciesDisplayName.TJS=Tadsjikiske somoni
-currenciesDisplayName.TJR=Tadsjikiske rubler
-currenciesDisplayName.EEK=Estiske kroon
-currenciesDisplayName.GQP=Ekvatorialguineanske peseta guineana
-currenciesDisplayName.MDR=Moldovske ruble cupon
-currenciesDisplayName.HKD=Hongkong-dollar
-currenciesDisplayName.DKK=Danske kroner
-currenciesDisplayName.MDL=Moldovske leu
-currenciesDisplayName.GQF=Ekvatorialguineanske franco
-currenciesDisplayName.GQE=Ekvatorialguineanske ekwele guineana
-currenciesDisplayName.IDR=Indonesiske rupier
-currenciesDisplayName.AED=UAE dirham
-currenciesDisplayName.KPW=Nordkoreanske won
-currenciesDisplayName.IDN=Indonesiske nye rupier
-currenciesDisplayName.BWP=Botswanske pula
-currenciesDisplayName.MDC=Moldovske leu cupon
-currenciesDisplayName.IDJ=Indonesiske Java-rupier
-currenciesDisplayName.KPP=Nordkoreanske won (1947-1959)
-currenciesDisplayName.IDG=Indonesiske nica-gylden
-currenciesDisplayName.VUV=Vanuatisk vatu
-currenciesDisplayName.XID=Islamske dinarer
-currenciesDisplayName.SOS=Somaliske shilling
-currenciesDisplayName.ADP=Andorranske pesetas
-currenciesDisplayName.RUR=Russiske rubler (1991-1998)
-currenciesDisplayName.GPF=Guadeloupe-franc
-currenciesDisplayName.DJF=Djiboutiske franc
-currenciesDisplayName.ADD=Andorranske dinarer
-currenciesDisplayName.MCG=Monegaskiske franc germinal
-currenciesDisplayName.MCF=Monegaskiske franc nouveau
-currenciesDisplayName.ECV=Ecuadorianske Unidad de Valor Constante (UVC)
-currenciesDisplayName.ECS=Ecuadorianske sucre
-currenciesDisplayName.LIF=Liechtensteinske franc
-currenciesDisplayName.RUB=Russiske rubler
-currenciesDisplayName.PHP=Filippinske pesos
-currenciesDisplayName.UZS=Usbekiske sum
-currenciesDisplayName.COP=Colombianske pesos
-currenciesDisplayName.THB=Thailandske baht
-currenciesDisplayName.IBP=Nordirske pund
-currenciesDisplayName.BUR=Burmesiske rupier
-currenciesDisplayName.COF=Kongolesiske franc (CFA)
-currenciesDisplayName.BUK=Burmesiske kyat
-currenciesDisplayName.COB=Colombianske papir-pesos
-currenciesDisplayName.UZC=Usbekiske kupong-som
-currenciesDisplayName.UAK=Ukrainske karbovanetz
-currenciesDisplayName.QAR=Qatarske riyaler
-currenciesDisplayName.UAH=Ukrainsle hryvnia
-currenciesDisplayName.GNS=Guineanske syli
-currenciesDisplayName.CNY=Kinesiske Yuan Renminbi
-currenciesDisplayName.MZM=Mosambikiske metical
-currenciesDisplayName.CNX=Kinesiske US dollar (FEC)
-currenciesDisplayName.UYU=Uruguayanske peso uruguayo
-currenciesDisplayName.GNI=Guineanske franc (1960-1972)
-currenciesDisplayName.SML=Sanmarinske lira
-currenciesDisplayName.CNP=Kinesiske Jen Min Piao Yuan
-currenciesDisplayName.MZE=Mosambikiske escudo
-currenciesDisplayName.GNF=Guineanske franc
-currenciesDisplayName.OMS=Omanske rial saidi
-currenciesDisplayName.PGK=Papuanske kina
-currenciesDisplayName.OMR=Omanske rialer
-currenciesDisplayName.UYP=Uruguayanske pesos (1975-1993)
-currenciesDisplayName.XFU=French UIC-Franc
-currenciesDisplayName.BTR=Bhutanske rupier
-currenciesDisplayName.ZRZ=Zairiske zaire
-currenciesDisplayName.MAF=Marokkanske franc
-currenciesDisplayName.MAD=Marokkanske dirham
-currenciesDisplayName.BTN=Bhutanske ngultrum
-currenciesDisplayName.XFO=French Gold Franc
-currenciesDisplayName.UYF=Uruguayanske peso fuerte
-currenciesDisplayName.MYR=Malaysiske ringgit
-currenciesDisplayName.ZRN=Zairiske nye zaire
-currenciesDisplayName.AZM=Aserbajdsjanske Manat
-currenciesDisplayName.GMP=Gambiske pund
-currenciesDisplayName.KMF=Komoriske franc
-currenciesDisplayName.SLL=Sierraleonske leone
-currenciesDisplayName.GMD=Gambiske dalasi
-currenciesDisplayName.XEU=European Currency Unit
-currenciesDisplayName.BSP=Bahamske pund
-currenciesDisplayName.CMF=Kamerunske franc (CFA)
-currenciesDisplayName.MXV=Meksikanske Unidad de Inversion (UDI)
-currenciesDisplayName.XEF=CFA Franc BCEAEC
-currenciesDisplayName.BSD=Bahamske dollar
-currenciesDisplayName.MXP=Meksikanske s\u00f8lvpesos (1861-1992)
-currenciesDisplayName.MXN=Meksikanske pesos
-currenciesDisplayName.PES=Peruvianske sol
-currenciesDisplayName.GLK=Gr\u00f8nlandske kroner
-currenciesDisplayName.BRZ=Brasilianske cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Peruvianske sol nuevo
-currenciesDisplayName.CLP=Chilenske pesos
-currenciesDisplayName.SKK=Slovakiske koruna
-currenciesDisplayName.PEI=Peruvianske inti
-currenciesDisplayName.BRR=Brasilianske cruzeiro
-currenciesDisplayName.XDR=Special Drawing Rights
-currenciesDisplayName.FRG=Franske franc (Germinal/Franc Poincare)
-currenciesDisplayName.FRF=Franske franc
-currenciesDisplayName.BRN=Brasilianske cruzado novo
-currenciesDisplayName.CLF=Chilenske Unidades de Fomento
-currenciesDisplayName.CLE=Chilenske escudo
-currenciesDisplayName.BRL=Brasilianske realer
-currenciesDisplayName.CLC=Chilenske condor
-currenciesDisplayName.BRE=Brasilianske cruzeiro (1990-1993)
-currenciesDisplayName.DES=Tyske sperrmark
-currenciesDisplayName.MWP=Malawiske pund
-currenciesDisplayName.BRC=Brasilianske cruzado
-currenciesDisplayName.BRB=Brasiliansk cruzeiro novo (1967-1986)
-currenciesDisplayName.MWK=Malawisle kwacha
-currenciesDisplayName.PDR=Transdniestrianske rubler
-currenciesDisplayName.DEM=Tyske mark
-currenciesDisplayName.TDF=Tsjadiske franc (CFA)
-currenciesDisplayName.PDN=Transdniestrianske nye rubler
-currenciesDisplayName.PDK=Transdniestriansk rubler (kupon)
-currenciesDisplayName.NPR=Nepalesiske rupier
-currenciesDisplayName.CKD=Cook\u00f8yene dollar
-currenciesDisplayName.JPY=Japanske yen
-currenciesDisplayName.MVR=Maldiviske rufiyaa
-currenciesDisplayName.XCF=CFA Nouveau Franc
-currenciesDisplayName.MVP=Maldiviske rupier
-currenciesDisplayName.XCD=\u00d8stkaribiske dollar
-currenciesDisplayName.SIT=Slovenske tolar
-currenciesDisplayName.YUR=Jugoslaviske reforerte dinarer
-currenciesDisplayName.AWG=Arubiske gylden
-currenciesDisplayName.YUO=Jugoslaviske oktoberdinarer
-currenciesDisplayName.DDM=\u00d8sttyske ostmark
-currenciesDisplayName.YUN=Jugoslaviske konvertible dinarer
-currenciesDisplayName.YUM=Jugoslaviske noviy-dinarer
-currenciesDisplayName.TCC=Turks- og Caicos\u00f8yene-crown
-currenciesDisplayName.YUG=Jugoslaviske 1994-dinarer
-currenciesDisplayName.YUF=Jugoslaviske f\u00f8derasjonen-dinarer
-currenciesDisplayName.RON=Rumenske nye leu
-currenciesDisplayName.YUD=Jugoslaviske dinarer (hard)
-currenciesDisplayName.ROL=Rumenske leu
-currenciesDisplayName.SIB=Slovenske tolar bons
-currenciesDisplayName.NOK=Norske kroner
-currenciesDisplayName.MUR=Mauritiske rupier
-currenciesDisplayName.XBD=European Unit of Account (XBD)
-currenciesDisplayName.GIP=Gibraltarske pund
-currenciesDisplayName.VNS=Vietnamesiske nasjonale dong
-currenciesDisplayName.XBC=European Unit of Account (XBC)
-currenciesDisplayName.VNR=Vietnamesiske republikk-dong
-currenciesDisplayName.XBB=European Monetary Unit
-currenciesDisplayName.XBA=European Composite Unit
-currenciesDisplayName.KID=Kiribatiske dollar
-currenciesDisplayName.SHP=Sankthelenske pund
-currenciesDisplayName.VNN=Vietnamesiske nye dong
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Bermudiske dollar
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=kr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.CNP=CNP
-currenciesSymbol.MZE=MZE
currenciesSymbol.GNF=GF
-currenciesSymbol.OMS=OMS
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=kr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
-shortMonths=jan®feb®mar®apr®mai®jun®jul®aug®sep®okt®nov®des®®
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
+shortMonths=jan.®feb.®mars®april®mai®juni®juli®aug.®sep.®okt.®nov.®des.®®
months=januar®februar®mars®april®mai®juni®juli®august®september®oktober®november®desember®®
-shortWeekdays=®s\u00f8n.®man.®tir.®ons.®tor.®fre.®l\u00f8r.®
+shortWeekdays=®s\u00f8.®ma.®ti.®on.®to.®fr.®l\u00f8.®
weekdays=®s\u00f8ndag®mandag®tirsdag®onsdag®torsdag®fredag®l\u00f8rdag®
minNumberOfDaysInFirstWeek=4
firstDayOfWeek=mon
eras=f.Kr.®e.Kr.®
+ampms=a.m.®p.m.®
shortDateFormat=dd.MM.yy
mediumDateFormat=d. MMM. yyyy
longDateFormat=d. MMMM yyyy
@@ -867,6 +457,7 @@ territories.CX=Christmas\u00f8ya
territories.CV=Kapp Verde
territories.PA=Panama
territories.CU=Cuba
+territories.CS=Serbia og Montenegro
territories.CR=Costa Rica
territories.CO=Colombia
territories.CN=Kina
@@ -937,17 +528,16 @@ territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauritania
territories.AG=Antigua og Barbuda
-territories.MQ=Martinique
territories.AF=Afghanistan
-territories.MP=Nord-Marianene
+territories.MQ=Martinique
territories.AE=De forente arabiske emiratene
-territories.MO=Macao S.A.R. (Kina)
+territories.MP=Nord-Marianene
territories.AD=Andorra
+territories.MO=Macao S.A.R. (Kina)
territories.MN=Mongolia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Makedonia, Republikken
-territories.YU=Jugoslavia
territories.YT=Mayotte
territories.MH=Marshall\u00f8yene
territories.MG=Madagaskar
@@ -1018,10 +608,9 @@ territories.TR=Tyrkia
territories.TO=Tonga
territories.TN=Tunisia
territories.TM=Turkmenistan
-languages.gwi=gwich\u02bbin
languages.akk=akkadisk
+languages.gwi=gwich\u02bcin
languages.eka=ekajuk
-languages.ijo=ijo
languages.xh=xhosa
languages.sux=sumerisk
languages.sus=susu
@@ -1032,20 +621,19 @@ languages.pon=ponapisk
languages.min=minangkabau
languages.suk=sukuma
languages.wo=wolof
-languages.lol=mongo
languages.kut=kutenai
+languages.lol=mongo
languages.mic=micmac
languages.wa=vallonsk
languages.kum=kumyk
languages.zap=zapotec
languages.cus=kusjitisk (annet)
-languages.jbo=lojban
languages.doi=dogri
+languages.jbo=lojban
languages.vo=volapyk
languages.oto=otomisk spr\u00e5k
languages.vi=vietnamesisk
-languages.vai=vai
-languages.rar=rarotongan
+languages.rar=rarotongansk
languages.ve=venda
languages.rap=rapanui
languages.raj=rajasthani
@@ -1054,8 +642,8 @@ languages.nzi=nzima
languages.nap=napolitansk
languages.uz=usbekisk
languages.uga=ugaritisk
-languages.tmh=tamashek
-languages.nai=nordamerikansk indiansk (annet)
+languages.tmh=tamasjek
+languages.nai=nordamerikansk indiansk
languages.nah=nahuatl
languages.ur=urdu
languages.fat=fanti
@@ -1064,8 +652,8 @@ languages.egy=egyptisk (historisk)
languages.ug=uigurisk
languages.fan=fang
languages.ssa=nilo-saharam (annet)
-languages.mga=mellomirsk (900-1200)
languages.bat=baltisk (annet)
+languages.mga=mellomirsk (900-1200)
languages.nyo=nyoro
languages.bas=basa
languages.nyn=nyankole
@@ -1093,8 +681,8 @@ languages.kru=kurukh
languages.tg=tatsjikisk
languages.byn=blin
languages.te=telugu
-languages.kro=kru
languages.csb=kasjubisk
+languages.kro=kru
languages.ta=tamil
languages.tkl=tokelau
languages.efi=efik
@@ -1118,8 +706,8 @@ languages.sk=slovakisk
languages.grb=grebo
languages.si=singalesisk
languages.sh=serbokroatisk
-languages.crh=krimtyrkisk, krimtatarisk
languages.afa=afroasiatisk (annet)
+languages.crh=krimtatarisk
languages.sg=sango
languages.se=nordsamisk
languages.sd=sindhi
@@ -1133,7 +721,6 @@ languages.ro=rumensk
languages.rn=rundi
languages.rm=retoromansk
languages.mdf=moksha
-languages.tiv=tiv
languages.ady=adyghe
languages.zun=zuni
languages.kpe=kpelle
@@ -1143,14 +730,14 @@ languages.son=songhai
languages.cpp=kreolsk og pidgin, portugisiskbasert (annet)
languages.sog=sogdisk
languages.ada=adangme
-languages.kos=kosraeansk
-languages.hit=hettittisk
languages.cpf=kreolsk og pidgin, franskbasert (annet)
+languages.hit=hettittisk
+languages.kos=kosraeansk
languages.cpe=kreolsk og pidgin, engelskbasert (annet)
languages.him=himachali
-languages.kok=konkani
-languages.hil=hiligaynon
languages.got=gotisk
+languages.hil=hiligaynon
+languages.kok=konkani
languages.gor=gorontalo
languages.gon=gondi
languages.din=dinka
@@ -1164,10 +751,9 @@ languages.snk=soninke
languages.cop=koptisk
languages.yap=yapesisk
languages.ach=acoli
-languages.yao=yao
languages.phi=filippinsk (annet)
languages.pl=polsk
-languages.ace=akinesisk
+languages.ace=achinesisk
languages.pi=pali
languages.pa=panjabi
languages.bug=buginesisk
@@ -1191,7 +777,7 @@ languages.mad=maduresisk
languages.sma=s\u00f8rsamisk
languages.oc=oksitansk (etter 1500)
languages.nso=sotho, nord
-languages.btk=batak
+languages.btk=batak (Indonesia)
languages.myv=erzya
languages.dgr=dogrib
languages.ny=nyanja
@@ -1221,21 +807,21 @@ languages.ms=malayisk
languages.mr=marathi
languages.fro=gammelfransk (842 til ca.1400)
languages.mo=moldavisk
-languages.frm=mellomfransk (ca.1400-1600)
languages.mn=mongolsk
-languages.jrb=j\u00f8dearabisk
+languages.frm=mellomfransk (ca.1400-1600)
languages.ml=malayalam
+languages.jrb=j\u00f8dearabisk
languages.mk=makedonsk
languages.mi=maori
languages.mh=marshallesisk
languages.mg=madagassisk
languages.mwr=marwari
languages.bra=braj
-languages.den=slavisk
languages.lv=latvisk
+languages.den=slavisk (athapaskansk)
languages.lu=luba-katanga
-languages.del=delaware
languages.lt=litauisk
+languages.del=delaware
languages.lo=laotisk
languages.ln=lingala
languages.li=limburgisk
@@ -1275,7 +861,6 @@ languages.jv=javanesisk
languages.gil=kiribatisk; gilbertesisk
languages.znd=zande
languages.shn=shan
-languages.fon=fon
languages.xal=kalmyk
languages.aus=australsk spr\u00e5k
languages.kho=khotanesisk
@@ -1288,38 +873,38 @@ languages.iu=inuktitut
languages.pap=papiamento
languages.it=italiensk
languages.sgn=tegnspr\u00e5k
-languages.is=islandsk
languages.kha=khasi
+languages.is=islandsk
languages.chr=cherokee
languages.pam=pampanga
languages.pal=pahlavi
languages.chp=chipewiansk
-languages.io=ido
languages.cho=choctaw
+languages.io=ido
languages.chn=chinook
languages.chm=mari
languages.tyv=tuvinisk
languages.bnt=bantu
languages.pag=pangasinan
-languages.ik=unupiak
languages.chk=chuukesisk
-languages.ii=sichuan-yi
+languages.ik=unupiak
languages.haw=hawaiisk
+languages.ii=sichuan-yi
languages.lam=lamba
-languages.ig=ibo
languages.chg=chagatai
+languages.ig=ibo
languages.sga=gammelirsk (til 900)
languages.paa=papuisk (annet)
languages.ie=interlingue
languages.id=indonesisk
languages.lah=lahnda
-languages.day=dayak
languages.chb=chibcha
+languages.day=dayak
languages.ia=interlingua
languages.lad=ladinsk
-languages.hz=herero
-languages.hai=haida
languages.dar=dargwa
+languages.hai=haida
+languages.hz=herero
languages.hy=armensk
languages.ath=athapaskansk spr\u00e5k
languages.hu=ungarsk
@@ -1340,9 +925,9 @@ languages.iro=irokansk spr\u00e5k
languages.gn=guarani
languages.gl=galicisk
languages.arw=arawak
-languages.gez=ges
-languages.art=kunstig (annet)
languages.gd=skotsk g\u00e6lisk
+languages.art=kunstig (annet)
+languages.gez=ges
languages.ira=iransk
languages.ga=irsk
languages.arp=arapaho
@@ -1351,8 +936,8 @@ languages.fy=frisisk
languages.bla=siksika
languages.gem=germansk (annet)
languages.ypk=jupisk spr\u00e5k
-languages.arc=arameisk
languages.fr=fransk
+languages.arc=arameisk
languages.fo=f\u00e6r\u00f8ysk
languages.cel=keltisk (annet)
languages.fj=fijiansk
@@ -1376,12 +961,11 @@ languages.tum=tumbuka
languages.mos=mossi
languages.dz=dzongkha
languages.nic=niger - kordofaniansk (annet)
-languages.lus=lushai
-languages.fiu=finsk-ugrisk (annet)
languages.dv=divehi
+languages.fiu=finsk-ugrisk (annet)
+languages.lus=lushai
languages.nia=nias
languages.moh=mohawk
-languages.luo=luo
languages.lun=lunda
languages.apa=apache-spr\u00e5k
languages.lui=luiseno
@@ -1401,8 +985,8 @@ languages.wak=wakasjansk spr\u00e5k
languages.sat=santali
languages.cy=walisisk
languages.sas=sasak
-languages.kbd=kabardisk
languages.cv=tsjuvansk
+languages.kbd=kabardisk
languages.cu=kirkeslavisk
languages.mni=manipuri
languages.cs=tsjekkisk
@@ -1414,17 +998,17 @@ languages.co=korsikansk
languages.sai=s\u00f8ramerikansk indiansk (annet)
languages.mnc=mandsju
languages.sah=jakutsk
-languages.kaw=kawi
-languages.inh=ingusjisk
languages.gba=gbaya
+languages.inh=ingusjisk
+languages.kaw=kawi
languages.sad=sandawe
languages.ch=chamorro
-languages.ine=indoeuropeisk (annet)
languages.bho=bhojpuri
+languages.ine=indoeuropeisk (annet)
languages.enm=mellomengelsk (1100-1500)
-languages.kar=karensk
-languages.inc=indisk (annet)
languages.ce=tsjetsjensk
+languages.inc=indisk (annet)
+languages.kar=karensk
languages.gay=gayo
languages.ca=katalansk
languages.umb=umbundu
@@ -1432,19 +1016,19 @@ languages.syr=syrisk
languages.kam=kamba
languages.tsi=tsimshian
languages.ang=gammelengelsk (ca. 450-1100)
-languages.kac=kachin
languages.cau=kaukasisk (annet)
+languages.kac=kachin
languages.kab=kabylsk
-languages.kaa=karakalpakisk
languages.bs=bosnisk
-languages.car=karibisk
+languages.kaa=karakalpakisk
languages.br=bretonsk
+languages.car=karibisk
languages.bo=tibetansk
languages.bn=bengali
languages.bm=bambara
languages.gaa=ga
-languages.cai=sentralamerikansk indiansk (annet)
languages.bi=bislama
+languages.cai=sentralamerikansk indiansk (annet)
languages.bh=bihari
languages.bg=bulgarsk
languages.be=hviterussisk
@@ -1458,10 +1042,10 @@ languages.az=aserbajdsjansk
languages.ay=aymara
languages.av=avarisk
languages.as=assamisk
-languages.dsb=lavsorbisk
languages.ar=arabisk
-languages.ilo=iloko
+languages.dsb=lavsorbisk
languages.elx=elamittisk
+languages.ilo=iloko
languages.zh=kinesisk
languages.an=aragonsk
languages.pra=prakrit-spr\u00e5k
@@ -1474,12 +1058,12 @@ languages.ae=avestisk
languages.ab=abkhasisk
languages.aa=afar
languages.yo=joruba
-languages.alg=algonkin
+languages.alg=algonkinsk spr\u00e5k
languages.ale=aleutisk
languages.mkh=mon-khmer (Other)
languages.yi=jiddisk
languages.dra=dravidisk (annet)
-languages.ber=berbisk
+languages.ber=berbisk (annet)
languages.nds=lavtysk; lavsaksisk
languages.bem=bemba
languages.bej=beja
diff --git a/resource/gnu/java/locale/LocaleInformation_nl.properties b/resource/gnu/java/locale/LocaleInformation_nl.properties
index 821523930..f21481bdc 100644
--- a/resource/gnu/java/locale/LocaleInformation_nl.properties
+++ b/resource/gnu/java/locale/LocaleInformation_nl.properties
@@ -7,761 +7,352 @@
decimalSeparator=,
groupingSeparator=.
-currenciesDisplayName.JOD=Jordaanse dinar
-currenciesDisplayName.BOV=Boliviaanse mvdol
-currenciesDisplayName.XAU=Goud
-currenciesDisplayName.FOK=Faer\u00f6erse kroon
-currenciesDisplayName.LBP=Libanees pond
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Vietnamese dong
-currenciesDisplayName.TZS=Tanzaniaanse shilling
-currenciesDisplayName.BOP=Boliviaanse peso
-currenciesDisplayName.KHR=Cambodjaanse riel
-currenciesDisplayName.XAM=Aziatische monetaire eenheid
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Cambodjaanse oude riel
-currenciesDisplayName.ZMP=Zambiaans pond
-currenciesDisplayName.AUP=Australisch pond
-currenciesDisplayName.XAF=CFA-franc BEAC
-currenciesDisplayName.MTP=Maltees pond
-currenciesDisplayName.GHR=Ghanese hergewaardeerde cedi
-currenciesDisplayName.ZMK=Zambiaanse kwacha
-currenciesDisplayName.XAD=Aziatische dinar-rekeneenheid
-currenciesDisplayName.GHP=Ghanees pond
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Ghanese oude cedi
-currenciesDisplayName.MTL=Maltese lire
-currenciesDisplayName.AUD=Australische dollar
-currenciesDisplayName.USS=Amerikaanse dollar (zelfde dag)
-currenciesDisplayName.ITL=Italiaanse lire
-currenciesDisplayName.USN=Amerikaanse dollar (volgende dag)
-currenciesDisplayName.GHC=Ghanese cedi
-currenciesDisplayName.SGD=Singaporese dollar
-currenciesDisplayName.PAB=Panamese balboa
-currenciesDisplayName.LAK=Laotiaanse kip
-currenciesDisplayName.KGS=Kirgizische som
-currenciesDisplayName.CHF=Zwitserse franc
-currenciesDisplayName.ATS=Oostenrijkse schilling
-currenciesDisplayName.USD=Amerikaanse dollar
-currenciesDisplayName.ETD=Ethiopische dollar
-currenciesDisplayName.BND=Bruneise dollar
-currenciesDisplayName.JMP=Jamaicaans pond
-currenciesDisplayName.ETB=Ethiopische birr
-currenciesDisplayName.DZG=Algerijnse franc germinal
-currenciesDisplayName.DZF=Algerijnse nieuwe franc
-currenciesDisplayName.DZD=Algerijnse dinar
-currenciesDisplayName.PYG=Paraguayaanse guarani
-currenciesDisplayName.LYP=Libisch pond
-currenciesDisplayName.JMD=Jamaicaanse dollar
-currenciesDisplayName.ISK=IJslandse kroon
-currenciesDisplayName.ESP=Spaanse peseta
-currenciesDisplayName.BMP=Bermuda-pond
-currenciesDisplayName.LYD=Libische dinar
-currenciesDisplayName.LYB=Libische Britse Militaire Autoriteit-lire
-currenciesDisplayName.BMD=Bermuda-dollar
-currenciesDisplayName.NLG=Nederlandse gulden
-currenciesDisplayName.MRO=Mauritaanse ouguiya
-currenciesDisplayName.IRR=Iraanse rial
-currenciesDisplayName.SEK=Zweedse kroon
-currenciesDisplayName.ERN=Eritrese nakfa
+currenciesDisplayName.YDD=Jemenitische dinar
+currenciesDisplayName.TWD=Nieuwe Taiwanese dollar
currenciesDisplayName.KES=Kenyaanse shilling
-currenciesDisplayName.CFF=Centraal-Afrikaanse CFA-franc
+currenciesDisplayName.BYB=Wit-Russische nieuwe roebel (1994-1999)
+currenciesDisplayName.LKR=Srilankaanse rupee
+currenciesDisplayName.RWF=Rwandese franc
+currenciesDisplayName.TJS=Tadzjikistaanse somoni
+currenciesDisplayName.SDP=Soedanees pond
+currenciesDisplayName.TJR=Tadzjikistaanse roebel
+currenciesDisplayName.ERN=Eritrese nakfa
+currenciesDisplayName.AFN=Afghani
+currenciesDisplayName.GRD=Griekse drachme
+currenciesDisplayName.IEP=Iers pond
currenciesDisplayName.ARS=Argentijnse peso
+currenciesDisplayName.SDD=Soedanese dinar
currenciesDisplayName.ARP=Argentijnse peso (1983-1985)
-currenciesDisplayName.ARM=Argentijnse peso moneda nacional
-currenciesDisplayName.TWD=Nieuwe Taiwanese dollar
-currenciesDisplayName.SDP=Soedanees pond
currenciesDisplayName.GEL=Georgische lari
+currenciesDisplayName.AFA=Afghani (1927-2002)
currenciesDisplayName.GEK=Georgische kupon larit
-currenciesDisplayName.MQF=Martinikaanse franc
+currenciesDisplayName.CRC=Costaricaanse col\u00f3n
currenciesDisplayName.FKP=Falklandeilands pond
+currenciesDisplayName.EEK=Estlandse kroon
+currenciesDisplayName.HKD=Hongkongse dollar
+currenciesDisplayName.MDL=Moldavische leu
currenciesDisplayName.ARA=Argentijnse austral
-currenciesDisplayName.SDD=Soedanese dinar
currenciesDisplayName.IQD=Iraakse dinar
-currenciesDisplayName.TVD=Tuvaluaanse dollar
currenciesDisplayName.SCR=Seychelse rupee
+currenciesDisplayName.VUV=Vanuatuaanse vatu
+currenciesDisplayName.DKK=Deense kroon
+currenciesDisplayName.KPW=Noord-Koreaanse won
+currenciesDisplayName.GQE=Equatoriaal-Guinese ekwele guineana
+currenciesDisplayName.IDR=Indonesische rupiah
currenciesDisplayName.LVR=Letse roebel
-currenciesDisplayName.FJP=Fijisch pond
+currenciesDisplayName.SOS=Somalische shilling
+currenciesDisplayName.AED=Verenigde Arabische Emiraten-dirham
+currenciesDisplayName.BWP=Botswaanse pula
currenciesDisplayName.LVL=Letse lats
-currenciesDisplayName.CDL=Congolese za\u00efre
-currenciesDisplayName.CDG=Congolese franc
-currenciesDisplayName.CDF=Congolese franc congolais
-currenciesDisplayName.FJD=Fijische dollar
+currenciesDisplayName.RUR=Russische roebel (1991-1998)
currenciesDisplayName.NIO=Nicaraguaanse c\u00f3rdoba oro
+currenciesDisplayName.ADP=Andorrese peseta
+currenciesDisplayName.FJD=Fijische dollar
currenciesDisplayName.MOP=Macause pataca
-currenciesDisplayName.NIG=Nicaraguaanse gouden c\u00f3rdoba
+currenciesDisplayName.RUB=Russische roebel
+currenciesDisplayName.CDF=Congolese franc congolais
currenciesDisplayName.NIC=Nicaraguaanse c\u00f3rdoba
-currenciesDisplayName.XTR=COMECON transferable roebel
-currenciesDisplayName.FIN=Finse markka (1860-1962)
-currenciesDisplayName.FIM=Finse markka
+currenciesDisplayName.DJF=Djiboutiaanse franc
+currenciesDisplayName.ECV=Ecuadoraanse unidad de valor constante (UVC)
currenciesDisplayName.SBD=Salomonseilandse dollar
+currenciesDisplayName.UZS=Oezbekistaanse sum
+currenciesDisplayName.ECS=Ecuadoraanse sucre
+currenciesDisplayName.PHP=Filipijnse peso
+currenciesDisplayName.THB=Thaise baht
currenciesDisplayName.LUF=Luxemburgse frank
-currenciesDisplayName.TTO=Trinidad en Tobago-oude dollar
-currenciesDisplayName.AOS=Angolese escudo
-currenciesDisplayName.AOR=Angolese kwanza reajustado (1995-1999)
-currenciesDisplayName.MNT=Mongoolse tugrik
-currenciesDisplayName.HUF=Hongaarse forint
-currenciesDisplayName.BIF=Burundese franc
-currenciesDisplayName.AON=Angolese nieuwe kwanza (1990-2000)
-currenciesDisplayName.AOK=Angolese kwanza (1977-1990)
+currenciesDisplayName.FIM=Finse markka
currenciesDisplayName.TTD=Trinidad en Tobago-dollar
currenciesDisplayName.SZL=Swazische lilangeni
-currenciesDisplayName.NHF=Nieuw-Hebridiaanse CFP-franc
-currenciesDisplayName.GBP=Brits pond sterling
-currenciesDisplayName.SAS=Saoedische souvereine rial
+currenciesDisplayName.MNT=Mongoolse tugrik
currenciesDisplayName.SAR=Saoedische rial
+currenciesDisplayName.UAK=Oekra\u00efense karbovanetz
+currenciesDisplayName.UAH=Oekra\u00efense hryvnia
+currenciesDisplayName.HUF=Hongaarse forint
+currenciesDisplayName.COP=Colombiaanse peso
+currenciesDisplayName.QAR=Qatarese rial
currenciesDisplayName.LTT=Litouwse talonas
-currenciesDisplayName.INR=Indiase rupee
currenciesDisplayName.PTE=Portugese escudo
-currenciesDisplayName.AOA=Angolese kwanza
-currenciesDisplayName.PTC=Portugese conto
+currenciesDisplayName.AOR=Angolese kwanza reajustado (1995-1999)
+currenciesDisplayName.UYU=Uruguayaanse peso uruguayo
+currenciesDisplayName.GBP=Brits pond sterling
+currenciesDisplayName.BIF=Burundese franc
+currenciesDisplayName.INR=Indiase rupee
+currenciesDisplayName.ZRZ=Za\u00efrese za\u00efre
+currenciesDisplayName.AON=Angolese nieuwe kwanza (1990-2000)
currenciesDisplayName.LTL=Litouwse litas
+currenciesDisplayName.XFU=Franse UIC-franc
currenciesDisplayName.KZT=Kazachstaanse tenge
-currenciesDisplayName.KZR=Kazachstaanse roebel
-currenciesDisplayName.VGD=Britse Maagdeneilandse dollar
-currenciesDisplayName.NGP=Nigeriaans pond
-currenciesDisplayName.MMX=Myanmarese dollarwisselcertificaten
+currenciesDisplayName.MZM=Mozambikaanse metical
+currenciesDisplayName.UYP=Uruguayaanse peso (1975-1993)
+currenciesDisplayName.AOK=Angolese kwanza (1977-1990)
+currenciesDisplayName.BUK=Birmese kyat
+currenciesDisplayName.GNS=Guinese syli
+currenciesDisplayName.XFO=Franse gouden franc
+currenciesDisplayName.PGK=Papuaanse kina
+currenciesDisplayName.SYP=Syrisch pond
+currenciesDisplayName.MZE=Mozambikaanse escudo
+currenciesDisplayName.OMR=Omaanse rial
currenciesDisplayName.NGN=Nigeriaanse naira
+currenciesDisplayName.ZRN=Za\u00efrese nieuwe za\u00efre
+currenciesDisplayName.AOA=Angolese kwanza
+currenciesDisplayName.CNY=Chinese yuan renminbi
+currenciesDisplayName.MAF=Marokkaanse franc
+currenciesDisplayName.GNF=Guinese franc
currenciesDisplayName.HTG=Ha\u00eftiaanse gourde
-currenciesDisplayName.SYP=Syrisch pond
-currenciesDisplayName.PSP=Palestijns pond
-currenciesDisplayName.BHD=Bahreinse dinar
+currenciesDisplayName.MAD=Marokkaanse dirham
+currenciesDisplayName.TRY=Nieuwe Turkse lire
currenciesDisplayName.MMK=Myanmarese kyat
+currenciesDisplayName.MYR=Maleisische ringgit
+currenciesDisplayName.LSL=Lesothaanse loti
+currenciesDisplayName.XEU=European Currency Unit
+currenciesDisplayName.BHD=Bahreinse dinar
+currenciesDisplayName.SLL=Sierraleoonse leone
+currenciesDisplayName.BTN=Bhutaanse ngultrum
+currenciesDisplayName.TRL=Turkse lire
+currenciesDisplayName.KMF=Comorese franc
currenciesDisplayName.ANG=Nederlands-Antilliaanse gulden
currenciesDisplayName.CZK=Tsjechische koruna
-currenciesDisplayName.IMP=Isle of Man pond sterling
-currenciesDisplayName.BGX=Bulgaarse levwisselcertificaten
-currenciesDisplayName.LSL=Lesothaanse loti
-currenciesDisplayName.GAF=Gabonese CFA-franc
-currenciesDisplayName.BGO=Bulgaarse lev (1879-1952)
+currenciesDisplayName.AZM=Azerbeidzjaanse manat
+currenciesDisplayName.KYD=Caymaneilandse dollar
+currenciesDisplayName.GMD=Gambiaanse dalasi
currenciesDisplayName.BGN=Bulgaarse nieuwe lev
-currenciesDisplayName.BGM=Bulgaarse socialistische lev
currenciesDisplayName.CAD=Canadese dollar
+currenciesDisplayName.MXV=Mexicaanse unidad de inversion (UDI)
currenciesDisplayName.BGL=Bulgaarse harde lev
-currenciesDisplayName.TRL=Turkse lire
-currenciesDisplayName.KYD=Caymaneilandse dollar
-currenciesDisplayName.CYP=Cyprisch pond
+currenciesDisplayName.VEB=Venezolaanse bolivar
+currenciesDisplayName.MLF=Malinese franc
currenciesDisplayName.ILS=Isra\u00eblische nieuwe shekel
+currenciesDisplayName.MXP=Mexicaanse zilveren peso (1861-1992)
+currenciesDisplayName.PES=Peruaanse sol
currenciesDisplayName.GYD=Guyaanse dollar
-currenciesDisplayName.AMD=Armeense dram
+currenciesDisplayName.MXN=Mexicaanse peso
currenciesDisplayName.ILP=Isra\u00eblisch pond
-currenciesDisplayName.MLF=Malinese franc
-currenciesDisplayName.ILL=Isra\u00eblische shekel
-currenciesDisplayName.VEB=Venezolaanse bolivar
-currenciesDisplayName.ALX=Albanese dollarwisselcertificaten
+currenciesDisplayName.SKK=Slowaakse koruna
+currenciesDisplayName.CYP=Cyprisch pond
+currenciesDisplayName.XDR=Special Drawing Rights
+currenciesDisplayName.PEN=Peruaanse nieuwe sol
currenciesDisplayName.LRD=Liberiaanse dollar
-currenciesDisplayName.ALV=Albanese lek valute
+currenciesDisplayName.PEI=Peruaanse inti
+currenciesDisplayName.AMD=Armeense dram
+currenciesDisplayName.BSD=Bahamaanse dollar
currenciesDisplayName.HRK=Kroatische kuna
-currenciesDisplayName.REF=R\u00e9unionse franc
+currenciesDisplayName.CLP=Chileense peso
currenciesDisplayName.HRD=Kroatische dinar
-currenciesDisplayName.ALL=Albanese lek
-currenciesDisplayName.JEP=Jersey pond sterling
-currenciesDisplayName.ALK=Albanese lek (1946-1961)
-currenciesDisplayName.MKN=Macedonische denar (1992-1993)
-currenciesDisplayName.VDP=Noord-Vietnamese viet minh piastre dong viet
-currenciesDisplayName.VDN=Noord-Vietnamese nieuwe dong
-currenciesDisplayName.MKD=Macedonische denar
-currenciesDisplayName.VDD=Noord-Vietnamese piastre dong viet
-currenciesDisplayName.TPP=Timorese pataca
currenciesDisplayName.XPF=CFP-franc
-currenciesDisplayName.BEL=Belgische frank (financieel)
-currenciesDisplayName.GWP=Guinee-Bissause peso
-currenciesDisplayName.KWD=Koeweitse dinar
-currenciesDisplayName.GWM=Portuguees-Guinese mil reis
-currenciesDisplayName.BEF=Belgische frank
+currenciesDisplayName.FRF=Franse franc
+currenciesDisplayName.BRR=Braziliaanse cruzeiro
+currenciesDisplayName.MKD=Macedonische denar
+currenciesDisplayName.CLF=Chileense unidades de fomento
+currenciesDisplayName.ALL=Albanese lek
+currenciesDisplayName.BRN=Braziliaanse cruzado novo
+currenciesDisplayName.MWK=Malawische kwacha
+currenciesDisplayName.BRL=Braziliaanse real
currenciesDisplayName.TPE=Timorese escudo
-currenciesDisplayName.BEC=Belgische frank (convertibel)
-currenciesDisplayName.GWE=Portuguees-Guinese escudo
+currenciesDisplayName.BRE=Braziliaanse cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Braziliaanse cruzado
+currenciesDisplayName.BRB=Braziliaanse cruzeiro novo (1967-1986)
+currenciesDisplayName.DEM=Duitse mark
+currenciesDisplayName.KWD=Koeweitse dinar
+currenciesDisplayName.XCD=Oost-Caribische dollar
+currenciesDisplayName.NPR=Nepalese rupee
+currenciesDisplayName.GWP=Guinee-Bissause peso
+currenciesDisplayName.YUN=Joegoslavische convertibele dinar
currenciesDisplayName.SVC=Salvadoraanse col\u00f3n
-currenciesDisplayName.CWG=Cura\u00e7ao-gulden
-currenciesDisplayName.BDT=Bengalese taka
-currenciesDisplayName.TOS=Tongaans pond sterling
-currenciesDisplayName.TOP=Tongaanse pa\u02bbanga
+currenciesDisplayName.YUM=Joegoslavische noviy-dinar
+currenciesDisplayName.BEL=Belgische frank (financieel)
+currenciesDisplayName.SIT=Sloveense tolar
+currenciesDisplayName.JPY=Japanse yen
currenciesDisplayName.XOF=CFA-franc BCEAO
+currenciesDisplayName.MVR=Maldivische rufiyaa
+currenciesDisplayName.GWE=Portuguees-Guinese escudo
+currenciesDisplayName.BEF=Belgische frank
+currenciesDisplayName.TOP=Tongaanse pa\u02bbanga
+currenciesDisplayName.YUD=Joegoslavische harde dinar
+currenciesDisplayName.BEC=Belgische frank (convertibel)
currenciesDisplayName.SUR=Sovjet-roebel
-currenciesDisplayName.SUN=Nieuwe sovjet-roebel
-currenciesDisplayName.NCF=Nieuw-Caledonische franc germinal
-currenciesDisplayName.CVE=Kaapverdische escudo
-currenciesDisplayName.XNF=Franse antillen CFA-franc
+currenciesDisplayName.ROL=Roemeense leu
+currenciesDisplayName.DDM=Oost-Duitse ostmark
+currenciesDisplayName.BDT=Bengalese taka
+currenciesDisplayName.XBD=Europese rekeneenheid (XBD)
+currenciesDisplayName.AWG=Arubaanse gulden
+currenciesDisplayName.XBC=Europese rekeneenheid (XBC)
+currenciesDisplayName.XBB=Europese monetaire eenheid
+currenciesDisplayName.XBA=Europese samengestelde eenheid
+currenciesDisplayName.NOK=Noorse kroon
+currenciesDisplayName.MUR=Mauritiaanse rupee
currenciesDisplayName.ZAR=Zuid-Afrikaanse rand
-currenciesDisplayName.DOP=Dominicaanse peso
-currenciesDisplayName.CUX=Cubaanse wisselcertificaten
-currenciesDisplayName.ZAP=Zuid-Afrikaans pond
+currenciesDisplayName.SHP=Sint-Heleense pond
+currenciesDisplayName.XAU=Goud
currenciesDisplayName.ZAL=Zuid-Afrikaanse rand (financieel)
+currenciesDisplayName.VND=Vietnamese dong
+currenciesDisplayName.TZS=Tanzaniaanse shilling
+currenciesDisplayName.GIP=Gibraltarees pond
currenciesDisplayName.TND=Tunesische dinar
-currenciesDisplayName.CUP=Cubaanse peso
-currenciesDisplayName.GUF=Frans-Guyaanse franc guiana
+currenciesDisplayName.CVE=Kaapverdische escudo
currenciesDisplayName.UGX=Oegandese shilling
-currenciesDisplayName.LNR=Ceylon-rupee
-currenciesDisplayName.AIF=Affars en Issas-franc
-currenciesDisplayName.VAL=Vaticaanse lire
-currenciesDisplayName.STE=Santomese escudo
+currenciesDisplayName.ZMK=Zambiaanse kwacha
+currenciesDisplayName.JOD=Jordaanse dinar
+currenciesDisplayName.XAF=CFA-franc BEAC
+currenciesDisplayName.LBP=Libanees pond
currenciesDisplayName.UGS=Oegandese shilling (1966-1987)
currenciesDisplayName.STD=Santomese dobra
-currenciesDisplayName.MHD=Marshalleilandse dollar
-currenciesDisplayName.NZP=Nieuw-Zeelands pond
currenciesDisplayName.WST=West-Samoaanse tala
-currenciesDisplayName.WSP=West-Samoaans pond
-currenciesDisplayName.HNL=Hodurese lempira
-currenciesDisplayName.XMF=Franse metropolische nieuwe franc
+currenciesDisplayName.KHR=Cambodjaanse riel
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Dominicaanse peso
+currenciesDisplayName.BOV=Boliviaanse mvdol
+currenciesDisplayName.MTP=Maltees pond
+currenciesDisplayName.USS=Amerikaanse dollar (zelfde dag)
+currenciesDisplayName.BOP=Boliviaanse peso
+currenciesDisplayName.MTL=Maltese lire
+currenciesDisplayName.CUP=Cubaanse peso
currenciesDisplayName.TMM=Turkmeense manat
-currenciesDisplayName.GTQ=Guatemalteekse quetzal
+currenciesDisplayName.USN=Amerikaanse dollar (volgende dag)
+currenciesDisplayName.SGD=Singaporese dollar
currenciesDisplayName.NZD=Nieuw-Zeelandse dollar
-currenciesDisplayName.SSP=Schotse pond
-currenciesDisplayName.BBD=Barbadaanse dollar
+currenciesDisplayName.USD=Amerikaanse dollar
+currenciesDisplayName.HNL=Hodurese lempira
+currenciesDisplayName.BOB=Boliviano
+currenciesDisplayName.ITL=Italiaanse lire
+currenciesDisplayName.PAB=Panamese balboa
+currenciesDisplayName.GTQ=Guatemalteekse quetzal
+currenciesDisplayName.LAK=Laotiaanse kip
+currenciesDisplayName.GHC=Ghanese cedi
+currenciesDisplayName.AUD=Australische dollar
currenciesDisplayName.NAD=Namibische dollar
+currenciesDisplayName.KGS=Kirgizische som
currenciesDisplayName.MGF=Malagassische franc
+currenciesDisplayName.CHF=Zwitserse franc
+currenciesDisplayName.BBD=Barbadaanse dollar
currenciesDisplayName.MGA=Malagassische ariary
-currenciesDisplayName.EGP=Egyptisch pond
-currenciesDisplayName.BZH=Brits-Hondurese dollar
+currenciesDisplayName.PYG=Paraguayaanse guarani
currenciesDisplayName.PLZ=Poolse zloty (1950-1995)
-currenciesDisplayName.BAN=Bosnische nieuwe dinar
-currenciesDisplayName.PLX=Poolse Amerikaanse-dollarwisselcertificaten
-currenciesDisplayName.BAM=Bosnische convertibele mark
-currenciesDisplayName.BZD=Belizaanse dollar
-currenciesDisplayName.BAD=Bosnische dinar
-currenciesDisplayName.PLN=Poolse zloty
currenciesDisplayName.YER=Jemenitische rial
+currenciesDisplayName.ATS=Oostenrijkse schilling
+currenciesDisplayName.ETB=Ethiopische birr
+currenciesDisplayName.BND=Bruneise dollar
+currenciesDisplayName.JMD=Jamaicaanse dollar
+currenciesDisplayName.EGP=Egyptisch pond
+currenciesDisplayName.PLN=Poolse zloty
+currenciesDisplayName.DZD=Algerijnse dinar
+currenciesDisplayName.ISK=IJslandse kroon
currenciesDisplayName.SRG=Surinaamse gulden
-currenciesDisplayName.CSK=Tsjechoslowaakse harde koruna
+currenciesDisplayName.LYD=Libische dinar
+currenciesDisplayName.SRD=Surinaamse dollar
+currenciesDisplayName.BZD=Belizaanse dollar
+currenciesDisplayName.BAM=Bosnische convertibele mark
+currenciesDisplayName.ESP=Spaanse peseta
currenciesDisplayName.KRW=Zuid-Koreaanse won
+currenciesDisplayName.NLG=Nederlandse gulden
+currenciesDisplayName.MRO=Mauritaanse ouguiya
+currenciesDisplayName.BAD=Bosnische dinar
+currenciesDisplayName.ZWD=Zimbabwaanse dollar
+currenciesDisplayName.SEK=Zweedse kroon
+currenciesDisplayName.CSK=Tsjechoslowaakse harde koruna
currenciesDisplayName.BYR=Wit-Russische roebel
-currenciesDisplayName.YEI=Jemenitische imadi rial
-currenciesDisplayName.BYL=Wit-Russische roebel (1992-1994)
-currenciesDisplayName.CSC=Tsjechoslowaakse koruna
-currenciesDisplayName.KRO=Zuid-Koreaanse oude won
-currenciesDisplayName.KRH=Zuid-Koreaanse hwan
-currenciesDisplayName.BYB=Wit-Russische nieuwe roebel (1994-1999)
-currenciesDisplayName.SQS=Somalilandse shilling
-currenciesDisplayName.GRN=Griekse nieuwe drachme
+currenciesDisplayName.IRR=Iraanse rial
currenciesDisplayName.PKR=Pakistaanse rupee
-currenciesDisplayName.AFN=Afghani
-currenciesDisplayName.ZWD=Zimbabwaanse dollar
-currenciesDisplayName.LKR=Srilankaanse rupee
-currenciesDisplayName.GRD=Griekse drachme
-currenciesDisplayName.IEP=Iers pond
-currenciesDisplayName.AFA=Afghani (1927-2002)
-currenciesDisplayName.YDD=Jemenitische dinar
-currenciesDisplayName.RWF=Rwandese franc
-currenciesDisplayName.CRC=Costaricaanse col\u00f3n
-currenciesDisplayName.TJS=Tadzjikistaanse somoni
-currenciesDisplayName.TJR=Tadzjikistaanse roebel
-currenciesDisplayName.EEK=Estlandse kroon
-currenciesDisplayName.GQP=Equatoriaal-Guinese peseta puineana
-currenciesDisplayName.MDR=Moldavische roebel-cupon
-currenciesDisplayName.HKD=Hongkongse dollar
-currenciesDisplayName.DKK=Deense kroon
-currenciesDisplayName.MDL=Moldavische leu
-currenciesDisplayName.GQF=Equatoriaal-Guinese franco
-currenciesDisplayName.GQE=Equatoriaal-Guinese ekwele guineana
-currenciesDisplayName.IDR=Indonesische rupiah
-currenciesDisplayName.AED=Verenigde Arabische Emiraten-dirham
-currenciesDisplayName.KPW=Noord-Koreaanse won
-currenciesDisplayName.IDN=Indonesische nieuwe rupiah
-currenciesDisplayName.BWP=Botswaanse pula
-currenciesDisplayName.MDC=Monegaskische leu cupon
-currenciesDisplayName.IDJ=Indonesische Java-rupiah
-currenciesDisplayName.KPP=Noord-Koreaanse Volksrepubliek-won
-currenciesDisplayName.IDG=Indonesische nica-gulden
-currenciesDisplayName.VUV=Vanuatuaanse vatu
-currenciesDisplayName.XID=Islamitische dinar
-currenciesDisplayName.SOS=Somalische shilling
-currenciesDisplayName.ADP=Andorrese peseta
-currenciesDisplayName.RUR=Russische roebel (1991-1998)
-currenciesDisplayName.GPF=Guadeloupse franc
-currenciesDisplayName.DJF=Djiboutiaanse franc
-currenciesDisplayName.ADD=Andorrese diner
-currenciesDisplayName.MCG=Monegaskische franc germinal
-currenciesDisplayName.MCF=Monegaskische nieuwe franc
-currenciesDisplayName.ECV=Ecuadoraanse unidad de valor constante (UVC)
-currenciesDisplayName.ECS=Ecuadoraanse sucre
-currenciesDisplayName.LIF=Liechtensteinse frank
-currenciesDisplayName.RUB=Russische roebel
-currenciesDisplayName.PHP=Filipijnse peso
-currenciesDisplayName.UZS=Oezbekistaanse sum
-currenciesDisplayName.COP=Colombiaanse peso
-currenciesDisplayName.THB=Thaise baht
-currenciesDisplayName.IBP=Noord-Iers pond
-currenciesDisplayName.BUR=Birmese rupee
-currenciesDisplayName.COF=Congolese CFA-franc
-currenciesDisplayName.BUK=Birmese kyat
-currenciesDisplayName.COB=Colombiaanse papieren peso
-currenciesDisplayName.UZC=Oezbekistaanse coupon-som
-currenciesDisplayName.UAK=Oekra\u00efense karbovanetz
-currenciesDisplayName.QAR=Qatarese rial
-currenciesDisplayName.UAH=Oekra\u00efense hryvnia
-currenciesDisplayName.GNS=Guinese syli
-currenciesDisplayName.CNY=Chinese yuan renminbi
-currenciesDisplayName.MZM=Mozambikaanse metical
-currenciesDisplayName.CNX=Chinese Amerikaanse-dollarwisselcertificaten
-currenciesDisplayName.UYU=Uruguayaanse peso uruguayo
-currenciesDisplayName.GNI=Guinese franc (1960-1972)
-currenciesDisplayName.SML=Sanmarinese lire
-currenciesDisplayName.CNP=Chinese jen min piao yuan
-currenciesDisplayName.MZE=Mozambikaanse escudo
-currenciesDisplayName.GNF=Guinese franc
-currenciesDisplayName.OMS=Omaanse rial saidi
-currenciesDisplayName.PGK=Papuaanse kina
-currenciesDisplayName.OMR=Omaanse rial
-currenciesDisplayName.UYP=Uruguayaanse peso (1975-1993)
-currenciesDisplayName.XFU=Franse UIC-franc
-currenciesDisplayName.BTR=Bhutaanse rupee
-currenciesDisplayName.ZRZ=Za\u00efrese za\u00efre
-currenciesDisplayName.MAF=Marokkaanse franc
-currenciesDisplayName.MAD=Marokkaanse dirham
-currenciesDisplayName.BTN=Bhutaanse ngultrum
-currenciesDisplayName.XFO=Franse gouden franc
-currenciesDisplayName.UYF=Uruguayaanse peso fuerte
-currenciesDisplayName.MYR=Maleisische ringgit
-currenciesDisplayName.ZRN=Za\u00efrese nieuwe za\u00efre
-currenciesDisplayName.AZM=Azerbeidzjaanse manat
-currenciesDisplayName.GMP=Gambiaans pond
-currenciesDisplayName.KMF=Comorese franc
-currenciesDisplayName.SLL=Sierraleoonse leone
-currenciesDisplayName.GMD=Gambiaanse dalasi
-currenciesDisplayName.XEU=European Currency Unit
-currenciesDisplayName.BSP=Bahamaans pond
-currenciesDisplayName.CMF=Kameroense CFA-franc
-currenciesDisplayName.MXV=Mexicaanse unidad de inversion (UDI)
-currenciesDisplayName.XEF=CFA-franc BCEAEC
-currenciesDisplayName.BSD=Bahamaanse dollar
-currenciesDisplayName.MXP=Mexicaanse zilveren peso (1861-1992)
-currenciesDisplayName.MXN=Mexicaanse peso
-currenciesDisplayName.PES=Peruaanse sol
-currenciesDisplayName.GLK=Groenlandse kroon
-currenciesDisplayName.BRZ=Braziliaanse cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Peruaanse nieuwe sol
-currenciesDisplayName.CLP=Chileense peso
-currenciesDisplayName.SKK=Slowaakse koruna
-currenciesDisplayName.PEI=Peruaanse inti
-currenciesDisplayName.BRR=Braziliaanse cruzeiro
-currenciesDisplayName.XDR=Special Drawing Rights
-currenciesDisplayName.FRG=Franse franc germinal/franc poincare
-currenciesDisplayName.FRF=Franse franc
-currenciesDisplayName.BRN=Braziliaanse cruzado novo
-currenciesDisplayName.CLF=Chileense unidades de fomento
-currenciesDisplayName.CLE=Chileense escudo
-currenciesDisplayName.BRL=Braziliaanse real
-currenciesDisplayName.CLC=Chileense condor
-currenciesDisplayName.BRE=Braziliaanse cruzeiro (1990-1993)
-currenciesDisplayName.DES=Duitse sperrmark
-currenciesDisplayName.MWP=Malawisch pond
-currenciesDisplayName.BRC=Braziliaanse cruzado
-currenciesDisplayName.BRB=Braziliaanse cruzeiro novo (1967-1986)
-currenciesDisplayName.MWK=Malawische kwacha
-currenciesDisplayName.PDR=Trans-Djnestrische roebel
-currenciesDisplayName.DEM=Duitse mark
-currenciesDisplayName.TDF=Tsjaadse CFA-franc
-currenciesDisplayName.PDN=Trans-Djnestrische nieuwe roebel
-currenciesDisplayName.PDK=Trans-Djnestrische roebel-kupon
-currenciesDisplayName.NPR=Nepalese rupee
-currenciesDisplayName.CKD=Cookeilandse dollar
-currenciesDisplayName.JPY=Japanse yen
-currenciesDisplayName.MVR=Maldivische rufiyaa
-currenciesDisplayName.XCF=CFA nieuwe franc
-currenciesDisplayName.MVP=Maldivische rupee
-currenciesDisplayName.XCD=Oost-Caribische dollar
-currenciesDisplayName.SIT=Sloveense tolar
-currenciesDisplayName.YUR=Joegoslavische hervormde dinar
-currenciesDisplayName.AWG=Arubaanse gulden
-currenciesDisplayName.YUO=Joegoslavische oktober-dinar
-currenciesDisplayName.DDM=Oost-Duitse ostmark
-currenciesDisplayName.YUN=Joegoslavische convertibele dinar
-currenciesDisplayName.YUM=Joegoslavische noviy-dinar
-currenciesDisplayName.TCC=Turks en Caicos-kroon
-currenciesDisplayName.YUG=Joegoslavische 1994-dinar
-currenciesDisplayName.YUF=Joegoslavische federale dinar
-currenciesDisplayName.RON=Roemeense nieuwe leu
-currenciesDisplayName.YUD=Joegoslavische harde dinar
-currenciesDisplayName.ROL=Roemeense leu
-currenciesDisplayName.SIB=Sloveense tolar bons
-currenciesDisplayName.NOK=Noorse kroon
-currenciesDisplayName.MUR=Mauritiaanse rupee
-currenciesDisplayName.XBD=Europese rekeneenheid (XBD)
-currenciesDisplayName.GIP=Gibraltarees pond
-currenciesDisplayName.VNS=Vietnamese nationale dong
-currenciesDisplayName.XBC=Europese rekeneenheid (XBC)
-currenciesDisplayName.VNR=Vietnamese Republiek-dong
-currenciesDisplayName.XBB=Europese monetaire eenheid
-currenciesDisplayName.XBA=Europese samengestelde eenheid
-currenciesDisplayName.KID=Kiribatische dollar
-currenciesDisplayName.SHP=Sint-Heleense pond
-currenciesDisplayName.VNN=Vietnamese nieuwe dong
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=fl
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Bermuda-dollar
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.CNP=CNP
-currenciesSymbol.MZE=MZE
currenciesSymbol.GNF=GF
-currenciesSymbol.OMS=OMS
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.NLG=fl
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=jan®feb®mrt®apr®mei®jun®jul®aug®sep®okt®nov®dec®®
months=januari®februari®maart®april®mei®juni®juli®augustus®september®oktober®november®december®®
shortWeekdays=®zo®ma®di®wo®do®vr®za®
@@ -775,7 +366,7 @@ shortTimeFormat=H:mm
mediumTimeFormat=H:mm:ss
longTimeFormat=H:mm:ss z
fullTimeFormat=H:mm:ss' uur' z
-zoneStrings=America/Indianapolis®EST®Eastern-standaardtijd®EST®Eastern-standaardtijd®©America/Halifax®AST®Atlantic-standaardtijd®ADT®Atlantic-zomertijd®©Pacific/Honolulu®HST®Hawa\u00ef-standaardtijd®HST®Hawa\u00ef-standaardtijd®©America/Denver®MST®Mountain-standaardtijd®MDT®Mountain-zomertijd®©America/Anchorage®AST®Alaska-standaardtijd®ADT®Alaska-zomertijd®©America/St_Johns®CNT®Newfoundland-standaardtijd®CDT®Newfoundland-zomertijd®©Africa/Casablanca®GMT®Greenwich Mean Time®GMT®Greenwich Mean Time®©America/Chicago®CST®Central-standaardtijd®CDT®Central-zomertijd®©Asia/Shanghai®CTT®Chinese standaardtijd®CDT®Chinese standaardtijd®©Asia/Tokyo®JST®Japanse standaardtijd®JST®Japanse standaardtijd®©America/New_York®EST®Eastern-standaardtijd®EDT®Eastern-zomertijd®©Europe/Bucharest®EET®Oost-Europese standaardtijd®EEST®Oost-Europese zomertijd®©America/Los_Angeles®PST®Pacific-standaardtijd®PDT®Pacific-zomertijd®©America/Phoenix®MST®Mountain-standaardtijd®MST®Mountain-standaardtijd®©Etc/GMT®GMT®Greenwich Mean Time®GMT®Greenwich Mean Time®©Asia/Jerusalem®IST®Isra\u00eblische standaardtijd®IDT®Isra\u00eblische zomertijd®©Europe/Paris®CET®Midden-Europese standaardtijd®CEST®Midden-Europese zomertijd®©
+zoneStrings=Pacific/Honolulu®HST®Hawa\u00ef-standaardtijd®HST®Hawa\u00ef-standaardtijd®©Europe/Bucharest®EET®Oost-Europese standaardtijd®EEST®Oost-Europese zomertijd®©America/Los_Angeles®PST®Pacific-standaardtijd®PDT®Pacific-zomertijd®©America/Denver®MST®Mountain-standaardtijd®MDT®Mountain-zomertijd®©Asia/Jerusalem®IST®Isra\u00eblische standaardtijd®IDT®Isra\u00eblische zomertijd®©America/Phoenix®MST®Mountain-standaardtijd®MST®Mountain-standaardtijd®©America/Chicago®CST®Central-standaardtijd®CDT®Central-zomertijd®©America/Indianapolis®EST®Eastern-standaardtijd®EST®Eastern-standaardtijd®©America/St_Johns®CNT®Newfoundland-standaardtijd®CDT®Newfoundland-zomertijd®©America/Anchorage®AST®Alaska-standaardtijd®ADT®Alaska-zomertijd®©Asia/Shanghai®CTT®Chinese standaardtijd®CDT®Chinese standaardtijd®©Asia/Tokyo®JST®Japanse standaardtijd®JST®Japanse standaardtijd®©Europe/Paris®CET®Midden-Europese standaardtijd®CEST®Midden-Europese zomertijd®©America/New_York®EST®Eastern-standaardtijd®EDT®Eastern-zomertijd®©America/Halifax®AST®Atlantic-standaardtijd®ADT®Atlantic-zomertijd®©Africa/Casablanca®GMT®Greenwich Mean Time®GMT®Greenwich Mean Time®©
territories.TL=Oost-Timor
territories.TK=Tokelau
territories.TJ=Tadzjikistan
@@ -798,7 +389,9 @@ territories.GN=Guinea
territories.GM=Gambia
territories.GL=Groenland
territories.SV=El Salvador
+territories.062=Zuidelijk Centraal-Azi\u00eb
territories.ST=Sao Tom\u00e9 en Principe
+territories.061=Polynesi\u00eb
territories.GI=Gibraltar
territories.GH=Ghana
territories.SR=Suriname
@@ -822,9 +415,12 @@ territories.SC=Seychellen
territories.SB=Salomonseilanden
territories.SA=Saoedi-Arabi\u00eb
territories.FR=Frankrijk
+territories.057=Micronesi\u00eb
territories.FO=Faer\u00f6er
territories.FM=Micronesia, Federale Staten van
territories.RW=Rwanda
+territories.054=Melanesi\u00eb
+territories.053=Australi\u00eb en Nieuw-Zeeland
territories.FK=Falklandeilanden
territories.RU=Russische Federatie
territories.FJ=Fiji
@@ -834,20 +430,26 @@ territories.RE=R\u00e9union
territories.ET=Ethiopi\u00eb
territories.ES=Spanje
territories.ER=Eritrea
+territories.833=Isle of Man
territories.EH=West-Sahara
territories.EG=Egypte
+territories.830=Kanaaleilanden
territories.EE=Estland
+territories.QO=Oceani\u00eb (overige)
territories.EC=Ecuador
territories.DZ=Algerije
territories.QA=Qatar
+territories.039=Zuid-Europa
territories.DO=Dominicaanse Republiek
territories.PY=Paraguay
+territories.035=Zuidoost-Azi\u00eb
territories.DM=Dominica
territories.PW=Palau
territories.DK=Denemarken
territories.DJ=Djibouti
territories.PT=Portugal
territories.PS=Palestijns Gebied
+territories.030=Oost-Azi\u00eb
territories.PR=Puerto Rico
territories.DE=Duitsland
territories.PN=Pitcairn
@@ -864,13 +466,16 @@ territories.CX=Christmaseiland
territories.CV=Kaapverdi\u00eb
territories.PA=Panama
territories.CU=Cuba
+territories.CS=Servi\u00eb en Montenegro
territories.CR=Costa Rica
+territories.029=Caribisch gebied
territories.CO=Colombia
territories.CN=China
territories.CM=Kameroen
territories.CL=Chili
territories.CK=Cookeilanden
territories.CI=Ivoorkust
+territories.021=Noord-Amerika
territories.CH=Zwitserland
territories.CG=Congo
territories.CF=Centraal-Afrikaanse Republiek
@@ -885,13 +490,20 @@ territories.BV=Bouveteiland
territories.BT=Bhutan
territories.BS=Bahama\u2019s
territories.BR=Brazili\u00eb
+territories.019=Amerika
+territories.018=Zuidelijk Afrika
territories.NZ=Nieuw-Zeeland
territories.BO=Bolivia
+territories.017=Centraal-Afrika
territories.BN=Brunei Darussalam
territories.BM=Bermuda
+territories.015=Noord-Afrika
+territories.014=Oost-Afrika
+territories.013=Midden-Amerika
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=West-Afrika
territories.BH=Bahrein
territories.NR=Nauru
territories.BG=Bulgarije
@@ -909,6 +521,7 @@ territories.NG=Nigeria
territories.NF=Norfolkeiland
territories.AZ=Azerbeidzjan
territories.NE=Niger
+territories.AX=Alandeilanden
territories.NC=Nieuw-Caledoni\u00eb
territories.AW=Aruba
territories.ZM=Zambia
@@ -917,19 +530,23 @@ territories.AU=Australi\u00eb
territories.AT=Oostenrijk
territories.AS=Amerikaans Samoa
territories.AR=Argentini\u00eb
+territories.009=Oceani\u00eb
territories.AQ=Antarctica
territories.MZ=Mozambique
territories.AO=Angola
territories.MY=Maleisi\u00eb
territories.AN=Nederlandse Antillen
territories.MX=Mexico
+territories.005=Zuid-Amerika
territories.AM=Armeni\u00eb
territories.MW=Malawi
territories.AL=Albani\u00eb
territories.MV=Maldiven
territories.ZA=Zuid-Afrika
territories.MU=Mauritius
+territories.002=Afrika
territories.MT=Malta
+territories.001=Wereld
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauritani\u00eb
@@ -944,7 +561,6 @@ territories.MN=Mongoli\u00eb
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Macedoni\u00eb, Republiek
-territories.YU=Joegoslavi\u00eb
territories.YT=Mayotte
territories.MH=Marshalleilanden
territories.MG=Madagaskar
@@ -954,10 +570,14 @@ territories.MA=Marokko
territories.YE=Jemen
territories.LY=Libi\u00eb
territories.LV=Letland
+territories.155=West-Europa
territories.LU=Luxemburg
+territories.154=Noord-Europa
territories.LT=Litouwen
territories.LS=Lesotho
territories.LR=Liberia
+territories.151=Oost-Europa
+territories.150=Europa
territories.LK=Sri Lanka
territories.LI=Liechtenstein
territories.LC=Saint Lucia
@@ -966,6 +586,8 @@ territories.LA=Laos
territories.KZ=Kazachstan
territories.KY=Caymaneilanden
territories.KW=Koeweit
+territories.145=West-Azi\u00eb
+territories.142=Azi\u00eb
territories.KR=Zuid-Korea
territories.KP=Noord-Korea
territories.KN=Saint Kitts en Nevis
@@ -1015,8 +637,8 @@ territories.TR=Turkije
territories.TO=Tonga
territories.TN=Tunesi\u00eb
territories.TM=Turkmenistan
-languages.gwi=Gwich\u02bbin
languages.akk=Akkadisch
+languages.gwi=Gwich\u02bcin
languages.eka=Ekajuk
languages.ijo=Ijo
languages.xh=Xhosa
@@ -1029,15 +651,15 @@ languages.pon=Pohnpeiaans
languages.min=Minangkabau
languages.suk=Sukuma
languages.wo=Wolof
-languages.lol=Mongo
languages.kut=Kutenai
-languages.mic=Micmac
+languages.lol=Mongo
+languages.mic=Mi'kmaq
languages.wa=Wallonisch
languages.kum=Kumyk
languages.zap=Zapotec
languages.cus=Koesjitisch (overige)
-languages.jbo=Lojban
languages.doi=Dogri
+languages.jbo=Lojban
languages.vo=Volap\u00fck
languages.oto=Otomi-talen
languages.vi=Vietnamees
@@ -1052,7 +674,7 @@ languages.nap=Napolitaans
languages.uz=Oezbeeks
languages.uga=Oegaritisch
languages.tmh=Tamashek
-languages.nai=Noord-Amerikaans Indiaans (overige)
+languages.nai=Noord-Amerikaans Indiaans
languages.nah=Nahuatl
languages.ur=Urdu
languages.fat=Fanti
@@ -1061,8 +683,8 @@ languages.egy=Egyptisch (klassiek)
languages.ug=Uighur
languages.fan=Fang
languages.ssa=Nilo-Saharam (overige)
-languages.mga=Iers, middel- (900-1200)
languages.bat=Baltisch (overige)
+languages.mga=Iers, middel- (900-1200)
languages.nyo=Nyoro
languages.bas=Basa
languages.nyn=Nyankole
@@ -1090,8 +712,8 @@ languages.kru=Kurukh
languages.tg=Tadzjik
languages.byn=Blin
languages.te=Teloegoe
-languages.kro=Kru
languages.csb=Kasjoebisch
+languages.kro=Kru
languages.ta=Tamil
languages.tkl=Tokelau
languages.efi=Efik
@@ -1112,11 +734,11 @@ languages.sm=Samoaans
languages.sl=Sloveens
languages.grc=Grieks, klassiek (tot 1453)
languages.sk=Slowaaks
-languages.grb=Gerbo
+languages.grb=Grebo
languages.si=Singalees
languages.sh=Servokroatisch
-languages.crh=Krim-Turks; Krim-Tataars
-languages.afa=Afro-aziatisch (overige)
+languages.afa=Afro-Aziatisch (overige)
+languages.crh=Krim-Tataars
languages.sg=Sango
languages.se=Noord-Samisch
languages.sd=Sindhi
@@ -1140,14 +762,14 @@ languages.son=Songhai
languages.cpp=Creools en Pidgin, op Portugees gebaseerd (overige)
languages.sog=Sogdisch
languages.ada=Adangme
-languages.kos=Kosreaans
-languages.hit=Hittite
languages.cpf=Creools en Pidgin, op Frans gebaseerd (overige)
+languages.hit=Hettitisch
+languages.kos=Kosraeaans
languages.cpe=Creools en Pidgin, op Engels gebaseerd (overige)
languages.him=Himachali
-languages.kok=Konkani
-languages.hil=Hiligaynon
languages.got=Gothisch
+languages.hil=Hiligaynon
+languages.kok=Konkani
languages.gor=Gorontalo
languages.gon=Gondi
languages.din=Dinka
@@ -1162,9 +784,9 @@ languages.cop=Koptisch
languages.yap=Yapees
languages.ach=Akoli
languages.yao=Yao
-languages.phi=Filipijns (overige)
+languages.phi=Filippijns (overige)
languages.pl=Pools
-languages.ace=Atjehs
+languages.ace=Atjees
languages.pi=Pali
languages.pa=Punjabi
languages.bug=Buginees
@@ -1174,7 +796,7 @@ languages.bua=Buriat
languages.mas=Masai
languages.smn=Inari Sami
languages.os=Ossetisch
-languages.map=Austronesisch
+languages.map=Austronesisch (overige)
languages.or=Oriya
languages.man=Mandingo
languages.smj=Lule Sami
@@ -1187,12 +809,12 @@ languages.mag=Magahi
languages.mad=Madurees
languages.sma=Zuid-Samisch
languages.oc=Langue d\u2019Oc (na 1500)
-languages.nso=Sotho, noorderlijk
-languages.btk=Batak
+languages.nso=Noord-Sotho
+languages.btk=Bataks (Indonesi\u00eb)
languages.myv=Erzya
languages.dgr=Dogrib
languages.ny=Nyanja
-languages.myn=Mayan
+languages.myn=Mayan-talen
languages.nv=Navajo
languages.kmb=Kimbundu
languages.nr=Ndebele, zuid-
@@ -1213,26 +835,26 @@ languages.tem=Timne
languages.my=Birmees
languages.lez=Lezgisch
languages.mt=Maltees
-languages.peo=Perzisch, oud- (ca. 600-400 B.C.)
+languages.peo=Perzisch, oud- (ca. 600-400 v. Chr.)
languages.ms=Maleis
languages.mr=Marathi
-languages.fro=Frans, oud (842-ca. 1400)
+languages.fro=Frans, oud- (ca. 842-1400)
languages.mo=Moldavisch
-languages.frm=Frans, middel (ca. 1400-1600)
languages.mn=Mongools
-languages.jrb=Judeo-Arabisch
+languages.frm=Frans, middel- (ca. 1400-1800)
languages.ml=Malayalam
+languages.jrb=Judeo-Arabisch
languages.mk=Macedonisch
languages.mi=Maori
languages.mh=Marshallees
languages.mg=Malagasisch
languages.mwr=Marwari
languages.bra=Braj
-languages.den=Slave
languages.lv=Letlands
+languages.den=Slave (Athapascan)
languages.lu=Luba-Katanga
-languages.del=Delaware
languages.lt=Litouws
+languages.del=Delaware
languages.lo=Lao
languages.ln=Lingala
languages.li=Limburgs
@@ -1285,38 +907,38 @@ languages.iu=Inuktitut
languages.pap=Papiamento
languages.it=Italiaans
languages.sgn=Gebarentalen
-languages.is=IJslands
languages.kha=Khasi
+languages.is=IJslands
languages.chr=Cherokee
languages.pam=Pampanga
languages.pal=Pahlavi
languages.chp=Chipewyan
-languages.io=Ido
languages.cho=Choctaw
+languages.io=Ido
languages.chn=Chinook-jargon
languages.chm=Mari
languages.tyv=Tuvinisch
-languages.bnt=Bantu
+languages.bnt=Bantoe (overige)
languages.pag=Pangasinan
-languages.ik=Inupiaq
languages.chk=Chuukees
-languages.ii=Sichuan Yi
+languages.ik=Inupiaq
languages.haw=Hawa\u00efaans
+languages.ii=Sichuan Yi
languages.lam=Lamba
-languages.ig=Igbo
languages.chg=Chagatai
+languages.ig=Igbo
languages.sga=Iers, oud- (tot 900)
-languages.paa=Papoea (overige)
+languages.paa=Papoeaas (overige)
languages.ie=Interlingue
languages.id=Indonesisch
languages.lah=Lahnda
-languages.day=Dajak
languages.chb=Chibcha
+languages.day=Dajak
languages.ia=Interlingua
languages.lad=Ladino
-languages.hz=Herero
-languages.hai=Haida
languages.dar=Dargwa
+languages.hai=Haida
+languages.hz=Herero
languages.hy=Armeens
languages.ath=Athapascaanse talen
languages.hu=Hongaars
@@ -1338,10 +960,10 @@ languages.iro=Irokese talen
languages.gn=Guarani
languages.gl=Galicisch
languages.arw=Arawak
-languages.gez=Geez
-languages.art=Kunsttalen (overige)
languages.gd=Schots Gaelic
-languages.ira=Iraans
+languages.art=Kunstmatige talen (overige)
+languages.gez=Geez
+languages.ira=Iraans (overige)
languages.ga=Iers
languages.arp=Arapaho
languages.arn=Araukaans
@@ -1349,8 +971,8 @@ languages.fy=Fries
languages.bla=Siksika
languages.gem=Germaans (overige)
languages.ypk=Yupik-talen
-languages.arc=Aramees
languages.fr=Frans
+languages.arc=Aramees
languages.fo=Faer\u00f6ers
languages.cel=Keltisch (overige)
languages.fj=Fijisch
@@ -1373,13 +995,13 @@ languages.ee=Ewe
languages.tum=Toemboeka
languages.mos=Mossi
languages.dz=Dzongkha
-languages.nic=Niger - Kordofanisch (overige)
-languages.lus=Lushai
-languages.fiu=Fins-Oegrisch (overige)
+languages.nic=Niger-Kordofanisch (overige)
languages.dv=Divehi
+languages.fiu=Finoegrische talen (overige)
+languages.lus=Lushai
languages.nia=Nias
languages.moh=Mohawk
-languages.luo=Luo
+languages.luo=Luo (Kenia en Tanzania)
languages.lun=Lunda
languages.apa=Apache-talen
languages.lui=Luiseno
@@ -1399,12 +1021,12 @@ languages.wak=Wakashan-talen
languages.sat=Santali
languages.cy=Welsh
languages.sas=Sasak
-languages.kbd=Kabardisch
languages.cv=Tsjoevasjisch
+languages.kbd=Kabardisch
languages.cu=Kerkslavisch
languages.mni=Manipoeri
languages.cs=Tsjechisch
-languages.sam=Samaritaans Aramees
+languages.sam=Samaritaans-Aramees
languages.cr=Cree
languages.sal=Salishan-talen
languages.dua=Duala
@@ -1412,17 +1034,17 @@ languages.co=Corsicaans
languages.sai=Zuid-Amerikaans Indiaans (overige)
languages.mnc=Mantsjoe
languages.sah=Yakut
-languages.kaw=Kawi
-languages.inh=Ingoesj
languages.gba=Gbaya
+languages.inh=Ingoesj
+languages.kaw=Kawi
languages.sad=Sandawe
languages.ch=Chamorro
-languages.ine=Indo-Europees (overige)
languages.bho=Bhojpuri
+languages.ine=Indo-Europees (overige)
languages.enm=Engels, middel- (1100-1500)
-languages.kar=Karen
-languages.inc=Indisch (overige)
languages.ce=Chechen
+languages.inc=Indisch (overige)
+languages.kar=Karen
languages.gay=Gayo
languages.ca=Catalaans
languages.umb=Umbundu
@@ -1430,19 +1052,19 @@ languages.syr=Syriac
languages.kam=Kamba
languages.tsi=Tsimshian
languages.ang=Engels, oud (ca. 450-1100)
-languages.kac=Kachin
languages.cau=Kaukasisch (overige)
+languages.kac=Kachin
languages.kab=Kabyle
-languages.kaa=Kara-Kalpaks
languages.bs=Bosnisch
-languages.car=Caribisch
+languages.kaa=Karakalpaks
languages.br=Bretons
+languages.car=Caribisch
languages.bo=Tibetaans
languages.bn=Bengalees
languages.bm=Bambara
languages.gaa=Ga
-languages.cai=Midden-Amerikaans Indiaans (overige)
languages.bi=Bislama
+languages.cai=Midden-Amerikaans Indiaans (overige)
languages.bh=Bihari
languages.bg=Bulgaars
languages.be=Wit-Russisch
@@ -1456,10 +1078,10 @@ languages.az=Azerbeidzjaans
languages.ay=Aymara
languages.av=Avarisch
languages.as=Assamees
-languages.dsb=Nedersorbisch
languages.ar=Arabisch
-languages.ilo=Iloko
+languages.dsb=Nedersorbisch
languages.elx=Elamitisch
+languages.ilo=Iloko
languages.zh=Chinees
languages.an=Aragonees
languages.pra=Prakrit-talen
@@ -1477,8 +1099,8 @@ languages.ale=Aleut
languages.mkh=Mon-Khmer (overige)
languages.yi=Jiddisch
languages.dra=Dravidisch (overige)
-languages.ber=Berber
-languages.nds=Laagduits; Laagsaxon
+languages.ber=Berber (overige)
+languages.nds=Laagduits
languages.bem=Bemba
languages.bej=Beja
languages.tpi=Tok Pisin
diff --git a/resource/gnu/java/locale/LocaleInformation_nn.properties b/resource/gnu/java/locale/LocaleInformation_nn.properties
index abe064345..934b6c3fe 100644
--- a/resource/gnu/java/locale/LocaleInformation_nn.properties
+++ b/resource/gnu/java/locale/LocaleInformation_nn.properties
@@ -7,15 +7,21 @@
decimalSeparator=,
groupingSeparator=\u00a0
-currenciesDisplayName.NOK=NOK
-currenciesSymbol.NOK=kr
-shortMonths=jan®feb®mar®apr®mai®jun®jul®aug®sep®okt®nov®des®®
+currenciesDisplayName.INR=Indiske rupi
+currenciesDisplayName.NOK=Norske kroner
+currenciesDisplayName.RUB=Russiske rubler
+currenciesDisplayName.CNY=Kinesiske yuan renminbi
+currenciesDisplayName.GBP=Britiske pund
+currenciesDisplayName.BRL=Brasilianske real
+currenciesDisplayName.USD=Amerikanske dollar
+shortMonths=jan.®feb.®mars®april®mai®juni®juli®aug.®sep.®okt.®nov.®des.®®
months=januar®februar®mars®april®mai®juni®juli®august®september®oktober®november®desember®®
-shortWeekdays=®su®m\u00e5®ty®on®to®fr®la®
+shortWeekdays=®su.®m\u00e5.®ty.®on.®to.®fr.®la.®
weekdays=®sundag®m\u00e5ndag®tysdag®onsdag®torsdag®fredag®laurdag®
minNumberOfDaysInFirstWeek=4
firstDayOfWeek=mon
eras=f.Kr.®e.Kr.®
+ampms=a.m.®p.m.®
shortDateFormat=dd.MM.yy
mediumDateFormat=d. MMM. yyyy
longDateFormat=d. MMMM yyyy
@@ -46,7 +52,9 @@ territories.GN=Guinea
territories.GM=Gambia
territories.GL=Gr\u00f8nland
territories.SV=El Salvador
+territories.062=S\u00f8rlege Sentral-Asia
territories.ST=Sao Tome og Principe
+territories.061=Polynesia
territories.GI=Gibraltar
territories.GH=Ghana
territories.SR=Surinam
@@ -70,9 +78,12 @@ territories.SC=Seychellene
territories.SB=Salomon\u00f8yene
territories.SA=Saudi Arabia
territories.FR=Frankrike
+territories.057=Mikronesia
territories.FO=F\u00e6r\u00f8yene
territories.FM=Mikronesiaf\u00f8derasjonen
territories.RW=Rwanda
+territories.054=Melanesia
+territories.053=Australia og New Zealand
territories.FK=Falklands\u00f8yene (Malvinas)
territories.RU=Den russiske f\u00f8derasjon
territories.FJ=Fiji
@@ -82,20 +93,26 @@ territories.RE=Reunion
territories.ET=Etiopia
territories.ES=Spania
territories.ER=Eritrea
+territories.833=Man
territories.EH=Vest-Sahara
territories.EG=Egypt
+territories.830=Kanal\u00f8yene
territories.EE=Estland
+territories.QO=Ytre Oseania
territories.EC=Ecuador
territories.DZ=Algerie
territories.QA=Qatar
+territories.039=S\u00f8r-Europa
territories.DO=Den dominikanske republikk
territories.PY=Paraguay
+territories.035=S\u00f8raust-Asia
territories.DM=Dominica
territories.PW=Palau
territories.DK=Danmark
territories.DJ=Djibouti
territories.PT=Portugal
territories.PS=Palestinsk territorium
+territories.030=Aust-Asia
territories.PR=Puerto Rico
territories.DE=Tyskland
territories.PN=Pitcairn
@@ -112,13 +129,16 @@ territories.CX=Christmas\u00f8ya
territories.CV=Kapp Verde
territories.PA=Panama
territories.CU=Cuba
+territories.CS=Serbia Montenegro
territories.CR=Costa Rica
+territories.029=Karibiske hav
territories.CO=Colombia
territories.CN=Kina
territories.CM=Kamerun
territories.CL=Chile
territories.CK=Cook\u00f8yene
territories.CI=Elfenbenskysten
+territories.021=Nord-Amerika
territories.CH=Sveits
territories.CG=Kongo
territories.CF=Den sentralafrikanske republikk
@@ -133,13 +153,20 @@ territories.BV=Bouvet\u00f8ya
territories.BT=Bhutan
territories.BS=Bahamas
territories.BR=Brasil
+territories.019=Amerika
+territories.018=S\u00f8rlege Afrika
territories.NZ=New Zealand
territories.BO=Bolivia
+territories.017=Sentral-Afrika
territories.BN=Brunei Darussalam
territories.BM=Bermuda
+territories.015=Nord-Afrika
+territories.014=Aust-Afrika
+territories.013=Sentral-Amerika
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Vest-Afrika
territories.BH=Bahrain
territories.NR=Nauru
territories.BG=Bulgaria
@@ -157,6 +184,7 @@ territories.NG=Nigeria
territories.NF=Norfolk\u00f8yene
territories.AZ=Aserbajdsjan
territories.NE=Niger
+territories.AX=\u00c5land
territories.NC=Ny-Caledonia
territories.AW=Aruba
territories.ZM=Zambia
@@ -165,19 +193,23 @@ territories.AU=Australia
territories.AT=\u00d8sterrike
territories.AS=Amerikansk Samoa
territories.AR=Argentina
+territories.009=Oseania
territories.AQ=Antarktis
territories.MZ=Mosambik
territories.AO=Angola
territories.MY=Malaysia
territories.AN=De nederlandske antiller
territories.MX=Mexico
+territories.005=S\u00f8r-Amerika
territories.AM=Armenia
territories.MW=Malawi
territories.AL=Albania
territories.MV=Maldivene
territories.ZA=S\u00f8r-Afrika
territories.MU=Mauritius
+territories.002=Afrika
territories.MT=Malta
+territories.001=Verden
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauritania
@@ -192,7 +224,6 @@ territories.MN=Mongolia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Makedonia, Republikken
-territories.YU=Jugoslavia
territories.YT=Mayotte
territories.MH=Marshall\u00f8yene
territories.MG=Madagaskar
@@ -202,10 +233,14 @@ territories.MA=Marokko
territories.YE=Yemen
territories.LY=Libya
territories.LV=Latvia
+territories.155=Vest-Europa
territories.LU=Luxembourg
+territories.154=Nord-Europa
territories.LT=Litauen
territories.LS=Lesotho
territories.LR=Liberia
+territories.151=Aust-Europa
+territories.150=Europa
territories.LK=Sri Lanka
territories.LI=Liechtenstein
territories.LC=St. Lucia
@@ -214,6 +249,8 @@ territories.LA=Laos, Den folkedemokratiske republikken
territories.KZ=Kasakhstan
territories.KY=Cayman\u00f8yene
territories.KW=Kuwait
+territories.145=Vest-Asia
+territories.142=Asia
territories.KR=S\u00f8r-Korea
territories.KP=Nord-Korea
territories.KN=St. Christopher og Nevis
@@ -263,6 +300,16 @@ territories.TR=Tyrkia
territories.TO=Tonga
territories.TN=Tunisia
territories.TM=Turkmenistan
+languages.zh=Kinesisk
+languages.en=Engelsk
+languages.ru=Russisk
+languages.ar=Arabisk
+languages.it=Italiensk
languages.nb=norsk bokm\u00e5l
+languages.fr=Fransk
+languages.de=Tysk
+languages.es=Spansk
languages.no=norsk
+languages.ja=Japansk
languages.nn=norsk nynorsk
+languages.pt=Portugisisk
diff --git a/resource/gnu/java/locale/LocaleInformation_om.properties b/resource/gnu/java/locale/LocaleInformation_om.properties
index a576ea37e..fa6a87640 100644
--- a/resource/gnu/java/locale/LocaleInformation_om.properties
+++ b/resource/gnu/java/locale/LocaleInformation_om.properties
@@ -5,7 +5,15 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesDisplayName.KES=KES
+currenciesDisplayName.INR=Indian Rupee
+currenciesDisplayName.RUB=Russian Ruble
+currenciesDisplayName.JPY=Japanese Yen
+currenciesDisplayName.BRL=Brazilian Real
+currenciesDisplayName.CNY=Chinese Yuan Renminbi
+currenciesDisplayName.USD=US Dollar
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.ETB=Itoophiyaa Birrii
+currenciesDisplayName.GBP=British Pound Sterling
currenciesSymbol.KES=Ksh
shortMonths=Ama®Gur®Bit®Elb®Cam®Wax®Ado®Hag®Ful®Onk®Sad®Mud®®
months=Amajjii®Guraandhala®Bitooteessa®Elba®Caamsa®Waxabajjii®Adooleessa®Hagayya®Fuulbana®Onkololeessa®Sadaasa®Muddee®®
@@ -13,6 +21,27 @@ shortWeekdays=®Dil®Wix®Qib®Rob®Kam®Jim®San®
weekdays=®Dilbata®Wiixata®Qibxata®Roobii®Kamiisa®Jimaata®Sanbata®
firstDayOfWeek=sat
eras=KD®KB®
-territories.KE=Keeniyaa
+territories.FR=France
+territories.IN=India
+territories.CN=China
territories.ET=Itoophiyaa
+territories.DE=Germany
+territories.GB=United Kingdom
+territories.BR=Brazil
+territories.RU=Russia
+territories.JP=Japan
+territories.US=United States
+territories.KE=Keeniyaa
+territories.IT=Italy
+languages.zh=Chinese
+languages.en=English
+languages.ru=Russian
+languages.hi=Hindi
+languages.ar=Arabic
+languages.it=Italian
+languages.fr=French
languages.om=Oromoo
+languages.de=German
+languages.es=Spanish
+languages.ja=Japanese
+languages.pt=Portuguese
diff --git a/resource/gnu/java/locale/LocaleInformation_om_ET.properties b/resource/gnu/java/locale/LocaleInformation_om_ET.properties
index 77578cd11..7801c491f 100644
--- a/resource/gnu/java/locale/LocaleInformation_om_ET.properties
+++ b/resource/gnu/java/locale/LocaleInformation_om_ET.properties
@@ -6,7 +6,6 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.ETB=ETB
currenciesSymbol.ETB=$
currenciesSymbol.USD=US$
ampms=WD®WB®
diff --git a/resource/gnu/java/locale/LocaleInformation_or_IN.properties b/resource/gnu/java/locale/LocaleInformation_or_IN.properties
index bd9edc1b8..69196bcf0 100644
--- a/resource/gnu/java/locale/LocaleInformation_or_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_or_IN.properties
@@ -5,8 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
firstDayOfWeek=mon
shortDateFormat=dd-MM-yy
mediumDateFormat=dd-MM-yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_pa.properties b/resource/gnu/java/locale/LocaleInformation_pa.properties
index 1476a6c2a..6d4770aeb 100644
--- a/resource/gnu/java/locale/LocaleInformation_pa.properties
+++ b/resource/gnu/java/locale/LocaleInformation_pa.properties
@@ -6,8 +6,8 @@
# This file was automatically generated by gnu.localegen from CLDR.
zeroDigit=\u0a66
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
currenciesDisplayName.INR=\u0a30\u0a41\u0a2a\u0a3f\u0a2f
currenciesSymbol.INR=\u0a30\u0a41.
shortMonths=\u0a1c\u0a28\u0a35\u0a30\u0a40®\u0a5e\u0a30\u0a35\u0a30\u0a40®\u0a2e\u0a3e\u0a30\u0a1a®\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32®\u0a2e\u0a08®\u0a1c\u0a42\u0a28®\u0a1c\u0a41\u0a32\u0a3e\u0a08®\u0a05\u0a17\u0a38\u0a24®\u0a38\u0a24\u0a70\u0a2c\u0a30®\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30®\u0a28\u0a35\u0a70\u0a2c\u0a30®\u0a26\u0a38\u0a70\u0a2c\u0a30®®
diff --git a/resource/gnu/java/locale/LocaleInformation_pa_IN.properties b/resource/gnu/java/locale/LocaleInformation_pa_IN.properties
index cd2c6ae80..be1e0300b 100644
--- a/resource/gnu/java/locale/LocaleInformation_pa_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_pa_IN.properties
@@ -5,7 +5,7 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4##,##,##0.00;-\u00a4##,##,##0.00
+currencyFormat=\u00a4#,##,##0.00;-\u00a4#,##,##0.00
firstDayOfWeek=mon
shortDateFormat=d-M-yy
mediumDateFormat=dd-MM-yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_pl.properties b/resource/gnu/java/locale/LocaleInformation_pl.properties
index ee4eaff77..91f53cd8c 100644
--- a/resource/gnu/java/locale/LocaleInformation_pl.properties
+++ b/resource/gnu/java/locale/LocaleInformation_pl.properties
@@ -7,737 +7,348 @@
decimalSeparator=,
groupingSeparator=\u00a0
-currenciesDisplayName.JOD=dinar jorda\u0144ski
-currenciesDisplayName.BOV=mvdol boliwijski
-currenciesDisplayName.XAU=z\u0142oto
-currenciesDisplayName.FOK=korona Wysp Owczych
-currenciesDisplayName.LBP=funt liba\u0144ski
-currenciesDisplayName.EUR=euro
-currenciesDisplayName.VND=dong wietnamski
-currenciesDisplayName.TZS=szyling tanza\u0144ski
-currenciesDisplayName.BOP=peso boliwijskie
-currenciesDisplayName.KHR=riel kambod\u017ca\u0144ski
-currenciesDisplayName.XAM=jednostka monetarna azjatycka
-currenciesDisplayName.BOL=boliviano (1863-1962)
-currenciesDisplayName.KHO=stary riel kambod\u017ca\u0144ski
-currenciesDisplayName.ZMP=funt zambijski
-currenciesDisplayName.AUP=funt australijski
-currenciesDisplayName.XAF=frank CFA BEAC
-currenciesDisplayName.MTP=funt malta\u0144ski
-currenciesDisplayName.GHR=cedi zrewaloryzowane gha\u0144skie
-currenciesDisplayName.ZMK=kwacha zambijska
-currenciesDisplayName.XAD=jednostla dinar rozliczeniowy azjatycki
-currenciesDisplayName.GHP=funt gha\u0144ski
-currenciesDisplayName.BOB=boliviano
-currenciesDisplayName.GHO=stare cedi gha\u0144skie
-currenciesDisplayName.MTL=lira malta\u0144ska
-currenciesDisplayName.AUD=dolar australijski
-currenciesDisplayName.ITL=lir w\u0142oski
-currenciesDisplayName.GHC=cedi gha\u0144skie
-currenciesDisplayName.SGD=dolar singapurski
-currenciesDisplayName.PAB=balboa panamski
-currenciesDisplayName.LAK=kip laota\u0144ski
-currenciesDisplayName.KGS=som kirgiski
-currenciesDisplayName.CHF=frank szwajcarski
-currenciesDisplayName.ATS=szyling austriacki\u00a0
-currenciesDisplayName.USD=dolar ameryka\u0144ski\u00a0
-currenciesDisplayName.ETD=dolar etiopski
-currenciesDisplayName.BND=dolar brunejski
-currenciesDisplayName.JMP=funt jamajski
-currenciesDisplayName.ETB=birr etiopski
-currenciesDisplayName.DZF=nowy frank algierski
-currenciesDisplayName.DZD=dinar algierski
-currenciesDisplayName.PYG=guarani paragwajskie
-currenciesDisplayName.LYP=funt libijski
-currenciesDisplayName.JMD=dolar jamajski
-currenciesDisplayName.ISK=korona islandzka
-currenciesDisplayName.ESP=peseta hiszpa\u0144ska
-currenciesDisplayName.BMP=funt bermudzki
-currenciesDisplayName.LYD=dinar libijski
-currenciesDisplayName.LYB=lir brytyjskich w\u0142adz wojskowych w Libii
-currenciesDisplayName.BMD=dolar bermudzki
-currenciesDisplayName.NLG=gulden holenderski\u00a0
-currenciesDisplayName.MRO=ouguiya mautera\u0144ska
-currenciesDisplayName.IRR=rial ira\u0144ski
-currenciesDisplayName.SEK=korona szwedzka
-currenciesDisplayName.ERN=nakfa erytrejska
+currenciesDisplayName.YDD=dinar jeme\u0144ski
+currenciesDisplayName.TWD=nowy dolar tajwa\u0144ski
currenciesDisplayName.KES=szyling kenijski
-currenciesDisplayName.CFF=frank CFA Republiki \u015arodkowoafryka\u0144skiej
+currenciesDisplayName.BYB=rubel bia\u0142oruski (1994-1999)
+currenciesDisplayName.LKR=rupia lankijska
+currenciesDisplayName.RWF=frank ruandyjski
+currenciesDisplayName.TJS=somoni tad\u017cyckie
+currenciesDisplayName.SDP=funt suda\u0144ski
+currenciesDisplayName.TJR=rubel tad\u017cycki
+currenciesDisplayName.ERN=nakfa erytrejska
+currenciesDisplayName.AFN=afgani
+currenciesDisplayName.GRD=drachma grecka
+currenciesDisplayName.IEP=funt irlandzki
currenciesDisplayName.ARS=peso argenty\u0144skie
+currenciesDisplayName.SDD=dinar suda\u0144ski
currenciesDisplayName.ARP=peso argenty\u0144skie (1983-1985)
-currenciesDisplayName.ARM=peso argenty\u0144skie Moneda Nacional
-currenciesDisplayName.TWD=nowy dolar tajwa\u0144ski
-currenciesDisplayName.SDP=funt suda\u0144ski
currenciesDisplayName.GEL=lari gruzi\u0144skie
+currenciesDisplayName.AFA=afgani (1927-2002)
currenciesDisplayName.GEK=Larit gruzi\u0144ski kupon
-currenciesDisplayName.MQF=frank Martynika
+currenciesDisplayName.CRC=colon kostaryka\u0144ski
currenciesDisplayName.FKP=funt Wysp Falklandzkich
+currenciesDisplayName.EEK=korona esto\u0144ska
+currenciesDisplayName.HKD=dolar hongko\u0144ski
+currenciesDisplayName.MDL=lej mo\u0142dawski
currenciesDisplayName.ARA=austral argenty\u0144ski
-currenciesDisplayName.SDD=dinar suda\u0144ski
currenciesDisplayName.IQD=dinar iracki
-currenciesDisplayName.TVD=dolar Tuvalu
currenciesDisplayName.SCR=rupia seszelska
+currenciesDisplayName.VUV=vatu Vanuatu
+currenciesDisplayName.DKK=korona du\u0144ska
+currenciesDisplayName.KPW=won p\u00f3\u0142nocnokorea\u0144ski
+currenciesDisplayName.GQE=ekwele gwinejskie Gwinei R\u00f3wnikowej
+currenciesDisplayName.IDR=rupia indonezyjska
currenciesDisplayName.LVR=rubel \u0142otewski
-currenciesDisplayName.FJP=funt fid\u017cijski
+currenciesDisplayName.SOS=szyling somalijski
+currenciesDisplayName.AED=dirham ZEA
+currenciesDisplayName.BWP=pula
currenciesDisplayName.LVL=\u0142at \u0142otewski
-currenciesDisplayName.CDL=zair kongijski
-currenciesDisplayName.CDG=frank Republiki Konga
-currenciesDisplayName.CDF=frank kongijski
-currenciesDisplayName.FJD=dolar fid\u017cijski
+currenciesDisplayName.RUR=rubel rosyjski (1991-1998)
currenciesDisplayName.NIO=cordoba oro nikaragua\u0144ska
+currenciesDisplayName.ADP=peseta andorska
+currenciesDisplayName.FJD=dolar fid\u017cijski
currenciesDisplayName.MOP=pataka Macao
-currenciesDisplayName.NIG=cordoba Gold nikaragua\u0144ska
+currenciesDisplayName.RUB=rubel rosyjski
+currenciesDisplayName.CDF=frank kongijski
currenciesDisplayName.NIC=cordoba nikaragua\u0144ska
-currenciesDisplayName.XTR=rubel transferowy COMECON
-currenciesDisplayName.FIN=marka fi\u0144ska (1860-1962)
-currenciesDisplayName.FIM=marka fi\u0144ska
+currenciesDisplayName.DJF=frank D\u017cibuti
currenciesDisplayName.SBD=dolar Wysp Salomona
+currenciesDisplayName.UZS=som uzbecki
+currenciesDisplayName.ECS=sucre ekwadorski
+currenciesDisplayName.PHP=peso filipi\u0144skie
+currenciesDisplayName.THB=baht tajski
currenciesDisplayName.LUF=frank luksemburski
-currenciesDisplayName.TTO=stary dolar Trynidadu i Tobago
-currenciesDisplayName.AOS=escudo angola\u0144skie
-currenciesDisplayName.AOR=kwanza angola\u0144ska Reajustado (1995-1999)
-currenciesDisplayName.MNT=tugrik mongolski
-currenciesDisplayName.HUF=forint w\u0119gierski\u00a0
-currenciesDisplayName.BIF=frank burundyjski
-currenciesDisplayName.AON=nowa kwanza angola\u0144ska (1990-2000)
-currenciesDisplayName.AOK=kwanza angola\u0144ska (1977-1990)
+currenciesDisplayName.FIM=marka fi\u0144ska
currenciesDisplayName.TTD=dolar Trynidadu i Tobago
currenciesDisplayName.SZL=lilangeni Suazi
-currenciesDisplayName.GBP=funt szterling
-currenciesDisplayName.SAS=riyal sovereign saudyjski
+currenciesDisplayName.MNT=tugrik mongolski
currenciesDisplayName.SAR=rial saudyjski
+currenciesDisplayName.UAK=karbowaniec ukrai\u0144ski
+currenciesDisplayName.UAH=hrywna ukrai\u0144ska
+currenciesDisplayName.HUF=forint w\u0119gierski\u00a0
+currenciesDisplayName.COP=peso kolumbijskie
+currenciesDisplayName.QAR=rial katarski
currenciesDisplayName.LTT=talon litewski
-currenciesDisplayName.INR=rupia indyjska
currenciesDisplayName.PTE=escudo portugalskie
-currenciesDisplayName.AOA=kwanza angola\u0144ska
-currenciesDisplayName.PTC=conto portugalskie
+currenciesDisplayName.AOR=kwanza angola\u0144ska Reajustado (1995-1999)
+currenciesDisplayName.UYU=peso urugwajskie
+currenciesDisplayName.GBP=funt szterling
+currenciesDisplayName.BIF=frank burundyjski
+currenciesDisplayName.INR=rupia indyjska
+currenciesDisplayName.ZRZ=zair zairski
+currenciesDisplayName.AON=nowa kwanza angola\u0144ska (1990-2000)
currenciesDisplayName.LTL=lit litewski
+currenciesDisplayName.XFU=UIC-frank francuski
currenciesDisplayName.KZT=Tenge kazachskie
-currenciesDisplayName.KZR=rubel kazachski
-currenciesDisplayName.VGD=dolar Brytyjskich Wysp Dziewiczych
-currenciesDisplayName.NGP=funt nigeryjski
-currenciesDisplayName.MMX=dolarowy certyfikat Myanmar dla transakcji zagranicznych
+currenciesDisplayName.MZM=metical Mozambik
+currenciesDisplayName.UYP=peso urugwajskie (1975-1993)
+currenciesDisplayName.AOK=kwanza angola\u0144ska (1977-1990)
+currenciesDisplayName.BUK=kyat birma\u0144ski
+currenciesDisplayName.GNS=syli gwinejskie
+currenciesDisplayName.XFO=frank z\u0142oty francuski
+currenciesDisplayName.PGK=kina Papua Nowa Gwinea
+currenciesDisplayName.SYP=funt syryjski
+currenciesDisplayName.MZE=escudo mozambickie
+currenciesDisplayName.OMR=rial Omanu
currenciesDisplayName.NGN=naira nigeryjska
+currenciesDisplayName.ZRN=nowy zair zairski
+currenciesDisplayName.AOA=kwanza angola\u0144ska
+currenciesDisplayName.CNY=juan renminbi
+currenciesDisplayName.MAF=frank maroka\u0144ski
+currenciesDisplayName.GNF=frank gwinejski
currenciesDisplayName.HTG=gourde haita\u0144skie
-currenciesDisplayName.SYP=funt syryjski
-currenciesDisplayName.PSP=funt palesty\u0144ski
-currenciesDisplayName.BHD=dinar bahra\u0144ski
+currenciesDisplayName.MAD=dirham maroka\u0144ski
+currenciesDisplayName.TRY=nowa lira turecka
currenciesDisplayName.MMK=kyat Myanmar
+currenciesDisplayName.MYR=ringgit malezyjski
+currenciesDisplayName.LSL=loti Lesoto
+currenciesDisplayName.BHD=dinar bahra\u0144ski
+currenciesDisplayName.SLL=leone Sierra Leone
+currenciesDisplayName.BTN=ngultrum Bhutan
+currenciesDisplayName.TRL=lir turecki
+currenciesDisplayName.KMF=frank komoryjski
currenciesDisplayName.ANG=gulden Antyle Holenderskie
currenciesDisplayName.CZK=korona czeska
-currenciesDisplayName.IMP=funt szterling Wyspa Man
-currenciesDisplayName.BGX=lewa bu\u0142garskie dewizowe dla transakcji zagranicznych
-currenciesDisplayName.LSL=loti Lesoto
-currenciesDisplayName.GAF=frank CFA Gabonu
-currenciesDisplayName.BGO=lewa bu\u0142garskie (1879-1952)
+currenciesDisplayName.AZM=manat azerbejd\u017ca\u0144ski
+currenciesDisplayName.KYD=dolar kajma\u0144ski
+currenciesDisplayName.GMD=dalasi gambijskie
currenciesDisplayName.BGN=nowe lewa bu\u0142garskie
-currenciesDisplayName.BGM=lewa bu\u0142garskie socjalistyczne
currenciesDisplayName.CAD=dolar kanadyjski
currenciesDisplayName.BGL=lewa bu\u0142garskie
-currenciesDisplayName.TRL=lir turecki
-currenciesDisplayName.KYD=dolar kajma\u0144ski
-currenciesDisplayName.CYP=funt cypryjski
+currenciesDisplayName.VEB=boliwar wenezuelski
+currenciesDisplayName.MLF=frank malijski
currenciesDisplayName.ILS=nowy szekel izraelski
+currenciesDisplayName.MXP=peso srebrne meksyka\u0144skie (1861-1992)
+currenciesDisplayName.PES=sol peruwia\u0144ski
currenciesDisplayName.GYD=dolar guja\u0144ski
-currenciesDisplayName.AMD=dram arme\u0144ski
+currenciesDisplayName.MXN=peso meksyka\u0144skie
currenciesDisplayName.ILP=funt izraelski
-currenciesDisplayName.MLF=frank malijski
-currenciesDisplayName.ILL=szekel izraelski
-currenciesDisplayName.VEB=boliwar wenezuelski
-currenciesDisplayName.ALX=dolar alba\u0144ski dewizowy dla transakcji zagranicznych
+currenciesDisplayName.SKK=korona s\u0142owacka
+currenciesDisplayName.CYP=funt cypryjski
+currenciesDisplayName.XDR=specjalne prawa ci\u0105gnienia
+currenciesDisplayName.PEN=nowy sol peruwia\u0144ski
currenciesDisplayName.LRD=dolar liberyjski
-currenciesDisplayName.ALV=lek waluta alba\u0144ska
+currenciesDisplayName.PEI=inti peruwia\u0144ski
+currenciesDisplayName.AMD=dram arme\u0144ski
+currenciesDisplayName.BSD=dolar bahamski
currenciesDisplayName.HRK=kuna chorwacka
-currenciesDisplayName.REF=frank Reunion
+currenciesDisplayName.CLP=peso chilijskie
currenciesDisplayName.HRD=dinar chorwacki
-currenciesDisplayName.ALL=lek alba\u0144ski
-currenciesDisplayName.JEP=funt szterling Jersey
-currenciesDisplayName.ALK=lek alba\u0144ski (1946-1961)
-currenciesDisplayName.MKN=denar macedo\u0144ski (1992-1993)
-currenciesDisplayName.VDP=viet minh piastre dong viet p\u00f3\u0142nocnowietnamski
-currenciesDisplayName.VDN=nowy dong p\u00f3\u0142nocnowietnamski
-currenciesDisplayName.MKD=denar macedo\u0144ski
-currenciesDisplayName.VDD=piastre dong viet p\u00f3\u0142nocnowietnamski
-currenciesDisplayName.TPP=pataca timorskie
currenciesDisplayName.XPF=frank CFP
-currenciesDisplayName.BEL=frank belgijski (finansowy)
-currenciesDisplayName.GWP=peso Guinea-Bissau
-currenciesDisplayName.KWD=dinar kuwejcki
-currenciesDisplayName.BEF=frank belgijski
+currenciesDisplayName.FRF=frank francuski\u00a0
+currenciesDisplayName.BRR=cruzeiro brazylijskie
+currenciesDisplayName.MKD=denar macedo\u0144ski
+currenciesDisplayName.ALL=lek alba\u0144ski
+currenciesDisplayName.BRN=cruzado brazylijskie
+currenciesDisplayName.MWK=kwacha malawska
+currenciesDisplayName.BRL=real brazylijski
currenciesDisplayName.TPE=escudo timorskie
-currenciesDisplayName.BEC=frank belgijski (zamienny)
-currenciesDisplayName.GWE=escudo Gwinea Portugalska
+currenciesDisplayName.BRE=cruzeiro brazylijskie(1990-1993)
+currenciesDisplayName.BRC=cruzado brazylijskie
+currenciesDisplayName.BRB=cruzeiro novo brazylijskie (1967-1986)
+currenciesDisplayName.DEM=marka niemiecka
+currenciesDisplayName.KWD=dinar kuwejcki
+currenciesDisplayName.XCD=dolar wschodniokaraibski
+currenciesDisplayName.NPR=rupia nepalska
+currenciesDisplayName.GWP=peso Guinea-Bissau
+currenciesDisplayName.YUN=dinar jugos\u0142awia\u0144ski wymienny
currenciesDisplayName.SVC=colon salwadorski
-currenciesDisplayName.CWG=gulden Curacao
-currenciesDisplayName.BDT=taka bengalska
-currenciesDisplayName.TOS=funt szterling Tonga
-currenciesDisplayName.TOP=pa\u02bbanga Tonga
+currenciesDisplayName.YUM=nowy dinar jugos\u0142awia\u0144ski
+currenciesDisplayName.BEL=frank belgijski (finansowy)
+currenciesDisplayName.SIT=tolar s\u0142owe\u0144ski
+currenciesDisplayName.JPY=jen japo\u0144ski
currenciesDisplayName.XOF=frank CFA
+currenciesDisplayName.MVR=rufiyaa malediwska
+currenciesDisplayName.GWE=escudo Gwinea Portugalska
+currenciesDisplayName.BEF=frank belgijski
+currenciesDisplayName.TOP=pa\u02bbanga Tonga
+currenciesDisplayName.YUD=dinar jugos\u0142awia\u0144ski wymienny
+currenciesDisplayName.BEC=frank belgijski (zamienny)
currenciesDisplayName.SUR=rubel radziecki
-currenciesDisplayName.SUN=nowy rubel radziecki
-currenciesDisplayName.NCF=franc germinal Nowa Kaledonia
-currenciesDisplayName.CVE=escudo Zielonego Przyl\u0105dka
-currenciesDisplayName.XNF=frank CFA Antyli Francuskich
+currenciesDisplayName.ROL=lej rumu\u0144ski
+currenciesDisplayName.DDM=wschodnia marka wschodnioniemiecka
+currenciesDisplayName.BDT=taka bengalska
+currenciesDisplayName.AWG=gulden arubski
+currenciesDisplayName.NOK=korona norweska
+currenciesDisplayName.MUR=rupia Mauritius
currenciesDisplayName.ZAR=rand po\u0142udniowoafryka\u0144ski
-currenciesDisplayName.DOP=peso dominika\u0144skie
-currenciesDisplayName.CUX=certyfikaty kuba\u0144skie dla transakcji zagranicznych
-currenciesDisplayName.ZAP=funt po\u0142udniowoafryka\u0144ski
+currenciesDisplayName.SHP=funt Wyspy \u015awi\u0119tej Heleny
+currenciesDisplayName.XAU=z\u0142oto
currenciesDisplayName.ZAL=rand po\u0142udniowoafryka\u0144ski (finansowy)
+currenciesDisplayName.VND=dong wietnamski
+currenciesDisplayName.TZS=szyling tanza\u0144ski
+currenciesDisplayName.GIP=funt gibraltarski
currenciesDisplayName.TND=dinar tunezyjski
-currenciesDisplayName.CUP=peso kuba\u0144skie
+currenciesDisplayName.CVE=escudo Zielonego Przyl\u0105dka
currenciesDisplayName.UGX=szyling ugandyjski
-currenciesDisplayName.LNR=rupia cejlo\u0144ska
-currenciesDisplayName.AIF=frank Affars and Issas Franc
-currenciesDisplayName.VAL=lir Miasta Watykan
-currenciesDisplayName.STE=escudo Wysp \u015awi\u0119tego Tomasza i\u00a0Ksi\u0105\u017c\u0119cej
+currenciesDisplayName.ZMK=kwacha zambijska
+currenciesDisplayName.JOD=dinar jorda\u0144ski
+currenciesDisplayName.XAF=frank CFA BEAC
+currenciesDisplayName.LBP=funt liba\u0144ski
currenciesDisplayName.UGS=szyling ugandyjski (1966-1987)
currenciesDisplayName.STD=dobra Wysp \u015awi\u0119tego Tomasza i\u00a0Ksi\u0105\u017c\u0119cej
-currenciesDisplayName.MHD=dolar Wysp Marshalla
-currenciesDisplayName.NZP=funt nowozelandzki
currenciesDisplayName.WST=tala samoa\u0144ska
-currenciesDisplayName.WSP=funt samoa\u0144ski
-currenciesDisplayName.HNL=lempira Hondurasu
-currenciesDisplayName.XMF=nowy frank Metropolii Francuskiej
+currenciesDisplayName.KHR=riel kambod\u017ca\u0144ski
+currenciesDisplayName.EUR=euro
+currenciesDisplayName.DOP=peso dominika\u0144skie
+currenciesDisplayName.BOV=mvdol boliwijski
+currenciesDisplayName.MTP=funt malta\u0144ski
+currenciesDisplayName.BOP=peso boliwijskie
+currenciesDisplayName.MTL=lira malta\u0144ska
+currenciesDisplayName.CUP=peso kuba\u0144skie
currenciesDisplayName.TMM=manat turkme\u0144ski
-currenciesDisplayName.GTQ=quetzal gwatemalski
+currenciesDisplayName.SGD=dolar singapurski
currenciesDisplayName.NZD=dolar nowozelandzki
-currenciesDisplayName.SSP=funt szkocki
-currenciesDisplayName.BBD=dolar Barbadosu
+currenciesDisplayName.USD=dolar ameryka\u0144ski\u00a0
+currenciesDisplayName.HNL=lempira Hondurasu
+currenciesDisplayName.BOB=boliviano
+currenciesDisplayName.ITL=lir w\u0142oski
+currenciesDisplayName.PAB=balboa panamski
+currenciesDisplayName.GTQ=quetzal gwatemalski
+currenciesDisplayName.LAK=kip laota\u0144ski
+currenciesDisplayName.GHC=cedi gha\u0144skie
+currenciesDisplayName.AUD=dolar australijski
currenciesDisplayName.NAD=dolar namibijski
+currenciesDisplayName.KGS=som kirgiski
currenciesDisplayName.MGF=frank malgaski
+currenciesDisplayName.CHF=frank szwajcarski
+currenciesDisplayName.BBD=dolar Barbadosu
currenciesDisplayName.MGA=ariar malgaski
-currenciesDisplayName.EGP=funt egipski
-currenciesDisplayName.BZH=dolar Hondurasu Brytyjskiego
+currenciesDisplayName.PYG=guarani paragwajskie
currenciesDisplayName.PLZ=z\u0142oty polski (1950-1995)
-currenciesDisplayName.BAN=nowy dinar Bo\u015bni i Hercegowinyr
-currenciesDisplayName.PLX=z\u0142oty polski dewizowy dla transakcji zagranicznych
-currenciesDisplayName.BAM=marka konwertybilna Bo\u015bni i Hercegowiny
-currenciesDisplayName.BZD=dolar belize\u0144ski
-currenciesDisplayName.BAD=dinar Bo\u015bni i Hercegowiny
-currenciesDisplayName.PLN=z\u0142oty polski
currenciesDisplayName.YER=rial jeme\u0144ski
+currenciesDisplayName.ATS=szyling austriacki\u00a0
+currenciesDisplayName.ETB=birr etiopski
+currenciesDisplayName.BND=dolar brunejski
+currenciesDisplayName.JMD=dolar jamajski
+currenciesDisplayName.EGP=funt egipski
+currenciesDisplayName.PLN=z\u0142oty polski
+currenciesDisplayName.DZD=dinar algierski
+currenciesDisplayName.ISK=korona islandzka
currenciesDisplayName.SRG=gulden surinamski
-currenciesDisplayName.CSK=korona czechos\u0142owacka
+currenciesDisplayName.LYD=dinar libijski
+currenciesDisplayName.BZD=dolar belize\u0144ski
+currenciesDisplayName.BAM=marka konwertybilna Bo\u015bni i Hercegowiny
+currenciesDisplayName.ESP=peseta hiszpa\u0144ska
currenciesDisplayName.KRW=won po\u0142udniowokorea\u0144ski
+currenciesDisplayName.NLG=gulden holenderski\u00a0
+currenciesDisplayName.MRO=ouguiya mautera\u0144ska
+currenciesDisplayName.BAD=dinar Bo\u015bni i Hercegowiny
+currenciesDisplayName.ZWD=dolar Zimbabwe
+currenciesDisplayName.SEK=korona szwedzka
+currenciesDisplayName.CSK=korona czechos\u0142owacka
currenciesDisplayName.BYR=rubel bia\u0142oruski
-currenciesDisplayName.YEI=riyal Imadi jeme\u0144ski
-currenciesDisplayName.BYL=rubel bia\u0142oruski (1992-1994)
-currenciesDisplayName.CSC=korona czechos\u0142owacka
-currenciesDisplayName.KRO=stary won po\u0142udniowokorea\u0144ski
-currenciesDisplayName.KRH=hwan po\u0142udniowokorea\u0144ski
-currenciesDisplayName.BYB=rubel bia\u0142oruski (1994-1999)
-currenciesDisplayName.SQS=szyling somalijski
-currenciesDisplayName.GRN=nowa drachma grecka
+currenciesDisplayName.IRR=rial ira\u0144ski
currenciesDisplayName.PKR=rupia pakista\u0144ska
-currenciesDisplayName.AFN=afgani
-currenciesDisplayName.ZWD=dolar Zimbabwe
-currenciesDisplayName.LKR=rupia lankijska
-currenciesDisplayName.GRD=drachma grecka
-currenciesDisplayName.IEP=funt irlandzki
-currenciesDisplayName.AFA=afgani (1927-2002)
-currenciesDisplayName.YDD=dinar jeme\u0144ski
-currenciesDisplayName.RWF=frank ruandyjski
-currenciesDisplayName.CRC=colon kostaryka\u0144ski
-currenciesDisplayName.TJS=somoni tad\u017cyckie
-currenciesDisplayName.TJR=rubel tad\u017cycki
-currenciesDisplayName.EEK=korona esto\u0144ska
-currenciesDisplayName.GQP=peseta guja\u0144ska Gwinei R\u00f3wnikowej
-currenciesDisplayName.MDR=rubel kuponowy mo\u0142dawski
-currenciesDisplayName.HKD=dolar hongko\u0144ski
-currenciesDisplayName.DKK=korona du\u0144ska
-currenciesDisplayName.MDL=lej mo\u0142dawski
-currenciesDisplayName.GQF=frank Gwinei R\u00f3wnikowej
-currenciesDisplayName.GQE=ekwele gwinejskie Gwinei R\u00f3wnikowej
-currenciesDisplayName.IDR=rupia indonezyjska
-currenciesDisplayName.AED=dirham ZEA
-currenciesDisplayName.KPW=won p\u00f3\u0142nocnokorea\u0144ski
-currenciesDisplayName.IDN=nowa rupia indonezyjska
-currenciesDisplayName.BWP=pula
-currenciesDisplayName.MDC=lej kuponowy mo\u0142dawski
-currenciesDisplayName.IDJ=rupia indonezyjska Java
-currenciesDisplayName.KPP=won ludowop\u00f3\u0142nocnokorea\u0144ski
-currenciesDisplayName.IDG=gulden indonezyjski Nica
-currenciesDisplayName.VUV=vatu Vanuatu
-currenciesDisplayName.XID=dinar islamski
-currenciesDisplayName.SOS=szyling somalijski
-currenciesDisplayName.ADP=peseta andorska
-currenciesDisplayName.RUR=rubel rosyjski (1991-1998)
-currenciesDisplayName.GPF=frank Gwadelupy
-currenciesDisplayName.DJF=frank D\u017cibuti
-currenciesDisplayName.ADD=diner andorski
-currenciesDisplayName.MCG=frank Monaco Germinal
-currenciesDisplayName.MCF=nowy frank Monaco
-currenciesDisplayName.ECS=sucre ekwadorski
-currenciesDisplayName.LIF=frank Liechtenstein
-currenciesDisplayName.RUB=rubel rosyjski
-currenciesDisplayName.PHP=peso filipi\u0144skie
-currenciesDisplayName.UZS=som uzbecki
-currenciesDisplayName.COP=peso kolumbijskie
-currenciesDisplayName.THB=baht tajski
-currenciesDisplayName.IBP=fund p\u00f3\u0142nocnoirlandzki
-currenciesDisplayName.BUR=rupia birma\u0144ska
-currenciesDisplayName.COF=frank CFA Konga
-currenciesDisplayName.BUK=kyat birma\u0144ski
-currenciesDisplayName.COB=peso kolumbijskie papierowe
-currenciesDisplayName.UZC=som kuponowy uzbecki
-currenciesDisplayName.UAK=karbowaniec ukrai\u0144ski
-currenciesDisplayName.QAR=rial katarski
-currenciesDisplayName.UAH=hrywna ukrai\u0144ska
-currenciesDisplayName.GNS=syli gwinejskie
-currenciesDisplayName.CNY=juan renminbi
-currenciesDisplayName.MZM=metical Mozambik
-currenciesDisplayName.CNX=dolar chi\u0144ski dla transakcji zagranicznych
-currenciesDisplayName.UYU=peso urugwajskie
-currenciesDisplayName.GNI=frank gwinejski (1960-1972)
-currenciesDisplayName.SML=lir San Marino
-currenciesDisplayName.MZE=escudo mozambickie
-currenciesDisplayName.CNP=Jen Min Piao juan Jen Min Piao chi\u0144ski
-currenciesDisplayName.GNF=frank gwinejski
-currenciesDisplayName.PGK=kina Papua Nowa Gwinea
-currenciesDisplayName.OMS=rial saidi oma\u0144ski
-currenciesDisplayName.OMR=rial Omanu
-currenciesDisplayName.UYP=peso urugwajskie (1975-1993)
-currenciesDisplayName.XFU=UIC-frank francuski
-currenciesDisplayName.BTR=rupia Bhutan
-currenciesDisplayName.ZRZ=zair zairski
-currenciesDisplayName.MAF=frank maroka\u0144ski
-currenciesDisplayName.MAD=dirham maroka\u0144ski
-currenciesDisplayName.BTN=ngultrum Bhutan
-currenciesDisplayName.XFO=frank z\u0142oty francuski
-currenciesDisplayName.UYF=peso urugwajskie Fuerte
-currenciesDisplayName.MYR=ringgit malezyjski
-currenciesDisplayName.ZRN=nowy zair zairski
-currenciesDisplayName.AZM=manat azerbejd\u017ca\u0144ski
-currenciesDisplayName.GMP=funt gambijski
-currenciesDisplayName.KMF=frank komoryjski
-currenciesDisplayName.SLL=leone Sierra Leone
-currenciesDisplayName.GMD=dalasi gambijskie
-currenciesDisplayName.BSP=funt bahamski
-currenciesDisplayName.CMF=frank CFA Kamerunu
-currenciesDisplayName.XEF=frank CFA BCEAEC
-currenciesDisplayName.BSD=dolar bahamski
-currenciesDisplayName.MXP=peso srebrne meksyka\u0144skie (1861-1992)
-currenciesDisplayName.MXN=peso meksyka\u0144skie
-currenciesDisplayName.PES=sol peruwia\u0144ski
-currenciesDisplayName.GLK=korona grenlandzka
-currenciesDisplayName.BRZ=cruzeiro brazylijskie (1942-1967)
-currenciesDisplayName.PEN=nowy sol peruwia\u0144ski
-currenciesDisplayName.CLP=peso chilijskie
-currenciesDisplayName.SKK=korona s\u0142owacka
-currenciesDisplayName.PEI=inti peruwia\u0144ski
-currenciesDisplayName.BRR=cruzeiro brazylijskie
-currenciesDisplayName.XDR=specjalne prawa ci\u0105gnienia
-currenciesDisplayName.FRF=frank francuski\u00a0
-currenciesDisplayName.BRN=cruzado brazylijskie
-currenciesDisplayName.CLE=escudo chilijskie
-currenciesDisplayName.BRL=real brazylijski
-currenciesDisplayName.CLC=condor chilijski
-currenciesDisplayName.BRE=cruzeiro brazylijskie(1990-1993)
-currenciesDisplayName.MWP=funt malawski
-currenciesDisplayName.BRC=cruzado brazylijskie
-currenciesDisplayName.BRB=cruzeiro novo brazylijskie (1967-1986)
-currenciesDisplayName.MWK=kwacha malawska
-currenciesDisplayName.PDR=rubel naddniestrza\u0144ski
-currenciesDisplayName.DEM=marka niemiecka
-currenciesDisplayName.TDF=frank CFA Czadu
-currenciesDisplayName.PDN=nowy rubel naddniestrza\u0144ski
-currenciesDisplayName.PDK=rubel kuponowy naddniestrza\u0144ski
-currenciesDisplayName.NPR=rupia nepalska
-currenciesDisplayName.CKD=dolar Wysp Cooka
-currenciesDisplayName.JPY=jen japo\u0144ski
-currenciesDisplayName.MVR=rufiyaa malediwska
-currenciesDisplayName.XCF=nowy frank CFA
-currenciesDisplayName.MVP=rupia malediwska
-currenciesDisplayName.XCD=dolar wschodniokaraibski
-currenciesDisplayName.SIT=tolar s\u0142owe\u0144ski
-currenciesDisplayName.YUR=dinar reformowany jugos\u0142awia\u0144ski
-currenciesDisplayName.AWG=gulden arubski
-currenciesDisplayName.YUO=dinar pa\u017adziernikowy jugos\u0142awia\u0144ski
-currenciesDisplayName.DDM=wschodnia marka wschodnioniemiecka
-currenciesDisplayName.YUN=dinar jugos\u0142awia\u0144ski wymienny
-currenciesDisplayName.YUM=nowy dinar jugos\u0142awia\u0144ski
-currenciesDisplayName.TCC=korona Turks i Caicos
-currenciesDisplayName.YUG=dinar jugos\u0142awia\u0144ski 1994
-currenciesDisplayName.YUF=dinar Federacji jugos\u0142awia\u0144skiej
-currenciesDisplayName.RON=nowy lej rumu\u0144ski
-currenciesDisplayName.YUD=dinar jugos\u0142awia\u0144ski wymienny
-currenciesDisplayName.ROL=lej rumu\u0144ski
-currenciesDisplayName.SIB=tolar s\u0142owe\u0144ski bonowy
-currenciesDisplayName.NOK=korona norweska
-currenciesDisplayName.MUR=rupia Mauritius
-currenciesDisplayName.GIP=funt gibraltarski
-currenciesDisplayName.VNS=dong narodowy wietnamski
-currenciesDisplayName.VNR=dong Republiki Wietnamskiej
-currenciesDisplayName.KID=dolar Kiribati
-currenciesDisplayName.SHP=funt Wyspy \u015awi\u0119tej Heleny
-currenciesDisplayName.VNN=nowy dong wietnamski
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=dolar bermudzki
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=USh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.INR=INR
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.UGX=USh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=z\u0142
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
currenciesSymbol.GNF=GF
-currenciesSymbol.UYP=UYP
-currenciesSymbol.OMR=RO
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.VNR=VNR
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=st®lut®mrz®kw®maj®cz®lip®sier®wrz®pa\u017a®lis®gr®®
-months=Stycze\u0144®Luty®Marzec®Kwiecie\u0144®Maj®Czerwiec®Lipiec®Sierpie\u0144®Wrzesie\u0144®Pa\u017adziernik®Listopad®Grudzie\u0144®®
-shortWeekdays=®N®Pn®Wt®\u015ar®Cz®Pt®So®
+months=stycze\u0144®luty®marzec®kwiecie\u0144®maj®czerwiec®lipiec®sierpie\u0144®wrzesie\u0144®pa\u017adziernik®listopad®grudzie\u0144®®
+shortWeekdays=®niedz.®pon.®wt.®\u015br.®czw.®pt.®sob.®
weekdays=®niedziela®poniedzia\u0142ek®wtorek®\u015broda®czwartek®pi\u0105tek®sobota®
firstDayOfWeek=mon
eras=p.n.e.®n.e.®
-shortDateFormat=yy-MM-dd
+shortDateFormat=dd.MM.yy
mediumDateFormat=yyyy-MM-dd
longDateFormat=d MMMM yyyy
fullDateFormat=EEEE, d MMMM yyyy
@@ -763,7 +374,9 @@ territories.GN=Gwinea
territories.GM=Gambia
territories.GL=Grenlandia
territories.SV=Salwador
+territories.062=Azja Po\u0142udniowo-\u015arodkowa
territories.ST=Wyspy \u015awi\u0119tego Tomasza i Ksi\u0105\u017c\u0119ca
+territories.061=Polinezja
territories.GI=Gibraltar
territories.GH=Ghana
territories.SR=Surinam
@@ -787,9 +400,12 @@ territories.SC=Seszele
territories.SB=Wyspy Salomona
territories.SA=Arabia Saudyjska
territories.FR=Francja
+territories.057=Mikronezja
territories.FO=Wyspy Owcze
territories.FM=Mikronezja, Stany Sfederowane
territories.RW=Rwanda
+territories.054=Melanezja
+territories.053=Australia i Nowa Zelandia
territories.FK=Falklandy (Malwiny)
territories.RU=Federacja Rosyjska
territories.FJ=Fid\u017ci
@@ -799,20 +415,26 @@ territories.RE=Reunion
territories.ET=Etiopia
territories.ES=Hiszpania
territories.ER=Erytrea
+territories.833=Wyspa Man
territories.EH=Sahara Zachodnia
territories.EG=Egipt
+territories.830=Wyspy Normandzkie
territories.EE=Estonia
+territories.QO=Oceania inne
territories.EC=Ekwador
territories.DZ=Algieria
territories.QA=Katar
+territories.039=Europa Po\u0142udniowa
territories.DO=Republika Dominika\u0144ska
territories.PY=Paragwaj
+territories.035=Azja Po\u0142udniowo-Wschodnia
territories.DM=Dominika
territories.PW=Palau
territories.DK=Dania
territories.DJ=D\u017cibuti
territories.PT=Portugalia
territories.PS=Terytoria Palesty\u0144skie
+territories.030=Azja Wschodnia
territories.PR=Puerto Rico
territories.DE=Niemcy
territories.PN=Pitcairn
@@ -829,13 +451,16 @@ territories.CX=Wyspa Bo\u017cego Narodzenia
territories.CV=Wyspy Zielonego Przyl\u0105dka
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Serbia i Czarnog\u00f3ra
territories.CR=Kostaryka
+territories.029=Morze Karaibskie
territories.CO=Kolumbia
territories.CN=Chiny
territories.CM=Kamerun
territories.CL=Chile
territories.CK=Wyspy Cooka
territories.CI=Wybrze\u017ce Ko\u015bci S\u0142oniowej
+territories.021=Ameryka P\u00f3\u0142nocna
territories.CH=Szwajcaria
territories.CG=Kongo
territories.CF=Republika \u015arodkowej Afryki
@@ -850,13 +475,20 @@ territories.BV=Wyspa Bouveta
territories.BT=Bhutan
territories.BS=Bahamy
territories.BR=Brazylia
+territories.019=Ameryka
+territories.018=Afryka Po\u0142udniowa
territories.NZ=Nowa Zelandia
territories.BO=Boliwia
+territories.017=Afryka \u015arodkowa
territories.BN=Brunei Darussalam
territories.BM=Bermudy
+territories.015=Afryka P\u00f3\u0142nocna
+territories.014=Afryka Wschodnia
+territories.013=Ameryka \u015arodkowa
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Afryka Zachodnia
territories.BH=Bahrajn
territories.NR=Nauru
territories.BG=Bu\u0142garia
@@ -874,6 +506,7 @@ territories.NG=Nigeria
territories.NF=Wyspa Norfolk
territories.AZ=Azerbejd\u017can
territories.NE=Niger
+territories.AX=Wyspy Alandzkie
territories.NC=Nowa Kaledonia
territories.AW=Aruba
territories.ZM=Zambia
@@ -882,19 +515,23 @@ territories.AU=Australia
territories.AT=Austria
territories.AS=Samoa Ameryka\u0144skie
territories.AR=Argentyna
+territories.009=Oceania
territories.AQ=Antarktyka
territories.MZ=Mozambik
territories.AO=Angola
territories.MY=Malezja
territories.AN=Antyle Holenderskie
territories.MX=Meksyk
+territories.005=Ameryka Po\u0142udniowa
territories.AM=Armenia
territories.MW=Malawi
territories.AL=Albania
territories.MV=Malediwy
territories.ZA=Afryka Po\u0142udniowa
territories.MU=Mauritius
+territories.002=Afryka
territories.MT=Malta
+territories.001=\u015awiat
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauretania
@@ -909,7 +546,6 @@ territories.MN=Mongolia
territories.MM=Birma
territories.ML=Mali
territories.MK=Macedonia, Republika
-territories.YU=Jugos\u0142awia
territories.YT=Majotta
territories.MH=Wyspy Marshalla
territories.MG=Madagaskar
@@ -919,10 +555,14 @@ territories.MA=Maroko
territories.YE=Jemen
territories.LY=Libijska
territories.LV=\u0141otwa
+territories.155=Europa Zachodnia
territories.LU=Luksemburg
+territories.154=Europa P\u00f3\u0142nocna
territories.LT=Litwa
territories.LS=Lesotho
territories.LR=Liberia
+territories.151=Europa Wschodnia
+territories.150=Europa
territories.LK=Sri Lanka
territories.LI=Liechtenstein
territories.LC=Saint Lucia
@@ -931,6 +571,8 @@ territories.LA=Laos (Demokratyczna Republika Ludowa)
territories.KZ=Kazachstan
territories.KY=Kajmany
territories.KW=Kuwejt
+territories.145=Azja Zachodnia
+territories.142=Azja
territories.KR=Korea Po\u0142udniowa
territories.KP=Korea P\u00f3\u0142nocna
territories.KN=Saint Kitts i Nevis
@@ -989,8 +631,8 @@ languages.el=grecki
languages.nl=holenderski
languages.bg=bu\u0142garski
languages.lv=\u0142otewski
-languages.he=hebrajski
languages.cs=czeski
+languages.he=hebrajski
languages.it=w\u0142oski
languages.lt=litewski
languages.fr=francuski
@@ -1005,8 +647,8 @@ languages.pl=polski
languages.sl=s\u0142owe\u0144ski
languages.sk=s\u0142owacki
languages.de=niemiecki
-languages.hu=w\u0119gierski
languages.et=esto\u0144ski
+languages.hu=w\u0119gierski
languages.es=hiszpa\u0144ski
-languages.hr=chorwacki
languages.da=du\u0144ski
+languages.hr=chorwacki
diff --git a/resource/gnu/java/locale/LocaleInformation_ps.properties b/resource/gnu/java/locale/LocaleInformation_ps.properties
index 79ed6347b..3ddfebb98 100644
--- a/resource/gnu/java/locale/LocaleInformation_ps.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ps.properties
@@ -24,8 +24,8 @@ fullTimeFormat=H:mm:ss (z)
zoneStrings=Asia/Kabul®AFT®\u062f \u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646 \u067e\u0647 \u0648\u062e\u062a®AFT®\u062f \u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646 \u067e\u0647 \u0648\u062e\u062a®©
territories.SV=\u0633\u0627\u0644\u0648\u06d0\u0689\u0648\u0631
territories.PT=\u067e\u0648\u0631\u062a\u06ab\u0627\u0644
-territories.JP=\u062c\u0627\u067e\u0627\u0646
territories.GN=\u06ab\u06cc\u0627\u0646\u0627
+territories.JP=\u062c\u0627\u067e\u0627\u0646
territories.PS=\u0641\u0644\u0633\u0637\u06cc\u0646
territories.DK=\u0689\u0646\u0645\u0627\u0631\u06a9
territories.JM=\u062c\u0645\u06cc\u06a9\u0627
@@ -42,10 +42,10 @@ territories.YE=\u06cc\u0645\u0646
territories.SA=\u0633\u0639\u0648\u062f\u06cc \u0639\u0631\u0628\u0633\u062a\u0627\u0646
territories.CU=\u06a9\u06cc\u0648\u0628\u0627
territories.LY=\u0644\u06cc\u0628\u06cc\u0627
-territories.IT=\u0627\u06cc\u067c\u0627\u0644\u06cc\u0647
territories.FR=\u0641\u0631\u0627\u0646\u0633\u0647
-territories.IS=\u0622\u06cc\u0633\u0644\u06cc\u0646\u0689
+territories.IT=\u0627\u06cc\u067c\u0627\u0644\u06cc\u0647
territories.CO=\u06a9\u0648\u0644\u0645\u0628\u06cc\u0627
+territories.IS=\u0622\u06cc\u0633\u0644\u06cc\u0646\u0689
territories.CN=\u0686\u06cc\u0646
territories.UY=\u06cc\u0648\u0631\u0648\u06ab\u0648\u0627\u06cc
territories.RW=\u0631\u0648\u0646\u062f\u0627
@@ -62,14 +62,14 @@ territories.LA=\u0644\u0627\u0648\u0633
territories.NZ=\u0646\u06cc\u0648\u0632\u06cc\u0644\u0646\u0689
territories.ET=\u062d\u0628\u0634\u0647
territories.KW=\u06a9\u0648\u06cc\u067c
-territories.HU=\u0645\u062c\u0627\u0631\u0633\u062a\u0627\u0646
territories.ES=\u0647\u0633\u067e\u0627\u0646\u06cc\u0647
+territories.HU=\u0645\u062c\u0627\u0631\u0633\u062a\u0627\u0646
territories.TZ=\u062a\u0646\u0632\u0627\u0646\u06cc\u0627
territories.HN=\u0647\u0627\u0646\u0689\u0648\u0631\u0627\u0633
territories.NP=\u0646\u06cc\u067e\u0627\u0644
territories.NO=\u0646\u0627\u0631\u0648\u06d0
-territories.HK=\u0647\u0627\u0646\u06a9\u0627\u0646\u06ab
territories.BG=\u0628\u0644\u063a\u0627\u0631\u06cc\u0647
+territories.HK=\u0647\u0627\u0646\u06a9\u0627\u0646\u06ab
territories.EG=\u0645\u0635\u0631
territories.NL=\u0647\u0627\u0644\u06d0\u0646\u0689
territories.BD=\u0628\u0646\u06ab\u0644\u0647\u200c\u062f\u06cc\u0634
@@ -116,5 +116,5 @@ languages.hy=\u0627\u0631\u0645\u0646\u064a
languages.de=\u0627\u0644\u0645\u0627\u0646\u064a
languages.mg=\u0645\u0644\u063a\u0627\u0633\u064a
languages.et=\u062d\u0628\u0634\u064a
-languages.ku=\u06a9\u0631\u062f\u064a
languages.bal=\u0628\u0644\u0648\u0685\u064a
+languages.ku=\u06a9\u0631\u062f\u064a
diff --git a/resource/gnu/java/locale/LocaleInformation_ps_AF.properties b/resource/gnu/java/locale/LocaleInformation_ps_AF.properties
index e2279e0da..086555bd5 100644
--- a/resource/gnu/java/locale/LocaleInformation_ps_AF.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ps_AF.properties
@@ -11,5 +11,5 @@ minusSign=\u2212
zeroDigit=\u06f0
decimalSeparator=\u066b
groupingSeparator=\u066c
-currencyFormat=#,##0 \u00a4;-#,##0 \u00a4
+currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
firstDayOfWeek=sat
diff --git a/resource/gnu/java/locale/LocaleInformation_pt.properties b/resource/gnu/java/locale/LocaleInformation_pt.properties
index 241d38647..15ce646ee 100644
--- a/resource/gnu/java/locale/LocaleInformation_pt.properties
+++ b/resource/gnu/java/locale/LocaleInformation_pt.properties
@@ -7,758 +7,256 @@
decimalSeparator=,
groupingSeparator=.
-currenciesDisplayName.JOD=Dinar jordaniano
-currenciesDisplayName.BOV=Mvdol boliviano
-currenciesDisplayName.XAU=Ouro
-currenciesDisplayName.FOK=Coroa das Ilhas Fero\u00e9
-currenciesDisplayName.LBP=Libra libanesa
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Dong vietnamita
-currenciesDisplayName.TZS=Xelim de Tanz\u00e2nia
-currenciesDisplayName.BOP=Peso boliviano
-currenciesDisplayName.KHR=Riel cambojano
-currenciesDisplayName.XAM=Unidade Monet\u00e1ria Asi\u00e1tica
-currenciesDisplayName.BOL=Boliviano (1863-1962)
-currenciesDisplayName.KHO=Riel Antigo do Camboja
-currenciesDisplayName.ZMP=Libra zambiana
-currenciesDisplayName.AUP=Libra australiana
-currenciesDisplayName.XAF=Franco CFA BEAC
-currenciesDisplayName.MTP=Libra maltesa
-currenciesDisplayName.GHR=Cedi reajustado de Gana
-currenciesDisplayName.ZMK=Cuacha zambiano
-currenciesDisplayName.XAD=Unidade de Conta asi\u00e1tica em dinares
-currenciesDisplayName.GHP=Libra de Gana
-currenciesDisplayName.BOB=Boliviano
-currenciesDisplayName.GHO=Cedi Antigo de Gana
-currenciesDisplayName.MTL=Lira maltesa
-currenciesDisplayName.AUD=D\u00f3lar australiano
-currenciesDisplayName.USS=D\u00f3lar norte-americano (Mesmo dia)
-currenciesDisplayName.ITL=Lira italiana
-currenciesDisplayName.USN=D\u00f3lar norte-americano (Dia seguinte)
-currenciesDisplayName.GHC=Cedi de Gana
-currenciesDisplayName.SGD=D\u00f3lar de Cingapura
-currenciesDisplayName.PAB=Balboa panamenho
-currenciesDisplayName.LAK=Kip de Laos
-currenciesDisplayName.KGS=Som de Quirguist\u00e3o
-currenciesDisplayName.CHF=Franco su\u00ed\u00e7o
-currenciesDisplayName.ATS=Xelim austr\u00edaco
-currenciesDisplayName.USD=D\u00f3lar norte-americano
-currenciesDisplayName.ETD=D\u00f3lar et\u00edope
-currenciesDisplayName.BND=D\u00f3lar do Brunei
-currenciesDisplayName.JMP=Libra jamaicana
-currenciesDisplayName.ETB=Birr et\u00edope
-currenciesDisplayName.DZG=Franco Germinal argelino
-currenciesDisplayName.DZF=Franco Novo argelino
-currenciesDisplayName.DZD=Dinar argelino
-currenciesDisplayName.PYG=Guarani paraguaio
-currenciesDisplayName.LYP=Libra l\u00edbia
-currenciesDisplayName.JMD=D\u00f3lar jamaicano
-currenciesDisplayName.ISK=Coroa islandesa
-currenciesDisplayName.ESP=Peseta espanhola
-currenciesDisplayName.BMP=Libra das Bermudas
-currenciesDisplayName.LYD=Dinar l\u00edbio
-currenciesDisplayName.LYB=Lira l\u00edbia da Autoridade Militar Brit\u00e2nica
-currenciesDisplayName.BMD=D\u00f3lar das Bermudas
-currenciesDisplayName.NLG=Guilder holand\u00eas
-currenciesDisplayName.MRO=Ouguiya da Maurit\u00e2nia
-currenciesDisplayName.IRR=Rial iraniano
-currenciesDisplayName.SEK=Coroa sueca
-currenciesDisplayName.ERN=Nakfa da Eritr\u00e9ia
+currenciesDisplayName.YDD=Dinar iemenita
+currenciesDisplayName.TWD=D\u00f3lar Novo de Taiwan
currenciesDisplayName.KES=Xelim queniano
-currenciesDisplayName.CFF=Franco da Rep\u00fablica Centro-Africana CFA
+currenciesDisplayName.BYB=Rublo novo bielo-russo (1994-1999)
+currenciesDisplayName.LKR=Rupia de Sri Lanka
+currenciesDisplayName.RWF=Franco ruand\u00eas
+currenciesDisplayName.TJS=Somoni tadjique
+currenciesDisplayName.SDP=Libra sudanesa
+currenciesDisplayName.TJR=Rublo do Tadjiquist\u00e3o
+currenciesDisplayName.ERN=Nakfa da Eritr\u00e9ia
+currenciesDisplayName.AFN=Afegane
+currenciesDisplayName.GRD=Dracma grego
+currenciesDisplayName.IEP=Libra irlandesa
currenciesDisplayName.ARS=Peso argentino
+currenciesDisplayName.SDD=Dinar sudan\u00eas
currenciesDisplayName.ARP=Peso argentino (1983-1985)
-currenciesDisplayName.ARM=Peso moneda nacional argentino
-currenciesDisplayName.TWD=D\u00f3lar Novo de Taiwan
-currenciesDisplayName.SDP=Libra sudanesa
currenciesDisplayName.GEL=Lari georgiano
+currenciesDisplayName.AFA=Afegane (1927-2002)
currenciesDisplayName.GEK=Cupom Lari georgiano
-currenciesDisplayName.MQF=Franco da Martinica
+currenciesDisplayName.CRC=Colon da Costa Rica
currenciesDisplayName.FKP=Libra das Malvinas
+currenciesDisplayName.EEK=Coroa estoniana
+currenciesDisplayName.HKD=D\u00f3lar de Hong Kong
+currenciesDisplayName.MDL=Leu de Mold\u00e1via
currenciesDisplayName.ARA=Austral argentino
-currenciesDisplayName.SDD=Dinar sudan\u00eas
currenciesDisplayName.IQD=Dinar iraquiano
-currenciesDisplayName.TVD=D\u00f3lar de Tuvalu
currenciesDisplayName.SCR=Rupia das Seychelles
+currenciesDisplayName.VUV=Vatu de Vanuatu
+currenciesDisplayName.DKK=Coroa dinamarquesa
+currenciesDisplayName.KPW=Won norte-coreano
+currenciesDisplayName.GQE=Ekwele de Guin\u00e9 Equatorial
+currenciesDisplayName.IDR=Rupia indon\u00e9sia
currenciesDisplayName.LVR=Rublo let\u00e3o
-currenciesDisplayName.FJP=Libra de Fiji
+currenciesDisplayName.SOS=Xelim somali
+currenciesDisplayName.AED=Dir\u00e9m dos Emirados \u00c1rabes Unidos
+currenciesDisplayName.BWP=Pula botsuanesa
currenciesDisplayName.LVL=Lats let\u00e3o
-currenciesDisplayName.CDL=Zaire congol\u00eas
-currenciesDisplayName.CDG=Franco da Rep\u00fablica do Congo
-currenciesDisplayName.CDF=Franco congol\u00eas
-currenciesDisplayName.FJD=D\u00f3lar de Fiji
+currenciesDisplayName.RUR=Rublo russo (1991-1998)
currenciesDisplayName.NIO=C\u00f3rdoba Ouro nicaraguano
+currenciesDisplayName.ADP=Peseta de Andorra
+currenciesDisplayName.FJD=D\u00f3lar de Fiji
currenciesDisplayName.MOP=Pataca macaense
-currenciesDisplayName.NIG=C\u00f3rdoba Ouro nicaraguano
+currenciesDisplayName.RUB=Rublo russo
+currenciesDisplayName.CDF=Franco congol\u00eas
currenciesDisplayName.NIC=C\u00f3rdoba nicaraguano
-currenciesDisplayName.XTR=Rublo transfer\u00edvel do COMECON
-currenciesDisplayName.FIN=Marca finlandesa (1860-1962)
-currenciesDisplayName.FIM=Marca finlandesa
+currenciesDisplayName.DJF=Franco do Djibuti
+currenciesDisplayName.ECV=Unidad de Valor Constante (UVC) do Equador
currenciesDisplayName.SBD=D\u00f3lar das Ilhas Salom\u00e3o
+currenciesDisplayName.UZS=Sum do Usbequist\u00e3o
+currenciesDisplayName.ECS=Sucre equatoriano
+currenciesDisplayName.PHP=Peso filipino
+currenciesDisplayName.THB=Baht tailand\u00eas
currenciesDisplayName.LUF=Franco luxemburgu\u00eas
-currenciesDisplayName.TTO=D\u00f3lar Antigo de Trinidad e Tobago
-currenciesDisplayName.AOS=Escudo angolano
-currenciesDisplayName.AOR=Cuanza angolano reajustado (1995-1999)
-currenciesDisplayName.MNT=Tugrik mongol
-currenciesDisplayName.HUF=Forinte h\u00fangaro
-currenciesDisplayName.BIF=Franco do Burundi
-currenciesDisplayName.AON=Cuanza novo angolano (1990-2000)
-currenciesDisplayName.AOK=Cuanza angolano (1977-1990)
+currenciesDisplayName.FIM=Marca finlandesa
currenciesDisplayName.TTD=D\u00f3lar de Trinidad e Tobago
currenciesDisplayName.SZL=Lilangeni da Suazil\u00e2ndia
-currenciesDisplayName.NHF=Franco CFP das Novas H\u00e9bridas
-currenciesDisplayName.GBP=Libra esterlina brit\u00e2nica
-currenciesDisplayName.SAS=Rial Soberano saudita
+currenciesDisplayName.MNT=Tugrik mongol
currenciesDisplayName.SAR=Rial saudita
+currenciesDisplayName.UAK=Karbovanetz ucraniano
+currenciesDisplayName.UAH=Hryvnia ucraniano
+currenciesDisplayName.HUF=Forinte h\u00fangaro
+currenciesDisplayName.COP=Peso colombiano
+currenciesDisplayName.QAR=Rial catariano
currenciesDisplayName.LTT=Talonas lituano
-currenciesDisplayName.INR=Rupia indiana
currenciesDisplayName.PTE=Escudo portugu\u00eas
-currenciesDisplayName.AOA=Cuanza angolano
-currenciesDisplayName.PTC=Conto portugu\u00eas
+currenciesDisplayName.AOR=Cuanza angolano reajustado (1995-1999)
+currenciesDisplayName.UYU=Peso uruguaio
+currenciesDisplayName.GBP=Libra esterlina brit\u00e2nica
+currenciesDisplayName.BIF=Franco do Burundi
+currenciesDisplayName.INR=Rupia indiana
+currenciesDisplayName.ZRZ=Zaire zairense
+currenciesDisplayName.AON=Cuanza novo angolano (1990-2000)
currenciesDisplayName.LTL=Lita lituano
+currenciesDisplayName.XFU=Franco UIC franc\u00eas
currenciesDisplayName.KZT=Tenge do Cazaquist\u00e3o
-currenciesDisplayName.KZR=Rublo do Cazaquist\u00e3o
-currenciesDisplayName.VGD=D\u00f3lar das Ilhas Virgens Brit\u00e2nicas
-currenciesDisplayName.NGP=Libra nigeriana
-currenciesDisplayName.MMX=Certificados de c\u00e2mbio birmaneses em d\u00f3lares
+currenciesDisplayName.MZM=Metical de Mo\u00e7ambique
+currenciesDisplayName.UYP=Peso uruguaio (1975-1993)
+currenciesDisplayName.AOK=Cuanza angolano (1977-1990)
+currenciesDisplayName.BUK=Kyat birman\u00eas
+currenciesDisplayName.GNS=Syli de Guin\u00e9
+currenciesDisplayName.XFO=Franco-ouro franc\u00eas
+currenciesDisplayName.PGK=Kina da Papua-Nova Guin\u00e9
+currenciesDisplayName.SYP=Libra s\u00edria
+currenciesDisplayName.MZE=Escudo de Mo\u00e7ambique
+currenciesDisplayName.OMR=Rial de Om\u00e3
currenciesDisplayName.NGN=Naira nigeriana
+currenciesDisplayName.ZRN=Zaire Novo zairense
+currenciesDisplayName.AOA=Cuanza angolano
+currenciesDisplayName.CNY=Yuan Renminbi chin\u00eas
+currenciesDisplayName.MAF=Franco marroquino
+currenciesDisplayName.GNF=Franco de Guin\u00e9
currenciesDisplayName.HTG=Gurde do Haiti
-currenciesDisplayName.SYP=Libra s\u00edria
-currenciesDisplayName.PSP=Libra palestina
-currenciesDisplayName.BHD=Dinar bareinita
+currenciesDisplayName.MAD=Dir\u00e9m marroquino
currenciesDisplayName.MMK=Kyat de Mianmar
+currenciesDisplayName.MYR=Ringgit malaio
+currenciesDisplayName.LSL=Loti de Lesoto
+currenciesDisplayName.XEU=Unidade Monet\u00e1ria Europ\u00e9ia
+currenciesDisplayName.BHD=Dinar bareinita
+currenciesDisplayName.SLL=Leone de Serra Leoa
+currenciesDisplayName.BTN=Ngultrum do But\u00e3o
+currenciesDisplayName.TRL=Lira turca
+currenciesDisplayName.KMF=Franco de Comores
currenciesDisplayName.ANG=Guilder das Antilhas Holandesas
currenciesDisplayName.CZK=Coroa da Rep\u00fablica Checa
-currenciesDisplayName.IMP=Libra esterlina da Ilha de Man
-currenciesDisplayName.BGX=Certificados de c\u00e2mbio b\u00falgaros em leva
-currenciesDisplayName.LSL=Loti de Lesoto
-currenciesDisplayName.GAF=Franco do Gab\u00e3o CFA
-currenciesDisplayName.BGO=Lev b\u00falgaro (1879-1952)
+currenciesDisplayName.AZM=Manat azerbaijano
+currenciesDisplayName.KYD=D\u00f3lar das Ilhas Caim\u00e3o
+currenciesDisplayName.GMD=Dalasi de G\u00e2mbia
currenciesDisplayName.BGN=Lev novo b\u00falgaro
-currenciesDisplayName.BGM=Lev socialista b\u00falgaro
currenciesDisplayName.CAD=D\u00f3lar canadense
+currenciesDisplayName.MXV=Unidad de Inversion (UDI) mexicana
currenciesDisplayName.BGL=Lev forte b\u00falgaro
-currenciesDisplayName.TRL=Lira turca
-currenciesDisplayName.KYD=D\u00f3lar das Ilhas Caim\u00e3o
-currenciesDisplayName.CYP=Libra de Chipre
+currenciesDisplayName.VEB=Bol\u00edvar venezuelano
+currenciesDisplayName.MLF=Franco de Mali
currenciesDisplayName.ILS=Sheqel Novo israelita
+currenciesDisplayName.MXP=Peso Plata mexicano (1861-1992)
+currenciesDisplayName.PES=Sol peruano
currenciesDisplayName.GYD=D\u00f3lar da Guiana
-currenciesDisplayName.AMD=Dram Arm\u00e9nio
+currenciesDisplayName.MXN=Peso mexicano
currenciesDisplayName.ILP=Libra israelita
-currenciesDisplayName.MLF=Franco de Mali
-currenciesDisplayName.ILL=Sheqel israelita
-currenciesDisplayName.VEB=Bol\u00edvar venezuelano
-currenciesDisplayName.ALX=Certificados de c\u00e2mbio albaneses em d\u00f3lares
+currenciesDisplayName.SKK=Coroa eslovaca
+currenciesDisplayName.CYP=Libra de Chipre
+currenciesDisplayName.XDR=Direitos Especiais de Giro
+currenciesDisplayName.PEN=Sol Novo peruano
currenciesDisplayName.LRD=D\u00f3lar liberiano
-currenciesDisplayName.ALV=Lek Valute Alban\u00eas
+currenciesDisplayName.PEI=Inti peruano
+currenciesDisplayName.AMD=Dram Arm\u00e9nio
+currenciesDisplayName.BSD=D\u00f3lar das Bahamas
currenciesDisplayName.HRK=Kuna croata
-currenciesDisplayName.REF=Franco de Reuni\u00e3o
+currenciesDisplayName.CLP=Peso chileno
currenciesDisplayName.HRD=Dinar croata
-currenciesDisplayName.ALL=Lek Alban\u00eas
-currenciesDisplayName.JEP=Libra esterlina de Jersey
-currenciesDisplayName.MKN=Dinar maced\u00f4nio (1992-1993)
-currenciesDisplayName.VDP=Viet Minh Piastre Dong Viet do Vietn\u00e3 do Norte
-currenciesDisplayName.VDN=Dong Novo do Vietn\u00e3 do Norte
-currenciesDisplayName.MKD=Dinar maced\u00f4nio
-currenciesDisplayName.VDD=Piastre Dong Viet do Vietn\u00e3 do Norte
-currenciesDisplayName.TPP=Pataca timorense
currenciesDisplayName.XPF=Franco CFP
-currenciesDisplayName.BEL=Franco belga (financeiro)
-currenciesDisplayName.GWP=Peso da Guin\u00e9-Bissau
-currenciesDisplayName.KWD=Dinar coveitiano
-currenciesDisplayName.GWM=Mil-r\u00e9is da Guin\u00e9 Portuguesa
-currenciesDisplayName.BEF=Franco belga
+currenciesDisplayName.FRF=Franco franc\u00eas
+currenciesDisplayName.BRR=Cruzeiro brasileiro
+currenciesDisplayName.MKD=Dinar maced\u00f4nio
+currenciesDisplayName.CLF=Unidades de Fomento chilenas
+currenciesDisplayName.ALL=Lek Alban\u00eas
+currenciesDisplayName.BRN=Cruzado novo brasileiro
+currenciesDisplayName.MWK=Cuacha do Mal\u00e1ui
+currenciesDisplayName.BRL=Real brasileiro
currenciesDisplayName.TPE=Escudo timorense
-currenciesDisplayName.BEC=Franco belga (convers\u00edvel)
-currenciesDisplayName.GWE=Escudo da Guin\u00e9 Portuguesa
+currenciesDisplayName.BRE=Cruzeiro brasileiro (1990-1993)
+currenciesDisplayName.BRC=Cruzado brasileiro
+currenciesDisplayName.BRB=Cruzeiro novo brasileiro(1967-1986)
+currenciesDisplayName.DEM=Marco alem\u00e3o
+currenciesDisplayName.KWD=Dinar coveitiano
+currenciesDisplayName.XCD=D\u00f3lar do Caribe Oriental
+currenciesDisplayName.NPR=Rupia nepalesa
+currenciesDisplayName.GWP=Peso da Guin\u00e9-Bissau
+currenciesDisplayName.YUN=Dinar convers\u00edvel iugoslavo
currenciesDisplayName.SVC=Colom salvadorenho
-currenciesDisplayName.CWG=Guilder de Cura\u00e7au
-currenciesDisplayName.BDT=Taka de Bangladesh
-currenciesDisplayName.TOS=Libra esterlina de Tonga
-currenciesDisplayName.TOP=Pa\u02bbanga de Tonga
+currenciesDisplayName.YUM=Super Dinar iugoslavo
+currenciesDisplayName.BEL=Franco belga (financeiro)
+currenciesDisplayName.SIT=Tolar Bons esloveno
+currenciesDisplayName.JPY=Iene japon\u00eas
currenciesDisplayName.XOF=Franco CFA BCEAO
+currenciesDisplayName.MVR=Rupias das Ilhas Maldivas
+currenciesDisplayName.GWE=Escudo da Guin\u00e9 Portuguesa
+currenciesDisplayName.BEF=Franco belga
+currenciesDisplayName.TOP=Pa\u02bbanga de Tonga
+currenciesDisplayName.YUD=Dinar forte iugoslavo
+currenciesDisplayName.BEC=Franco belga (convers\u00edvel)
currenciesDisplayName.SUR=Rublo sovi\u00e9tico
-currenciesDisplayName.SUN=Rublo Novo sovi\u00e9tico
-currenciesDisplayName.NCF=Franco Germinal da Nova Caled\u00f4nia
-currenciesDisplayName.CVE=Escudo cabo-verdiano
-currenciesDisplayName.XNF=Franco CFA das Antilhas Francesas
+currenciesDisplayName.ROL=Leu romeno
+currenciesDisplayName.DDM=Ostmark da Alemanha Oriental
+currenciesDisplayName.BDT=Taka de Bangladesh
+currenciesDisplayName.XBD=Unidade de Conta Europ\u00e9ia (XBD)
+currenciesDisplayName.AWG=Guilder de Aruba
+currenciesDisplayName.XBC=Unidade de Conta Europ\u00e9ia (XBC)
+currenciesDisplayName.XBB=Unidade Monet\u00e1ria Europ\u00e9ia
+currenciesDisplayName.XBA=Unidade Composta Europ\u00e9ia
+currenciesDisplayName.NOK=Coroa norueguesa
+currenciesDisplayName.MUR=Rupia de Maur\u00edcio
currenciesDisplayName.ZAR=Rand sul-africano
-currenciesDisplayName.DOP=Peso dominicano
-currenciesDisplayName.CUX=Certificados de c\u00e2mbio cubanos
-currenciesDisplayName.ZAP=Libra sul-africana
+currenciesDisplayName.SHP=Libra de Santa Helena
+currenciesDisplayName.XAU=Ouro
currenciesDisplayName.ZAL=Rand sul-africano (financeiro)
+currenciesDisplayName.VND=Dong vietnamita
+currenciesDisplayName.TZS=Xelim de Tanz\u00e2nia
+currenciesDisplayName.GIP=Libra de Gibraltar
currenciesDisplayName.TND=Dinar tunisiano
-currenciesDisplayName.CUP=Peso cubano
-currenciesDisplayName.GUF=Franco da Guiana Francesa
+currenciesDisplayName.CVE=Escudo cabo-verdiano
currenciesDisplayName.UGX=Xelim ugandense
-currenciesDisplayName.LNR=Rupia do Ceil\u00e3o
-currenciesDisplayName.AIF=Franco de Affars e Issas
-currenciesDisplayName.VAL=Lira da Cidade do Vaticano
-currenciesDisplayName.STE=Escudo de S\u00e3o Tom\u00e9 e Pr\u00edncipe
+currenciesDisplayName.ZMK=Cuacha zambiano
+currenciesDisplayName.JOD=Dinar jordaniano
+currenciesDisplayName.XAF=Franco CFA BEAC
+currenciesDisplayName.LBP=Libra libanesa
currenciesDisplayName.UGS=Xelim ugandense (1966-1987)
currenciesDisplayName.STD=Dobra de S\u00e3o Tom\u00e9 e Pr\u00edncipe
-currenciesDisplayName.MHD=D\u00f3lar das Ilhas Marshall
-currenciesDisplayName.NZP=Libra da Nova Zel\u00e2ndia
currenciesDisplayName.WST=Tala de Samoa Ocidental
-currenciesDisplayName.WSP=Libra de Samoa Ocidental
-currenciesDisplayName.HNL=Lempira de Honduras
-currenciesDisplayName.XMF=Franco Novo Metropolitano franc\u00eas
+currenciesDisplayName.KHR=Riel cambojano
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Peso dominicano
+currenciesDisplayName.BOV=Mvdol boliviano
+currenciesDisplayName.MTP=Libra maltesa
+currenciesDisplayName.USS=D\u00f3lar norte-americano (Mesmo dia)
+currenciesDisplayName.BOP=Peso boliviano
+currenciesDisplayName.MTL=Lira maltesa
+currenciesDisplayName.CUP=Peso cubano
currenciesDisplayName.TMM=Manat do Turcomenist\u00e3o
-currenciesDisplayName.GTQ=Quet\u00e7al da Guatemala
+currenciesDisplayName.USN=D\u00f3lar norte-americano (Dia seguinte)
+currenciesDisplayName.SGD=D\u00f3lar de Cingapura
currenciesDisplayName.NZD=D\u00f3lar da Nova Zel\u00e2ndia
-currenciesDisplayName.SSP=Libra escocesa
-currenciesDisplayName.BBD=D\u00f3lar de Barbados
+currenciesDisplayName.USD=D\u00f3lar norte-americano
+currenciesDisplayName.HNL=Lempira de Honduras
+currenciesDisplayName.BOB=Boliviano
+currenciesDisplayName.ITL=Lira italiana
+currenciesDisplayName.PAB=Balboa panamenho
+currenciesDisplayName.GTQ=Quet\u00e7al da Guatemala
+currenciesDisplayName.LAK=Kip de Laos
+currenciesDisplayName.GHC=Cedi de Gana
+currenciesDisplayName.AUD=D\u00f3lar australiano
currenciesDisplayName.NAD=D\u00f3lar da Nam\u00edbia
+currenciesDisplayName.KGS=Som de Quirguist\u00e3o
currenciesDisplayName.MGF=Franco de Madagascar
+currenciesDisplayName.CHF=Franco su\u00ed\u00e7o
+currenciesDisplayName.BBD=D\u00f3lar de Barbados
currenciesDisplayName.MGA=Ariary de Madagascar
-currenciesDisplayName.EGP=Libra eg\u00edpcia
-currenciesDisplayName.BZH=D\u00f3lar de Honduras Brit\u00e2nica
+currenciesDisplayName.PYG=Guarani paraguaio
currenciesDisplayName.PLZ=Zloti polon\u00eas (1950-1995)
-currenciesDisplayName.BAN=Dinar novo da B\u00f3snia-Herzeg\u00f3vina
-currenciesDisplayName.PLX=Certificados de c\u00e2mbio poloneses em d\u00f3lares
-currenciesDisplayName.BAM=Marco b\u00f3snio-herzeg\u00f3vino convers\u00edvel
-currenciesDisplayName.BZD=D\u00f3lar do Belize
-currenciesDisplayName.BAD=Dinar da B\u00f3snia-Herzeg\u00f3vina
-currenciesDisplayName.PLN=Zloti polon\u00eas
currenciesDisplayName.YER=Rial iemenita
+currenciesDisplayName.ATS=Xelim austr\u00edaco
+currenciesDisplayName.ETB=Birr et\u00edope
+currenciesDisplayName.BND=D\u00f3lar do Brunei
+currenciesDisplayName.JMD=D\u00f3lar jamaicano
+currenciesDisplayName.EGP=Libra eg\u00edpcia
+currenciesDisplayName.PLN=Zloti polon\u00eas
+currenciesDisplayName.DZD=Dinar argelino
+currenciesDisplayName.ISK=Coroa islandesa
currenciesDisplayName.SRG=Guilder do Suriname
-currenciesDisplayName.CSK=Coroa Forte checoslovaca
+currenciesDisplayName.LYD=Dinar l\u00edbio
+currenciesDisplayName.BZD=D\u00f3lar do Belize
+currenciesDisplayName.BAM=Marco b\u00f3snio-herzeg\u00f3vino convers\u00edvel
+currenciesDisplayName.ESP=Peseta espanhola
currenciesDisplayName.KRW=Won sul-coreano
+currenciesDisplayName.NLG=Guilder holand\u00eas
+currenciesDisplayName.MRO=Ouguiya da Maurit\u00e2nia
+currenciesDisplayName.BAD=Dinar da B\u00f3snia-Herzeg\u00f3vina
+currenciesDisplayName.ZWD=D\u00f3lar do Zimb\u00e1bwe
+currenciesDisplayName.SEK=Coroa sueca
+currenciesDisplayName.CSK=Coroa Forte checoslovaca
currenciesDisplayName.BYR=Rublo bielo-russo
-currenciesDisplayName.YEI=Rial Imadi iemenita
-currenciesDisplayName.BYL=Rublo bielo-russo (1992-1994)
-currenciesDisplayName.CSC=Coroa checoslovaca
-currenciesDisplayName.KRO=Won Antigo sul-coreano
-currenciesDisplayName.KRH=Hwan sul-coreano
-currenciesDisplayName.BYB=Rublo novo bielo-russo (1994-1999)
-currenciesDisplayName.SQS=Xelim de Somalil\u00e2ndia
-currenciesDisplayName.GRN=Dracma Novo grego
+currenciesDisplayName.IRR=Rial iraniano
currenciesDisplayName.PKR=Rupia paquistanesa
-currenciesDisplayName.AFN=Afegane
-currenciesDisplayName.ZWD=D\u00f3lar do Zimb\u00e1bwe
-currenciesDisplayName.LKR=Rupia de Sri Lanka
-currenciesDisplayName.GRD=Dracma grego
-currenciesDisplayName.IEP=Libra irlandesa
-currenciesDisplayName.AFA=Afegane (1927-2002)
-currenciesDisplayName.YDD=Dinar iemenita
-currenciesDisplayName.RWF=Franco ruand\u00eas
-currenciesDisplayName.CRC=Colon da Costa Rica
-currenciesDisplayName.TJS=Somoni tadjique
-currenciesDisplayName.TJR=Rublo do Tadjiquist\u00e3o
-currenciesDisplayName.EEK=Coroa estoniana
-currenciesDisplayName.GQP=Peseta Guineana de Guin\u00e9 Equatorial
-currenciesDisplayName.MDR=Cupom rublo mol\u00e1vio
-currenciesDisplayName.HKD=D\u00f3lar de Hong Kong
-currenciesDisplayName.DKK=Coroa dinamarquesa
-currenciesDisplayName.MDL=Leu de Mold\u00e1via
-currenciesDisplayName.GQF=Franco de Guin\u00e9 Equatorial
-currenciesDisplayName.GQE=Ekwele de Guin\u00e9 Equatorial
-currenciesDisplayName.IDR=Rupia indon\u00e9sia
-currenciesDisplayName.AED=Dir\u00e9m dos Emirados \u00c1rabes Unidos
-currenciesDisplayName.KPW=Won norte-coreano
-currenciesDisplayName.IDN=Rupia Nova indon\u00e9sia
-currenciesDisplayName.BWP=Pula botsuanesa
-currenciesDisplayName.MDC=Cupom leu mold\u00e1vio
-currenciesDisplayName.IDJ=Rupia Java indon\u00e9sia
-currenciesDisplayName.KPP=Won da Rep\u00fablica Popular da Cor\u00e9ia do Norte
-currenciesDisplayName.IDG=Guilder Nica indon\u00e9sio
-currenciesDisplayName.VUV=Vatu de Vanuatu
-currenciesDisplayName.XID=Dinar isl\u00e2mico
-currenciesDisplayName.SOS=Xelim somali
-currenciesDisplayName.ADP=Peseta de Andorra
-currenciesDisplayName.RUR=Rublo russo (1991-1998)
-currenciesDisplayName.GPF=Franco de Guadalupe
-currenciesDisplayName.DJF=Franco do Djibuti
-currenciesDisplayName.ADD=Diner de Andorra
-currenciesDisplayName.MCG=Franco Germinal de M\u00f4naco
-currenciesDisplayName.MCF=Franco Novo de M\u00f4naco
-currenciesDisplayName.ECV=Unidad de Valor Constante (UVC) do Equador
-currenciesDisplayName.ECS=Sucre equatoriano
-currenciesDisplayName.LIF=Franco de Liechtenstein
-currenciesDisplayName.RUB=Rublo russo
-currenciesDisplayName.PHP=Peso filipino
-currenciesDisplayName.UZS=Sum do Usbequist\u00e3o
-currenciesDisplayName.COP=Peso colombiano
-currenciesDisplayName.THB=Baht tailand\u00eas
-currenciesDisplayName.IBP=Libra da Irlanda do Norte
-currenciesDisplayName.BUR=Rupia birmanesa
-currenciesDisplayName.COF=Franco do Congo CFA
-currenciesDisplayName.BUK=Kyat birman\u00eas
-currenciesDisplayName.COB=Peso de Papel colombiano
-currenciesDisplayName.UZC=Coupon Som do Usbequist\u00e3o
-currenciesDisplayName.UAK=Karbovanetz ucraniano
-currenciesDisplayName.QAR=Rial catariano
-currenciesDisplayName.UAH=Hryvnia ucraniano
-currenciesDisplayName.GNS=Syli de Guin\u00e9
-currenciesDisplayName.CNY=Yuan Renminbi chin\u00eas
-currenciesDisplayName.MZM=Metical de Mo\u00e7ambique
-currenciesDisplayName.CNX=Certificados de c\u00e2mbio chineses em d\u00f3lares dos EUA
-currenciesDisplayName.UYU=Peso uruguaio
-currenciesDisplayName.GNI=Franco de Guin\u00e9 (1960-1972)
-currenciesDisplayName.SML=Lira de San Marino
-currenciesDisplayName.CNP=Jen Min Piao Yuan chin\u00eas
-currenciesDisplayName.MZE=Escudo de Mo\u00e7ambique
-currenciesDisplayName.GNF=Franco de Guin\u00e9
-currenciesDisplayName.OMS=Rial Saidi de Om\u00e3
-currenciesDisplayName.PGK=Kina da Papua-Nova Guin\u00e9
-currenciesDisplayName.OMR=Rial de Om\u00e3
-currenciesDisplayName.UYP=Peso uruguaio (1975-1993)
-currenciesDisplayName.XFU=Franco UIC franc\u00eas
-currenciesDisplayName.BTR=Rupia do But\u00e3o
-currenciesDisplayName.ZRZ=Zaire zairense
-currenciesDisplayName.MAF=Franco marroquino
-currenciesDisplayName.MAD=Dir\u00e9m marroquino
-currenciesDisplayName.BTN=Ngultrum do But\u00e3o
-currenciesDisplayName.XFO=Franco-ouro franc\u00eas
-currenciesDisplayName.UYF=Peso Fuerte uruguaio
-currenciesDisplayName.MYR=Ringgit malaio
-currenciesDisplayName.ZRN=Zaire Novo zairense
-currenciesDisplayName.AZM=Manat azerbaijano
-currenciesDisplayName.GMP=Libra de G\u00e2mbia
-currenciesDisplayName.KMF=Franco de Comores
-currenciesDisplayName.SLL=Leone de Serra Leoa
-currenciesDisplayName.GMD=Dalasi de G\u00e2mbia
-currenciesDisplayName.XEU=Unidade Monet\u00e1ria Europ\u00e9ia
-currenciesDisplayName.BSP=Libra das Bahamas
-currenciesDisplayName.CMF=Franco dos Camar\u00f5es CFA
-currenciesDisplayName.MXV=Unidad de Inversion (UDI) mexicana
-currenciesDisplayName.XEF=Franco CFA BCEAEC
-currenciesDisplayName.BSD=D\u00f3lar das Bahamas
-currenciesDisplayName.MXP=Peso Plata mexicano (1861-1992)
-currenciesDisplayName.MXN=Peso mexicano
-currenciesDisplayName.PES=Sol peruano
-currenciesDisplayName.GLK=Coroa de Groenl\u00e2ndia
-currenciesDisplayName.BRZ=Cruzeiro brasileiro (1942-1967)
-currenciesDisplayName.PEN=Sol Novo peruano
-currenciesDisplayName.CLP=Peso chileno
-currenciesDisplayName.SKK=Coroa eslovaca
-currenciesDisplayName.PEI=Inti peruano
-currenciesDisplayName.BRR=Cruzeiro brasileiro
-currenciesDisplayName.XDR=Direitos Especiais de Giro
-currenciesDisplayName.FRG=Franco Germinal franc\u00eas/Franco Poincar\u00e9
-currenciesDisplayName.FRF=Franco franc\u00eas
-currenciesDisplayName.BRN=Cruzado novo brasileiro
-currenciesDisplayName.CLF=Unidades de Fomento chilenas
-currenciesDisplayName.CLE=Escudo chileno
-currenciesDisplayName.BRL=Real brasileiro
-currenciesDisplayName.CLC=Condor chileno
-currenciesDisplayName.BRE=Cruzeiro brasileiro (1990-1993)
-currenciesDisplayName.DES=Sperrmark alem\u00e3o
-currenciesDisplayName.MWP=Libra do Mal\u00e1ui
-currenciesDisplayName.BRC=Cruzado brasileiro
-currenciesDisplayName.BRB=Cruzeiro novo brasileiro(1967-1986)
-currenciesDisplayName.MWK=Cuacha do Mal\u00e1ui
-currenciesDisplayName.PDR=Rublo de Transdniestria
-currenciesDisplayName.DEM=Marco alem\u00e3o
-currenciesDisplayName.TDF=Franco CFA de Chade
-currenciesDisplayName.PDN=Rublo Novo de Transdniestria
-currenciesDisplayName.PDK=Cupom rublo de Transdniestria
-currenciesDisplayName.NPR=Rupia nepalesa
-currenciesDisplayName.CKD=D\u00f3lar das Ilhas Cook
-currenciesDisplayName.JPY=Iene japon\u00eas
-currenciesDisplayName.MVR=Rupias das Ilhas Maldivas
-currenciesDisplayName.XCF=Franco Novo CFA
-currenciesDisplayName.MVP=Rupia das Ilhas Maldivas
-currenciesDisplayName.XCD=D\u00f3lar do Caribe Oriental
-currenciesDisplayName.SIT=Tolar Bons esloveno
-currenciesDisplayName.YUR=Dinar reformado iugoslavo
-currenciesDisplayName.AWG=Guilder de Aruba
-currenciesDisplayName.YUO=Dinar de outubro iugoslavo
-currenciesDisplayName.DDM=Ostmark da Alemanha Oriental
-currenciesDisplayName.YUN=Dinar convers\u00edvel iugoslavo
-currenciesDisplayName.YUM=Super Dinar iugoslavo
-currenciesDisplayName.TCC=Coroa de Turcas e Caicos
-currenciesDisplayName.YUG=Dinar iugoslavo de 1994
-currenciesDisplayName.YUF=Dinar da Federa\u00e7\u00e3o Iugoslava
-currenciesDisplayName.RON=Leu Novo romeno
-currenciesDisplayName.YUD=Dinar forte iugoslavo
-currenciesDisplayName.ROL=Leu romeno
-currenciesDisplayName.SIB=Tolar Bons esloveno
-currenciesDisplayName.NOK=Coroa norueguesa
-currenciesDisplayName.MUR=Rupia de Maur\u00edcio
-currenciesDisplayName.XBD=Unidade de Conta Europ\u00e9ia (XBD)
-currenciesDisplayName.GIP=Libra de Gibraltar
-currenciesDisplayName.VNS=Dong Nacional vietnamita
-currenciesDisplayName.XBC=Unidade de Conta Europ\u00e9ia (XBC)
-currenciesDisplayName.VNR=Dong da Rep\u00fablica do Vietn\u00e3
-currenciesDisplayName.XBB=Unidade Monet\u00e1ria Europ\u00e9ia
-currenciesDisplayName.XBA=Unidade Composta Europ\u00e9ia
-currenciesDisplayName.KID=D\u00f3lar do Quiribati
-currenciesDisplayName.SHP=Libra de Santa Helena
-currenciesDisplayName.VNN=Dong Novo vietnamita
-currenciesSymbol.JOD=JOD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LBP
-currenciesSymbol.VND=\u0111
-currenciesSymbol.TZS=TZS
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=KHR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=BOB
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=MTL
-currenciesSymbol.AUD=AUD
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=SGD
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=KGS
-currenciesSymbol.CHF=CHF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=ETB
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DZD
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=JMD
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LYD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=BMD
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=MRO
-currenciesSymbol.IRR=IRR
-currenciesSymbol.SEK=SEK
-currenciesSymbol.ERN=ERN
-currenciesSymbol.KES=KES
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=ARS
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=TWD
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GEL=GEL
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
-currenciesSymbol.IQD=IQD
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SCR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=FJD
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
-currenciesSymbol.SBD=SBD
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=MNT
-currenciesSymbol.HUF=HUF
-currenciesSymbol.BIF=BIF
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
-currenciesSymbol.TTD=TTD
-currenciesSymbol.SZL=SZL
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
-currenciesSymbol.SAR=SAR
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=Esc.
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=KZT
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=SYP
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BHD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=ANG
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=LSL
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=CAD
-currenciesSymbol.BGL=BGL
-currenciesSymbol.TRL=TRL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=CYP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=GYD
-currenciesSymbol.AMD=AMD
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=VEB
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=ALL
-currenciesSymbol.JEP=JEP
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MKD
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
+currenciesDisplayName.BMD=D\u00f3lar das Bermudas
currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KWD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BEF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
-currenciesSymbol.BDT=BDT
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=TOP
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
-currenciesSymbol.CVE=CVE
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=ZAR
-currenciesSymbol.DOP=DOP
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=UGX
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=STD
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
-currenciesSymbol.HNL=HNL
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
-currenciesSymbol.GTQ=GTQ
-currenciesSymbol.NZD=NZD
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BBD
-currenciesSymbol.NAD=NAD
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=BAM
-currenciesSymbol.BZD=BZD
-currenciesSymbol.BAD=BAD
-currenciesSymbol.PLN=PLN
currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=SRG
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=BYR
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=PKR
-currenciesSymbol.AFN=AFA
-currenciesSymbol.ZWD=ZWD
-currenciesSymbol.LKR=LKR
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IEP
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=CRC
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HKD
-currenciesSymbol.DKK=DKK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=IDR
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VUV
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=SOS
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DJF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=COP
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QAR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=CNY
-currenciesSymbol.MZM=MZM
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=UYU
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.GNF=GNF
-currenciesSymbol.OMS=OMS
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMR=OMR
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=BTN
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=MYR
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
-currenciesSymbol.KMF=KMF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MXN
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=CLP
-currenciesSymbol.SKK=SKK
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
+currenciesSymbol.VND=\u0111
+currenciesSymbol.PTE=Esc.
currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MWK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=NPR
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=XCD
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=ROL
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NOK
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.AFN=AFA
shortMonths=jan®fev®mar®abr®mai®jun®jul®ago®set®out®nov®dez®®
months=janeiro®fevereiro®mar\u00e7o®abril®maio®junho®julho®agosto®setembro®outubro®novembro®dezembro®®
shortWeekdays=®dom®seg®ter®qua®qui®sex®s\u00e1b®
@@ -770,7 +268,7 @@ mediumDateFormat=d/MMM/yyyy
longDateFormat=d' de 'MMMM' de 'yyyy
fullDateFormat=EEEE, d' de 'MMMM' de 'yyyy
fullTimeFormat=HH'H'mm'm'ss's' z
-zoneStrings=America/Indianapolis®EST®Hor\u00e1rio Padr\u00e3o Oriental®EST®Hor\u00e1rio Padr\u00e3o Oriental®©America/Halifax®AST®Hor\u00e1rio Padr\u00e3o Atl\u00e2ntico®ADT®Hor\u00e1rio de Ver\u00e3o Atl\u00e2ntico®©Pacific/Honolulu®HST®Hor\u00e1rio Padr\u00e3o do Hava\u00ed®HST®Hor\u00e1rio Padr\u00e3o do Hava\u00ed®©America/Denver®MST®Hor\u00e1rio Padr\u00e3o Montanha®MDT®Hor\u00e1rio de Ver\u00e3o Montanha®©America/Anchorage®AST®Hor\u00e1rio Padr\u00e3o do Alasca®ADT®Hor\u00e1rio de Ver\u00e3o do Alasca®©America/St_Johns®CNT®Hor\u00e1rio Padr\u00e3o de Terra Nova®CDT®Hor\u00e1rio de Ver\u00e3o de Terra Nova®©Africa/Casablanca®GMT®Hor\u00e1rio do Meridiano de Greenwich®GMT®Hor\u00e1rio do Meridiano de Greenwich®©America/Chicago®CST®Hor\u00e1rio Padr\u00e3o Central®CDT®Hor\u00e1rio de Ver\u00e3o Central®©Asia/Shanghai®CTT®Hor\u00e1rio Padr\u00e3o da China®CDT®Hor\u00e1rio Padr\u00e3o da China®©Asia/Tokyo®JST®Hor\u00e1rio Padr\u00e3o do Jap\u00e3o®JST®Hor\u00e1rio Padr\u00e3o do Jap\u00e3o®©America/New_York®EST®Hor\u00e1rio Padr\u00e3o Oriental®EDT®Hor\u00e1rio de Ver\u00e3o Oriental®©Europe/Bucharest®EET®Hor\u00e1rio Padr\u00e3o da Europa Oriental®EEST®Hor\u00e1rio de Ver\u00e3o da Europa Oriental®©America/Los_Angeles®PST®Hor\u00e1rio Padr\u00e3o do Pac\u00edfico®PDT®Hor\u00e1rio de Ver\u00e3o do Pac\u00edfico®©America/Phoenix®MST®Hor\u00e1rio Padr\u00e3o Montanha®MST®Hor\u00e1rio Padr\u00e3o Montanha®©Etc/GMT®GMT®Hor\u00e1rio do Meridiano de Greenwich®GMT®Hor\u00e1rio do Meridiano de Greenwich®©Asia/Jerusalem®IST®Hor\u00e1rio Padr\u00e3o de Israel®IDT®Hor\u00e1rio de Ver\u00e3o de Israel®©Europe/Paris®CET®Hor\u00e1rio Padr\u00e3o Europa Central®CEST®Hor\u00e1rio de Ver\u00e3o Europa Central®©
+zoneStrings=Pacific/Honolulu®HST®Hor\u00e1rio Padr\u00e3o do Hava\u00ed®HST®Hor\u00e1rio Padr\u00e3o do Hava\u00ed®©Europe/Bucharest®EET®Hor\u00e1rio Padr\u00e3o da Europa Oriental®EEST®Hor\u00e1rio de Ver\u00e3o da Europa Oriental®©America/Los_Angeles®PST®Hor\u00e1rio Padr\u00e3o do Pac\u00edfico®PDT®Hor\u00e1rio de Ver\u00e3o do Pac\u00edfico®©America/Denver®MST®Hor\u00e1rio Padr\u00e3o Montanha®MDT®Hor\u00e1rio de Ver\u00e3o Montanha®©Asia/Jerusalem®IST®Hor\u00e1rio Padr\u00e3o de Israel®IDT®Hor\u00e1rio de Ver\u00e3o de Israel®©America/Phoenix®MST®Hor\u00e1rio Padr\u00e3o Montanha®MST®Hor\u00e1rio Padr\u00e3o Montanha®©America/Chicago®CST®Hor\u00e1rio Padr\u00e3o Central®CDT®Hor\u00e1rio de Ver\u00e3o Central®©America/Indianapolis®EST®Hor\u00e1rio Padr\u00e3o Oriental®EST®Hor\u00e1rio Padr\u00e3o Oriental®©America/St_Johns®CNT®Hor\u00e1rio Padr\u00e3o de Terra Nova®CDT®Hor\u00e1rio de Ver\u00e3o de Terra Nova®©America/Anchorage®AST®Hor\u00e1rio Padr\u00e3o do Alasca®ADT®Hor\u00e1rio de Ver\u00e3o do Alasca®©Asia/Shanghai®CTT®Hor\u00e1rio Padr\u00e3o da China®CDT®Hor\u00e1rio Padr\u00e3o da China®©Asia/Tokyo®JST®Hor\u00e1rio Padr\u00e3o do Jap\u00e3o®JST®Hor\u00e1rio Padr\u00e3o do Jap\u00e3o®©Europe/Paris®CET®Hor\u00e1rio Padr\u00e3o Europa Central®CEST®Hor\u00e1rio de Ver\u00e3o Europa Central®©America/New_York®EST®Hor\u00e1rio Padr\u00e3o Oriental®EDT®Hor\u00e1rio de Ver\u00e3o Oriental®©America/Halifax®AST®Hor\u00e1rio Padr\u00e3o Atl\u00e2ntico®ADT®Hor\u00e1rio de Ver\u00e3o Atl\u00e2ntico®©Africa/Casablanca®GMT®Hor\u00e1rio do Meridiano de Greenwich®GMT®Hor\u00e1rio do Meridiano de Greenwich®©
territories.TL=Timor Leste
territories.TK=Tokelau
territories.TJ=Tadjiquist\u00e3o
@@ -859,6 +357,7 @@ territories.CX=Ilhas Natal
territories.CV=Cabo Verde
territories.PA=Panam\u00e1
territories.CU=Cuba
+territories.CS=S\u00e9rvia e Montenegro
territories.CR=Costa Rica
territories.CO=Col\u00f4mbia
territories.CN=China
@@ -929,17 +428,16 @@ territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Maurit\u00e2nia
territories.AG=Ant\u00edgua e Barbuda
-territories.MQ=Martinica
territories.AF=Afeganist\u00e3o
-territories.MP=Ilhas Marianas do Norte
+territories.MQ=Martinica
territories.AE=Emirados \u00c1rabes Unidos
-territories.MO=Macau, Regi\u00e3o Admin. Especial da China
+territories.MP=Ilhas Marianas do Norte
territories.AD=Andorra
+territories.MO=Macau, Regi\u00e3o Admin. Especial da China
territories.MN=Mong\u00f3lia
territories.MM=Mianm\u00e1
territories.ML=Mali
territories.MK=Maced\u00f4nia, Rep\u00fablica da
-territories.YU=Iugosl\u00e1via
territories.YT=Mayotte
territories.MH=Ilhas Marshall
territories.MG=Madagascar
@@ -1010,8 +508,8 @@ territories.TR=Turquia
territories.TO=Tonga
territories.TN=Tun\u00edsia
territories.TM=Turcomenist\u00e3o
-languages.gwi=gwich\u02bbin
languages.akk=acadiano
+languages.gwi=gwich\u02bcin
languages.eka=ekajuk
languages.xh=xosa
languages.sux=sum\u00e9rio
@@ -1023,15 +521,15 @@ languages.pon=pohnpeian
languages.min=minangkabau
languages.suk=sukuma
languages.wo=uolofe
-languages.lol=mongo
languages.kut=kutenai
+languages.lol=mongo
languages.mic=miquemaque
languages.wa=walloon
languages.kum=kumyk
languages.zap=zapoteca
languages.cus=cuxitas (outros)
-languages.jbo=lojban
languages.doi=dogri
+languages.jbo=lojban
languages.vo=volapuque
languages.oto=idiomas otomanos
languages.vi=vietnamita
@@ -1054,8 +552,8 @@ languages.egy=eg\u00edpcio (arcaico)
languages.ug=uighur
languages.fan=fangue
languages.ssa=nilo-saarianos (outros)
-languages.mga=irland\u00eas, medieval (900-1200)
languages.bat=b\u00e1lticos (outros)
+languages.mga=irland\u00eas, medieval (900-1200)
languages.nyo=nyoro
languages.bas=basa
languages.nyn=nyankole
@@ -1082,8 +580,8 @@ languages.kru=kurukh
languages.tg=tadjique
languages.byn=Blin
languages.te=telugu
-languages.kro=kru
languages.csb=kashubian
+languages.kro=kru
languages.ta=t\u00e2mil
languages.tkl=toquelauano
languages.efi=efique
@@ -1105,8 +603,8 @@ languages.sk=eslovaco
languages.grb=Gerbo
languages.si=cingal\u00eas
languages.sh=servo-croata
-languages.crh=crimean turkish; crimean tatar
languages.afa=afro-asi\u00e1tico (outros)
+languages.crh=crimean turkish; crimean tatar
languages.sg=sango
languages.se=northern sami
languages.sd=sindi
@@ -1129,14 +627,14 @@ languages.son=songai
languages.cpp=crioulos e p\u00eddgin, portugu\u00eas (outros)
languages.sog=sogdien
languages.ada=adangme
-languages.kos=kosraean
-languages.hit=hitita
languages.cpf=crioulos e p\u00eddgin, franc\u00eas (outros)
+languages.hit=hitita
+languages.kos=kosraean
languages.cpe=crioulos e p\u00eddgin, ingl\u00eas (outros)
languages.him=himachali
-languages.kok=concani
-languages.hil=hiligaynon
languages.got=g\u00f3tico
+languages.hil=hiligaynon
+languages.kok=concani
languages.gor=gorontalo
languages.gon=gondi
languages.din=dinka
@@ -1200,21 +698,21 @@ languages.ms=malaio
languages.mr=marata
languages.fro=franc\u00eas, arcaico (842-aprox.1400)
languages.mo=mold\u00e1vio
-languages.frm=franc\u00eas, medieval (aprox.1400-1600)
languages.mn=mongol
-languages.jrb=judaico-ar\u00e1bico
+languages.frm=franc\u00eas, medieval (aprox.1400-1600)
languages.ml=malaiala
+languages.jrb=judaico-ar\u00e1bico
languages.mk=maced\u00f4nio
languages.mi=maori
languages.mh=marshall\u00eas
languages.mg=malgaxe
languages.mwr=marwari
languages.bra=braj
-languages.den=slave
languages.lv=let\u00e3o
+languages.den=slave
languages.lu=luba-catanga
-languages.del=delaware
languages.lt=lituano
+languages.del=delaware
languages.lo=laosiano
languages.ln=lingala
languages.li=limburgish
@@ -1266,38 +764,38 @@ languages.iu=inuktitut
languages.pap=papiamento
languages.it=italiano
languages.sgn=linguages de sinais
-languages.is=island\u00eas
languages.kha=khasi
+languages.is=island\u00eas
languages.chr=cheroqui
languages.pam=pampanga
languages.pal=p\u00e1lavi
languages.chp=chipewyan
-languages.io=ido
languages.cho=choctaw
+languages.io=ido
languages.chn=chinook jargon
languages.chm=mari
languages.tyv=tuvinian
languages.bnt=banto
languages.pag=pangasin\u00e3
-languages.ik=Inupiaq
languages.chk=chuukese
-languages.ii=sichuan yi
+languages.ik=Inupiaq
languages.haw=havaiano
+languages.ii=sichuan yi
languages.lam=lamba
-languages.ig=ibo
languages.chg=chagatai
+languages.ig=ibo
languages.sga=irland\u00eas, arcaico (at\u00e9 900)
languages.paa=papuanos (outros)
languages.ie=interlingue
languages.id=indon\u00e9sio
languages.lah=lahnda
-languages.day=dayak
languages.chb=chibcha
+languages.day=dayak
languages.ia=interl\u00edngua
languages.lad=ladino
-languages.hz=herero
-languages.hai=haida
languages.dar=dargwa
+languages.hai=haida
+languages.hz=herero
languages.hy=arm\u00eanio
languages.ath=idiomas atabascanos
languages.hu=h\u00fangaro
@@ -1319,9 +817,9 @@ languages.iro=idiomas iroqueses
languages.gn=guarani
languages.gl=galego
languages.arw=arauaqui
-languages.gez=geez
-languages.art=artificiais (outros)
languages.gd=ga\u00e9lico escoc\u00eas
+languages.art=artificiais (outros)
+languages.gez=geez
languages.ira=iraniano
languages.ga=irland\u00eas
languages.arp=arapaho
@@ -1330,8 +828,8 @@ languages.fy=fris\u00e3o
languages.bla=siksika
languages.gem=germ\u00e2nicos (outros)
languages.ypk=idiomas i\u00fapique
-languages.arc=aramaico
languages.fr=franc\u00eas
+languages.arc=aramaico
languages.fo=fero\u00eas
languages.cel=c\u00e9lticos (outros)
languages.fj=fijiano
@@ -1355,9 +853,9 @@ languages.tum=tumbuka
languages.mos=mossi
languages.dz=dzonga
languages.nic=niger - kordofanian (other)
-languages.lus=lushai
-languages.fiu=ugro-fin\u00eas (outros)
languages.dv=divehi
+languages.fiu=ugro-fin\u00eas (outros)
+languages.lus=lushai
languages.nia=nias
languages.moh=mohawk
languages.lun=lunda
@@ -1379,8 +877,8 @@ languages.wak=wakashan languages
languages.sat=santali
languages.cy=gal\u00eas
languages.sas=sasak
-languages.kbd=kabardian
languages.cv=chuvash
+languages.kbd=kabardian
languages.cu=eslavo eclesi\u00e1stico
languages.mni=manipuri
languages.cs=tcheco
@@ -1392,17 +890,17 @@ languages.co=c\u00f3rsico
languages.sai=ind\u00edgenas sul-americanos (outros)
languages.mnc=manchu
languages.sah=iacuto
-languages.kaw=kawi
-languages.inh=inguche
languages.gba=gbaia
+languages.inh=inguche
+languages.kaw=kawi
languages.sad=sandawe
languages.ch=chamorro
-languages.ine=indo-europeus (outros)
languages.bho=bhojpuri
+languages.ine=indo-europeus (outros)
languages.enm=ingl\u00eas, medieval (1100-1500)
-languages.kar=karen
-languages.inc=\u00edndicos (outros)
languages.ce=chechene
+languages.inc=\u00edndicos (outros)
+languages.kar=karen
languages.gay=gayo
languages.ca=catal\u00e3o
languages.umb=umbundu
@@ -1410,19 +908,19 @@ languages.syr=sir\u00edaco
languages.kam=kamba
languages.tsi=tsimshian
languages.ang=ingl\u00eas, arcaico (aprox. 450-1100)
-languages.kac=kachin
languages.cau=caucasianos (outros)
+languages.kac=kachin
languages.kab=kabyle
-languages.kaa=kara-Kalpak
languages.bs=b\u00f3snio
-languages.car=caribe
+languages.kaa=kara-Kalpak
languages.br=bret\u00e3o
+languages.car=caribe
languages.bo=tibetano
languages.bn=bengali
languages.bm=bambara
languages.gaa=ga
-languages.cai=ind\u00edgenas centro-americanos (outros)
languages.bi=bislam\u00e1
+languages.cai=ind\u00edgenas centro-americanos (outros)
languages.bh=biari
languages.bg=b\u00falgaro
languages.be=bielo-russo
@@ -1436,10 +934,10 @@ languages.az=azerbaijano
languages.ay=aimara
languages.av=avaric
languages.as=assam\u00eas
-languages.dsb=Lower Sorbian
languages.ar=\u00e1rabe
-languages.ilo=ilocano
+languages.dsb=Lower Sorbian
languages.elx=elamite
+languages.ilo=ilocano
languages.zh=chin\u00eas
languages.an=aragon\u00eas
languages.pra=idiomas pr\u00e1crito
diff --git a/resource/gnu/java/locale/LocaleInformation_pt_PT.properties b/resource/gnu/java/locale/LocaleInformation_pt_PT.properties
index bf92b0076..e8eecd86b 100644
--- a/resource/gnu/java/locale/LocaleInformation_pt_PT.properties
+++ b/resource/gnu/java/locale/LocaleInformation_pt_PT.properties
@@ -9,10 +9,9 @@ currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
shortDateFormat=yy/MM/dd
mediumDateFormat=yyyy/MM/dd
territories.PS=Territ\u00f3rio Palestiniano
-territories.MP=Ilhas Mariana do Norte
territories.GL=Gronel\u00e2ndia
+territories.MP=Ilhas Mariana do Norte
territories.MO=Macau - Regi\u00e3o Administrativa Especial da China
-territories.YU=Jugosl\u00e1via
territories.AE=Emiratos \u00c1rabes Unidos
territories.MK=Maced\u00f3nia, Rep\u00fablica da
territories.PL=Pol\u00f3nia
@@ -45,16 +44,16 @@ territories.KZ=Cazaquist\u00e3o
territories.KY=Ilhas Caim\u00e3o
territories.ER=Eritreia
territories.KR=Coreia do Sul
-territories.KP=Coreia do Norte
territories.BJ=Benim
+territories.KP=Coreia do Norte
territories.KN=Saint Kitts e Nevis
territories.HK=Hong Kong - Regi\u00e3o Administrativa Especial da China
territories.EH=Sahara Ocidental
territories.EG=Egipto
territories.EE=Est\u00f3nia
territories.TM=Turquemenist\u00e3o
-territories.KG=Quirguizist\u00e3o
territories.BA=B\u00f3snia-Herzegovina
+territories.KG=Quirguizist\u00e3o
territories.KE=Qu\u00e9nia
territories.TJ=Tajiquist\u00e3o
territories.NC=Nova Caled\u00f3nia
@@ -65,8 +64,8 @@ territories.TC=Ilhas Turcas e Caicos
territories.GW=Guin\u00e9-Bissau
territories.AQ=Ant\u00e1rctica
territories.GS=Ilhas South Georgia e South Sandwich
-territories.MU=Maur\u00edcias
territories.AM=Arm\u00e9nia
+territories.MU=Maur\u00edcias
languages.sl=esloveno
languages.pl=polaco
languages.cs=checo
diff --git a/resource/gnu/java/locale/LocaleInformation_ro.properties b/resource/gnu/java/locale/LocaleInformation_ro.properties
index 6930feb4d..439b9803d 100644
--- a/resource/gnu/java/locale/LocaleInformation_ro.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ro.properties
@@ -8,7 +8,14 @@
decimalSeparator=,
groupingSeparator=.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.ROL=ROL
+currenciesDisplayName.INR=Rupie indian\u0103
+currenciesDisplayName.TRY=Noua lir\u0103 turceasc\u0103
+currenciesDisplayName.JPY=Yen japonez
+currenciesDisplayName.RUB=Rubl\u0103 ruseasc\u0103
+currenciesDisplayName.CNY=Yuan Renminbi chinezesc
+currenciesDisplayName.GBP=Lir\u0103 sterlin\u0103 britanic\u0103
+currenciesDisplayName.USD=Dolar SUA
+currenciesDisplayName.BRL=Real brazilian
currenciesSymbol.ROL=lei
shortMonths=Ian®Feb®Mar®Apr®Mai®Iun®Iul®Aug®Sep®Oct®Nov®Dec®®
months=ianuarie®februarie®martie®aprilie®mai®iunie®iulie®august®septembrie®octombrie®noiembrie®decembrie®®
@@ -42,7 +49,9 @@ territories.GN=Guineea
territories.GM=Gambia
territories.GL=Groenlanda
territories.SV=El Salvador
+territories.062=Asia centrala \u015fi de Sud
territories.ST=Sao Tome \u015fi Principe
+territories.061=Polinezia
territories.GI=Gibraltar
territories.GH=Ghana
territories.SR=Surinam
@@ -66,9 +75,12 @@ territories.SC=Seychelles
territories.SB=Insulele Solomon
territories.SA=Arabia Saudit\u0103
territories.FR=Fran\u0163a
+territories.057=Micronezia
territories.FO=Insulele Feroe
territories.FM=Micronezia, Statele Federate
territories.RW=Rwanda
+territories.054=Melanezia
+territories.053=Australia \u0219i Noua Zeeland\u0103
territories.FK=Insulele Falkland
territories.RU=Rusia
territories.FJ=Fiji
@@ -80,18 +92,23 @@ territories.ES=Spania
territories.ER=Eritrea
territories.EH=Sahara de Vest
territories.EG=Egipt
+territories.830=Insulele Anglo-Normande
territories.EE=Estonia
+territories.QO=Alt\u0103 Oceania
territories.EC=Ecuador
territories.DZ=Algeria
territories.QA=Qatar
+territories.039=Europa meridional\u0103
territories.DO=Republica Dominican\u0103
territories.PY=Paraguay
+territories.035=Asia de Sud-Est
territories.DM=Dominica
territories.PW=Palau
territories.DK=Danemarca
territories.DJ=Djibouti
territories.PT=Portugalia
territories.PS=Teritoriul Palestinian
+territories.030=Asia oriental\u0103
territories.PR=Porto Rico
territories.DE=Germania
territories.PN=Pitcairn
@@ -108,13 +125,16 @@ territories.CX=Insula Christmas
territories.CV=Capul Verde
territories.PA=Panama
territories.CU=Cuba
+territories.CS=Serbia \u015fi Muntenegru
territories.CR=Costa Rica
+territories.029=Caraibe
territories.CO=Columbia
territories.CN=China
territories.CM=Camerun
territories.CL=Chile
territories.CK=Insulele Cook
territories.CI=Coasta de Filde\u015f
+territories.021=America de Nord
territories.CH=Eleve\u0163ia
territories.CG=Congo
territories.CF=Republica Central African\u0103
@@ -129,13 +149,20 @@ territories.BV=Insula Bouvet
territories.BT=Bhutan
territories.BS=Bahamas
territories.BR=Brazilia
+territories.019=Americi
+territories.018=Africa austral\u0103
territories.NZ=Noua Zeeland\u0103
territories.BO=Bolivia
+territories.017=Africa central\u0103
territories.BN=Brunei
territories.BM=Bermuda
+territories.015=Africa septentrional\u0103
+territories.014=Africa oriental\u0103
+territories.013=America central\u0103
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Africa occidental\u0103
territories.BH=Bahrain
territories.NR=Nauru
territories.BG=Bulgaria
@@ -153,6 +180,7 @@ territories.NG=Nigeria
territories.NF=Insulele Norfolk
territories.AZ=Azerbaidjan
territories.NE=Niger
+territories.AX=Insulele Aland
territories.NC=Noua Caledonie
territories.AW=Aruba
territories.ZM=Zambia
@@ -167,6 +195,7 @@ territories.AO=Angola
territories.MY=Malaezia
territories.AN=Antilele Olandeze
territories.MX=Mexic
+territories.005=America de Sud
territories.AM=Armenia
territories.MW=Malawi
territories.AL=Albania
@@ -174,6 +203,7 @@ territories.MV=Maldive
territories.ZA=Africa de Sud
territories.MU=Mauritius
territories.MT=Malta
+territories.001=Lume
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauritania
@@ -188,7 +218,6 @@ territories.MN=Mongolia
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Macedonia
-territories.YU=Iugoslavia
territories.YT=Mayotte
territories.MH=Insulele Marshall
territories.MG=Madagascar
@@ -198,10 +227,14 @@ territories.MA=Maroc
territories.YE=Yemen
territories.LY=Libia, Jamahiriya Arab\u0103
territories.LV=Letonia
+territories.155=Europa occidental\u0103
territories.LU=Luxemburg
+territories.154=Europa septentrional\u0103
territories.LT=Lituania
territories.LS=Lesotho
territories.LR=Liberia
+territories.151=Europa de Est
+territories.150=Europa
territories.LK=Sri Lanka
territories.LI=Liechtenstein
territories.LC=Saint Lucia
@@ -210,6 +243,7 @@ territories.LA=Lao, Republica Democratic\u0103 Popular\u0103
territories.KZ=Kazahstan
territories.KY=Insulele Cayman
territories.KW=Kuweit
+territories.145=Asia occidental\u0103
territories.KR=Coreea de Sud
territories.KP=Coreea de Nord
territories.KN=Saint Kitts \u015fi Nevis
@@ -268,8 +302,8 @@ languages.el=Greac\u0103
languages.nl=Olandez\u0103
languages.bg=Bulgar\u0103
languages.lv=Leton\u0103
-languages.he=Ebraic\u0103
languages.cs=Ceh\u0103
+languages.he=Ebraic\u0103
languages.it=Italian\u0103
languages.lt=Lituanian\u0103
languages.fr=Francez\u0103
@@ -284,8 +318,8 @@ languages.pl=Polonez\u0103
languages.sl=Sloven\u0103
languages.sk=Slovac\u0103
languages.de=German\u0103
-languages.hu=Maghiar\u0103
languages.et=Estonian\u0103
+languages.hu=Maghiar\u0103
languages.es=Spaniol\u0103
-languages.hr=Croat\u0103
languages.da=Danez\u0103
+languages.hr=Croat\u0103
diff --git a/resource/gnu/java/locale/LocaleInformation_ru.properties b/resource/gnu/java/locale/LocaleInformation_ru.properties
index 8f4168df7..cc69fee46 100644
--- a/resource/gnu/java/locale/LocaleInformation_ru.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ru.properties
@@ -5,379 +5,296 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+decimalSeparator=,
+groupingSeparator=\u00a0
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.KES=\u041a\u0435\u043d\u0438\u0439\u0441\u043a\u0438\u0439 \u0448\u0438\u043b\u043b\u0438\u043d\u0433
currenciesDisplayName.TWD=\u041d\u043e\u0432\u044b\u0439 \u0442\u0430\u0439\u0432\u0430\u043d\u044c\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
-currenciesDisplayName.LKR=\u0428\u0440\u0438 - \u041b\u0430\u043d\u043a\u0438\u0439\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0438\u044f
+currenciesDisplayName.KES=\u041a\u0435\u043d\u0438\u0439\u0441\u043a\u0438\u0439 \u0448\u0438\u043b\u043b\u0438\u043d\u0433
currenciesDisplayName.BYB=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c (1994-1999)
-currenciesDisplayName.TJS=\u0422\u0430\u0434\u0436\u0438\u043a\u0441\u043a\u0438\u0439 \u0441\u043e\u043c\u043e\u043d\u0438
+currenciesDisplayName.LKR=\u0428\u0440\u0438-\u041b\u0430\u043d\u043a\u0438\u0439\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.RWF=\u0424\u0440\u0430\u043d\u043a \u0420\u0443\u0430\u043d\u0434\u044b
-currenciesDisplayName.ERN=\u041d\u0430\u043a\u0444\u0430
+currenciesDisplayName.TJS=\u0422\u0430\u0434\u0436\u0438\u043a\u0441\u043a\u0438\u0439 \u0441\u043e\u043c\u043e\u043d\u0438
currenciesDisplayName.TJR=\u0422\u0430\u0434\u0436\u0438\u043a\u0441\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.GRD=\u0414\u0440\u0430\u0445\u043c\u0430
+currenciesDisplayName.ERN=\u041d\u0430\u043a\u0444\u0430
+currenciesDisplayName.GRD=\u0413\u0440\u0435\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0440\u0430\u0445\u043c\u0430
currenciesDisplayName.IEP=\u0418\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.ARS=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
currenciesDisplayName.SDD=\u0421\u0443\u0434\u0430\u043d\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.GEL=\u0413\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438\u0439 \u043b\u0430\u0440\u0438
-currenciesDisplayName.GEK=\u0413\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438\u0439 \u043a\u0443\u043f\u043e\u043d
currenciesDisplayName.AFA=\u0410\u0444\u0433\u0430\u043d\u0438 (1927-2002)
+currenciesDisplayName.GEK=\u0413\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438\u0439 \u043a\u0443\u043f\u043e\u043d
currenciesDisplayName.CRC=\u041a\u043e\u0441\u0442\u0430\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439 \u043a\u043e\u043b\u043e\u043d
currenciesDisplayName.FKP=\u0424\u0443\u043d\u0442 \u0424\u043e\u043b\u043a\u043b\u0435\u043d\u0434\u0441\u043a\u0438\u0445 \u043e\u0441\u0442\u0440\u043e\u0432\u043e\u0432
-currenciesDisplayName.EEK=\u041a\u0440\u043e\u043d\u0430
-currenciesDisplayName.MDL=\u041c\u043e\u043b\u0434\u0430\u0432\u0441\u043a\u0438\u0439 \u043b\u0435\u0439
+currenciesDisplayName.EEK=\u042d\u0441\u0442\u043e\u043d\u0441\u043a\u0430\u044f \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.HKD=\u0413\u043e\u043d\u043a\u043e\u043d\u0433\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
+currenciesDisplayName.MDL=\u041c\u043e\u043b\u0434\u0430\u0432\u0441\u043a\u0438\u0439 \u043b\u0435\u0439
currenciesDisplayName.IQD=\u0418\u0440\u0430\u043a\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.SCR=\u0421\u0435\u0439\u0448\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.VUV=\u0412\u0430\u0442\u0443
-currenciesDisplayName.KPW=\u0421\u0435\u0432\u0435\u0440\u043e - \u043a\u043e\u0440\u0435\u0439\u0441\u043a\u0430\u044f \u0432\u043e\u043d\u0430
currenciesDisplayName.DKK=\u0414\u0430\u0442\u0441\u043a\u0430\u044f \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.IDR=\u0420\u0443\u043f\u0438\u044f
+currenciesDisplayName.KPW=\u0421\u0435\u0432\u0435\u0440\u043e-\u043a\u043e\u0440\u0435\u0439\u0441\u043a\u0430\u044f \u0432\u043e\u043d\u0430
+currenciesDisplayName.IDR=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.SOS=\u0421\u043e\u043c\u0430\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0448\u0438\u043b\u043b\u0438\u043d\u0433
currenciesDisplayName.AED=\u0414\u0438\u0440\u0445\u0430\u043c (\u041e\u0410\u042d)
+currenciesDisplayName.BWP=\u0411\u043e\u0442\u0441\u0432\u0430\u043d\u0441\u043a\u0430\u044f \u043f\u0443\u043b\u0430
currenciesDisplayName.LVL=\u041b\u0430\u0442\u0432\u0438\u0439\u0441\u043a\u0438\u0439 \u043b\u0430\u0442
-currenciesDisplayName.BWP=\u041f\u0443\u043b\u0430
currenciesDisplayName.RUR=\u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c (1991-1998)
currenciesDisplayName.NIO=\u0417\u043e\u043b\u043e\u0442\u0430\u044f \u043a\u043e\u0440\u0434\u043e\u0431\u0430
-currenciesDisplayName.FJD=\u0414\u043e\u043b\u043b\u0430\u0440 \u0424\u0438\u0434\u0436\u0438
currenciesDisplayName.ADP=\u0410\u043d\u0434\u043e\u0440\u0440\u0441\u043a\u0430\u044f \u043f\u0435\u0441\u0435\u0442\u0430
+currenciesDisplayName.FJD=\u0414\u043e\u043b\u043b\u0430\u0440 \u0424\u0438\u0434\u0436\u0438
currenciesDisplayName.RUB=\u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
currenciesDisplayName.CDF=\u041a\u043e\u043d\u0433\u043e\u043b\u0435\u0437\u0441\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.DJF=\u0424\u0440\u0430\u043d\u043a \u0414\u0436\u0438\u0431\u0443\u0442\u0438
-currenciesDisplayName.UZS=\u0423\u0437\u0431\u0435\u043a\u0441\u043a\u0438\u0439 \u0441\u0443\u043c
currenciesDisplayName.SBD=\u0414\u043e\u043b\u043b\u0430\u0440 \u0421\u043e\u043b\u043e\u043c\u043e\u043d\u043e\u0432\u044b\u0445 \u043e\u0441\u0442\u0440\u043e\u0432\u043e\u0432
-currenciesDisplayName.ECS=\u0421\u0443\u043a\u0440\u0435
-currenciesDisplayName.THB=\u0411\u0430\u0442
+currenciesDisplayName.UZS=\u0423\u0437\u0431\u0435\u043a\u0441\u043a\u0438\u0439 \u0441\u0443\u043c
+currenciesDisplayName.ECS=\u042d\u043a\u0432\u0430\u0434\u043e\u0440\u0441\u043a\u0438\u0439 \u0441\u0443\u043a\u0440\u0435
currenciesDisplayName.PHP=\u0424\u0438\u043b\u0438\u043f\u043f\u0438\u043d\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.THB=\u0422\u0430\u0438\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 \u0431\u0430\u0442
currenciesDisplayName.LUF=\u041b\u044e\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433\u0441\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.FIM=\u041c\u0430\u0440\u043a\u0430
+currenciesDisplayName.FIM=\u0424\u0438\u043d\u0441\u043a\u0430\u044f \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.TTD=\u0414\u043e\u043b\u043b\u0430\u0440 \u0422\u0440\u0438\u043d\u0438\u0434\u0430\u0434\u0430 \u0438 \u0422\u043e\u0431\u0430\u0433\u043e
-currenciesDisplayName.SZL=\u041b\u0438\u043b\u0430\u043d\u0433\u0435\u043d\u0438
-currenciesDisplayName.MNT=\u0422\u0443\u0433\u0440\u0438\u043a
-currenciesDisplayName.UAK=\u041a\u0430\u0440\u0431\u043e\u0432\u0430\u043d\u0435\u0446 (\u0443\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438\u0439)
+currenciesDisplayName.SZL=\u0421\u0432\u0430\u0437\u0438\u043b\u0435\u043d\u0434\u0441\u043a\u0438\u0439 \u043b\u0438\u043b\u0430\u043d\u0433\u0435\u043d\u0438
+currenciesDisplayName.MNT=\u041c\u043e\u043d\u0433\u043e\u043b\u044c\u0441\u043a\u0438\u0439 \u0442\u0443\u0433\u0440\u0438\u043a
currenciesDisplayName.SAR=\u0421\u0430\u0443\u0434\u043e\u0432\u0441\u043a\u0438\u0439 \u0440\u0438\u0430\u043b
+currenciesDisplayName.UAK=\u041a\u0430\u0440\u0431\u043e\u0432\u0430\u043d\u0435\u0446 (\u0443\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438\u0439)
currenciesDisplayName.UAH=\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0430\u044f \u0433\u0440\u0438\u0432\u043d\u0430
-currenciesDisplayName.HUF=\u0424\u043e\u0440\u0438\u043d\u0442
-currenciesDisplayName.QAR=\u041a\u0430\u0442\u0430\u0440\u0441\u043a\u0438\u0439 \u0440\u0438\u0430\u043b
+currenciesDisplayName.HUF=\u0412\u0435\u043d\u0433\u0435\u0440\u0441\u043a\u0438\u0439 \u0444\u043e\u0440\u0438\u043d\u0442
currenciesDisplayName.COP=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u0439\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.QAR=\u041a\u0430\u0442\u0430\u0440\u0441\u043a\u0438\u0439 \u0440\u0438\u0430\u043b
currenciesDisplayName.PTE=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u043e\u0435 \u044d\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.GBP=\u0424\u0443\u043d\u0442 \u0441\u0442\u0435\u0440\u043b\u0438\u043d\u0433\u043e\u0432
-currenciesDisplayName.INR=\u0418\u043d\u0434\u0438\u0439\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0438\u044f
+currenciesDisplayName.GBP=\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442 \u0441\u0442\u0435\u0440\u043b\u0438\u043d\u0433\u043e\u0432
currenciesDisplayName.BIF=\u0411\u0443\u0440\u0443\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.LTL=\u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438\u0439 \u043b\u0438\u0442
+currenciesDisplayName.INR=\u0418\u043d\u0434\u0438\u0439\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.AON=\u041d\u043e\u0432\u0430\u044f \u043a\u0432\u0430\u043d\u0437\u0430
-currenciesDisplayName.UYP=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.MZM=\u041c\u0435\u0442\u0438\u043a\u0430\u043b
+currenciesDisplayName.LTL=\u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438\u0439 \u043b\u0438\u0442
currenciesDisplayName.KZT=\u0422\u0435\u043d\u0433\u0435 (\u043a\u0430\u0437\u0430\u0445\u0441\u043a\u0438\u0439)
+currenciesDisplayName.MZM=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u0438\u043a\u0430\u043b
+currenciesDisplayName.UYP=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
currenciesDisplayName.PGK=\u041a\u0438\u043d\u0430
currenciesDisplayName.SYP=\u0421\u0438\u0440\u0438\u0439\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.OMR=\u041e\u043c\u0430\u043d\u0441\u043a\u0438\u0439 \u0440\u0438\u0430\u043b
+currenciesDisplayName.NGN=\u041d\u0438\u0433\u0435\u0440\u0438\u0439\u0441\u043a\u0430\u044f \u043d\u0430\u0439\u0440\u0430
currenciesDisplayName.ZRN=\u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0438\u0440
-currenciesDisplayName.NGN=\u041d\u0430\u0439\u0440\u0430
currenciesDisplayName.CNY=\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 \u044e\u0430\u043d\u044c
currenciesDisplayName.GNF=\u0413\u0432\u0438\u043d\u0435\u0439\u0441\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.HTG=\u0413\u0430\u0438\u0442\u044f\u043d\u0441\u043a\u0438\u0439 \u0433\u0443\u0440\u0434
currenciesDisplayName.MAD=\u041c\u0430\u0440\u043e\u043a\u043a\u0430\u043d\u0441\u043a\u0438\u0439 \u0434\u0438\u0440\u0445\u0430\u043c
-currenciesDisplayName.HTG=\u0413\u0443\u0440\u0434
+currenciesDisplayName.TRY=\u041d\u043e\u0432\u0430\u044f \u0442\u0443\u0440\u0435\u0446\u043a\u0430\u044f \u043b\u0438\u0440\u0430
currenciesDisplayName.MYR=\u041c\u0430\u043b\u0430\u0439\u0437\u0438\u0439\u0441\u043a\u0438\u0439 \u0440\u0438\u043d\u0433\u0433\u0438\u0442
-currenciesDisplayName.XEU=\u042d\u041a\u042e (\u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0439 \u0432\u0430\u043b\u044e\u0442\u044b)
currenciesDisplayName.LSL=\u041b\u043e\u0442\u0438
-currenciesDisplayName.SLL=\u041b\u0435\u043e\u043d\u0435
+currenciesDisplayName.XEU=\u042d\u041a\u042e (\u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0439 \u0432\u0430\u043b\u044e\u0442\u044b)
currenciesDisplayName.BHD=\u0411\u0430\u0445\u0440\u0435\u0439\u043d\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.SLL=\u041b\u0435\u043e\u043d\u0435
currenciesDisplayName.BTN=\u041d\u0433\u0443\u043b\u0442\u0440\u0443\u043c
currenciesDisplayName.TRL=\u0422\u0443\u0440\u0435\u0446\u043a\u0430\u044f \u043b\u0438\u0440\u0430
currenciesDisplayName.KMF=\u0424\u0440\u0430\u043d\u043a \u041a\u043e\u043c\u043e\u0440\u0441\u043a\u0438\u0445 \u043e\u0441\u0442\u0440\u043e\u0432\u043e\u0432
-currenciesDisplayName.CZK=\u0427\u0435\u0448\u0441\u043a\u0430\u044f \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.ANG=\u041d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 \u0430\u043d\u0442\u0438\u043b\u044c\u0441\u043a\u0438\u0439 \u0433\u0443\u043b\u044c\u0434\u0435\u043d
+currenciesDisplayName.CZK=\u0427\u0435\u0448\u0441\u043a\u0430\u044f \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.AZM=\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d\u0441\u043a\u0438\u0439 \u043c\u0430\u043d\u0430\u0442
currenciesDisplayName.KYD=\u0414\u043e\u043b\u043b\u0430\u0440 \u041a\u0430\u0439\u043c\u0430\u043d\u043e\u0432\u044b\u0445 \u043e\u0441\u0442\u0440\u043e\u0432\u043e\u0432
-currenciesDisplayName.GMD=\u0414\u0430\u043b\u0430\u0441\u0438
+currenciesDisplayName.GMD=\u0413\u0430\u043c\u0431\u0438\u0439\u0441\u043a\u0438\u0439 \u0434\u0430\u043b\u0430\u0441\u0438
currenciesDisplayName.BGN=\u0411\u043e\u043b\u0433\u0430\u0440\u0441\u043a\u0438\u0439 \u043b\u0435\u0432
currenciesDisplayName.CAD=\u041a\u0430\u043d\u0430\u0434\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
currenciesDisplayName.BGL=\u041b\u0435\u0432
-currenciesDisplayName.VEB=\u0411\u043e\u043b\u0438\u0432\u0430\u0440
-currenciesDisplayName.ILS=\u0428\u0435\u043a\u0435\u043b\u044c
-currenciesDisplayName.MXN=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u043e\u0435 \u043d\u043e\u0432\u043e\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.VEB=\u0412\u0435\u043d\u0435\u0441\u0443\u044d\u043b\u044c\u0441\u043a\u0438\u0439 \u0431\u043e\u043b\u0438\u0432\u0430\u0440
+currenciesDisplayName.ILS=\u041d\u043e\u0432\u044b\u0439 \u0438\u0437\u0440\u0430\u0438\u043b\u044c\u0441\u043a\u0438\u0439 \u0448\u0435\u043a\u0435\u043b\u044c
currenciesDisplayName.GYD=\u0413\u0430\u0439\u0430\u043d\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
-currenciesDisplayName.CYP=\u041a\u0438\u043f\u0440\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.MXN=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u043e\u0435 \u043d\u043e\u0432\u043e\u0435 \u043f\u0435\u0441\u043e
currenciesDisplayName.SKK=\u0421\u043b\u043e\u0432\u0430\u0446\u043a\u0430\u044f \u043a\u0440\u043e\u043d\u0430
+currenciesDisplayName.CYP=\u041a\u0438\u043f\u0440\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.XDR=\u0421\u0414\u0420 (\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f)
-currenciesDisplayName.PEN=\u041d\u043e\u0432\u044b\u0439 \u0441\u043e\u043b\u044c
+currenciesDisplayName.PEN=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u043a\u0438\u0439 \u043d\u043e\u0432\u044b\u0439 \u0441\u043e\u043b\u044c
currenciesDisplayName.LRD=\u041b\u0438\u0431\u0435\u0440\u0438\u0439\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
currenciesDisplayName.AMD=\u0410\u0440\u043c\u044f\u043d\u0441\u043a\u0438\u0439 \u0434\u0440\u0430\u043c
currenciesDisplayName.BSD=\u0411\u0430\u0433\u0430\u043c\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
-currenciesDisplayName.HRK=\u041a\u0443\u043d\u0430
-currenciesDisplayName.HRD=\u0425\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.HRK=\u0425\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0430\u044f \u043a\u0443\u043d\u0430
currenciesDisplayName.CLP=\u0427\u0438\u043b\u0438\u0439\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.HRD=\u0425\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.XPF=\u0424\u0440\u0430\u043d\u043a \u041a\u0424\u041f
currenciesDisplayName.FRF=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.BRR=\u041a\u0440\u0443\u0437\u0435\u0439\u0440\u043e \u0440\u0435\u0430\u043b
-currenciesDisplayName.MKD=\u0414\u0435\u043d\u0430\u0440
-currenciesDisplayName.ALL=\u041b\u0435\u043a
+currenciesDisplayName.MKD=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.ALL=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438\u0439 \u043b\u0435\u043a
currenciesDisplayName.MWK=\u041a\u0432\u0430\u0447\u0430 (\u043c\u0430\u043b\u0430\u0432\u0438\u0439\u0441\u043a\u0430\u044f)
currenciesDisplayName.BRL=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u043a\u0438\u0439 \u0440\u0435\u0430\u043b
currenciesDisplayName.TPE=\u0422\u0438\u043c\u043e\u0440\u0441\u043a\u043e\u0435 \u044d\u0441\u043a\u0443\u0434\u043e
currenciesDisplayName.DEM=\u041d\u0435\u043c\u0435\u0446\u043a\u0430\u044f \u043c\u0430\u0440\u043a\u0430
-currenciesDisplayName.XCD=\u0412\u043e\u0441\u0442\u043e\u0447\u043d\u043e - \u043a\u0430\u0440\u0438\u0431\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
currenciesDisplayName.KWD=\u041a\u0443\u0432\u0435\u0439\u0442\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.XCD=\u0412\u043e\u0441\u0442\u043e\u0447\u043d\u043e-\u043a\u0430\u0440\u0438\u0431\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
currenciesDisplayName.NPR=\u041d\u0435\u043f\u0430\u043b\u044c\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0438\u044f
-currenciesDisplayName.GWP=\u041f\u0435\u0441\u043e \u0413\u0432\u0438\u043d\u0435\u0438 - \u0411\u0438\u0441\u0430\u0443
+currenciesDisplayName.GWP=\u041f\u0435\u0441\u043e \u0413\u0432\u0438\u043d\u0435\u0438-\u0411\u0438\u0441\u0430\u0443
currenciesDisplayName.YUN=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.SVC=\u0421\u0430\u043b\u044c\u0432\u0430\u0434\u043e\u0440\u0441\u043a\u0438\u0439 \u043a\u043e\u043b\u043e\u043d
-currenciesDisplayName.SIT=\u0422\u043e\u043b\u0430\u0440
-currenciesDisplayName.JPY=\u0419\u0435\u043d\u0430
+currenciesDisplayName.SIT=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438\u0439 \u0442\u043e\u043b\u0430\u0440
+currenciesDisplayName.JPY=\u042f\u043f\u043e\u043d\u0441\u043a\u0430\u044f \u0438\u0435\u043d\u0430
currenciesDisplayName.XOF=\u0424\u0440\u0430\u043d\u043a \u041a\u0424\u0410 \u0412\u0421\u0415\u0410\u041e
-currenciesDisplayName.MVR=\u0420\u0443\u0444\u0438\u044f
-currenciesDisplayName.TOP=\u041f\u0430\u0430\u043d\u0433\u0430
+currenciesDisplayName.MVR=\u041c\u0430\u043b\u044c\u0434\u0438\u0432\u0441\u043a\u0430\u044f \u0440\u0443\u0444\u0438\u044f
currenciesDisplayName.BEF=\u0411\u0435\u043b\u044c\u0433\u0438\u0439\u0441\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.ROL=\u041b\u0435\u0439
-currenciesDisplayName.BDT=\u0422\u0430\u043a\u0430
+currenciesDisplayName.TOP=\u041f\u0430\u0430\u043d\u0433\u0430
+currenciesDisplayName.ROL=\u0420\u0443\u043c\u044b\u043d\u0441\u043a\u0438\u0439 \u043b\u0435\u0439
+currenciesDisplayName.BDT=\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448\u0441\u043a\u0430\u044f \u0442\u0430\u043a\u0430
currenciesDisplayName.AWG=\u0410\u0440\u0443\u0431\u0430\u043d\u0441\u043a\u0438\u0439 \u0433\u0443\u043b\u044c\u0434\u0435\u043d
currenciesDisplayName.NOK=\u041d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0430\u044f \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.ZAR=\u0420\u044d\u043d\u0434
currenciesDisplayName.MUR=\u041c\u0430\u0432\u0440\u0438\u043a\u0438\u0439\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0438\u044f
+currenciesDisplayName.ZAR=\u042e\u0436\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439 \u0440\u044d\u043d\u0434
currenciesDisplayName.SHP=\u0424\u0443\u043d\u0442 \u043e\u0441\u0442\u0440\u043e\u0432\u0430 \u0421\u0432\u044f\u0442\u043e\u0439 \u0415\u043b\u0435\u043d\u044b
currenciesDisplayName.XAU=\u0417\u043e\u043b\u043e\u0442\u043e
-currenciesDisplayName.VND=\u0414\u043e\u043d\u0433
+currenciesDisplayName.VND=\u0412\u044c\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438\u0439 \u0434\u043e\u043d\u0433
currenciesDisplayName.TZS=\u0422\u0430\u043d\u0437\u0430\u043d\u0438\u0439\u0441\u043a\u0438\u0439 \u0448\u0438\u043b\u043b\u0438\u043d\u0433
currenciesDisplayName.GIP=\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.TND=\u0422\u0443\u043d\u0438\u0441\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.CVE=\u042d\u0441\u043a\u0443\u0434\u043e \u041a\u0430\u0431\u043e - \u0412\u0435\u0440\u0434\u0435
+currenciesDisplayName.CVE=\u042d\u0441\u043a\u0443\u0434\u043e \u041a\u0430\u0431\u043e-\u0412\u0435\u0440\u0434\u0435
currenciesDisplayName.ZMK=\u041a\u0432\u0430\u0447\u0430 (\u0437\u0430\u043c\u0431\u0438\u0439\u0441\u043a\u0430\u044f)
-currenciesDisplayName.XAF=\u0424\u0440\u0430\u043d\u043a \u041a\u0424\u0410 \u0412\u0415\u0410\u0421
currenciesDisplayName.JOD=\u0418\u043e\u0440\u0434\u0430\u043d\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.XAF=\u0424\u0440\u0430\u043d\u043a \u041a\u0424\u0410 \u0412\u0415\u0410\u0421
currenciesDisplayName.LBP=\u041b\u0438\u0432\u0430\u043d\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.UGS=\u0423\u0433\u0430\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u0448\u0438\u043b\u043b\u0438\u043d\u0433
currenciesDisplayName.STD=\u0414\u043e\u0431\u0440\u0430
currenciesDisplayName.WST=\u0422\u0430\u043b\u0430
-currenciesDisplayName.KHR=\u0420\u0438\u0435\u043b\u044c
-currenciesDisplayName.DOP=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.KHR=\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0438\u0439\u0441\u043a\u0438\u0439 \u0440\u0438\u0435\u043b\u044c
currenciesDisplayName.EUR=\u0415\u0432\u0440\u043e
-currenciesDisplayName.CUP=\u041a\u0443\u0431\u0438\u043d\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.DOP=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
currenciesDisplayName.MTL=\u041c\u0430\u043b\u044c\u0442\u0438\u0439\u0441\u043a\u0430\u044f \u043b\u0438\u0440\u0430
-currenciesDisplayName.TMM=\u041c\u0430\u043d\u0430\u0442
+currenciesDisplayName.CUP=\u041a\u0443\u0431\u0438\u043d\u0441\u043a\u043e\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.TMM=\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0441\u043a\u0438\u0439 \u043c\u0430\u043d\u0430\u0442
currenciesDisplayName.SGD=\u0421\u0438\u043d\u0433\u0430\u043f\u0443\u0440\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
currenciesDisplayName.NZD=\u041d\u043e\u0432\u043e\u0437\u0435\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
currenciesDisplayName.USD=\u0414\u043e\u043b\u043b\u0430\u0440 \u0421\u0428\u0410
+currenciesDisplayName.HNL=\u0413\u043e\u043d\u0434\u0443\u0440\u0430\u0441\u0441\u043a\u0430\u044f \u043b\u0435\u043c\u043f\u0438\u0440\u0430
currenciesDisplayName.BOB=\u0411\u043e\u043b\u0438\u0432\u0438\u0430\u043d\u043e
-currenciesDisplayName.HNL=\u041b\u0435\u043c\u043f\u0438\u0440\u0430
+currenciesDisplayName.PAB=\u041f\u0430\u043d\u0430\u043c\u0441\u043a\u043e\u0435 \u0431\u0430\u043b\u044c\u0431\u043e\u0430
currenciesDisplayName.ITL=\u0418\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0430\u044f \u043b\u0438\u0440\u0430
-currenciesDisplayName.PAB=\u0411\u0430\u043b\u044c\u0431\u043e\u0430
-currenciesDisplayName.GTQ=\u041a\u0435\u0442\u0441\u0430\u043b\u044c
-currenciesDisplayName.AUD=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
-currenciesDisplayName.GHC=\u0421\u0435\u0434\u0438
-currenciesDisplayName.LAK=\u041a\u0438\u043f
+currenciesDisplayName.GTQ=\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u0435\u0442\u0441\u0430\u043b\u044c
currenciesDisplayName.NAD=\u0414\u043e\u043b\u043b\u0430\u0440 \u041d\u0430\u043c\u0438\u0431\u0438\u0438
+currenciesDisplayName.LAK=\u041a\u0438\u043f \u041b\u041d\u0414\u0420
+currenciesDisplayName.GHC=\u0413\u0430\u043d\u0441\u043a\u0438\u0439 \u0441\u0435\u0434\u0438
+currenciesDisplayName.AUD=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
currenciesDisplayName.KGS=\u0421\u043e\u043c (\u043a\u0438\u0440\u0433\u0438\u0437\u0441\u043a\u0438\u0439)
currenciesDisplayName.MGF=\u041c\u0430\u043b\u0430\u0433\u0430\u0441\u0438\u0439\u0441\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.BBD=\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
currenciesDisplayName.CHF=\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.PYG=\u0413\u0443\u0430\u0440\u0430\u043d\u0438
+currenciesDisplayName.BBD=\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
+currenciesDisplayName.PYG=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439\u0441\u043a\u0438\u0439 \u0433\u0443\u0430\u0440\u0430\u043d\u0438
currenciesDisplayName.PLZ=\u0417\u043b\u043e\u0442\u044b\u0439
currenciesDisplayName.YER=\u0419\u0435\u043c\u0435\u043d\u0441\u043a\u0438\u0439 \u0440\u0438\u0430\u043b
-currenciesDisplayName.ATS=\u0428\u0438\u043b\u043b\u0438\u043d\u0433
+currenciesDisplayName.ATS=\u0410\u0432\u0441\u0442\u0440\u0438\u0439\u0441\u043a\u0438\u0439 \u0448\u0438\u043b\u043b\u0438\u043d\u0433
currenciesDisplayName.ETB=\u042d\u0444\u0438\u043e\u043f\u0441\u043a\u0438\u0439 \u0431\u044b\u0440
currenciesDisplayName.BND=\u0411\u0440\u0443\u043d\u0435\u0439\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
-currenciesDisplayName.EGP=\u0415\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.JMD=\u042f\u043c\u0430\u0439\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
currenciesDisplayName.PLN=\u041f\u043e\u043b\u044c\u0441\u043a\u0438\u0439 \u0437\u043b\u043e\u0442\u044b\u0439
+currenciesDisplayName.JMD=\u042f\u043c\u0430\u0439\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
+currenciesDisplayName.EGP=\u0415\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.DZD=\u0410\u043b\u0436\u0438\u0440\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.ISK=\u0418\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0430\u044f \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.SRG=\u0421\u0443\u0440\u0438\u043d\u0430\u043c\u0441\u043a\u0438\u0439 \u0433\u0443\u043b\u044c\u0434\u0435\u043d
currenciesDisplayName.LYD=\u041b\u0438\u0432\u0438\u0439\u0441\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.BZD=\u0411\u0435\u043b\u0438\u0437\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
-currenciesDisplayName.KRW=\u0412\u043e\u043d\u0430
currenciesDisplayName.NLG=\u041d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 \u0433\u0443\u043b\u044c\u0434\u0435\u043d
-currenciesDisplayName.MRO=\u0423\u0433\u0438\u044f
+currenciesDisplayName.KRW=\u0412\u043e\u043d\u0430 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0438 \u041a\u043e\u0440\u0435\u0438
+currenciesDisplayName.MRO=\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0430\u044f \u0443\u0433\u0438\u044f
currenciesDisplayName.ZWD=\u0414\u043e\u043b\u043b\u0430\u0440 \u0417\u0438\u043c\u0431\u0430\u0431\u0432\u0435
currenciesDisplayName.SEK=\u0428\u0432\u0435\u0434\u0441\u043a\u0430\u044f \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.BYR=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
currenciesDisplayName.IRR=\u0418\u0440\u0430\u043d\u0441\u043a\u0438\u0439 \u0440\u0438\u0430\u043b
currenciesDisplayName.PKR=\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u043a\u0430\u044f \u0440\u0443\u043f\u0438\u044f
currenciesDisplayName.BMD=\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440
-currenciesDisplayName.BYL=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c (1992-1994)
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.TWD=NT$
currenciesSymbol.LKR=SL Re
-currenciesSymbol.BYB=BYB
-currenciesSymbol.TJS=TJS
-currenciesSymbol.RWF=RWF
-currenciesSymbol.ERN=ERN
-currenciesSymbol.TJR=TJR
-currenciesSymbol.GRD=GRD
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.AFA=AFA
-currenciesSymbol.CRC=C
-currenciesSymbol.FKP=FKP
-currenciesSymbol.EEK=EEK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.HKD=HK$
+currenciesSymbol.ZAR=R
+currenciesSymbol.RUR=\u0440.
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.SCR=SR
-currenciesSymbol.VUV=VT
-currenciesSymbol.KPW=KPW
-currenciesSymbol.DKK=DKr
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
currenciesSymbol.IDR=Rp
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.AED=AED
-currenciesSymbol.LVL=LVL
-currenciesSymbol.BWP=BWP
-currenciesSymbol.RUR=\u0440.
-currenciesSymbol.NIO=NIO
-currenciesSymbol.FJD=F$
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUB=RUB
-currenciesSymbol.CDF=CDF
-currenciesSymbol.DJF=DF
-currenciesSymbol.UZS=UZS
+currenciesSymbol.RUB=\u0440\u0443\u0431.
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.ECS=ECS
-currenciesSymbol.THB=THB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.LUF=LUF
-currenciesSymbol.FIM=FIM
+currenciesSymbol.NOK=NKr
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.MNT=Tug
-currenciesSymbol.UAK=UAK
-currenciesSymbol.SAR=SRl
+currenciesSymbol.STD=Db
currenciesSymbol.UAH=\u0433\u0440\u043d.
-currenciesSymbol.HUF=Ft
-currenciesSymbol.QAR=QR
-currenciesSymbol.COP=Col$
-currenciesSymbol.PTE=PTE
-currenciesSymbol.INR=INR
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.LTL=LTL
-currenciesSymbol.AON=AON
-currenciesSymbol.UYP=UYP
-currenciesSymbol.MZM=Mt
-currenciesSymbol.KZT=T
-currenciesSymbol.PGK=PGK
-currenciesSymbol.SYP=LS
-currenciesSymbol.OMR=RO
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.NGN=NGN
-currenciesSymbol.CNY=Y
-currenciesSymbol.GNF=GF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.HTG=HTG
-currenciesSymbol.MYR=RM
-currenciesSymbol.XEU=XEU
-currenciesSymbol.LSL=M
-currenciesSymbol.SLL=SLL
-currenciesSymbol.BHD=BD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.TRL=TL
-currenciesSymbol.KMF=CF
-currenciesSymbol.CZK=CZK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.AZM=AZM
-currenciesSymbol.KYD=KYD
-currenciesSymbol.GMD=GMD
-currenciesSymbol.BGN=BGN
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.VEB=Be
-currenciesSymbol.ILS=ILS
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.GYD=G$
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.SKK=Sk
-currenciesSymbol.XDR=XDR
-currenciesSymbol.PEN=PEN
-currenciesSymbol.LRD=LRD
-currenciesSymbol.AMD=dram
-currenciesSymbol.BSD=BSD
-currenciesSymbol.HRK=HRK
-currenciesSymbol.HRD=HRD
-currenciesSymbol.CLP=Ch$
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRR=BRR
-currenciesSymbol.MKD=MDen
-currenciesSymbol.ALL=lek
-currenciesSymbol.MWK=MK
-currenciesSymbol.BRL=R$
-currenciesSymbol.TPE=TPE
-currenciesSymbol.DEM=DEM
-currenciesSymbol.XCD=EC$
-currenciesSymbol.KWD=KD
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.GWP=GWP
-currenciesSymbol.YUN=YUN
-currenciesSymbol.SVC=SVC
-currenciesSymbol.SIT=SIT
-currenciesSymbol.XOF=XOF
-currenciesSymbol.MVR=MVR
-currenciesSymbol.TOP=T$
-currenciesSymbol.BEF=BF
-currenciesSymbol.ROL=leu
+currenciesSymbol.SAR=SRl
+currenciesSymbol.FJD=F$
currenciesSymbol.BDT=Tk
-currenciesSymbol.AWG=AWG
-currenciesSymbol.NOK=NKr
-currenciesSymbol.ZAR=R
-currenciesSymbol.MUR=MUR
-currenciesSymbol.SHP=SHP
-currenciesSymbol.XAU=XAU
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.GIP=GIP
-currenciesSymbol.TND=TND
-currenciesSymbol.CVE=CVEsc
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAF=XAF
-currenciesSymbol.JOD=JD
+currenciesSymbol.QAR=QR
currenciesSymbol.LBP=LL
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.WST=WST
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
currenciesSymbol.KHR=CR
-currenciesSymbol.DOP=RD$
-currenciesSymbol.CUP=CUP
+currenciesSymbol.SYP=LS
currenciesSymbol.MTL=Lm
-currenciesSymbol.TMM=TMM
-currenciesSymbol.SGD=S$
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
+currenciesSymbol.CVE=CVEsc
+currenciesSymbol.HUF=Ft
currenciesSymbol.NZD=$NZ
-currenciesSymbol.USD=US$
-currenciesSymbol.BOB=Bs
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
+currenciesSymbol.DOP=RD$
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.PAB=PAB
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
+currenciesSymbol.BIF=Fbu
+currenciesSymbol.PLN=Zl
+currenciesSymbol.GNF=GF
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
+currenciesSymbol.KMF=CF
+currenciesSymbol.SEK=SKr
currenciesSymbol.AUD=$A
-currenciesSymbol.GHC=GHC
-currenciesSymbol.LAK=LAK
-currenciesSymbol.NAD=N$
-currenciesSymbol.KGS=som
-currenciesSymbol.MGF=MGF
-currenciesSymbol.BBD=BDS$
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
+currenciesSymbol.SKK=Sk
currenciesSymbol.CHF=SwF
-currenciesSymbol.PYG=PYG
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.YER=YRl
-currenciesSymbol.ATS=ATS
currenciesSymbol.ETB=Br
-currenciesSymbol.BND=BND
-currenciesSymbol.EGP=EGP
-currenciesSymbol.JMD=J$
-currenciesSymbol.PLN=Zl
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
currenciesSymbol.DZD=DA
-currenciesSymbol.ISK=ISK
-currenciesSymbol.SRG=Sf
-currenciesSymbol.LYD=LD
+currenciesSymbol.ANG=NA f.
currenciesSymbol.BZD=BZ$
-currenciesSymbol.KRW=KRW
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.SEK=SKr
-currenciesSymbol.BYR=Rbl
currenciesSymbol.IRR=RI
-currenciesSymbol.PKR=Pra
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.BYL=BYL
+currenciesSymbol.GYD=G$
+currenciesSymbol.CAD=Can$
shortMonths=\u044f\u043d\u0432.®\u0444\u0435\u0432\u0440.®\u043c\u0430\u0440\u0442®\u0430\u043f\u0440.®\u043c\u0430\u0439®\u0438\u044e\u043d\u044c®\u0438\u044e\u043b\u044c®\u0430\u0432\u0433.®\u0441\u0435\u043d\u0442.®\u043e\u043a\u0442.®\u043d\u043e\u044f\u0431.®\u0434\u0435\u043a.®®
months=\u042f\u043d\u0432\u0430\u0440\u044c®\u0424\u0435\u0432\u0440\u0430\u043b\u044c®\u041c\u0430\u0440\u0442®\u0410\u043f\u0440\u0435\u043b\u044c®\u041c\u0430\u0439®\u0418\u044e\u043d\u044c®\u0418\u044e\u043b\u044c®\u0410\u0432\u0433\u0443\u0441\u0442®\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c®\u041e\u043a\u0442\u044f\u0431\u0440\u044c®\u041d\u043e\u044f\u0431\u0440\u044c®\u0414\u0435\u043a\u0430\u0431\u0440\u044c®®
shortWeekdays=®\u0412\u0441®\u041f\u043d®\u0412\u0442®\u0421\u0440®\u0427\u0442®\u041f\u0442®\u0421\u0431®
@@ -414,7 +331,9 @@ territories.GN=\u0413\u0432\u0438\u043d\u0435\u044f
territories.GM=\u0413\u0430\u043c\u0431\u0438\u044f
territories.GL=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0438\u044f
territories.SV=\u0421\u0430\u043b\u044c\u0432\u0430\u0434\u043e\u0440
+territories.062=\u042e\u0436\u043d\u0430\u044f \u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0410\u0437\u0438\u044f
territories.ST=\u0421\u0430\u043d-\u0422\u043e\u043c\u0435 \u0438 \u041f\u0440\u0438\u043d\u0441\u0438\u043f\u0438
+territories.061=\u041f\u043e\u043b\u0438\u043d\u0435\u0437\u0438\u044f
territories.GI=\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440
territories.GH=\u0413\u0430\u043d\u0430
territories.SR=\u0421\u0443\u0440\u0438\u043d\u0430\u043c
@@ -438,9 +357,12 @@ territories.SC=\u0421\u0435\u0439\u0448\u0435\u043b\u044c\u0441\u043a\u0438\u043
territories.SB=\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u043e\u0432\u044b \u041e\u0441\u0442\u0440\u043e\u0432\u0430
territories.SA=\u0421\u0430\u0443\u0434\u043e\u0432\u0441\u043a\u0430\u044f \u0410\u0440\u0430\u0432\u0438\u044f
territories.FR=\u0424\u0440\u0430\u043d\u0446\u0438\u044f
+territories.057=\u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u044f
territories.FO=\u0424\u0430\u0440\u0435\u0440\u0441\u043a\u0438\u0435 \u043e\u0441\u0442\u0440\u043e\u0432\u0430
territories.FM=\u0424\u0435\u0434\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u043e \u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u044f
territories.RW=\u0420\u0443\u0430\u043d\u0434\u0430
+territories.054=\u041c\u0435\u043b\u0430\u043d\u0435\u0437\u0438\u044f
+territories.053=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f \u0438 \u041d\u043e\u0432\u0430\u044f \u0417\u0435\u043b\u0430\u043d\u0434\u0438\u044f
territories.FK=\u0424\u043e\u043b\u044c\u043a\u043b\u0435\u043d\u0434\u0441\u043a\u0438\u0435 \u041e\u0441\u0442\u0440\u043e\u0432\u0430
territories.RU=\u0420\u043e\u0441\u0441\u0438\u044f
territories.FJ=\u0424\u0438\u0434\u0436\u0438
@@ -450,20 +372,26 @@ territories.RE=\u0420\u0435\u044e\u043d\u044c\u043e\u043d
territories.ET=\u042d\u0444\u0438\u043e\u043f\u0438\u044f
territories.ES=\u0418\u0441\u043f\u0430\u043d\u0438\u044f
territories.ER=\u042d\u0440\u0438\u0442\u0440\u0435\u044f
+territories.833=\u041c\u044d\u043d, \u043e\u0441\u0442\u0440\u043e\u0432
territories.EH=\u0417\u0430\u043f\u0430\u0434\u043d\u0430\u044f \u0421\u0430\u0445\u0430\u0440\u0430
territories.EG=\u0415\u0433\u0438\u043f\u0435\u0442
+territories.830=\u041d\u043e\u0440\u043c\u0430\u043d\u0434\u0441\u043a\u0438\u0435 \u043e\u0441\u0442\u0440\u043e\u0432\u0430
territories.EE=\u042d\u0441\u0442\u043e\u043d\u0438\u044f
+territories.QO=\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u0430\u044f \u041e\u043a\u0435\u0430\u043d\u0438\u044f
territories.EC=\u042d\u043a\u0432\u0430\u0434\u043e\u0440
territories.DZ=\u0410\u043b\u0436\u0438\u0440
territories.QA=\u041a\u0430\u0442\u0430\u0440
+territories.039=\u042e\u0436\u043d\u0430\u044f \u0415\u0432\u0440\u043e\u043f\u0430
territories.DO=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430
territories.PY=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439
+territories.035=\u042e\u0433\u043e-\u0412\u043e\u0441\u0442\u043e\u0447\u043d\u0430\u044f \u0410\u0437\u0438\u044f
territories.DM=\u041e\u0441\u0442\u0440\u043e\u0432 \u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430
territories.PW=\u041f\u0430\u043b\u0430\u0443
territories.DK=\u0414\u0430\u043d\u0438\u044f
territories.DJ=\u0414\u0436\u0438\u0431\u0443\u0442\u0438
territories.PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u044f
territories.PS=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u043a\u0430\u044f \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u0438\u044f
+territories.030=\u0412\u043e\u0441\u0442\u043e\u0447\u043d\u0430\u044f \u0410\u0437\u0438\u044f
territories.PR=\u041f\u0443\u044d\u0440\u0442\u043e-\u0420\u0438\u043a\u043e
territories.DE=\u0413\u0435\u0440\u043c\u0430\u043d\u0438\u044f
territories.PN=\u041e\u0441\u0442\u0440\u043e\u0432 \u041f\u0438\u0442\u043a\u044d\u0440\u043d
@@ -480,13 +408,16 @@ territories.CX=\u041e\u0441\u0442\u0440\u043e\u0432 \u0420\u043e\u0436\u0434\u04
territories.CV=\u041e\u0441\u0442\u0440\u043e\u0432\u0430 \u0417\u0435\u043b\u0435\u043d\u043e\u0433\u043e \u041c\u044b\u0441\u0430
territories.PA=\u041f\u0430\u043d\u0430\u043c\u0430
territories.CU=\u041a\u0443\u0431\u0430
+territories.CS=\u0421\u0435\u0440\u0431\u0438\u044f \u0438 \u0427\u0435\u0440\u043d\u043e\u0433\u043e\u0440\u0438\u044f
territories.CR=\u041a\u043e\u0441\u0442\u0430-\u0420\u0438\u043a\u0430
+territories.029=\u041a\u0430\u0440\u0438\u0431\u044b
territories.CO=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u044f
territories.CN=\u041a\u0438\u0442\u0430\u0439
territories.CM=\u041a\u0430\u043c\u0435\u0440\u0443\u043d
territories.CL=\u0427\u0438\u043b\u0438
territories.CK=\u041e\u0441\u0442\u0440\u043e\u0432\u0430 \u041a\u0443\u043a\u0430
territories.CI=\u041a\u043e\u0442 \u0434\u2019\u0418\u0432\u0443\u0430\u0440
+territories.021=\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.CH=\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0438\u044f
territories.CG=\u041a\u043e\u043d\u0433\u043e
territories.CF=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e-\u0410\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430
@@ -501,13 +432,20 @@ territories.BV=\u041e\u0441\u0442\u0440\u043e\u0432 \u0411\u0443\u0432\u0435
territories.BT=\u0411\u0443\u0442\u0430\u043d
territories.BS=\u0411\u0430\u0433\u0430\u043c\u0441\u043a\u0438\u0435 \u043e\u0441\u0442\u0440\u043e\u0432\u0430
territories.BR=\u0411\u0440\u0430\u0437\u0438\u043b\u0438\u044f
+territories.019=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0438 \u042e\u0436\u043d\u0430\u044f \u0410\u043c\u0435\u0440\u0438\u043a\u0430
+territories.018=\u042e\u0436\u043d\u0430\u044f \u0410\u0444\u0440\u0438\u043a\u0430
territories.NZ=\u041d\u043e\u0432\u0430\u044f \u0417\u0435\u043b\u0430\u043d\u0434\u0438\u044f
territories.BO=\u0411\u043e\u043b\u0438\u0432\u0438\u044f
+territories.017=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0410\u0444\u0440\u0438\u043a\u0430
territories.BN=\u0411\u0440\u0443\u043d\u0435\u0439 \u0414\u0430\u0440\u0443\u0441\u0441\u0430\u043b\u0430\u043c
territories.BM=\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u043a\u0438\u0435 \u041e\u0441\u0442\u0440\u043e\u0432\u0430
+territories.015=\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0410\u0444\u0440\u0438\u043a\u0430
+territories.014=\u0412\u043e\u0441\u0442\u043e\u0447\u043d\u0430\u044f \u0410\u0444\u0440\u0438\u043a\u0430
+territories.013=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.NU=\u041d\u0438\u0443\u0435
territories.BJ=\u0411\u0435\u043d\u0438\u043d
territories.BI=\u0411\u0443\u0440\u0443\u043d\u0434\u0438
+territories.011=\u0417\u0430\u043f\u0430\u0434\u043d\u0430\u044f \u0410\u0444\u0440\u0438\u043a\u0430
territories.BH=\u0411\u0430\u0445\u0440\u0435\u0439\u043d
territories.NR=\u041d\u0430\u0443\u0440\u0443
territories.BG=\u0411\u043e\u043b\u0433\u0430\u0440\u0438\u044f
@@ -525,6 +463,7 @@ territories.NG=\u041d\u0438\u0433\u0435\u0440\u0438\u044f
territories.NF=\u041e\u0441\u0442\u0440\u043e\u0432 \u041d\u043e\u0440\u0444\u043e\u043b\u043a
territories.AZ=\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d
territories.NE=\u041d\u0438\u0433\u0435\u0440
+territories.AX=\u0410\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0435 \u043e\u0441\u0442\u0440\u043e\u0432\u0430
territories.NC=\u041d\u043e\u0432\u0430\u044f \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0438\u044f
territories.AW=\u0410\u0440\u0443\u0431\u0430
territories.ZM=\u0417\u0430\u043c\u0431\u0438\u044f
@@ -533,19 +472,23 @@ territories.AU=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f
territories.AT=\u0410\u0432\u0441\u0442\u0440\u0438\u044f
territories.AS=\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u043e\u0435 \u0421\u0430\u043c\u043e\u0430
territories.AR=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430
+territories.009=\u041e\u043a\u0435\u0430\u043d\u0438\u044f
territories.AQ=\u0410\u043d\u0442\u0430\u0440\u043a\u0442\u0438\u0434\u0430
territories.MZ=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a
territories.AO=\u0410\u043d\u0433\u043e\u043b\u0430
territories.MY=\u041c\u0430\u043b\u0430\u0439\u0437\u0438\u044f
territories.AN=\u0413\u043e\u043b\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0435 \u0410\u043d\u0442\u0438\u043b\u044c\u0441\u043a\u0438\u0435 \u041e\u0441\u0442\u0440\u043e\u0432\u0430
territories.MX=\u041c\u0435\u043a\u0441\u0438\u043a\u0430
+territories.005=\u042e\u0436\u043d\u0430\u044f \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.AM=\u0410\u0440\u043c\u0435\u043d\u0438\u044f
territories.MW=\u041c\u0430\u043b\u0430\u0432\u0438
territories.AL=\u0410\u043b\u0431\u0430\u043d\u0438\u044f
territories.MV=\u041c\u0430\u043b\u044c\u0434\u0438\u0432\u044b
territories.ZA=\u042e\u0436\u043d\u0430\u044f \u0410\u0444\u0440\u0438\u043a\u0430
territories.MU=\u041c\u0430\u0432\u0440\u0438\u043a\u0438\u0439
+territories.002=\u0410\u0444\u0440\u0438\u043a\u0430
territories.MT=\u041c\u0430\u043b\u044c\u0442\u0430
+territories.001=\u0412\u0441\u0435\u043c\u0438\u0440\u043d\u043e\u0435
territories.AI=\u0410\u043d\u0433\u0443\u0438\u043b\u043b\u0430
territories.MS=\u041c\u043e\u043d\u0441\u0435\u0440\u0440\u0430\u0442
territories.MR=\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0438\u044f
@@ -557,10 +500,9 @@ territories.AE=\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044
territories.MO=\u041c\u0430\u043a\u0430\u043e (\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0441 \u041e\u0441\u043e\u0431\u044b\u043c \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u041a\u0438\u0442\u0430\u0439)
territories.AD=\u0410\u043d\u0434\u043e\u0440\u0440\u0430
territories.MN=\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u044f
-territories.MM=\u041c\u0430\u0439\u0430\u043d\u043c\u0430\u0440
+territories.MM=\u041c\u044c\u044f\u043d\u043c\u0430
territories.ML=\u041c\u0430\u043b\u0438
territories.MK=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0438\u044f
-territories.YU=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0438\u044f
territories.YT=\u041c\u0430\u0439\u043e\u0442\u0442\u0430
territories.MH=\u041c\u0430\u0440\u0448\u0430\u043b\u043b\u043e\u0432\u044b \u041e\u0441\u0442\u0440\u043e\u0432\u0430
territories.MG=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440
@@ -570,10 +512,14 @@ territories.MA=\u041c\u0430\u0440\u043e\u043a\u043a\u043e
territories.YE=\u0419\u0435\u043c\u0435\u043d
territories.LY=\u041b\u0438\u0432\u0438\u044f
territories.LV=\u041b\u0430\u0442\u0432\u0438\u044f
+territories.155=\u0417\u0430\u043f\u0430\u0434\u043d\u0430\u044f \u0415\u0432\u0440\u043e\u043f\u0430
territories.LU=\u041b\u044e\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433
+territories.154=\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0415\u0432\u0440\u043e\u043f\u0430
territories.LT=\u041b\u0438\u0442\u0432\u0430
territories.LS=\u041b\u0435\u0441\u043e\u0442\u043e
territories.LR=\u041b\u0438\u0431\u0435\u0440\u0438\u044f
+territories.151=\u0412\u043e\u0441\u0442\u043e\u0447\u043d\u0430\u044f \u0415\u0432\u0440\u043e\u043f\u0430
+territories.150=\u0415\u0432\u0440\u043e\u043f\u0430
territories.LK=\u0428\u0440\u0438-\u041b\u0430\u043d\u043a\u0430
territories.LI=\u041b\u0438\u0445\u0442\u0435\u043d\u0448\u0442\u0435\u0439\u043d
territories.LC=\u0421\u0435\u043d\u0442-\u041b\u044e\u0441\u0438\u044f
@@ -582,6 +528,8 @@ territories.LA=\u041b\u0430\u043e\u0441
territories.KZ=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d
territories.KY=\u041a\u0430\u0439\u043c\u0430\u043d\u043e\u0432\u044b \u041e\u0441\u0442\u0440\u043e\u0432\u0430
territories.KW=\u041a\u0443\u0432\u0435\u0439\u0442
+territories.145=\u0411\u043b\u0438\u0436\u043d\u0438\u0439 \u0438 \u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u0412\u043e\u0441\u0442\u043e\u043a
+territories.142=\u0410\u0437\u0438\u044f
territories.KR=\u042e\u0436\u043d\u0430\u044f \u041a\u043e\u0440\u0435\u044f
territories.KP=\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u041a\u043e\u0440\u0435\u044f
territories.KN=\u0421\u0435\u043d\u0442-\u041a\u0438\u0442\u0442\u0441 \u0438 \u041d\u0435\u0432\u0438\u0441
@@ -631,357 +579,357 @@ territories.TR=\u0422\u0443\u0440\u0446\u0438\u044f
territories.TO=\u0422\u043e\u043d\u0433\u0430
territories.TN=\u0422\u0443\u043d\u0438\u0441
territories.TM=\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0438\u0441\u0442\u0430\u043d
-languages.akk=\u0410\u043a\u043a\u0430\u0434\u0441\u043a\u0438\u0439
-languages.eka=\u042d\u043a\u0430\u0434\u0436\u0443\u043a
-languages.ijo=\u0418\u0434\u0436\u043e
-languages.xh=\u0425\u043e\u0437\u0430
-languages.sux=\u0428\u0443\u043c\u0435\u0440\u0441\u043a\u0438\u0439
-languages.sus=\u0421\u0443\u0441\u0443
-languages.mis=\u0421\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.loz=\u041b\u043e\u0437\u0438
-languages.tog=\u0422\u043e\u043d\u0433\u0430 (\u041d\u044c\u044f\u0441\u0430)
-languages.pon=\u041f\u043e\u043d\u0430\u043f\u0435
-languages.min=\u041c\u0438\u043d\u0430\u043d\u0433\u043a\u0430\u0431\u0430\u0443
-languages.suk=\u0421\u0443\u043a\u0443\u043c\u0430
-languages.wo=\u0412\u043e\u043b\u043e\u0444
-languages.lol=\u041c\u043e\u043d\u0433\u043e
-languages.kut=\u041a\u0443\u0442\u0435\u043d\u0430\u0438
-languages.mic=\u041c\u0438\u043a\u043c\u0430\u043a
-languages.kum=\u041a\u0443\u043c\u044b\u043a\u0441\u043a\u0438\u0439
-languages.zap=\u0421\u0430\u043f\u043e\u0442\u0435\u043a\u0441\u043a\u0438\u0439
-languages.cus=\u041a\u0443\u0448\u0438\u0442\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.doi=\u0414\u043e\u0433\u0440\u0438
-languages.vo=\u0412\u043e\u043b\u0430\u043f\u0430\u043a
-languages.oto=\u041e\u0442\u043e\u043c\u0430\u043d\u0433\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.vi=\u0412\u044c\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438\u0439
-languages.vai=\u0412\u0430\u0438
-languages.raj=\u0420\u0430\u0434\u0436\u0430\u0441\u0442\u0445\u0430\u043d\u0438
-languages.ota=\u0421\u0442\u0430\u0440\u043e\u0442\u0443\u0440\u0435\u0446\u043a\u0438\u0439
-languages.nzi=\u041d\u0437\u0438\u043c\u0430
-languages.uz=\u0423\u0437\u0431\u0435\u043a\u0441\u043a\u0438\u0439
-languages.uga=\u0423\u0433\u0430\u0440\u0438\u0442\u0441\u043a\u0438\u0439
-languages.tmh=\u0422\u0430\u043c\u0430\u0448\u0435\u043a
-languages.nai=\u0421\u0435\u0432\u0435\u0440\u043d\u043e\u0439 \u0410\u043c\u0435\u0440\u0438\u043a\u0438 \u0438\u043d\u0434\u0435\u0439\u0446\u0435\u0432 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.nah=\u0410\u0446\u0442\u0435\u043a\u0441\u043a\u0438\u0439
-languages.ur=\u0423\u0440\u0434\u0443
-languages.fat=\u0424\u0430\u043d\u0442\u0438
-languages.uk=\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438\u0439
-languages.egy=\u0414\u0440\u0435\u0432\u043d\u0435\u0435\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0438\u0439
-languages.ug=\u0423\u0439\u0433\u0443\u0440\u0441\u043a\u0438\u0439
-languages.fan=\u0424\u0430\u043d\u0433
-languages.ssa=\u041d\u0438\u043b\u043e-\u0441\u0430\u0445\u0430\u0440\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.mga=\u0421\u0440\u0435\u0434\u043d\u0435\u0438\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
-languages.bat=\u0411\u0430\u043b\u0442\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.nyo=\u041d\u044c\u043e\u0440\u043e
-languages.bas=\u0411\u0430\u0441\u0430
-languages.nyn=\u041d\u044c\u044f\u043d\u043a\u043e\u043b\u0435
-languages.nym=\u041d\u044c\u044f\u043c\u0432\u0435\u0437\u0438
-languages.ban=\u0411\u0430\u043b\u0438\u0439\u0441\u043a\u0438\u0439
-languages.osa=\u041e\u0441\u0435\u0434\u0436\u0438
-languages.bal=\u0411\u0435\u043b\u0443\u0434\u0436\u0441\u043a\u0438\u0439
-languages.bai=\u0411\u0430\u043c\u0438\u043b\u0435\u043a\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.tw=\u0422\u0432\u0438
-languages.tli=\u0422\u043b\u0438\u043d\u0433\u0438\u0442
-languages.tt=\u0422\u0430\u0442\u0430\u0440\u0441\u043a\u0438\u0439
-languages.ts=\u0422\u0441\u043e\u043d\u0433\u0430
-languages.bad=\u0411\u0430\u043d\u0434\u0430
-languages.tr=\u0422\u0443\u0440\u0435\u0446\u043a\u0438\u0439
-languages.to=\u0422\u043e\u043d\u0433\u0430
-languages.tn=\u0421\u0435\u0442\u0441\u0432\u0430\u043d\u0430
-languages.tl=\u0422\u0430\u0433\u0430\u043b\u043e\u0433
-languages.tk=\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0441\u043a\u0438\u0439
-languages.ti=\u0422\u0438\u0433\u0440\u0438\u043d\u0438\u0430
-languages.th=\u0422\u0430\u0439\u0441\u043a\u0438\u0439
-languages.tg=\u0422\u0430\u0434\u0436\u0438\u043a\u0441\u043a\u0438\u0439
-languages.te=\u0422\u0435\u043b\u0443\u0433\u0443
-languages.kro=\u041a\u0440\u0443
-languages.ta=\u0422\u0430\u043c\u0438\u043b\u044c\u0441\u043a\u0438\u0439
-languages.efi=\u042d\u0444\u0438\u043a
-languages.sw=\u0421\u0443\u0430\u0445\u0438\u043b\u0438
-languages.sv=\u0428\u0432\u0435\u0434\u0441\u043a\u0438\u0439
-languages.su=\u0421\u0430\u043d\u0434\u0430\u043d\u0438\u0437\u0441\u043a\u0438\u0439
-languages.st=\u0421\u0435\u0441\u043e\u0442\u043e
-languages.ss=\u0421\u0438\u0441\u0432\u0430\u0442\u0438
-languages.sr=\u0421\u0435\u0440\u0431\u0441\u043a\u0438\u0439
-languages.sq=\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438\u0439
-languages.men=\u041c\u0435\u043d\u0434\u0435
-languages.crp=\u041a\u0440\u0435\u043e\u043b\u044c\u0441\u043a\u0438\u0435 \u0438 \u043f\u0438\u0434\u0436\u0438\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.so=\u0421\u043e\u043c\u0430\u043b\u0438
-languages.afh=\u0410\u0444\u0440\u0438\u0445\u0438\u043b\u0438
-languages.sn=\u0428\u043e\u043d\u0430
-languages.sm=\u0421\u0430\u043c\u043e\u0430
-languages.grc=\u0414\u0440\u0435\u0432\u043d\u0435\u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439
-languages.sl=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438\u0439
-languages.sk=\u0421\u043b\u043e\u0432\u0430\u0446\u043a\u0438\u0439
-languages.si=\u0421\u0438\u043d\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439
-languages.afa=\u0410\u0444\u0440\u0430\u0437\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.sh=\u0421\u0435\u0440\u0431\u0441\u043a\u043e-\u0445\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439
-languages.sg=\u0421\u0430\u043d\u0433\u043e
-languages.sd=\u0421\u0438\u043d\u0434\u0438
-languages.sa=\u0421\u0430\u043d\u0441\u043a\u0440\u0438\u0442
-languages.rw=\u041a\u0438\u043d\u044f\u0440\u0432\u0430\u043d\u0434\u0430
-languages.ru=\u0420\u0443\u0441\u0441\u043a\u0438\u0439
-languages.ro=\u0420\u0443\u043c\u044b\u043d\u0441\u043a\u0438\u0439
-languages.rn=\u041a\u0438\u0440\u0443\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439
-languages.rm=\u0420\u0430\u0435\u0442\u043e-\u0440\u043e\u043c\u0430\u043d\u0441\u043a\u0438\u0439
-languages.tiv=\u0422\u0438\u0432\u0438
-languages.ady=\u0410\u0434\u044b\u0433\u0435\u0439\u0441\u043a\u0438\u0439
-languages.zun=\u0417\u0443\u043d\u044c\u0438
-languages.kpe=\u041a\u043f\u0435\u043b\u043b\u0435
-languages.qu=\u041a\u0435\u0447\u0443\u0430
-languages.tig=\u0422\u0438\u0433\u0440\u0435
-languages.cpp=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u043e\u043a\u0440\u0435\u043e\u043b\u044c\u0441\u043a\u0438\u0435 \u0438 \u043f\u0438\u0434\u0436\u0438\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.sog=\u0421\u043e\u0433\u0434\u0438\u0439\u0441\u043a\u0438\u0439
-languages.ada=\u0410\u0434\u0430\u043d\u0433\u043c\u0435
-languages.cpf=\u0424\u0440\u0430\u043d\u043a\u043e-\u043a\u0440\u0435\u043e\u043b\u044c\u0441\u043a\u0438\u0435 \u0438 \u043f\u0438\u0434\u0436\u0438\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.cpe=\u0410\u043d\u0433\u043b\u043e-\u043a\u0440\u0435\u043e\u043b\u044c\u0441\u043a\u0438\u0435 \u0438 \u043f\u0438\u0434\u0436\u0438\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.him=\u0425\u0438\u043c\u0430\u0447\u0430\u043b\u0438
-languages.kok=\u041a\u043e\u043d\u043a\u0430\u043d\u0438
-languages.hil=\u0425\u0438\u043b\u0438\u0433\u0430\u0439\u043d\u043e\u043d
-languages.got=\u0413\u043e\u0442\u0441\u043a\u0438\u0439
-languages.gon=\u0413\u043e\u043d\u0434\u0438
-languages.din=\u0414\u0438\u043d\u043a\u0430
-languages.nub=\u041d\u0443\u0431\u0438\u0439\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.pt=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439
-languages.ps=\u041f\u0430\u0448\u0442\u043e (\u041f\u0443\u0448\u0442\u043e)
-languages.phn=\u0424\u0438\u043d\u0438\u043a\u0438\u0439\u0441\u043a\u0438\u0439
-languages.goh=\u0421\u0442\u0430\u0440\u043e\u0432\u0435\u0440\u0445\u043d\u0435\u043d\u0435\u043c\u0435\u0446\u043a\u0438\u0439
-languages.cop=\u041a\u043e\u043f\u0442\u0441\u043a\u0438\u0439
-languages.yap=\u042f\u043f
-languages.ach=\u0410\u0447\u043e\u043b\u0438
-languages.yao=\u042f\u043e
-languages.ace=\u0410\u0447\u0435\u0445\u0441\u043a\u0438\u0439
-languages.pl=\u041f\u043e\u043b\u044c\u0441\u043a\u0438\u0439
-languages.pi=\u041f\u0430\u043b\u0438
-languages.pa=\u041f\u0430\u043d\u0434\u0436\u0430\u0431\u0441\u043a\u0438\u0439
-languages.bug=\u0411\u0443\u0433\u0438\u0439\u0441\u043a\u0438\u0439
-languages.iba=\u0418\u0431\u0430\u043d\u0441\u043a\u0438\u0439
-languages.bua=\u0411\u0443\u0440\u044f\u0442\u0441\u043a\u0438\u0439
-languages.mas=\u041c\u0430\u0441\u0430\u0438
-languages.map=\u0410\u0432\u0441\u0442\u0440\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.os=\u041e\u0441\u0435\u0442\u0438\u043d\u0441\u043a\u0438\u0439
-languages.or=\u041e\u0440\u0438\u044f
-languages.man=\u041c\u0430\u043d\u0434\u0438\u043d\u0433\u043e
-languages.smi=\u0421\u0430\u0430\u043c\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.mak=\u041c\u0430\u043a\u0430\u0441\u0441\u0430\u0440\u0441\u043a\u0438\u0439
-languages.om=\u041e\u0440\u043e\u043c\u043e (\u0410\u0444\u0430\u043d)
-languages.mai=\u041c\u0430\u0439\u0442\u0445\u0438\u043b\u0438
-languages.mag=\u041c\u0430\u0433\u0430\u0445\u0438
-languages.oj=\u041e\u0434\u0436\u0438\u0431\u0432\u0430
-languages.mad=\u041c\u0430\u0434\u0443\u0440\u0441\u043a\u0438\u0439
-languages.nso=\u0421\u043e\u0442\u043e \u0421\u0435\u0432\u0435\u0440\u043d\u044b\u0439
-languages.oc=\u041e\u043a\u0438\u0442\u0430\u043d
-languages.myn=\u041c\u0430\u0439\u044f \u044f\u0437\u044b\u043a\u0438
-languages.gmh=\u0421\u0440\u0435\u0434\u043d\u0435\u0432\u0435\u0440\u0445\u043d\u0435\u043d\u0435\u043c\u0435\u0446\u043a\u0438\u0439
-languages.no=\u041d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439
-languages.nl=\u0413\u043e\u043b\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
-languages.sla=\u0421\u043b\u0430\u0432\u044f\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.ne=\u041d\u0435\u043f\u0430\u043b\u044c\u0441\u043a\u0438\u0439
-languages.na=\u041d\u0430\u0443\u0440\u0443
-languages.ter=\u0422\u0435\u0440\u0435\u043d\u043e
-languages.my=\u0411\u0438\u0440\u043c\u0430\u043d\u0441\u043a\u0438\u0439
-languages.lez=\u041b\u0435\u0437\u0433\u0438\u043d\u0441\u043a\u0438\u0439
-languages.mt=\u041c\u0430\u043b\u044c\u0442\u0438\u0439\u0441\u043a\u0438\u0439
-languages.peo=\u0421\u0442\u0430\u0440\u043e\u043f\u0435\u0440\u0441\u0438\u0434\u0441\u043a\u0438\u0439
-languages.ms=\u041c\u0430\u043b\u0430\u0439\u0441\u043a\u0438\u0439
-languages.mr=\u041c\u0430\u0440\u0430\u0442\u0438\u0439\u0441\u043a\u0438\u0439
-languages.fro=\u0421\u0442\u0430\u0440\u043e\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439
-languages.mo=\u041c\u043e\u043b\u0434\u0430\u0432\u0441\u043a\u0438\u0439
-languages.frm=\u0421\u0440\u0435\u0434\u043d\u0435\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439
-languages.mn=\u041c\u043e\u043d\u0433\u043e\u043b\u044c\u0441\u043a\u0438\u0439
-languages.jrb=\u0415\u0432\u0440\u0435\u0439\u0441\u043a\u043e-\u0430\u0440\u0430\u0431\u0441\u043a\u0438\u0439
-languages.ml=\u041c\u0430\u043b\u0430\u044f\u043b\u0430\u043c
-languages.mk=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438\u0439
-languages.mi=\u041c\u0430\u043e\u0440\u0438
-languages.mg=\u041c\u0430\u043b\u0430\u0433\u0430\u0441\u0438\u0439\u0441\u043a\u0438\u0439
-languages.mwr=\u041c\u0430\u0440\u0432\u0430\u0440\u0438
-languages.bra=\u0411\u0440\u0430\u0443\u0438
-languages.lv=\u041b\u0430\u0442\u0432\u0438\u0439\u0441\u043a\u0438\u0439
-languages.lu=\u041b\u0443\u0431\u0430-\u041a\u0430\u0442\u0430\u043d\u0433\u0430
-languages.del=\u0414\u0435\u043b\u0430\u0432\u0430\u0440\u0441\u043a\u0438\u0439
-languages.lt=\u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438\u0439
-languages.lo=\u041b\u0430\u043e\u0441\u0441\u043a\u0438\u0439
-languages.ln=\u041b\u0438\u043d\u0433\u0430\u043b\u0430
-languages.ewo=\u042d\u0432\u043e\u043d\u0434\u043e
-languages.la=\u041b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0439
-languages.jpr=\u0415\u0432\u0440\u0435\u0439\u0441\u043a\u043e-\u043f\u0435\u0440\u0441\u0438\u0434\u0441\u043a\u0438\u0439
-languages.vot=\u0423\u0434\u043c\u0443\u0440\u0442\u0441\u043a\u0438\u0439 (\u0412\u043e\u0442\u044f\u0446\u043a\u0438\u0439)
-languages.ky=\u041a\u0438\u0440\u0433\u0438\u0437\u0441\u043a\u0438\u0439
-languages.sit=\u0421\u0438\u043d\u043e\u0442\u0438\u0431\u0435\u0442\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.ku=\u041a\u0443\u0440\u0434\u0438\u0448
-languages.sio=\u0421\u0438\u0443 \u044f\u0437\u044b\u043a\u0438
-languages.ks=\u041a\u0430\u0448\u043c\u0438\u0440\u0441\u043a\u0438\u0439
-languages.awa=\u0410\u0432\u0430\u0434\u0445\u0438
-languages.ko=\u041a\u043e\u0440\u0435\u0439\u0441\u043a\u0438\u0439
-languages.kn=\u041a\u0430\u043d\u0430\u0434\u0430
-languages.km=\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0438\u0439\u0441\u043a\u0438\u0439
-languages.kl=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
-languages.kk=\u041a\u0430\u0437\u0430\u0445\u0441\u043a\u0438\u0439
-languages.rom=\u0426\u044b\u0433\u0430\u043d\u0441\u043a\u0438\u0439
-languages.sid=\u0421\u0438\u0434\u0430\u043c\u0430
-languages.non=\u0421\u0442\u0430\u0440\u043e\u043d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439
-languages.ka=\u0413\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438\u0439
-languages.mus=\u041a\u0440\u0438\u043a
-languages.roa=\u0420\u043e\u043c\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.nog=\u041d\u043e\u0433\u0430\u0439\u0441\u043a\u0438\u0439
-languages.mun=\u041c\u0443\u043d\u0434\u0430 \u044f\u0437\u044b\u043a\u0438
-languages.mul=\u0420\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u043c\u0435\u0439 \u044f\u0437\u044b\u043a\u0438
-languages.jv=\u042f\u0432\u0430\u043d\u0441\u043a\u0438\u0439
-languages.gil=\u0413\u0438\u043b\u044c\u0431\u0435\u0440\u0442\u0441\u043a\u0438\u0439
-languages.shn=\u0428\u0430\u043d\u0441\u043a\u0438\u0439
-languages.fon=\u0424\u043e\u043d
-languages.kho=\u0425\u043e\u0442\u0430\u043d\u0441\u043a\u0438\u0439
-languages.ja=\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0439
-languages.khi=\u041a\u043e\u0439\u0441\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.pau=\u041f\u0430\u043b\u0430\u0443
-languages.chy=\u0427\u0435\u0439\u0435\u043d\u043d
-languages.tai=\u0422\u0430\u0442\u0441\u043a\u0438\u0439
-languages.iu=\u0418\u043d\u0430\u043a\u0442\u0438\u0442\u0443\u0442
-languages.it=\u0418\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0438\u0439
-languages.pap=\u041f\u0430\u043f\u044c\u044f\u043c\u0435\u043d\u0442\u043e
-languages.is=\u0418\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
-languages.kha=\u041a\u0445\u0430\u0441\u0438
-languages.chr=\u0427\u0435\u0440\u043e\u043a\u0438
-languages.pam=\u041f\u0430\u043c\u043f\u0430\u043d\u0433\u0430
-languages.pal=\u041f\u0435\u0445\u043b\u0435\u0432\u0438\u0439\u0441\u043a\u0438\u0439
-languages.cho=\u0427\u043e\u043a\u0442\u0430\u0432
-languages.chn=\u0427\u0438\u043d\u0443\u043a \u0436\u0430\u0440\u0433\u043e\u043d
-languages.chm=\u041c\u0430\u0440\u0438\u0439\u0441\u043a\u0438\u0439 (\u0427\u0435\u0440\u0435\u043c\u0438\u0441\u0441\u043a\u0438\u0439)
-languages.tyv=\u0422\u0443\u0432\u0438\u043d\u0441\u043a\u0438\u0439
-languages.bnt=\u0411\u0430\u043d\u0442\u0443 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.ik=\u0418\u043d\u0430\u043f\u0438\u0430\u043a
-languages.pag=\u041f\u0430\u043d\u0433\u0430\u0441\u0438\u043d\u0430\u043d
-languages.chk=\u0427\u0443\u043a\u043e\u0442\u0441\u043a\u0438\u0439
-languages.haw=\u0413\u0430\u0432\u0430\u0439\u0441\u043a\u0438\u0439
-languages.lam=\u041b\u0430\u043c\u0431\u0430
-languages.chg=\u0427\u0430\u0433\u0430\u0442\u0430\u0439\u0441\u043a\u0438\u0439
-languages.sga=\u0421\u0442\u0430\u0440\u043e\u0438\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
-languages.ie=\u0421\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a
-languages.paa=\u041f\u0430\u043f\u0443\u0430\u0441\u0441\u043a\u043e-\u0430\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.id=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438\u0439
-languages.lah=\u041b\u0430\u0445\u043d\u0434\u0430
-languages.chb=\u0427\u0438\u0431\u0447\u0430
-languages.ia=\u0421\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a
-languages.lad=\u041b\u0430\u0434\u0438\u043d\u043e
-languages.hai=\u0425\u0430\u0439\u0434\u0430
-languages.hy=\u0410\u0440\u043c\u044f\u043d\u0441\u043a\u0438\u0439
-languages.ath=\u0410\u0442\u0430\u043f\u0430\u0447\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.hu=\u0412\u0435\u043d\u0433\u0435\u0440\u0441\u043a\u0438\u0439
-languages.dak=\u0414\u0430\u043a\u043e\u0442\u0430
-languages.hr=\u0425\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439
-languages.hi=\u0425\u0438\u043d\u0434\u0438
-languages.dyu=\u0414\u0438\u0443\u043b\u0430 (\u0414\u044c\u044e\u043b\u0430)
-languages.he=\u0418\u0432\u0440\u0438\u0442
-languages.ha=\u0425\u043e\u0441\u0430
-languages.wen=\u041b\u0443\u0436\u0438\u0446\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.gu=\u0413\u0443\u044f\u0440\u0430\u0442\u0438
-languages.sem=\u0421\u0435\u043c\u0438\u0442\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.iro=\u0418\u0440\u043e\u043a\u0435\u0437\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.sel=\u0421\u0435\u043b\u044c\u043a\u0443\u043f\u0441\u043a\u0438\u0439
-languages.gn=\u0413\u0443\u0430\u0440\u0430\u043d\u0438
-languages.gl=\u0413\u0430\u043b\u0438\u0446\u0438\u0439\u0441\u043a\u0438\u0439
-languages.arw=\u0410\u0440\u0430\u0432\u0430\u043a\u0441\u043a\u0438\u0439
-languages.gez=\u0413\u0435\u044d\u0437
-languages.art=\u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.gd=\u0413\u0430\u044d\u043b\u044c\u0441\u043a\u0438\u0439
-languages.ira=\u0418\u0440\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.ga=\u0418\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
-languages.fy=\u0424\u0440\u0438\u0437\u0441\u043a\u0438\u0439
-languages.bla=\u0421\u0438\u043a\u0441\u0438\u043a\u0430
-languages.gem=\u0413\u0435\u0440\u043c\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.arc=\u0410\u0440\u0430\u043c\u0435\u0439\u0441\u043a\u0438\u0439
-languages.fr=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439
-languages.fo=\u0424\u0430\u0440\u0435\u0440\u0441\u043a\u0438\u0439
-languages.fj=\u0424\u0438\u0434\u0436\u0438
-languages.fi=\u0424\u0438\u043d\u0441\u043a\u0438\u0439
-languages.fa=\u041f\u0435\u0440\u0441\u0438\u0434\u0441\u043a\u0438\u0439
-languages.eu=\u0411\u0430\u0441\u043a\u0441\u043a\u0438\u0439
-languages.et=\u042d\u0441\u0442\u043e\u043d\u0441\u043a\u0438\u0439
-languages.es=\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439
-languages.eo=\u042d\u0441\u043f\u0435\u0440\u0430\u043d\u0442\u043e
-languages.en=\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439
-languages.el=\u0413\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439
-languages.tut=\u0410\u043b\u0442\u0430\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.niu=\u041d\u0438\u0443\u044d
-languages.mos=\u041c\u043e\u0435\u0439
-languages.dz=\u0411\u0443\u0442\u0430\u043d\u0441\u043a\u0438\u0439
-languages.nic=\u041d\u0438\u0433\u0435\u0440-\u043a\u043e\u0440\u0434\u043e\u0444\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.fiu=\u0424\u0438\u043d\u043d\u043e-\u0443\u0433\u043e\u0440\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.moh=\u041c\u043e\u0445\u0430\u0443\u043a
-languages.luo=\u041b\u0443\u043e (\u041a\u0435\u043d\u0438\u044f \u0438 \u0422\u0430\u043d\u0437\u0430\u043d\u0438\u044f)
-languages.lun=\u041b\u0443\u043d\u0434\u0430
-languages.lui=\u041b\u0443\u0438\u0441\u0435\u043d\u044c\u043e
-languages.hup=\u0425\u0443\u043b\u0430
-languages.bin=\u0411\u0438\u043d\u0438
-languages.de=\u041d\u0435\u043c\u0435\u0446\u043a\u0438\u0439
-languages.bik=\u0411\u0438\u043a\u043e\u043b\u044c\u0441\u043a\u0438\u0439
-languages.was=\u0412\u0430\u0448\u043e
-languages.und=\u041d\u0435\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439
-languages.war=\u0412\u0430\u0440\u0430\u0439
-languages.da=\u0414\u0430\u0442\u0441\u043a\u0438\u0439
-languages.dum=\u041d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 \u0441\u0440\u0435\u0434\u043d\u0435\u0432\u0435\u043a\u043e\u0432\u044b\u0439
-languages.wal=\u0412\u043e\u043b\u0430\u043c\u043e
-languages.mno=\u041c\u0430\u043d\u043e\u0431\u043e \u044f\u0437\u044b\u043a\u0438
-languages.wak=\u0412\u0430\u043a\u0430\u0448\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.cy=\u0412\u0430\u043b\u043b\u0438\u0439\u0441\u043a\u0438\u0439
-languages.cv=\u0427\u0443\u0432\u0430\u0448\u0441\u043a\u0438\u0439
-languages.mni=\u041c\u0430\u043d\u0438\u043f\u0443\u0440\u0441\u043a\u0438\u0439
-languages.cs=\u0427\u0435\u0448\u0441\u043a\u0438\u0439
-languages.sam=\u0421\u0430\u043c\u0430\u0440\u0438\u0442\u044f\u043d\u0441\u043a\u0438\u0439 \u0430\u0440\u0430\u043c\u0435\u0439\u0441\u043a\u0438\u0439
-languages.sal=\u0421\u0430\u043b\u0438\u0448\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.dua=\u0414\u0443\u0430\u043b\u0430
-languages.co=\u041a\u043e\u0440\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439
-languages.sai=\u042e\u0436\u043d\u043e\u0439 \u0410\u043c\u0435\u0440\u0438\u043a\u0438 \u0438\u043d\u0434\u0435\u0439\u0446\u0435\u0432 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.sah=\u042f\u043a\u0443\u0442\u0441\u043a\u0438\u0439
-languages.kaw=\u041a\u0430\u0432\u0438
-languages.sad=\u0421\u0430\u043d\u0434\u0430\u0432\u0435
-languages.bho=\u0411\u0445\u043e\u0434\u0436\u043f\u0443\u0440\u0438
-languages.enm=\u0421\u0440\u0435\u0434\u043d\u0435\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439
-languages.kar=\u041a\u0430\u0440\u0435\u043d\u0441\u043a\u0438\u0439
-languages.inc=\u0418\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.gay=\u0413\u0430\u0439\u043e
-languages.ca=\u041a\u0430\u0442\u0430\u043b\u0430\u043d\u0441\u043a\u0438\u0439
-languages.umb=\u0423\u043c\u0431\u0443\u043d\u0434\u0443
-languages.kam=\u041a\u0430\u043c\u0431\u0430
-languages.tsi=\u0426\u0438\u043c\u0448\u0438\u0430\u043d
-languages.ang=\u0421\u0442\u0430\u0440\u043e\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439
-languages.cau=\u041a\u0430\u0432\u043a\u0430\u0437\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.kab=\u041a\u0430\u0431\u0438\u043b\u044c\u0441\u043a\u0438\u0439
-languages.kaa=\u041a\u0430\u0440\u0430\u043a\u0430\u043b\u043f\u0430\u043a\u0441\u043a\u0438\u0439
-languages.car=\u041a\u0430\u0440\u0438\u0431
-languages.br=\u0411\u0440\u0435\u0442\u043e\u043d\u0441\u043a\u0438\u0439
-languages.bo=\u0422\u0438\u0431\u0435\u0442\u0441\u043a\u0438\u0439
-languages.bn=\u0411\u0435\u043d\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439
-languages.gaa=\u0413\u0430
-languages.cai=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u043c\u0435\u0440\u0438\u043a\u0438 \u0438\u043d\u0434\u0435\u0439\u0446\u0435\u0432 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.bi=\u0411\u0438\u0441\u043b\u0430\u043c\u0430
-languages.bh=\u0411\u0438\u0445\u0430\u0440\u0441\u043a\u0438\u0439
-languages.bg=\u0411\u043e\u043b\u0433\u0430\u0440\u0441\u043a\u0438\u0439
-languages.be=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u0441\u043a\u0438\u0439
-languages.cad=\u041a\u0430\u0434\u0434\u043e
-languages.ba=\u0411\u0430\u0448\u043a\u0438\u0440\u0441\u043a\u0438\u0439
-languages.zu=\u0417\u0443\u043b\u0443\u0441\u0441\u043a\u0438\u0439
-languages.zen=\u0417\u0435\u043d\u0430\u0433\u0441\u043a\u0438\u0439
-languages.pro=\u0421\u0442\u0430\u0440\u043e\u043f\u0440\u043e\u0432\u0430\u043d\u0441\u0430\u043b\u044c\u0441\u043a\u0438\u0439
-languages.az=\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d\u0441\u043a\u0438\u0439
-languages.ay=\u0410\u044f\u043c\u0430\u0440\u0430
-languages.as=\u0410\u0441\u0441\u0430\u043c\u0441\u043a\u0438\u0439
-languages.ar=\u0410\u0440\u0430\u0431\u0441\u043a\u0438\u0439
-languages.ilo=\u0418\u043b\u043e\u043a\u043e
-languages.elx=\u042d\u043b\u0430\u043c\u0441\u043a\u0438\u0439
-languages.zh=\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439
-languages.pra=\u041f\u0440\u0430\u043a\u0440\u0438\u0442\u044b \u044f\u0437\u044b\u043a\u0438
-languages.am=\u0410\u043c\u0445\u0430\u0440\u0441\u043a\u0438\u0439
-languages.new=\u041d\u0435\u0432\u0430\u0440\u0441\u043a\u0438\u0439
-languages.za=\u0417\u0443\u0430\u043d\u0433
-languages.af=\u0410\u0444\u0440\u0438\u043a\u0430\u0430\u043d\u0441
-languages.ab=\u0410\u0431\u0445\u0430\u0437\u0441\u043a\u0438\u0439
-languages.aa=\u0410\u0444\u0430\u0440
-languages.yo=\u0419\u043e\u0440\u0443\u0431\u0430
-languages.alg=\u0410\u043b\u0433\u043e\u043d\u043a\u0438\u043d\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
-languages.ale=\u0410\u043b\u0435\u0443\u0442\u0441\u043a\u0438\u0439
-languages.mkh=\u041c\u043e\u043d\u043a\u0445\u043c\u0435\u0440\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.yi=\u0418\u0434\u0438\u0448
-languages.dra=\u0414\u0440\u0430\u0432\u0438\u0434\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
-languages.bem=\u0411\u0435\u043c\u0431\u0430
-languages.bej=\u0411\u0435\u0434\u0436\u0430
+languages.akk=\u0430\u043a\u043a\u0430\u0434\u0441\u043a\u0438\u0439
+languages.eka=\u044d\u043a\u0430\u0434\u0436\u0443\u043a
+languages.ijo=\u0438\u0434\u0436\u043e
+languages.xh=\u043a\u043e\u0441\u0430
+languages.sux=\u0448\u0443\u043c\u0435\u0440\u0441\u043a\u0438\u0439
+languages.sus=\u0441\u0443\u0441\u0443
+languages.mis=\u0441\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.loz=\u043b\u043e\u0437\u0438
+languages.tog=\u0442\u043e\u043d\u0433\u0430 (\u043d\u044c\u044f\u0441\u0430)
+languages.pon=\u043f\u043e\u043d\u0430\u043f\u0435
+languages.min=\u043c\u0438\u043d\u0430\u043d\u0433\u043a\u0430\u0431\u0430\u0443
+languages.suk=\u0441\u0443\u043a\u0443\u043c\u0430
+languages.wo=\u0432\u043e\u043b\u043e\u0444
+languages.kut=\u043a\u0443\u0442\u0435\u043d\u0430\u0438
+languages.lol=\u043c\u043e\u043d\u0433\u043e
+languages.mic=\u043c\u0438\u043a\u043c\u0430\u043a
+languages.kum=\u043a\u0443\u043c\u044b\u043a\u0441\u043a\u0438\u0439
+languages.zap=\u0441\u0430\u043f\u043e\u0442\u0435\u043a\u0441\u043a\u0438\u0439
+languages.cus=\u043a\u0443\u0448\u0438\u0442\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.doi=\u0434\u043e\u0433\u0440\u0438
+languages.vo=\u0432\u043e\u043b\u0430\u043f\u044e\u043a
+languages.oto=\u043e\u0442\u043e\u043c\u0430\u043d\u0433\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.vi=\u0432\u044c\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438\u0439
+languages.vai=\u0432\u0430\u0438
+languages.raj=\u0440\u0430\u0434\u0436\u0430\u0441\u0442\u0445\u0430\u043d\u0438
+languages.nzi=\u043d\u0437\u0438\u043c\u0430
+languages.ota=\u0441\u0442\u0430\u0440\u043e\u0442\u0443\u0440\u0435\u0446\u043a\u0438\u0439
+languages.uz=\u0443\u0437\u0431\u0435\u043a\u0441\u043a\u0438\u0439
+languages.uga=\u0443\u0433\u0430\u0440\u0438\u0442\u0441\u043a\u0438\u0439
+languages.tmh=\u0442\u0430\u043c\u0430\u0448\u0435\u043a
+languages.nai=\u0441\u0435\u0432\u0435\u0440\u043d\u043e\u0439 \u0410\u043c\u0435\u0440\u0438\u043a\u0438 \u0438\u043d\u0434\u0435\u0439\u0446\u0435\u0432 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.nah=\u0430\u0446\u0442\u0435\u043a\u0441\u043a\u0438\u0439
+languages.ur=\u0443\u0440\u0434\u0443
+languages.fat=\u0444\u0430\u043d\u0442\u0438
+languages.uk=\u0443\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438\u0439
+languages.egy=\u0434\u0440\u0435\u0432\u043d\u0435\u0435\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0438\u0439
+languages.ug=\u0443\u0439\u0433\u0443\u0440\u0441\u043a\u0438\u0439
+languages.fan=\u0444\u0430\u043d\u0433
+languages.ssa=\u043d\u0438\u043b\u043e-\u0441\u0430\u0445\u0430\u0440\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.bat=\u0431\u0430\u043b\u0442\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.mga=\u0441\u0440\u0435\u0434\u043d\u0435\u0438\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
+languages.bas=\u0431\u0430\u0441\u0430
+languages.nyo=\u043d\u044c\u043e\u0440\u043e
+languages.nyn=\u043d\u044c\u044f\u043d\u043a\u043e\u043b\u0435
+languages.nym=\u043d\u044c\u044f\u043c\u0432\u0435\u0437\u0438
+languages.ban=\u0431\u0430\u043b\u0438\u0439\u0441\u043a\u0438\u0439
+languages.osa=\u043e\u0441\u0435\u0434\u0436\u0438
+languages.bal=\u0431\u0435\u043b\u0443\u0434\u0436\u0441\u043a\u0438\u0439
+languages.bai=\u0431\u0430\u043c\u0438\u043b\u0435\u043a\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.tw=\u0442\u0432\u0438
+languages.tli=\u0442\u043b\u0438\u043d\u0433\u0438\u0442
+languages.tt=\u0442\u0430\u0442\u0430\u0440\u0441\u043a\u0438\u0439
+languages.ts=\u0442\u0441\u043e\u043d\u0433\u0430
+languages.bad=\u0431\u0430\u043d\u0434\u0430
+languages.tr=\u0442\u0443\u0440\u0435\u0446\u043a\u0438\u0439
+languages.to=\u0442\u043e\u043d\u0433\u0430
+languages.tn=\u0442\u0441\u0432\u0430\u043d\u0430
+languages.tl=\u0442\u0430\u0433\u0430\u043b\u043e\u0433
+languages.tk=\u0442\u0443\u0440\u043a\u043c\u0435\u043d\u0441\u043a\u0438\u0439
+languages.ti=\u0442\u0438\u0433\u0440\u0438\u043d\u044c\u044f
+languages.th=\u0442\u0430\u0439\u0441\u043a\u0438\u0439
+languages.tg=\u0442\u0430\u0434\u0436\u0438\u043a\u0441\u043a\u0438\u0439
+languages.te=\u0442\u0435\u043b\u0443\u0433\u0443
+languages.kro=\u043a\u0440\u0443
+languages.ta=\u0442\u0430\u043c\u0438\u043b\u044c\u0441\u043a\u0438\u0439
+languages.efi=\u044d\u0444\u0438\u043a
+languages.sw=\u0441\u0443\u0430\u0445\u0438\u043b\u0438
+languages.sv=\u0448\u0432\u0435\u0434\u0441\u043a\u0438\u0439
+languages.su=\u0441\u0443\u043d\u0434\u0430\u043d\u0441\u043a\u0438\u0439
+languages.st=\u0441\u043e\u0442\u043e \u044e\u0436\u043d\u044b\u0439
+languages.ss=\u0441\u0432\u0430\u0437\u0438
+languages.sr=\u0441\u0435\u0440\u0431\u0441\u043a\u0438\u0439
+languages.sq=\u0430\u043b\u0431\u0430\u043d\u0441\u043a\u0438\u0439
+languages.men=\u043c\u0435\u043d\u0434\u0435
+languages.crp=\u043a\u0440\u0435\u043e\u043b\u044c\u0441\u043a\u0438\u0435 \u0438 \u043f\u0438\u0434\u0436\u0438\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.so=\u0441\u043e\u043c\u0430\u043b\u0438
+languages.afh=\u0430\u0444\u0440\u0438\u0445\u0438\u043b\u0438
+languages.sn=\u0448\u043e\u043d\u0430
+languages.sm=\u0441\u0430\u043c\u043e\u0430\u043d\u0441\u043a\u0438\u0439
+languages.sl=\u0441\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438\u0439
+languages.grc=\u0434\u0440\u0435\u0432\u043d\u0435\u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439
+languages.sk=\u0441\u043b\u043e\u0432\u0430\u0446\u043a\u0438\u0439
+languages.si=\u0441\u0438\u043d\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439
+languages.sh=\u0441\u0435\u0440\u0431\u0441\u043a\u043e\u0445\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439
+languages.afa=\u0430\u0444\u0440\u0430\u0437\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.sg=\u0441\u0430\u043d\u0433\u043e
+languages.sd=\u0441\u0438\u043d\u0434\u0445\u0438
+languages.sa=\u0441\u0430\u043d\u0441\u043a\u0440\u0438\u0442
+languages.rw=\u043a\u0438\u043d\u044c\u044f\u0440\u0443\u0430\u043d\u0434\u0430
+languages.ru=\u0440\u0443\u0441\u0441\u043a\u0438\u0439
+languages.ro=\u0440\u0443\u043c\u044b\u043d\u0441\u043a\u0438\u0439
+languages.rn=\u0440\u0443\u043d\u0434\u0438
+languages.rm=\u0440\u0435\u0442\u043e\u0440\u043e\u043c\u0430\u043d\u0441\u043a\u0438\u0439
+languages.tiv=\u0442\u0438\u0432\u0438
+languages.ady=\u0430\u0434\u044b\u0433\u0435\u0439\u0441\u043a\u0438\u0439
+languages.zun=\u0437\u0443\u043d\u044c\u0438
+languages.kpe=\u043a\u043f\u0435\u043b\u043b\u0435
+languages.qu=\u043a\u0435\u0447\u0443\u0430
+languages.tig=\u0442\u0438\u0433\u0440\u0435
+languages.cpp=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u043e-\u043a\u0440\u0435\u043e\u043b\u044c\u0441\u043a\u0438\u0435 \u0438 \u043f\u0438\u0434\u0436\u0438\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.sog=\u0441\u043e\u0433\u0434\u0438\u0439\u0441\u043a\u0438\u0439
+languages.ada=\u0430\u0434\u0430\u043d\u0433\u043c\u0435
+languages.cpf=\u0444\u0440\u0430\u043d\u043a\u043e-\u043a\u0440\u0435\u043e\u043b\u044c\u0441\u043a\u0438\u0435 \u0438 \u043f\u0438\u0434\u0436\u0438\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.cpe=\u0430\u043d\u0433\u043b\u043e-\u043a\u0440\u0435\u043e\u043b\u044c\u0441\u043a\u0438\u0435 \u0438 \u043f\u0438\u0434\u0436\u0438\u043d\u044b (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.him=\u0445\u0438\u043c\u0430\u0447\u0430\u043b\u0438
+languages.got=\u0433\u043e\u0442\u0441\u043a\u0438\u0439
+languages.hil=\u0445\u0438\u043b\u0438\u0433\u0430\u0439\u043d\u043e\u043d
+languages.kok=\u043a\u043e\u043d\u043a\u0430\u043d\u0438
+languages.gon=\u0433\u043e\u043d\u0434\u0438
+languages.din=\u0434\u0438\u043d\u043a\u0430
+languages.nub=\u043d\u0443\u0431\u0438\u0439\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.pt=\u043f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439
+languages.ps=\u043f\u0430\u0448\u0442\u043e (\u043f\u0443\u0448\u0442\u0443)
+languages.phn=\u0444\u0438\u043d\u0438\u043a\u0438\u0439\u0441\u043a\u0438\u0439
+languages.goh=\u0441\u0442\u0430\u0440\u043e\u0432\u0435\u0440\u0445\u043d\u0435\u043d\u0435\u043c\u0435\u0446\u043a\u0438\u0439
+languages.cop=\u043a\u043e\u043f\u0442\u0441\u043a\u0438\u0439
+languages.yap=\u044f\u043f
+languages.ach=\u0430\u0447\u043e\u043b\u0438
+languages.yao=\u044f\u043e
+languages.pl=\u043f\u043e\u043b\u044c\u0441\u043a\u0438\u0439
+languages.ace=\u0430\u0447\u0435\u0445\u0441\u043a\u0438\u0439
+languages.pi=\u043f\u0430\u043b\u0438
+languages.pa=\u043f\u0430\u043d\u0434\u0436\u0430\u0431\u0438 (\u043f\u0435\u043d\u0434\u0436\u0430\u0431\u0438)
+languages.bug=\u0431\u0443\u0433\u0438\u0439\u0441\u043a\u0438\u0439
+languages.iba=\u0438\u0431\u0430\u043d\u0441\u043a\u0438\u0439
+languages.bua=\u0431\u0443\u0440\u044f\u0442\u0441\u043a\u0438\u0439
+languages.mas=\u043c\u0430\u0441\u0430\u0438
+languages.os=\u043e\u0441\u0435\u0442\u0438\u043d\u0441\u043a\u0438\u0439
+languages.map=\u0430\u0432\u0441\u0442\u0440\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.or=\u043e\u0440\u0438\u044f
+languages.man=\u043c\u0430\u043d\u0434\u0438\u043d\u0433\u043e
+languages.smi=\u0441\u0430\u0430\u043c\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.mak=\u043c\u0430\u043a\u0430\u0441\u0441\u0430\u0440\u0441\u043a\u0438\u0439
+languages.om=\u043e\u0440\u043e\u043c\u043e
+languages.mai=\u043c\u0430\u0439\u0442\u0445\u0438\u043b\u0438
+languages.oj=\u043e\u0434\u0436\u0438\u0431\u0432\u0430
+languages.mag=\u043c\u0430\u0433\u0430\u0445\u0438
+languages.mad=\u043c\u0430\u0434\u0443\u0440\u0441\u043a\u0438\u0439
+languages.oc=\u043e\u043a\u0441\u0438\u0442\u0430\u043d\u0441\u043a\u0438\u0439
+languages.nso=\u0441\u043e\u0442\u043e \u0441\u0435\u0432\u0435\u0440\u043d\u044b\u0439
+languages.myn=\u043c\u0430\u0439\u044f \u044f\u0437\u044b\u043a\u0438
+languages.gmh=\u0441\u0440\u0435\u0434\u043d\u0435\u0432\u0435\u0440\u0445\u043d\u0435\u043d\u0435\u043c\u0435\u0446\u043a\u0438\u0439
+languages.no=\u043d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439
+languages.nl=\u043d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 (\u0433\u043e\u043b\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439)
+languages.sla=\u0441\u043b\u0430\u0432\u044f\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.ne=\u043d\u0435\u043f\u0430\u043b\u044c\u0441\u043a\u0438\u0439
+languages.na=\u043d\u0430\u0443\u0440\u0443
+languages.ter=\u0442\u0435\u0440\u0435\u043d\u043e
+languages.my=\u0431\u0438\u0440\u043c\u0430\u043d\u0441\u043a\u0438\u0439
+languages.lez=\u043b\u0435\u0437\u0433\u0438\u043d\u0441\u043a\u0438\u0439
+languages.mt=\u043c\u0430\u043b\u044c\u0442\u0438\u0439\u0441\u043a\u0438\u0439
+languages.ms=\u043c\u0430\u043b\u0430\u0439\u0441\u043a\u0438\u0439
+languages.peo=\u0441\u0442\u0430\u0440\u043e\u043f\u0435\u0440\u0441\u0438\u0434\u0441\u043a\u0438\u0439
+languages.mr=\u043c\u0430\u0440\u0430\u0442\u0445\u0438
+languages.fro=\u0441\u0442\u0430\u0440\u043e\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439
+languages.mo=\u043c\u043e\u043b\u0434\u0430\u0432\u0441\u043a\u0438\u0439
+languages.mn=\u043c\u043e\u043d\u0433\u043e\u043b\u044c\u0441\u043a\u0438\u0439
+languages.frm=\u0441\u0440\u0435\u0434\u043d\u0435\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439
+languages.ml=\u043c\u0430\u043b\u0430\u044f\u043b\u0430\u043c
+languages.jrb=\u0435\u0432\u0440\u0435\u0439\u0441\u043a\u043e-\u0430\u0440\u0430\u0431\u0441\u043a\u0438\u0439
+languages.mk=\u043c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438\u0439
+languages.mi=\u043c\u0430\u043e\u0440\u0438
+languages.mg=\u043c\u0430\u043b\u0430\u0433\u0430\u0441\u0438\u0439\u0441\u043a\u0438\u0439
+languages.mwr=\u043c\u0430\u0440\u0432\u0430\u0440\u0438
+languages.bra=\u0431\u0440\u0430\u0443\u0438
+languages.lv=\u043b\u0430\u0442\u044b\u0448\u0441\u043a\u0438\u0439
+languages.lu=\u043b\u0443\u0431\u0430-\u041a\u0430\u0442\u0430\u043d\u0433\u0430
+languages.lt=\u043b\u0438\u0442\u043e\u0432\u0441\u043a\u0438\u0439
+languages.del=\u0434\u0435\u043b\u0430\u0432\u0430\u0440\u0441\u043a\u0438\u0439
+languages.lo=\u043b\u0430\u043e\u0441\u0441\u043a\u0438\u0439
+languages.ln=\u043b\u0438\u043d\u0433\u0430\u043b\u0430
+languages.ewo=\u044d\u0432\u043e\u043d\u0434\u043e
+languages.la=\u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0439
+languages.jpr=\u0435\u0432\u0440\u0435\u0439\u0441\u043a\u043e-\u043f\u0435\u0440\u0441\u0438\u0434\u0441\u043a\u0438\u0439
+languages.vot=\u0443\u0434\u043c\u0443\u0440\u0442\u0441\u043a\u0438\u0439 (\u0412\u043e\u0442\u044f\u0446\u043a\u0438\u0439)
+languages.sit=\u0441\u0438\u043d\u043e\u0442\u0438\u0431\u0435\u0442\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.ky=\u043a\u0438\u0440\u0433\u0438\u0437\u0441\u043a\u0438\u0439
+languages.ku=\u043a\u0443\u0440\u0434\u0441\u043a\u0438\u0439
+languages.sio=\u0441\u0438\u0443 \u044f\u0437\u044b\u043a\u0438
+languages.ks=\u043a\u0430\u0448\u043c\u0438\u0440\u0438
+languages.awa=\u0430\u0432\u0430\u0434\u0445\u0438
+languages.ko=\u043a\u043e\u0440\u0435\u0439\u0441\u043a\u0438\u0439
+languages.kn=\u043a\u0430\u043d\u043d\u0430\u0434\u0430
+languages.km=\u043a\u0445\u043c\u0435\u0440\u0441\u043a\u0438\u0439
+languages.kl=\u044d\u0441\u043a\u0438\u043c\u043e\u0441\u0441\u043a\u0438\u0439 (\u0433\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439)
+languages.kk=\u043a\u0430\u0437\u0430\u0445\u0441\u043a\u0438\u0439
+languages.rom=\u0446\u044b\u0433\u0430\u043d\u0441\u043a\u0438\u0439
+languages.sid=\u0441\u0438\u0434\u0430\u043c\u0430
+languages.non=\u0441\u0442\u0430\u0440\u043e\u043d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439
+languages.ka=\u0433\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438\u0439
+languages.mus=\u043a\u0440\u0438\u043a
+languages.roa=\u0440\u043e\u043c\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.nog=\u043d\u043e\u0433\u0430\u0439\u0441\u043a\u0438\u0439
+languages.mun=\u043c\u0443\u043d\u0434\u0430 \u044f\u0437\u044b\u043a\u0438
+languages.mul=\u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u043c\u0435\u0439 \u044f\u0437\u044b\u043a\u0438
+languages.jv=\u044f\u0432\u0430\u043d\u0441\u043a\u0438\u0439
+languages.gil=\u0433\u0438\u043b\u044c\u0431\u0435\u0440\u0442\u0441\u043a\u0438\u0439
+languages.shn=\u0448\u0430\u043d\u0441\u043a\u0438\u0439
+languages.fon=\u0444\u043e\u043d
+languages.kho=\u0445\u043e\u0442\u0430\u043d\u0441\u043a\u0438\u0439
+languages.ja=\u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0439
+languages.khi=\u043a\u043e\u0439\u0441\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.chy=\u0447\u0435\u0439\u0435\u043d\u043d
+languages.pau=\u043f\u0430\u043b\u0430\u0443
+languages.tai=\u0442\u0430\u0442\u0441\u043a\u0438\u0439
+languages.iu=\u0438\u043d\u0443\u043a\u0442\u0438\u0442\u0443\u0442
+languages.pap=\u043f\u0430\u043f\u044c\u044f\u043c\u0435\u043d\u0442\u043e
+languages.it=\u0438\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0438\u0439
+languages.kha=\u043a\u0445\u0430\u0441\u0438
+languages.is=\u0438\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
+languages.chr=\u0447\u0435\u0440\u043e\u043a\u0438
+languages.pam=\u043f\u0430\u043c\u043f\u0430\u043d\u0433\u0430
+languages.pal=\u043f\u0435\u0445\u043b\u0435\u0432\u0438\u0439\u0441\u043a\u0438\u0439
+languages.cho=\u0447\u043e\u043a\u0442\u0430\u0432
+languages.chn=\u0447\u0438\u043d\u0443\u043a \u0436\u0430\u0440\u0433\u043e\u043d
+languages.chm=\u043c\u0430\u0440\u0438\u0439\u0441\u043a\u0438\u0439 (\u0427\u0435\u0440\u0435\u043c\u0438\u0441\u0441\u043a\u0438\u0439)
+languages.tyv=\u0442\u0443\u0432\u0438\u043d\u0441\u043a\u0438\u0439
+languages.bnt=\u0431\u0430\u043d\u0442\u0443 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.chk=\u0447\u0443\u043a\u043e\u0442\u0441\u043a\u0438\u0439
+languages.pag=\u043f\u0430\u043d\u0433\u0430\u0441\u0438\u043d\u0430\u043d
+languages.ik=\u0438\u043d\u0443\u043f\u0438\u0430\u043a
+languages.haw=\u0433\u0430\u0432\u0430\u0439\u0441\u043a\u0438\u0439
+languages.lam=\u043b\u0430\u043c\u0431\u0430
+languages.chg=\u0447\u0430\u0433\u0430\u0442\u0430\u0439\u0441\u043a\u0438\u0439
+languages.sga=\u0441\u0442\u0430\u0440\u043e\u0438\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
+languages.paa=\u043f\u0430\u043f\u0443\u0430\u0441\u0441\u043a\u043e-\u0430\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.ie=\u0438\u043d\u0442\u0435\u0440\u043b\u0438\u043d\u0433\u0432\u0435
+languages.id=\u0438\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438\u0439
+languages.lah=\u043b\u0430\u0445\u043d\u0434\u0430
+languages.chb=\u0447\u0438\u0431\u0447\u0430
+languages.ia=\u0438\u043d\u0442\u0435\u0440\u043b\u0438\u043d\u0433\u0432\u0430
+languages.lad=\u043b\u0430\u0434\u0438\u043d\u043e
+languages.hai=\u0445\u0430\u0439\u0434\u0430
+languages.hy=\u0430\u0440\u043c\u044f\u043d\u0441\u043a\u0438\u0439
+languages.ath=\u0430\u0442\u0430\u043f\u0430\u0447\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.hu=\u0432\u0435\u043d\u0433\u0435\u0440\u0441\u043a\u0438\u0439
+languages.dak=\u0434\u0430\u043a\u043e\u0442\u0430
+languages.hr=\u0445\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439
+languages.hi=\u0445\u0438\u043d\u0434\u0438
+languages.dyu=\u0434\u0438\u0443\u043b\u0430 (\u0434\u044c\u044e\u043b\u0430)
+languages.he=\u0438\u0432\u0440\u0438\u0442
+languages.ha=\u0445\u0430\u0443\u0441\u0430
+languages.wen=\u043b\u0443\u0436\u0438\u0446\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.gu=\u0433\u0443\u0434\u0436\u0430\u0440\u0430\u0442\u0438
+languages.sem=\u0441\u0435\u043c\u0438\u0442\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.sel=\u0441\u0435\u043b\u044c\u043a\u0443\u043f\u0441\u043a\u0438\u0439
+languages.iro=\u0438\u0440\u043e\u043a\u0435\u0437\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.gn=\u0433\u0443\u0430\u0440\u0430\u043d\u0438
+languages.gl=\u0433\u0430\u043b\u0438\u0441\u0438\u0439\u0441\u043a\u0438\u0439
+languages.arw=\u0430\u0440\u0430\u0432\u0430\u043a\u0441\u043a\u0438\u0439
+languages.gd=\u0433\u0430\u044d\u043b\u044c\u0441\u043a\u0438\u0439
+languages.art=\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.gez=\u0433\u0435\u044d\u0437
+languages.ira=\u0438\u0440\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.ga=\u0438\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
+languages.fy=\u0444\u0440\u0438\u0437\u0441\u043a\u0438\u0439
+languages.bla=\u0441\u0438\u043a\u0441\u0438\u043a\u0430
+languages.gem=\u0433\u0435\u0440\u043c\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.fr=\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439
+languages.arc=\u0430\u0440\u0430\u043c\u0435\u0439\u0441\u043a\u0438\u0439
+languages.fo=\u0444\u0430\u0440\u0435\u0440\u0441\u043a\u0438\u0439
+languages.fj=\u0444\u0438\u0434\u0436\u0438
+languages.fi=\u0444\u0438\u043d\u0441\u043a\u0438\u0439
+languages.fa=\u043f\u0435\u0440\u0441\u0438\u0434\u0441\u043a\u0438\u0439
+languages.eu=\u0431\u0430\u0441\u043a\u0441\u043a\u0438\u0439
+languages.et=\u044d\u0441\u0442\u043e\u043d\u0441\u043a\u0438\u0439
+languages.es=\u0438\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439
+languages.eo=\u044d\u0441\u043f\u0435\u0440\u0430\u043d\u0442\u043e
+languages.en=\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439
+languages.el=\u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439
+languages.tut=\u0430\u043b\u0442\u0430\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.niu=\u043d\u0438\u0443\u044d
+languages.mos=\u043c\u043e\u0435\u0439
+languages.dz=\u0434\u0437\u043e\u043d\u0433-\u043a\u044d
+languages.fiu=\u0444\u0438\u043d\u043d\u043e-\u0443\u0433\u043e\u0440\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.nic=\u043d\u0438\u0433\u0435\u0440-\u043a\u043e\u0440\u0434\u043e\u0444\u0430\u043d\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.moh=\u043c\u043e\u0445\u0430\u0443\u043a
+languages.luo=\u043b\u0443\u043e (\u041a\u0435\u043d\u0438\u044f \u0438 \u0422\u0430\u043d\u0437\u0430\u043d\u0438\u044f)
+languages.lun=\u043b\u0443\u043d\u0434\u0430
+languages.lui=\u043b\u0443\u0438\u0441\u0435\u043d\u044c\u043e
+languages.hup=\u0425\u0443\u043f\u0430
+languages.bin=\u0431\u0438\u043d\u0438
+languages.de=\u043d\u0435\u043c\u0435\u0446\u043a\u0438\u0439
+languages.bik=\u0431\u0438\u043a\u043e\u043b\u044c\u0441\u043a\u0438\u0439
+languages.was=\u0432\u0430\u0448\u043e
+languages.und=\u043d\u0435\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439
+languages.war=\u0432\u0430\u0440\u0430\u0439
+languages.da=\u0434\u0430\u0442\u0441\u043a\u0438\u0439
+languages.dum=\u043d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 \u0441\u0440\u0435\u0434\u043d\u0435\u0432\u0435\u043a\u043e\u0432\u044b\u0439
+languages.wal=\u0432\u043e\u043b\u0430\u043c\u043e
+languages.mno=\u043c\u0430\u043d\u043e\u0431\u043e \u044f\u0437\u044b\u043a\u0438
+languages.wak=\u0432\u0430\u043a\u0430\u0448\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.cy=\u0432\u0430\u043b\u043b\u0438\u0439\u0441\u043a\u0438\u0439
+languages.cv=\u0447\u0443\u0432\u0430\u0448\u0441\u043a\u0438\u0439
+languages.mni=\u043c\u0430\u043d\u0438\u043f\u0443\u0440\u0441\u043a\u0438\u0439
+languages.cs=\u0447\u0435\u0448\u0441\u043a\u0438\u0439
+languages.sam=\u0441\u0430\u043c\u0430\u0440\u0438\u0442\u044f\u043d\u0441\u043a\u0438\u0439 \u0430\u0440\u0430\u043c\u0435\u0439\u0441\u043a\u0438\u0439
+languages.dua=\u0434\u0443\u0430\u043b\u0430
+languages.sal=\u0441\u0430\u043b\u0438\u0448\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.co=\u043a\u043e\u0440\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439
+languages.sai=\u044e\u0436\u043d\u043e\u0439 \u0430\u043c\u0435\u0440\u0438\u043a\u0438 \u0438\u043d\u0434\u0435\u0439\u0446\u0435\u0432 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.sah=\u044f\u043a\u0443\u0442\u0441\u043a\u0438\u0439
+languages.kaw=\u043a\u0430\u0432\u0438
+languages.sad=\u0441\u0430\u043d\u0434\u0430\u0432\u0435
+languages.bho=\u0431\u0445\u043e\u0434\u0436\u043f\u0443\u0440\u0438
+languages.enm=\u0441\u0440\u0435\u0434\u043d\u0435\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439
+languages.inc=\u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.kar=\u043a\u0430\u0440\u0435\u043d\u0441\u043a\u0438\u0439
+languages.gay=\u0433\u0430\u0439\u043e
+languages.ca=\u043a\u0430\u0442\u0430\u043b\u0430\u043d\u0441\u043a\u0438\u0439
+languages.umb=\u0443\u043c\u0431\u0443\u043d\u0434\u0443
+languages.kam=\u043a\u0430\u043c\u0431\u0430
+languages.tsi=\u0446\u0438\u043c\u0448\u0438\u0430\u043d
+languages.ang=\u0441\u0442\u0430\u0440\u043e\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439
+languages.cau=\u043a\u0430\u0432\u043a\u0430\u0437\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.kab=\u043a\u0430\u0431\u0438\u043b\u044c\u0441\u043a\u0438\u0439
+languages.kaa=\u043a\u0430\u0440\u0430\u043a\u0430\u043b\u043f\u0430\u043a\u0441\u043a\u0438\u0439
+languages.br=\u0431\u0440\u0435\u0442\u043e\u043d\u0441\u043a\u0438\u0439
+languages.car=\u043a\u0430\u0440\u0438\u0431
+languages.bo=\u0442\u0438\u0431\u0435\u0442\u0441\u043a\u0438\u0439
+languages.bn=\u0431\u0435\u043d\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439
+languages.gaa=\u0433\u0430
+languages.bi=\u0431\u0438\u0441\u043b\u0430\u043c\u0430
+languages.cai=\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u043c\u0435\u0440\u0438\u043a\u0438 \u0438\u043d\u0434\u0435\u0439\u0446\u0435\u0432 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.bh=\u0431\u0438\u0445\u0430\u0440\u0438
+languages.bg=\u0431\u043e\u043b\u0433\u0430\u0440\u0441\u043a\u0438\u0439
+languages.be=\u0431\u0435\u043b\u043e\u0440\u0443\u0441\u0441\u043a\u0438\u0439
+languages.cad=\u043a\u0430\u0434\u0434\u043e
+languages.ba=\u0431\u0430\u0448\u043a\u0438\u0440\u0441\u043a\u0438\u0439
+languages.zu=\u0437\u0443\u043b\u0443
+languages.zen=\u0437\u0435\u043d\u0430\u0433\u0441\u043a\u0438\u0439
+languages.pro=\u0441\u0442\u0430\u0440\u043e\u043f\u0440\u043e\u0432\u0430\u043d\u0441\u0430\u043b\u044c\u0441\u043a\u0438\u0439
+languages.az=\u0430\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d\u0441\u043a\u0438\u0439
+languages.ay=\u0430\u0439\u043c\u0430\u0440\u0430
+languages.as=\u0430\u0441\u0441\u0430\u043c\u0441\u043a\u0438\u0439
+languages.ar=\u0430\u0440\u0430\u0431\u0441\u043a\u0438\u0439
+languages.elx=\u044d\u043b\u0430\u043c\u0441\u043a\u0438\u0439
+languages.ilo=\u0438\u043b\u043e\u043a\u043e
+languages.zh=\u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439
+languages.am=\u0430\u043c\u0445\u0430\u0440\u0441\u043a\u0438\u0439
+languages.pra=\u043f\u0440\u0430\u043a\u0440\u0438\u0442\u044b \u044f\u0437\u044b\u043a\u0438
+languages.new=\u043d\u0435\u0432\u0430\u0440\u0441\u043a\u0438\u0439
+languages.za=\u0447\u0436\u0443\u0430\u043d\u044c
+languages.af=\u0430\u0444\u0440\u0438\u043a\u0430\u0430\u043d\u0441
+languages.ab=\u0430\u0431\u0445\u0430\u0437\u0441\u043a\u0438\u0439
+languages.aa=\u0430\u0444\u0430\u0440
+languages.yo=\u0439\u043e\u0440\u0443\u0431\u0430
+languages.alg=\u0430\u043b\u0433\u043e\u043d\u043a\u0438\u043d\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438
+languages.ale=\u0430\u043b\u0435\u0443\u0442\u0441\u043a\u0438\u0439
+languages.mkh=\u043c\u043e\u043d\u043a\u0445\u043c\u0435\u0440\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.yi=\u0438\u0434\u0438\u0448
+languages.dra=\u0434\u0440\u0430\u0432\u0438\u0434\u0438\u0439\u0441\u043a\u0438\u0435 (\u0434\u0440\u0443\u0433\u0438\u0435)
+languages.bem=\u0431\u0435\u043c\u0431\u0430
+languages.bej=\u0431\u0435\u0434\u0436\u0430
diff --git a/resource/gnu/java/locale/LocaleInformation_ru_RU.properties b/resource/gnu/java/locale/LocaleInformation_ru_RU.properties
index d2cebbb77..82719836a 100644
--- a/resource/gnu/java/locale/LocaleInformation_ru_RU.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ru_RU.properties
@@ -5,6 +5,4 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=\u00a0
-currencyFormat=#,##0.00\u00a4;-#,##0.00\u00a4
+currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
diff --git a/resource/gnu/java/locale/LocaleInformation_ru_UA.properties b/resource/gnu/java/locale/LocaleInformation_ru_UA.properties
index 8072886b3..65fdceb7a 100644
--- a/resource/gnu/java/locale/LocaleInformation_ru_UA.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ru_UA.properties
@@ -5,8 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-decimalSeparator=,
-groupingSeparator=\u00a0
currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
mediumDateFormat=d MMM yyyy
longDateFormat=d MMMM yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_sa.properties b/resource/gnu/java/locale/LocaleInformation_sa.properties
index 20c046f4c..72491fd82 100644
--- a/resource/gnu/java/locale/LocaleInformation_sa.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sa.properties
@@ -6,8 +6,8 @@
# This file was automatically generated by gnu.localegen from CLDR.
zeroDigit=\u0966
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
currenciesSymbol.INR=\u0930\u0941
territories.IN=\u092d\u093e\u0930\u0924\u092e\u094d
languages.sa=\u0938\u0902\u0938\u094d\u0915\u0943\u0924
diff --git a/resource/gnu/java/locale/LocaleInformation_sa_IN.properties b/resource/gnu/java/locale/LocaleInformation_sa_IN.properties
index 8edd0613d..20bb5e3ca 100644
--- a/resource/gnu/java/locale/LocaleInformation_sa_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sa_IN.properties
@@ -5,7 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4##,##,##0.00;-\u00a4##,##,##0.00
+currencyFormat=\u00a4#,##,##0.00;-\u00a4#,##,##0.00
+firstDayOfWeek=mon
shortDateFormat=d-MM-yy
mediumDateFormat=dd-MM-yyyy
longDateFormat=d MMMM yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_sid.properties b/resource/gnu/java/locale/LocaleInformation_sid.properties
new file mode 100644
index 000000000..b5e18b97d
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_sid.properties
@@ -0,0 +1,55 @@
+# LocaleInformation_sid.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currenciesDisplayName.INR=Indian Rupee
+currenciesDisplayName.JPY=Japanese Yen
+currenciesDisplayName.RUB=Russian Ruble
+currenciesDisplayName.CNY=Chinese Yuan Renminbi
+currenciesDisplayName.GBP=British Pound Sterling
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.USD=US Dollar
+currenciesDisplayName.BRL=Brazilian Real
+currenciesSymbol.ETB=$
+currenciesSymbol.USD=US$
+shortMonths=Jan®Feb®Mar®Apr®May®Jun®Jul®Aug®Sep®Oct®Nov®Dec®®
+months=January®February®March®April®May®June®July®August®September®October®November®December®®
+shortWeekdays=®Sam®San®Mak®Row®Ham®Arb®Qid®
+weekdays=®Sambata®Sanyo®Maakisanyo®Roowe®Hamuse®Arbe®Qidaame®
+firstDayOfWeek=sat
+eras=YIA®YIG®
+ampms=soodo®hawwaro®
+shortDateFormat=dd/MM/yy
+mediumDateFormat=dd-MMM-yyyy
+longDateFormat=dd MMMM yyyy
+fullDateFormat=EEEE, MMMM dd, yyyy
+shortTimeFormat=h:mm a
+mediumTimeFormat=h:mm:ss a
+longTimeFormat=h:mm:ss a
+fullTimeFormat=h:mm:ss a
+territories.FR=France
+territories.IN=India
+territories.CN=China
+territories.ET=Itiyoophiya
+territories.DE=Germany
+territories.GB=United Kingdom
+territories.BR=Brazil
+territories.RU=Russia
+territories.JP=Japan
+territories.US=United States
+territories.IT=Italy
+languages.zh=Chinese
+languages.en=English
+languages.sid=Sidaamu Afo
+languages.ru=Russian
+languages.hi=Hindi
+languages.ar=Arabic
+languages.it=Italian
+languages.fr=French
+languages.de=German
+languages.es=Spanish
+languages.ja=Japanese
+languages.pt=Portuguese
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_KW.properties b/resource/gnu/java/locale/LocaleInformation_sid_ET.properties
index 31178f891..b01b6c1cd 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_KW.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sid_ET.properties
@@ -1,8 +1,8 @@
-# LocaleInformation_ar_KW.properties --
+# LocaleInformation_sid_ET.properties --
# Copyright (C) 1991-2005 Unicode, Inc.
# All rights reserved. Distributed under the Terms of Use
# in http://www.unicode.org/copyright.html.
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4 #,##0.000;\u00a4 #,##0.000-
+currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
diff --git a/resource/gnu/java/locale/LocaleInformation_sk.properties b/resource/gnu/java/locale/LocaleInformation_sk.properties
index 21886f382..d73c3edd9 100644
--- a/resource/gnu/java/locale/LocaleInformation_sk.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sk.properties
@@ -8,740 +8,340 @@
decimalSeparator=,
groupingSeparator=\u00a0
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=Jord\u00e1nsky din\u00e1r
-currenciesDisplayName.BOV=Boliv\u00edjske mvdol
-currenciesDisplayName.XAU=Zlato
-currenciesDisplayName.FOK=Faeroe Islands Kronur
-currenciesDisplayName.LBP=Libanonsk\u00e1 libra
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Vietnamsk\u00fd dong
-currenciesDisplayName.TZS=Tanzansk\u00fd \u0161iling
-currenciesDisplayName.BOP=Boliv\u00edjske peso
-currenciesDisplayName.KHR=Kambod\u017esk\u00fd riel
-currenciesDisplayName.KHO=Kambod\u017esk\u00fd star\u00fd riel
-currenciesDisplayName.ZMP=Zambsk\u00e1 libra
-currenciesDisplayName.AUP=Austr\u00e1lska libra
-currenciesDisplayName.XAF=CFA frank BEAC
-currenciesDisplayName.MTP=Maltsk\u00e1 libra
-currenciesDisplayName.GHR=Ghansk\u00fd prehodnoten\u00fd cedi
-currenciesDisplayName.ZMK=Zambsk\u00e1 kwacha
-currenciesDisplayName.GHP=Ghansk\u00e1 libra
-currenciesDisplayName.GHO=Ghansk\u00fd star\u00fd cedi
-currenciesDisplayName.MTL=Maltsk\u00e1 lira
-currenciesDisplayName.AUD=Austr\u00e1lsky dol\u00e1r
-currenciesDisplayName.USS=US dol\u00e1r (Same day)
-currenciesDisplayName.ITL=Taliansk\u00e1 lira
-currenciesDisplayName.USN=US dol\u00e1r (Next day)
-currenciesDisplayName.GHC=Ghansk\u00fd cedi
-currenciesDisplayName.SGD=Singap\u00farsky dol\u00e1r
-currenciesDisplayName.PAB=Panamsk\u00e1 balboa
-currenciesDisplayName.LAK=Laosk\u00fd kip
-currenciesDisplayName.KGS=Kyrgysk\u00fd som
-currenciesDisplayName.CHF=\u0160vaj\u010diarsk\u00fd frank
-currenciesDisplayName.ATS=Rak\u00fasky \u0161iling
-currenciesDisplayName.USD=US dol\u00e1r
-currenciesDisplayName.ETD=Ethiopsk\u00fd dol\u00e1r
-currenciesDisplayName.BND=Bruneisk\u00fd dol\u00e1r
-currenciesDisplayName.JMP=Jamajsk\u00e1 libra
-currenciesDisplayName.ETB=Ethiopsk\u00fd birr
-currenciesDisplayName.DZG=Al\u017e\u00edrsky frank Germinal
-currenciesDisplayName.DZF=Al\u017e\u00edrsky nov\u00fd frank
-currenciesDisplayName.DZD=Al\u017e\u00edrsky din\u00e1r
-currenciesDisplayName.PYG=Paraguaysk\u00e9 guarani
-currenciesDisplayName.LYP=Libyjsk\u00e1 libra
-currenciesDisplayName.JMD=Jamajsk\u00fd dol\u00e1r
-currenciesDisplayName.ISK=Islandsk\u00e1 krona
-currenciesDisplayName.ESP=\u0160panielsk\u00e1 peseta
-currenciesDisplayName.BMP=Bermudsk\u00e1 libra
-currenciesDisplayName.LYD=Libyjsk\u00fd din\u00e1r
-currenciesDisplayName.LYB=Libyjsk\u00e1 BMA lira
-currenciesDisplayName.BMD=Bermudsk\u00fd dol\u00e1r
-currenciesDisplayName.NLG=Nizozemsk\u00fd guilder
-currenciesDisplayName.MRO=Mauritania Ouguiya
-currenciesDisplayName.IRR=Ir\u00e1nsky rial
-currenciesDisplayName.SEK=\u0160v\u00e9dska krona
-currenciesDisplayName.ERN=Eritrejsk\u00e1 nakfa
+currenciesDisplayName.YDD=Jemensk\u00fd din\u00e1r
+currenciesDisplayName.TWD=Taiwansk\u00fd nov\u00fd dol\u00e1r
currenciesDisplayName.KES=Ke\u0148sk\u00fd \u0161iling
-currenciesDisplayName.CFF=CAR CFA frank
+currenciesDisplayName.BYB=Belarussian nov\u00fd rube\u013e (1994-1999)
+currenciesDisplayName.LKR=\u0160rilansk\u00e1 rupia
+currenciesDisplayName.RWF=Rwandsk\u00fd frank
+currenciesDisplayName.TJS=Tad\u017eikistansk\u00fd somoni
+currenciesDisplayName.SDP=Sud\u00e1nska libra
+currenciesDisplayName.TJR=Tad\u017eikistansk\u00fd rube\u013e
+currenciesDisplayName.ERN=Eritrejsk\u00e1 nakfa
+currenciesDisplayName.GRD=Gr\u00e9cka drachma
+currenciesDisplayName.IEP=\u00cdrska libra
currenciesDisplayName.ARS=Argentinsk\u00e9 peso
+currenciesDisplayName.SDD=Sud\u00e1nsky din\u00e1r
currenciesDisplayName.ARP=Argentinsk\u00e9 peso (1983-1985)
-currenciesDisplayName.ARM=Argentinsk\u00e9 peso Moneda Nacional
-currenciesDisplayName.TWD=Taiwansk\u00fd nov\u00fd dol\u00e1r
-currenciesDisplayName.SDP=Sud\u00e1nska libra
currenciesDisplayName.GEL=Gruz\u00ednsky lari
currenciesDisplayName.GEK=Gruz\u00ednsky Kupon Larit
-currenciesDisplayName.MQF=Martinique frank
+currenciesDisplayName.CRC=Kostariksk\u00fd colon
currenciesDisplayName.FKP=Falklandsk\u00e1 libra
+currenciesDisplayName.EEK=Est\u00f3nska kroon
+currenciesDisplayName.HKD=Hong Kongsk\u00fd dol\u00e1r
+currenciesDisplayName.MDL=Moldavsk\u00fd leu
currenciesDisplayName.ARA=Argentinsk\u00fd austral
-currenciesDisplayName.SDD=Sud\u00e1nsky din\u00e1r
currenciesDisplayName.IQD=Irack\u00fd din\u00e1r
-currenciesDisplayName.TVD=Tuvalu dol\u00e1r
currenciesDisplayName.SCR=Sej\u0161elsk\u00e1 rupia
+currenciesDisplayName.VUV=Vanuatu vatu
+currenciesDisplayName.DKK=D\u00e1nska krone
+currenciesDisplayName.KPW=Severok\u00f3rejsk\u00fd won
+currenciesDisplayName.GQE=Rovn\u00edkov\u00e1 Guinea Ekwele Guineana
+currenciesDisplayName.IDR=Indon\u00e9zska rupia
currenciesDisplayName.LVR=Loty\u0161sk\u00fd rube\u013e
-currenciesDisplayName.FJP=Fiji libra
+currenciesDisplayName.SOS=Som\u00e1lsky \u0161iling
+currenciesDisplayName.AED=UAE dirham
+currenciesDisplayName.BWP=Botswanan Pula
currenciesDisplayName.LVL=Loty\u0161sk\u00fd lats
-currenciesDisplayName.CDL=Kon\u017esk\u00fd zaire
-currenciesDisplayName.CDG=Kon\u017esk\u00fd frank
-currenciesDisplayName.CDF=Kon\u017esk\u00fd frank Congolais
-currenciesDisplayName.FJD=Fiji dol\u00e1r
+currenciesDisplayName.RUR=Rusk\u00fd rube\u013e (1991-1998)
currenciesDisplayName.NIO=Nikaragujsk\u00e1 Cordoba Oro
+currenciesDisplayName.ADP=Andorsk\u00e1 peseta
+currenciesDisplayName.FJD=Fiji dol\u00e1r
currenciesDisplayName.MOP=Macao Pataca
-currenciesDisplayName.NIG=Nikaragujsk\u00e1 zlat\u00e1 Cordoba
+currenciesDisplayName.RUB=Rusk\u00fd rube\u013e
+currenciesDisplayName.CDF=Kon\u017esk\u00fd frank Congolais
currenciesDisplayName.NIC=Nikaragujsk\u00e1 cordoba
-currenciesDisplayName.XTR=COMECON rube\u013e
-currenciesDisplayName.FIN=Finsk\u00e1 marka (1860-1962)
-currenciesDisplayName.FIM=Finsk\u00e1 marka
+currenciesDisplayName.DJF=D\u017eibutsk\u00fd frank
+currenciesDisplayName.ECV=Ekuadorsk\u00fd Unidad de Valor Constante (UVC)
currenciesDisplayName.SBD=Solomon Islands dol\u00e1r
+currenciesDisplayName.UZS=Uzbekistansk\u00fd sum
+currenciesDisplayName.ECS=Ekuadorsk\u00fd sucre
+currenciesDisplayName.PHP=Filip\u00ednske peso
+currenciesDisplayName.THB=Thajsk\u00fd b\u00e1t
currenciesDisplayName.LUF=Luxembursk\u00fd frank
-currenciesDisplayName.TTO=Trinidad a Tobago star\u00fd dol\u00e1r
-currenciesDisplayName.AOS=Angolsk\u00e9 eskudo
-currenciesDisplayName.AOR=Angolsk\u00e1 kwanza Reajustado (1995-1999)
-currenciesDisplayName.MNT=Mongolsk\u00fd tugrik
-currenciesDisplayName.HUF=Ma\u010farsk\u00fd forint
-currenciesDisplayName.BIF=Burundsk\u00fd frank
-currenciesDisplayName.AON=Angolsk\u00e1 nov\u00e1 kwanza (1990-2000)
-currenciesDisplayName.AOK=Angolsk\u00e1 kwanza (1977-1990)
+currenciesDisplayName.FIM=Finsk\u00e1 marka
currenciesDisplayName.TTD=Trinidad a Tobago dol\u00e1r
currenciesDisplayName.SZL=Swaziland lilangeni
-currenciesDisplayName.NHF=New Hebrides CFP frank
-currenciesDisplayName.GBP=Britsk\u00e1 libra
-currenciesDisplayName.SAS=Saudsk\u00fd Riyal
+currenciesDisplayName.MNT=Mongolsk\u00fd tugrik
currenciesDisplayName.SAR=Saudsk\u00fd riyal
+currenciesDisplayName.UAK=Ukrainsk\u00fd karbovanetz
+currenciesDisplayName.UAH=Ukrainsk\u00e1 hrivna
+currenciesDisplayName.HUF=Ma\u010farsk\u00fd forint
+currenciesDisplayName.COP=Colombijsk\u00e9 peso
+currenciesDisplayName.QAR=Qatarsk\u00fd rial
currenciesDisplayName.LTT=Litevsk\u00fd talonas
-currenciesDisplayName.INR=Indijsk\u00e1 rupia
currenciesDisplayName.PTE=Portugalsk\u00e9 eskudo
-currenciesDisplayName.AOA=Angolsk\u00e1 kwanza
-currenciesDisplayName.PTC=Portugalsk\u00e9 conto
+currenciesDisplayName.AOR=Angolsk\u00e1 kwanza Reajustado (1995-1999)
+currenciesDisplayName.UYU=Uruguajsk\u00e9 peso Uruguayo
+currenciesDisplayName.GBP=Britsk\u00e1 libra
+currenciesDisplayName.BIF=Burundsk\u00fd frank
+currenciesDisplayName.INR=Indijsk\u00e1 rupia
+currenciesDisplayName.ZRZ=Zairsk\u00fd Zaire
+currenciesDisplayName.AON=Angolsk\u00e1 nov\u00e1 kwanza (1990-2000)
currenciesDisplayName.LTL=Litevsk\u00e1 lita
+currenciesDisplayName.XFU=Franc\u00fazsky UIC-frank
currenciesDisplayName.KZT=Kaza\u017esk\u00fd tenge
-currenciesDisplayName.KZR=Kaza\u017esk\u00fd rube\u013e
-currenciesDisplayName.VGD=British Virgin Islands dol\u00e1r
-currenciesDisplayName.NGP=Nigersk\u00e1 libra
-currenciesDisplayName.MMX=Myanmarsk\u00e9 dol\u00e1rov\u00e9 certifik\u00e1ty
+currenciesDisplayName.MZM=Mozambijsk\u00e9 metical
+currenciesDisplayName.UYP=Uruguajsk\u00e9 peso (1975-1993)
+currenciesDisplayName.AOK=Angolsk\u00e1 kwanza (1977-1990)
+currenciesDisplayName.BUK=Burmese Kyat
+currenciesDisplayName.GNS=Guinejsk\u00fd syli
+currenciesDisplayName.XFO=Franc\u00fazsky zlat\u00fd frank
+currenciesDisplayName.PGK=Papua Nov\u00e1 Guinea kina
+currenciesDisplayName.SYP=Syrsk\u00e1 libra
+currenciesDisplayName.MZE=Mozambijsk\u00e9 eskudo
+currenciesDisplayName.OMR=Om\u00e1nsk\u00fd rial
currenciesDisplayName.NGN=Nigersk\u00e1 naira
+currenciesDisplayName.ZRN=Zairsk\u00fd nov\u00fd zaire
+currenciesDisplayName.AOA=Angolsk\u00e1 kwanza
+currenciesDisplayName.CNY=\u010c\u00ednsky Yuan Renminbi
+currenciesDisplayName.MAF=Marock\u00fd frank
+currenciesDisplayName.GNF=Guinejsk\u00fd frank
currenciesDisplayName.HTG=Haitsk\u00e9 gourde
-currenciesDisplayName.SYP=Syrsk\u00e1 libra
-currenciesDisplayName.PSP=Palest\u00ednska libra
-currenciesDisplayName.BHD=Bahraisk\u00fd din\u00e1r
+currenciesDisplayName.MAD=Marock\u00fd dirham
currenciesDisplayName.MMK=Myanmarsk\u00fd kyat
+currenciesDisplayName.MYR=Malajsk\u00fd ringgit
+currenciesDisplayName.LSL=Lesothsk\u00fd loti
+currenciesDisplayName.BHD=Bahraisk\u00fd din\u00e1r
+currenciesDisplayName.SLL=Sierra Leone Leone
+currenciesDisplayName.BTN=Bhutansky ngultrum
+currenciesDisplayName.TRL=Tureck\u00e1 lira
+currenciesDisplayName.KMF=Comoro frank
currenciesDisplayName.ANG=Nizozemsk\u00fd Antilsk\u00fd guilder
currenciesDisplayName.CZK=\u010cesk\u00e1 koruna
-currenciesDisplayName.IMP=Libra Isle of Man
-currenciesDisplayName.BGX=Bulharsk\u00e9 certifik\u00e1ty v leva
-currenciesDisplayName.LSL=Lesothsk\u00fd loti
-currenciesDisplayName.GAF=Gab\u00fansky CFA frank
-currenciesDisplayName.BGO=Bulharsk\u00fd leva (1879-1952)
+currenciesDisplayName.AZM=Azerbaid\u017eansk\u00fd manat
+currenciesDisplayName.KYD=Kajmansk\u00fd dol\u00e1r
+currenciesDisplayName.GMD=Gambsk\u00fd dalasi
currenciesDisplayName.BGN=Bulharsk\u00fd leva nov\u00fd
-currenciesDisplayName.BGM=Bulharsk\u00fd socialistick\u00fd leva
currenciesDisplayName.CAD=Kanadsk\u00fd dol\u00e1r
+currenciesDisplayName.MXV=Mexick\u00e9 Unidad de Inversion (UDI)
currenciesDisplayName.BGL=Bulharsk\u00fd leva
-currenciesDisplayName.TRL=Tureck\u00e1 lira
-currenciesDisplayName.KYD=Kajmansk\u00fd dol\u00e1r
-currenciesDisplayName.CYP=Cyprusk\u00e1 libra
+currenciesDisplayName.VEB=Venezuelsk\u00fd bolivar
+currenciesDisplayName.MLF=Malsk\u00fd frank
currenciesDisplayName.ILS=Izraelsk\u00fd \u0161ekel
+currenciesDisplayName.MXP=Mexick\u00e9 striborn\u00e9 peso (1861-1992)
+currenciesDisplayName.PES=Peruvsk\u00fd sol
currenciesDisplayName.GYD=Guyansk\u00fd dol\u00e1r
-currenciesDisplayName.AMD=Armensk\u00fd dram
+currenciesDisplayName.MXN=Mexick\u00e9 peso
currenciesDisplayName.ILP=Izraelsk\u00e1 libra
-currenciesDisplayName.MLF=Malsk\u00fd frank
-currenciesDisplayName.ILL=Izraelsk\u00fd \u0161ekel
-currenciesDisplayName.VEB=Venezuelsk\u00fd bolivar
-currenciesDisplayName.ALX=Alb\u00e1nske dol\u00e1rov\u00e9 certifik\u00e1ty
+currenciesDisplayName.SKK=Slovensk\u00e1 koruna
+currenciesDisplayName.CYP=Cyprusk\u00e1 libra
+currenciesDisplayName.XDR=\u0160peci\u00e1lne pr\u00e1va \u010derpania
+currenciesDisplayName.PEN=Peruvsk\u00fd sol Nuevo
currenciesDisplayName.LRD=Lib\u00e9rsk\u00fd dol\u00e1r
-currenciesDisplayName.ALV=Alb\u00e1nsky valutov\u00fd lek
+currenciesDisplayName.PEI=Peruvsk\u00fd inti
+currenciesDisplayName.AMD=Armensk\u00fd dram
+currenciesDisplayName.BSD=Bahamsk\u00fd dol\u00e1r
currenciesDisplayName.HRK=Chorv\u00e1tska kuna
-currenciesDisplayName.REF=Reunion frank
+currenciesDisplayName.CLP=\u010c\u00edlske peso
currenciesDisplayName.HRD=Chorv\u00e1tsky din\u00e1r
-currenciesDisplayName.ALL=Alb\u00e1nsky lek
-currenciesDisplayName.JEP=Jersey libra
-currenciesDisplayName.ALK=Alb\u00e1nsky lek (1946-1961)
-currenciesDisplayName.MKN=Maced\u00f3nsky den\u00e1r (1992-1993)
-currenciesDisplayName.VDP=Severovietnamsk\u00fd Viet Minh Piastre Dong Viet
-currenciesDisplayName.VDN=Severovietnamsk\u00fd nov\u00fd Dong
-currenciesDisplayName.MKD=Maced\u00f3nsky den\u00e1r
-currenciesDisplayName.VDD=Severovietnamsk\u00fd Piastre Dong Viet
-currenciesDisplayName.TPP=Timorsk\u00e1 pataca
currenciesDisplayName.XPF=CFP frank
-currenciesDisplayName.BEL=Belgick\u00fd frank (finan\u010dn\u00fd)
-currenciesDisplayName.GWP=Guinea-Bissau peso
-currenciesDisplayName.KWD=Kuvaitsk\u00fd din\u00e1r
-currenciesDisplayName.GWM=Portugalsk\u00e9 Guinea Mil Reis
-currenciesDisplayName.BEF=Belgick\u00fd frank
+currenciesDisplayName.FRF=Franc\u00fazsky frank
+currenciesDisplayName.BRR=Braz\u00edlske cruzeiro
+currenciesDisplayName.MKD=Maced\u00f3nsky den\u00e1r
+currenciesDisplayName.CLF=\u010c\u00edlske Unidades de Fomento
+currenciesDisplayName.ALL=Alb\u00e1nsky lek
+currenciesDisplayName.BRN=Braz\u00edlske Cruzado Novo
+currenciesDisplayName.MWK=Malavsk\u00e1 kwacha
+currenciesDisplayName.BRL=Boliv\u00edjsky real
currenciesDisplayName.TPE=Timorsk\u00e9 eskudo
-currenciesDisplayName.BEC=Belgick\u00fd frank (konvertibiln\u00fd)
-currenciesDisplayName.GWE=Portugalsk\u00e1 Guinea eskudo
+currenciesDisplayName.BRE=Boliv\u00edjske cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Boliv\u00edjske cruzado
+currenciesDisplayName.BRB=Boliv\u00edjske Cruzeiro Novo (1967-1986)
+currenciesDisplayName.DEM=Nemeck\u00e1 marka
+currenciesDisplayName.KWD=Kuvaitsk\u00fd din\u00e1r
+currenciesDisplayName.XCD=East Caribbean dol\u00e1r
+currenciesDisplayName.NPR=Nep\u00e1lska rupia
+currenciesDisplayName.GWP=Guinea-Bissau peso
+currenciesDisplayName.YUN=Juhosl\u00e1vsky din\u00e1r
currenciesDisplayName.SVC=El Salvadorsk\u00fd colon
-currenciesDisplayName.CWG=Curacao guilder
-currenciesDisplayName.BDT=Banglad\u00e9\u0161ska taka
-currenciesDisplayName.TOS=Tonga libra
-currenciesDisplayName.TOP=Tonga Pa\u02bbanga
+currenciesDisplayName.YUM=Juhosl\u00e1vsky Noviy din\u00e1r
+currenciesDisplayName.BEL=Belgick\u00fd frank (finan\u010dn\u00fd)
+currenciesDisplayName.SIT=Slovinsk\u00fd Tolar
+currenciesDisplayName.JPY=Japonsk\u00fd yen
currenciesDisplayName.XOF=CFA frank BCEAO
+currenciesDisplayName.MVR=Maldivsk\u00e1 rufiyaa
+currenciesDisplayName.GWE=Portugalsk\u00e1 Guinea eskudo
+currenciesDisplayName.BEF=Belgick\u00fd frank
+currenciesDisplayName.TOP=Tonga Pa\u02bbanga
+currenciesDisplayName.YUD=Juhosl\u00e1vsky din\u00e1r
+currenciesDisplayName.BEC=Belgick\u00fd frank (konvertibiln\u00fd)
currenciesDisplayName.SUR=Sovietsk\u00fd rube\u013e
-currenciesDisplayName.SUN=Sovietsk\u00fd nov\u00fd rube\u013e
-currenciesDisplayName.NCF=New Caledonia frank Germinal
-currenciesDisplayName.CVE=Cape Verde eskudo
-currenciesDisplayName.XNF=Franc\u00fazske Antilly CFA frank
+currenciesDisplayName.ROL=Rumunsk\u00fd leu
+currenciesDisplayName.DDM=V\u00fdchodonemeck\u00e1 marka
+currenciesDisplayName.BDT=Banglad\u00e9\u0161ska taka
+currenciesDisplayName.AWG=Arubsk\u00fd guilder
+currenciesDisplayName.NOK=N\u00f3rksy krone
+currenciesDisplayName.MUR=Mauritsk\u00e1 rupia
currenciesDisplayName.ZAR=Juhoafrick\u00fd rand
-currenciesDisplayName.DOP=Dominik\u00e1nske peso
-currenciesDisplayName.CUX=Kub\u00e1nske certifik\u00e1ty
-currenciesDisplayName.ZAP=Juhoafrick\u00e1 libra
+currenciesDisplayName.SHP=Libra
+currenciesDisplayName.XAU=Zlato
currenciesDisplayName.ZAL=Juhoafrick\u00fd rand (financial)
+currenciesDisplayName.VND=Vietnamsk\u00fd dong
+currenciesDisplayName.TZS=Tanzansk\u00fd \u0161iling
+currenciesDisplayName.GIP=Gibraltarsk\u00e1 libra
currenciesDisplayName.TND=Tunisk\u00fd din\u00e1r
-currenciesDisplayName.CUP=Kub\u00e1nske peso
-currenciesDisplayName.GUF=Franc\u00fazska Guyana frank Guiana
+currenciesDisplayName.CVE=Cape Verde eskudo
currenciesDisplayName.UGX=Ugandsk\u00fd \u0161iling
-currenciesDisplayName.LNR=Ceylonsk\u00e1 rupia
-currenciesDisplayName.AIF=Affars a Issas frank
-currenciesDisplayName.VAL=Vatik\u00e1nska lira
-currenciesDisplayName.STE=Sao Tome a Principe eskudo
+currenciesDisplayName.ZMK=Zambsk\u00e1 kwacha
+currenciesDisplayName.JOD=Jord\u00e1nsky din\u00e1r
+currenciesDisplayName.XAF=CFA frank BEAC
+currenciesDisplayName.LBP=Libanonsk\u00e1 libra
currenciesDisplayName.UGS=Ugandan \u0161iling (1966-1987)
currenciesDisplayName.STD=Sao Tome a Principe dobra
-currenciesDisplayName.MHD=Marshall Islands dol\u00e1r
-currenciesDisplayName.NZP=Nikaragujsk\u00e1 libra
currenciesDisplayName.WST=Z\u00e1padn\u00e1 Samoa tala
-currenciesDisplayName.WSP=Z\u00e1padn\u00e1 Samoa libra
-currenciesDisplayName.HNL=Hodurask\u00e1 lempira
-currenciesDisplayName.XMF=Franc\u00fazsky Metropolitan Nouveau frank
+currenciesDisplayName.KHR=Kambod\u017esk\u00fd riel
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Dominik\u00e1nske peso
+currenciesDisplayName.BOV=Boliv\u00edjske mvdol
+currenciesDisplayName.MTP=Maltsk\u00e1 libra
+currenciesDisplayName.USS=US dol\u00e1r (Same day)
+currenciesDisplayName.BOP=Boliv\u00edjske peso
+currenciesDisplayName.MTL=Maltsk\u00e1 lira
+currenciesDisplayName.CUP=Kub\u00e1nske peso
currenciesDisplayName.TMM=Turkm\u00e9nsky manat
-currenciesDisplayName.GTQ=Guatemalsk\u00fd quetzal
+currenciesDisplayName.USN=US dol\u00e1r (Next day)
+currenciesDisplayName.SGD=Singap\u00farsky dol\u00e1r
currenciesDisplayName.NZD=Novoz\u00e9landsk\u00fd dol\u00e1r
-currenciesDisplayName.SSP=\u0160k\u00f3tska libra
-currenciesDisplayName.BBD=Barbadosk\u00fd dol\u00e1r
+currenciesDisplayName.USD=US dol\u00e1r
+currenciesDisplayName.HNL=Hodurask\u00e1 lempira
+currenciesDisplayName.ITL=Taliansk\u00e1 lira
+currenciesDisplayName.PAB=Panamsk\u00e1 balboa
+currenciesDisplayName.GTQ=Guatemalsk\u00fd quetzal
+currenciesDisplayName.LAK=Laosk\u00fd kip
+currenciesDisplayName.GHC=Ghansk\u00fd cedi
+currenciesDisplayName.AUD=Austr\u00e1lsky dol\u00e1r
currenciesDisplayName.NAD=Namibsk\u00fd dol\u00e1r
+currenciesDisplayName.KGS=Kyrgysk\u00fd som
currenciesDisplayName.MGF=Madagaskarsk\u00fd frank
+currenciesDisplayName.CHF=\u0160vaj\u010diarsk\u00fd frank
+currenciesDisplayName.BBD=Barbadosk\u00fd dol\u00e1r
currenciesDisplayName.MGA=Madagaskarsk\u00fd ariary
-currenciesDisplayName.EGP=Egyptsk\u00e1 libra
-currenciesDisplayName.BZH=Britisk\u00fd Hondurask\u00fd dol\u00e1r
+currenciesDisplayName.PYG=Paraguaysk\u00e9 guarani
currenciesDisplayName.PLZ=Polsk\u00fd zloty (1950-1995)
-currenciesDisplayName.BAN=Bosniansk\u00fd nov\u00fd din\u00e1r
-currenciesDisplayName.PLX=Polsk\u00e9 certifik\u00e1ty v US dol\u00e1roch
-currenciesDisplayName.BAM=Bosniansk\u00fd konvertibiln\u00e1 marka
-currenciesDisplayName.BZD=Belize dol\u00e1r
-currenciesDisplayName.BAD=Bosniansk\u00fd din\u00e1r
-currenciesDisplayName.PLN=Polsk\u00fd zloty
currenciesDisplayName.YER=Jemensk\u00fd rial
+currenciesDisplayName.ATS=Rak\u00fasky \u0161iling
+currenciesDisplayName.ETB=Ethiopsk\u00fd birr
+currenciesDisplayName.BND=Bruneisk\u00fd dol\u00e1r
+currenciesDisplayName.JMD=Jamajsk\u00fd dol\u00e1r
+currenciesDisplayName.EGP=Egyptsk\u00e1 libra
+currenciesDisplayName.PLN=Polsk\u00fd zloty
+currenciesDisplayName.DZD=Al\u017e\u00edrsky din\u00e1r
+currenciesDisplayName.ISK=Islandsk\u00e1 krona
currenciesDisplayName.SRG=Surinamsk\u00fd guilder
-currenciesDisplayName.CSK=\u010ceskoslovensk\u00e1 koruna
+currenciesDisplayName.LYD=Libyjsk\u00fd din\u00e1r
+currenciesDisplayName.BZD=Belize dol\u00e1r
+currenciesDisplayName.BAM=Bosniansk\u00fd konvertibiln\u00e1 marka
+currenciesDisplayName.ESP=\u0160panielsk\u00e1 peseta
currenciesDisplayName.KRW=Juhok\u00f3rejsk\u00fd won
+currenciesDisplayName.NLG=Nizozemsk\u00fd guilder
+currenciesDisplayName.MRO=Mauritania Ouguiya
+currenciesDisplayName.BAD=Bosniansk\u00fd din\u00e1r
+currenciesDisplayName.ZWD=Zimbabsk\u00fd dol\u00e1r
+currenciesDisplayName.SEK=\u0160v\u00e9dska krona
+currenciesDisplayName.CSK=\u010ceskoslovensk\u00e1 koruna
currenciesDisplayName.BYR=Belarussian rube\u013e
-currenciesDisplayName.YEI=Jemensk\u00fd Imadi Riyal
-currenciesDisplayName.BYL=Belarussian rube\u013e (1992-1994)
-currenciesDisplayName.CSC=\u010ceskoslovensk\u00e1 koruna
-currenciesDisplayName.KRO=Juhok\u00f3rejsk\u00fd star\u00fd won
-currenciesDisplayName.KRH=Juhok\u00f3rejsk\u00fd hwan
-currenciesDisplayName.BYB=Belarussian nov\u00fd rube\u013e (1994-1999)
-currenciesDisplayName.SQS=Som\u00e1lsky \u0161iling
-currenciesDisplayName.GRN=Gr\u00e9cka nov\u00e1 drachma
+currenciesDisplayName.IRR=Ir\u00e1nsky rial
currenciesDisplayName.PKR=Pakistansk\u00e1 rupia
-currenciesDisplayName.ZWD=Zimbabsk\u00fd dol\u00e1r
-currenciesDisplayName.LKR=\u0160rilansk\u00e1 rupia
-currenciesDisplayName.GRD=Gr\u00e9cka drachma
-currenciesDisplayName.IEP=\u00cdrska libra
-currenciesDisplayName.YDD=Jemensk\u00fd din\u00e1r
-currenciesDisplayName.RWF=Rwandsk\u00fd frank
-currenciesDisplayName.CRC=Kostariksk\u00fd colon
-currenciesDisplayName.TJS=Tad\u017eikistansk\u00fd somoni
-currenciesDisplayName.TJR=Tad\u017eikistansk\u00fd rube\u013e
-currenciesDisplayName.EEK=Est\u00f3nska kroon
-currenciesDisplayName.GQP=Rovn\u00edkov\u00e1 Guinea Peseta Guineana
-currenciesDisplayName.MDR=Moldavsk\u00fd rube\u013e
-currenciesDisplayName.HKD=Hong Kongsk\u00fd dol\u00e1r
-currenciesDisplayName.DKK=D\u00e1nska krone
-currenciesDisplayName.MDL=Moldavsk\u00fd leu
-currenciesDisplayName.GQF=Rovn\u00edkov\u00e1 Guinea franko
-currenciesDisplayName.GQE=Rovn\u00edkov\u00e1 Guinea Ekwele Guineana
-currenciesDisplayName.IDR=Indon\u00e9zska rupia
-currenciesDisplayName.AED=UAE dirham
-currenciesDisplayName.KPW=Severok\u00f3rejsk\u00fd won
-currenciesDisplayName.IDN=Indon\u00e9zska nov\u00e1 rupia
-currenciesDisplayName.BWP=Botswanan Pula
-currenciesDisplayName.MDC=Moldavsk\u00fd Leu Cupon
-currenciesDisplayName.IDJ=Indon\u00e9zska Java rupia
-currenciesDisplayName.KPP=Severok\u00f3rejsk\u00fd won
-currenciesDisplayName.IDG=Indon\u00e9zsky nica guilder
-currenciesDisplayName.VUV=Vanuatu vatu
-currenciesDisplayName.XID=Islamsk\u00fd din\u00e1r
-currenciesDisplayName.SOS=Som\u00e1lsky \u0161iling
-currenciesDisplayName.ADP=Andorsk\u00e1 peseta
-currenciesDisplayName.RUR=Rusk\u00fd rube\u013e (1991-1998)
-currenciesDisplayName.GPF=Guadeloupsk\u00fd frank
-currenciesDisplayName.DJF=D\u017eibutsk\u00fd frank
-currenciesDisplayName.ADD=Andorsk\u00fd diner
-currenciesDisplayName.MCG=Monack\u00fd frank Germinal
-currenciesDisplayName.MCF=Monack\u00fd frank Nouveau
-currenciesDisplayName.ECV=Ekuadorsk\u00fd Unidad de Valor Constante (UVC)
-currenciesDisplayName.ECS=Ekuadorsk\u00fd sucre
-currenciesDisplayName.LIF=Lichten\u0161teinsk\u00fd frank
-currenciesDisplayName.RUB=Rusk\u00fd rube\u013e
-currenciesDisplayName.PHP=Filip\u00ednske peso
-currenciesDisplayName.UZS=Uzbekistansk\u00fd sum
-currenciesDisplayName.COP=Colombijsk\u00e9 peso
-currenciesDisplayName.THB=Thajsk\u00fd b\u00e1t
-currenciesDisplayName.IBP=Severo\u00edrska libra
-currenciesDisplayName.BUR=Burmese rupia
-currenciesDisplayName.COF=Kon\u017esk\u00fd CFA frank
-currenciesDisplayName.BUK=Burmese Kyat
-currenciesDisplayName.COB=Colombijsk\u00e9 papierov\u00e9 peso
-currenciesDisplayName.UZC=Uzbekistansk\u00fd Coupon Som
-currenciesDisplayName.UAK=Ukrainsk\u00fd karbovanetz
-currenciesDisplayName.QAR=Qatarsk\u00fd rial
-currenciesDisplayName.UAH=Ukrainsk\u00e1 hrivna
-currenciesDisplayName.GNS=Guinejsk\u00fd syli
-currenciesDisplayName.CNY=\u010c\u00ednsky Yuan Renminbi
-currenciesDisplayName.MZM=Mozambijsk\u00e9 metical
-currenciesDisplayName.CNX=\u010c\u00ednsky certifik\u00e1ty v US dol\u00e1roch
-currenciesDisplayName.UYU=Uruguajsk\u00e9 peso Uruguayo
-currenciesDisplayName.GNI=Guinejsk\u00fd frank (1960-1972)
-currenciesDisplayName.SML=San Marino lira
-currenciesDisplayName.MZE=Mozambijsk\u00e9 eskudo
-currenciesDisplayName.CNP=\u010c\u00ednsky Jen Min Piao Yuan
-currenciesDisplayName.GNF=Guinejsk\u00fd frank
-currenciesDisplayName.OMS=Om\u00e1nsk\u00fd rial Saidi
-currenciesDisplayName.PGK=Papua Nov\u00e1 Guinea kina
-currenciesDisplayName.OMR=Om\u00e1nsk\u00fd rial
-currenciesDisplayName.UYP=Uruguajsk\u00e9 peso (1975-1993)
-currenciesDisplayName.XFU=Franc\u00fazsky UIC-frank
-currenciesDisplayName.BTR=Bhutan rupia
-currenciesDisplayName.ZRZ=Zairsk\u00fd Zaire
-currenciesDisplayName.MAF=Marock\u00fd frank
-currenciesDisplayName.MAD=Marock\u00fd dirham
-currenciesDisplayName.BTN=Bhutansky ngultrum
-currenciesDisplayName.XFO=Franc\u00fazsky zlat\u00fd frank
-currenciesDisplayName.UYF=Uruguajsk\u00e9 peso Fuerte
-currenciesDisplayName.MYR=Malajsk\u00fd ringgit
-currenciesDisplayName.ZRN=Zairsk\u00fd nov\u00fd zaire
-currenciesDisplayName.AZM=Azerbaid\u017eansk\u00fd manat
-currenciesDisplayName.GMP=Gambsk\u00e1 libra
-currenciesDisplayName.KMF=Comoro frank
-currenciesDisplayName.SLL=Sierra Leone Leone
-currenciesDisplayName.GMD=Gambsk\u00fd dalasi
-currenciesDisplayName.BSP=Bahamsk\u00e1 libra
-currenciesDisplayName.CMF=Camerunsk\u00fd CFA frank
-currenciesDisplayName.MXV=Mexick\u00e9 Unidad de Inversion (UDI)
-currenciesDisplayName.XEF=CFA frank BCEAEC
-currenciesDisplayName.BSD=Bahamsk\u00fd dol\u00e1r
-currenciesDisplayName.MXP=Mexick\u00e9 striborn\u00e9 peso (1861-1992)
-currenciesDisplayName.MXN=Mexick\u00e9 peso
-currenciesDisplayName.PES=Peruvsk\u00fd sol
-currenciesDisplayName.GLK=Gr\u00f3nsky krone
-currenciesDisplayName.BRZ=Braz\u00edlske cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Peruvsk\u00fd sol Nuevo
-currenciesDisplayName.CLP=\u010c\u00edlske peso
-currenciesDisplayName.SKK=Slovensk\u00e1 koruna
-currenciesDisplayName.PEI=Peruvsk\u00fd inti
-currenciesDisplayName.BRR=Braz\u00edlske cruzeiro
-currenciesDisplayName.XDR=\u0160peci\u00e1lne pr\u00e1va \u010derpania
-currenciesDisplayName.FRG=Franc\u00fazsky frank Germinal/frank Poincare
-currenciesDisplayName.FRF=Franc\u00fazsky frank
-currenciesDisplayName.BRN=Braz\u00edlske Cruzado Novo
-currenciesDisplayName.CLF=\u010c\u00edlske Unidades de Fomento
-currenciesDisplayName.CLE=\u010c\u00edlske eskudo
-currenciesDisplayName.BRL=Boliv\u00edjsky real
-currenciesDisplayName.CLC=\u010c\u00edlsky condor
-currenciesDisplayName.BRE=Boliv\u00edjske cruzeiro (1990-1993)
-currenciesDisplayName.DES=Nemeck\u00e1 sperrmarka
-currenciesDisplayName.MWP=Malavsk\u00e1 libra
-currenciesDisplayName.BRC=Boliv\u00edjske cruzado
-currenciesDisplayName.BRB=Boliv\u00edjske Cruzeiro Novo (1967-1986)
-currenciesDisplayName.MWK=Malavsk\u00e1 kwacha
-currenciesDisplayName.PDR=Transdniestria rube\u013e
-currenciesDisplayName.DEM=Nemeck\u00e1 marka
-currenciesDisplayName.TDF=Chadsk\u00fd CFA frank
-currenciesDisplayName.PDN=Transdniestria nov\u00fd rube\u013e
-currenciesDisplayName.PDK=Transdniestria rube\u013e Kupon
-currenciesDisplayName.NPR=Nep\u00e1lska rupia
-currenciesDisplayName.CKD=Cook Islands dol\u00e1r
-currenciesDisplayName.JPY=Japonsk\u00fd yen
-currenciesDisplayName.MVR=Maldivsk\u00e1 rufiyaa
-currenciesDisplayName.XCF=CFA Nouveau frank
-currenciesDisplayName.MVP=Maldivsk\u00e1 rupia
-currenciesDisplayName.XCD=East Caribbean dol\u00e1r
-currenciesDisplayName.SIT=Slovinsk\u00fd Tolar
-currenciesDisplayName.YUR=Juhosl\u00e1vsky din\u00e1r
-currenciesDisplayName.AWG=Arubsk\u00fd guilder
-currenciesDisplayName.YUO=Juhosl\u00e1vsky okt\u00f3brov\u00fd din\u00e1r
-currenciesDisplayName.DDM=V\u00fdchodonemeck\u00e1 marka
-currenciesDisplayName.YUN=Juhosl\u00e1vsky din\u00e1r
-currenciesDisplayName.YUM=Juhosl\u00e1vsky Noviy din\u00e1r
-currenciesDisplayName.TCC=Turks a Caicos Crown
-currenciesDisplayName.YUG=Juhosl\u00e1vsky din\u00e1r
-currenciesDisplayName.YUF=Juhosl\u00e1vsky din\u00e1r
-currenciesDisplayName.RON=Rumunsk\u00fd nov\u00fd leu
-currenciesDisplayName.YUD=Juhosl\u00e1vsky din\u00e1r
-currenciesDisplayName.ROL=Rumunsk\u00fd leu
-currenciesDisplayName.SIB=Slovinsk\u00fd tolar Bons
-currenciesDisplayName.NOK=N\u00f3rksy krone
-currenciesDisplayName.MUR=Mauritsk\u00e1 rupia
-currenciesDisplayName.GIP=Gibraltarsk\u00e1 libra
-currenciesDisplayName.VNS=Vietnamsk\u00fd n\u00e1rodn\u00fd dong
-currenciesDisplayName.VNR=Vietnamsk\u00fd dong
-currenciesDisplayName.KID=Kiribati dol\u00e1r
-currenciesDisplayName.SHP=Libra
-currenciesDisplayName.VNN=Vietnamsk\u00fd nov\u00fd dong
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.GHP=GHP
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Bermudsk\u00fd dol\u00e1r
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.INR=INR
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
currenciesSymbol.GNF=GF
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.VNR=VNR
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=jan®feb®mar®apr®m\u00e1j®j\u00fan®j\u00fal®aug®sep®okt®nov®dec®®
months=janu\u00e1r®febru\u00e1r®marec®apr\u00edl®m\u00e1j®j\u00fan®j\u00fal®august®september®okt\u00f3ber®november®december®®
shortWeekdays=®Ne®Po®Ut®St®\u0160t®Pi®So®
@@ -779,7 +379,9 @@ territories.GN=Guinea
territories.GM=Gambia
territories.GL=Gr\u00f3nsko
territories.SV=Salvador
+territories.062=Ju\u017en\u00e1 \u00c1zia
territories.ST=Sv\u00e4t\u00fd Tom\u00e1\u0161 a Princove ostrovy
+territories.061=Polyn\u00e9zia
territories.GI=Gibralt\u00e1r
territories.GH=Ghana
territories.SR=Surinam
@@ -803,9 +405,12 @@ territories.SC=Seychelsk\u00e9 ostrovy
territories.SB=\u0160alam\u00fanove ostrovy
territories.SA=Saudsk\u00e1 Ar\u00e1bia
territories.FR=Franc\u00fazsko
+territories.057=Mikron\u00e9sia
territories.FO=Faersk\u00e9 ostrovy
territories.FM=Mikron\u00e9zia, Federat\u00edvne \u0161t\u00e1ty
territories.RW=Rwanda
+territories.054=Melan\u00e9zia
+territories.053=Austr\u00e1lia a Nov\u00fd Z\u00e9land
territories.FK=Falklandsk\u00e9 ostrovy
territories.RU=Rusk\u00e1 feder\u00e1cia
territories.FJ=Fid\u017ei
@@ -815,20 +420,26 @@ territories.RE=Reunion
territories.ET=Eti\u00f3pia
territories.ES=\u0160panielsko
territories.ER=Eritrea
+territories.833=Ostrov Man
territories.EH=Z\u00e1padn\u00e1 Sahara
territories.EG=Egypt
+territories.830=Kan\u00e1l La Manche
territories.EE=Est\u00f3nsko
+territories.QO=Tichomorie - ostatn\u00e9
territories.EC=Ekv\u00e1dor
territories.DZ=Al\u017e\u00edrsko
territories.QA=Katar
+territories.039=Ju\u017en\u00e1 Eur\u00f3pa
territories.DO=Dominik\u00e1nska republika
territories.PY=Paraguaj
+territories.035=Juhov\u00fdchodn\u00e1 \u00c1zia
territories.DM=Dominika
territories.PW=Palau
territories.DK=D\u00e1nsko
territories.DJ=D\u017eibuti
territories.PT=Portugalsko
territories.PS=Palest\u00ednske \u00fazemie
+territories.030=V\u00fdchodn\u00e1 \u00c1zia
territories.PR=Portoriko
territories.DE=Nemecko
territories.PN=Pitcairnove ostrovy
@@ -845,13 +456,16 @@ territories.CX=Viano\u010dn\u00fd ostrov
territories.CV=Kapverdy
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Srbsko a \u010cierna Hora
territories.CR=Kostarika
+territories.029=Karibik
territories.CO=Kolumbia
territories.CN=\u010c\u00edna
territories.CM=Kamerun
territories.CL=\u010cile
territories.CK=Cookove ostrovy
territories.CI=Pobre\u017eie Slonoviny
+territories.021=Severn\u00e1 Amerika
territories.CH=\u0160vaj\u010diarsko
territories.CG=Kongo
territories.CF=Stredoafrick\u00e1 republika
@@ -866,13 +480,20 @@ territories.BV=Bouvetov ostrov
territories.BT=But\u00e1n
territories.BS=Bahamy
territories.BR=Braz\u00edlia
+territories.019=Americk\u00fd kontinent
+territories.018=Ju\u017en\u00e1 Afrika
territories.NZ=Nov\u00fd Z\u00e9land
territories.BO=Bol\u00edvia
+territories.017=Stredn\u00e1 Afrika
territories.BN=Brunej
territories.BM=Bermudy
+territories.015=Severn\u00e1 Afrika
+territories.014=V\u00fdchodn\u00e1 Afrika
+territories.013=Stredn\u00e1 Amerika
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Z\u00e1padn\u00e1 Afrika
territories.BH=Bahrajn
territories.NR=Nauru
territories.BG=Bulharsko
@@ -890,6 +511,7 @@ territories.NG=Nig\u00e9ria
territories.NF=Norfolkov ostrov
territories.AZ=Azerbajd\u017ean
territories.NE=Niger
+territories.AX=Alandsk\u00e9 ostrovy
territories.NC=Nov\u00e1 Kaled\u00f3nia
territories.AW=Aruba
territories.ZM=Zambia
@@ -900,17 +522,21 @@ territories.AS=Americk\u00e1 Samoa
territories.AR=Argent\u00edna
territories.AQ=Antarctica
territories.MZ=Mozambik
+territories.200=\u010ceskoslovensko
territories.AO=Angola
territories.MY=Malajzia
territories.AN=Holandsk\u00e9 Antily
territories.MX=Mexiko
+territories.005=Ju\u017en\u00e1 Amerika
territories.AM=Arm\u00e9nsko
territories.MW=Malawi
territories.AL=Alb\u00e1nsko
territories.MV=Maldivy
territories.ZA=Ju\u017en\u00e1 Afrika
territories.MU=Maur\u00edcius
+territories.002=Afrika
territories.MT=Malta
+territories.001=Svet
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Maurit\u00e1nia
@@ -925,7 +551,6 @@ territories.MN=Mongolsko
territories.MM=Mjanmarsko
territories.ML=Mali
territories.MK=Maced\u00f3nsko, republika
-territories.YU=Juhosl\u00e1via
territories.YT=Mayotte
territories.MH=Marshallove ostrovy
territories.MG=Madagaskar
@@ -935,10 +560,14 @@ territories.MA=Maroko
territories.YE=Jemen
territories.LY=L\u00fdbijsk\u00e1 arabsk\u00e1 d\u017eamah\u00edrija
territories.LV=Loty\u0161sko
+territories.155=Z\u00e1padn\u00e1 Eur\u00f3pa
territories.LU=Luxembursko
+territories.154=Severn\u00e1 Eur\u00f3pa
territories.LT=Litva
territories.LS=Lesotho
territories.LR=Lib\u00e9ria
+territories.151=V\u00fdchodn\u00e1 Eur\u00f3pa
+territories.150=Eur\u00f3pa
territories.LK=Sr\u00ed Lanka
territories.LI=Lichten\u0161tajnsko
territories.LC=Sv\u00e4t\u00e1 Lucia
@@ -947,6 +576,8 @@ territories.LA=Laosk\u00e1 \u013eudovodemokratick\u00e1 republika
territories.KZ=Kazachstan
territories.KY=Kajmansk\u00e9 ostrovy
territories.KW=Kuvajt
+territories.145=Z\u00e1padn\u00e1 \u00c1zia
+territories.142=\u00c1zia
territories.KR=K\u00f3rea, Ju\u017en\u00e1
territories.KP=K\u00f3rea, Severn\u00e1
territories.KN=Saint Kitts a Nevis
@@ -1005,8 +636,8 @@ languages.el=gr\u00e9cky
languages.nl=holandsk\u00fd
languages.bg=bulharsk\u00fd
languages.lv=loty\u0161sk\u00fd
-languages.he=hebrejsk\u00fd
languages.cs=\u010desk\u00fd
+languages.he=hebrejsk\u00fd
languages.it=taliansky
languages.lt=litovsk\u00fd
languages.fr=franc\u00fazsky
@@ -1021,8 +652,8 @@ languages.pl=po\u013esk\u00fd
languages.sl=slovinsk\u00fd
languages.sk=slovensk\u00fd
languages.de=nemeck\u00fd
-languages.hu=ma\u010farsk\u00fd
languages.et=est\u00f3nsky
+languages.hu=ma\u010farsk\u00fd
languages.es=\u0161panielsky
-languages.hr=chorv\u00e1tsky
languages.da=d\u00e1nsky
+languages.hr=chorv\u00e1tsky
diff --git a/resource/gnu/java/locale/LocaleInformation_sl.properties b/resource/gnu/java/locale/LocaleInformation_sl.properties
index 377ea4e0c..991615ee1 100644
--- a/resource/gnu/java/locale/LocaleInformation_sl.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sl.properties
@@ -8,16 +8,24 @@
decimalSeparator=,
groupingSeparator=.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
+currenciesDisplayName.INR=Indijski Rupi
+currenciesDisplayName.RUB=Ruska Rublja
+currenciesDisplayName.JPY=Japonski Jen
+currenciesDisplayName.BRL=Brazilski Real
+currenciesDisplayName.CNY=Kitajski Yuan Renminbi
+currenciesDisplayName.USD=Ameri\u0161ki Dolar
+currenciesDisplayName.EUR=Evro
currenciesDisplayName.SIT=Slovenski tolar
-currenciesSymbol.SIT=SIT
+currenciesDisplayName.GBP=Britanski Funt Sterling
shortMonths=jan®feb®mar®apr®maj®jun®jul®avg®sep®okt®nov®dec®®
months=januar®februar®marec®april®maj®junij®julij®avgust®september®oktober®november®december®®
shortWeekdays=®ned®pon®tor®sre®\u010det®pet®sob®
weekdays=®nedelja®ponedeljek®torek®sreda®\u010detrtek®petek®sobota®
firstDayOfWeek=mon
-eras=pr.n.\u0161.®po Kr.®
-shortDateFormat=yy.M.d
-mediumDateFormat=yyyy.M.d
+eras=pr.n.\u0161.®n.\u0161.®
+ampms=dop.®pop.®
+shortDateFormat=d.M.yy
+mediumDateFormat=d.M.yyyy
longDateFormat=dd. MMMM yyyy
fullDateFormat=EEEE, dd. MMMM yyyy
shortTimeFormat=H:mm
@@ -46,7 +54,9 @@ territories.GN=Gvineja
territories.GM=Gambija
territories.GL=Grenlandija
territories.SV=Salvador
+territories.062=Ju\u017eno-centralna Azija
territories.ST=Sao Tome in Principe
+territories.061=Polinezija
territories.GI=Gibraltar
territories.GH=Gana
territories.SR=Surinam
@@ -70,9 +80,12 @@ territories.SC=Sej\u0161eli
territories.SB=Salomonovo oto\u010dje
territories.SA=Saudova Arabija
territories.FR=Francija
+territories.057=Micronezija
territories.FO=Fererski otoki
territories.FM=Mikronezija
territories.RW=Ruanda
+territories.054=Melanezija
+territories.053=Avstralija i Nova Zelandija
territories.FK=Falklandski (Malvinski) otoki
territories.RU=Ruska federacija
territories.FJ=Fid\u017ei
@@ -82,20 +95,26 @@ territories.RE=Reunion
territories.ET=Etiopija
territories.ES=\u0160panija
territories.ER=Eritreja
+territories.833=Otok Man
territories.EH=Zahodna Sahara
territories.EG=Egipt
+territories.830=Kanalski otoki
territories.EE=Estonija
+territories.QO=Ostala oceanija
territories.EC=Ekvador
territories.DZ=Al\u017eirija
territories.QA=Katar
+territories.039=Ju\u017ena Evropa
territories.DO=Dominikanska republika
territories.PY=Paragvaj
+territories.035=Jugovzhodna Azija
territories.DM=Dominika
territories.PW=Palau
territories.DK=Danska
territories.DJ=D\u017eibuti
territories.PT=Portugalska
territories.PS=Palestinsko ozemlje
+territories.030=Vzhodna Azija
territories.PR=Portoriko
territories.DE=Nem\u010dija
territories.PN=Pitcairn
@@ -112,13 +131,16 @@ territories.CX=Bo\u017ei\u010dni otok
territories.CV=Kapverdski otoki
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Srbija in \u010crna gora
territories.CR=Kostarika
+territories.029=Karibi
territories.CO=Kolumbija
territories.CN=Kitajska
territories.CM=Kamerun
territories.CL=\u010cile
territories.CK=Cookovi otoki
territories.CI=Slonoko\u0161\u010dena obala
+territories.021=Severna Amerika
territories.CH=\u0160vica
territories.CG=Kongo
territories.CF=Centralnoafri\u0161ka republika
@@ -133,13 +155,20 @@ territories.BV=Otok Bouvet
territories.BT=Butan
territories.BS=Bahami
territories.BR=Brazilija
+territories.019=Amerike
+territories.018=Ju\u017ena Afrika
territories.NZ=Nova Zelandija
territories.BO=Bolivija
+territories.017=Centralna Afrika
territories.BN=Brunej
territories.BM=Bermuda
+territories.015=Severna Afrika
+territories.014=Vzhodna Afrika
+territories.013=Centralna Amerika
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Zahodna Afrika
territories.BH=Bahrajn
territories.NR=Nauru
territories.BG=Bolgarija
@@ -157,6 +186,7 @@ territories.NG=Nigerija
territories.NF=Otok Norfolk
territories.AZ=Azerbajd\u017ean
territories.NE=Niger
+territories.AX=Alandski otoki
territories.NC=Nova Kaledonija
territories.AW=Aruba
territories.ZM=Zambija
@@ -165,19 +195,23 @@ territories.AU=Avstralija
territories.AT=Avstrija
territories.AS=Ameri\u0161ka Samoa
territories.AR=Argentina
+territories.009=Oceanija
territories.AQ=Antarktika
territories.MZ=Mozambik
territories.AO=Angola
territories.MY=Malezija
territories.AN=Nizozemski Antili
territories.MX=Mehika
+territories.005=Ju\u017ena Amerika
territories.AM=Armenija
territories.MW=Malavi
territories.AL=Albanija
territories.MV=Maldivi
territories.ZA=Ju\u017ena Afrika
territories.MU=Mauritius
+territories.002=Afrika
territories.MT=Malta
+territories.001=Svet
territories.AI=Angvila
territories.MS=Montserrat
territories.MR=Mavretanija
@@ -192,7 +226,6 @@ territories.MN=Mongolija
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Republika Makedonija
-territories.YU=Jugoslavija
territories.YT=Mayotte
territories.MH=Marshallovi otoki
territories.MG=Madagaskar
@@ -202,10 +235,14 @@ territories.MA=Maroko
territories.YE=Jemen
territories.LY=Libija
territories.LV=Latvija
+territories.155=Zapadna Evropa
territories.LU=Luxemburg
+territories.154=Severna Evropa
territories.LT=Litva
territories.LS=Lesoto
territories.LR=Liberija
+territories.151=Vzhodna Evropa
+territories.150=Evropa
territories.LK=\u0160rilanka
territories.LI=Liechtenstein
territories.LC=Saint Lucia
@@ -214,6 +251,8 @@ territories.LA=Ljudska demokrati\u010dna republika Laos
territories.KZ=Kazahstan
territories.KY=Kajmanski otoki
territories.KW=Kuvajt
+territories.145=Zahodna Azija
+territories.142=Azija
territories.KR=Ju\u017ena Koreja
territories.KP=Severna Koreja
territories.KN=Saint Kitts in Nevis
@@ -271,9 +310,10 @@ languages.no=Norve\u0161\u010dina
languages.el=Gr\u0161\u010dina
languages.nl=Nizozem\u0161\u010dina
languages.bg=Bolgar\u0161\u010dina
+languages.hi=Hinduj\u0161\u010dina
languages.lv=Leton\u0161\u010dina
-languages.he=Hebrej\u0161\u010dina
languages.cs=\u010ce\u0161\u010dina
+languages.he=Hebrej\u0161\u010dina
languages.it=Italijan\u0161\u010dina
languages.lt=Litov\u0161\u010dina
languages.fr=Franco\u0161\u010dina
@@ -288,8 +328,8 @@ languages.pl=Polj\u0161\u010dina
languages.sl=Sloven\u0161\u010dina
languages.sk=Slova\u0161\u010dina
languages.de=Nem\u0161\u010dina
-languages.hu=Mad\u017ear\u0161\u010dina
languages.et=Eston\u0161\u010dina
+languages.hu=Mad\u017ear\u0161\u010dina
languages.es=\u0160pan\u0161\u010dina
-languages.hr=Hrva\u0161\u010dina
languages.da=Dan\u0161\u010dina
+languages.hr=Hrva\u0161\u010dina
diff --git a/resource/gnu/java/locale/LocaleInformation_ar_LY.properties b/resource/gnu/java/locale/LocaleInformation_sl_SI.properties
index ba347fe84..ee54b4fc4 100644
--- a/resource/gnu/java/locale/LocaleInformation_ar_LY.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sl_SI.properties
@@ -1,8 +1,8 @@
-# LocaleInformation_ar_LY.properties --
+# LocaleInformation_sl_SI.properties --
# Copyright (C) 1991-2005 Unicode, Inc.
# All rights reserved. Distributed under the Terms of Use
# in http://www.unicode.org/copyright.html.
#
# This file was automatically generated by gnu.localegen from CLDR.
-currencyFormat=\u00a4 #,##0.000;\u00a4 #,##0.000-
+currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
diff --git a/resource/gnu/java/locale/LocaleInformation_so.properties b/resource/gnu/java/locale/LocaleInformation_so.properties
index 80daa6cff..6928b1f7f 100644
--- a/resource/gnu/java/locale/LocaleInformation_so.properties
+++ b/resource/gnu/java/locale/LocaleInformation_so.properties
@@ -5,7 +5,17 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesDisplayName.KES=KES
+currenciesDisplayName.INR=Indian Rupee
+currenciesDisplayName.RUB=Russian Ruble
+currenciesDisplayName.JPY=Japanese Yen
+currenciesDisplayName.BRL=Brazilian Real
+currenciesDisplayName.CNY=Chinese Yuan Renminbi
+currenciesDisplayName.USD=US Dollar
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.ETB=Itoobiya Bir
+currenciesDisplayName.SOS=Somalia Schilling
+currenciesDisplayName.DJF=Jabuuti Faran
+currenciesDisplayName.GBP=British Pound Sterling
currenciesSymbol.KES=Ksh
shortMonths=Kob®Lab®Sad®Afr®Sha®Lix®Tod®Sid®Sag®Tob®KIT®LIT®®
months=Bisha Koobaad®Bisha Labaad®Bisha Saddexaad®Bisha Afraad®Bisha Shanaad®Bisha Lixaad®Bisha Todobaad®Bisha Sideedaad®Bisha Sagaalaad®Bisha Tobnaad®Bisha Kow iyo Tobnaad®Bisha Laba iyo Tobnaad®®
@@ -28,9 +38,9 @@ territories.AT=Osteeriya
territories.MZ=Musambiig
territories.AO=Angoola
territories.MX=Meksiko
-territories.MW=Malaawi
-territories.GR=Giriigga
territories.AM=Armeeniya
+territories.GR=Giriigga
+territories.MW=Malaawi
territories.ZA=Koonfur Afrika
territories.MV=Maaldiqeen
territories.SY=Suuriya
@@ -44,6 +54,7 @@ territories.MK=Makadooniya
territories.SO=Soomaaliya
territories.GD=Giriinaada
territories.SL=Siraaliyoon
+territories.GB=United Kingdom
territories.MC=Moonako
territories.MA=Marooko
territories.SE=Iswidhan
@@ -71,11 +82,11 @@ territories.EG=Masar
territories.KH=Kamboodiya
territories.KE=Kiiniya
territories.QA=Qadar
-territories.JP=Jabbaan
territories.DK=Danmaark
+territories.JP=Jabbaan
territories.PT=Bortuqaal
-territories.JO=Urdun
territories.DJ=Jabuuti
+territories.JO=Urdun
territories.JM=Jameyka
territories.DE=Jarmal
territories.PL=Booland
@@ -86,15 +97,15 @@ territories.VE=Fenisuweela
territories.CU=Kuuba
territories.VA=Faatikaan
territories.IT=Talyaani
-territories.IS=Iislaand
territories.CN=Shiinaha
-territories.IR=Iiraan
+territories.IS=Iislaand
territories.CM=Kameruun
-territories.IQ=Ciraaq
+territories.IR=Iiraan
territories.CL=Jili
+territories.IQ=Ciraaq
territories.IN=Hindiya
territories.CH=Swiiserlaand
-territories.IL=Israa'iil
+territories.IL=Israa\u02bciil
territories.US=Qaramada Midoobey ee Maraykanka
territories.OM=Cumaan
territories.CA=Kanada
@@ -108,8 +119,8 @@ territories.HR=Korweeshiya
territories.TZ=Tansaaniya
territories.BJ=Beniin
territories.BH=Baxrayn
-territories.NO=Noorweey
territories.BE=Beljiyam
+territories.NO=Noorweey
territories.BD=Bangaala-Deesh
territories.ZW=Simbaabwe
territories.TR=Turki
@@ -122,4 +133,15 @@ territories.ZM=Saambiya
territories.TH=Taylaand
territories.TG=Toogo
territories.NA=Namiibiya
+languages.zh=Chinese
+languages.en=English
languages.so=Soomaali
+languages.ru=Russian
+languages.hi=Hindi
+languages.ar=Arabic
+languages.it=Italian
+languages.fr=French
+languages.de=German
+languages.es=Spanish
+languages.ja=Japanese
+languages.pt=Portuguese
diff --git a/resource/gnu/java/locale/LocaleInformation_so_DJ.properties b/resource/gnu/java/locale/LocaleInformation_so_DJ.properties
index 8efb21e33..e85acd3ea 100644
--- a/resource/gnu/java/locale/LocaleInformation_so_DJ.properties
+++ b/resource/gnu/java/locale/LocaleInformation_so_DJ.properties
@@ -6,6 +6,5 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.DJF=DJF
currenciesSymbol.DJF=$
currenciesSymbol.USD=US$
diff --git a/resource/gnu/java/locale/LocaleInformation_so_ET.properties b/resource/gnu/java/locale/LocaleInformation_so_ET.properties
index 7323cdf5a..18388570e 100644
--- a/resource/gnu/java/locale/LocaleInformation_so_ET.properties
+++ b/resource/gnu/java/locale/LocaleInformation_so_ET.properties
@@ -6,6 +6,5 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.ETB=ETB
currenciesSymbol.ETB=$
currenciesSymbol.USD=US$
diff --git a/resource/gnu/java/locale/LocaleInformation_so_SO.properties b/resource/gnu/java/locale/LocaleInformation_so_SO.properties
index 9e197f395..a5b40708b 100644
--- a/resource/gnu/java/locale/LocaleInformation_so_SO.properties
+++ b/resource/gnu/java/locale/LocaleInformation_so_SO.properties
@@ -6,6 +6,5 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.SOS=SOS
currenciesSymbol.SOS=$
currenciesSymbol.USD=US$
diff --git a/resource/gnu/java/locale/LocaleInformation_sq.properties b/resource/gnu/java/locale/LocaleInformation_sq.properties
index 25c159773..e8e85c8d7 100644
--- a/resource/gnu/java/locale/LocaleInformation_sq.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sq.properties
@@ -8,7 +8,14 @@
decimalSeparator=,
groupingSeparator=.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.ALL=ALL
+currenciesDisplayName.INR=Rupee indiane
+currenciesDisplayName.JPY=Jeni Japonez
+currenciesDisplayName.RUB=Rubla ruse
+currenciesDisplayName.CNY=Renminbi(Yuan) Kinez
+currenciesDisplayName.GBP=Paund Sterlina Britanike
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.USD=Dollar amerikan
+currenciesDisplayName.BRL=Real Brazilian
currenciesSymbol.ALL=Lek
shortMonths=Jan®Shk®Mar®Pri®Maj®Qer®Kor®Gsh®Sht®Tet®N\u00ebn®Dhj®®
months=janar®shkurt®mars®prill®maj®qershor®korrik®gusht®shtator®tetor®n\u00ebntor®dhjetor®®
@@ -35,15 +42,16 @@ territories.GT=Guatemal\u00eb
territories.GR=Greqi
territories.GQ=Guineja Ekuatoriale
territories.SZ=Svaziland\u00eb
-territories.SY=Siri
territories.GN=Guine
+territories.SY=Siri
territories.GM=Gambi
territories.ST=Sao Tome e Prinsipe
territories.GH=Gan\u00eb
territories.GE=Gjeorgji
territories.SO=Somali
-territories.SL=Siera Leone
+territories.GB=Mbret\u00ebria e Bashkuar
territories.GA=Gjabon
+territories.SL=Siera Leone
territories.SK=Sllovaki
territories.SI=Slloveni
territories.SG=Singapor
@@ -54,8 +62,8 @@ territories.SA=Arabia Saudite
territories.FR=Franc\u00eb
territories.FM=Mikronezi
territories.RW=Ruanda
-territories.RU=Rusi
territories.FJ=Fixhi
+territories.RU=Rusi
territories.FI=Finland\u00eb
territories.RO=Rumani
territories.ET=Etiopi
@@ -81,6 +89,7 @@ territories.CZ=Republika e \u00c7ekis\u00eb
territories.CY=Qipro
territories.CV=Kap Verde
territories.CU=Kub\u00eb
+territories.CS=Serbi\u00eb en Montenegro
territories.CR=Kosta Rika
territories.CO=Kolumbi
territories.CN=Kin\u00eb
@@ -94,42 +103,42 @@ territories.CA=Kanada
territories.BY=Bjellorusi
territories.BW=Botsvana
territories.BT=Butan
-territories.NZ=Zelanda e Re
+territories.BR=Brazili
territories.BO=Bolivi
+territories.NZ=Zelanda e Re
territories.BN=Brunej
territories.BH=Bahrein
territories.BG=Bullgari
territories.BE=Belgjik\u00eb
territories.NO=Norvegji
territories.ZW=Zimbabve
-territories.NL=Vendet e Ul\u00ebta
territories.BA=Bosnja dhe Hercegovina
+territories.NL=Vendet e Ul\u00ebta
territories.NI=Nikaragua
territories.NG=Nigeri
territories.AZ=Azerbajxhan
territories.ZM=Zambi
-territories.AU=Australi
territories.NA=Namibi
+territories.AU=Australi
territories.AT=Austri
territories.AR=Argjentin\u00eb
-territories.MZ=Mozambik
territories.AO=Angol\u00eb
+territories.MZ=Mozambik
territories.MY=Malajzi
-territories.MX=Meksik\u00eb
territories.AM=Armeni
-territories.MW=Malavi
+territories.MX=Meksik\u00eb
territories.AL=Shqip\u00ebria
+territories.MW=Malavi
territories.MV=Maldivit
territories.ZA=Afrika e Jugut
territories.MT=Malt\u00eb
-territories.MR=Mauritani
territories.AG=Antigua e Barbuda
+territories.MR=Mauritani
territories.AF=Afganistan
territories.AE=Emiratet Arabe te Bashkuara
territories.AD=Andorr\u00eb
territories.MN=Mongoli
territories.MK=Maqedoni
-territories.YU=Serbi\u00eb
territories.MH=Ishujt Marshall
territories.MG=Madagaskar
territories.MD=Moldavi
@@ -177,4 +186,15 @@ territories.TW=Tajvan
territories.TT=Trinidad e Tobago
territories.TR=Turqi
territories.TN=Tunisi
+languages.zh=Kineze
languages.sq=shqipe
+languages.en=Anglisht
+languages.ru=Rusisht
+languages.hi=Hindi
+languages.ar=Arabisht
+languages.it=Italisht
+languages.fr=Frengjisht
+languages.de=Gjermanisht
+languages.es=Spanjisht
+languages.ja=Japanisht
+languages.pt=Portugeze
diff --git a/resource/gnu/java/locale/LocaleInformation_sr.properties b/resource/gnu/java/locale/LocaleInformation_sr.properties
index 9b272dcc5..f3263c000 100644
--- a/resource/gnu/java/locale/LocaleInformation_sr.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sr.properties
@@ -10,62 +10,52 @@ groupingSeparator=.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
currenciesDisplayName.GBP=\u0424\u0443\u043d\u0442\u0430 \u0441\u0442\u0435\u0440\u043b\u0438\u043d\u0433\u0430
currenciesDisplayName.CHF=\u0428\u0432\u0430\u0458\u0446\u0430\u0440\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u0430\u043a
-currenciesDisplayName.FRF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u0430\u043a
currenciesDisplayName.HRK=\u041a\u0443\u043d\u0430
+currenciesDisplayName.FRF=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u0430\u043a
currenciesDisplayName.IEP=\u0418\u0440\u0441\u043a\u0430 \u0444\u0443\u043d\u0442\u0430
+currenciesDisplayName.INR=\u0418\u043d\u0434\u0438\u0458\u0441\u043a\u0438 \u0420\u0443\u043f\u0438
currenciesDisplayName.JPY=\u0408\u0435\u043d
currenciesDisplayName.HRD=\u0425\u0440\u0432\u0430\u0442\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.ITL=\u0418\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.EUR=\u0415\u0412\u0420\u041e
+currenciesDisplayName.ITL=\u0418\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u0441\u043a\u0430 \u043b\u0438\u0440\u0430
currenciesDisplayName.PTE=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0438 \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.NOK=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0430 \u043a\u0440\u0443\u043d\u0430
currenciesDisplayName.AUD=\u0410\u0443\u0441\u0442\u0440\u0430\u043b\u0438\u0458\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.NOK=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0430 \u043a\u0440\u0443\u043d\u0430
currenciesDisplayName.DEM=\u041d\u0435\u043c\u0430\u0447\u043a\u0430 \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.LUF=\u041b\u0443\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0448\u043a\u0438 \u0444\u0440\u0430\u043d\u0430\u043a
-currenciesDisplayName.BEF=\u0411\u0435\u043b\u0433\u0438\u0458\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u0430\u043a
-currenciesDisplayName.YUN=YUN
currenciesDisplayName.NLG=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0433\u0443\u043b\u0434\u0435\u043d
+currenciesDisplayName.BEF=\u0411\u0435\u043b\u0433\u0438\u0458\u0441\u043a\u0438 \u0444\u0440\u0430\u043d\u0430\u043a
currenciesDisplayName.DKK=\u0414\u0430\u043d\u0441\u043a\u0430 \u043a\u0440\u0443\u043d\u0430
currenciesDisplayName.RUR=\u0420\u0443\u0441\u043a\u0430 \u0440\u0443\u0431\u0459\u0430 (1991-1998)
currenciesDisplayName.KWD=\u041a\u0443\u0432\u0430\u0458\u0442\u0441\u043a\u0438 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.CNY=\u041a\u0438\u043d\u0435\u0441\u043a\u0438 \u0408\u0443\u0430\u043d \u0420\u0435\u043d\u043c\u0438\u043d\u0431\u0438
currenciesDisplayName.ESP=\u0428\u043f\u0430\u043d\u0441\u043a\u0430 \u043f\u0435\u0437\u0435\u0442\u0430
-currenciesDisplayName.CAD=\u041a\u0430\u043d\u0430\u0434\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.GRD=\u0414\u0440\u0430\u0445\u043c\u0430
+currenciesDisplayName.CAD=\u041a\u0430\u043d\u0430\u0434\u0441\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.ATS=\u0410\u0443\u0441\u0442\u0440\u0438\u0458\u0441\u043a\u0438 \u0448\u0438\u043b\u0438\u043d\u0433
+currenciesDisplayName.BRL=\u0411\u0440\u0430\u0437\u0438\u043b\u0441\u043a\u0438 \u0420\u0435\u0430\u043b
currenciesDisplayName.SEK=\u0428\u0432\u0435\u0434\u0441\u043a\u0430 \u043a\u0440\u0443\u043d\u0430
currenciesDisplayName.USD=\u0410\u043c\u0435\u0440\u0438\u0447\u043a\u0438 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.CSD=\u0421\u0440\u043f\u0441\u043a\u0438 \u0414\u0438\u043d\u0430\u0440
currenciesDisplayName.RUB=\u0420\u0443\u0441\u043a\u0430 \u0440\u0443\u0431\u0459\u0430
-currenciesDisplayName.FIN=\u0424\u0438\u043d\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0430 (1860-1962)
currenciesDisplayName.FIM=\u0424\u0438\u043d\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.SIT=\u0422\u043e\u043b\u0430\u0440
currenciesDisplayName.BAM=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0431\u0438\u043b\u043d\u0430 \u043c\u0430\u0440\u043a\u0430
-currenciesSymbol.CHF=SwF
-currenciesSymbol.FRF=FRF
-currenciesSymbol.HRK=HRK
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.HRD=HRD
-currenciesSymbol.PTE=PTE
+currenciesSymbol.KWD=KD
+currenciesSymbol.INR=INR
currenciesSymbol.NOK=NKr
-currenciesSymbol.AUD=$A
-currenciesSymbol.DEM=DEM
-currenciesSymbol.LUF=LUF
currenciesSymbol.BEF=BF
+currenciesSymbol.BAM=KM
currenciesSymbol.YUN=\u0414\u0438\u043d
-currenciesSymbol.NLG=NLG
+currenciesSymbol.IEP=IR\u00a3
currenciesSymbol.DKK=DKr
-currenciesSymbol.RUR=RUR
-currenciesSymbol.KWD=KD
-currenciesSymbol.ESP=ESP
-currenciesSymbol.CAD=Can$
-currenciesSymbol.GRD=GRD
-currenciesSymbol.ATS=ATS
-currenciesSymbol.SEK=SKr
+currenciesSymbol.CHF=SwF
+currenciesSymbol.CNY=\u0423
+currenciesSymbol.AUD=$A
currenciesSymbol.USD=US$
-currenciesSymbol.RUB=RUB
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
-currenciesSymbol.SIT=SIT
-currenciesSymbol.BAM=KM
+currenciesSymbol.CSD=YUN
+currenciesSymbol.SEK=SKr
+currenciesSymbol.CAD=Can$
shortMonths=\u0458\u0430\u043d®\u0444\u0435\u0431®\u043c\u0430\u0440®\u0430\u043f\u0440®\u043c\u0430\u0458®\u0458\u0443\u043d®\u0458\u0443\u043b®\u0430\u0432\u0433®\u0441\u0435\u043f®\u043e\u043a\u0442®\u043d\u043e\u0432®\u0434\u0435\u0446®®
months=\u0458\u0430\u043d\u0443\u0430\u0440®\u0444\u0435\u0431\u0440\u0443\u0430\u0440®\u043c\u0430\u0440\u0442®\u0430\u043f\u0440\u0438\u043b®\u043c\u0430\u0458®\u0458\u0443\u043d®\u0458\u0443\u043b®\u0430\u0432\u0433\u0443\u0441\u0442®\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440®\u043e\u043a\u0442\u043e\u0431\u0430\u0440®\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440®\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440®®
shortWeekdays=®\u043d\u0435\u0434®\u043f\u043e\u043d®\u0443\u0442\u043e®\u0441\u0440\u0435®\u0447\u0435\u0442®\u043f\u0435\u0442®\u0441\u0443\u0431®
@@ -103,7 +93,9 @@ territories.GN=\u0413\u0432\u0438\u043d\u0435\u0458\u0430
territories.GM=\u0413\u0430\u043c\u0431\u0438\u0458\u0430
territories.GL=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434
territories.SV=\u0421\u0430\u043b\u0432\u0430\u0434\u043e\u0440
+territories.062=\u0408\u0443\u0436\u043d\u043e-\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u0430 \u0410\u0437\u0438\u0458\u0430
territories.ST=\u0421\u0430\u043e \u0422\u043e\u043c\u0435 \u0438 \u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0438
+territories.061=\u041f\u043e\u043b\u0438\u043d\u0435\u0437\u0438\u0458\u0430
territories.GI=\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440
territories.GH=\u0413\u0430\u043d\u0430
territories.SR=\u0421\u0443\u0440\u0438\u043d\u0430\u043c
@@ -127,9 +119,12 @@ territories.SC=\u0421\u0435\u0458\u0448\u0435\u043b\u0438
territories.SB=\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
territories.SA=\u0421\u0430\u0443\u0434\u0438\u0458\u0441\u043a\u0430 \u0410\u0440\u0430\u0431\u0438\u0458\u0430
territories.FR=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0430
+territories.057=\u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u0458\u0430
territories.FO=\u0424\u0430\u0440\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
territories.FM=\u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u0458\u0430
territories.RW=\u0420\u0443\u0430\u043d\u0434\u0430
+territories.054=\u041c\u0435\u043b\u0430\u043d\u0435\u0437\u0438\u0458\u0430
+territories.053=\u0410\u0443\u0441\u0442\u0440\u0430\u043b\u0438\u0458\u0430 \u0438 \u041d\u043e\u0432\u0438 \u0417\u0435\u043b\u0430\u043d\u0434
territories.FK=\u0424\u043e\u043b\u043a\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
territories.RU=\u0420\u0443\u0441\u0438\u0458\u0430
territories.FJ=\u0424\u0438\u045f\u0438
@@ -139,20 +134,26 @@ territories.RE=\u0420\u0435\u0438\u043d\u0438\u043e\u043d
territories.ET=\u0415\u0442\u0438\u043e\u043f\u0438\u0458\u0430
territories.ES=\u0428\u043f\u0430\u043d\u0438\u0458\u0430
territories.ER=\u0415\u0440\u0438\u0442\u0440\u0435\u0458\u0430
+territories.833=\u041e\u0441\u0442\u0440\u0432\u043e \u041c\u0430\u043d
territories.EH=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0421\u0430\u0445\u0430\u0440\u0430
territories.EG=\u0415\u0433\u0438\u043f\u0430\u0442
+territories.830=\u041a\u0430\u043d\u0430\u043b\u0441\u043a\u0430 \u043e\u0441\u0442\u0440\u0432\u0430
territories.EE=\u0415\u0441\u0442\u043e\u043d\u0438\u0458\u0430
+territories.QO=\u041e\u0441\u0442\u0430\u043b\u0430 \u043e\u043a\u0435\u0430\u043d\u0438\u0458\u0430
territories.EC=\u0415\u043a\u0432\u0430\u0434\u043e\u0440
territories.DZ=\u0410\u043b\u0436\u0438\u0440
territories.QA=\u041a\u0430\u0442\u0430\u0440
+territories.039=\u0408\u0443\u0436\u043d\u0430 \u0415\u0432\u0440\u043e\u043f\u0430
territories.DO=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430
territories.PY=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0458
+territories.035=\u0408\u0443\u0433\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0430 \u0410\u0437\u0438\u0458\u0430
territories.DM=\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430
territories.PW=\u041f\u0430\u043b\u0430\u0443
territories.DK=\u0414\u0430\u043d\u0441\u043a\u0430
territories.DJ=\u040f\u0438\u0431\u0443\u0442\u0438
territories.PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b
territories.PS=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u043a\u0430 \u0442\u0435\u0440\u0438\u0442\u043e\u0440\u0438\u0458\u0430
+territories.030=\u0418\u0441\u0442\u043e\u0447\u043d\u0430 \u0410\u0437\u0438\u0458\u0430
territories.PR=\u041f\u043e\u0440\u0442\u043e \u0420\u0438\u043a\u043e
territories.DE=\u041d\u0435\u043c\u0430\u0447\u043a\u0430
territories.PN=\u041f\u0438\u0442\u043a\u0435\u0440\u043d
@@ -169,12 +170,15 @@ territories.CX=\u0411\u043e\u0436\u0438\u045b\u043d\u043e \u041e\u0441\u0442\u04
territories.CV=\u041a\u0430\u043f\u0435 \u0412\u0435\u0440\u0434\u0435
territories.PA=\u041f\u0430\u043d\u0430\u043c\u0430
territories.CU=\u041a\u0443\u0431\u0430
+territories.CS=\u0421\u0440\u0431\u0438\u0458\u0430 \u0438 \u0426\u0440\u043d\u0430 \u0413\u043e\u0440\u0430
territories.CR=\u041a\u043e\u0441\u0442\u0430\u0440\u0438\u043a\u0430
+territories.029=\u041a\u0430\u0440\u0438\u0431\u0438
territories.CO=\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u0458\u0430
territories.CN=\u041a\u0438\u043d\u0430
territories.CM=\u041a\u0430\u043c\u0435\u0440\u0443\u043d
territories.CL=\u0427\u0438\u043b\u0435
territories.CI=\u041e\u0431\u0430\u043b\u0430 \u0421\u043b\u043e\u043d\u043e\u0432\u0430\u0447\u0435
+territories.021=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.CH=\u0428\u0432\u0430\u0458\u0446\u0430\u0440\u0441\u043a\u0430
territories.CG=\u041a\u043e\u043d\u0433\u043e
territories.CF=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u043e \u0410\u0444\u0440\u0438\u0447\u043a\u0430 \u0420\u0435\u043f\u0443\u0431\u043b\u0438\u043a\u0430
@@ -189,13 +193,20 @@ territories.BV=\u0411\u0443\u0432\u0435
territories.BT=\u0411\u0443\u0442\u0430\u043d
territories.BS=\u0411\u0430\u0445\u0430\u043c\u0438
territories.BR=\u0411\u0440\u0430\u0455\u0438\u043b
+territories.019=\u0410\u043c\u0435\u0440\u0438\u043a\u0435
+territories.018=\u0408\u0443\u0436\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.NZ=\u041d\u043e\u0432\u0438 \u0417\u0435\u043b\u0430\u043d\u0434
territories.BO=\u0411\u043e\u043b\u0438\u0432\u0438\u0458\u0430
+territories.017=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.BN=\u0411\u0440\u0443\u043d\u0435\u0458
territories.BM=\u0411\u0435\u0440\u043c\u0443\u0434\u0430
+territories.015=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
+territories.014=\u0418\u0441\u0442\u043e\u0447\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
+territories.013=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u043d\u0430 \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.NU=\u041d\u0438\u0443\u0435
territories.BJ=\u0411\u0435\u043d\u0438\u043d
territories.BI=\u0411\u0443\u0440\u0443\u043d\u0434\u0438
+territories.011=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.BH=\u0411\u0430\u0445\u0440\u0435\u0438\u043d
territories.NR=\u041d\u0430\u0443\u0440\u0443
territories.BG=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0430
@@ -213,6 +224,7 @@ territories.NG=\u041d\u0438\u0433\u0435\u0440\u0438\u0458\u0430
territories.NF=\u041d\u043e\u0440\u0444\u043e\u043b\u043a \u041e\u0441\u0442\u0440\u0432\u043e
territories.AZ=\u0410\u0437\u0435\u0440\u0431\u0435\u0458\u045f\u0430\u043d
territories.NE=\u041d\u0438\u0433\u0435\u0440
+territories.AX=\u0410\u043b\u0430\u043d\u0434\u0441\u043a\u0430 \u043e\u0441\u0442\u0440\u0432\u0430
territories.NC=\u041d\u043e\u0432\u0430 \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0438\u0458\u0430
territories.AW=\u0410\u0440\u0443\u0431\u0430
territories.ZM=\u0417\u0430\u043c\u0431\u0438\u0458\u0430
@@ -220,18 +232,22 @@ territories.NA=\u041d\u0430\u043c\u0438\u0431\u0438\u0458\u0430
territories.AU=\u0410\u0443\u0441\u0442\u0440\u0430\u043b\u0438\u0458\u0430
territories.AT=\u0410\u0443\u0441\u0442\u0440\u0438\u0458\u0430
territories.AR=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430
+territories.009=\u041e\u043a\u0435\u0430\u043d\u0438\u0458\u0430
territories.MZ=\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a
territories.AO=\u0410\u043d\u0433\u043e\u043b\u0430
territories.MY=\u041c\u0430\u043b\u0435\u0437\u0438\u0458\u0430
territories.AN=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438 \u0410\u043d\u0442\u0438\u043b\u0438
territories.MX=\u041c\u0435\u043a\u0441\u0438\u043a\u043e
+territories.005=\u0408\u0443\u0436\u043d\u0430 \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.AM=\u0410\u0440\u043c\u0435\u043d\u0438\u0458\u0430
territories.MW=\u041c\u0430\u043b\u0430\u0432\u0438
territories.AL=\u0410\u043b\u0431\u0430\u043d\u0438\u0458\u0430
territories.MV=\u041c\u0430\u043b\u0434\u0438\u0432\u0438
territories.ZA=\u0408\u0443\u0436\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.MU=\u041c\u0430\u0443\u0440\u0438\u0446\u0438\u0458\u0443\u0441
+territories.002=\u0410\u0444\u0440\u0438\u043a\u0430
territories.MT=\u041c\u0430\u043b\u0442\u0430
+territories.001=\u0421\u0432\u0435\u0442
territories.MS=\u041c\u043e\u043d\u0441\u0435\u0440\u0430\u0442
territories.MR=\u041c\u0430\u0443\u0440\u0438\u0442\u0430\u043d\u0438\u0458\u0430
territories.MQ=\u041c\u0430\u0440\u0442\u0438\u043d\u0438\u043a
@@ -244,7 +260,6 @@ territories.MN=\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u0458\u0430
territories.MM=\u041c\u0438\u0458\u0430\u043d\u043c\u0430\u0440
territories.ML=\u041c\u0430\u043b\u0438
territories.MK=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0438\u0458\u0430
-territories.YU=\u0408\u0443\u0433\u043e\u0441\u043b\u0430\u0432\u0438\u0458\u0430
territories.YT=\u041c\u0430\u0458\u043e\u0442\u0435
territories.MH=\u041c\u0430\u0440\u0448\u0430\u043b\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
territories.MG=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440
@@ -254,10 +269,14 @@ territories.MA=\u041c\u0430\u0440\u043e\u043a\u043e
territories.YE=\u0408\u0435\u043c\u0435\u043d
territories.LY=\u041b\u0438\u0431\u0438\u0458\u0430
territories.LV=\u041b\u0435\u0442\u043e\u043d\u0438\u0458\u0430
+territories.155=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0415\u0432\u0440\u043e\u043f\u0430
territories.LU=\u041b\u0443\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433
+territories.154=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u0415\u0432\u0440\u043e\u043f\u0430
territories.LT=\u041b\u0438\u0442\u0432\u0430\u043d\u0438\u0458\u0430
territories.LS=\u041b\u0435\u0441\u043e\u0442\u043e
territories.LR=\u041b\u0438\u0431\u0435\u0440\u0438\u0458\u0430
+territories.151=\u0418\u0441\u0442\u043e\u0447\u043d\u0430 \u0415\u0432\u0440\u043e\u043f\u0430
+territories.150=\u0415\u0432\u0440\u043e\u043f\u0430
territories.LK=\u0428\u0440\u0438 \u041b\u0430\u043d\u043a\u0430
territories.LI=\u041b\u0438\u0445\u0442\u0435\u043d\u0448\u0442\u0430\u0458\u043d
territories.LC=\u0421\u0435\u043d\u0442 \u041b\u0443\u0446\u0438\u0458\u0430
@@ -266,6 +285,8 @@ territories.LA=\u041b\u0430\u043e\u0441
territories.KZ=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d
territories.KY=\u041a\u0430\u0458\u043c\u0430\u043d\u0441\u043a\u0430 \u041e\u0441\u0442\u0440\u0432\u0430
territories.KW=\u041a\u0443\u0432\u0430\u0458\u0442
+territories.145=\u0417\u0430\u043f\u0430\u0434\u043d\u0430 \u0410\u0437\u0438\u0458\u0430
+territories.142=\u0410\u0437\u0438\u0458\u0430
territories.KR=\u0408\u0443\u0436\u043d\u0430 \u041a\u043e\u0440\u0435\u0458\u0430
territories.KP=\u0421\u0435\u0432\u0435\u0440\u043d\u0430 \u041a\u043e\u0440\u0435\u0458\u0430
territories.KN=\u0421\u0435\u043d\u0442 \u041a\u0438\u0442\u0441 \u0438 \u041d\u0435\u0432\u0438\u0441
@@ -340,10 +361,10 @@ languages.yi=\u0408\u0438\u0434\u0438\u0448
languages.sa=\u0421\u0430\u043d\u0441\u043a\u0440\u0438\u0442
languages.cs=\u0427\u0435\u0448\u043a\u0438
languages.lv=\u041b\u0435\u0442\u043e\u043d\u0441\u043a\u0438
-languages.it=\u0418\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u0441\u043a\u0438
languages.fr=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0438
-languages.is=\u0418\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0438
+languages.it=\u0418\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u0441\u043a\u0438
languages.co=\u041a\u043e\u0440\u0437\u0438\u043a\u0430\u043d\u0441\u043a\u0438
+languages.is=\u0418\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0438
languages.lt=\u041b\u0438\u0442\u0432\u0430\u043d\u0441\u043a\u0438
languages.ru=\u0420\u0443\u0441\u043a\u0438
languages.fi=\u0424\u0438\u043d\u0441\u043a\u0438
@@ -355,12 +376,12 @@ languages.uk=\u0423\u043a\u0440\u0430\u0458\u0438\u043d\u0441\u043a\u0438
languages.fa=\u041f\u0435\u0440\u0441\u0438\u0458\u0441\u043a\u0438
languages.la=\u041b\u0430\u0442\u0438\u043d\u0441\u043a\u0438
languages.hy=\u0410\u0440\u043c\u0435\u043d\u0441\u043a\u0438
-languages.ky=\u041a\u0438\u0440\u0433\u0438\u0441\u043a\u0438
languages.eu=\u0411\u0430\u0441\u043a\u0438\u0458\u0441\u043a\u0438
-languages.et=\u0415\u0441\u0442\u043e\u043d\u0441\u043a\u0438
+languages.ky=\u041a\u0438\u0440\u0433\u0438\u0441\u043a\u0438
languages.br=\u0411\u0440\u0435\u0442\u043e\u043d\u0441\u043a\u0438
-languages.hu=\u041c\u0430\u0452\u0430\u0440\u0441\u043a\u0438
+languages.et=\u0415\u0441\u0442\u043e\u043d\u0441\u043a\u0438
languages.es=\u0428\u043f\u0430\u043d\u0441\u043a\u0438
+languages.hu=\u041c\u0430\u0452\u0430\u0440\u0441\u043a\u0438
languages.ku=\u041a\u0443\u0440\u0434\u0441\u043a\u0438
languages.hr=\u0425\u0440\u0432\u0430\u0442\u0441\u043a\u0438
languages.eo=\u0415\u0441\u043f\u0435\u0440\u0430\u043d\u0442\u043e
@@ -368,9 +389,10 @@ languages.en=\u0415\u043d\u0433\u043b\u0435\u0441\u043a\u0438
languages.el=\u0413\u0440\u0447\u043a\u0438
languages.ko=\u041a\u043e\u0440\u0435\u0458\u0441\u043a\u0438
languages.no=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0438
-languages.km=\u041a\u043c\u0435\u0440\u0441\u043a\u0438
languages.bg=\u0411\u0443\u0433\u0430\u0440\u0441\u043a\u0438
+languages.km=\u041a\u043c\u0435\u0440\u0441\u043a\u0438
languages.tr=\u0422\u0443\u0440\u0441\u043a\u0438
languages.be=\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u043a\u0438
+languages.hi=\u0425\u0438\u043d\u0434\u0438
languages.nl=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438
languages.he=\u0425\u0435\u0431\u0440\u0435\u0458\u0441\u043a\u0438
diff --git a/resource/gnu/java/locale/LocaleInformation_sr_BA_Cyrl.properties b/resource/gnu/java/locale/LocaleInformation_sr_BA_Cyrl.properties
new file mode 100644
index 000000000..6d66ad180
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_sr_BA_Cyrl.properties
@@ -0,0 +1,23 @@
+# LocaleInformation_sr_BA_Cyrl.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
+currenciesDisplayName.BAM=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0431\u0438\u043b\u043d\u0430 \u041c\u0430\u0440\u043a\u0430
+currenciesSymbol.BAM=\u041a\u041c.
+shortMonths=\u0408\u0430\u043d®\u0424\u0435\u0431®\u041c\u0430\u0440®\u0410\u043f\u0440®\u041c\u0430\u0458®\u0408\u0443\u043d®\u0408\u0443\u043b®\u0410\u0432\u0433®\u0421\u0435\u043f®\u041e\u043a\u0442®\u041d\u043e\u0432®\u0414\u0435\u0446®®
+months=®®®®®\u0458\u0443\u043d\u0438®\u0458\u0443\u043b\u0438®®®®®®®
+shortWeekdays=®®®®\u0441\u0440\u0438®®®®
+weekdays=®®®®\u0441\u0440\u0438\u0458\u0435\u0434\u0430®®®®
+shortDateFormat=yy-MM-dd
+mediumDateFormat=yyyy-MM-dd
+longDateFormat=dd. MMMM yyyy.
+fullDateFormat=EEEE, dd. MMMM yyyy.
+shortTimeFormat=HH:mm
+mediumTimeFormat=HH:mm:ss
+fullTimeFormat=HH '\u0447\u0430\u0441\u043e\u0432\u0430', mm '\u043c\u0438\u043d\u0443\u0442\u0430', ss' \u0441\u0435\u043a\u0443\u043d\u0434\u0438'
+zoneStrings=Europe/Sarajevo®\u0421\u0440\u0435\u0434\u045a\u0435 \u0415\u0432\u0440\u043e\u043f\u0441\u043a\u043e \u0412\u0440\u0438\u0458\u0435\u043c\u0435®©
+languages.sr=\u0441\u0440\u043f\u0441\u043a\u0438 \u0458\u0435\u0437\u0438\u043a
diff --git a/resource/gnu/java/locale/LocaleInformation_sr_BA_Latn.properties b/resource/gnu/java/locale/LocaleInformation_sr_BA_Latn.properties
new file mode 100644
index 000000000..520636236
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_sr_BA_Latn.properties
@@ -0,0 +1,21 @@
+# LocaleInformation_sr_BA_Latn.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
+currenciesDisplayName.BAM=Konvertibilna Marka
+currenciesSymbol.BAM=KM.
+months=®®®®®juni®juli®®®®®®®
+shortWeekdays=®®®®sri®®®®
+weekdays=®®®®srijeda®®®®
+shortDateFormat=yy-MM-dd
+mediumDateFormat=yyyy-MM-dd
+longDateFormat=dd. MMMM yyyy.
+shortTimeFormat=HH:mm
+mediumTimeFormat=HH:mm:ss
+fullTimeFormat=HH '\u010dasova', mm 'minuta', ss 'sekundi'
+zoneStrings=Europe/Sarajevo®Srednje Evropsko Vrijeme®©
+languages.sh=Srpski jezik
diff --git a/resource/gnu/java/locale/LocaleInformation_sr_Cyrl.properties b/resource/gnu/java/locale/LocaleInformation_sr_Cyrl.properties
new file mode 100644
index 000000000..7769cfe5c
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_sr_Cyrl.properties
@@ -0,0 +1,10 @@
+# LocaleInformation_sr_Cyrl.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currenciesSymbol.CSD=CSD
+currenciesSymbol.CNY=Y
+currenciesSymbol.BRL=R$
diff --git a/resource/gnu/java/locale/LocaleInformation_sr_Latn.properties b/resource/gnu/java/locale/LocaleInformation_sr_Latn.properties
index dac0d6303..8f6a178f0 100644
--- a/resource/gnu/java/locale/LocaleInformation_sr_Latn.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sr_Latn.properties
@@ -5,6 +5,40 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+currenciesDisplayName.GBP=Funta sterlinga
+currenciesDisplayName.CHF=\u0160vajcarski franak
+currenciesDisplayName.HRK=Kuna
+currenciesDisplayName.FRF=Francuski franak
+currenciesDisplayName.IEP=Irska funta
+currenciesDisplayName.INR=Indijski Rupi
+currenciesDisplayName.JPY=Jen
+currenciesDisplayName.HRD=Hrvatski dinar
+currenciesDisplayName.EUR=EVRO
+currenciesDisplayName.ITL=Italijanska lira
+currenciesDisplayName.PTE=Portugalski eskudo
+currenciesDisplayName.AUD=Australijski dolar
+currenciesDisplayName.NOK=Norve\u0161ka kruna
+currenciesDisplayName.DEM=Nema\u010dka marka
+currenciesDisplayName.LUF=Luksembur\u0161ki franak
+currenciesDisplayName.NLG=Holandski gulden
+currenciesDisplayName.BEF=Belgijski franak
+currenciesDisplayName.DKK=Danska kruna
+currenciesDisplayName.RUR=Ruska rublja (1991-1998)
+currenciesDisplayName.KWD=Kuvajtski dinar
+currenciesDisplayName.CNY=Kineski Juan Renminbi
+currenciesDisplayName.ESP=\u0160panska pezeta
+currenciesDisplayName.GRD=Drahma
+currenciesDisplayName.CAD=Kanadski dolar
+currenciesDisplayName.ATS=Austrijski \u0161iling
+currenciesDisplayName.BRL=Brazilski Real
+currenciesDisplayName.SEK=\u0160vedska kruna
+currenciesDisplayName.USD=Ameri\u010dki dolar
+currenciesDisplayName.CSD=Srpski Dinar
+currenciesDisplayName.RUB=Ruska rublja
+currenciesDisplayName.FIM=Finska marka
+currenciesDisplayName.SIT=Tolar
+currenciesDisplayName.BAM=Konvertibilna marka
+currenciesSymbol.CNY=U
currenciesSymbol.YUN=Din
shortMonths=jan®feb®mar®apr®maj®jun®jul®avg®sep®okt®nov®dec®®
months=januar®februar®mart®april®maj®jun®jul®avgust®septembar®oktobar®novembar®decembar®®
@@ -13,7 +47,7 @@ weekdays=®nedelja®ponedeljak®utorak®sreda®\u010detvrtak®petak®subota®
eras=p. n. e.®n. e.®
longDateFormat=EEEE, d.MM.yyyy.
fullDateFormat=EEEE, dd. MMMM yyyy.
-zoneStrings=Europe/Belgrade®Centralno Evropsko Vreme®Centralno Evropsko Letnje Vreme®©
+zoneStrings=Europe/Belgrade®Centralno Evropsko Vreme®Centralno Evropsko Vreme®©
territories.TL=Timor-Leste
territories.TK=Tokelau
territories.TJ=Tad\u017eikistan
@@ -36,7 +70,9 @@ territories.GN=Gvineja
territories.GM=Gambija
territories.GL=Grenland
territories.SV=Salvador
+territories.062=Ju\u017eno-centralna Azija
territories.ST=Sao Tome i Principe
+territories.061=Polinezija
territories.GI=Gibraltar
territories.GH=Gana
territories.SR=Surinam
@@ -50,20 +86,23 @@ territories.GB=Velika Britanija
territories.SL=Sijera Leone
territories.GA=Gabon
territories.SK=Slova\u010dka
-territories.SJ=Svalbard i Jan Majen
+territories.SJ=Svalbard i Janmajen Ostrva
territories.SI=Slovenija
-territories.SH=Saint Helena
+territories.SH=Sveta Jelena
territories.SG=Singapur
territories.SE=\u0160vedska
territories.SD=Sudan
territories.SC=Sej\u0161eli
-territories.SB=Solomon Islands
+territories.SB=Solomonska Ostrva
territories.SA=Saudijska Arabija
territories.FR=Francuska
+territories.057=Micronezija
territories.FO=Farska Ostrva
territories.FM=Mikronezija
territories.RW=Ruanda
-territories.FK=Folklendska Ostrva
+territories.054=Melanezija
+territories.053=Australija i Novi Zeland
+territories.FK=Folklandska Ostrva
territories.RU=Rusija
territories.FJ=Fid\u017ei
territories.FI=Finska
@@ -72,20 +111,26 @@ territories.RE=Rejunion
territories.ET=Etiopija
territories.ES=\u0160panija
territories.ER=Eritreja
+territories.833=Ostrvo Man
territories.EH=Zapadna Sahara
territories.EG=Egipat
+territories.830=Kanalska ostrva
territories.EE=Estonija
+territories.QO=Ostala okeanija
territories.EC=Ekvador
territories.DZ=Al\u017eir
territories.QA=Katar
+territories.039=Ju\u017ena Evropa
territories.DO=Dominikanska Republika
territories.PY=Paragvaj
+territories.035=Jugoisto\u010dna Azija
territories.DM=Dominika
territories.PW=Palau
territories.DK=Danska
territories.DJ=D\u017eibuti
territories.PT=Portugal
territories.PS=Palestinska Teritorija
+territories.030=Isto\u010dna Azija
territories.PR=Porto Riko
territories.DE=Nema\u010dka
territories.PN=Pitcairn
@@ -102,13 +147,16 @@ territories.CX=Uskr\u0161nja Ostrva
territories.CV=Kape Verde
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Srbija i Crna Gora
territories.CR=Kostarika
+territories.029=Karibi
territories.CO=Kolumbija
territories.CN=Kina
territories.CM=Kamerun
territories.CL=\u010cile
territories.CK=Kukova Ostrva
territories.CI=Obala Slonova\u010de
+territories.021=Severna Amerika
territories.CH=\u0160vajcarska
territories.CG=Kongo
territories.CF=Centralno Afri\u010dka Republika
@@ -123,13 +171,20 @@ territories.BV=Buve Ostrva
territories.BT=Butan
territories.BS=Bahami
territories.BR=Brazil
+territories.019=Amerike
+territories.018=Ju\u017ena Afrika
territories.NZ=Novi Zeland
territories.BO=Bolivija
+territories.017=Centralna Afrika
territories.BN=Brunej
territories.BM=Bermuda
+territories.015=Severna Afrika
+territories.014=Isto\u010dna Afrika
+territories.013=Centralna Amerika
territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Zapadna Afrika
territories.BH=Bahrein
territories.NR=Nauru
territories.BG=Bugarska
@@ -147,6 +202,7 @@ territories.NG=Nigerija
territories.NF=Norfolk Ostrvo
territories.AZ=Azerbejd\u017ean
territories.NE=Niger
+territories.AX=Alandska ostrva
territories.NC=Nova Kaledonija
territories.AW=Aruba
territories.ZM=Zambija
@@ -155,21 +211,25 @@ territories.AU=Australija
territories.AT=Austrija
territories.AS=Ameri\u010dka Samoa
territories.AR=Argentina
+territories.009=Okeanija
territories.AQ=Antarktika
territories.MZ=Mozambik
territories.AO=Angola
territories.MY=Malezija
territories.AN=Holandski Antili
territories.MX=Meksiko
+territories.005=Ju\u017ena Amerika
territories.AM=Armenija
territories.MW=Malavi
territories.AL=Albanija
territories.MV=Maldivi
territories.ZA=Ju\u017ena Afrika
territories.MU=Mauricius
+territories.002=Afrika
territories.MT=Malta
+territories.001=Svet
territories.AI=Angvila
-territories.MS=Montserrat
+territories.MS=Monserat
territories.MR=Mauritanija
territories.AG=Antigva i Barbuda
territories.MQ=Martinik
@@ -182,8 +242,7 @@ territories.MN=Mongolija
territories.MM=Mijanmar
territories.ML=Mali
territories.MK=Makedonija
-territories.YU=Jugoslavija
-territories.YT=Mayotte
+territories.YT=Majote
territories.MH=Mar\u0161alska Ostrva
territories.MG=Madagaskar
territories.MD=Moldavija
@@ -192,11 +251,15 @@ territories.MA=Maroko
territories.YE=Jemen
territories.LY=Libija
territories.LV=Letonija
+territories.155=Zapadna Evropa
territories.LU=Luksemburg
+territories.154=Severna Evropa
territories.LT=Litvanija
territories.LS=Lesoto
territories.LR=Liberija
-territories.LK=\u0160rilanka
+territories.151=Isto\u010dna Evropa
+territories.150=Evropa
+territories.LK=\u0160ri Lanka
territories.LI=Lihten\u0161tajn
territories.LC=Sent Lucija
territories.LB=Liban
@@ -204,6 +267,8 @@ territories.LA=Laos
territories.KZ=Kazahstan
territories.KY=Kajmanska Ostrva
territories.KW=Kuvajt
+territories.145=Zapadna Azija
+territories.142=Azija
territories.KR=Ju\u017ena Koreja
territories.KP=Severna Koreja
territories.KN=Sent Kits i Nevis
@@ -211,9 +276,9 @@ territories.KM=Komorska Ostrva
territories.KI=Kiribati
territories.WS=Samoa
territories.KH=Kambod\u017ea
-territories.KG=Kirgistan
+territories.KG=Kirgizstan
territories.KE=Kenija
-territories.WF=Valis i Futuna
+territories.WF=Valis i Futuna Ostrva
territories.JP=Japan
territories.JO=Jordan
territories.JM=Jamajka
@@ -276,12 +341,13 @@ languages.sh=Srpsko-Hrvatski
languages.vi=Vijetnamski
languages.ja=Japanski
languages.yi=Jidi\u0161
+languages.sa=Sanskrit
languages.cs=\u010ce\u0161ki
languages.lv=Letonski
-languages.it=Italijanski
languages.fr=Francuski
-languages.is=Islandski
+languages.it=Italijanski
languages.co=Korzikanski
+languages.is=Islandski
languages.lt=Litvanski
languages.ru=Ruski
languages.fi=Finski
@@ -289,25 +355,27 @@ languages.ro=Rumunski
languages.rm=Reto-Romanski
languages.ca=Katalonski
languages.id=Indonezijski
-languages.uk=Ukrajnski
+languages.uk=Ukrajinski
languages.fa=Persijski
languages.la=Latinski
languages.hy=Armenski
-languages.ky=Kirgiski
languages.eu=Baskijski
-languages.et=Estonski
+languages.ky=Kirgiski
languages.br=Bretonski
-languages.hu=Ma\u0111arski
+languages.et=Estonski
languages.es=\u0160panski
+languages.hu=Ma\u0111arski
languages.ku=Kurdski
languages.hr=Hrvatski
+languages.eo=Esperanto
languages.en=Engleski
languages.el=Gr\u010dki
languages.ko=Korejski
languages.no=Norve\u0161ki
-languages.km=Kmerski
languages.bg=Bugarski
+languages.km=Kmerski
languages.tr=Turski
languages.be=Beloruski
+languages.hi=Hindi
languages.nl=Holandski
languages.he=Hebrejski
diff --git a/resource/gnu/java/locale/LocaleInformation_sv.properties b/resource/gnu/java/locale/LocaleInformation_sv.properties
index 81f255cff..5792519c7 100644
--- a/resource/gnu/java/locale/LocaleInformation_sv.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sv.properties
@@ -7,756 +7,363 @@
decimalSeparator=,
groupingSeparator=\u00a0
-currenciesDisplayName.JOD=Jordansk dinar
-currenciesDisplayName.BOV=Boliviansk mvdol
-currenciesDisplayName.FOK=F\u00e4r\u00f6isk krona
-currenciesDisplayName.LBP=Libanesiskt pund
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Vietnamesisk dong
-currenciesDisplayName.TZS=Tanzanisk shilling
-currenciesDisplayName.BOP=Boliviansk peso
-currenciesDisplayName.KHR=Kambodjansk riel
-currenciesDisplayName.KHO=Kambodjansk gammal riel
-currenciesDisplayName.ZMP=Zambiskt pund
-currenciesDisplayName.AUP=Australiskt pund
-currenciesDisplayName.XAF=CFA Franc BEAC
-currenciesDisplayName.MTP=Maltesiskt pund
-currenciesDisplayName.GHR=Ghanansk omv\u00e4rderad cedi
-currenciesDisplayName.ZMK=Zambisk kwacha
-currenciesDisplayName.GHP=Ghananskt pund
-currenciesDisplayName.GHO=Ghanansk gammal cedi
-currenciesDisplayName.MTL=Maltesisk lira
-currenciesDisplayName.AUD=Australisk dollar
-currenciesDisplayName.USS=US-dollar (samma dag)
-currenciesDisplayName.ITL=Italiensk lira
-currenciesDisplayName.USN=US-dollar (n\u00e4sta dag)
-currenciesDisplayName.GHC=Ghanansk cedi
-currenciesDisplayName.SGD=Singaporiansk dollar
-currenciesDisplayName.PAB=Panamansk balboa
-currenciesDisplayName.LAK=Laotisk kip
-currenciesDisplayName.KGS=Kirgizistansk som
-currenciesDisplayName.CHF=Schweizisk franc
-currenciesDisplayName.ATS=\u00d6sterrikisk schilling
-currenciesDisplayName.USD=US-dollar
-currenciesDisplayName.ETD=Etiopisk dollar
-currenciesDisplayName.BND=Bruneisk dollar
-currenciesDisplayName.JMP=Jamaicanskt pund
-currenciesDisplayName.ETB=Etiopisk birr
-currenciesDisplayName.DZG=Algerisk franc germinal
-currenciesDisplayName.DZF=Algerisk ny franc
-currenciesDisplayName.DZD=Algerisk dinar
-currenciesDisplayName.PYG=Paraguaysk guarani
-currenciesDisplayName.LYP=Libyskt pund
-currenciesDisplayName.JMD=Jamaicansk dollar
-currenciesDisplayName.ISK=Isl\u00e4ndsk krona
-currenciesDisplayName.ESP=Spansk peseta
-currenciesDisplayName.BMP=Bermuda-pund
-currenciesDisplayName.LYD=Libysk dinar
-currenciesDisplayName.LYB=Libyska brittiska milit\u00e4rmyndighetens lira
-currenciesDisplayName.BMD=Bermuda-dollar
-currenciesDisplayName.NLG=Nederl\u00e4ndsk gulden
-currenciesDisplayName.MRO=Mauretansk ouguiya
-currenciesDisplayName.IRR=Iransk rial
-currenciesDisplayName.SEK=Svensk krona
-currenciesDisplayName.ERN=Eritreansk nakfa
+currenciesDisplayName.YDD=Jemenitisk dinar
+currenciesDisplayName.TWD=Taiwanesisk ny dollar
currenciesDisplayName.KES=Kenyansk shilling
-currenciesDisplayName.CFF=Centralafrikansk CFA-franc
+currenciesDisplayName.BYB=Vitrysk ny rubel (1994-1999)
+currenciesDisplayName.LKR=Srilankesisk rupie
+currenciesDisplayName.RWF=Rwandisk franc
+currenciesDisplayName.TJS=Tadzjikisk somoni
+currenciesDisplayName.SDP=Sudanesiskt pund
+currenciesDisplayName.TJR=Tadzjikisk rubel
+currenciesDisplayName.ERN=Eritreansk nakfa
+currenciesDisplayName.GRD=Grekisk drachma
+currenciesDisplayName.IEP=Irl\u00e4ndskt pund
currenciesDisplayName.ARS=Argentinsk peso
+currenciesDisplayName.SDD=Sudanesisk dinar
currenciesDisplayName.ARP=Argentinsk peso (1983-1985)
-currenciesDisplayName.ARM=Argentinsk peso \u2013 Moneda nacional
-currenciesDisplayName.TWD=Taiwanesisk ny dollar
-currenciesDisplayName.SDP=Sudanesiskt pund
currenciesDisplayName.GEL=Georgisk lari
currenciesDisplayName.GEK=Georgisk kupon larit
-currenciesDisplayName.MQF=Martiniqueisk franc
+currenciesDisplayName.CRC=Costarikansk col\u00f3n
currenciesDisplayName.FKP=Falklands\u00f6arnas pund
+currenciesDisplayName.EEK=Estnisk krona
+currenciesDisplayName.HKD=Hongkong-dollar
+currenciesDisplayName.MDL=Moldavisk leu
currenciesDisplayName.ARA=Argentinsk austral
-currenciesDisplayName.SDD=Sudanesisk dinar
currenciesDisplayName.IQD=Irakisk dinar
-currenciesDisplayName.TVD=Tuvaluansk dollar
currenciesDisplayName.SCR=Seychellisk rupie
+currenciesDisplayName.VUV=Vanuatisk vatu
+currenciesDisplayName.DKK=Dansk krona
+currenciesDisplayName.KPW=Nordkoreansk won
+currenciesDisplayName.GQE=Ekvatorialguineansk ekwele guineana
+currenciesDisplayName.IDR=Indonesisk rupiah
currenciesDisplayName.LVR=Lettisk rubel
-currenciesDisplayName.FJP=Fijianskt pund
+currenciesDisplayName.SOS=Somalisk shilling
+currenciesDisplayName.AED=F\u00f6renade arabemiratens dirham
+currenciesDisplayName.BWP=Botswansk pula
currenciesDisplayName.LVL=Lettisk lats
-currenciesDisplayName.CDL=Kongolesisk zaire
-currenciesDisplayName.CDG=Kongolesisk franc
-currenciesDisplayName.CDF=Kongolesisk franc congolais
-currenciesDisplayName.FJD=Fijiansk dollar
+currenciesDisplayName.RUR=Rysk rubel (1991-1998)
currenciesDisplayName.NIO=Nicaraguansk c\u00f3rdoba oro
+currenciesDisplayName.ADP=Andorransk peseta
+currenciesDisplayName.FJD=Fijiansk dollar
currenciesDisplayName.MOP=Macaoisk pataca
-currenciesDisplayName.NIG=Nicaraguansk guldc\u00f3rdoba
+currenciesDisplayName.RUB=Rysk rubel
+currenciesDisplayName.CDF=Kongolesisk franc congolais
currenciesDisplayName.NIC=Nicaraguansk c\u00f3rdoba
-currenciesDisplayName.FIN=Finsk mark (1860-1962)
-currenciesDisplayName.FIM=Finsk mark
+currenciesDisplayName.DJF=Djiboutisk franc
+currenciesDisplayName.ECV=Ecuadoriansk Unidad de Valor Constante (UVC)
currenciesDisplayName.SBD=Salomon-dollar
+currenciesDisplayName.UZS=Uzbekisk sum
+currenciesDisplayName.ECS=Ecuadoriansk sucre
+currenciesDisplayName.PHP=Filippinsk peso
+currenciesDisplayName.THB=Thail\u00e4ndsk baht
currenciesDisplayName.LUF=Luxemburgsk franc
-currenciesDisplayName.TTO=Trinidadisk gammal dollar
-currenciesDisplayName.AOS=Angolansk escudo
-currenciesDisplayName.AOR=Angolansk kwanza \u2013 Reajustado (1995-1999)
-currenciesDisplayName.MNT=Mongolisk tugrik
-currenciesDisplayName.HUF=Ungersk forint
-currenciesDisplayName.BIF=Burundisk franc
-currenciesDisplayName.AON=Angolansk ny kwanza (1990-2000)
-currenciesDisplayName.AOK=Angolansk kwanza (1977-1990)
+currenciesDisplayName.FIM=Finsk mark
currenciesDisplayName.TTD=Trinidadisk dollar
currenciesDisplayName.SZL=Swazil\u00e4ndsk lilangeni
-currenciesDisplayName.NHF=Nyhebridisk CFP-franc
-currenciesDisplayName.GBP=Brittiskt pund sterling
-currenciesDisplayName.SAS=Saudisk sovereign riyal
+currenciesDisplayName.MNT=Mongolisk tugrik
currenciesDisplayName.SAR=Saudisk riyal
+currenciesDisplayName.UAK=Ukrainsk karbovanetz
+currenciesDisplayName.UAH=Ukrainsk hryvnia
+currenciesDisplayName.HUF=Ungersk forint
+currenciesDisplayName.COP=Colombiansk peso
+currenciesDisplayName.QAR=Qatarisk rial
currenciesDisplayName.LTT=Lettisk talonas
-currenciesDisplayName.INR=Indisk rupie
currenciesDisplayName.PTE=Portugisisk escudo
-currenciesDisplayName.AOA=Angolansk kwanza
-currenciesDisplayName.PTC=Portugisisk conto
+currenciesDisplayName.AOR=Angolansk kwanza \u2013 Reajustado (1995-1999)
+currenciesDisplayName.UYU=Uruguayansk peso uruguayo
+currenciesDisplayName.GBP=Brittiskt pund sterling
+currenciesDisplayName.BIF=Burundisk franc
+currenciesDisplayName.INR=Indisk rupie
+currenciesDisplayName.ZRZ=Zairisk zaire
+currenciesDisplayName.AON=Angolansk ny kwanza (1990-2000)
currenciesDisplayName.LTL=Lettisk lita
+currenciesDisplayName.XFU=French UIC-Franc
currenciesDisplayName.KZT=Kazakisk tenge
-currenciesDisplayName.KZR=Kazakisk rubel
-currenciesDisplayName.VGD=Jungfru\u00f6isk dollar
-currenciesDisplayName.NGP=Nigerianskt pund
-currenciesDisplayName.MMX=Myanmarisk dollar \u2013 Foreign Exchange Certificates
+currenciesDisplayName.MZM=Mo\u00e7ambikisk metical
+currenciesDisplayName.UYP=Uruguayansk peso (1975-1993)
+currenciesDisplayName.AOK=Angolansk kwanza (1977-1990)
+currenciesDisplayName.BUK=Burmesisk kyat
+currenciesDisplayName.GNS=Guineansk syli
+currenciesDisplayName.XFO=Fransk guldfranc
+currenciesDisplayName.PGK=Papuansk kina
+currenciesDisplayName.SYP=Syriskt pund
+currenciesDisplayName.MZE=Mo\u00e7ambikisk escudo
+currenciesDisplayName.OMR=Omansk rial
currenciesDisplayName.NGN=Nigeriansk naira
+currenciesDisplayName.ZRN=Zairisk ny zaire
+currenciesDisplayName.AOA=Angolansk kwanza
+currenciesDisplayName.CNY=Kinesisk yuan renminbi
+currenciesDisplayName.MAF=Marockansk franc
+currenciesDisplayName.GNF=Guineansk franc
currenciesDisplayName.HTG=Haitisk gourde
-currenciesDisplayName.SYP=Syriskt pund
-currenciesDisplayName.PSP=Palestinskt pund
-currenciesDisplayName.BHD=Bahrainsk dinar
+currenciesDisplayName.MAD=Marockansk dirham
+currenciesDisplayName.TRY=Ny turkisk lira
currenciesDisplayName.MMK=Myanmarisk kyat
+currenciesDisplayName.MYR=Malaysisk ringgit
+currenciesDisplayName.LSL=Lesothisk loti
+currenciesDisplayName.BHD=Bahrainsk dinar
+currenciesDisplayName.SLL=Sierraleonsk leone
+currenciesDisplayName.BTN=Bhutanesisk ngultrum
+currenciesDisplayName.TRL=Turkisk lira
+currenciesDisplayName.KMF=Komorisk franc
currenciesDisplayName.ANG=Nederl\u00e4ndsk antillisk gulden
currenciesDisplayName.CZK=Tjeckisk koruna
-currenciesDisplayName.IMP=Isle of Man-pund sterling
-currenciesDisplayName.BGX=Bulgarisk lev \u2013 Foreign Exchange Certificates
-currenciesDisplayName.LSL=Lesothisk loti
-currenciesDisplayName.GAF=Gabonesisk CFA-franc
-currenciesDisplayName.BGO=Bulgarisk lev (1879-1952)
+currenciesDisplayName.AZM=Azerbajdzjansk manat
+currenciesDisplayName.KYD=Cayman-dollar
+currenciesDisplayName.GMD=Gambisk dalasi
currenciesDisplayName.BGN=Bulgarisk ny lev
-currenciesDisplayName.BGM=Bulgarisk socialistisk lev
currenciesDisplayName.CAD=Kanadensisk dollar
+currenciesDisplayName.MXV=Mexikansk Unidad de Inversion (UDI)
currenciesDisplayName.BGL=Bulgarisk h\u00e5rd lev
-currenciesDisplayName.TRL=Turkisk lira
-currenciesDisplayName.KYD=Cayman-dollar
-currenciesDisplayName.CYP=Cypriotiskt pund
+currenciesDisplayName.VEB=Venezuelansk bolivar
+currenciesDisplayName.MLF=Malisk franc
currenciesDisplayName.ILS=Israelisk ny shekel
+currenciesDisplayName.MXP=Mexikansk silverpeso (1861-1992)
+currenciesDisplayName.PES=Peruansk sol
currenciesDisplayName.GYD=Guyanansk dollar
-currenciesDisplayName.AMD=Armenisk dram
+currenciesDisplayName.MXN=Mexikansk peso
currenciesDisplayName.ILP=Israeliskt pund
-currenciesDisplayName.MLF=Malisk franc
-currenciesDisplayName.ILL=Israelisk shekel
-currenciesDisplayName.VEB=Venezuelansk bolivar
-currenciesDisplayName.ALX=Albansk dollar \u2013 Foreign Exchange Certificates)
+currenciesDisplayName.SKK=Slovakisk koruna
+currenciesDisplayName.CYP=Cypriotiskt pund
+currenciesDisplayName.PEN=Peruansk sol nuevo
currenciesDisplayName.LRD=Liberisk dollar
-currenciesDisplayName.ALV=Albansk lek \u2013 Valute)
+currenciesDisplayName.PEI=Peruansk inti
+currenciesDisplayName.AMD=Armenisk dram
+currenciesDisplayName.BSD=Bahamansk dollar
currenciesDisplayName.HRK=Kroatisk kuna
-currenciesDisplayName.REF=R\u00e9union-franc
+currenciesDisplayName.CLP=Chilensk peso
currenciesDisplayName.HRD=Kroatisk dinar
-currenciesDisplayName.ALL=Albansk lek
-currenciesDisplayName.JEP=Jersey-pund sterling
-currenciesDisplayName.ALK=Albansk lek (1946-1961)
-currenciesDisplayName.MKN=Makedonisk denar (1992-1993)
-currenciesDisplayName.VDP=Nordvietnamesisk viet minh piastre dong viet
-currenciesDisplayName.VDN=Nordvietnamesisk ny dong
-currenciesDisplayName.MKD=Makedonisk denar
-currenciesDisplayName.VDD=Nordvietnamesisk piastre dong viet
-currenciesDisplayName.TPP=Timoriansk pataca
currenciesDisplayName.XPF=CFP-franc
-currenciesDisplayName.BEL=Belgisk franc (finansiell)
-currenciesDisplayName.GWP=Guinea-Bissau-peso
-currenciesDisplayName.KWD=Kuwaitisk dinar
-currenciesDisplayName.GWM=Portugisiska Guinea-mil reis
-currenciesDisplayName.BEF=Belgisk franc
+currenciesDisplayName.FRF=Fransk franc
+currenciesDisplayName.BRR=Brasiliansk cruzeiro
+currenciesDisplayName.MKD=Makedonisk denar
+currenciesDisplayName.CLF=Chilensk unidad de fomento
+currenciesDisplayName.ALL=Albansk lek
+currenciesDisplayName.BRN=Brasiliansk cruzado novo
+currenciesDisplayName.MWK=Malawisk kwacha
+currenciesDisplayName.BRL=Brasiliansk real
currenciesDisplayName.TPE=Timoriansk escudo
-currenciesDisplayName.BEC=Belgisk franc (konvertibel)
-currenciesDisplayName.GWE=Portugisiska Guinea-escudo
+currenciesDisplayName.BRE=Brasiliansk cruzeiro (1990-1993)
+currenciesDisplayName.BRC=Brasiliansk cruzado
+currenciesDisplayName.BRB=Brasiliansk cruzeiro novo (1967-1986)
+currenciesDisplayName.DEM=Tysk mark
+currenciesDisplayName.KWD=Kuwaitisk dinar
+currenciesDisplayName.XCD=\u00d6stkaribisk dollar
+currenciesDisplayName.NPR=Nepalesisk rupie
+currenciesDisplayName.GWP=Guinea-Bissau-peso
+currenciesDisplayName.YUN=Jugoslavisk konvertibel dinar
currenciesDisplayName.SVC=Salvadoransk col\u00f3n
-currenciesDisplayName.CWG=Cura\u00e7ao-gulden
-currenciesDisplayName.BDT=Bangladeshisk taka
-currenciesDisplayName.TOS=Tonganskt pund sterling
-currenciesDisplayName.TOP=Tongansk pa\u02bbanga
+currenciesDisplayName.YUM=Dinar (Serbien och Montenegro)
+currenciesDisplayName.BEL=Belgisk franc (finansiell)
+currenciesDisplayName.SIT=Slovensk tolar
+currenciesDisplayName.JPY=Japansk yen
currenciesDisplayName.XOF=CFA Franc BCEAO
+currenciesDisplayName.MVR=Maldivisk rufiyaa
+currenciesDisplayName.GWE=Portugisiska Guinea-escudo
+currenciesDisplayName.BEF=Belgisk franc
+currenciesDisplayName.TOP=Tongansk pa\u02bbanga
+currenciesDisplayName.YUD=Jugoslavisk h\u00e5rd dinar
+currenciesDisplayName.BEC=Belgisk franc (konvertibel)
currenciesDisplayName.SUR=Sovjetisk rubel
-currenciesDisplayName.SUN=Sovjetisk ny rubel
-currenciesDisplayName.NCF=Nykaledonsk franc germinal
-currenciesDisplayName.CVE=Kapverdisk escudo
-currenciesDisplayName.XNF=Fransk Antillisk CFA-franc
+currenciesDisplayName.ROL=Rum\u00e4nsk leu
+currenciesDisplayName.DDM=\u00d6sttysk mark
+currenciesDisplayName.BDT=Bangladeshisk taka
+currenciesDisplayName.AWG=Aruba-florin
+currenciesDisplayName.NOK=Norsk krona
+currenciesDisplayName.MUR=Mauritisk rupie
currenciesDisplayName.ZAR=Sydafrikansk rand
-currenciesDisplayName.DOP=Dominikansk peso
-currenciesDisplayName.CUX=Kubansk Foreign Exchange Certificates
-currenciesDisplayName.ZAP=Sydafrikansk rand
+currenciesDisplayName.SHP=S:t Helena-pund
currenciesDisplayName.ZAL=Sydafrikansk rand (finansiell)
+currenciesDisplayName.VND=Vietnamesisk dong
+currenciesDisplayName.TZS=Tanzanisk shilling
+currenciesDisplayName.GIP=Gibraltiskt pund
currenciesDisplayName.TND=Tunisisk dinar
-currenciesDisplayName.CUP=Kubansk peso
-currenciesDisplayName.GUF=Franska Guyanas Franc Guiana
+currenciesDisplayName.CVE=Kapverdisk escudo
currenciesDisplayName.UGX=Ugandisk shilling
-currenciesDisplayName.LNR=Ceylonesisk rupie
-currenciesDisplayName.AIF=Affars och Issas-franc
-currenciesDisplayName.VAL=Vatikansk lira
-currenciesDisplayName.STE=S\u00e3o Tom\u00e9 och Pr\u00edncipe-escudo
+currenciesDisplayName.ZMK=Zambisk kwacha
+currenciesDisplayName.JOD=Jordansk dinar
+currenciesDisplayName.XAF=CFA Franc BEAC
+currenciesDisplayName.LBP=Libanesiskt pund
currenciesDisplayName.UGS=Ugandisk shilling (1966-1987)
currenciesDisplayName.STD=S\u00e3o Tom\u00e9 och Pr\u00edncipe-dobra
-currenciesDisplayName.MHD=Marshall\u00f6isk dollar
-currenciesDisplayName.NZP=Nyzeel\u00e4ndskt pund
currenciesDisplayName.WST=V\u00e4stsamoansk tala
-currenciesDisplayName.WSP=V\u00e4stsamoanskt pund
-currenciesDisplayName.HNL=Hoduransk lempira
-currenciesDisplayName.XMF=French Metropolitan Nouveau Franc
+currenciesDisplayName.KHR=Kambodjansk riel
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Dominikansk peso
+currenciesDisplayName.BOV=Boliviansk mvdol
+currenciesDisplayName.MTP=Maltesiskt pund
+currenciesDisplayName.USS=US-dollar (samma dag)
+currenciesDisplayName.BOP=Boliviansk peso
+currenciesDisplayName.MTL=Maltesisk lira
+currenciesDisplayName.CUP=Kubansk peso
currenciesDisplayName.TMM=Turkmensk manat
-currenciesDisplayName.GTQ=Guatemalansk quetzal
+currenciesDisplayName.USN=US-dollar (n\u00e4sta dag)
+currenciesDisplayName.SGD=Singaporiansk dollar
currenciesDisplayName.NZD=Nyzeel\u00e4ndsk dollar
-currenciesDisplayName.SSP=Skotskt pund
-currenciesDisplayName.BBD=Barbadisk dollar
+currenciesDisplayName.USD=US-dollar
+currenciesDisplayName.HNL=Hoduransk lempira
+currenciesDisplayName.ITL=Italiensk lira
+currenciesDisplayName.PAB=Panamansk balboa
+currenciesDisplayName.GTQ=Guatemalansk quetzal
+currenciesDisplayName.LAK=Laotisk kip
+currenciesDisplayName.GHC=Ghanansk cedi
+currenciesDisplayName.AUD=Australisk dollar
currenciesDisplayName.NAD=Namibisk dollar
+currenciesDisplayName.KGS=Kirgizistansk som
currenciesDisplayName.MGF=Madagaskisk franc
+currenciesDisplayName.CHF=Schweizisk franc
+currenciesDisplayName.BBD=Barbadisk dollar
currenciesDisplayName.MGA=Madagaskisk ariary
-currenciesDisplayName.EGP=Egyptiskt pund
-currenciesDisplayName.BZH=Brittiska Honduras-dollar
+currenciesDisplayName.PYG=Paraguaysk guarani
currenciesDisplayName.PLZ=Polsk zloty (1950-1995)
-currenciesDisplayName.BAN=Bosnisk-hercegovinsk ny dinar
-currenciesDisplayName.PLX=Polsk US-dollar Foreign Exchange Certificates
-currenciesDisplayName.BAM=Konvertibel bosnisk-hercegovinsk mark
-currenciesDisplayName.BZD=Belizisk dollar
-currenciesDisplayName.BAD=Bosnisk-hercegovinsk dinar
-currenciesDisplayName.PLN=Polsk zloty
currenciesDisplayName.YER=Jemenitisk rial
+currenciesDisplayName.ATS=\u00d6sterrikisk schilling
+currenciesDisplayName.ETB=Etiopisk birr
+currenciesDisplayName.BND=Bruneisk dollar
+currenciesDisplayName.JMD=Jamaicansk dollar
+currenciesDisplayName.EGP=Egyptiskt pund
+currenciesDisplayName.PLN=Polsk zloty
+currenciesDisplayName.DZD=Algerisk dinar
+currenciesDisplayName.ISK=Isl\u00e4ndsk krona
currenciesDisplayName.SRG=Surinamesisk gulden
-currenciesDisplayName.CSK=Tjeckisk h\u00e5rd koruna
+currenciesDisplayName.LYD=Libysk dinar
+currenciesDisplayName.BZD=Belizisk dollar
+currenciesDisplayName.BAM=Konvertibel bosnisk-hercegovinsk mark
+currenciesDisplayName.ESP=Spansk peseta
currenciesDisplayName.KRW=Sydkoreansk won
+currenciesDisplayName.NLG=Nederl\u00e4ndsk gulden
+currenciesDisplayName.MRO=Mauretansk ouguiya
+currenciesDisplayName.BAD=Bosnisk-hercegovinsk dinar
+currenciesDisplayName.ZWD=Zimbabwisk dollar
+currenciesDisplayName.SEK=Svensk krona
+currenciesDisplayName.CSK=Tjeckisk h\u00e5rd koruna
currenciesDisplayName.BYR=Vitrysk rubel
-currenciesDisplayName.YEI=Jemenitisk imadi riyal
-currenciesDisplayName.BYL=Vitrysk rubel (1992-1994)
-currenciesDisplayName.CSC=Tjeckisk koruna
-currenciesDisplayName.KRO=Sydkoreansk gammal won
-currenciesDisplayName.KRH=Sydkoreansk hwan
-currenciesDisplayName.BYB=Vitrysk ny rubel (1994-1999)
-currenciesDisplayName.SQS=Somalil\u00e4ndsk shilling
-currenciesDisplayName.GRN=Grekisk ny drachma
+currenciesDisplayName.IRR=Iransk rial
currenciesDisplayName.PKR=Pakistansk rupie
-currenciesDisplayName.ZWD=Zimbabwisk dollar
-currenciesDisplayName.LKR=Srilankesisk rupie
-currenciesDisplayName.GRD=Grekisk drachma
-currenciesDisplayName.IEP=Irl\u00e4ndskt pund
-currenciesDisplayName.YDD=Jemenitisk dinar
-currenciesDisplayName.RWF=Rwandisk franc
-currenciesDisplayName.CRC=Costarikansk col\u00f3n
-currenciesDisplayName.TJS=Tadzjikisk somoni
-currenciesDisplayName.TJR=Tadzjikisk rubel
-currenciesDisplayName.EEK=Estnisk krona
-currenciesDisplayName.GQP=Ekvatorialguineansk peseta guineana
-currenciesDisplayName.MDR=Moldavisk rubelkupong
-currenciesDisplayName.HKD=Hongkong-dollar
-currenciesDisplayName.DKK=Dansk krona
-currenciesDisplayName.MDL=Moldavisk leu
-currenciesDisplayName.GQF=Ekvatorialguineansk franco
-currenciesDisplayName.GQE=Ekvatorialguineansk ekwele guineana
-currenciesDisplayName.IDR=Indonesisk rupiah
-currenciesDisplayName.AED=F\u00f6renade arabemiratens dirham
-currenciesDisplayName.KPW=Nordkoreansk won
-currenciesDisplayName.IDN=Indonesisk ny rupiah
-currenciesDisplayName.BWP=Botswansk pula
-currenciesDisplayName.MDC=Moldavisk leu-kupong
-currenciesDisplayName.IDJ=Indonesisk java rupiah
-currenciesDisplayName.KPP=Nordkoreansk won
-currenciesDisplayName.IDG=Indonesisk nica gulden
-currenciesDisplayName.VUV=Vanuatisk vatu
-currenciesDisplayName.XID=Islamisk dinar
-currenciesDisplayName.SOS=Somalisk shilling
-currenciesDisplayName.ADP=Andorransk peseta
-currenciesDisplayName.RUR=Rysk rubel (1991-1998)
-currenciesDisplayName.GPF=Guadeloupisk franc
-currenciesDisplayName.DJF=Djiboutisk franc
-currenciesDisplayName.ADD=Andorransk diner
-currenciesDisplayName.MCG=Monegaskisk franc germinal
-currenciesDisplayName.MCF=Monegaskisk franc nouveau
-currenciesDisplayName.ECV=Ecuadoriansk Unidad de Valor Constante (UVC)
-currenciesDisplayName.ECS=Ecuadoriansk sucre
-currenciesDisplayName.LIF=Liechtensteinsk franc
-currenciesDisplayName.RUB=Rysk rubel
-currenciesDisplayName.PHP=Filippinsk peso
-currenciesDisplayName.UZS=Uzbekisk sum
-currenciesDisplayName.COP=Colombiansk peso
-currenciesDisplayName.THB=Thail\u00e4ndsk baht
-currenciesDisplayName.IBP=Nordirl\u00e4ndskt pund
-currenciesDisplayName.BUR=Burmesisk rupee
-currenciesDisplayName.COF=Kongolesisk CFA-franc
-currenciesDisplayName.BUK=Burmesisk kyat
-currenciesDisplayName.COB=Colombiansk papperspeso
-currenciesDisplayName.UZC=Uzbekisk coupon som
-currenciesDisplayName.UAK=Ukrainsk karbovanetz
-currenciesDisplayName.QAR=Qatarisk rial
-currenciesDisplayName.UAH=Ukrainsk hryvnia
-currenciesDisplayName.GNS=Guineansk syli
-currenciesDisplayName.CNY=Kinesisk yuan renminbi
-currenciesDisplayName.MZM=Mo\u00e7ambikisk metical
-currenciesDisplayName.CNX=Kinesisk USA-dollar Foreign Exchange Certificates
-currenciesDisplayName.UYU=Uruguayansk peso uruguayo
-currenciesDisplayName.GNI=Guineansk franc (1960-1972)
-currenciesDisplayName.SML=Sanmarinsk lira
-currenciesDisplayName.MZE=Mo\u00e7ambikisk escudo
-currenciesDisplayName.CNP=Kinesisk jen min piao yuan
-currenciesDisplayName.PGK=Papuansk kina
-currenciesDisplayName.OMS=Omansk rial saidi
-currenciesDisplayName.GNF=Guineansk franc
-currenciesDisplayName.OMR=Omansk rial
-currenciesDisplayName.UYP=Uruguayansk peso (1975-1993)
-currenciesDisplayName.XFU=French UIC-Franc
-currenciesDisplayName.BTR=Bhutanesisk rupie
-currenciesDisplayName.ZRZ=Zairisk zaire
-currenciesDisplayName.MAF=Marockansk franc
-currenciesDisplayName.MAD=Marockansk dirham
-currenciesDisplayName.BTN=Bhutanesisk ngultrum
-currenciesDisplayName.XFO=Fransk guldfranc
-currenciesDisplayName.UYF=Uruguayansk peso fuerte
-currenciesDisplayName.MYR=Malaysisk ringgit
-currenciesDisplayName.ZRN=Zairisk ny zaire
-currenciesDisplayName.AZM=Azerbajdzjansk manat
-currenciesDisplayName.GMP=Gambiskt pund
-currenciesDisplayName.KMF=Komorisk franc
-currenciesDisplayName.SLL=Sierraleonsk leone
-currenciesDisplayName.GMD=Gambisk dalasi
-currenciesDisplayName.BSP=Bahamanskt pund
-currenciesDisplayName.CMF=Kamerunsk CFA-franc
-currenciesDisplayName.MXV=Mexikansk Unidad de Inversion (UDI)
-currenciesDisplayName.XEF=CFA Franc BCEAEC
-currenciesDisplayName.BSD=Bahamansk dollar
-currenciesDisplayName.MXP=Mexikansk silverpeso (1861-1992)
-currenciesDisplayName.MXN=Mexikansk peso
-currenciesDisplayName.PES=Peruansk sol
-currenciesDisplayName.GLK=Gr\u00f6nl\u00e4ndsk krona
-currenciesDisplayName.BRZ=Brasiliansk cruzeiro (1942-1967)
-currenciesDisplayName.PEN=Peruansk sol nuevo
-currenciesDisplayName.CLP=Chilensk peso
-currenciesDisplayName.SKK=Slovakisk koruna
-currenciesDisplayName.PEI=Peruansk inti
-currenciesDisplayName.BRR=Brasiliansk cruzeiro
-currenciesDisplayName.FRG=Fransk Franc Germinal/Franc Poincare
-currenciesDisplayName.FRF=Fransk franc
-currenciesDisplayName.BRN=Brasiliansk cruzado novo
-currenciesDisplayName.CLF=Chilensk unidad de fomento
-currenciesDisplayName.CLE=Chilensk escudo
-currenciesDisplayName.BRL=Brasiliansk real
-currenciesDisplayName.CLC=Chilensk condor
-currenciesDisplayName.BRE=Brasiliansk cruzeiro (1990-1993)
-currenciesDisplayName.DES=Tysk sperrmark
-currenciesDisplayName.MWP=Malawiskt pund
-currenciesDisplayName.BRC=Brasiliansk cruzado
-currenciesDisplayName.BRB=Brasiliansk cruzeiro novo (1967-1986)
-currenciesDisplayName.MWK=Malawisk kwacha
-currenciesDisplayName.PDR=Transdniestrisk rubel
-currenciesDisplayName.DEM=Tysk mark
-currenciesDisplayName.TDF=Tchadisk CFA-franc
-currenciesDisplayName.PDN=Transdniestrisk ny rubel
-currenciesDisplayName.PDK=Transdniestrisk rubelkupong
-currenciesDisplayName.NPR=Nepalesisk rupie
-currenciesDisplayName.CKD=Cook-dollar
-currenciesDisplayName.JPY=Japansk yen
-currenciesDisplayName.MVR=Maldivisk rufiyaa
-currenciesDisplayName.XCF=CFA Nouveau Franc
-currenciesDisplayName.MVP=Maldivisk rupie
-currenciesDisplayName.XCD=\u00d6stkaribisk dollar
-currenciesDisplayName.SIT=Slovensk tolar
-currenciesDisplayName.YUR=Jugoslavisk reformerad dinar
-currenciesDisplayName.AWG=Aruba-florin
-currenciesDisplayName.YUO=Jugoslavisk oktoberdinar
-currenciesDisplayName.DDM=\u00d6sttysk mark
-currenciesDisplayName.YUN=Jugoslavisk konvertibel dinar
-currenciesDisplayName.YUM=Dinar (Serbien och Montenegro)
-currenciesDisplayName.TCC=Turks and Caicos-crown
-currenciesDisplayName.YUG=Jugoslavisk dinar (1994)
-currenciesDisplayName.YUF=Jugoslavisk federationsdinar
-currenciesDisplayName.RON=Rum\u00e4nsk ny leu
-currenciesDisplayName.YUD=Jugoslavisk h\u00e5rd dinar
-currenciesDisplayName.ROL=Rum\u00e4nsk leu
-currenciesDisplayName.SIB=Slovensk tolar bons
-currenciesDisplayName.NOK=Norsk krona
-currenciesDisplayName.MUR=Mauritisk rupie
-currenciesDisplayName.GIP=Gibraltiskt pund
-currenciesDisplayName.VNS=Vietnamesisk nationell dong
-currenciesDisplayName.VNR=Vietnamesisk dong
-currenciesDisplayName.KID=Kiribatisk dollar
-currenciesDisplayName.SHP=S:t Helena-pund
-currenciesDisplayName.VNN=Vietnamesisk ny dong
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.GHP=GHP
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=kr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Bermuda-dollar
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.BAD=BAD
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
currenciesSymbol.GNF=GF
-currenciesSymbol.UYP=UYP
-currenciesSymbol.OMR=RO
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=kr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.VNR=VNR
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.KYD=KYD
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=jan®feb®mar®apr®maj®jun®jul®aug®sep®okt®nov®dec®®
months=januari®februari®mars®april®maj®juni®juli®augusti®september®oktober®november®december®®
-shortWeekdays=®s\u00f6®m\u00e5®ti®on®to®fr®l\u00f6®
+shortWeekdays=®s\u00f6n®m\u00e5n®tis®ons®tors®fre®l\u00f6r®
weekdays=®s\u00f6ndag®m\u00e5ndag®tisdag®onsdag®torsdag®fredag®l\u00f6rdag®
minNumberOfDaysInFirstWeek=4
firstDayOfWeek=mon
eras=f.Kr.®e.Kr.®
ampms=f.m.®e.m.®
shortDateFormat=yyyy-MM-dd
-mediumDateFormat=yyyy-MM-dd
-longDateFormat='den 'd MMM yyyy
-fullDateFormat='den 'd MMMM yyyy
+mediumDateFormat=d MMM yyyy
+longDateFormat=EEEE d MMM yyyy
+fullDateFormat=EEEE d MMMM yyyy
shortTimeFormat=HH.mm
mediumTimeFormat=HH.mm.ss
longTimeFormat=HH.mm.ss z
fullTimeFormat='kl. 'HH.mm.ss z
-zoneStrings=America/Indianapolis®EST®Eastern, normaltid®EST®Eastern, normaltid®©America/Halifax®AST®Atlantic, normaltid®ADT®Atlantic, sommartid®©Pacific/Honolulu®HST®Hawaii, normaltid®HST®Hawaii, normaltid®©America/Denver®MST®Mountain, normaltid®MDT®Mountain, sommartid®©America/Anchorage®AST®Alaska, normaltid®ADT®Alaska, sommartid®©America/St_Johns®CNT®Newfoundland, normaltid®CDT®Newfoundland, sommartid®©Africa/Casablanca®GMT®Greenwichtid®GMT®Greenwichtid®©America/Chicago®CST®Central, normaltid®CDT®Central, sommartid®©Asia/Shanghai®CTT®Kina, normaltid®CDT®Kina, normaltid®©Asia/Tokyo®JST®Japan, normaltid®JST®Japan, normaltid®©America/New_York®EST®Eastern, normaltid®EDT®Eastern, sommartid®©Europe/Bucharest®EET®\u00d6steuropa, normaltid®EEST®\u00d6steuropa, sommartid®©America/Los_Angeles®PST®Pacific, normaltid®PDT®Pacific, sommartid®©America/Phoenix®MST®Mountain, normaltid®MST®Mountain, sommartid®©Etc/GMT®GMT®Greenwichtid®GMT®Greenwichtid®©Asia/Jerusalem®IST®Israel, normaltid®IDT®Israel, sommartid®©Europe/Paris®CET®Centraleuropa, normaltid®CEST®Centraleuropa, sommartid®©
+zoneStrings=Pacific/Honolulu®HST®Hawaii, normaltid®HST®Hawaii, normaltid®©Europe/Bucharest®EET®\u00d6steuropa, normaltid®EEST®\u00d6steuropa, sommartid®©America/Los_Angeles®PST®Pacific, normaltid®PDT®Pacific, sommartid®©America/Denver®MST®Mountain, normaltid®MDT®Mountain, sommartid®©Asia/Jerusalem®IST®Israel, normaltid®IDT®Israel, sommartid®©America/Phoenix®MST®Mountain, normaltid®MST®Mountain, sommartid®©America/Chicago®CST®Central, normaltid®CDT®Central, sommartid®©America/Indianapolis®EST®Eastern, normaltid®EST®Eastern, normaltid®©America/St_Johns®CNT®Newfoundland, normaltid®CDT®Newfoundland, sommartid®©America/Anchorage®AST®Alaska, normaltid®ADT®Alaska, sommartid®©Asia/Shanghai®CTT®Kina, normaltid®CDT®Kina, normaltid®©Asia/Tokyo®JST®Japan, normaltid®JST®Japan, normaltid®©Europe/Paris®CET®Centraleuropa, normaltid®CEST®Centraleuropa, sommartid®©America/New_York®EST®Eastern, normaltid®EDT®Eastern, sommartid®©America/Halifax®AST®Atlantic, normaltid®ADT®Atlantic, sommartid®©Africa/Casablanca®GMT®Greenwichtid®GMT®Greenwichtid®©
territories.TL=\u00d6sttimor
-territories.TK=Tokelau\u00f6arna
+territories.TK=Tokelau
territories.TJ=Tadzjikistan
territories.TH=Thailand
territories.TG=Togo
-territories.TF=Franska Sydterritorierna
+territories.TF=Franska s\u00f6dra territorierna
territories.GY=Guyana
territories.TD=Tchad
territories.TC=Turks- och Caicos\u00f6arna
@@ -773,7 +380,9 @@ territories.GN=Guinea
territories.GM=Gambia
territories.GL=Gr\u00f6nland
territories.SV=El Salvador
+territories.062=S\u00f6dra Centralasien
territories.ST=S\u00e3o Tom\u00e9 och Pr\u00edncipe
+territories.061=Polynesien
territories.GI=Gibraltar
territories.GH=Ghana
territories.SR=Surinam
@@ -797,9 +406,12 @@ territories.SC=Seychellerna
territories.SB=Salomon\u00f6arna
territories.SA=Saudiarabien
territories.FR=Frankrike
+territories.057=Mikronesien
territories.FO=F\u00e4r\u00f6arna
territories.FM=Mikronesien
territories.RW=Rwanda
+territories.054=Melanesien
+territories.053=Australien och Nya Zeeland
territories.FK=Falklands\u00f6arna
territories.RU=Ryssland
territories.FJ=Fiji
@@ -809,20 +421,26 @@ territories.RE=R\u00e9union
territories.ET=Etiopien
territories.ES=Spanien
territories.ER=Eritrea
+territories.833=Isle of Man
territories.EH=V\u00e4stra Sahara
territories.EG=Egypten
+territories.830=Kanal\u00f6arna
territories.EE=Estland
+territories.QO=Yttre \u00f6ar i Oceanien
territories.EC=Ecuador
territories.DZ=Algeriet
territories.QA=Qatar
+territories.039=Sydeuropa
territories.DO=Dominikanska republiken
territories.PY=Paraguay
+territories.035=Sydostasien
territories.DM=Dominica
territories.PW=Palau
territories.DK=Danmark
territories.DJ=Djibouti
territories.PT=Portugal
territories.PS=Palestinska territoriet
+territories.030=Ostasien
territories.PR=Puerto Rico
territories.DE=Tyskland
territories.PN=Pitcairn
@@ -839,17 +457,20 @@ territories.CX=Jul\u00f6n
territories.CV=Kap Verde
territories.PA=Panama
territories.CU=Kuba
+territories.CS=Serbien och Montenegro
territories.CR=Costa Rica
+territories.029=Karibien
territories.CO=Colombia
territories.CN=Kina
territories.CM=Kamerun
territories.CL=Chile
territories.CK=Cook\u00f6arna
territories.CI=Elfenbenskusten
+territories.021=Nordamerika
territories.CH=Schweiz
-territories.CG=Kongo-Brazzaville
+territories.CG=Kongo
territories.CF=Centralafrikanska republiken
-territories.CD=Kongo-Kinshasa
+territories.CD=Demokratiska republiken Kongo
territories.CC=Kokos\u00f6arna (Keeling\u00f6arna)
territories.OM=Oman
territories.CA=Kanada
@@ -860,13 +481,20 @@ territories.BV=Bouvet\u00f6n
territories.BT=Bhutan
territories.BS=Bahamas
territories.BR=Brasilien
+territories.019=Nord- och Sydamerika
+territories.018=S\u00f6dra Afrika
territories.NZ=Nya Zeeland
territories.BO=Bolivia
+territories.017=Centralafrika
territories.BN=Brunei
territories.BM=Bermuda
-territories.NU=Niue\u00f6n
+territories.015=Nordafrika
+territories.014=\u00d6stafrika
+territories.013=Centralamerika
+territories.NU=Niue
territories.BJ=Benin
territories.BI=Burundi
+territories.011=V\u00e4stafrika
territories.BH=Bahrain
territories.NR=Nauru
territories.BG=Bulgarien
@@ -884,6 +512,7 @@ territories.NG=Nigeria
territories.NF=Norfolk\u00f6n
territories.AZ=Azerbajdzjan
territories.NE=Niger
+territories.AX=\u00c5land
territories.NC=Nya Kaledonien
territories.AW=Aruba
territories.ZM=Zambia
@@ -892,19 +521,23 @@ territories.AU=Australien
territories.AT=\u00d6sterrike
territories.AS=Amerikanska Samoa
territories.AR=Argentina
+territories.009=Oceanien
territories.AQ=Antarktis
territories.MZ=Mo\u00e7ambique
territories.AO=Angola
territories.MY=Malaysia
territories.AN=Nederl\u00e4ndska Antillerna
territories.MX=Mexiko
+territories.005=Sydamerika
territories.AM=Armenien
territories.MW=Malawi
territories.AL=Albanien
territories.MV=Maldiverna
territories.ZA=Sydafrika
territories.MU=Mauritius
+territories.002=Afrika
territories.MT=Malta
+territories.001=V\u00e4rlden
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Mauretanien
@@ -919,7 +552,6 @@ territories.MN=Mongoliet
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Makedonien
-territories.YU=Jugoslavien
territories.YT=Mayotte
territories.MH=Marshall\u00f6arna
territories.MG=Madagaskar
@@ -929,10 +561,14 @@ territories.MA=Marocko
territories.YE=Jemen
territories.LY=Libyen
territories.LV=Lettland
+territories.155=V\u00e4steuropa
territories.LU=Luxemburg
+territories.154=Nordeuropa
territories.LT=Litauen
territories.LS=Lesotho
territories.LR=Liberia
+territories.151=\u00d6steuropa
+territories.150=Europa
territories.LK=Sri Lanka
territories.LI=Liechtenstein
territories.LC=S:t Lucia
@@ -941,6 +577,8 @@ territories.LA=Laos
territories.KZ=Kazakstan
territories.KY=Cayman\u00f6arna
territories.KW=Kuwait
+territories.145=V\u00e4stasien
+territories.142=Asien
territories.KR=Sydkorea
territories.KP=Nordkorea
territories.KN=S:t Kitts och Nevis
@@ -960,7 +598,7 @@ territories.VI=Amerikanska Jungfru\u00f6arna
territories.VG=Brittiska Jungfru\u00f6arna
territories.VE=Venezuela
territories.VC=S:t Vincent och Grenadinerna
-territories.VA=Vatikanstaten
+territories.VA=Vatikanen
territories.IT=Italien
territories.IS=Island
territories.IR=Iran
@@ -990,8 +628,8 @@ territories.TR=Turkiet
territories.TO=Tonga
territories.TN=Tunisien
territories.TM=Turkmenistan
-languages.gwi=gwich\u02bbin
languages.akk=akkadiska
+languages.gwi=gwich'in
languages.eka=ekajuk
languages.xh=xhosa
languages.sux=sumeriska
@@ -1003,15 +641,15 @@ languages.pon=ponape
languages.min=minangkabau
languages.suk=sukuma
languages.wo=wolof
-languages.lol=lolo; mongo
languages.kut=kutenai
+languages.lol=lolo; mongo
languages.mic=mic-mac
languages.wa=walloon
languages.kum=kumyk
languages.zap=zapotek
languages.cus=kushitiska (annat)
-languages.jbo=lojban
languages.doi=dogri
+languages.jbo=lojban
languages.vo=volap\u00fck
languages.oto=otomanguespr\u00e5k
languages.vi=vietnamesiska
@@ -1034,8 +672,8 @@ languages.egy=fornegyptiska
languages.ug=uiguriska
languages.fan=fang
languages.ssa=nilosahariskt (annat)
-languages.mga=medeliriska (900-1200)
languages.bat=baltiskt (annat)
+languages.mga=medeliriska (900-1200)
languages.nyo=nyoro
languages.bas=basa
languages.nyn=nyankole
@@ -1063,8 +701,8 @@ languages.kru=kurukh
languages.tg=tadzjikiska
languages.byn=blin
languages.te=telugu
-languages.kro=kru
languages.csb=kasjubiska
+languages.kro=kru
languages.ta=tamil
languages.tkl=tokelauiska
languages.efi=efik
@@ -1088,8 +726,8 @@ languages.sk=slovakiska
languages.grb=grebo
languages.si=singalesiska
languages.sh=serbokroatiska
-languages.crh=krimturkiska; krimtatar
languages.afa=afro-asiatiskt (andra)
+languages.crh=krimturkiska; krimtatar
languages.sg=sango
languages.se=nord\u00adsamiska
languages.sd=sindhi
@@ -1113,14 +751,14 @@ languages.son=songhai
languages.cpp=kreolska och pidgin, portugisiskbaserade (\u00f6vriga)
languages.sog=sogdiska
languages.ada=adangme
-languages.kos=kosreanska
-languages.hit=hettitiska
languages.cpf=kreolska och pidgin, franskbaserade (\u00f6vriga)
+languages.hit=hettitiska
+languages.kos=kosreanska
languages.cpe=kreolska och pidgin, engelskbaserade (\u00f6vriga)
languages.him=himachali
-languages.kok=konkani
-languages.hil=hiligaynon
languages.got=gotiska
+languages.hil=hiligaynon
+languages.kok=konkani
languages.gor=gorontalo
languages.gon=gondi
languages.din=dinka
@@ -1137,7 +775,7 @@ languages.phi=filippinskt spr\u00e5k (annat)
languages.pl=polska
languages.ace=achinese
languages.pi=pali
-languages.pa=panjabi
+languages.pa=punjabi
languages.bug=buginesiska
languages.iba=iban
languages.sms=skoltsamiska
@@ -1189,21 +827,21 @@ languages.ms=malajiska
languages.mr=marathi
languages.fro=fornfranska (842- ca 1400)
languages.mo=moldaviska
-languages.frm=medelfranska (ca 1400-1600)
languages.mn=mongoliska
-languages.jrb=judisk arabiska
+languages.frm=medelfranska (ca 1400-1600)
languages.ml=malayalam
+languages.jrb=judisk arabiska
languages.mk=makedonska
languages.mi=maori
languages.mh=marshalliska
languages.mg=malagassiska
languages.mwr=marwari
languages.bra=braj
-languages.den=slave
languages.lv=lettiska
+languages.den=slave
languages.lu=luba-katanga
-languages.del=delaware
languages.lt=litauiska
+languages.del=delaware
languages.lo=laotiska
languages.ln=lingala
languages.li=limburgiska
@@ -1255,38 +893,38 @@ languages.iu=inuktitut
languages.pap=papiamento
languages.it=italienska
languages.sgn=teckenspr\u00e5k
-languages.is=isl\u00e4ndska
languages.kha=khasi
+languages.is=isl\u00e4ndska
languages.chr=cherokesiska
languages.pam=pampanga
languages.pal=pahlavi
languages.chp=chipewyan
-languages.io=ido
languages.cho=choctaw
+languages.io=ido
languages.chn=chinook
languages.chm=mari
languages.tyv=tuviniska
languages.bnt=bantuspr\u00e5k
languages.pag=pangasinan
-languages.ik=inupiaq
languages.chk=chuukesiska
-languages.ii=sichuan yi
+languages.ik=inupiaq
languages.haw=hawaiiska
+languages.ii=sichuan yi
languages.lam=lamba
-languages.ig=ibo
languages.chg=chagatai
+languages.ig=ibo
languages.sga=forniriska (till 900)
languages.paa=papuaspr\u00e5k (annat)
languages.ie=interlingue
languages.id=indonesiska
languages.lah=lahnda
-languages.day=dayak
languages.chb=chibcha
+languages.day=dayak
languages.ia=interlingua
languages.lad=ladino
-languages.hz=herero
-languages.hai=haida
languages.dar=dargwa
+languages.hai=haida
+languages.hz=herero
languages.hy=armeniska
languages.ath=athapasiska spr\u00e5k
languages.hu=ungerska
@@ -1308,9 +946,9 @@ languages.iro=irokesiska
languages.gn=guaran\u00ed
languages.gl=galiciska
languages.arw=arawakiska
-languages.gez=geez
-languages.art=artificiellt (annat)
languages.gd=skotsk gaeliska
+languages.art=artificiellt (annat)
+languages.gez=geez
languages.ira=iranska
languages.ga=irl\u00e4ndsk gaeliska
languages.arp=arapaho
@@ -1319,8 +957,8 @@ languages.fy=frisiska
languages.bla=siksika
languages.gem=germanskt (annat)
languages.ypk=yupiska spr\u00e5k
-languages.arc=arameiska
languages.fr=franska
+languages.arc=arameiska
languages.fo=f\u00e4r\u00f6iska
languages.cel=keltiskt (annat)
languages.fj=fidjianska
@@ -1328,7 +966,7 @@ languages.fi=finska
languages.ff=fulani
languages.tvl=tuvaluanska
languages.ceb=cebuano
-languages.fa=farsi
+languages.fa=persiska
languages.eu=baskiska
languages.sco=skotska
languages.et=estniska
@@ -1344,9 +982,9 @@ languages.tum=tumbuka
languages.mos=mossi
languages.dz=dzongkha
languages.nic=kordofanspr\u00e5k (annat)
-languages.lus=lushai
-languages.fiu=finskugriskt (annat)
languages.dv=divehi
+languages.fiu=finskugriskt (annat)
+languages.lus=lushai
languages.nia=nias
languages.moh=mohawk
languages.lun=lunda
@@ -1368,8 +1006,8 @@ languages.wak=wakash
languages.sat=santali
languages.cy=walesiska
languages.sas=sasak
-languages.kbd=kabardinska
languages.cv=tjuvasjiska
+languages.kbd=kabardinska
languages.cu=kyrkoslaviska
languages.mni=manipuri
languages.cs=tjeckiska
@@ -1381,17 +1019,17 @@ languages.co=korsikanska
languages.sai=nordamerikanskt indianskt (annat)
languages.mnc=manchuriska
languages.sah=jakutiska
-languages.kaw=kawi
-languages.inh=ingusjiska
languages.gba=gbaya
+languages.inh=ingusjiska
+languages.kaw=kawi
languages.sad=sandawe
languages.ch=chamorro
-languages.ine=indoeuropeiskt (annat)
languages.bho=bhojpuri
+languages.ine=indoeuropeiskt (annat)
languages.enm=medelengelska (1100-1500)
-languages.kar=karen
-languages.inc=indiskt (annat)
languages.ce=tjetjenska
+languages.inc=indiskt (annat)
+languages.kar=karen
languages.gay=gayo
languages.ca=katalanska
languages.umb=umbundu
@@ -1399,19 +1037,19 @@ languages.syr=syriska
languages.kam=kamba
languages.tsi=tsimshian
languages.ang=fornengelska (ca 450-1100)
-languages.kac=kachin
languages.cau=kaukasiskt (annat)
+languages.kac=kachin
languages.kab=kabyliska
-languages.kaa=karakalpakiska
languages.bs=bosniska
-languages.car=karibiska
+languages.kaa=karakalpakiska
languages.br=bretonska
+languages.car=karibiska
languages.bo=tibetanska
languages.bn=bengali
languages.bm=bambara
languages.gaa=ga
-languages.cai=centralamerikanskt indianskt (annat)
languages.bi=bislama
+languages.cai=centralamerikanskt indianskt (annat)
languages.bh=bihari
languages.bg=bulgariska
languages.be=vitryska
@@ -1425,10 +1063,10 @@ languages.az=azerbajdzjanska
languages.ay=aymara
languages.av=avariska
languages.as=assami
-languages.dsb=l\u00e5gsorbiska
languages.ar=arabiska
-languages.ilo=iloko
+languages.dsb=l\u00e5gsorbiska
languages.elx=elamitiska
+languages.ilo=iloko
languages.zh=kinesiska
languages.an=aragonesiska
languages.pra=prakrit
@@ -1451,4 +1089,4 @@ languages.nds=l\u00e5gtyska; l\u00e5gsaxiska
languages.bem=bemba
languages.bej=beyja
languages.tpi=tok pisin
-variants.REVISED=Reviderad
+variants.REVISED=reviderad
diff --git a/resource/gnu/java/locale/LocaleInformation_sw.properties b/resource/gnu/java/locale/LocaleInformation_sw.properties
index 7ba98bc6b..2213bcbfd 100644
--- a/resource/gnu/java/locale/LocaleInformation_sw.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sw.properties
@@ -5,13 +5,12 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesDisplayName.TZS=TZS
-currenciesDisplayName.KES=KES
+currenciesDisplayName.TZS=Shilingi ya Tanzania
currenciesSymbol.TZS=TSh
currenciesSymbol.KES=KSh
-shortMonths=Jan®Feb®Mar®Apr®Mei®Jun®Jul®Ago®Sep®Okt®Nov®Des®®
+shortMonths=Jan®Feb®Mac®Apr®Mei®Jun®Jul®Ago®Sep®Okt®Nov®Des®®
months=Januari®Februari®Machi®Aprili®Mei®Juni®Julai®Agosti®Septemba®Oktoba®Novemba®Desemba®®
-shortWeekdays=®Jpi®Jtt®Jnn®Jtn®Alh®Iju®Jmo®
+shortWeekdays=®Jpl®Jtt®Jnn®Jtn®Alh®Ijm®Jms®
weekdays=®Jumapili®Jumatatu®Jumanne®Jumatano®Alhamisi®Ijumaa®Jumamosi®
firstDayOfWeek=sat
eras=KK®BK®
@@ -24,8 +23,8 @@ territories.MX=Meksiko
territories.ZA=Afrika ya Kusini
territories.GQ=Guinea ya Ikweta
territories.AG=Antigua na Barbuda
-territories.ST=Sao Tome na Principe
territories.AE=Muugano wa Falme za Nchi za Kiarabu
+territories.ST=Sao Tome na Principe
territories.SO=Somali
territories.MH=Visiwa vya Marshall
territories.GB=Uingereza
@@ -46,16 +45,16 @@ territories.KP=Korea ya Kaskazini
territories.KN=Saint Kitts na Nevis
territories.KM=Visiwa vya Komoro
territories.EG=Misri
-territories.KH=Kampuchea
territories.EC=Ekvado
+territories.KH=Kampuchea
territories.KE=Kenya
-territories.PY=Paragwai
territories.DO=Jamhuri ya Dominikan
+territories.PY=Paragwai
territories.DM=Dominika
-territories.JP=Ujapani
territories.DK=Udenmarki
-territories.PT=Ureno
+territories.JP=Ujapani
territories.DJ=Jibuti
+territories.PT=Ureno
territories.JM=Jamaika
territories.DE=Udachi
territories.PH=Filipino
@@ -63,20 +62,21 @@ territories.PG=Papua Guinea Mpya
territories.CZ=Jamhuri ya Czech
territories.CV=Rasi Verde
territories.VC=Saint Vincent na Grenadines
+territories.CS=Serbiya da Montenegro
territories.VA=Vatikano
-territories.IT=Uitaliani
territories.CO=Kolombia
-territories.IS=Barafu
+territories.IT=Uitaliani
territories.CN=Uchina
-territories.IR=Uajemi
+territories.IS=Barafu
territories.CM=Kamerun
+territories.IR=Uajemi
territories.IQ=Iraki
territories.UY=Urugwai
-territories.IN=Uhindi
territories.CI=Pwani ya Pembe
+territories.IN=Uhindi
territories.CH=Uswisi
-territories.IL=Uyahudi
territories.CG=Kongo
+territories.IL=Uyahudi
territories.CF=Jamhuri ya Afrika ya Kati
territories.US=Muungano wa Nchi za Amerika
territories.CA=Kanada
@@ -87,8 +87,8 @@ territories.HR=Kroatia
territories.TZ=Tanzania
territories.NP=Nepali
territories.TT=Trinidad na Tobago
-territories.NO=Unorwe
territories.BE=Ubelgiji
+territories.NO=Unorwe
territories.TR=Uturuki
territories.NL=Uholanzi
territories.BA=Bosnia na Herzegowina
diff --git a/resource/gnu/java/locale/LocaleInformation_sw_TZ.properties b/resource/gnu/java/locale/LocaleInformation_sw_TZ.properties
index 4126b6b1c..1990c32b1 100644
--- a/resource/gnu/java/locale/LocaleInformation_sw_TZ.properties
+++ b/resource/gnu/java/locale/LocaleInformation_sw_TZ.properties
@@ -6,3 +6,4 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
+firstDayOfWeek=mon
diff --git a/resource/gnu/java/locale/LocaleInformation_syr.properties b/resource/gnu/java/locale/LocaleInformation_syr.properties
new file mode 100644
index 000000000..2caa330e8
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_syr.properties
@@ -0,0 +1,11 @@
+# LocaleInformation_syr.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currenciesSymbol.SYP=\u0644.\u0633.\u200f
+shortMonths=\u070f\u071f\u0722\u00a0\u070f\u0712®\u072b\u0712\u071b®\u0710\u0715\u072a®\u0722\u071d\u0723\u0722®\u0710\u071d\u072a®\u071a\u0719\u071d\u072a\u0722®\u072c\u0721\u0718\u0719®\u0710\u0712®\u0710\u071d\u0720\u0718\u0720®\u070f\u072c\u072b\u00a0\u070f\u0710®\u070f\u072c\u072b\u00a0\u070f\u0712®\u070f\u071f\u0722\u00a0\u070f\u0710®®
+territories.SY=\u0723\u0718\u072a\u071d\u071d\u0710
+languages.syr=\u0723\u0718\u072a\u071d\u071d\u0710
diff --git a/resource/gnu/java/locale/LocaleInformation_syr_SY.properties b/resource/gnu/java/locale/LocaleInformation_syr_SY.properties
new file mode 100644
index 000000000..cf1012f86
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_syr_SY.properties
@@ -0,0 +1,17 @@
+# LocaleInformation_syr_SY.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currencyFormat=\u00a4 #,##0.00;\u00a4 #,##0.00-
+firstDayOfWeek=thu
+shortDateFormat=dd/MM/yyyy
+mediumDateFormat=dd/MM/yyyy
+longDateFormat=dd MMMM, yyyy
+fullDateFormat=dd MMMM, yyyy
+shortTimeFormat=h:mm
+mediumTimeFormat=h:mm:ss
+longTimeFormat=h:mm:ss a
+fullTimeFormat=h:mm:ss a
diff --git a/resource/gnu/java/locale/LocaleInformation_ta.properties b/resource/gnu/java/locale/LocaleInformation_ta.properties
index 2267090b5..01bd7b9cc 100644
--- a/resource/gnu/java/locale/LocaleInformation_ta.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ta.properties
@@ -23,16 +23,16 @@ territories.GW=\u0b95\u0bbf\u0ba9\u0bbf-\u0baa\u0bbf\u0bb8\u0bcd\u0bb8\u0bbe\u0b
territories.GT=\u0b95\u0bc1\u0bb5\u0bbe\u0ba4\u0bcd\u0ba4\u0bbe\u0bae\u0bbe\u0bb2\u0bbe
territories.GR=\u0b95\u0bbf\u0bb0\u0bc0\u0bb8\u0bcd
territories.GQ=\u0b88\u0b95\u0bcd\u0b95\u0bc1\u0bb5\u0bbf\u0b9f\u0bcb\u0bb0\u0bbf\u0baf\u0bb2\u0bcd \u0b95\u0bbf\u0ba9\u0bbf
-territories.SY=\u0b9a\u0bbf\u0bb0\u0bbf\u0baf\u0bbe
territories.GN=\u0b95\u0bbf\u0ba9\u0bbf
+territories.SY=\u0b9a\u0bbf\u0bb0\u0bbf\u0baf\u0bbe
territories.GM=\u0b95\u0bbe\u0bae\u0bcd\u0baa\u0bbf\u0baf\u0bbe
territories.SV=\u0b8e\u0bb2\u0bcd \u0b9a\u0bbe\u0bb2\u0bcd\u0bb5\u0b9f\u0bbe\u0bb0\u0bcd
territories.GH=\u0b95\u0bbe\u0ba9\u0bbe
territories.SR=\u0b9a\u0bc2\u0bb0\u0bbf\u0ba9\u0bbe\u0bae\u0bcd
territories.GE=\u0b9c\u0bbe\u0bb0\u0bcd\u0b9c\u0bbf\u0baf\u0bbe
territories.GD=\u0b95\u0bbf\u0bb0\u0ba9\u0bc6\u0b9f\u0bbe
-territories.SM=\u0b9a\u0bbe\u0ba9\u0bcd\u0bae\u0bc6\u0bb0\u0bbf\u0ba9\u0bcb
territories.GB=\u0baa\u0bbf\u0bb0\u0bbf\u0b9f\u0bbf\u0bb7\u0bcd \u0b95\u0bc2\u0b9f\u0bcd\u0b9f\u0bb0\u0b9a\u0bc1
+territories.SM=\u0b9a\u0bbe\u0ba9\u0bcd\u0bae\u0bc6\u0bb0\u0bbf\u0ba9\u0bcb
territories.GA=\u0b95\u0bbe\u0baa\u0bcb\u0ba9\u0bcd
territories.SK=\u0bb8\u0bcd\u0bb2\u0bcb\u0bb5\u0bbe\u0b95\u0bbf\u0baf\u0bbe
territories.SI=\u0bb8\u0bcd\u0bb2\u0bcb\u0bb5\u0bc7\u0ba9\u0bbf\u0baf\u0bbe
@@ -41,8 +41,8 @@ territories.SE=\u0bb8\u0bcd\u0bb5\u0bc0\u0b9f\u0ba9\u0bcd
territories.SB=\u0b9a\u0bbe\u0bb2\u0bae\u0ba9\u0bcd \u0ba4\u0bc0\u0bb5\u0bc1\u0b95\u0bb3\u0bcd
territories.SA=\u0b9a\u0bb5\u0bc2\u0ba4\u0bbf \u0b85\u0bb0\u0bc7\u0baa\u0bbf\u0baf\u0bbe
territories.FR=\u0baa\u0bbf\u0bb0\u0bbe\u0ba9\u0bcd\u0bb8\u0bcd
-territories.RU=\u0bb0\u0bb7\u0bcd\u0baf\u0bbe
territories.FJ=\u0baa\u0bbf\u0b9c\u0bbf
+territories.RU=\u0bb0\u0bb7\u0bcd\u0baf\u0bbe
territories.FI=\u0baa\u0bbf\u0ba9\u0bcd\u0bb2\u0bbe\u0ba8\u0bcd\u0ba4\u0bc1
territories.RO=\u0bb0\u0bc1\u0bae\u0bc7\u0ba9\u0bbf\u0baf\u0bbe
territories.ET=\u0b8e\u0ba4\u0bbf\u0baf\u0bcb\u0baa\u0bcd\u0baa\u0bbf\u0baf\u0bbe
@@ -64,11 +64,11 @@ territories.PK=\u0baa\u0bbe\u0b95\u0bbf\u0bb8\u0bcd\u0ba4\u0bbe\u0ba9\u0bcd
territories.PH=\u0baa\u0bbf\u0bb2\u0bbf\u0baa\u0bcd\u0baa\u0bc8\u0ba9\u0bcd\u0bb8\u0bcd
territories.PG=\u0baa\u0bbe\u0baa\u0bcd\u0baa\u0bc1\u0bb5\u0bbe-\u0ba8\u0bbf\u0baf\u0bc2\u0b95\u0bbf\u0ba9\u0bbf
territories.CZ=\u0b9a\u0bc6\u0b95\u0bcd \u0b95\u0bc1\u0b9f\u0bbf\u0baf\u0bb0\u0b9a\u0bc1
-territories.PE=\u0baa\u0bc6\u0bb0\u0bc1
territories.CY=\u0b9a\u0bc8\u0baa\u0bcd\u0bb0\u0bb8\u0bcd
+territories.PE=\u0baa\u0bc6\u0bb0\u0bc1
territories.CV=\u0b95\u0bc7\u0baa\u0bcd \u0bb5\u0bc6\u0bb0\u0bcd\u0b9f\u0bc7
-territories.PA=\u0baa\u0ba3\u0bbe\u0bae\u0bbe
territories.CU=\u0b95\u0bbf\u0baf\u0bc2\u0baa\u0bbe
+territories.PA=\u0baa\u0ba3\u0bbe\u0bae\u0bbe
territories.CR=\u0b95\u0bcb\u0bb8\u0bcd\u0b9f\u0bbe\u0bb0\u0bbf\u0b95\u0bbe
territories.CO=\u0b95\u0bca\u0bb2\u0bae\u0bcd\u0baa\u0bbf\u0baf\u0bbe
territories.CN=\u0b9a\u0bc0\u0ba9
@@ -86,35 +86,35 @@ territories.BW=\u0baa\u0bcb\u0b9f\u0bcd\u0bb8\u0bcd\u0bb5\u0bbe\u0ba9\u0bbe
territories.BT=\u0baa\u0bc2\u0b9f\u0bbe\u0ba9\u0bcd
territories.BS=\u0baa\u0bb9\u0bbe\u0bae\u0bbe\u0bb8\u0bcd
territories.BR=\u0baa\u0bbf\u0bb0\u0bc7\u0bb8\u0bbf\u0bb2\u0bcd
-territories.NZ=\u0ba8\u0bbf\u0baf\u0bc2\u0b9a\u0bbf\u0bb2\u0bbe\u0ba8\u0bcd\u0ba4\u0bc1
territories.BO=\u0baa\u0bca\u0bb2\u0bbf\u0bb5\u0bbf\u0baf\u0bbe
+territories.NZ=\u0ba8\u0bbf\u0baf\u0bc2\u0b9a\u0bbf\u0bb2\u0bbe\u0ba8\u0bcd\u0ba4\u0bc1
territories.BN=\u0baa\u0bc1\u0bb0\u0bc2\u0ba9\u0bc7\u0baf\u0bcd
territories.BJ=\u0baa\u0bc6\u0ba9\u0bbf\u0ba9\u0bcd
territories.BI=\u0baa\u0bc1\u0bb0\u0bc1\u0ba3\u0bcd\u0b9f\u0bbf
territories.BH=\u0baa\u0bb9\u0bcd\u0bb0\u0bc8\u0ba9\u0bcd
-territories.NR=\u0ba8\u0bcc\u0bb0\u0bc1
territories.BG=\u0baa\u0bb2\u0bcd\u0b95\u0bc7\u0bb0\u0bbf\u0baf\u0bbe
+territories.NR=\u0ba8\u0bcc\u0bb0\u0bc1
territories.BF=\u0baa\u0bb0\u0bcd\u0b95\u0bbf\u0ba9\u0bcb \u0baa\u0bbe\u0bb8\u0bcb
-territories.NP=\u0ba8\u0bc7\u0baa\u0bbe\u0bb3\u0bae\u0bcd
territories.BE=\u0baa\u0bc6\u0bb2\u0bcd\u0b9c\u0bbf\u0baf\u0bae\u0bcd
-territories.NO=\u0ba8\u0bbe\u0bb0\u0bcd\u0bb5\u0bc7
+territories.NP=\u0ba8\u0bc7\u0baa\u0bbe\u0bb3\u0bae\u0bcd
territories.BD=\u0baa\u0b99\u0bcd\u0b95\u0bb3\u0bbe\u0ba4\u0bc7\u0bb7\u0bcd
+territories.NO=\u0ba8\u0bbe\u0bb0\u0bcd\u0bb5\u0bc7
territories.BB=\u0baa\u0bbe\u0bb0\u0bcd\u0baa\u0b9f\u0bcb\u0bb8\u0bcd
territories.ZW=\u0b9c\u0bbf\u0bae\u0bcd\u0baa\u0bbe\u0baa\u0bcd\u0bb5\u0bc7
-territories.NL=\u0ba8\u0bc6\u0ba4\u0bb0\u0bcd\u0bb2\u0bbe\u0ba8\u0bcd\u0ba4\u0bc1
territories.BA=\u0baa\u0bcb\u0bb8\u0bcd\u0ba9\u0bbf\u0baf\u0bbe \u0bb9\u0bc6\u0bb0\u0bcd\u0bb8\u0bbf\u0b95\u0bcb\u0bb5\u0bbf\u0ba9\u0bbe
+territories.NL=\u0ba8\u0bc6\u0ba4\u0bb0\u0bcd\u0bb2\u0bbe\u0ba8\u0bcd\u0ba4\u0bc1
territories.NI=\u0ba8\u0bbf\u0b95\u0bbe\u0bb0\u0bbe\u0b95\u0bc1\u0bb5\u0bbe
territories.AZ=\u0b85\u0b9c\u0bb0\u0bcd\u0baa\u0bc8\u0b9c\u0bbe\u0ba9\u0bcd
-territories.AU=\u0b86\u0bb8\u0bcd\u0ba4\u0bbf\u0bb0\u0bc7\u0bb2\u0bbf\u0baf\u0bbe
territories.NA=\u0ba9\u0bbe\u0bae\u0bc0\u0baa\u0bbf\u0baf\u0bbe
+territories.AU=\u0b86\u0bb8\u0bcd\u0ba4\u0bbf\u0bb0\u0bc7\u0bb2\u0bbf\u0baf\u0bbe
territories.AT=\u0b86\u0bb8\u0bcd\u0ba4\u0bbf\u0bb0\u0bbf\u0baf\u0bbe
territories.AR=\u0b85\u0bb0\u0bcd\u0b9c\u0bc6\u0ba3\u0bcd\u0b9f\u0bbf\u0ba9\u0bbe
territories.AO=\u0b85\u0b99\u0bcd\u0b95\u0bcb\u0bb2\u0bbe
territories.MY=\u0bae\u0bb2\u0bc7\u0bb7\u0bbf\u0baf\u0bbe
-territories.MX=\u0bae\u0bc6\u0b95\u0bcd\u0b9a\u0bbf\u0b95\u0bcb
territories.AM=\u0b86\u0bb0\u0bcd\u0bae\u0bc0\u0ba9\u0bbf\u0baf\u0bbe
-territories.MW=\u0bae\u0bb2\u0bbe\u0bb5\u0bc0
+territories.MX=\u0bae\u0bc6\u0b95\u0bcd\u0b9a\u0bbf\u0b95\u0bcb
territories.AL=\u0b85\u0bb2\u0bcd\u0baa\u0bc7\u0ba9\u0bbf\u0baf\u0bbe
+territories.MW=\u0bae\u0bb2\u0bbe\u0bb5\u0bc0
territories.MV=\u0bae\u0bbe\u0bb2\u0ba4\u0bcd\u0ba4\u0bc0\u0bb5\u0bc1
territories.ZA=\u0ba4\u0bc6\u0ba9\u0bcd \u0b86\u0baa\u0bcd\u0bb0\u0bbf\u0b95\u0bcd\u0b95\u0bbe
territories.MT=\u0bae\u0bbe\u0bb2\u0bcd\u0b9f\u0bbe
@@ -183,14 +183,14 @@ territories.TM=\u0ba4\u0bc1\u0bb0\u0bcd\u0b95\u0bcd\u0bae\u0bc6\u0ba9\u0bbf\u0bb
languages.es=\u0bb8\u0bcd\u0baa\u0bc7\u0ba9\u0bbf\u0bb7\u0bcd
languages.ku=\u0b95\u0bc1\u0bb0\u0bcd\u0ba4\u0bbf\u0bb7\u0bcd
languages.eo=\u0b8e\u0bb8\u0bcd\u0baa\u0bb0\u0bc7\u0ba9\u0bcd\u0b9f\u0bcb
-languages.ks=\u0b95\u0bbe\u0bb7\u0bcd\u0bae\u0bbf\u0bb0\u0bbf
languages.en=\u0b86\u0b99\u0bcd\u0b95\u0bbf\u0bb2\u0bae\u0bcd
+languages.ks=\u0b95\u0bbe\u0bb7\u0bcd\u0bae\u0bbf\u0bb0\u0bbf
languages.el=\u0b95\u0bbf\u0bb0\u0bc7\u0b95\u0bcd\u0b95\u0bae\u0bcd
languages.qu=\u0b95\u0bbf\u0baf\u0bc1\u0b9a\u0bbe
languages.ko=\u0b95\u0bca\u0bb0\u0bbf\u0baf\u0ba9\u0bcd
languages.kn=\u0b95\u0ba9\u0bcd\u0ba9\u0b9f\u0bbe
-languages.kok=\u0b95\u0bca\u0b99\u0bcd\u0b95\u0ba9\u0bbf
languages.km=\u0b95\u0bae\u0bcd\u0baa\u0bcb\u0b9f\u0bbf\u0baf\u0ba9\u0bcd
+languages.kok=\u0b95\u0bca\u0b99\u0bcd\u0b95\u0ba9\u0bbf
languages.kl=\u0b95\u0bbf\u0bb0\u0bbf\u0ba9\u0bcd\u0bb2\u0bc6\u0ba9\u0bcd\u0b9f\u0bbf\u0b95\u0bcd
languages.kk=\u0b95\u0b9a\u0bbe\u0b95\u0bcd
languages.wo=\u0b92\u0bb2\u0bcb\u0baa\u0bcd
@@ -209,8 +209,8 @@ languages.cy=\u0bb5\u0bc6\u0bb2\u0bcd\u0bb7\u0bcd
languages.pa=\u0baa\u0b9e\u0bcd\u0b9a\u0bbe\u0baa\u0bbf
languages.cs=\u0b9a\u0bc6\u0b95\u0bcd
languages.iu=\u0b87\u0ba9\u0bc1\u0b95\u0bbf\u0b9f\u0b9f\u0bcd
-languages.it=\u0b87\u0ba4\u0bcd\u0ba4\u0bbe\u0bb2\u0bbf\u0baf\u0ba9\u0bcd
languages.co=\u0b95\u0bbe\u0bb0\u0bcd\u0b9a\u0bbf\u0baf\u0ba9\u0bcd
+languages.it=\u0b87\u0ba4\u0bcd\u0ba4\u0bbe\u0bb2\u0bbf\u0baf\u0ba9\u0bcd
languages.is=\u0b90\u0bb8\u0bcd\u0bb2\u0bc6\u0ba9\u0bcd\u0b9f\u0bbf\u0b95\u0bcd
languages.uz=\u0b89\u0bb8\u0bcd\u0baa\u0bc6\u0b95\u0bcd
languages.or=\u0b92\u0bb0\u0bbf\u0baf\u0bbe
@@ -303,15 +303,15 @@ languages.fy=\u0baa\u0bbf\u0bb0\u0bbf\u0bb7\u0bbf\u0baf\u0ba9\u0bcd
languages.sa=\u0b9a\u0bae\u0bb8\u0bcd\u0b95\u0bbf\u0bb0\u0bc1\u0ba4\u0bae\u0bcd
languages.fr=\u0baa\u0bbf\u0bb0\u0bc6\u0b9e\u0bcd\u0b9a\u0bc1
languages.lv=\u0bb2\u0bc7\u0b9f\u0bcd\u0bb5\u0bbf\u0baf\u0ba9\u0bcd (\u0bb2\u0bc7\u0b9f\u0bcd\u0b9f\u0bbf\u0bb7\u0bcd)
-languages.lt=\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bc7\u0ba9\u0bbf\u0baf\u0ba9\u0bcd
languages.fo=\u0baa\u0bc8\u0bb0\u0bcb\u0bb8\u0bbf
+languages.lt=\u0bb2\u0bc1\u0ba4\u0bcd\u0ba4\u0bc7\u0ba9\u0bbf\u0baf\u0ba9\u0bcd
languages.rw=\u0b95\u0bbf\u0ba9\u0bcd\u0baf\u0bb0\u0bcd\u0bb5\u0bc6\u0ba9\u0bcd\u0b9f\u0bbe
languages.root=\u0ba4\u0bae\u0bbf\u0bb4\u0bcd
languages.ru=\u0bb0\u0bb7\u0bbf\u0baf\u0ba9\u0bcd
-languages.lo=\u0bb2\u0bcb\u0ba4\u0bcd\u0ba4\u0bbf\u0baf\u0ba9\u0bcd
languages.fj=\u0baa\u0bbf\u0b9c\u0bbf
-languages.ln=\u0bb2\u0bbf\u0b99\u0bcd\u0b95\u0bbe\u0bb2\u0bbe
+languages.lo=\u0bb2\u0bcb\u0ba4\u0bcd\u0ba4\u0bbf\u0baf\u0ba9\u0bcd
languages.fi=\u0baa\u0bbf\u0ba9\u0bcd\u0ba9\u0bbf\u0bb7\u0bcd
+languages.ln=\u0bb2\u0bbf\u0b99\u0bcd\u0b95\u0bbe\u0bb2\u0bbe
languages.ro=\u0bb0\u0bcb\u0bae\u0bc7\u0ba9\u0bbf\u0baf\u0ba9\u0bcd
languages.rn=\u0b95\u0bbf\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bbf
languages.rm=\u0bb0\u0bc8\u0b9f\u0bcd\u0b9f\u0bcb-\u0bb0\u0bcb\u0bae\u0bc6\u0ba9\u0bcd\u0bb8\u0bcd
@@ -319,5 +319,5 @@ languages.fa=\u0baa\u0bb0\u0bcd\u0bb8\u0bbf\u0baf\u0ba9\u0bcd
languages.la=\u0bb2\u0bbe\u0ba4\u0bbf\u0ba9\u0bcd
languages.xh=\u0bb9\u0bcb\u0bb7\u0bbe
languages.eu=\u0baa\u0bb8\u0bcd\u0b95\u0bcd
-languages.ky=\u0b95\u0bbf\u0bb0\u0bcd\u0b95\u0bbf\u0bb7\u0bcd
languages.et=\u0b8e\u0bb8\u0bcd\u0b9f\u0bcb\u0ba9\u0bbf\u0baf\u0ba9\u0bcd
+languages.ky=\u0b95\u0bbf\u0bb0\u0bcd\u0b95\u0bbf\u0bb7\u0bcd
diff --git a/resource/gnu/java/locale/LocaleInformation_ta_IN.properties b/resource/gnu/java/locale/LocaleInformation_ta_IN.properties
index c44d55c65..1df35d17a 100644
--- a/resource/gnu/java/locale/LocaleInformation_ta_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ta_IN.properties
@@ -5,8 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
firstDayOfWeek=mon
shortDateFormat=d-M-yy
mediumDateFormat=dd-MM-yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_te.properties b/resource/gnu/java/locale/LocaleInformation_te.properties
index d92124861..c4580f520 100644
--- a/resource/gnu/java/locale/LocaleInformation_te.properties
+++ b/resource/gnu/java/locale/LocaleInformation_te.properties
@@ -6,11 +6,42 @@
# This file was automatically generated by gnu.localegen from CLDR.
zeroDigit=\u0c66
+currenciesDisplayName.INR=\u0c30\u0c42\u0c2a\u0c3e\u0c2f\u0c3f
+currenciesDisplayName.JPY=\u0c1c\u0c2a\u0c3e\u0c28\u0c41 \u0c26\u0c47\u0c36 \u0c2f\u0c46\u0c38\u0c4d
+currenciesDisplayName.RUB=\u0c30\u0c37\u0c4d\u0c2f \u0c26\u0c47\u0c36 \u0c30\u0c42\u0c2c\u0c32\u0c4d
+currenciesDisplayName.CNY=\u0c1a\u0c48\u0c28\u0c3e \u0c26\u0c47\u0c36 \u0c2f\u0c41\u0c35\u0c3e\u0c28\u0c4d \u0c30\u0c46\u0c28\u0c4d\u200c\u0c2e\u0c3f\u0c28\u0c4d\u200c\u0c2c\u0c3f
+currenciesDisplayName.EUR=\u0c2f\u0c41\u0c30\u0c4a
+currenciesDisplayName.GBP=\u0c2c\u0c4d\u0c3f\u0c1f\u0c3f\u0c37\u0c4d \u0c2a\u0c4c\u0c28\u0c4d\u0c21 \u0c38\u0c4d\u0c1f\u0c46\u0c30\u0c4d\u0c32\u0c3f\u0c17\u0c4d
+currenciesDisplayName.BRL=\u0c2c\u0c4d\u0c30\u0c1c\u0c3f\u0c32\u0c4d \u0c26\u0c47\u0c36 \u0c30\u0c3f\u0c2f\u0c3e\u0c32\u0c4d
+currenciesDisplayName.USD=\u0c10\u0c15\u0c4d\u0c2f \u0c30\u0c3e\u0c37\u0c4d\u0c1f\u0c4d\u0c30 \u0c05\u0c2e\u0c46\u0c30\u0c3f\u0c15 \u0c21\u0c3e\u0c32\u0c30\u0c4d
currenciesSymbol.INR=\u0c30\u0c42.
+currenciesSymbol.RUB=\u0c30\u0c42\u0c2c\u0c32\u0c4d
+currenciesSymbol.CNY=\u0c2f\u0c41
+currenciesSymbol.BRL=\u0c30\u0c3f$
shortMonths=\u0c1c\u0c28\u0c35\u0c30\u0c3f®\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f®\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f®\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d®\u0c2e\u0c47®\u0c1c\u0c42\u0c28\u0c4d®\u0c1c\u0c42\u0c32\u0c48®\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41®\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d®\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d®\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d®\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d®®
months=\u0c1c\u0c28\u0c35\u0c30\u0c3f®\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f®\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f®\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d®\u0c2e\u0c47®\u0c1c\u0c42\u0c28\u0c4d®\u0c1c\u0c42\u0c32\u0c48®\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41®\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d®\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d®\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d®\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d®®
shortWeekdays=®\u0c06\u0c26\u0c3f®\u0c38\u0c4b\u0c2e®\u0c2e\u0c02\u0c17\u0c33®\u0c2c\u0c41\u0c27®\u0c17\u0c41\u0c30\u0c41®\u0c36\u0c41\u0c15\u0c4d\u0c30®\u0c36\u0c28\u0c3f®
weekdays=®\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02®\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02®\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02®\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02®\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02®\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02®\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02®
-ampms=\u0c2a\u0c42\u0c30\u0c4d\u0c35\u0c3e\u0c39\u0c4d\u0c28®\u0c05\u0c2a\u0c30\u0c3e\u0c39\u0c4d\u0c28®
+ampms=\u0c2a\u0c42\u0c30\u0c4d\u0c35\u0c3e\u0c39\u0c4d\u0c28\u0c02®\u0c05\u0c2a\u0c30\u0c3e\u0c39\u0c4d\u0c28\u0c02®
+territories.FR=\u0c2b\u0c4d\u0c30\u0c3e\u0c28\u0c4d\u0c38\u0c4d\u200c
territories.IN=\u0c2d\u0c3e\u0c30\u0c24 \u0c26\u0c47\u0c33\u0c02
+territories.CN=\u0c1a\u0c48\u0c28\u0c3e
+territories.DE=\u0c19\u0c30\u0c4d\u0c2e\u0c28\u0c3f
+territories.GB=\u0c2c\u0c4d\u0c30\u0c3f\u0c1f\u0c28\u0c4d
+territories.BR=\u0c2c\u0c4d\u0c30\u0c1c\u0c3f\u0c32\u0c4d
+territories.RU=\u0c30\u0c37\u0c4d\u0c2f
+territories.JP=\u0c1c\u0c2a\u0c3e\u0c38\u0c41
+territories.US=\u0c10\u0c15\u0c4d\u0c2f \u0c30\u0c3e\u0c37\u0c4d\u0c1f\u0c4d\u0c30 \u0c05\u0c2e\u0c46\u0c30\u0c3f\u0c15
+territories.IT=\u0c07\u0c1f\u0c32\u0c3f
+languages.zh=\u0c1a\u0c48\u0c28\u0c3e \u0c2d\u0c3e\u0c37
+languages.en=\u0c06\u0c02\u0c17\u0c4d\u0c32\u0c02
languages.te=\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41
+languages.ru=\u0c30\u0c37\u0c4d\u0c2f\u0c28\u0c4d \u0c2d\u0c3e\u0c37
+languages.hi=\u0c39\u0c3f\u0c02\u0c26\u0c40
+languages.ar=\u0c05\u0c30\u0c2c\u0c3f\u0c15\u0c4d
+languages.it=\u0c07\u0c1f\u0c3e\u0c32\u0c3f\u0c2f\u0c28\u0c4d \u0c2d\u0c3e\u0c37
+languages.fr=\u0c2b\u0c4d\u0c30\u0c46\u0c02\u0c1a\u0c4d
+languages.de=\u0c19\u0c30\u0c4d\u0c2e\u0c28\u0c4d
+languages.es=\u0c38\u0c4d\u0c2a\u0c3e\u0c28\u0c3f\u0c37\u0c4d
+languages.ja=\u0c1c\u0c2a\u0c3e\u0c28\u0c41 \u0c2d\u0c3e\u0c37
+languages.pt=\u0c2a\u0c4a\u0c30\u0c4d\u0c1a\u0c41\u0c17\u0c32\u0c4d \u0c2d\u0c3e\u0c37
diff --git a/resource/gnu/java/locale/LocaleInformation_te_IN.properties b/resource/gnu/java/locale/LocaleInformation_te_IN.properties
index 93be7d35f..84dbb365f 100644
--- a/resource/gnu/java/locale/LocaleInformation_te_IN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_te_IN.properties
@@ -5,8 +5,8 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-percentFormat=##,##,##0%
-currencyFormat=\u00a4 ##,##,##0.00;-\u00a4 ##,##,##0.00
+percentFormat=#,##,##0%
+currencyFormat=\u00a4 #,##,##0.00;-\u00a4 #,##,##0.00
firstDayOfWeek=mon
shortDateFormat=dd-MM-yy
mediumDateFormat=dd-MM-yyyy
diff --git a/resource/gnu/java/locale/LocaleInformation_th.properties b/resource/gnu/java/locale/LocaleInformation_th.properties
index 506ed4f6e..e621f11b0 100644
--- a/resource/gnu/java/locale/LocaleInformation_th.properties
+++ b/resource/gnu/java/locale/LocaleInformation_th.properties
@@ -6,8 +6,55 @@
# This file was automatically generated by gnu.localegen from CLDR.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
+currenciesDisplayName.GBP=\u0e1b\u0e2d\u0e19\u0e14\u0e4c\u0e2a\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e25\u0e34\u0e07\u0e2d\u0e31\u0e07\u0e01\u0e24\u0e29
+currenciesDisplayName.PKR=\u0e23\u0e39\u0e1b\u0e35\u0e1b\u0e32\u0e01\u0e35\u0e2a\u0e16\u0e32\u0e19
+currenciesDisplayName.PHP=\u0e40\u0e1b\u0e42\u0e0b\u0e1f\u0e34\u0e25\u0e34\u0e1b\u0e1b\u0e34\u0e19\u0e2a\u0e4c
+currenciesDisplayName.ARS=\u0e40\u0e1b\u0e42\u0e0b\u0e2d\u0e32\u0e23\u0e4c\u0e40\u0e08\u0e19\u0e15\u0e34\u0e19\u0e48\u0e32
+currenciesDisplayName.FRF=\u0e40\u0e2b\u0e23\u0e35\u0e22\u0e0d\u0e1d\u0e23\u0e31\u0e48\u0e07\u0e40\u0e28\u0e2a
+currenciesDisplayName.MYR=\u0e23\u0e34\u0e07\u0e01\u0e34\u0e15\u0e21\u0e32\u0e40\u0e25\u0e40\u0e0b\u0e35\u0e22
+currenciesDisplayName.IEP=\u0e1b\u0e2d\u0e19\u0e14\u0e4c\u0e44\u0e2d\u0e23\u0e34\u0e0a
+currenciesDisplayName.ARP=\u0e40\u0e1b\u0e42\u0e0b\u0e2d\u0e32\u0e23\u0e4c\u0e40\u0e08\u0e19\u0e15\u0e34\u0e19\u0e48\u0e32 (1983-1985)
+currenciesDisplayName.INR=\u0e23\u0e39\u0e1b\u0e35\u0e2d\u0e34\u0e19\u0e40\u0e14\u0e35\u0e22
+currenciesDisplayName.CLP=\u0e40\u0e1b\u0e42\u0e0b\u0e0a\u0e34\u0e25\u0e35
+currenciesDisplayName.JPY=\u0e40\u0e22\u0e19
+currenciesDisplayName.NZD=\u0e40\u0e2b\u0e23\u0e35\u0e22\u0e0d\u0e19\u0e34\u0e27\u0e0b\u0e35\u0e41\u0e25\u0e19\u0e14\u0e4c
+currenciesDisplayName.EUR=\u0e22\u0e39\u0e42\u0e23
+currenciesDisplayName.AUD=\u0e40\u0e2b\u0e23\u0e35\u0e22\u0e0d\u0e2d\u0e2d\u0e2a\u0e40\u0e15\u0e23\u0e40\u0e25\u0e35\u0e22
+currenciesDisplayName.FJD=\u0e40\u0e2b\u0e23\u0e35\u0e22\u0e0d\u0e1f\u0e34\u0e08\u0e34
+currenciesDisplayName.TRY=\u0e15\u0e38\u0e23\u0e01\u0e35 \u0e25\u0e35\u0e23\u0e48\u0e32 \u0e43\u0e2b\u0e21\u0e48
+currenciesDisplayName.USS=\u0e40\u0e2b\u0e23\u0e35\u0e22\u0e0d\u0e2a\u0e2b\u0e23\u0e31\u0e10 (\u0e27\u0e31\u0e19\u0e40\u0e14\u0e35\u0e22\u0e27\u0e01\u0e31\u0e19)
+currenciesDisplayName.ILP=\u0e1b\u0e2d\u0e19\u0e14\u0e4c\u0e2d\u0e34\u0e2a\u0e23\u0e32\u0e40\u0e2d\u0e25
currenciesDisplayName.THB=\u0e1a\u0e32\u0e17
+currenciesDisplayName.USN=\u0e40\u0e2b\u0e23\u0e35\u0e22\u0e0d\u0e2a\u0e2b\u0e23\u0e31\u0e10 (\u0e27\u0e31\u0e19\u0e16\u0e31\u0e14\u0e44\u0e1b)
+currenciesDisplayName.SGD=\u0e40\u0e2b\u0e23\u0e35\u0e22\u0e0d\u0e2a\u0e34\u0e07\u0e04\u0e42\u0e1b\u0e23\u0e4c
+currenciesDisplayName.CNY=\u0e2b\u0e22\u0e27\u0e19\u0e40\u0e2b\u0e23\u0e34\u0e19\u0e40\u0e2b\u0e21\u0e34\u0e19\u0e1a\u0e35\u0e49
+currenciesDisplayName.CAD=\u0e40\u0e2b\u0e23\u0e35\u0e22\u0e0d\u0e04\u0e32\u0e19\u0e32\u0e14\u0e32
+currenciesDisplayName.ATS=\u0e0a\u0e34\u0e25\u0e25\u0e34\u0e07\u0e2d\u0e2d\u0e2a\u0e40\u0e15\u0e23\u0e35\u0e22
+currenciesDisplayName.IDR=\u0e23\u0e39\u0e40\u0e1b\u0e35\u0e22\u0e2d\u0e34\u0e19\u0e42\u0e14\u0e19\u0e35\u0e40\u0e0b\u0e35\u0e22
+currenciesDisplayName.BRL=\u0e23\u0e35\u0e25
+currenciesDisplayName.USD=\u0e14\u0e2d\u0e23\u0e4c\u0e25\u0e48\u0e32\u0e23\u0e4c\u0e2a\u0e2b\u0e23\u0e31\u0e10
+currenciesDisplayName.MXN=\u0e40\u0e1b\u0e42\u0e0b\u0e41\u0e21\u0e47\u0e01\u0e0b\u0e34\u0e42\u0e01
+currenciesDisplayName.RUB=\u0e23\u0e39\u0e40\u0e1a\u0e34\u0e25\u0e23\u0e31\u0e2a\u0e40\u0e0b\u0e35\u0e22
+currenciesDisplayName.HKD=\u0e40\u0e2b\u0e23\u0e35\u0e22\u0e0d\u0e2e\u0e48\u0e2d\u0e07\u0e01\u0e07
+currenciesDisplayName.XAU=\u0e17\u0e2d\u0e07
+currenciesSymbol.GBP=\\u00A3
+currenciesSymbol.PKR=Pra
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.MYR=RM
+currenciesSymbol.IEP=IR\\u00A3
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.JPY=\\u00A5
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.AUD=$A
+currenciesSymbol.FJD=F$
currenciesSymbol.THB=\u0e3f
+currenciesSymbol.SGD=S$
+currenciesSymbol.CNY=\uffe5
+currenciesSymbol.CAD=Can$
+currenciesSymbol.IDR=Rp
+currenciesSymbol.USD=US$
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.HKD=HK$
shortMonths=\u0e21.\u0e04.®\u0e01.\u0e1e.®\u0e21\u0e35.\u0e04.®\u0e40\u0e21.\u0e22.®\u0e1e.\u0e04.®\u0e21\u0e34.\u0e22.®\u0e01.\u0e04.®\u0e2a.\u0e04.®\u0e01.\u0e22.®\u0e15.\u0e04.®\u0e1e.\u0e22.®\u0e18.\u0e04.®®
months=\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21®\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c®\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21®\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19®\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21®\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19®\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21®\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21®\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19®\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21®\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19®\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21®®
shortWeekdays=®\u0e2d\u0e32.®\u0e08.®\u0e2d.®\u0e1e.®\u0e1e\u0e24.®\u0e28.®\u0e2a.®
@@ -30,8 +77,11 @@ territories.TG=\u0e42\u0e15\u0e42\u0e01
territories.TF=\u0e2d\u0e32\u0e13\u0e32\u0e40\u0e02\u0e15\u0e17\u0e32\u0e07\u0e43\u0e15\u0e49\u0e02\u0e2d\u0e07\u0e1d\u0e23\u0e31\u0e48\u0e07\u0e40\u0e28\u0e2a
territories.GY=\u0e01\u0e32\u0e22\u0e32\u0e19\u0e32
territories.TD=\u0e0a\u0e32\u0e14
+territories.TC=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e40\u0e15\u0e34\u0e01\u0e2a\u0e4c\u0e41\u0e25\u0e30\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e40\u0e04\u0e04\u0e2d\u0e2a
territories.GW=\u0e01\u0e34\u0e19\u0e35-\u0e1a\u0e34\u0e2a\u0e40\u0e0b\u0e32
+territories.GU=\u0e01\u0e27\u0e21
territories.GT=\u0e01\u0e31\u0e27\u0e40\u0e15\u0e21\u0e32\u0e25\u0e32
+territories.GS=\u0e40\u0e01\u0e32\u0e30\u0e40\u0e0b\u0e32\u0e17\u0e4c\u0e08\u0e2d\u0e23\u0e4c\u0e40\u0e08\u0e35\u0e22\u0e41\u0e25\u0e30\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e40\u0e0b\u0e32\u0e17\u0e4c\u0e41\u0e0b\u0e19\u0e14\u0e4c\u0e27\u0e34\u0e0a
territories.GR=\u0e01\u0e23\u0e35\u0e0b
territories.GQ=\u0e2d\u0e34\u0e40\u0e04\u0e27\u0e17\u0e2d\u0e40\u0e23\u0e35\u0e22\u0e25\u0e01\u0e34\u0e19\u0e35
territories.GP=\u0e01\u0e31\u0e27\u0e40\u0e14\u0e2d\u0e25\u0e39\u0e1b
@@ -41,6 +91,10 @@ territories.GN=\u0e01\u0e34\u0e19\u0e35
territories.GM=\u0e41\u0e01\u0e21\u0e40\u0e1a\u0e35\u0e22
territories.GL=\u0e01\u0e23\u0e35\u0e19\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.SV=\u0e40\u0e2d\u0e25\u0e0b\u0e31\u0e25\u0e27\u0e32\u0e14\u0e2d\u0e23\u0e4c
+territories.062=\u0e40\u0e2d\u0e40\u0e0a\u0e35\u0e22\u0e01\u0e25\u0e32\u0e07\u0e15\u0e2d\u0e19\u0e43\u0e15\u0e49
+territories.ST=\u0e40\u0e0b\u0e32\u0e42\u0e15\u0e40\u0e21\u0e41\u0e25\u0e30\u0e1b\u0e23\u0e34\u0e19\u0e0b\u0e34\u0e40\u0e1b
+territories.061=\u0e42\u0e1b\u0e25\u0e34\u0e19\u0e35\u0e40\u0e0b\u0e35\u0e22
+territories.GI=\u0e22\u0e34\u0e1a\u0e23\u0e2d\u0e25\u0e15\u0e32\u0e23\u0e4c
territories.GH=\u0e01\u0e32\u0e19\u0e48\u0e32
territories.SR=\u0e2a\u0e38\u0e23\u0e34\u0e19\u0e31\u0e21
territories.GF=\u0e40\u0e1f\u0e23\u0e19\u0e0a\u0e4c\u0e01\u0e35\u0e2d\u0e32\u0e19\u0e32
@@ -49,40 +103,59 @@ territories.SO=\u0e42\u0e0b\u0e21\u0e32\u0e40\u0e25\u0e35\u0e22
territories.GD=\u0e40\u0e01\u0e23\u0e19\u0e32\u0e14\u0e32
territories.SN=\u0e40\u0e0b\u0e40\u0e19\u0e01\u0e31\u0e25
territories.SM=\u0e0b\u0e32\u0e19\u0e21\u0e32\u0e23\u0e35\u0e42\u0e19
+territories.GB=\u0e2a\u0e2b\u0e23\u0e32\u0e0a\u0e2d\u0e32\u0e13\u0e32\u0e08\u0e31\u0e01\u0e23
territories.SL=\u0e40\u0e0b\u0e35\u0e22\u0e23\u0e4c\u0e23\u0e32\u0e25\u0e35\u0e42\u0e2d\u0e19
territories.GA=\u0e01\u0e32\u0e1a\u0e2d\u0e07
territories.SK=\u0e2a\u0e42\u0e25\u0e27\u0e32\u0e40\u0e01\u0e35\u0e22
+territories.SJ=\u0e2a\u0e1f\u0e32\u0e25\u0e1a\u0e32\u0e23\u0e4c\u0e41\u0e25\u0e30\u0e41\u0e08\u0e19\u0e21\u0e32\u0e40\u0e22\u0e19
territories.SI=\u0e2a\u0e42\u0e25\u0e27\u0e35\u0e40\u0e19\u0e35\u0e22
+territories.SH=\u0e40\u0e0b\u0e19\u0e15\u0e4c\u0e40\u0e2e\u0e40\u0e25\u0e19\u0e32
territories.SG=\u0e2a\u0e34\u0e07\u0e04\u0e42\u0e1b\u0e23\u0e4c
territories.SE=\u0e2a\u0e27\u0e35\u0e40\u0e14\u0e19
territories.SD=\u0e0b\u0e39\u0e14\u0e32\u0e19
territories.SC=\u0e40\u0e0b\u0e40\u0e0a\u0e25\u0e2a\u0e4c
territories.SB=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e42\u0e0b\u0e42\u0e25\u0e21\u0e2d\u0e19
+territories.SA=\u0e0b\u0e32\u0e2d\u0e38\u0e14\u0e35\u0e2d\u0e32\u0e23\u0e30\u0e40\u0e1a\u0e35\u0e22
territories.FR=\u0e1d\u0e23\u0e31\u0e48\u0e07\u0e40\u0e28\u0e2a
+territories.057=\u0e44\u0e21\u0e42\u0e04\u0e23\u0e19\u0e35\u0e40\u0e0b\u0e35\u0e22
+territories.FO=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e1f\u0e32\u0e42\u0e23
territories.FM=\u0e44\u0e21\u0e42\u0e04\u0e23\u0e19\u0e35\u0e40\u0e0b\u0e35\u0e22
territories.RW=\u0e23\u0e27\u0e31\u0e19\u0e14\u0e32
+territories.054=\u0e40\u0e21\u0e25\u0e32\u0e19\u0e35\u0e40\u0e0b\u0e35\u0e22
+territories.053=\u0e2d\u0e2d\u0e2a\u0e40\u0e15\u0e23\u0e40\u0e25\u0e35\u0e22\u0e41\u0e25\u0e30\u0e19\u0e34\u0e27\u0e0b\u0e35\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.FK=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e1f\u0e2d\u0e25\u0e4c\u0e04\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.RU=\u0e23\u0e31\u0e2a\u0e40\u0e0b\u0e35\u0e22
territories.FJ=\u0e1f\u0e34\u0e08\u0e34
territories.FI=\u0e1f\u0e34\u0e19\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.RO=\u0e42\u0e23\u0e21\u0e32\u0e40\u0e19\u0e35\u0e22
+territories.RE=\u0e40\u0e23\u0e2d\u0e39\u0e40\u0e19\u0e35\u0e22\u0e07
territories.ET=\u0e40\u0e2d\u0e18\u0e34\u0e42\u0e2d\u0e40\u0e1b\u0e35\u0e22
territories.ES=\u0e2a\u0e40\u0e1b\u0e19
territories.ER=\u0e40\u0e2d\u0e23\u0e34\u0e40\u0e17\u0e23\u0e35\u0e22
+territories.833=\u0e40\u0e01\u0e32\u0e30\u0e41\u0e21\u0e19
territories.EH=\u0e0b\u0e32\u0e2e\u0e32\u0e23\u0e32\u0e15\u0e30\u0e27\u0e31\u0e19\u0e15\u0e01
territories.EG=\u0e2d\u0e35\u0e22\u0e34\u0e1b\u0e15\u0e4c
+territories.830=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e41\u0e0a\u0e19\u0e40\u0e19\u0e25
territories.EE=\u0e40\u0e2d\u0e2a\u0e42\u0e15\u0e40\u0e19\u0e35\u0e22
+territories.QO=\u0e40\u0e2d\u0e32\u0e15\u0e4c\u0e44\u0e25\u0e2d\u0e34\u0e07\u0e42\u0e2d\u0e40\u0e0a\u0e35\u0e22\u0e40\u0e19\u0e35\u0e22
territories.EC=\u0e40\u0e2d\u0e01\u0e27\u0e32\u0e14\u0e2d\u0e23\u0e4c
territories.DZ=\u0e41\u0e2d\u0e25\u0e08\u0e35\u0e40\u0e23\u0e35\u0e22
territories.QA=\u0e01\u0e32\u0e15\u0e32\u0e23\u0e4c
+territories.039=\u0e22\u0e38\u0e42\u0e23\u0e1b\u0e43\u0e15\u0e49
territories.DO=\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e23\u0e31\u0e10\u0e42\u0e14\u0e21\u0e34\u0e19\u0e34\u0e01\u0e31\u0e19
territories.PY=\u0e1b\u0e32\u0e23\u0e32\u0e01\u0e27\u0e31\u0e22
+territories.035=\u0e40\u0e2d\u0e40\u0e0a\u0e35\u0e22\u0e15\u0e30\u0e27\u0e31\u0e19\u0e2d\u0e2d\u0e01\u0e40\u0e09\u0e35\u0e22\u0e07\u0e43\u0e15\u0e49
territories.DM=\u0e42\u0e14\u0e21\u0e34\u0e19\u0e34\u0e01\u0e32
+territories.PW=\u0e1b\u0e32\u0e40\u0e25\u0e32
territories.DK=\u0e40\u0e14\u0e19\u0e21\u0e32\u0e23\u0e4c\u0e01
territories.DJ=\u0e08\u0e34\u0e1a\u0e39\u0e15\u0e35
territories.PT=\u0e42\u0e1b\u0e23\u0e15\u0e38\u0e40\u0e01\u0e2a
+territories.PS=\u0e1b\u0e32\u0e40\u0e25\u0e0b\u0e15\u0e34\u0e40\u0e19\u0e35\u0e22\u0e19\u0e40\u0e17\u0e23\u0e4c\u0e23\u0e34\u0e17\u0e2d\u0e23\u0e35
+territories.030=\u0e40\u0e2d\u0e40\u0e0a\u0e35\u0e22\u0e15\u0e30\u0e27\u0e31\u0e19\u0e2d\u0e2d\u0e01
territories.PR=\u0e40\u0e1b\u0e2d\u0e23\u0e4c\u0e42\u0e15\u0e23\u0e34\u0e42\u0e01
territories.DE=\u0e40\u0e22\u0e2d\u0e23\u0e21\u0e19\u0e35
+territories.PN=\u0e1e\u0e34\u0e15\u0e41\u0e04\u0e23\u0e4c\u0e19
+territories.PM=\u0e41\u0e0b\u0e07\u0e1b\u0e35\u0e41\u0e22\u0e23\u0e4c\u0e41\u0e25\u0e30\u0e21\u0e35\u0e40\u0e01\u0e2d\u0e25\u0e07
territories.PL=\u0e42\u0e1b\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.PK=\u0e1b\u0e32\u0e01\u0e35\u0e2a\u0e16\u0e32\u0e19
territories.PH=\u0e1f\u0e34\u0e25\u0e34\u0e1b\u0e1b\u0e34\u0e19\u0e2a\u0e4c
@@ -91,34 +164,50 @@ territories.PF=\u0e40\u0e1f\u0e23\u0e19\u0e0a\u0e4c\u0e42\u0e1e\u0e25\u0e35\u0e1
territories.CZ=\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e23\u0e31\u0e10\u0e40\u0e0a\u0e47\u0e01
territories.PE=\u0e40\u0e1b\u0e23\u0e39
territories.CY=\u0e44\u0e0b\u0e1b\u0e23\u0e31\u0e2a
+territories.CX=\u0e40\u0e01\u0e32\u0e30\u0e04\u0e23\u0e34\u0e2a\u0e21\u0e32\u0e2a\u0e15\u0e4c
territories.CV=\u0e40\u0e04\u0e1b\u0e40\u0e27\u0e34\u0e23\u0e4c\u0e14
territories.PA=\u0e1b\u0e32\u0e19\u0e32\u0e21\u0e32
territories.CU=\u0e04\u0e34\u0e27\u0e1a\u0e32
+territories.CS=\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e40\u0e1a\u0e35\u0e22
territories.CR=\u0e04\u0e2d\u0e2a\u0e15\u0e32\u0e23\u0e34\u0e01\u0e32
+territories.029=\u0e41\u0e04\u0e23\u0e34\u0e40\u0e1a\u0e35\u0e22\u0e19
territories.CO=\u0e42\u0e04\u0e25\u0e31\u0e21\u0e40\u0e1a\u0e35\u0e22
territories.CN=\u0e08\u0e35\u0e19
territories.CM=\u0e41\u0e04\u0e40\u0e21\u0e2d\u0e23\u0e39\u0e19
territories.CL=\u0e0a\u0e34\u0e25\u0e35
+territories.CK=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e04\u0e38\u0e01
territories.CI=\u0e42\u0e01\u0e15\u0e14\u0e34\u0e27\u0e31\u0e27\u0e23\u0e4c
+territories.021=\u0e2d\u0e40\u0e21\u0e23\u0e34\u0e01\u0e32\u0e40\u0e2b\u0e19\u0e37\u0e2d
territories.CH=\u0e2a\u0e27\u0e34\u0e15\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.CG=\u0e04\u0e2d\u0e07\u0e42\u0e01
territories.CF=\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e23\u0e31\u0e10\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32\u0e01\u0e25\u0e32\u0e07
+territories.CD=\u0e2a\u0e32\u0e18\u0e32\u0e23\u0e13\u0e23\u0e31\u0e10\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e18\u0e34\u0e1b\u0e44\u0e15\u0e22\u0e04\u0e2d\u0e07\u0e42\u0e01
+territories.CC=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e42\u0e04\u0e42\u0e04\u0e2a (\u0e04\u0e35\u0e25\u0e34\u0e07)
territories.OM=\u0e42\u0e2d\u0e21\u0e32\u0e19
territories.CA=\u0e41\u0e04\u0e19\u0e32\u0e14\u0e32
territories.BZ=\u0e40\u0e1a\u0e25\u0e35\u0e0a
territories.BY=\u0e40\u0e1a\u0e25\u0e32\u0e23\u0e38\u0e2a
territories.BW=\u0e1a\u0e2d\u0e15\u0e2a\u0e27\u0e32\u0e19\u0e32
+territories.BV=\u0e40\u0e01\u0e32\u0e30\u0e1a\u0e39\u0e40\u0e27\u0e15\u0e4c
territories.BT=\u0e20\u0e39\u0e10\u0e32\u0e19
territories.BS=\u0e1a\u0e32\u0e2e\u0e32\u0e21\u0e32\u0e2a
territories.BR=\u0e1a\u0e23\u0e32\u0e0b\u0e34\u0e25
+territories.019=\u0e2d\u0e40\u0e21\u0e23\u0e34\u0e01\u0e32
+territories.018=\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32\u0e43\u0e15\u0e49
territories.NZ=\u0e19\u0e34\u0e27\u0e0b\u0e35\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.BO=\u0e42\u0e1a\u0e25\u0e34\u0e40\u0e27\u0e35\u0e22
+territories.017=\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32\u0e01\u0e25\u0e32\u0e07
territories.BN=\u0e1a\u0e23\u0e39\u0e44\u0e19
territories.BM=\u0e40\u0e1a\u0e2d\u0e23\u0e4c\u0e21\u0e34\u0e27\u0e14\u0e49\u0e32
+territories.015=\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32\u0e40\u0e2b\u0e19\u0e37\u0e2d
+territories.014=\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32\u0e15\u0e30\u0e27\u0e31\u0e19\u0e2d\u0e2d\u0e01
+territories.013=\u0e2d\u0e40\u0e21\u0e23\u0e34\u0e01\u0e32\u0e01\u0e25\u0e32\u0e07
territories.NU=\u0e19\u0e35\u0e22\u0e39
territories.BJ=\u0e40\u0e1a\u0e19\u0e34\u0e19
territories.BI=\u0e1a\u0e38\u0e23\u0e38\u0e19\u0e14\u0e35
+territories.011=\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32\u0e15\u0e30\u0e27\u0e31\u0e19\u0e15\u0e01
territories.BH=\u0e1a\u0e32\u0e2b\u0e4c\u0e40\u0e23\u0e19
+territories.NR=\u0e19\u0e32\u0e2d\u0e39\u0e23\u0e39
territories.BG=\u0e1a\u0e31\u0e25\u0e41\u0e01\u0e40\u0e23\u0e35\u0e22
territories.BF=\u0e1a\u0e39\u0e23\u0e4c\u0e01\u0e34\u0e19\u0e32\u0e1f\u0e32\u0e42\u0e0b
territories.NP=\u0e40\u0e19\u0e1b\u0e32\u0e25
@@ -131,33 +220,42 @@ territories.NL=\u0e40\u0e19\u0e40\u0e18\u0e2d\u0e23\u0e4c\u0e41\u0e25\u0e19\u0e1
territories.BA=\u0e1a\u0e2d\u0e2a\u0e40\u0e19\u0e35\u0e22\u0e41\u0e25\u0e30\u0e40\u0e2e\u0e2d\u0e23\u0e4c\u0e40\u0e0b\u0e42\u0e01\u0e27\u0e35\u0e19\u0e32
territories.NI=\u0e19\u0e34\u0e04\u0e32\u0e23\u0e32\u0e01\u0e31\u0e27
territories.NG=\u0e44\u0e19\u0e08\u0e35\u0e40\u0e23\u0e35\u0e22
+territories.NF=\u0e40\u0e01\u0e32\u0e30\u0e19\u0e2d\u0e23\u0e4c\u0e1f\u0e2d\u0e25\u0e4c\u0e01
territories.AZ=\u0e2d\u0e32\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e44\u0e1a\u0e08\u0e32\u0e19
territories.NE=\u0e44\u0e19\u0e40\u0e08\u0e2d\u0e23\u0e4c
+territories.AX=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e2d\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.NC=\u0e19\u0e34\u0e27\u0e41\u0e04\u0e25\u0e35\u0e42\u0e14\u0e40\u0e19\u0e35\u0e22
territories.AW=\u0e2d\u0e32\u0e23\u0e39\u0e1a\u0e32
territories.ZM=\u0e41\u0e0b\u0e21\u0e40\u0e1a\u0e35\u0e22
-territories.AU=\u0e2d\u0e2d\u0e2a\u0e40\u0e15\u0e23\u0e40\u0e25\u0e35\u0e22
territories.NA=\u0e19\u0e32\u0e21\u0e34\u0e40\u0e1a\u0e35\u0e22
+territories.AU=\u0e2d\u0e2d\u0e2a\u0e40\u0e15\u0e23\u0e40\u0e25\u0e35\u0e22
territories.AT=\u0e2d\u0e2d\u0e2a\u0e40\u0e15\u0e23\u0e35\u0e22
+territories.AS=\u0e2d\u0e40\u0e21\u0e23\u0e34\u0e01\u0e31\u0e19\u0e0b\u0e32\u0e21\u0e31\u0e27
territories.AR=\u0e2d\u0e32\u0e23\u0e4c\u0e40\u0e08\u0e19\u0e15\u0e34\u0e19\u0e32
+territories.009=\u0e42\u0e2d\u0e40\u0e0a\u0e35\u0e22\u0e40\u0e19\u0e35\u0e22
territories.AQ=\u0e41\u0e2d\u0e19\u0e15\u0e32\u0e23\u0e4c\u0e01\u0e15\u0e34\u0e01\u0e32
territories.MZ=\u0e42\u0e21\u0e41\u0e0b\u0e21\u0e1a\u0e34\u0e04
territories.AO=\u0e41\u0e2d\u0e07\u0e42\u0e01\u0e25\u0e32
territories.MY=\u0e21\u0e32\u0e40\u0e25\u0e40\u0e0b\u0e35\u0e22
territories.AN=\u0e40\u0e19\u0e40\u0e2e\u0e2d\u0e23\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c\u0e41\u0e2d\u0e19\u0e17\u0e34\u0e25\u0e25\u0e34\u0e2a
territories.MX=\u0e40\u0e21\u0e47\u0e01\u0e0b\u0e34\u0e42\u0e01
+territories.005=\u0e2d\u0e40\u0e21\u0e23\u0e34\u0e01\u0e32\u0e43\u0e15\u0e49
territories.AM=\u0e2d\u0e32\u0e23\u0e4c\u0e40\u0e21\u0e40\u0e19\u0e35\u0e22
territories.MW=\u0e21\u0e32\u0e25\u0e32\u0e27\u0e35
territories.AL=\u0e41\u0e2d\u0e25\u0e40\u0e1a\u0e40\u0e19\u0e35\u0e22
+territories.MV=\u0e21\u0e31\u0e25\u0e14\u0e35\u0e1f\u0e2a\u0e4c
territories.ZA=\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32\u0e43\u0e15\u0e49
territories.MU=\u0e21\u0e2d\u0e23\u0e34\u0e40\u0e0a\u0e35\u0e22\u0e2a
+territories.002=\u0e41\u0e2d\u0e1f\u0e23\u0e34\u0e01\u0e32
territories.MT=\u0e21\u0e2d\u0e25\u0e15\u0e32
+territories.001=\u0e42\u0e25\u0e01
territories.AI=\u0e2d\u0e31\u0e19\u0e01\u0e34\u0e25\u0e48\u0e32
territories.MS=\u0e21\u0e2d\u0e19\u0e15\u0e4c\u0e40\u0e0b\u0e23\u0e4c\u0e41\u0e23\u0e47\u0e15
territories.MR=\u0e21\u0e2d\u0e23\u0e34\u0e40\u0e15\u0e40\u0e19\u0e35\u0e22
territories.AG=\u0e41\u0e2d\u0e19\u0e15\u0e34\u0e01\u0e32\u0e41\u0e25\u0e30\u0e1a\u0e32\u0e23\u0e4c\u0e1a\u0e39\u0e14\u0e32
territories.MQ=\u0e21\u0e32\u0e23\u0e4c\u0e15\u0e34\u0e19\u0e35\u0e01
territories.AF=\u0e2d\u0e31\u0e1f\u0e01\u0e32\u0e19\u0e34\u0e2a\u0e16\u0e32\u0e19
+territories.MP=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e19\u0e2d\u0e23\u0e4c\u0e17\u0e40\u0e17\u0e34\u0e23\u0e4c\u0e19\u0e21\u0e32\u0e40\u0e23\u0e35\u0e22\u0e19\u0e32
territories.AE=\u0e2a\u0e2b\u0e23\u0e31\u0e10\u0e2d\u0e32\u0e2b\u0e23\u0e31\u0e1a\u0e40\u0e2d\u0e21\u0e34\u0e40\u0e23\u0e15\u0e2a\u0e4c
territories.MO=\u0e21\u0e32\u0e40\u0e01\u0e4a\u0e32 \u0e40\u0e02\u0e15\u0e1b\u0e01\u0e04\u0e23\u0e2d\u0e07\u0e1e\u0e34\u0e40\u0e28\u0e29\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28\u0e08\u0e35\u0e19
territories.AD=\u0e2d\u0e31\u0e19\u0e14\u0e2d\u0e23\u0e4c\u0e23\u0e32
@@ -165,8 +263,8 @@ territories.MN=\u0e21\u0e2d\u0e07\u0e42\u0e01\u0e40\u0e25\u0e35\u0e22
territories.MM=\u0e1e\u0e21\u0e48\u0e32
territories.ML=\u0e21\u0e32\u0e25\u0e35
territories.MK=\u0e21\u0e32\u0e0b\u0e34\u0e42\u0e14\u0e40\u0e19\u0e35\u0e22
-territories.YU=\u0e22\u0e39\u0e42\u0e01\u0e2a\u0e25\u0e32\u0e40\u0e27\u0e35\u0e22
territories.YT=\u0e21\u0e32\u0e22\u0e2d\u0e15
+territories.MH=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e21\u0e32\u0e23\u0e4c\u0e41\u0e0a\u0e25
territories.MG=\u0e21\u0e32\u0e14\u0e32\u0e01\u0e31\u0e2a\u0e01\u0e32\u0e23\u0e4c
territories.MD=\u0e21\u0e2d\u0e25\u0e42\u0e14\u0e27\u0e32
territories.MC=\u0e42\u0e21\u0e19\u0e32\u0e42\u0e01
@@ -174,25 +272,34 @@ territories.MA=\u0e42\u0e21\u0e23\u0e47\u0e2d\u0e01\u0e42\u0e01
territories.YE=\u0e40\u0e22\u0e40\u0e21\u0e19
territories.LY=\u0e25\u0e34\u0e40\u0e1a\u0e35\u0e22
territories.LV=\u0e25\u0e31\u0e15\u0e40\u0e27\u0e35\u0e22
+territories.155=\u0e22\u0e38\u0e42\u0e23\u0e1b\u0e15\u0e30\u0e27\u0e31\u0e19\u0e15\u0e01
territories.LU=\u0e25\u0e31\u0e01\u0e40\u0e0b\u0e21\u0e40\u0e1a\u0e34\u0e23\u0e4c\u0e01
+territories.154=\u0e22\u0e38\u0e42\u0e23\u0e1b\u0e40\u0e2b\u0e19\u0e37\u0e2d
territories.LT=\u0e25\u0e34\u0e17\u0e31\u0e27\u0e40\u0e19\u0e35\u0e22
territories.LS=\u0e40\u0e25\u0e42\u0e0b\u0e42\u0e17
territories.LR=\u0e44\u0e25\u0e1a\u0e35\u0e40\u0e23\u0e35\u0e22
+territories.151=\u0e22\u0e38\u0e42\u0e23\u0e1b\u0e15\u0e30\u0e27\u0e31\u0e19\u0e2d\u0e2d\u0e01
+territories.150=\u0e22\u0e38\u0e42\u0e23\u0e1b
territories.LK=\u0e28\u0e23\u0e35\u0e25\u0e31\u0e07\u0e01\u0e32
territories.LI=\u0e25\u0e34\u0e01\u0e40\u0e15\u0e19\u0e2a\u0e44\u0e15\u0e19\u0e4c
+territories.LC=\u0e40\u0e0b\u0e19\u0e15\u0e4c\u0e25\u0e39\u0e40\u0e0b\u0e35\u0e22
territories.LB=\u0e40\u0e25\u0e1a\u0e32\u0e19\u0e2d\u0e19
territories.LA=\u0e25\u0e32\u0e27
territories.KZ=\u0e04\u0e32\u0e0b\u0e31\u0e04\u0e2a\u0e16\u0e32\u0e19
territories.KY=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e40\u0e04\u0e22\u0e4c\u0e41\u0e21\u0e19
territories.KW=\u0e04\u0e39\u0e40\u0e27\u0e15
+territories.145=\u0e40\u0e2d\u0e40\u0e0a\u0e35\u0e22\u0e15\u0e30\u0e27\u0e31\u0e19\u0e15\u0e01
+territories.142=\u0e40\u0e2d\u0e40\u0e0a\u0e35\u0e22
territories.KR=\u0e40\u0e01\u0e32\u0e2b\u0e25\u0e35\u0e43\u0e15\u0e49
territories.KP=\u0e40\u0e01\u0e32\u0e2b\u0e25\u0e35\u0e40\u0e2b\u0e19\u0e37\u0e2d
+territories.KN=\u0e40\u0e0b\u0e19\u0e15\u0e4c\u0e04\u0e34\u0e15\u0e2a\u0e4c\u0e41\u0e25\u0e30\u0e40\u0e19\u0e27\u0e34\u0e2a
territories.KM=\u0e04\u0e2d\u0e42\u0e21\u0e42\u0e23\u0e2a
territories.KI=\u0e04\u0e34\u0e23\u0e34\u0e1a\u0e32\u0e2a
territories.WS=\u0e0b\u0e32\u0e21\u0e31\u0e27
territories.KH=\u0e01\u0e31\u0e21\u0e1e\u0e39\u0e0a\u0e32
territories.KG=\u0e04\u0e35\u0e23\u0e4c\u0e01\u0e34\u0e0b\u0e2a\u0e16\u0e32\u0e19
territories.KE=\u0e40\u0e04\u0e19\u0e22\u0e32
+territories.WF=\u0e27\u0e32\u0e25\u0e25\u0e34\u0e2a\u0e41\u0e25\u0e30\u0e1f\u0e38\u0e15\u0e39\u0e19\u0e32
territories.JP=\u0e0d\u0e35\u0e48\u0e1b\u0e38\u0e48\u0e19
territories.JO=\u0e08\u0e2d\u0e23\u0e4c\u0e41\u0e14\u0e19
territories.JM=\u0e08\u0e32\u0e40\u0e21\u0e01\u0e32
@@ -202,17 +309,20 @@ territories.VI=\u0e22\u0e39\u0e40\u0e2d\u0e2a\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0
territories.VG=\u0e1a\u0e23\u0e34\u0e17\u0e34\u0e0a\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e08\u0e34\u0e19\u0e44\u0e2d\u0e2a\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.VE=\u0e40\u0e27\u0e40\u0e19\u0e0b\u0e38\u0e40\u0e2d\u0e25\u0e32
territories.VC=\u0e40\u0e0b\u0e19\u0e15\u0e4c\u0e27\u0e34\u0e19\u0e40\u0e0b\u0e19\u0e15\u0e4c\u0e41\u0e25\u0e30\u0e40\u0e01\u0e23\u0e19\u0e32\u0e14\u0e35\u0e19\u0e2a\u0e4c
+territories.VA=\u0e27\u0e32\u0e15\u0e34\u0e01\u0e31\u0e19
territories.IT=\u0e2d\u0e34\u0e15\u0e32\u0e25\u0e35
territories.IS=\u0e44\u0e2d\u0e0b\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.IR=\u0e2d\u0e34\u0e2b\u0e23\u0e48\u0e32\u0e19
territories.IQ=\u0e2d\u0e34\u0e23\u0e31\u0e01
territories.UZ=\u0e2d\u0e38\u0e0b\u0e40\u0e1a\u0e01\u0e34\u0e2a\u0e16\u0e32\u0e19
+territories.IO=\u0e1a\u0e23\u0e34\u0e15\u0e34\u0e2a\u0e2d\u0e34\u0e19\u0e40\u0e14\u0e35\u0e22\u0e42\u0e2d\u0e40\u0e0a\u0e35\u0e22\u0e19\u0e40\u0e17\u0e23\u0e4c\u0e23\u0e34\u0e17\u0e2d\u0e23\u0e35
territories.UY=\u0e2d\u0e38\u0e23\u0e38\u0e01\u0e27\u0e31\u0e22
territories.IN=\u0e2d\u0e34\u0e19\u0e40\u0e14\u0e35\u0e22
territories.IL=\u0e2d\u0e34\u0e2a\u0e23\u0e32\u0e40\u0e2d\u0e25
territories.US=\u0e2a\u0e2b\u0e23\u0e31\u0e10\u0e2d\u0e40\u0e21\u0e23\u0e34\u0e01\u0e32
territories.IE=\u0e44\u0e2d\u0e23\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c
territories.ID=\u0e2d\u0e34\u0e19\u0e42\u0e14\u0e19\u0e35\u0e40\u0e0b\u0e35\u0e22
+territories.UM=\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e2a\u0e2b\u0e23\u0e31\u0e10\u0e44\u0e21\u0e40\u0e19\u0e2d\u0e23\u0e4c\u0e40\u0e2d\u0e32\u0e15\u0e4c\u0e44\u0e25\u0e2d\u0e34\u0e07
territories.UG=\u0e2d\u0e39\u0e01\u0e32\u0e19\u0e14\u0e32
territories.UA=\u0e22\u0e39\u0e40\u0e04\u0e23\u0e19
territories.HU=\u0e2e\u0e31\u0e07\u0e01\u0e32\u0e23\u0e35
@@ -220,7 +330,9 @@ territories.HT=\u0e40\u0e2e\u0e15\u0e34
territories.HR=\u0e42\u0e04\u0e23\u0e40\u0e2d\u0e40\u0e0a\u0e35\u0e22
territories.TZ=\u0e17\u0e32\u0e19\u0e0b\u0e32\u0e40\u0e19\u0e35\u0e22
territories.HN=\u0e2e\u0e2d\u0e19\u0e14\u0e39\u0e23\u0e31\u0e2a
+territories.HM=\u0e40\u0e01\u0e32\u0e30\u0e40\u0e2e\u0e34\u0e23\u0e4c\u0e14\u0e41\u0e25\u0e30\u0e2b\u0e21\u0e39\u0e48\u0e40\u0e01\u0e32\u0e30\u0e41\u0e21\u0e01\u0e14\u0e2d\u0e19\u0e31\u0e25\u0e14\u0e4c
territories.TW=\u0e44\u0e15\u0e49\u0e2b\u0e27\u0e31\u0e19
+territories.TV=\u0e15\u0e39\u0e27\u0e32\u0e25\u0e39
territories.HK=\u0e2e\u0e48\u0e2d\u0e07\u0e01\u0e07 \u0e40\u0e02\u0e15\u0e1b\u0e01\u0e04\u0e23\u0e2d\u0e07\u0e1e\u0e34\u0e40\u0e28\u0e29\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28\u0e08\u0e35\u0e19
territories.TT=\u0e15\u0e23\u0e34\u0e19\u0e34\u0e41\u0e14\u0e14\u0e41\u0e25\u0e30\u0e42\u0e15\u0e40\u0e1a\u0e42\u0e01
territories.TR=\u0e15\u0e38\u0e23\u0e01\u0e35
@@ -230,8 +342,8 @@ territories.TM=\u0e40\u0e15\u0e34\u0e23\u0e4c\u0e01\u0e40\u0e21\u0e19\u0e34\u0e2
languages.es=\u0e2a\u0e40\u0e1b\u0e19
languages.ku=\u0e40\u0e04\u0e34\u0e14
languages.eo=\u0e40\u0e2d\u0e2a\u0e40\u0e1b\u0e2d\u0e23\u0e31\u0e19\u0e42\u0e15
-languages.ks=\u0e04\u0e31\u0e0a\u0e21\u0e35\u0e23\u0e35
languages.en=\u0e2d\u0e31\u0e07\u0e01\u0e24\u0e29
+languages.ks=\u0e04\u0e31\u0e0a\u0e21\u0e35\u0e23\u0e35
languages.el=\u0e01\u0e23\u0e35\u0e01
languages.qu=\u0e04\u0e34\u0e27\u0e0a\u0e31\u0e27
languages.ko=\u0e40\u0e01\u0e32\u0e2b\u0e25\u0e35
@@ -255,8 +367,8 @@ languages.cy=\u0e40\u0e27\u0e25\u0e2a\u0e4c
languages.pa=\u0e1b\u0e31\u0e0d\u0e08\u0e32\u0e1b
languages.cs=\u0e40\u0e0a\u0e47\u0e04
languages.iu=\u0e44\u0e2d\u0e19\u0e38\u0e01\u0e15\u0e34\u0e15\u0e31\u0e17
-languages.it=\u0e2d\u0e34\u0e15\u0e32\u0e25\u0e35
languages.co=\u0e04\u0e2d\u0e23\u0e4c\u0e0b\u0e34\u0e01\u0e32
+languages.it=\u0e2d\u0e34\u0e15\u0e32\u0e25\u0e35
languages.is=\u0e44\u0e2d\u0e0b\u0e4c\u0e41\u0e25\u0e19\u0e14\u0e4c\u0e14\u0e34\u0e04
languages.uz=\u0e2d\u0e38\u0e2a\u0e40\u0e1a\u0e04
languages.or=\u0e42\u0e2d\u0e23\u0e34\u0e22\u0e32
@@ -332,8 +444,8 @@ languages.mk=\u0e41\u0e21\u0e0b\u0e35\u0e42\u0e14\u0e40\u0e19\u0e35\u0e22
languages.aa=\u0e2d\u0e32\u0e1f\u0e32
languages.so=\u0e42\u0e0b\u0e21\u0e32\u0e25\u0e35
languages.sn=\u0e42\u0e0b\u0e19\u0e32
-languages.mi=\u0e40\u0e21\u0e32\u0e23\u0e35
languages.gd=\u0e2a\u0e01\u0e47\u0e2d\u0e15\u0e2a\u0e4c\u0e40\u0e01\u0e25\u0e34\u0e04
+languages.mi=\u0e40\u0e21\u0e32\u0e23\u0e35
languages.sm=\u0e0b\u0e32\u0e21\u0e31\u0e27
languages.sl=\u0e2a\u0e42\u0e25\u0e40\u0e27\u0e40\u0e19\u0e35\u0e22
languages.mg=\u0e21\u0e32\u0e25\u0e32\u0e01\u0e32\u0e0b\u0e35
@@ -349,14 +461,14 @@ languages.fy=\u0e1f\u0e23\u0e35\u0e2a\u0e41\u0e25\u0e19\u0e14\u0e4c
languages.sa=\u0e2a\u0e31\u0e19\u0e2a\u0e01\u0e24\u0e15
languages.fr=\u0e1d\u0e23\u0e31\u0e48\u0e07\u0e40\u0e28\u0e2a
languages.lv=\u0e41\u0e25\u0e15\u0e40\u0e27\u0e35\u0e22 (\u0e40\u0e25\u0e17\u0e17\u0e34\u0e2a\u0e0a\u0e4c)
-languages.lt=\u0e25\u0e34\u0e18\u0e31\u0e27\u0e40\u0e19\u0e35\u0e22
languages.fo=\u0e1f\u0e32\u0e42\u0e23\u0e2a
+languages.lt=\u0e25\u0e34\u0e18\u0e31\u0e27\u0e40\u0e19\u0e35\u0e22
languages.rw=\u0e04\u0e34\u0e19\u0e22\u0e32\u0e27\u0e31\u0e19\u0e14\u0e32
languages.ru=\u0e23\u0e31\u0e2a\u0e40\u0e0b\u0e35\u0e22
-languages.lo=\u0e25\u0e32\u0e27
languages.fj=\u0e1f\u0e34\u0e08\u0e34
-languages.ln=\u0e25\u0e34\u0e07\u0e01\u0e32\u0e25\u0e32
+languages.lo=\u0e25\u0e32\u0e27
languages.fi=\u0e1f\u0e34\u0e19
+languages.ln=\u0e25\u0e34\u0e07\u0e01\u0e32\u0e25\u0e32
languages.ro=\u0e42\u0e23\u0e21\u0e31\u0e19
languages.rn=\u0e04\u0e34\u0e23\u0e31\u0e19\u0e14\u0e35
languages.rm=\u0e40\u0e23\u0e42\u0e15-\u0e42\u0e23\u0e41\u0e21\u0e19\u0e0b\u0e4c
@@ -364,5 +476,5 @@ languages.fa=\u0e40\u0e1b\u0e2d\u0e23\u0e4c\u0e40\u0e0b\u0e35\u0e22
languages.la=\u0e25\u0e30\u0e15\u0e34\u0e19
languages.xh=\u0e42\u0e0b\u0e2a\u0e32
languages.eu=\u0e41\u0e1a\u0e2a\u0e01\u0e4c
-languages.ky=\u0e40\u0e04\u0e2d\u0e23\u0e4c\u0e01\u0e34\u0e0b
languages.et=\u0e40\u0e2d\u0e2a\u0e42\u0e15\u0e40\u0e19\u0e35\u0e22
+languages.ky=\u0e40\u0e04\u0e2d\u0e23\u0e4c\u0e01\u0e34\u0e0b
diff --git a/resource/gnu/java/locale/LocaleInformation_ti.properties b/resource/gnu/java/locale/LocaleInformation_ti.properties
index d5f6510dd..22dbc4017 100644
--- a/resource/gnu/java/locale/LocaleInformation_ti.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ti.properties
@@ -5,6 +5,19 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
+currenciesDisplayName.INR=\u12e8\u1215\u1295\u12f5 \u1229\u1352
+currenciesDisplayName.RUB=\u12e8\u122b\u123b \u1229\u1265\u120d
+currenciesDisplayName.JPY=\u12e8\u1303\u1353\u1295 \u12e8\u1295
+currenciesDisplayName.BRL=\u12e8\u1265\u122b\u12da\u120d \u122a\u120d
+currenciesDisplayName.CNY=\u12e8\u127b\u12ed\u1293 \u12e9\u12a0\u1295 \u1228\u1295\u121a\u1295\u1262
+currenciesDisplayName.USD=\u12e8\u12a0\u121c\u122a\u12ab\u1295 \u12f6\u120b\u122d
+currenciesDisplayName.EUR=\u12a0\u12cd\u122e
+currenciesDisplayName.ETB=\u12e8\u12a2\u1275\u12ee\u1335\u12eb \u1265\u122d
+currenciesDisplayName.GBP=\u12e8\u12a5\u1295\u130d\u120a\u12dd \u1353\u12cd\u1295\u12f5 \u1235\u1270\u122d\u120a\u1295\u130d
+currenciesSymbol.ETB=$
+currenciesSymbol.CNY=Y
+currenciesSymbol.USD=USD
+currenciesSymbol.BRL=R$
shortMonths=\u1303\u1295\u12e9®\u134c\u1265\u1229®\u121b\u122d\u127d®\u12a4\u1355\u1228®\u121c\u12ed®\u1301\u1295®\u1301\u120b\u12ed®\u12a6\u1308\u1235®\u1234\u1355\u1274®\u12a6\u12ad\u1270®\u1296\u126c\u121d®\u12f2\u1234\u121d®®
months=\u1303\u1295\u12e9\u12c8\u122a®\u134c\u1265\u1229\u12c8\u122a®\u121b\u122d\u127d®\u12a4\u1355\u1228\u120d®\u121c\u12ed®\u1301\u1295®\u1301\u120b\u12ed®\u12a6\u1308\u1235\u1275®\u1234\u1355\u1274\u121d\u1260\u122d®\u12a6\u12ad\u1270\u12cd\u1260\u122d®\u1296\u126c\u121d\u1260\u122d®\u12f2\u1234\u121d\u1260\u122d®®
shortWeekdays=®\u1230\u1295\u1260®\u1230\u1291\u12ed®\u1220\u1209\u1235®\u1228\u1261\u12d5®\u1283\u1219\u1235®\u12d3\u122d\u1262®\u1240\u12f3\u121d®
diff --git a/resource/gnu/java/locale/LocaleInformation_ti_ER.properties b/resource/gnu/java/locale/LocaleInformation_ti_ER.properties
index 4a79aef99..7b9882ce4 100644
--- a/resource/gnu/java/locale/LocaleInformation_ti_ER.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ti_ER.properties
@@ -6,7 +6,6 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.ERN=ERN
currenciesSymbol.ERN=$
currenciesSymbol.USD=US$
shortMonths=\u1325\u122a®\u1208\u12ab\u1272®\u1218\u130b\u1262®\u121a\u12eb\u12dd®\u130d\u1295\u1266®\u1230\u1290®\u1213\u121d\u1208®\u1290\u1213\u1230®\u1218\u1235\u12a8®\u1325\u1245\u121d®\u1215\u12f3\u122d®\u1273\u1215\u1233®®
diff --git a/resource/gnu/java/locale/LocaleInformation_ti_ET.properties b/resource/gnu/java/locale/LocaleInformation_ti_ET.properties
index aa77a721c..04c7d0b63 100644
--- a/resource/gnu/java/locale/LocaleInformation_ti_ET.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ti_ET.properties
@@ -6,8 +6,6 @@
# This file was automatically generated by gnu.localegen from CLDR.
currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
-currenciesDisplayName.ETB=ETB
-currenciesSymbol.ETB=$
currenciesSymbol.USD=US$
shortDateFormat=dd/MM/yy
mediumDateFormat=dd-MMM-yy
diff --git a/resource/gnu/java/locale/LocaleInformation_tig.properties b/resource/gnu/java/locale/LocaleInformation_tig.properties
new file mode 100644
index 000000000..12e05b320
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_tig.properties
@@ -0,0 +1,300 @@
+# LocaleInformation_tig.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currenciesDisplayName.INR=\u12e8\u1215\u1295\u12f5 \u1229\u1352
+currenciesDisplayName.RUB=\u12e8\u122b\u123b \u1229\u1265\u120d
+currenciesDisplayName.JPY=\u12e8\u1303\u1353\u1295 \u12e8\u1295
+currenciesDisplayName.BRL=\u12e8\u1265\u122b\u12da\u120d \u122a\u120d
+currenciesDisplayName.CNY=\u12e8\u127b\u12ed\u1293 \u12e9\u12a0\u1295 \u1228\u1295\u121a\u1295\u1262
+currenciesDisplayName.USD=\u12e8\u12a0\u121c\u122a\u12ab\u1295 \u12f6\u120b\u122d
+currenciesDisplayName.EUR=\u12a0\u12cd\u122e
+currenciesDisplayName.ETB=\u12e8\u12a2\u1275\u12ee\u1335\u12eb \u1265\u122d
+currenciesDisplayName.GBP=\u12e8\u12a5\u1295\u130d\u120a\u12dd \u1353\u12cd\u1295\u12f5 \u1235\u1270\u122d\u120a\u1295\u130d
+currenciesSymbol.ETB=$
+currenciesSymbol.CNY=Y
+currenciesSymbol.ERN=$
+currenciesSymbol.USD=USD
+currenciesSymbol.BRL=R$
+shortMonths=\u1303\u1295\u12e9®\u134c\u1265\u1229®\u121b\u122d\u127d®\u12a4\u1355\u1228®\u121c\u12ed®\u1301\u1295®\u1301\u120b\u12ed®\u12a6\u1308\u1235®\u1234\u1355\u1274®\u12a6\u12ad\u1270®\u1296\u126c\u121d®\u12f2\u1234\u121d®®
+months=\u1303\u1295\u12e9\u12c8\u122a®\u134c\u1265\u1229\u12c8\u122a®\u121b\u122d\u127d®\u12a4\u1355\u1228\u120d®\u121c\u12ed®\u1301\u1295®\u1301\u120b\u12ed®\u12a6\u1308\u1235\u1275®\u1234\u1355\u1274\u121d\u1260\u122d®\u12a6\u12ad\u1270\u12cd\u1260\u122d®\u1296\u126c\u121d\u1260\u122d®\u12f2\u1234\u121d\u1260\u122d®®
+shortWeekdays=®\u1230/\u12d3®\u1230\u1296®\u1273\u120b\u1238®\u12a3\u1228\u122d®\u12a8\u121a\u123d®\u1305\u121d\u12d3®\u1230/\u1295®
+weekdays=®\u1230\u1295\u1260\u1275 \u12d3\u1263\u12ed®\u1230\u1296®\u1273\u120b\u1238\u1296®\u12a3\u1228\u122d\u1263\u12d3®\u12a8\u121a\u123d®\u1305\u121d\u12d3\u1275®\u1230\u1295\u1260\u1275 \u1295\u12a2\u123d®
+firstDayOfWeek=sat
+eras=\u12d3/\u12d3®\u12d3/\u121d®
+ampms=\u1240\u12f0\u121d \u1230\u122d\u121d\u12d5\u120d®\u1213\u1246 \u1235\u122d\u121d\u12d5\u120d®
+territories.AU=\u12a0\u12cd\u1235\u1275\u122c\u120a\u12eb
+territories.TD=\u127b\u12f5
+territories.AT=\u12a6\u1235\u1275\u122a\u12eb
+territories.GY=\u1309\u12eb\u1293
+territories.AR=\u12a0\u122d\u1300\u1295\u1272\u1293
+territories.GW=\u1262\u1233\u12ce
+territories.MY=\u121b\u120c\u12e2\u12eb
+territories.MX=\u121c\u12ad\u1232\u12ae
+territories.AN=\u1294\u12d8\u122d\u120b\u1295\u12f5\u1235 \u12a0\u1295\u1272\u120d\u1235
+territories.AM=\u12a0\u122d\u121c\u1292\u12eb
+territories.GR=\u130d\u122a\u12ad
+territories.ZA=\u12f0\u1261\u1265 \u12a0\u134d\u122a\u12ab
+territories.AL=\u12a0\u120d\u1263\u1292\u12eb
+territories.GQ=\u12a2\u12b3\u1276\u122a\u12eb\u120d \u130a\u1292
+territories.MU=\u121b\u1229\u1238\u1235
+territories.SY=\u1232\u122a\u12eb
+territories.MT=\u121b\u120d\u1273
+territories.GN=\u130a\u1292
+territories.MR=\u121e\u122a\u1274\u1292\u12eb
+territories.GM=\u130b\u121d\u1262\u12eb
+territories.MO=\u121b\u12ab\u12ce
+territories.AE=\u12e8\u1270\u1263\u1260\u1229\u1275 \u12a0\u1228\u1265 \u12a4\u121d\u122c\u1275\u1235
+territories.MN=\u121e\u1295\u130e\u120a\u12eb
+territories.AD=\u12a0\u1295\u12f6\u122b
+territories.MK=\u121b\u12a8\u12f6\u1292\u12eb
+territories.GF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u1309\u12ca\u12a0\u1293
+territories.SO=\u1231\u121b\u120c
+territories.GE=\u1306\u122d\u1302\u12eb
+territories.SN=\u1234\u1294\u130b\u120d
+territories.GB=\u12a5\u1295\u130d\u120a\u12dd
+territories.SK=\u1235\u120e\u126b\u12aa\u12eb
+territories.SI=\u1235\u120e\u126c\u1292\u12eb
+territories.MD=\u121e\u120d\u12f6\u126b
+territories.SG=\u1232\u1295\u130b\u1356\u122d
+territories.MA=\u121e\u122e\u12ae
+territories.SE=\u1235\u12ca\u12f5\u1295
+territories.SD=\u1231\u12f3\u1295
+territories.SA=\u1233\u12cd\u12f5\u12a0\u1228\u1262\u12eb
+territories.YE=\u12e8\u1218\u1295
+territories.LY=\u120a\u1262\u12eb
+territories.FR=\u1348\u1228\u1295\u1233\u12ed
+territories.LV=\u120b\u1275\u126a\u12eb
+territories.LT=\u120a\u1271\u12cc\u1292\u12eb
+territories.FM=\u121a\u12ad\u122e\u1294\u12e2\u12eb
+territories.RU=\u122b\u123a\u12eb
+territories.FJ=\u134a\u1302
+territories.FI=\u134a\u1295\u120b\u1295\u12f5
+territories.RO=\u122e\u121c\u1292\u12eb
+territories.LB=\u120a\u1263\u1296\u1235
+territories.ET=\u12a2\u1275\u12ee\u1335\u12eb
+territories.ES=\u1235\u1354\u1295
+territories.KW=\u12ad\u12cc\u1275
+territories.ER=\u12a4\u122d\u1275\u122b
+territories.KR=\u1230\u121c\u1295 \u12ae\u122a\u12eb
+territories.KP=\u12f0\u1261\u1265 \u12ae\u122a\u12eb
+territories.KM=\u12ae\u121e\u122e\u1235
+territories.EH=\u121d\u12d5\u122b\u1263\u12ca \u1233\u1205\u122b
+territories.EG=\u130d\u1265\u133d
+territories.EE=\u12a4\u1235\u1276\u1292\u12eb
+territories.EC=\u12a2\u12b3\u12f6\u122d
+territories.KH=\u12ab\u121d\u1266\u12f2\u12eb
+territories.DZ=\u12a0\u120d\u1304\u122a\u12eb
+territories.DO=\u12f6\u121a\u1292\u12ad \u122a\u1351\u1265\u120a\u12ad
+territories.DM=\u12f6\u121a\u1292\u12ab
+territories.DK=\u12f4\u1295\u121b\u122d\u12ad
+territories.JP=\u1303\u1353\u1295
+territories.JO=\u1306\u122d\u12f3\u1295
+territories.PR=\u1356\u122d\u1273 \u122a\u12ae
+territories.JM=\u1303\u121b\u12ed\u12ab
+territories.DE=\u1300\u122d\u1218\u1295
+territories.PL=\u1356\u120b\u1295\u12f5
+territories.PG=\u1353\u1351\u12cb \u1292\u12cd \u130a\u1292
+territories.PF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u1356\u120a\u1294\u12e2\u12eb
+territories.PE=\u1354\u1229
+territories.CZ=\u127c\u12ad \u122a\u1351\u1265\u120a\u12ad
+territories.VI=\u12e8\u12a0\u121c\u122a\u12ab \u1268\u122d\u1302\u1295 \u12f0\u1234\u1276\u127d
+territories.CY=\u1233\u12ed\u1355\u1228\u1235
+territories.VG=\u12e8\u12a5\u1295\u130d\u120a\u12dd \u12f5\u1295\u130d\u120d \u12f0\u1234\u1276\u127d
+territories.CV=\u12ac\u1355 \u126c\u122d\u12f4
+territories.VE=\u126c\u1295\u12d9\u12cc\u120b
+territories.CS=\u1230\u122d\u1262\u12eb
+territories.CO=\u12ae\u120e\u121d\u1262\u12eb
+territories.IT=\u1323\u120a\u12eb\u1295
+territories.CN=\u127b\u12ed\u1293
+territories.IS=\u12a0\u12ed\u1235\u120b\u1295\u12f5
+territories.CM=\u12ab\u121c\u1229\u1295
+territories.CL=\u127a\u120a
+territories.IQ=\u12a2\u122b\u1245
+territories.UZ=\u12e9\u12dd\u1260\u12aa\u1235\u1273\u1295
+territories.IN=\u1205\u1295\u12f5
+territories.CH=\u1235\u12ca\u12d8\u122d\u120b\u1295\u12f5
+territories.IL=\u12a5\u1235\u122b\u12a4\u120d
+territories.CF=\u12e8\u1218\u12ab\u12a8\u1208\u129b\u12cd \u12a0\u134d\u122a\u12ab \u122a\u1350\u1265\u120a\u12ad
+territories.US=\u12a0\u121c\u122a\u12ab
+territories.CD=\u12ae\u1295\u130e
+territories.IE=\u12a0\u12e8\u122d\u120b\u1295\u12f5
+territories.ID=\u12a2\u1295\u12f6\u1294\u12e2\u12eb
+territories.BZ=\u1264\u120a\u12d8
+territories.BY=\u1264\u120b\u1229\u1235
+territories.UG=\u12e9\u130b\u1295\u12f3
+territories.BT=\u1261\u1205\u1273\u1295
+territories.BR=\u1265\u122b\u12da\u120d
+territories.NZ=\u1292\u12cd \u12da\u120b\u1295\u12f5
+territories.HU=\u1200\u1295\u130b\u122a
+territories.BO=\u1266\u120a\u126a\u12eb
+territories.HT=\u1200\u12ed\u1272
+territories.BM=\u1264\u122d\u1219\u12f3
+territories.HR=\u12ad\u122e\u12a4\u123d\u12eb
+territories.TZ=\u1273\u1295\u12db\u1292\u12eb
+territories.BH=\u1263\u1205\u122c\u1295
+territories.BG=\u1261\u120d\u130c\u122a\u12eb
+territories.NP=\u1294\u1353\u120d
+territories.HK=\u1206\u1295\u130d \u12ae\u1295\u130d
+territories.TT=\u1275\u122a\u1292\u12f3\u12f5 \u12a5\u1293 \u1276\u1263\u130e
+territories.NO=\u1296\u122d\u12cc
+territories.BE=\u1264\u120d\u1304\u121d
+territories.TR=\u1271\u122d\u12ad
+territories.NL=\u1294\u12d8\u122d\u120b\u1295\u12f5
+territories.BB=\u1263\u122d\u1264\u12f6\u1235
+territories.BA=\u1266\u1235\u1292\u12eb \u12a5\u1293 \u1204\u122d\u12de\u130e\u126a\u1292\u12eb
+territories.TN=\u1271\u1292\u12da\u12eb
+territories.TL=\u121d\u1235\u122b\u1245 \u1272\u121e\u122d
+territories.NG=\u1293\u12ed\u1304\u122a\u12eb
+territories.TJ=\u1273\u1303\u12aa\u1235\u1273\u1295
+territories.AZ=\u12a0\u12d8\u122d\u1263\u1303\u1295
+territories.ZM=\u12db\u121d\u1262\u12eb
+territories.TH=\u1273\u12ed\u120b\u1295\u12f5
+territories.NC=\u1292\u12cd \u12ab\u120c\u12f6\u1292\u12eb
+territories.TF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u12f0\u1261\u1263\u12ca \u130d\u12db\u1276\u127d
+territories.NA=\u1293\u121a\u1262\u12eb
+languages.es=\u1235\u1353\u1292\u123d
+languages.ku=\u12a9\u122d\u12f5\u123d\u129b
+languages.eo=\u12a4\u1235\u1350\u122b\u1295\u1276
+languages.en=\u12a5\u1295\u130d\u120a\u12dd\u129b
+languages.ks=\u12ab\u123d\u121a\u122d\u129b
+languages.el=\u130d\u122a\u12ad\u129b
+languages.qu=\u12b5\u127f\u129b
+languages.ko=\u12ae\u122a\u12eb\u129b
+languages.kn=\u12ab\u1293\u12f3\u129b
+languages.km=\u12ad\u1218\u122d\u129b
+languages.kl=\u12ab\u120b\u120a\u1231\u1275\u129b
+languages.kk=\u12ab\u12db\u12ad\u129b
+languages.wo=\u12ce\u120e\u134d\u129b
+languages.ka=\u130a\u12ee\u122d\u130a\u12eb\u1295
+languages.dz=\u12f5\u12de\u1295\u130d\u12bb\u129b
+languages.jv=\u1303\u126b\u1295\u129b
+languages.pt=\u1356\u122d\u1271\u130b\u120a\u129b
+languages.ps=\u1351\u123d\u1276\u129b
+languages.de=\u1300\u122d\u1218\u1295
+languages.pl=\u1356\u120a\u123d
+languages.da=\u12f4\u1292\u123d
+languages.vo=\u126e\u120b\u1351\u12ad\u129b
+languages.ja=\u1303\u1353\u1295\u129b
+languages.vi=\u126a\u1275\u1293\u121d\u129b
+languages.cy=\u12c8\u120d\u123d
+languages.pa=\u1353\u1295\u1303\u1262\u129b
+languages.cs=\u127c\u12ad\u129b
+languages.iu=\u12a5\u1291\u12ad\u1272\u1271\u1275\u129b
+languages.co=\u12ae\u122d\u1232\u12ab\u129b
+languages.it=\u1323\u120a\u12eb\u1295\u129b
+languages.is=\u12a0\u12ed\u1235\u120b\u1295\u12f5\u129b
+languages.uz=\u12a1\u12dd\u1260\u12ad\u129b
+languages.or=\u12a6\u122a\u12eb\u129b
+languages.ik=\u12a5\u1291\u1352\u12eb\u1245\u129b
+languages.ur=\u12a1\u122d\u12f1\u129b
+languages.om=\u12a6\u122e\u121d\u129b
+languages.ca=\u12ab\u1273\u120b\u1295\u129b
+languages.ie=\u12a5\u1295\u1270\u122d\u120a\u1295\u130d\u12c8
+languages.id=\u12a5\u1295\u12f6\u1292\u1232\u129b
+languages.uk=\u12e9\u12ad\u1228\u1292\u129b
+languages.ia=\u12a2\u1295\u1274\u122d\u120a\u1295\u1313
+languages.oc=\u12a6\u12aa\u1273\u1295\u129b
+languages.ug=\u12a1\u12ca\u130d\u1201\u122d\u129b
+languages.hy=\u12a0\u122d\u1218\u1293\u12ca
+languages.br=\u1265\u122c\u1276\u1295\u129b
+languages.hu=\u1200\u1295\u130b\u122a\u129b
+languages.bo=\u1275\u1260\u1275\u1295\u129b
+languages.bn=\u1260\u1295\u130b\u120a\u129b
+languages.hr=\u12ad\u122e\u123d\u12eb\u1295\u129b
+languages.bi=\u1262\u1235\u120b\u121d\u129b
+languages.tw=\u1275\u12ca\u129b
+languages.bh=\u1262\u1203\u122a
+languages.bg=\u1261\u120d\u130b\u122a\u129b
+languages.tt=\u1273\u1273\u122d\u129b
+languages.no=\u1296\u122d\u12cc\u1302\u12eb\u1295
+languages.be=\u1264\u120b\u122b\u123b\u129b
+languages.ts=\u133e\u1295\u130b\u129b
+languages.hi=\u1210\u1295\u12f5\u129b
+languages.tr=\u1271\u122d\u12ad\u129b
+languages.nl=\u12f0\u127d
+languages.zu=\u12d9\u1209\u129b
+languages.ba=\u1263\u1235\u12aa\u122d\u129b
+languages.to=\u1276\u1295\u130b
+languages.he=\u12d5\u1265\u122b\u1235\u1325
+languages.tn=\u133d\u12cb\u1293\u12ca\u129b
+languages.tl=\u1273\u130b\u120e\u1308\u129b
+languages.tk=\u1271\u122d\u12ad\u1218\u1295\u129b
+languages.ha=\u1203\u12cd\u1233\u129b
+languages.ne=\u1294\u1353\u120a\u129b
+languages.az=\u12a0\u12dc\u122d\u1263\u12ed\u1303\u1295\u129b
+languages.ti=\u1275\u130d\u122d\u129b
+languages.ay=\u12a0\u12eb\u121b\u122d\u129b
+languages.th=\u1273\u12ed\u129b
+languages.tg=\u1273\u1302\u12aa\u129b
+languages.na=\u1293\u12a1\u1229
+languages.te=\u1270\u1209\u1309\u129b
+languages.zh=\u127b\u12ed\u1295\u129b
+languages.as=\u12a0\u1233\u121c\u12db\u12ca
+languages.ar=\u12d0\u122d\u1262\u129b
+languages.ta=\u1273\u121a\u120d\u129b
+languages.gu=\u1309\u1303\u122d\u1272\u129b
+languages.my=\u1261\u122d\u121b\u129b
+languages.am=\u12a0\u121d\u1210\u1228\u129b
+languages.za=\u12e1\u12cb\u1295\u130d\u129b
+languages.mt=\u121b\u120d\u1272\u1235\u129b
+languages.ms=\u121b\u120b\u12ed\u129b
+languages.gn=\u1313\u122b\u1292\u129b
+languages.byn=\u1265\u120a\u1295
+languages.sw=\u1235\u12cb\u1202\u120a\u129b
+languages.mr=\u121b\u122b\u12da\u129b
+languages.sv=\u1235\u12ca\u12f5\u1295\u129b
+languages.gl=\u130b\u1208\u130b\u129b
+languages.su=\u1231\u12f3\u1295\u129b
+languages.af=\u12a0\u134d\u122a\u1243\u1295\u1235\u129b
+languages.st=\u1236\u12de\u129b
+languages.mo=\u121e\u120d\u12f3\u126b\u12ca\u1293
+languages.ss=\u1235\u12cb\u1272\u129b
+languages.mn=\u121e\u1295\u130e\u120b\u12ca\u129b
+languages.gez=\u130d\u12d5\u12dd\u129b
+languages.sr=\u1230\u122d\u1262\u129b
+languages.sq=\u120d\u1264\u1292\u129b
+languages.ml=\u121b\u120b\u12eb\u120b\u121d\u129b
+languages.ab=\u12a0\u1265\u1210\u12da\u129b
+languages.mk=\u121b\u12a8\u12f6\u1292\u129b
+languages.aa=\u12a0\u134b\u122d\u129b
+languages.so=\u1231\u121b\u120d\u129b
+languages.sn=\u123e\u1293\u129b
+languages.mi=\u121b\u12ee\u122a\u129b
+languages.gd=\u12a5\u1235\u12ae\u1275\u1235 \u130c\u120d\u12ad\u129b
+languages.sm=\u1233\u121e\u12a0\u129b
+languages.sl=\u1235\u120e\u126a\u129b
+languages.mg=\u121b\u120b\u130b\u1235\u129b
+languages.tig=\u1275\u130d\u1228
+languages.sk=\u1235\u120e\u126b\u12ad\u129b
+languages.ga=\u12a0\u12ed\u122a\u123d
+languages.yo=\u12ee\u1229\u1263\u12ca\u129b
+languages.si=\u1235\u1295\u1203\u120d\u129b
+languages.sg=\u1233\u1295\u130e\u129b
+languages.yi=\u12ed\u12f2\u123b\u12ca\u129b
+languages.sd=\u1232\u1295\u12f5\u1202\u129b
+languages.fy=\u134d\u122a\u1235\u129b
+languages.sid=\u1232\u12f3\u121d\u129b
+languages.sa=\u1233\u1295\u1235\u12ad\u122a\u1275\u129b
+languages.fr=\u1348\u1228\u1295\u1233\u12ed\u129b
+languages.lv=\u120b\u1275\u126a\u12eb\u1295
+languages.fo=\u134b\u122e\u129b
+languages.lt=\u120a\u1271\u12a0\u1292\u12eb\u1295
+languages.rw=\u12aa\u1295\u12eb\u122d\u12cb\u1295\u12f5\u129b
+languages.ru=\u122b\u123d\u129b
+languages.fj=\u134a\u1302\u129b
+languages.lo=\u120b\u12cd\u1235\u129b
+languages.fi=\u134a\u1292\u123d
+languages.ln=\u120a\u1295\u130b\u120b\u129b
+languages.ro=\u122e\u121b\u1292\u12eb\u1295
+languages.rn=\u1229\u1295\u12f2\u129b
+languages.rm=\u122e\u121b\u1295\u1235
+languages.fa=\u1350\u122d\u1232\u12eb\u129b
+languages.la=\u120b\u1272\u1295\u129b
+languages.xh=\u12de\u1233\u129b
+languages.eu=\u1263\u1235\u12ad\u129b
+languages.et=\u12a4\u1235\u1276\u1292\u12a0\u1295
+languages.ky=\u12aa\u122d\u130a\u12dd\u129b
diff --git a/resource/gnu/java/locale/LocaleInformation_tig_ER.properties b/resource/gnu/java/locale/LocaleInformation_tig_ER.properties
new file mode 100644
index 000000000..c6a9b41dd
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_tig_ER.properties
@@ -0,0 +1,16 @@
+# LocaleInformation_tig_ER.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
+shortDateFormat=dd/MM/yy
+mediumDateFormat=dd-MMM-yyyy
+longDateFormat=dd MMMM yyyy
+fullDateFormat=EEEE\u1361 dd MMMM \u12ee\u121d yyyy G
+shortTimeFormat=h:mm a
+mediumTimeFormat=h:mm:ss a
+longTimeFormat=h:mm:ss a
+fullTimeFormat=h:mm:ss a
diff --git a/resource/gnu/java/locale/LocaleInformation_tr.properties b/resource/gnu/java/locale/LocaleInformation_tr.properties
index 993620d5a..a13d86ed1 100644
--- a/resource/gnu/java/locale/LocaleInformation_tr.properties
+++ b/resource/gnu/java/locale/LocaleInformation_tr.properties
@@ -8,762 +8,351 @@
decimalSeparator=,
groupingSeparator=.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=\u00dcrd\u00fcn Dinar\u0131
-currenciesDisplayName.BOV=Bolivya Mvdol
-currenciesDisplayName.XAU=Alt\u0131n
-currenciesDisplayName.FOK=Faroe Adalar\u0131 Kronu
-currenciesDisplayName.LBP=L\u00fcbnan Liras\u0131
-currenciesDisplayName.EUR=Euro
-currenciesDisplayName.VND=Vietnam Dongu
-currenciesDisplayName.TZS=Tanzanya \u015eilini
-currenciesDisplayName.BOP=Bolivya Pezosu
-currenciesDisplayName.KHR=Kambo\u00e7ya Rieli
-currenciesDisplayName.XAM=Asya Para Birimi
-currenciesDisplayName.BOL=Bolivya Bolivyanosu (1863-1962)
-currenciesDisplayName.KHO=Eski Kambo\u00e7ya Rieli
-currenciesDisplayName.ZMP=Zambiya Liras\u0131
-currenciesDisplayName.AUP=Avustralya Liras\u0131
-currenciesDisplayName.XAF=CFA Frang\u0131 BEAC
-currenciesDisplayName.MTP=Malta Liras\u0131
-currenciesDisplayName.GHR=Yeni Gana Sedisi
-currenciesDisplayName.ZMK=Zambiya Kva\u00e7as\u0131
-currenciesDisplayName.XAD=Asya Hesap Birimi Dinar\u0131
-currenciesDisplayName.GHP=Gana Liras\u0131
-currenciesDisplayName.BOB=Bolivya Bolivyanosu
-currenciesDisplayName.GHO=Eski Gana Sedisi
-currenciesDisplayName.MTL=Malta Liras\u0131
-currenciesDisplayName.AUD=Avustralya Dolar\u0131
-currenciesDisplayName.USS=ABD Dolar\u0131 (Ayn\u0131 g\u00fcn)
-currenciesDisplayName.ITL=\u0130talyan Lireti
-currenciesDisplayName.USN=ABD Dolar\u0131 (Ertesi g\u00fcn)
-currenciesDisplayName.GHC=Gana Sedisi
-currenciesDisplayName.SGD=Singapur Dolar\u0131
-currenciesDisplayName.PAB=Panama Balboas\u0131
-currenciesDisplayName.LAK=Laos Kipi
-currenciesDisplayName.KGS=K\u0131rg\u0131z Somu
-currenciesDisplayName.CHF=\u0130svi\u00e7re Frang\u0131
-currenciesDisplayName.ATS=Avusturya \u015eilini
-currenciesDisplayName.USD=ABD Dolar\u0131
-currenciesDisplayName.ETD=Etiyopya Dolar\u0131
-currenciesDisplayName.BND=Brunei Dolar\u0131
-currenciesDisplayName.JMP=Jamaika Liras\u0131
-currenciesDisplayName.ETB=Etiyopya Birri
-currenciesDisplayName.DZG=Cezayir Frang\u0131 (Germinal)
-currenciesDisplayName.DZF=Yeni Cezayir Frang\u0131
-currenciesDisplayName.DZD=Cezayir Dinar\u0131
-currenciesDisplayName.PYG=Paraguay Guaranisi
-currenciesDisplayName.LYP=Libya Liras\u0131
-currenciesDisplayName.JMD=Jamaika Dolar\u0131
-currenciesDisplayName.ISK=\u0130zlanda Kronu
-currenciesDisplayName.ESP=\u0130spanyol Pezetas\u0131
-currenciesDisplayName.BMP=Bermuda Liras\u0131
-currenciesDisplayName.LYD=Libya Dinar\u0131
-currenciesDisplayName.LYB=Libya \u0130ngiliz Askeri Y\u00f6netimi Liras\u0131
-currenciesDisplayName.BMD=Bermuda Dolar\u0131
-currenciesDisplayName.NLG=Hollanda Florini
-currenciesDisplayName.MRO=Moritanya Ouguiyas\u0131
-currenciesDisplayName.IRR=\u0130ran Riyali
-currenciesDisplayName.SEK=\u0130sve\u00e7 Kronu
-currenciesDisplayName.ERN=Eritre Nakfas\u0131
+currenciesDisplayName.YDD=Yemen Dinar\u0131
+currenciesDisplayName.TWD=Yeni Tayvan Dolar\u0131
currenciesDisplayName.KES=Kenya \u015eilini
-currenciesDisplayName.CFF=Orta Afrika Cumhuriyeti Frang\u0131
+currenciesDisplayName.BYB=Yeni Beyaz Rusya Rublesi (1994-1999)
+currenciesDisplayName.LKR=Sri Lanka Rupisi
+currenciesDisplayName.RWF=Ruanda Frang\u0131
+currenciesDisplayName.TJS=Tacikistan Somonisi
+currenciesDisplayName.SDP=Sudan Liras\u0131
+currenciesDisplayName.TJR=Tacikistan Rublesi
+currenciesDisplayName.ERN=Eritre Nakfas\u0131
+currenciesDisplayName.AFN=Afganistan Afganisi
+currenciesDisplayName.GRD=Yunan Drahmisi
+currenciesDisplayName.IEP=\u0130rlanda Liras\u0131
currenciesDisplayName.ARS=Arjantin Pezosu
+currenciesDisplayName.SDD=Sudan Dinar\u0131
currenciesDisplayName.ARP=Arjantin Pezosu (1983-1985)
-currenciesDisplayName.ARM=Arjantin Pezosu Moneda Nacional
-currenciesDisplayName.TWD=Yeni Tayvan Dolar\u0131
-currenciesDisplayName.SDP=Sudan Liras\u0131
currenciesDisplayName.GEL=G\u00fcrcistan Larisi
+currenciesDisplayName.AFA=Afganistan Afganisi (1927-2002)
currenciesDisplayName.GEK=G\u00fcrcistan Kupon Larisi
-currenciesDisplayName.MQF=Martinik Frang\u0131
+currenciesDisplayName.CRC=Kosta Rika Kolonu
currenciesDisplayName.FKP=Falkland Adalar\u0131 Liras\u0131
+currenciesDisplayName.EEK=Estonya Krunu
+currenciesDisplayName.HKD=Hong Kong Dolar\u0131
+currenciesDisplayName.MDL=Moldova Leyi
currenciesDisplayName.ARA=Arjantin Australi
-currenciesDisplayName.SDD=Sudan Dinar\u0131
currenciesDisplayName.IQD=Irak Dinar\u0131
-currenciesDisplayName.TVD=Tuvalu Dolar\u0131
currenciesDisplayName.SCR=Sey\u015feller Rupisi
+currenciesDisplayName.VUV=Vanuatu Vatusu
+currenciesDisplayName.DKK=Danimarka Kronu
+currenciesDisplayName.KPW=Kuzey Kore Wonu
+currenciesDisplayName.GQE=Ekvator Ginesi Ekuelesi
+currenciesDisplayName.IDR=Endonezya Rupiah\u0131
currenciesDisplayName.LVR=Letonya Rublesi
-currenciesDisplayName.FJP=Fiji Liras\u0131
+currenciesDisplayName.SOS=Somali \u015eilini
+currenciesDisplayName.AED=Birle\u015fik Arap Emirlikleri Dirhemi
+currenciesDisplayName.BWP=Botsvana Pulas\u0131
currenciesDisplayName.LVL=Letonya Lat\u0131
-currenciesDisplayName.CDL=Kongo Zairesi
-currenciesDisplayName.CDG=Kongo Cumhuriyeti Frang\u0131
-currenciesDisplayName.CDF=Kongo Frang\u0131
-currenciesDisplayName.FJD=Fiji Dolar\u0131
+currenciesDisplayName.RUR=Rus Rublesi (1991-1998)
currenciesDisplayName.NIO=Nikaragua Kordobas\u0131 (Oro)
+currenciesDisplayName.ADP=Andora Pezetas\u0131
+currenciesDisplayName.FJD=Fiji Dolar\u0131
currenciesDisplayName.MOP=Makao Patacas\u0131
-currenciesDisplayName.NIG=Alt\u0131n Nikaragua Kordobas\u0131
+currenciesDisplayName.RUB=Rus Rublesi
+currenciesDisplayName.CDF=Kongo Frang\u0131
currenciesDisplayName.NIC=Nikaragua Kordobas\u0131
-currenciesDisplayName.XTR=COMECON Transfer Edilebilir Rublesi
-currenciesDisplayName.FIN=Fin Markkas\u0131 (1860-1962)
-currenciesDisplayName.FIM=Fin Markkas\u0131
+currenciesDisplayName.DJF=Cibuti Frang\u0131
+currenciesDisplayName.ECV=Ekvator Unidad de Valor Constante (UVC)
currenciesDisplayName.SBD=Solomon Adalar\u0131 Dolar\u0131
+currenciesDisplayName.UZS=\u00d6zbekistan Sumu
+currenciesDisplayName.ECS=Ekvator Sukresi
+currenciesDisplayName.PHP=Filipinler Pezosu
+currenciesDisplayName.THB=Tayland Baht\u0131
currenciesDisplayName.LUF=L\u00fcksemburg Frang\u0131
-currenciesDisplayName.TTO=Eski Trinidad ve Tobago Dolar\u0131
-currenciesDisplayName.AOS=Angola Esk\u00fcdosu
-currenciesDisplayName.AOR=Angola Kvanzas\u0131 Reajustado (1995-1999)
-currenciesDisplayName.MNT=Mo\u011fol Tugriki
-currenciesDisplayName.HUF=Macar Forinti
-currenciesDisplayName.BIF=Burundi Frang\u0131
-currenciesDisplayName.AON=Yeni Angola Kvanzas\u0131 (1990-2000)
-currenciesDisplayName.AOK=Angola Kvanzas\u0131 (1977-1990)
+currenciesDisplayName.FIM=Fin Markkas\u0131
currenciesDisplayName.TTD=Trinidad ve Tobago Dolar\u0131
currenciesDisplayName.SZL=Swaziland Lilangenisi
-currenciesDisplayName.NHF=Yeni Hebridler CFP Frang\u0131
-currenciesDisplayName.GBP=\u0130ngiliz Sterlini
-currenciesDisplayName.SAS=Suudi Arabistan Riyali (Sovereign)
+currenciesDisplayName.MNT=Mo\u011fol Tugriki
currenciesDisplayName.SAR=Suudi Arabistan Riyali
+currenciesDisplayName.UAK=Ukrayna Karbovanetz
+currenciesDisplayName.UAH=Ukrayna Grivnas\u0131
+currenciesDisplayName.HUF=Macar Forinti
+currenciesDisplayName.COP=Kolombiya Pezosu
+currenciesDisplayName.QAR=Katar Riyali
currenciesDisplayName.LTT=Litvanya Talonu
-currenciesDisplayName.INR=Hindistan Rupisi
currenciesDisplayName.PTE=Portekiz Esk\u00fcdosu
-currenciesDisplayName.AOA=Angola Kvanzas\u0131
-currenciesDisplayName.PTC=Portekiz Conto
+currenciesDisplayName.AOR=Angola Kvanzas\u0131 Reajustado (1995-1999)
+currenciesDisplayName.UYU=Uruguay Pezosu (Uruguayo)
+currenciesDisplayName.GBP=\u0130ngiliz Sterlini
+currenciesDisplayName.BIF=Burundi Frang\u0131
+currenciesDisplayName.INR=Hindistan Rupisi
+currenciesDisplayName.ZRZ=Zaire Zairesi
+currenciesDisplayName.AON=Yeni Angola Kvanzas\u0131 (1990-2000)
currenciesDisplayName.LTL=Litvanya Litas\u0131
+currenciesDisplayName.XFU=Frans\u0131z UIC-Frang\u0131
currenciesDisplayName.KZT=Kazakistan Tengesi
-currenciesDisplayName.KZR=Kazakistan Rublesi
-currenciesDisplayName.VGD=\u0130ngiliz Virgin Adalar\u0131 Dolar\u0131
-currenciesDisplayName.NGP=Nijerya Liras\u0131
-currenciesDisplayName.MMX=Myanmar Dolar\u0131 FEC
+currenciesDisplayName.MZM=Mozambik Metical\u0131
+currenciesDisplayName.UYP=Uruguay Pezosu (1975-1993)
+currenciesDisplayName.AOK=Angola Kvanzas\u0131 (1977-1990)
+currenciesDisplayName.BUK=Burma Kyat\u0131
+currenciesDisplayName.GNS=Gine Syli
+currenciesDisplayName.XFO=Frans\u0131z Alt\u0131n Frang\u0131
+currenciesDisplayName.PGK=Papua Yeni Gine Kinas\u0131
+currenciesDisplayName.SYP=Suriye Liras\u0131
+currenciesDisplayName.MZE=Mozambik Esk\u00fcdosu
+currenciesDisplayName.OMR=Umman Riyali
currenciesDisplayName.NGN=Nijerya Nairas\u0131
+currenciesDisplayName.ZRN=Yeni Zaire Zairesi
+currenciesDisplayName.AOA=Angola Kvanzas\u0131
+currenciesDisplayName.CNY=\u00c7in Yuan\u0131 Renminbi
+currenciesDisplayName.MAF=Fas Frang\u0131
+currenciesDisplayName.GNF=Gine Frang\u0131
currenciesDisplayName.HTG=Haiti Gurdu
-currenciesDisplayName.SYP=Suriye Liras\u0131
-currenciesDisplayName.PSP=Filistin Liras\u0131
-currenciesDisplayName.BHD=Bahreyn Dinar\u0131
+currenciesDisplayName.MAD=Fas Dirhemi
+currenciesDisplayName.TRY=Yeni T\u00fcrk Liras\u0131
currenciesDisplayName.MMK=Myanmar Kyat\u0131
+currenciesDisplayName.MYR=Malezya Ringiti
+currenciesDisplayName.LSL=Lesotho Lotisi
+currenciesDisplayName.XEU=Avrupa Para Birimi
+currenciesDisplayName.BHD=Bahreyn Dinar\u0131
+currenciesDisplayName.SLL=Sierra Leone Leonesi
+currenciesDisplayName.BTN=Bhutan Ngultrumu
+currenciesDisplayName.TRL=T\u00fcrk Liras\u0131
+currenciesDisplayName.KMF=Komorlar Frang\u0131
currenciesDisplayName.ANG=Hollanda Antilleri Guldeni
currenciesDisplayName.CZK=\u00c7ek Cumhuriyeti Korunas\u0131
-currenciesDisplayName.IMP=Man Adas\u0131 Sterlini
-currenciesDisplayName.BGX=Bulgar Levas\u0131 FEC
-currenciesDisplayName.LSL=Lesotho Lotisi
-currenciesDisplayName.GAF=Gabon CFA Frang\u0131
-currenciesDisplayName.BGO=Bulgar Levas\u0131 (1879-1952)
+currenciesDisplayName.AZM=Azerbaycan Manat\u0131
+currenciesDisplayName.KYD=Kayman Adalar\u0131 Dolar\u0131
+currenciesDisplayName.GMD=Gambiya Dalasisi
currenciesDisplayName.BGN=Yeni Bulgar Levas\u0131
-currenciesDisplayName.BGM=Sosyalist Bulgar Levas\u0131
currenciesDisplayName.CAD=Kanada Dolar\u0131
+currenciesDisplayName.MXV=Meksika Unidad de Inversion (UDI)
currenciesDisplayName.BGL=Bulgar Levas\u0131 (Hard)
-currenciesDisplayName.TRL=T\u00fcrk Liras\u0131
-currenciesDisplayName.KYD=Kayman Adalar\u0131 Dolar\u0131
-currenciesDisplayName.CYP=G\u00fcney K\u0131br\u0131s Liras\u0131
+currenciesDisplayName.VEB=Venezuela Bolivar\u0131
+currenciesDisplayName.MLF=Mali Frang\u0131
currenciesDisplayName.ILS=Yeni \u0130srail \u015eekeli
+currenciesDisplayName.MXP=G\u00fcm\u00fc\u015f Meksika Pezosu (1861-1992)
+currenciesDisplayName.PES=Peru Solu
currenciesDisplayName.GYD=Guyana Dolar\u0131
-currenciesDisplayName.AMD=Ermenistan Dram\u0131
+currenciesDisplayName.MXN=Meksika Pezosu
currenciesDisplayName.ILP=\u0130srail Liras\u0131
-currenciesDisplayName.MLF=Mali Frang\u0131
-currenciesDisplayName.ILL=\u0130srail \u015eekeli
-currenciesDisplayName.VEB=Venezuela Bolivar\u0131
-currenciesDisplayName.ALX=Arnavut Dolar\u0131 FEC
+currenciesDisplayName.SKK=Slovak Korunas\u0131
+currenciesDisplayName.CYP=G\u00fcney K\u0131br\u0131s Liras\u0131
+currenciesDisplayName.XDR=\u00d6zel \u00c7ekme Hakk\u0131 (SDR)
+currenciesDisplayName.PEN=Yeni Peru Solu
currenciesDisplayName.LRD=Liberya Dolar\u0131
-currenciesDisplayName.ALV=Arnavutluk Leki Valute
+currenciesDisplayName.PEI=Peru \u0130nti
+currenciesDisplayName.AMD=Ermenistan Dram\u0131
+currenciesDisplayName.BSD=Bahama Dolar\u0131
currenciesDisplayName.HRK=H\u0131rvat Kunas\u0131
-currenciesDisplayName.REF=Reunion Frang\u0131
+currenciesDisplayName.CLP=\u015eili Pezosu
currenciesDisplayName.HRD=H\u0131rvat Dinar\u0131
-currenciesDisplayName.ALL=Arnavutluk Leki
-currenciesDisplayName.JEP=Jersey Sterlini
-currenciesDisplayName.ALK=Arnavutluk Leki (1946-1961)
-currenciesDisplayName.MKN=Makedonya Dinar\u0131 (1992-1993)
-currenciesDisplayName.VDP=Kuzey Vietnam Viet Minh Piastre Dong Viet
-currenciesDisplayName.VDN=Yeni Kuzey Vietnam Dongu
-currenciesDisplayName.MKD=Makedonya Dinar\u0131
-currenciesDisplayName.VDD=Kuzey Vietnam Piastre Dong Viet
-currenciesDisplayName.TPP=Timor Patacas\u0131
currenciesDisplayName.XPF=CFP Frang\u0131
-currenciesDisplayName.BEL=Bel\u00e7ika Frang\u0131 (finansal)
-currenciesDisplayName.GWP=Gine-Bissau Pezosu
-currenciesDisplayName.KWD=Kuveyt Dinar\u0131
-currenciesDisplayName.GWM=Portekiz Ginesi Mil Reis
-currenciesDisplayName.BEF=Bel\u00e7ika Frang\u0131
+currenciesDisplayName.FRF=Frans\u0131z Frang\u0131
+currenciesDisplayName.BRR=Brezilya Kruzeirosu
+currenciesDisplayName.MKD=Makedonya Dinar\u0131
+currenciesDisplayName.CLF=\u015eili Unidades de Fomento
+currenciesDisplayName.ALL=Arnavutluk Leki
+currenciesDisplayName.BRN=Yeni Brezilya Kruzadosu
+currenciesDisplayName.MWK=Malavi Kva\u00e7as\u0131
+currenciesDisplayName.BRL=Brezilya Reali
currenciesDisplayName.TPE=Timor Esk\u00fcdosu
-currenciesDisplayName.BEC=Bel\u00e7ika Frang\u0131 (konvertibl)
-currenciesDisplayName.GWE=Portekiz Ginesi Esk\u00fcdosu
+currenciesDisplayName.BRE=Brezilya Kruzeirosu (1990-1993)
+currenciesDisplayName.BRC=Brezilya Kruzadosu
+currenciesDisplayName.BRB=Yeni Brezilya Kruzeirosu (1967-1986)
+currenciesDisplayName.DEM=Alman Mark\u0131
+currenciesDisplayName.KWD=Kuveyt Dinar\u0131
+currenciesDisplayName.XCD=Do\u011fu Karayip Dolar\u0131
+currenciesDisplayName.NPR=Nepal Rupisi
+currenciesDisplayName.GWP=Gine-Bissau Pezosu
+currenciesDisplayName.YUN=Konvertibl Yugoslav Dinar\u0131
currenciesDisplayName.SVC=El Salvador Kolonu
-currenciesDisplayName.CWG=Kurasao Florini
-currenciesDisplayName.BDT=Banglade\u015f Takas\u0131
-currenciesDisplayName.TOS=Tonga Sterlini
-currenciesDisplayName.TOP=Tonga Pa\u02bbangas\u0131
+currenciesDisplayName.YUM=Yeni Yugoslav Dinar\u0131
+currenciesDisplayName.BEL=Bel\u00e7ika Frang\u0131 (finansal)
+currenciesDisplayName.SIT=Slovenya Tolar\u0131
+currenciesDisplayName.JPY=Japon Yeni
currenciesDisplayName.XOF=CFA Frang\u0131 BCEAO
+currenciesDisplayName.MVR=Maldiv Adalar\u0131 Rufiyaa
+currenciesDisplayName.GWE=Portekiz Ginesi Esk\u00fcdosu
+currenciesDisplayName.BEF=Bel\u00e7ika Frang\u0131
+currenciesDisplayName.TOP=Tonga Pa\u02bbangas\u0131
+currenciesDisplayName.YUD=Yugoslav Dinar\u0131 (Hard)
+currenciesDisplayName.BEC=Bel\u00e7ika Frang\u0131 (konvertibl)
currenciesDisplayName.SUR=Sovyet Rublesi
-currenciesDisplayName.SUN=Yeni Sovyet Rublesi
-currenciesDisplayName.NCF=Yeni Kaledonya Frang\u0131 (Germinal)
-currenciesDisplayName.CVE=Cape Verde Esk\u00fcdosu
-currenciesDisplayName.XNF=Frans\u0131z Antilleri CFA Frang\u0131
+currenciesDisplayName.ROL=Romen Leyi
+currenciesDisplayName.DDM=Do\u011fu Alman Mark\u0131
+currenciesDisplayName.BDT=Banglade\u015f Takas\u0131
+currenciesDisplayName.XBD=Avrupa Hesap Birimi (XBD)
+currenciesDisplayName.AWG=Aruba Florini
+currenciesDisplayName.XBC=Avrupa Hesap Birimi (XBC)
+currenciesDisplayName.XBB=Avrupa Para Birimi
+currenciesDisplayName.XBA=Birle\u015fik Avrupa Birimi
+currenciesDisplayName.NOK=Norve\u00e7 Kronu
+currenciesDisplayName.MUR=Mauritius Rupisi
currenciesDisplayName.ZAR=G\u00fcney Afrika Rand\u0131
-currenciesDisplayName.DOP=Dominik Pezosu
-currenciesDisplayName.CUX=K\u00fcba FEC
-currenciesDisplayName.ZAP=G\u00fcney Afrika Liras\u0131
+currenciesDisplayName.SHP=Saint Helena Liras\u0131
+currenciesDisplayName.XAU=Alt\u0131n
currenciesDisplayName.ZAL=G\u00fcney Afrika Rand\u0131 (finansal)
+currenciesDisplayName.VND=Vietnam Dongu
+currenciesDisplayName.TZS=Tanzanya \u015eilini
+currenciesDisplayName.GIP=Cebelitar\u0131k Liras\u0131
currenciesDisplayName.TND=Tunus Dinar\u0131
-currenciesDisplayName.CUP=K\u00fcba Pezosu
-currenciesDisplayName.GUF=Frans\u0131z Guyanas\u0131 Frang\u0131
+currenciesDisplayName.CVE=Cape Verde Esk\u00fcdosu
currenciesDisplayName.UGX=Uganda \u015eilini
-currenciesDisplayName.LNR=Seylan Rupisi
-currenciesDisplayName.AIF=Afarlar ve \u0130ssalar Frang\u0131
-currenciesDisplayName.VAL=Vatikan \u015eehir Devleti Liras\u0131
-currenciesDisplayName.STE=Sao Tome ve Principe Esk\u00fcdosu
+currenciesDisplayName.ZMK=Zambiya Kva\u00e7as\u0131
+currenciesDisplayName.JOD=\u00dcrd\u00fcn Dinar\u0131
+currenciesDisplayName.XAF=CFA Frang\u0131 BEAC
+currenciesDisplayName.LBP=L\u00fcbnan Liras\u0131
currenciesDisplayName.UGS=Uganda \u015eilini (1966-1987)
currenciesDisplayName.STD=Sao Tome ve Principe Dobras\u0131
-currenciesDisplayName.MHD=Marshall Adalar\u0131 Dolar\u0131
-currenciesDisplayName.NZP=Yeni Zelanda Liras\u0131
currenciesDisplayName.WST=Bat\u0131 Samoa Talas\u0131
-currenciesDisplayName.WSP=Bat\u0131 Samoa Liras\u0131
-currenciesDisplayName.HNL=Honduras Lempiras\u0131
-currenciesDisplayName.XMF=Ana Fransa yeni Frang\u0131
+currenciesDisplayName.KHR=Kambo\u00e7ya Rieli
+currenciesDisplayName.EUR=Euro
+currenciesDisplayName.DOP=Dominik Pezosu
+currenciesDisplayName.BOV=Bolivya Mvdol
+currenciesDisplayName.MTP=Malta Liras\u0131
+currenciesDisplayName.USS=ABD Dolar\u0131 (Ayn\u0131 g\u00fcn)
+currenciesDisplayName.BOP=Bolivya Pezosu
+currenciesDisplayName.MTL=Malta Liras\u0131
+currenciesDisplayName.CUP=K\u00fcba Pezosu
currenciesDisplayName.TMM=T\u00fcrkmenistan Manat\u0131
-currenciesDisplayName.GTQ=Guatemala Ketzali
+currenciesDisplayName.USN=ABD Dolar\u0131 (Ertesi g\u00fcn)
+currenciesDisplayName.SGD=Singapur Dolar\u0131
currenciesDisplayName.NZD=Yeni Zelanda Dolar\u0131
-currenciesDisplayName.SSP=\u0130sko\u00e7ya Liras\u0131
-currenciesDisplayName.BBD=Barbados Dolar\u0131
+currenciesDisplayName.USD=ABD Dolar\u0131
+currenciesDisplayName.HNL=Honduras Lempiras\u0131
+currenciesDisplayName.BOB=Bolivya Bolivyanosu
+currenciesDisplayName.ITL=\u0130talyan Lireti
+currenciesDisplayName.PAB=Panama Balboas\u0131
+currenciesDisplayName.GTQ=Guatemala Ketzali
+currenciesDisplayName.LAK=Laos Kipi
+currenciesDisplayName.GHC=Gana Sedisi
+currenciesDisplayName.AUD=Avustralya Dolar\u0131
currenciesDisplayName.NAD=Namibya Dolar\u0131
+currenciesDisplayName.KGS=K\u0131rg\u0131z Somu
currenciesDisplayName.MGF=Madagaskar Frang\u0131
+currenciesDisplayName.CHF=\u0130svi\u00e7re Frang\u0131
+currenciesDisplayName.BBD=Barbados Dolar\u0131
currenciesDisplayName.MGA=Madagaskar Ariary
-currenciesDisplayName.EGP=M\u0131s\u0131r Liras\u0131
-currenciesDisplayName.BZH=\u0130ngiliz Honduras\u0131 Dolar\u0131
+currenciesDisplayName.PYG=Paraguay Guaranisi
currenciesDisplayName.PLZ=Polonya Zlotisi (1950-1995)
-currenciesDisplayName.BAN=Yeni Bosna Hersek Dinar\u0131
-currenciesDisplayName.PLX=Polonya ABD Dolar\u0131 FEC
-currenciesDisplayName.BAM=Konvertibl Bosna Hersek Mark\u0131
-currenciesDisplayName.BZD=Belize Dolar\u0131
-currenciesDisplayName.BAD=Bosna Hersek Dinar\u0131
-currenciesDisplayName.PLN=Polonya Zlotisi
currenciesDisplayName.YER=Yemen Riyali
+currenciesDisplayName.ATS=Avusturya \u015eilini
+currenciesDisplayName.ETB=Etiyopya Birri
+currenciesDisplayName.BND=Brunei Dolar\u0131
+currenciesDisplayName.JMD=Jamaika Dolar\u0131
+currenciesDisplayName.EGP=M\u0131s\u0131r Liras\u0131
+currenciesDisplayName.PLN=Polonya Zlotisi
+currenciesDisplayName.DZD=Cezayir Dinar\u0131
+currenciesDisplayName.ISK=\u0130zlanda Kronu
currenciesDisplayName.SRG=Surinam Guldeni
-currenciesDisplayName.CSK=\u00c7ekoslavak Korunas\u0131 (Hard)
+currenciesDisplayName.LYD=Libya Dinar\u0131
+currenciesDisplayName.BZD=Belize Dolar\u0131
+currenciesDisplayName.BAM=Konvertibl Bosna Hersek Mark\u0131
+currenciesDisplayName.ESP=\u0130spanyol Pezetas\u0131
currenciesDisplayName.KRW=G\u00fcney Kore Wonu
+currenciesDisplayName.NLG=Hollanda Florini
+currenciesDisplayName.MRO=Moritanya Ouguiyas\u0131
+currenciesDisplayName.BAD=Bosna Hersek Dinar\u0131
+currenciesDisplayName.ZWD=Zimbabwe Dolar\u0131
+currenciesDisplayName.SEK=\u0130sve\u00e7 Kronu
+currenciesDisplayName.CSK=\u00c7ekoslavak Korunas\u0131 (Hard)
currenciesDisplayName.BYR=Beyaz Rusya Rublesi
-currenciesDisplayName.YEI=Yemen Riyali (Imadi)
-currenciesDisplayName.BYL=Beyaz Rusya Rublesi (1992-1994)
-currenciesDisplayName.CSC=\u00c7ekoslavak Korunas\u0131
-currenciesDisplayName.KRO=Eski G\u00fcney Kore Wonu
-currenciesDisplayName.KRH=G\u00fcney Kore Hwan\u0131
-currenciesDisplayName.BYB=Yeni Beyaz Rusya Rublesi (1994-1999)
-currenciesDisplayName.SQS=Somaliland \u015eilini
-currenciesDisplayName.GRN=Yeni Yunan Drahmisi
+currenciesDisplayName.IRR=\u0130ran Riyali
currenciesDisplayName.PKR=Pakistan Rupisi
-currenciesDisplayName.AFN=Afganistan Afganisi
-currenciesDisplayName.ZWD=Zimbabwe Dolar\u0131
-currenciesDisplayName.LKR=Sri Lanka Rupisi
-currenciesDisplayName.GRD=Yunan Drahmisi
-currenciesDisplayName.IEP=\u0130rlanda Liras\u0131
-currenciesDisplayName.AFA=Afganistan Afganisi (1927-2002)
-currenciesDisplayName.YDD=Yemen Dinar\u0131
-currenciesDisplayName.RWF=Ruanda Frang\u0131
-currenciesDisplayName.CRC=Kosta Rika Kolonu
-currenciesDisplayName.TJS=Tacikistan Somonisi
-currenciesDisplayName.TJR=Tacikistan Rublesi
-currenciesDisplayName.EEK=Estonya Krunu
-currenciesDisplayName.GQP=Ekvator Ginesi Pezetas\u0131
-currenciesDisplayName.MDR=Moldova Rublesi (Cupon)
-currenciesDisplayName.HKD=Hong Kong Dolar\u0131
-currenciesDisplayName.DKK=Danimarka Kronu
-currenciesDisplayName.MDL=Moldova Leyi
-currenciesDisplayName.GQF=Ekvator Ginesi Frang\u0131
-currenciesDisplayName.GQE=Ekvator Ginesi Ekuelesi
-currenciesDisplayName.IDR=Endonezya Rupiah\u0131
-currenciesDisplayName.AED=Birle\u015fik Arap Emirlikleri Dirhemi
-currenciesDisplayName.KPW=Kuzey Kore Wonu
-currenciesDisplayName.IDN=Yeni Endonezya Rupiah\u0131
-currenciesDisplayName.BWP=Botsvana Pulas\u0131
-currenciesDisplayName.MDC=Moldova Leyi (Cupon)
-currenciesDisplayName.IDJ=Endonezya Java Rupiah\u0131
-currenciesDisplayName.KPP=Kuzey Kore Halk Cumhuriyeti Wonu
-currenciesDisplayName.IDG=Endonezya Nica Florini
-currenciesDisplayName.VUV=Vanuatu Vatusu
-currenciesDisplayName.XID=\u0130slam Dinar\u0131
-currenciesDisplayName.SOS=Somali \u015eilini
-currenciesDisplayName.ADP=Andora Pezetas\u0131
-currenciesDisplayName.RUR=Rus Rublesi (1991-1998)
-currenciesDisplayName.GPF=Guadeloupe Frang\u0131
-currenciesDisplayName.DJF=Cibuti Frang\u0131
-currenciesDisplayName.ADD=Andora Dinar\u0131
-currenciesDisplayName.MCG=Fas Frang\u0131 (Germinal)
-currenciesDisplayName.MCF=Yeni Fas Frang\u0131
-currenciesDisplayName.ECV=Ekvator Unidad de Valor Constante (UVC)
-currenciesDisplayName.ECS=Ekvator Sukresi
-currenciesDisplayName.LIF=Liechtenstein Frang\u0131
-currenciesDisplayName.RUB=Rus Rublesi
-currenciesDisplayName.PHP=Filipinler Pezosu
-currenciesDisplayName.UZS=\u00d6zbekistan Sumu
-currenciesDisplayName.COP=Kolombiya Pezosu
-currenciesDisplayName.THB=Tayland Baht\u0131
-currenciesDisplayName.IBP=Kuzey \u0130rlanda Liras\u0131
-currenciesDisplayName.BUR=Burma Rupisi
-currenciesDisplayName.COF=Kongo CFA Frang\u0131
-currenciesDisplayName.BUK=Burma Kyat\u0131
-currenciesDisplayName.COB=Kolombiya Ka\u011f\u0131t Pezosu
-currenciesDisplayName.UZC=\u00d6zbekistan Sumu (Coupon)
-currenciesDisplayName.UAK=Ukrayna Karbovanetz
-currenciesDisplayName.QAR=Katar Riyali
-currenciesDisplayName.UAH=Ukrayna Grivnas\u0131
-currenciesDisplayName.GNS=Gine Syli
-currenciesDisplayName.CNY=\u00c7in Yuan\u0131 Renminbi
-currenciesDisplayName.MZM=Mozambik Metical\u0131
-currenciesDisplayName.CNX=\u00c7in ABD Dolar\u0131 FEC
-currenciesDisplayName.UYU=Uruguay Pezosu (Uruguayo)
-currenciesDisplayName.GNI=Gine Frang\u0131 (1960-1972)
-currenciesDisplayName.SML=San Marino Liras\u0131
-currenciesDisplayName.CNP=\u00c7in Jen Min Piao Yuan\u0131
-currenciesDisplayName.MZE=Mozambik Esk\u00fcdosu
-currenciesDisplayName.GNF=Gine Frang\u0131
-currenciesDisplayName.OMS=Umman Riyali (Saidi)
-currenciesDisplayName.PGK=Papua Yeni Gine Kinas\u0131
-currenciesDisplayName.OMR=Umman Riyali
-currenciesDisplayName.UYP=Uruguay Pezosu (1975-1993)
-currenciesDisplayName.XFU=Frans\u0131z UIC-Frang\u0131
-currenciesDisplayName.BTR=Bhutan Rupisi
-currenciesDisplayName.ZRZ=Zaire Zairesi
-currenciesDisplayName.MAF=Fas Frang\u0131
-currenciesDisplayName.MAD=Fas Dirhemi
-currenciesDisplayName.BTN=Bhutan Ngultrumu
-currenciesDisplayName.XFO=Frans\u0131z Alt\u0131n Frang\u0131
-currenciesDisplayName.UYF=Uruguay Pezosu (Fuerte)
-currenciesDisplayName.MYR=Malezya Ringiti
-currenciesDisplayName.ZRN=Yeni Zaire Zairesi
-currenciesDisplayName.AZM=Azerbaycan Manat\u0131
-currenciesDisplayName.GMP=Gambiya Liras\u0131
-currenciesDisplayName.KMF=Komorlar Frang\u0131
-currenciesDisplayName.SLL=Sierra Leone Leonesi
-currenciesDisplayName.GMD=Gambiya Dalasisi
-currenciesDisplayName.XEU=Avrupa Para Birimi
-currenciesDisplayName.BSP=Bahama Liras\u0131
-currenciesDisplayName.CMF=Kamerun CFA Frang\u0131
-currenciesDisplayName.MXV=Meksika Unidad de Inversion (UDI)
-currenciesDisplayName.XEF=CFA Frank BCEAEC
-currenciesDisplayName.BSD=Bahama Dolar\u0131
-currenciesDisplayName.MXP=G\u00fcm\u00fc\u015f Meksika Pezosu (1861-1992)
-currenciesDisplayName.MXN=Meksika Pezosu
-currenciesDisplayName.PES=Peru Solu
-currenciesDisplayName.GLK=Gr\u00f6nland Kronu
-currenciesDisplayName.BRZ=Brezilya Kruzeirosu (1942-1967)
-currenciesDisplayName.PEN=Yeni Peru Solu
-currenciesDisplayName.CLP=\u015eili Pezosu
-currenciesDisplayName.SKK=Slovak Korunas\u0131
-currenciesDisplayName.PEI=Peru \u0130nti
-currenciesDisplayName.BRR=Brezilya Kruzeirosu
-currenciesDisplayName.XDR=\u00d6zel \u00c7ekme Hakk\u0131 (SDR)
-currenciesDisplayName.FRG=Frans\u0131z Frang\u0131 (Germinal/Franc Poincare)
-currenciesDisplayName.FRF=Frans\u0131z Frang\u0131
-currenciesDisplayName.BRN=Yeni Brezilya Kruzadosu
-currenciesDisplayName.CLF=\u015eili Unidades de Fomento
-currenciesDisplayName.CLE=\u015eili Esk\u00fcdosu
-currenciesDisplayName.BRL=Brezilya Reali
-currenciesDisplayName.CLC=\u015eili Condor
-currenciesDisplayName.BRE=Brezilya Kruzeirosu (1990-1993)
-currenciesDisplayName.DES=Alman Sperrmark
-currenciesDisplayName.MWP=Malavi Liras\u0131
-currenciesDisplayName.BRC=Brezilya Kruzadosu
-currenciesDisplayName.BRB=Yeni Brezilya Kruzeirosu (1967-1986)
-currenciesDisplayName.MWK=Malavi Kva\u00e7as\u0131
-currenciesDisplayName.PDR=Transdniestria Rublesi
-currenciesDisplayName.DEM=Alman Mark\u0131
-currenciesDisplayName.TDF=\u00c7ad CFA Frang\u0131
-currenciesDisplayName.PDN=Yeni Transdniestria Rublesi
-currenciesDisplayName.PDK=Transdniestria Rublesi (Kupon)
-currenciesDisplayName.NPR=Nepal Rupisi
-currenciesDisplayName.CKD=Cook Adalar\u0131 Dolar\u0131
-currenciesDisplayName.JPY=Japon Yeni
-currenciesDisplayName.MVR=Maldiv Adalar\u0131 Rufiyaa
-currenciesDisplayName.XCF=CFA Yeni Frank
-currenciesDisplayName.MVP=Maldiv Adalar\u0131 Rupisi
-currenciesDisplayName.XCD=Do\u011fu Karayip Dolar\u0131
-currenciesDisplayName.SIT=Slovenya Tolar\u0131
-currenciesDisplayName.YUR=Yugoslav Dinar\u0131 (Reformed)
-currenciesDisplayName.AWG=Aruba Florini
-currenciesDisplayName.YUO=Yugoslav Ekim Dinar\u0131
-currenciesDisplayName.DDM=Do\u011fu Alman Mark\u0131
-currenciesDisplayName.YUN=Konvertibl Yugoslav Dinar\u0131
-currenciesDisplayName.YUM=Yeni Yugoslav Dinar\u0131
-currenciesDisplayName.TCC=Turks ve Caicos Adalar\u0131 Crownu
-currenciesDisplayName.YUG=Yugoslav 1994 Dinar\u0131
-currenciesDisplayName.YUF=Yugoslav Federasyonu Dinar\u0131
-currenciesDisplayName.RON=Yeni Romen Leyi
-currenciesDisplayName.YUD=Yugoslav Dinar\u0131 (Hard)
-currenciesDisplayName.ROL=Romen Leyi
-currenciesDisplayName.SIB=Slovenya Tolar\u0131 (Bons)
-currenciesDisplayName.NOK=Norve\u00e7 Kronu
-currenciesDisplayName.MUR=Mauritius Rupisi
-currenciesDisplayName.XBD=Avrupa Hesap Birimi (XBD)
-currenciesDisplayName.GIP=Cebelitar\u0131k Liras\u0131
-currenciesDisplayName.VNS=Vietnam Ulusal Dongu
-currenciesDisplayName.XBC=Avrupa Hesap Birimi (XBC)
-currenciesDisplayName.VNR=Vietnam Cumhuriyeti Dongu
-currenciesDisplayName.XBB=Avrupa Para Birimi
-currenciesDisplayName.XBA=Birle\u015fik Avrupa Birimi
-currenciesDisplayName.KID=Kiribati Dolar\u0131
-currenciesDisplayName.SHP=Saint Helena Liras\u0131
-currenciesDisplayName.VNN=Yeni Vietnam Dongu
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.USS=USS
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=Bermuda Dolar\u0131
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
+currenciesSymbol.STD=Db
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.INR=INR
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.USD=US$
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.CNP=CNP
-currenciesSymbol.MZE=MZE
currenciesSymbol.GNF=GF
-currenciesSymbol.OMS=OMS
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMR=RO
-currenciesSymbol.UYP=UYP
-currenciesSymbol.XFU=XFU
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=Nu
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=RM
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=Oca®\u015eub®Mar®Nis®May®Haz®Tem®A\u011fu®Eyl®Eki®Kas®Ara®®
months=Ocak®\u015eubat®Mart®Nisan®May\u0131s®Haziran®Temmuz®A\u011fustos®Eyl\u00fcl®Ekim®Kas\u0131m®Aral\u0131k®®
shortWeekdays=®Paz®Pzt®Sal®\u00c7ar®Per®Cum®Cmt®
@@ -774,6 +363,7 @@ shortDateFormat=dd.MM.yyyy
mediumDateFormat=dd.MMM.yyyy
longDateFormat=dd MMMM yyyy EEEE
fullDateFormat=dd MMMM yyyy EEEE
+zoneStrings=Pacific/Honolulu®Hawaii Standart Saati®Hawaii Standart Saati®©America/Los_Angeles®Pasifik Standart Saati®Pasifik Yaz Saati®©America/Denver®ABD S\u0131rada\u011flar Standart Saati®ABD S\u0131rada\u011flar Yaz Saati®©America/Phoenix®ABD S\u0131rada\u011flar Standart Saati®ABD S\u0131rada\u011flar Standart Saati®©America/Chicago®Merkezi Standart Saati®Merkezi Yaz Saati®©America/Indianapolis®Do\u011fu Standart Saati®Do\u011fu Standart Saati®©America/St_Johns®Newfoundland Standart Saati®Newfoundland Yaz Saati®©America/Anchorage®Alaska Standart Saati®Alaska Yaz Saati®©Asia/Shanghai®\u00c7in Standart Saati®\u00c7in Standart Saati®©America/New_York®Do\u011fu Standart Saati®Do\u011fu Yaz Saati®©America/Halifax®Atlantik Standart Saati®Atlantik Yaz Saati®©
territories.TL=Do\u011fu Timor
territories.TK=Tokelau
territories.TJ=Tacikistan
@@ -796,7 +386,9 @@ territories.GN=Gine
territories.GM=Gambia
territories.GL=Gr\u00f6nland
territories.SV=El Salvador
+territories.062=G\u00fcney Orta Asya
territories.ST=Sao Tome ve Principe
+territories.061=Polinezya
territories.GI=Cebelitar\u0131k
territories.GH=Gana
territories.SR=Surinam
@@ -820,9 +412,12 @@ territories.SC=Sey\u015feller
territories.SB=Solomon Adalar\u0131
territories.SA=Suudi Arabistan
territories.FR=Fransa
+territories.057=Mikronezya
territories.FO=Faroe Adalar\u0131
territories.FM=Mikronezya Federal Eyaletleri
territories.RW=Ruanda
+territories.054=Melanezya
+territories.053=Avustralya ve Yeni Zelanda
territories.FK=Falkland Adalar\u0131 (Malvinalar)
territories.RU=Rusya Federasyonu
territories.FJ=Fiji
@@ -832,20 +427,26 @@ territories.RE=Reunion
territories.ET=Etiyopya
territories.ES=\u0130spanya
territories.ER=Eritre
+territories.833=Man Adas\u0131
territories.EH=Bat\u0131 Sahara
territories.EG=M\u0131s\u0131r
+territories.830=Kanal Adalar\u0131
territories.EE=Estonya
+territories.QO=Uzak Okyanusya
territories.EC=Ekvator
territories.DZ=Cezayir
territories.QA=Katar
+territories.039=G\u00fcney Avrupa
territories.DO=Dominik Cumhuriyeti
territories.PY=Paraguay
+territories.035=G\u00fcney Do\u011fu Asya
territories.DM=Dominik
territories.PW=Palau
territories.DK=Danimarka
territories.DJ=Cibuti
territories.PT=Portekiz
territories.PS=Filistin B\u00f6lgesi
+territories.030=Do\u011fu Asya
territories.PR=Porto Riko
territories.DE=Almanya
territories.PN=Pitcairn
@@ -862,13 +463,16 @@ territories.CX=Christmas Adas\u0131
territories.CV=Cape Verde
territories.PA=Panama
territories.CU=K\u00fcba
+territories.CS=S\u0131rbistan-Karada\u011f
territories.CR=Kosta Rika
+territories.029=Karayipler
territories.CO=Kolombiya
territories.CN=\u00c7in
territories.CM=Kamerun
territories.CL=\u015eili
territories.CK=Cook Adalar\u0131
territories.CI=Fildi\u015fi Sahilleri
+territories.021=Kuzey Amerika
territories.CH=\u0130svi\u00e7re
territories.CG=Kongo
territories.CF=Orta Afrika Cumhuriyeti
@@ -883,13 +487,20 @@ territories.BV=Bouvet Adas\u0131
territories.BT=Bhutan
territories.BS=Bahamalar
territories.BR=Brezilya
+territories.019=Amerika
+territories.018=G\u00fcney Afrika
territories.NZ=Yeni Zelanda
territories.BO=Bolivya
+territories.017=Orta Afrika
territories.BN=Brunei
territories.BM=Bermuda
+territories.015=Kuzey Afrika
+territories.014=Do\u011fu Afrika
+territories.013=Orta Amerika
territories.NU=Niue Adalar\u0131
territories.BJ=Benin
territories.BI=Burundi
+territories.011=Bat\u0131 Afrika
territories.BH=Bahreyn
territories.NR=Nauru Adas\u0131
territories.BG=Bulgaristan
@@ -907,6 +518,7 @@ territories.NG=Nijerya
territories.NF=Norfolk Adas\u0131
territories.AZ=Azerbaycan
territories.NE=Nijer
+territories.AX=Aland Adalar\u0131
territories.NC=Yeni Kaledonya
territories.AW=Aruba
territories.ZM=Zambiya
@@ -915,19 +527,23 @@ territories.AU=Avustralya
territories.AT=Avusturya
territories.AS=Amerikan Samoas\u0131
territories.AR=Arjantin
+territories.009=Okyanusya
territories.AQ=Antarktika
territories.MZ=Mozambik
territories.AO=Angola
territories.MY=Malezya
territories.AN=Hollanda Antilleri
territories.MX=Meksika
+territories.005=G\u00fcney Amerika
territories.AM=Ermenistan
territories.MW=Malavi
territories.AL=Arnavutluk
territories.MV=Maldivler
territories.ZA=G\u00fcney Afrika
territories.MU=Mauritius
+territories.002=Afrika
territories.MT=Malta
+territories.001=D\u00fcnya
territories.AI=Anguilla
territories.MS=Montserrat
territories.MR=Moritanya
@@ -942,7 +558,6 @@ territories.MN=Mo\u011folistan
territories.MM=Myanmar
territories.ML=Mali
territories.MK=Makedonya Cumhuriyeti
-territories.YU=Yugoslavya
territories.YT=Mayotte
territories.MH=Marshall Adalar\u0131
territories.MG=Madagaskar
@@ -952,10 +567,14 @@ territories.MA=Fas
territories.YE=Yemen
territories.LY=Libya
territories.LV=Letonya
+territories.155=Bat\u0131 Avrupa
territories.LU=L\u00fcksemburg
+territories.154=Kuzey Avrupa
territories.LT=Litvanya
territories.LS=Lesotho
territories.LR=Liberya
+territories.151=Do\u011fu Avrupa
+territories.150=Avrupa
territories.LK=Sri Lanka
territories.LI=Liechtenstein
territories.LC=Saint Lucia
@@ -964,6 +583,8 @@ territories.LA=Laos
territories.KZ=Kazakistan
territories.KY=Kayman Adalar\u0131
territories.KW=Kuveyt
+territories.145=Bat\u0131 Asya
+territories.142=Asya
territories.KR=G\u00fcney Kore
territories.KP=Kuzey Kore
territories.KN=Saint Kittler ve Neviler
@@ -1013,141 +634,260 @@ territories.TR=T\u00fcrkiye
territories.TO=Tonga
territories.TN=Tunus
territories.TM=T\u00fcrkmenistan
-languages.es=\u0130spanyolca
+languages.lb=L\u00fcksemburg Dili
+languages.la=Latince
+languages.xh=Xhosa
+languages.ky=K\u0131rg\u0131zca
+languages.iro=Iroquoian Dilleri
languages.ku=K\u00fcrt\u00e7e
-languages.eo=Esperanto
+languages.krc=Kara\u00e7ay-Balkar
languages.ks=Ke\u015fmirce
-languages.en=\u0130ngilizce
-languages.el=Yunanca
-languages.qu=Quechua
+languages.ypk=Yupik Dilleri
languages.ko=Korece
languages.kn=Kannada
languages.km=Kambo\u00e7ya Dili
languages.kl=Gr\u00f6nland Dili
+languages.ira=\u0130ran Dili
languages.kk=Kazak Dili
+languages.grc=Antik Yunan (1453'e kadar)
+languages.crp=Creoles ve Pidgins (Di\u011fer)
languages.wo=Wolof
+languages.art=Yapay (Di\u011fer)
languages.ka=G\u00fcrc\u00fcce
-languages.dz=Bhutan Dili
+languages.crh=K\u0131r\u0131m T\u00fcrk\u00e7esi; K\u0131r\u0131m Tatarcas\u0131
+languages.gem=Almanca tabanl\u0131 (Di\u011fer)
+languages.afa=Afro Asya Dilleri (Di\u011fer)
languages.jv=Java Dili
-languages.pt=Portekizce
-languages.ps=Pe\u015ftun Dili
-languages.de=Almanca
-languages.pl=Polonya Dili
-languages.da=Danca
+languages.arc=Aramice
+languages.cel=Kelt\u00e7e (Di\u011fer)
+languages.sco=\u0130sko\u00e7
languages.vo=Volapuk
+languages.tut=Altay Dilleri (Di\u011fer)
languages.ja=Japonca
languages.vi=Vietnam Dili
-languages.cy=Gal Dili
-languages.pa=Pencap Dili
-languages.cs=\u00c7ek\u00e7e
+languages.tup=Tupi dilleri
languages.iu=Inuktitut
languages.it=\u0130talyanca
-languages.co=Korsika Dili
languages.is=\u0130zlandaca
+languages.ady=Adige
languages.uz=\u00d6zbek\u00e7e
-languages.or=Oriya
+languages.io=Ido
languages.ik=Inupiak
languages.ur=Urduca
-languages.om=Oromo (Afan)
-languages.ca=Katalan Dili
+languages.nic=Nijer - Kordofanian (Di\u011fer)
languages.ie=Interlingue
+languages.cpp=Creoles ve Pidgins, Portekizce tabanl\u0131 (Di\u011fer)
languages.id=Endonezya Dili
-languages.uk=Ukraynaca
languages.ia=Interlingua
-languages.oc=Occitan
+languages.hit=Hitit\u00e7e
+languages.uk=Ukraynaca
languages.ug=Uygurca
+languages.cpf=Creoles ve Pidgins, Frans\u0131zca tabanl\u0131 (Di\u011fer)
+languages.fiu=Finno - Ugrian (Di\u011fer)
languages.hy=Ermenice
-languages.br=Breton Dili
+languages.cpe=Creoles ve Pidgins, \u0130ngilizce tabanl\u0131 (Di\u011fer)
+languages.nub=Nubian Dilleri
languages.hu=Macarca
-languages.bo=Tibet\u00e7e
-languages.bn=Bengal Dili
+languages.ht=Haiti Dili
+languages.wak=Wakashan Dilleri
+languages.phi=Filipinler Dili (Di\u011fer)
languages.hr=H\u0131rvat\u00e7a
-languages.bi=Bislama
+languages.ty=Tahiti Dili
+languages.apa=Apa\u00e7i Dilleri
languages.tw=Twi
-languages.bh=Bihari
-languages.bg=Bulgarca
+languages.goh=Almanca (750-1050)
languages.tt=Tatarca
-languages.no=Norve\u00e7\u00e7e
-languages.be=Beyaz Rus\u00e7a
-languages.ts=Tsonga
languages.hi=Hint Dili
+languages.ts=Tsonga
+languages.mno=Manobo Dilleri
languages.tr=T\u00fcrk\u00e7e
-languages.nl=Hollanda Dili
-languages.zu=Zulu
-languages.ba=Ba\u015fk\u0131rt Dili
-languages.to=Tonga
+languages.sal=Salishan Dilleri
languages.he=\u0130branice
+languages.cop=Kiptice
+languages.to=Tonga (Tonga Adalar\u0131)
languages.tn=Setswana
+languages.sai=G\u00fcney Amerika Yerlileri Dili (Di\u011fer)
+languages.sms=Skolt Sami
languages.tl=Tagalog
-languages.tk=T\u00fcrkmence
languages.ha=Hausa
-languages.ne=Nepal Dili
-languages.az=Azerice
+languages.tk=T\u00fcrkmence
+languages.dum=Felemenk\u00e7e (1050-1350)
languages.ti=Tigrinya
-languages.ay=Aymara
languages.th=Tay Dili
+languages.smn=Inari Sami
languages.tg=Tacik Dili
-languages.na=Nauru
+languages.mnc=Man\u00e7urya Dili
languages.te=Telugu
-languages.zh=\u00c7ince
-languages.ar=Arap\u00e7a
+languages.smj=Lule Sami
+languages.smi=Sami Dilleri (Di\u011fer)
languages.ta=Tamil
+languages.syr=S\u00fcryanice
languages.gu=Gujarati
-languages.my=Birmanya Dili
-languages.am=Amharik
-languages.za=Zhuang
-languages.mt=Malta Dili
-languages.ms=Malay
+languages.inh=\u0130ngu\u015f Dili
+languages.sma=G\u00fcney Sami
+languages.ine=Hint-Avrupa (Di\u011fer)
languages.gn=Guarani
+languages.inc=Hint\u00e7e (Di\u011fer)
languages.sw=Swahili
-languages.mr=Marathi
-languages.sv=\u0130sve\u00e7\u00e7e
languages.gl=Gali\u00e7ya Dili
+languages.sv=\u0130sve\u00e7\u00e7e
languages.su=Sudan Dili
-languages.af=Afrikaan Dili
languages.st=Sesotho
-languages.mo=Moldavya Dili
+languages.enm=\u0130ngilizce (1100-1500)
languages.ss=Siswati
-languages.mn=Mo\u011fol Dili
+languages.mad=Madura Dili
languages.sr=S\u0131rp\u00e7a
languages.sq=Arnavut\u00e7a
-languages.ml=Malayalam
-languages.ab=Abazca
-languages.mk=Makedonca
-languages.aa=Afar
languages.so=Somali Dili
-languages.sn=Shona
-languages.mi=Maori
languages.gd=\u0130sko\u00e7 Gal Dili
+languages.sn=Shona
languages.sm=Samoa Dili
languages.sl=Slovence
-languages.mg=Malaga Dili
-languages.sk=Slovak\u00e7a
languages.ga=\u0130rlanda Dili
-languages.yo=Yoruba
+languages.sk=Slovak\u00e7a
languages.si=Sinhal Dili
languages.sh=S\u0131rp-H\u0131rvat Dili
languages.sg=Sangho
-languages.yi=Yiddi\u015f
-languages.sd=Sindhi
+languages.se=Kuzey Sami
languages.fy=Frizye Dili
+languages.sd=Sindhi
+languages.sc=Sardunya Dili
languages.sa=Sanskrit\u00e7e
+languages.cau=Kafkas\u00e7a (Di\u011fer)
+languages.ang=Eski \u0130ngilizce (450-1100)
languages.fr=Frans\u0131zca
-languages.lv=Letonya Dili
-languages.lt=Litvanya Dili
+languages.sla=Slav Dilleri (Di\u011fer)
languages.fo=Faroe Dili
+languages.pro=Eski Proven\u00e7al (1500'e kadar)
languages.rw=Kinyarwanda
+languages.gmh=Almanca (1050-1500)
languages.ru=Rus\u00e7a
-languages.lo=Laos Dili
languages.fj=Fiji Dili
-languages.ln=Lingala
languages.fi=Fince
+languages.cai=Orta Amerika Yerlileri (Di\u011fer)
languages.ro=Romence
+languages.cad=Caddo
languages.rn=Kirundi
+languages.hsb=Yukar\u0131 Sorb\u00e7a
languages.rm=Rhaeto-Roman Dili
languages.fa=Fars\u00e7a
-languages.la=Latince
-languages.xh=Xhosa
+languages.pra=Prakrit Dilleri
+languages.peo=Eski Fars\u00e7a (600-400 M.\u00d6.)
+languages.cmc=Chamic Dilleri
languages.eu=Bask Dili
-languages.ky=K\u0131rg\u0131zca
languages.et=Estonya Dili
+languages.dsb=A\u015fa\u011f\u0131 Sorb\u00e7a
+languages.elx=Elam
+languages.es=\u0130spanyolca
+languages.eo=Esperanto
+languages.en=\u0130ngilizce
+languages.el=Yunanca
+languages.qu=Quechua
+languages.fro=Frans\u0131zca (842-1400)
+languages.frm=Frans\u0131zca (1400-1600)
+languages.ee=Ewe
+languages.mkh=Mon-Khmer (Di\u011fer)
+languages.dz=Bhutan Dili
+languages.nds=A\u015fa\u011f\u0131 Almanca; A\u015fa\u011f\u0131 Sakson
+languages.alg=Algonquian Dilleri
+languages.dra=Dravidian (Di\u011fer)
+languages.pt=Portekizce
+languages.ber=Berberi
+languages.ps=Pe\u015ftun Dili
+languages.de=Almanca
+languages.sit=\u00c7in-Tibet (Di\u011fer)
+languages.pl=Polonya Dili
+languages.da=Danca
+languages.sio=Siu Dilleri
+languages.sux=S\u00fcmer
+languages.cy=Gal Dili
+languages.akk=Akad Dili
+languages.cv=\u00c7uva\u015f
+languages.pa=Pencap Dili
+languages.cu=Kilise Slavcas\u0131
+languages.cs=\u00c7ek\u00e7e
+languages.rom=Romanca
+languages.co=Korsika Dili
+languages.mis=\u00c7e\u015fitli Diller
+languages.os=Oset
+languages.or=Oriya
+languages.roa=Roman Dili (Di\u011fer)
+languages.ce=\u00c7e\u00e7ence
+languages.om=Oromo (Afan)
+languages.ca=Katalan Dili
+languages.oj=Ojibwa
+languages.mun=Munda Dilleri
+languages.mul=Birden Fazla Diller
+languages.oc=Occitan (1500 sonras\u0131); Proven\u00e7al
+languages.bs=Bosna Dili
+languages.kum=Kumuk\u00e7a
+languages.xal=Kalm\u0131k
+languages.br=Breton Dili
+languages.bo=Tibet\u00e7e
+languages.bn=Bengal Dili
+languages.bi=Bislama
+languages.bh=Bihari
+languages.nr=G\u00fcney Ndebele
+languages.bg=Bulgarca
+languages.be=Beyaz Rus\u00e7a
+languages.oto=Osmanl\u0131 Dilleri
+languages.no=Norve\u00e7\u00e7e
+languages.nn=Norve\u00e7\u00e7e Nynorsk
+languages.tai=Tay Dili (Di\u011fer)
+languages.nl=Hollanda Dili
+languages.ba=Ba\u015fk\u0131rt Dili
+languages.zu=Zulu
+languages.pau=Palau Dili
+languages.sgn=\u0130\u015faret Dilleri
+languages.cus=Cushitic (Di\u011fer)
+languages.az=Azerice
+languages.khi=Khoisan (Di\u011fer)
+languages.ne=Nepal Dili
+languages.ay=Aymara
+languages.nd=Kuzey Ndebele
+languages.nb=Norve\u00e7 Kitap Dili
+languages.av=Avar Dili
+languages.ota=Osmanl\u0131ca (1500-1928)
+languages.na=Nauru
+languages.aus=Avustralya Dilleri
+languages.ar=Arap\u00e7a
+languages.zh=\u00c7ince
+languages.sga=Eski \u0130rlandaca (900'e kadar)
+languages.my=Birmanya Dili
+languages.chy=\u00c7eyen
+languages.am=Amharik
+languages.nai=Kuzey Amerika Yerlileri Dili (Di\u011fer)
+languages.za=Zhuang
+languages.paa=Papua Dili (Di\u011fer)
+languages.mt=Malta Dili
+languages.ms=Malay
+languages.mr=Marathi
+languages.chr=\u00c7eroki
+languages.af=Afrikaan Dili
+languages.ssa=Nil-Sahara (Di\u011fer)
+languages.mo=Moldavya Dili
+languages.haw=Hawaii Dili
+languages.mn=Mo\u011fol Dili
+languages.ab=Abazca
+languages.aa=Afar
+languages.ml=Malayalam
+languages.mk=Makedonca
+languages.mi=Maori
+languages.mh=Marshall Adalar\u0131 Dili
+languages.mg=Malaga Dili
+languages.chg=\u00c7a\u011fatay Dili
+languages.mga=\u0130rlanda Dili (900-1200)
+languages.yo=Yoruba
+languages.osa=Osage
+languages.egy=M\u0131s\u0131r Dili (Eski)
+languages.yi=Yiddi\u015f
+languages.wen=Sorb Dilleri
+languages.lv=Letonya Dili
+languages.bat=Balt\u0131k (Di\u011fer)
+languages.ath=Athapascan Dilleri
+languages.lt=Litvanya Dili
+languages.ban=Bali Dili
+languages.lo=Laos Dili
+languages.ln=Lingala
+languages.bai=Bamileke Dilleri
+languages.sem=Sami (Di\u011fer)
diff --git a/resource/gnu/java/locale/LocaleInformation_tt.properties b/resource/gnu/java/locale/LocaleInformation_tt.properties
index 39b7e4be5..fe92ef7ad 100644
--- a/resource/gnu/java/locale/LocaleInformation_tt.properties
+++ b/resource/gnu/java/locale/LocaleInformation_tt.properties
@@ -7,7 +7,6 @@
decimalSeparator=,
groupingSeparator=\u00a0
-currenciesDisplayName.RUR=RUR
currenciesSymbol.RUR=\u0440.
territories.RU=\u0420\u043e\u0441\u0441\u0438\u044f
languages.tt=\u0422\u0430\u0442\u0430\u0440
diff --git a/resource/gnu/java/locale/LocaleInformation_uk.properties b/resource/gnu/java/locale/LocaleInformation_uk.properties
index 8260f46a4..2716f7b95 100644
--- a/resource/gnu/java/locale/LocaleInformation_uk.properties
+++ b/resource/gnu/java/locale/LocaleInformation_uk.properties
@@ -8,697 +8,344 @@
decimalSeparator=,
groupingSeparator=\u00a0
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=\u0419\u043e\u0440\u0434\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.BOV=\u0411\u043e\u043b\u0456\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u043c\u0432\u0434\u043e\u043b
-currenciesDisplayName.XAU=\u0417\u043e\u043b\u043e\u0442\u043e
-currenciesDisplayName.FOK=\u0424\u0430\u0440\u0435\u0440\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.LBP=\u041b\u0456\u0432\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.EUR=\u0404\u0432\u0440\u043e
-currenciesDisplayName.VND=\u0412\u02bc\u0454\u0442\u043d\u0430\u043c\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043d\u0433
-currenciesDisplayName.TZS=\u0422\u0430\u043d\u0437\u0430\u043d\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433
-currenciesDisplayName.BOP=\u0411\u043e\u043b\u0456\u0432\u0456\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.KHR=\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0454\u043b\u044c
-currenciesDisplayName.XAM=\u0410\u0437\u0456\u0430\u0442\u0441\u044c\u043a\u0430 \u0432\u0430\u043b\u044e\u0442\u043d\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044f
-currenciesDisplayName.BOL=\u0411\u043e\u043b\u0456\u0432\u0456\u0430\u043d\u043e (1863-1962)
-currenciesDisplayName.KHO=\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0441\u0442\u0430\u0440\u0438\u0439 \u0440\u0456\u0454\u043b\u044c
-currenciesDisplayName.ZMP=\u0417\u0430\u043c\u0431\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.AUP=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.XAF=\u0424\u0440\u0430\u043d\u043a \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u043e\u0433\u043e \u0444\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u0442\u043e\u0432\u0430\u0440\u0438\u0441\u0442\u0432\u0430
-currenciesDisplayName.MTP=\u041c\u0430\u043b\u044c\u0442\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.GHR=\u0413\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u043e\u0446\u0456\u043d\u0435\u043d\u0438\u0439 \u0441\u0435\u0434\u0456
-currenciesDisplayName.ZMK=\u0417\u0430\u043c\u0431\u0456\u0439\u0441\u044c\u043a\u0430 \u043a\u0432\u0430\u0447\u0430
-currenciesDisplayName.GHP=\u0413\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.BOB=\u0411\u043e\u043b\u0456\u0432\u0456\u0430\u043d\u043e
-currenciesDisplayName.GHO=\u0413\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0441\u0442\u0430\u0440\u0438\u0439 \u0441\u0435\u0434\u0456
-currenciesDisplayName.MTL=\u041c\u0430\u043b\u044c\u0442\u0456\u0439\u0441\u044c\u043a\u0430 \u043b\u0456\u0440\u0430
-currenciesDisplayName.AUD=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.ITL=\u0406\u0442\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0430 \u043b\u0456\u0440\u0430
-currenciesDisplayName.GHC=\u0413\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0441\u0435\u0434\u0456
-currenciesDisplayName.SGD=\u0421\u0456\u043d\u0433\u0430\u043f\u0443\u0440\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.PAB=\u041f\u0430\u043d\u0430\u043c\u0441\u044c\u043a\u0430 \u0431\u0430\u043b\u044c\u0431\u043e\u0430
-currenciesDisplayName.LAK=\u041b\u0430\u043e\u0441\u044c\u043a\u0438\u0439 \u043a\u0456\u043f
-currenciesDisplayName.KGS=\u041a\u0438\u0440\u0433\u0438\u0437\u044c\u043a\u0438\u0439 \u0441\u043e\u043c
-currenciesDisplayName.CHF=\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.ATS=\u0410\u0432\u0441\u0442\u0440\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433
-currenciesDisplayName.USD=\u0414\u043e\u043b\u0430\u0440 \u0421\u0428\u0410
-currenciesDisplayName.ETD=\u0415\u0444\u0456\u043e\u043f\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.BND=\u0411\u0440\u0443\u043d\u0435\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440r
-currenciesDisplayName.JMP=\u042f\u043c\u0430\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.ETB=\u0415\u0444\u0456\u043e\u043f\u0441\u044c\u043a\u0438\u0439 \u0431\u0438\u0440
-currenciesDisplayName.DZF=\u0410\u043b\u0436\u0438\u0440\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.DZD=\u0410\u043b\u0436\u0438\u0440\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.PYG=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439\u0441\u044c\u043a\u0438\u0439 \u0433\u0443\u0430\u0440\u0430\u043d\u0456
-currenciesDisplayName.LYP=\u041b\u0456\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.JMD=\u042f\u043c\u0430\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.ISK=\u0406\u0441\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.ESP=\u0406\u0441\u043f\u0430\u043d\u0441\u044c\u043a\u0430 \u043f\u0435\u0441\u0435\u0442\u0430
-currenciesDisplayName.BMP=\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.LYD=\u041b\u0456\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.BMD=\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.NLG=\u041d\u0456\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0433\u0443\u043b\u044c\u0434\u0435\u043d
-currenciesDisplayName.MRO=\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0441\u044c\u043a\u0430 \u0443\u0433\u0456\u044f
-currenciesDisplayName.IRR=\u0406\u0440\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0430\u043b
-currenciesDisplayName.SEK=\u0428\u0432\u0435\u0434\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.ERN=\u0415\u0440\u0438\u0442\u0440\u0435\u0439\u0441\u044c\u043a\u0430 \u043d\u0430\u043a\u0444\u0430
+currenciesDisplayName.YDD=\u0404\u043c\u0435\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.TWD=\u041d\u043e\u0432\u0438\u0439 \u0442\u0430\u0439\u0432\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.KES=\u041a\u0435\u043d\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433
-currenciesDisplayName.CFF=\u0424\u0440\u0430\u043d\u043a \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u043e\u0457 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0456\u043a\u0438
+currenciesDisplayName.BYB=\u0411\u0456\u043b\u043e\u0440\u0443\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0440\u0443\u0431\u043b\u044c (1994-1999)
+currenciesDisplayName.LKR=\u0428\u0440\u0456-\u043b\u0430\u043d\u043a\u0456\u0439\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
+currenciesDisplayName.RWF=\u0420\u0443\u0430\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.TJS=\u0422\u0430\u0434\u0436\u0438\u0446\u044c\u043a\u0438\u0439 \u0441\u043e\u043c\u043e\u043d\u0456
+currenciesDisplayName.SDP=\u0421\u0443\u0434\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.TJR=\u0422\u0430\u0434\u0436\u0438\u0446\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
+currenciesDisplayName.ERN=\u0415\u0440\u0438\u0442\u0440\u0435\u0439\u0441\u044c\u043a\u0430 \u043d\u0430\u043a\u0444\u0430
+currenciesDisplayName.AFN=\u0410\u0444\u0433\u0430\u043d\u0456
+currenciesDisplayName.GRD=\u0413\u0440\u0435\u0446\u044c\u043a\u0430 \u0434\u0440\u0430\u0445\u043c\u0430
+currenciesDisplayName.IEP=\u0406\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.ARS=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.SDD=\u0421\u0443\u0434\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.ARP=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e (1983-1985)
-currenciesDisplayName.TWD=\u041d\u043e\u0432\u0438\u0439 \u0442\u0430\u0439\u0432\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.SDP=\u0421\u0443\u0434\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.GEL=\u0413\u0440\u0443\u0437\u0438\u043d\u0441\u044c\u043a\u0438\u0439 \u043b\u0430\u0440\u0456
-currenciesDisplayName.MQF=\u041c\u0430\u0440\u0442\u0438\u043d\u0456\u043a\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.AFA=\u0410\u0444\u0433\u0430\u043d\u0456 (1927-2002)
+currenciesDisplayName.CRC=\u041a\u043e\u0441\u0442\u0430-\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043a\u043e\u043b\u043e\u043d
currenciesDisplayName.FKP=\u0424\u043e\u043b\u043a\u043b\u0435\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.EEK=\u0415\u0441\u0442\u043e\u043d\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
+currenciesDisplayName.HKD=\u0413\u043e\u043d\u043a\u043e\u043d\u0433\u0456\u0432\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.MDL=\u041c\u043e\u043b\u0434\u043e\u0432\u0441\u044c\u043a\u0438\u0439 \u043b\u0435\u0439
currenciesDisplayName.ARA=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0441\u044c\u043a\u0438\u0439 \u0430\u0432\u0441\u0442\u0440\u0430\u043b
-currenciesDisplayName.SDD=\u0421\u0443\u0434\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.IQD=\u0406\u0440\u0430\u043a\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.TVD=\u0414\u043e\u043b\u0430\u0440 \u0422\u0443\u0432\u0430\u043b\u0443
currenciesDisplayName.SCR=\u0421\u0435\u0439\u0448\u0435\u043b\u044c\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
+currenciesDisplayName.VUV=\u0412\u0430\u043d\u0443\u0430\u0442\u0441\u044c\u043a\u0430 \u0432\u0430\u0442\u0443
+currenciesDisplayName.DKK=\u0414\u0430\u0442\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
+currenciesDisplayName.KPW=\u0412\u043e\u043d\u0430 \u041f\u0456\u0432\u043d\u0456\u0447\u043d\u043e\u0457 \u041a\u043e\u0440\u0435\u0457
+currenciesDisplayName.IDR=\u0406\u043d\u0434\u043e\u043d\u0435\u0437\u0456\u0439\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
currenciesDisplayName.LVR=\u041b\u0430\u0442\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.FJP=\u0424\u0456\u0434\u0436\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.SOS=\u0421\u043e\u043c\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433
+currenciesDisplayName.AED=\u0414\u0438\u0440\u0445\u0435\u043c \u041e\u0410\u0415
+currenciesDisplayName.BWP=\u0411\u043e\u0442\u0441\u0432\u0430\u043d\u0441\u044c\u043a\u0430 \u043f\u0443\u043b\u0430
currenciesDisplayName.LVL=\u041b\u0430\u0442\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u043b\u0430\u0442
-currenciesDisplayName.CDL=\u041a\u043e\u043d\u0433\u043e\u043b\u0435\u0437\u044c\u043a\u0438\u0439 \u0437\u0430\u0457\u0440
-currenciesDisplayName.CDG=\u0424\u0440\u0430\u043d\u043a \u041a\u043e\u043d\u0433\u043e\u043b\u0435\u0437\u044c\u043a\u043e\u0457 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0456\u043a\u0438
-currenciesDisplayName.CDF=\u041a\u043e\u043d\u0433\u043e\u043b\u0435\u0437\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.FJD=\u0424\u0456\u0434\u0436\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.RUR=\u0420\u043e\u0441\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c (1991-1998)
currenciesDisplayName.NIO=\u041d\u0456\u043a\u0430\u0440\u0430\u0433\u0443\u0430\u043d\u0441\u044c\u043a\u0430 \u043a\u043e\u0440\u0434\u043e\u0431\u0430 \u043e\u0440\u043e
+currenciesDisplayName.ADP=\u0410\u043d\u0434\u043e\u0440\u0440\u0441\u044c\u043a\u0430 \u043f\u0435\u0441\u0435\u0442\u0430
+currenciesDisplayName.FJD=\u0424\u0456\u0434\u0436\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.MOP=\u041c\u0430\u043a\u0430\u043e \u043f\u0430\u0442\u0430\u043a\u0430
-currenciesDisplayName.NIG=\u041d\u0456\u043a\u0430\u0440\u0430\u0433\u0443\u0430\u043d\u0441\u044c\u043a\u0430 \u0437\u043e\u043b\u043e\u0442\u0430 \u043a\u043e\u0440\u0434\u043e\u0431\u0430
+currenciesDisplayName.RUB=\u0420\u043e\u0441\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
+currenciesDisplayName.CDF=\u041a\u043e\u043d\u0433\u043e\u043b\u0435\u0437\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.NIC=\u041d\u0456\u043a\u0430\u0440\u0430\u0433\u0443\u0430\u043d\u0441\u044c\u043a\u0430 \u043a\u043e\u0440\u0434\u043e\u0431\u0430
-currenciesDisplayName.XTR=\u0420\u0443\u0431\u043b\u044c \u0420\u0415\u0412
-currenciesDisplayName.FIN=\u0424\u0456\u043d\u043b\u044f\u043d\u0434\u0441\u044c\u043a\u0430 \u043c\u0430\u0440\u043a\u0430 (1860-1962)
-currenciesDisplayName.FIM=\u0424\u0456\u043d\u043b\u044f\u043d\u0434\u0441\u044c\u043a\u0430 \u043c\u0430\u0440\u043a\u0430
+currenciesDisplayName.DJF=\u0424\u0440\u0430\u043d\u043a \u0414\u0436\u0456\u0431\u0443\u0442\u0456
+currenciesDisplayName.ECV=\u0415\u043a\u0432\u0430\u0434\u043e\u0440\u0441\u044c\u043a\u0438\u0439 UV\u0421
currenciesDisplayName.SBD=\u0414\u043e\u043b\u0430\u0440 \u0421\u043e\u043b\u043e\u043c\u043e\u043d\u043e\u0432\u0438\u0445 \u041e\u0441\u0442\u0440\u043e\u0432\u0456\u0432
+currenciesDisplayName.UZS=\u0423\u0437\u0431\u0435\u0446\u044c\u043a\u0438\u0439 \u0441\u0443\u043c
+currenciesDisplayName.ECS=\u0415\u043a\u0432\u0430\u0434\u043e\u0440\u0441\u044c\u043a\u0435 \u0441\u0443\u043a\u0440\u0435
+currenciesDisplayName.PHP=\u0424\u0456\u043b\u0456\u043f\u043f\u0456\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.THB=\u0422\u0430\u0457\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0431\u0430\u0442
currenciesDisplayName.LUF=\u041b\u044e\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0437\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.TTO=\u0421\u0442\u0430\u0440\u0438\u0439 \u0434\u043e\u043b\u0430\u0440 \u0422\u0440\u0438\u043d\u0456\u0434\u0430\u0434\u0443 \u0456 \u0422\u043e\u0431\u0430\u0433\u043e
-currenciesDisplayName.AOS=\u0410\u043d\u0433\u043e\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.MNT=\u041c\u043e\u043d\u0433\u043e\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0442\u0443\u0433\u0440\u0438\u043a
-currenciesDisplayName.HUF=\u0423\u0433\u043e\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u043e\u0440\u0438\u043d\u0442
-currenciesDisplayName.BIF=\u0411\u0443\u0440\u0443\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.AON=\u0410\u043d\u0433\u043e\u043b\u044c\u0441\u044c\u043a\u0430 \u043d\u043e\u0432\u0430 \u043a\u0432\u0430\u043d\u0437\u0430 (1990-2000)
-currenciesDisplayName.AOK=\u0410\u043d\u0433\u043e\u043b\u044c\u0441\u044c\u043a\u0430 \u043a\u0432\u0430\u043d\u0437\u0430 (1977-1990)
+currenciesDisplayName.FIM=\u0424\u0456\u043d\u043b\u044f\u043d\u0434\u0441\u044c\u043a\u0430 \u043c\u0430\u0440\u043a\u0430
currenciesDisplayName.TTD=\u0414\u043e\u043b\u0430\u0440 \u0422\u0440\u0438\u043d\u0456\u0434\u0430\u0434\u0443 \u0456 \u0422\u043e\u0431\u0430\u0433\u043e
currenciesDisplayName.SZL=\u0421\u0432\u0430\u0437\u0456\u043b\u0435\u043d\u0434\u0441\u044c\u043a\u0456 \u043b\u0456\u043b\u0430\u043d\u0433\u0435\u043d\u0456
-currenciesDisplayName.NHF=\u0424\u0440\u0430\u043d\u043a \u0413\u0435\u0431\u0440\u0456\u0434\u0441\u044c\u043a\u0438\u0445 \u043e\u0441\u0442\u0440\u043e\u0432\u0456\u0432
-currenciesDisplayName.GBP=\u0410\u043d\u0433\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442 \u0441\u0442\u0435\u0440\u043b\u0456\u043d\u0433\u0456\u0432
+currenciesDisplayName.MNT=\u041c\u043e\u043d\u0433\u043e\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0442\u0443\u0433\u0440\u0438\u043a
currenciesDisplayName.SAR=\u0421\u0430\u0443\u0434\u0456\u0432\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0430\u043b
+currenciesDisplayName.UAK=\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0438\u0439 \u043a\u0430\u0440\u0431\u043e\u0432\u0430\u043d\u0435\u0446\u044c
+currenciesDisplayName.HUF=\u0423\u0433\u043e\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u043e\u0440\u0438\u043d\u0442
+currenciesDisplayName.COP=\u041a\u043e\u043b\u0443\u043c\u0431\u0456\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.QAR=\u041a\u0430\u0442\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0430\u043b
currenciesDisplayName.LTT=\u041b\u0438\u0442\u043e\u0432\u0441\u044c\u043a\u0438\u0439 \u0442\u0430\u043b\u043e\u043d
-currenciesDisplayName.INR=\u0406\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
currenciesDisplayName.PTE=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.AOA=\u0410\u043d\u0433\u043e\u043b\u044c\u0441\u044c\u043a\u0430 \u043a\u0432\u0430\u043d\u0437\u0430
-currenciesDisplayName.PTC=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u043e
+currenciesDisplayName.UYU=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.GBP=\u0410\u043d\u0433\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442 \u0441\u0442\u0435\u0440\u043b\u0456\u043d\u0433\u0456\u0432
+currenciesDisplayName.BIF=\u0411\u0443\u0440\u0443\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.INR=\u0406\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
+currenciesDisplayName.ZRZ=\u0417\u0430\u0457\u0440\u0441\u044c\u043a\u0438\u0439 \u0437\u0430\u0457\u0440
+currenciesDisplayName.AON=\u0410\u043d\u0433\u043e\u043b\u044c\u0441\u044c\u043a\u0430 \u043d\u043e\u0432\u0430 \u043a\u0432\u0430\u043d\u0437\u0430 (1990-2000)
currenciesDisplayName.LTL=\u041b\u0438\u0442\u043e\u0432\u0441\u044c\u043a\u0438\u0439 \u043b\u0456\u0442
+currenciesDisplayName.XFU=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a UIC
currenciesDisplayName.KZT=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0442\u0435\u043d\u0433\u0435
-currenciesDisplayName.KZR=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.VGD=\u0414\u043e\u043b\u0430\u0440 \u0411\u0440\u0438\u0442\u0430\u043d\u0441\u044c\u043a\u0438\u0445 \u0412\u0456\u0440\u0433\u0456\u043d\u0441\u044c\u043a\u0438\u0445 \u041e\u0441\u0442\u0440\u043e\u0432\u0456\u0432
-currenciesDisplayName.NGP=\u041d\u0456\u0433\u0435\u0440\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.MZM=\u041c\u043e\u0437\u0430\u043c\u0431\u0456\u0446\u044c\u043a\u0438\u0439 \u043c\u0435\u0442\u0438\u043a\u0430\u043b
+currenciesDisplayName.UYP=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e (1975-1993)
+currenciesDisplayName.AOK=\u0410\u043d\u0433\u043e\u043b\u044c\u0441\u044c\u043a\u0430 \u043a\u0432\u0430\u043d\u0437\u0430 (1977-1990)
+currenciesDisplayName.BUK=\u0411\u0456\u0440\u043c\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043a\u0456\u0430\u0442
+currenciesDisplayName.GNS=\u0413\u0432\u0456\u043d\u0435\u0439\u0441\u044c\u043a\u0435 \u0441\u0456\u043b\u0456
+currenciesDisplayName.XFO=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0438\u0439 \u0437\u043e\u043b\u043e\u0442\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.PGK=\u041a\u0456\u043d\u0430 \u041f\u0430\u043f\u0443\u0430 \u041d\u043e\u0432\u043e\u0457 \u0413\u0432\u0456\u043d\u0435\u0457
+currenciesDisplayName.SYP=\u0421\u0438\u0440\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.MZE=\u041c\u043e\u0437\u0430\u043c\u0431\u0456\u0446\u044c\u043a\u0438\u0439 \u0435\u0441\u043a\u0443\u0434\u043e
+currenciesDisplayName.OMR=\u041e\u043c\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0430\u043b
currenciesDisplayName.NGN=\u041d\u0456\u0433\u0435\u0440\u0456\u0439\u0441\u044c\u043a\u0430 \u043d\u0430\u0439\u0440\u0430
+currenciesDisplayName.ZRN=\u0417\u0430\u0457\u0440\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0437\u0430\u0457\u0440
+currenciesDisplayName.AOA=\u0410\u043d\u0433\u043e\u043b\u044c\u0441\u044c\u043a\u0430 \u043a\u0432\u0430\u043d\u0437\u0430
+currenciesDisplayName.CNY=\u041a\u0438\u0442\u0430\u0439\u0441\u044c\u043a\u0438\u0439 \u044e\u0430\u043d\u044c
+currenciesDisplayName.MAF=\u041c\u0430\u0440\u043e\u043a\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.GNF=\u0413\u0432\u0456\u0439\u043d\u0435\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.HTG=\u0413\u0430\u0457\u0442\u044f\u043d\u0441\u044c\u043a\u0438\u0439 \u0433\u0443\u0440\u0434
-currenciesDisplayName.SYP=\u0421\u0438\u0440\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.PSP=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.BHD=\u0411\u0430\u0445\u0440\u0435\u0439\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.MAD=\u041c\u0430\u0440\u043e\u043a\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u0440\u0445\u0435\u043c
+currenciesDisplayName.TRY=\u041d\u043e\u0432\u0430 \u0442\u0443\u0440\u0435\u0446\u044c\u043a\u0430 \u043b\u0456\u0440\u0430
currenciesDisplayName.MMK=\u041a\u02bc\u044f\u0442 \u041c\u02bc\u044f\u043d\u043c\u0438
+currenciesDisplayName.MYR=\u041c\u0430\u043b\u0430\u0439\u0437\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0440\u0438\u043d\u0433\u0456\u0442
+currenciesDisplayName.LSL=\u041b\u0435\u0441\u043e\u0442\u0441\u044c\u043a\u0438\u0439 \u043b\u043e\u0442\u0456
+currenciesDisplayName.XEU=\u0404\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u044c\u043a\u0430 \u0432\u0430\u043b\u044e\u0442\u043d\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044f
+currenciesDisplayName.BHD=\u0411\u0430\u0445\u0440\u0435\u0439\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.SLL=\u041b\u0435\u043e\u043d\u0435 \u0421\u044c\u0454\u0440\u0440\u0430-\u041b\u0435\u043e\u043d\u0435
+currenciesDisplayName.BTN=\u0411\u0443\u0442\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043d\u0433\u0443\u043b\u0442\u0440\u0443\u043c
+currenciesDisplayName.TRL=\u0422\u0443\u0440\u0435\u0446\u044c\u043a\u0430 \u043b\u0456\u0440\u0430
+currenciesDisplayName.KMF=\u041a\u043e\u043c\u043e\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.ANG=\u0413\u0443\u043b\u044c\u0434\u0435\u043d \u041d\u0456\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0445 \u0410\u043d\u0442\u0456\u043b
currenciesDisplayName.CZK=\u0427\u0435\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.IMP=\u0424\u0443\u043d\u0442 \u0441\u0442\u0435\u0440\u043b\u0456\u043d\u0433\u0456\u0432 \u041e\u0441\u0442\u0440\u043e\u0432\u0430 \u041c\u0435\u043d
-currenciesDisplayName.LSL=\u041b\u0435\u0441\u043e\u0442\u0441\u044c\u043a\u0438\u0439 \u043b\u043e\u0442\u0456
-currenciesDisplayName.GAF=\u0413\u0430\u0431\u043e\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.BGO=\u0411\u043e\u043b\u0433\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u043b\u0435\u0432 (1879-1952)
+currenciesDisplayName.AZM=\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043c\u0430\u043d\u0430\u0442
+currenciesDisplayName.KYD=\u0414\u043e\u043b\u0430\u0440 \u041a\u0430\u0439\u043c\u0430\u043d\u043e\u0432\u0438\u0445 \u043e\u0441\u0442\u0440\u043e\u0432\u0456\u0432
+currenciesDisplayName.GMD=\u0413\u0430\u043c\u0431\u0456\u0439\u0441\u044c\u043a\u0430 \u0434\u0430\u043b\u0430\u0441\u0456
currenciesDisplayName.BGN=\u0411\u043e\u043b\u0433\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u043b\u0435\u0432
-currenciesDisplayName.BGM=\u0411\u043e\u043b\u0433\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0441\u043e\u0446\u0456\u0430\u043b\u0456\u0441\u0442\u0438\u0447\u043d\u0438\u0439 \u043b\u0435\u0432
currenciesDisplayName.CAD=\u041a\u0430\u043d\u0430\u0434\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.MXV=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 UDI
currenciesDisplayName.BGL=\u0411\u043e\u043b\u0433\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0442\u0432\u0435\u0440\u0434\u0438\u0439 \u043b\u0435\u0432
-currenciesDisplayName.TRL=\u0422\u0443\u0440\u0435\u0446\u044c\u043a\u0430 \u043b\u0456\u0440\u0430
-currenciesDisplayName.KYD=\u0414\u043e\u043b\u0430\u0440 \u041a\u0430\u0439\u043c\u0430\u043d\u043e\u0432\u0438\u0445 \u043e\u0441\u0442\u0440\u043e\u0432\u0456\u0432
-currenciesDisplayName.CYP=\u041a\u0456\u043f\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.VEB=\u0412\u0435\u043d\u0435\u0441\u0443\u0435\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0431\u043e\u043b\u0456\u0432\u0430\u0440
+currenciesDisplayName.MLF=\u041c\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
currenciesDisplayName.ILS=\u0406\u0437\u0440\u0430\u0457\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0448\u0435\u043a\u0435\u043b\u044c
+currenciesDisplayName.MXP=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0435 \u0441\u0440\u0456\u0431\u043d\u0435 \u043f\u0435\u0441\u043e (1861-1992)
+currenciesDisplayName.PES=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0441\u043e\u043b
currenciesDisplayName.GYD=\u0413\u0430\u0439\u044f\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.AMD=\u0412\u0456\u0440\u043c\u0435\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0440\u0430\u043c
+currenciesDisplayName.MXN=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
currenciesDisplayName.ILP=\u0406\u0437\u0440\u0430\u0457\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.MLF=\u041c\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.ILL=\u0406\u0437\u0440\u0430\u0457\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0448\u0435\u043a\u0435\u043b\u044c
-currenciesDisplayName.VEB=\u0412\u0435\u043d\u0435\u0441\u0443\u0435\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0431\u043e\u043b\u0456\u0432\u0430\u0440
+currenciesDisplayName.SKK=\u0421\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
+currenciesDisplayName.CYP=\u041a\u0456\u043f\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.XDR=\u0421\u043f\u0435\u0446\u0456\u0430\u043b\u044c\u043d\u0456 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u043f\u043e\u0437\u0438\u0447\u0435\u043d\u043d\u044f
+currenciesDisplayName.PEN=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0441\u043e\u043b
currenciesDisplayName.LRD=\u041b\u0456\u0431\u0435\u0440\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.ALV=\u0410\u043b\u0431\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043b\u0435\u043a
+currenciesDisplayName.PEI=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0456\u043d\u0442\u0456
+currenciesDisplayName.AMD=\u0412\u0456\u0440\u043c\u0435\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0440\u0430\u043c
+currenciesDisplayName.BSD=\u0411\u0430\u0433\u0430\u043c\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.HRK=\u0425\u043e\u0440\u0432\u0430\u0442\u0441\u044c\u043a\u0430 \u043a\u0443\u043d\u0430
-currenciesDisplayName.REF=\u0420\u0435\u044e\u043d\u044c\u0439\u043e\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.CLP=\u0427\u0438\u043b\u0456\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
currenciesDisplayName.HRD=\u0425\u043e\u0440\u0432\u0430\u0442\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.ALL=\u0410\u043b\u0431\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043b\u0435\u043a
-currenciesDisplayName.JEP=\u0424\u0443\u043d\u0442 \u0441\u0442\u0435\u0440\u043b\u0456\u043d\u0433\u0456\u0432 \u0414\u0436\u0435\u0440\u0441\u0456
-currenciesDisplayName.ALK=\u0410\u043b\u0431\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043b\u0435\u043a (1946-1961)
-currenciesDisplayName.MKN=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440 (1992-1993)
-currenciesDisplayName.VDN=\u041d\u043e\u0432\u0438\u0439 \u0434\u043e\u043d\u0433 \u041f\u0456\u0432\u043d\u0456\u0447\u043d\u043e\u0433\u043e \u0412\u02bc\u0454\u0442\u043d\u0430\u043c\u0443
-currenciesDisplayName.MKD=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.TPP=\u0422\u0456\u043c\u043e\u0440\u0441\u044c\u043a\u0430 \u043f\u0430\u0442\u0430\u043a\u0430
currenciesDisplayName.XPF=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0438\u0439 \u0442\u0438\u0445\u043e\u043e\u043a\u0435\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.BEL=\u0411\u0435\u043b\u044c\u0433\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a (\u0444\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u0438\u0439)
-currenciesDisplayName.GWP=\u041f\u0435\u0441\u043e \u0413\u0432\u0456\u043d\u0435\u0457-\u0411\u0456\u0441\u0430\u0443
-currenciesDisplayName.KWD=\u041a\u0443\u0432\u0435\u0439\u0442\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.GWM=\u041c\u0456\u043b\u044c\u0440\u0435\u0439\u0441 \u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u044c\u043a\u043e\u0457 \u0413\u0432\u0456\u043d\u0435\u0457
-currenciesDisplayName.BEF=\u0411\u0435\u043b\u044c\u0433\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.FRF=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.BRR=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e
+currenciesDisplayName.MKD=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.CLF=\u0427\u0438\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 UF
+currenciesDisplayName.ALL=\u0410\u043b\u0431\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043b\u0435\u043a
+currenciesDisplayName.BRN=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043d\u043e\u0432\u0435 \u043a\u0440\u0443\u0437\u0430\u0434\u043e
+currenciesDisplayName.MWK=\u041c\u0430\u043b\u0430\u0432\u0456\u0439\u0441\u044c\u043a\u0430 \u043a\u0432\u0430\u0447\u0430
+currenciesDisplayName.BRL=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0440\u0435\u0430\u043b
currenciesDisplayName.TPE=\u0422\u0456\u043c\u043e\u0440\u0441\u044c\u043a\u0438\u0439 \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.BEC=\u0411\u0435\u043b\u044c\u0433\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a (\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0432\u0430\u043d\u0438\u0439)
-currenciesDisplayName.GWE=\u0415\u0441\u043a\u0443\u0434\u043e \u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u044c\u043a\u043e\u0457 \u0413\u0432\u0456\u043d\u0435\u0457
+currenciesDisplayName.BRE=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e (1990-1993)
+currenciesDisplayName.BRC=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043a\u0440\u0443\u0437\u0430\u0434\u043e
+currenciesDisplayName.BRB=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043d\u043e\u0432\u0435 \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e (1967-1986)
+currenciesDisplayName.DEM=\u041d\u0456\u043c\u0435\u0446\u044c\u043a\u0430 \u043c\u0430\u0440\u043a\u0430
+currenciesDisplayName.KWD=\u041a\u0443\u0432\u0435\u0439\u0442\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.XCD=\u0414\u043e\u043b\u0430\u0440 \u0421\u0445\u0456\u0434\u043d\u0438\u0445 \u041a\u0438\u0440\u0438\u0431\u0456\u0432
+currenciesDisplayName.NPR=\u041d\u0435\u043f\u0430\u043b\u044c\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
+currenciesDisplayName.GWP=\u041f\u0435\u0441\u043e \u0413\u0432\u0456\u043d\u0435\u0457-\u0411\u0456\u0441\u0430\u0443
+currenciesDisplayName.YUN=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u0438\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
currenciesDisplayName.SVC=\u0415\u043b\u044c-\u0421\u0430\u043b\u044c\u0432\u0430\u0434\u043e\u0440\u0441\u044c\u043a\u0438\u0439 \u043a\u043e\u043b\u043e\u043d
-currenciesDisplayName.CWG=\u0413\u0443\u043b\u044c\u0434\u0435\u043d \u041a\u0443\u0440\u0430\u0441\u044e
-currenciesDisplayName.BDT=\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0441\u044c\u043a\u0430 \u0442\u0430\u043a\u0430
-currenciesDisplayName.TOS=\u0424\u0443\u043d\u0442 \u0441\u0442\u0435\u0440\u043b\u0456\u043d\u0433\u0456\u0432 \u0422\u043e\u043d\u0433\u043e
-currenciesDisplayName.TOP=\u041f\u0430\u0430\u043d\u0433\u0430 \u0422\u043e\u043d\u0433\u043e
+currenciesDisplayName.YUM=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.BEL=\u0411\u0435\u043b\u044c\u0433\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a (\u0444\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u0438\u0439)
+currenciesDisplayName.SIT=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u044c\u043a\u0438\u0439 \u0442\u043e\u043b\u0430\u0440
+currenciesDisplayName.JPY=\u042f\u043f\u043e\u043d\u0441\u044c\u043a\u0430 \u0454\u043d\u0430
currenciesDisplayName.XOF=\u0424\u0440\u0430\u043d\u043a \u0417\u0430\u0445\u0456\u0434\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u043e\u0433\u043e \u0444\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u0442\u043e\u0432\u0430\u0440\u0438\u0441\u0442\u0432\u0430
+currenciesDisplayName.MVR=\u041c\u0430\u043b\u044c\u0434\u0456\u0432\u0441\u044c\u043a\u0430 \u0440\u0443\u0444\u0456\u044f
+currenciesDisplayName.GWE=\u0415\u0441\u043a\u0443\u0434\u043e \u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u044c\u043a\u043e\u0457 \u0413\u0432\u0456\u043d\u0435\u0457
+currenciesDisplayName.BEF=\u0411\u0435\u043b\u044c\u0433\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.TOP=\u041f\u0430\u0430\u043d\u0433\u0430 \u0422\u043e\u043d\u0433\u043e
+currenciesDisplayName.YUD=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u0438\u0439 \u0442\u0432\u0435\u0440\u0434\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.BEC=\u0411\u0435\u043b\u044c\u0433\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a (\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0432\u0430\u043d\u0438\u0439)
currenciesDisplayName.SUR=\u0420\u0430\u0434\u044f\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.SUN=\u0420\u0430\u0434\u044f\u043d\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.NCF=\u0424\u0440\u0430\u043d\u043a \u041d\u043e\u0432\u043e\u0457 \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0456\u0457
-currenciesDisplayName.CVE=\u0415\u0441\u043a\u0443\u0434\u043e \u041a\u0430\u0431\u043e-\u0412\u0435\u0440\u0434\u0435
-currenciesDisplayName.XNF=\u0424\u0440\u0430\u043d\u043a \u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0438\u0445 \u0410\u043d\u0442\u0438\u043b\u044c\u0441\u044c\u043a\u0438\u0445 \u041e\u0441\u0442\u0440\u043e\u0432\u0456\u0432
+currenciesDisplayName.ROL=\u0420\u0443\u043c\u0443\u043d\u0441\u044c\u043a\u0438\u0439 \u043b\u0435\u0439
+currenciesDisplayName.BDT=\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0441\u044c\u043a\u0430 \u0442\u0430\u043a\u0430
+currenciesDisplayName.XBD=\u0404\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u044c\u043a\u0430 \u0440\u043e\u0437\u0440\u0430\u0445\u0443\u043d\u043a\u043e\u0432\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044f (XBD)
+currenciesDisplayName.AWG=\u0410\u0440\u0443\u0431\u0441\u044c\u043a\u0438\u0439 \u0433\u0443\u043b\u044c\u0434\u0435\u043d
+currenciesDisplayName.XBC=\u0404\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u044c\u043a\u0430 \u0440\u043e\u0437\u0440\u0430\u0445\u0443\u043d\u043a\u043e\u0432\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044f (XBC)
+currenciesDisplayName.XBB=\u0404\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u044c\u043a\u0430 \u0433\u0440\u043e\u0448\u043e\u0432\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044f
+currenciesDisplayName.NOK=\u041d\u043e\u0440\u0432\u0435\u0437\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
+currenciesDisplayName.MUR=\u041c\u0430\u0432\u0440\u0438\u043a\u0456\u0439\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
currenciesDisplayName.ZAR=\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0430\u043d\u0434
-currenciesDisplayName.DOP=\u0414\u043e\u043c\u0456\u043d\u0456\u043a\u0430\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.CUX=\u041a\u0443\u0431\u0438\u043d\u0441\u044c\u043a\u0456 \u0432\u0430\u043b\u044e\u0442\u043d\u0456 \u0441\u0435\u0440\u0442\u0438\u0444\u0456\u043a\u0430\u0442\u0438
-currenciesDisplayName.ZAP=\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.SHP=\u0424\u0443\u043d\u0442 \u0421\u0432\u044f\u0442\u043e\u0457 \u0404\u043b\u0435\u043d\u0438
+currenciesDisplayName.XAU=\u0417\u043e\u043b\u043e\u0442\u043e
currenciesDisplayName.ZAL=\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0430\u043d\u0434
+currenciesDisplayName.VND=\u0412\u02bc\u0454\u0442\u043d\u0430\u043c\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043d\u0433
+currenciesDisplayName.TZS=\u0422\u0430\u043d\u0437\u0430\u043d\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433
+currenciesDisplayName.GIP=\u0413\u0456\u0431\u0440\u0430\u043b\u0442\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.TND=\u0422\u0443\u043d\u0456\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.CUP=\u041a\u0443\u0431\u0438\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.GUF=\u0424\u0440\u0430\u043d\u043a \u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u043e\u0457 \u0413\u0432\u0456\u0430\u043d\u0438
+currenciesDisplayName.CVE=\u0415\u0441\u043a\u0443\u0434\u043e \u041a\u0430\u0431\u043e-\u0412\u0435\u0440\u0434\u0435
currenciesDisplayName.UGX=\u0423\u0433\u0430\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433
-currenciesDisplayName.LNR=\u0426\u0435\u0439\u043b\u043e\u043d\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.AIF=\u0424\u0440\u0430\u043d\u043a \u0410\u0444\u0444\u0430\u0440\u0441\u0443 \u0442\u0430 \u0406\u0441\u0430\u0430\u0441\u0443
-currenciesDisplayName.VAL=\u0412\u0430\u0442\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0430 \u043b\u0456\u0440\u0430
-currenciesDisplayName.STE=\u0415\u0441\u043a\u0443\u0434\u043e \u0421\u0430\u043d-\u0422\u043e\u043c\u0435 \u0456 \u041f\u0440\u0456\u043d\u0441\u0456\u043f\u0456
+currenciesDisplayName.ZMK=\u0417\u0430\u043c\u0431\u0456\u0439\u0441\u044c\u043a\u0430 \u043a\u0432\u0430\u0447\u0430
+currenciesDisplayName.JOD=\u0419\u043e\u0440\u0434\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.XAF=\u0424\u0440\u0430\u043d\u043a \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u043e\u0433\u043e \u0444\u0456\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u0442\u043e\u0432\u0430\u0440\u0438\u0441\u0442\u0432\u0430
+currenciesDisplayName.LBP=\u041b\u0456\u0432\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.UGS=\u0423\u0433\u0430\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433 (1966-1987)
currenciesDisplayName.STD=\u0414\u043e\u0431\u0440\u0430 \u0421\u0430\u043d-\u0422\u043e\u043c\u0435 \u0456 \u041f\u0440\u0456\u043d\u0441\u0456\u043f\u0456
-currenciesDisplayName.MHD=\u0414\u043e\u043b\u0430\u0440 \u041c\u0430\u0440\u0448\u0430\u043b\u043b\u043e\u0432\u0438\u0445 \u043e\u0441\u0442\u0440\u043e\u0432\u0456\u0432r
-currenciesDisplayName.NZP=\u041d\u043e\u0432\u043e\u0437\u0435\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
currenciesDisplayName.WST=\u0422\u0430\u043b\u0430 \u0417\u0430\u0445\u0456\u0434\u043d\u043e\u0433\u043e \u0421\u0430\u043c\u043e\u0430
-currenciesDisplayName.WSP=\u0424\u0443\u043d\u0442 \u0417\u0430\u0445\u0456\u0434\u043d\u043e\u0433\u043e \u0421\u0430\u043c\u043e\u0430
-currenciesDisplayName.HNL=\u0413\u043e\u043d\u0434\u0443\u0440\u0430\u0441\u044c\u043a\u0430 \u043b\u0435\u043c\u043f\u0456\u0440\u0430
-currenciesDisplayName.XMF=\u0424\u0440\u0430\u043d\u043a \u0444\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0438\u0445 \u043c\u0435\u0442\u0440\u043e\u043f\u043e\u043b\u0456\u0439
+currenciesDisplayName.KHR=\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0454\u043b\u044c
+currenciesDisplayName.EUR=\u0404\u0432\u0440\u043e
+currenciesDisplayName.DOP=\u0414\u043e\u043c\u0456\u043d\u0456\u043a\u0430\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.BOV=\u0411\u043e\u043b\u0456\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u043c\u0432\u0434\u043e\u043b
+currenciesDisplayName.MTP=\u041c\u0430\u043b\u044c\u0442\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.BOP=\u0411\u043e\u043b\u0456\u0432\u0456\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
+currenciesDisplayName.MTL=\u041c\u0430\u043b\u044c\u0442\u0456\u0439\u0441\u044c\u043a\u0430 \u043b\u0456\u0440\u0430
+currenciesDisplayName.CUP=\u041a\u0443\u0431\u0438\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
currenciesDisplayName.TMM=\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0441\u044c\u043a\u0438\u0439 \u043c\u0430\u043d\u0430\u0442
+currenciesDisplayName.SGD=\u0421\u0456\u043d\u0433\u0430\u043f\u0443\u0440\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.NZD=\u041d\u043e\u0432\u043e\u0437\u0435\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.USD=\u0414\u043e\u043b\u0430\u0440 \u0421\u0428\u0410
+currenciesDisplayName.HNL=\u0413\u043e\u043d\u0434\u0443\u0440\u0430\u0441\u044c\u043a\u0430 \u043b\u0435\u043c\u043f\u0456\u0440\u0430
+currenciesDisplayName.BOB=\u0411\u043e\u043b\u0456\u0432\u0456\u0430\u043d\u043e
+currenciesDisplayName.ITL=\u0406\u0442\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0430 \u043b\u0456\u0440\u0430
+currenciesDisplayName.PAB=\u041f\u0430\u043d\u0430\u043c\u0441\u044c\u043a\u0430 \u0431\u0430\u043b\u044c\u0431\u043e\u0430
currenciesDisplayName.GTQ=\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u043a\u0435\u0442\u0441\u0430\u043b\u044c
-currenciesDisplayName.NZD=\u041d\u043e\u0432\u043e\u0437\u0435\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440r
-currenciesDisplayName.SSP=\u0428\u043e\u0442\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.BBD=\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.LAK=\u041b\u0430\u043e\u0441\u044c\u043a\u0438\u0439 \u043a\u0456\u043f
+currenciesDisplayName.GHC=\u0413\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0441\u0435\u0434\u0456
+currenciesDisplayName.AUD=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.NAD=\u041d\u0430\u043c\u0456\u0431\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.KGS=\u041a\u0438\u0440\u0433\u0438\u0437\u044c\u043a\u0438\u0439 \u0441\u043e\u043c
currenciesDisplayName.MGF=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.CHF=\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
+currenciesDisplayName.BBD=\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
currenciesDisplayName.MGA=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0430\u0440\u0456\u0430\u0440\u0456
-currenciesDisplayName.EGP=\u0404\u0433\u0438\u043f\u0435\u0442\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.BZH=\u0414\u043e\u043b\u0430\u0440 \u0411\u0440\u0438\u0442\u0430\u043d\u0441\u044c\u043a\u043e\u0433\u043e \u0413\u043e\u043d\u0434\u0443\u0440\u0430\u0441\u0443
+currenciesDisplayName.PYG=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439\u0441\u044c\u043a\u0438\u0439 \u0433\u0443\u0430\u0440\u0430\u043d\u0456
currenciesDisplayName.PLZ=\u041f\u043e\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0437\u043b\u043e\u0442\u0438\u0439 (1950-1995)
-currenciesDisplayName.BAN=\u041d\u043e\u0432\u0438\u0439 \u0434\u0438\u043d\u0430\u0440 \u0411\u043e\u0441\u043d\u0456\u0457 \u0456 \u0413\u0435\u0440\u0446\u043e\u0433\u043e\u0432\u0438\u043d\u0438
-currenciesDisplayName.BAM=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0432\u0430\u043d\u0430 \u043c\u0430\u0440\u043a\u0430 \u0411\u043e\u0441\u043d\u0456\u0457 \u0456 \u0413\u0435\u0440\u0446\u043e\u0433\u043e\u0432\u0438\u043d\u0438
-currenciesDisplayName.BZD=\u0411\u0435\u043b\u0456\u0437\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.BAD=\u0414\u0438\u043d\u0430\u0440 \u0411\u043e\u0441\u043d\u0456\u0457 \u0456 \u0413\u0435\u0446\u043e\u0433\u043e\u0432\u0438\u043d\u0438
-currenciesDisplayName.PLN=\u041f\u043e\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0437\u043b\u043e\u0442\u0438\u0439
currenciesDisplayName.YER=\u0404\u043c\u0435\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0430\u043b
+currenciesDisplayName.ATS=\u0410\u0432\u0441\u0442\u0440\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433
+currenciesDisplayName.ETB=\u0415\u0444\u0456\u043e\u043f\u0441\u044c\u043a\u0438\u0439 \u0431\u0438\u0440
+currenciesDisplayName.BND=\u0411\u0440\u0443\u043d\u0435\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.JMD=\u042f\u043c\u0430\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.EGP=\u0404\u0433\u0438\u043f\u0435\u0442\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
+currenciesDisplayName.PLN=\u041f\u043e\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0437\u043b\u043e\u0442\u0438\u0439
+currenciesDisplayName.DZD=\u0410\u043b\u0436\u0438\u0440\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.ISK=\u0406\u0441\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.SRG=\u0421\u0443\u0440\u0438\u043d\u0430\u043c\u0441\u044c\u043a\u0438\u0439 \u0433\u0443\u043b\u044c\u0434\u0435\u043d
-currenciesDisplayName.CSK=\u0427\u0435\u0445\u043e\u0441\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0430 \u0442\u0432\u0435\u0440\u0434\u0430 \u043a\u0440\u043e\u043d\u0430
+currenciesDisplayName.LYD=\u041b\u0456\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
+currenciesDisplayName.BZD=\u0411\u0435\u043b\u0456\u0437\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.BAM=\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0432\u0430\u043d\u0430 \u043c\u0430\u0440\u043a\u0430 \u0411\u043e\u0441\u043d\u0456\u0457 \u0456 \u0413\u0435\u0440\u0446\u043e\u0433\u043e\u0432\u0438\u043d\u0438
+currenciesDisplayName.ESP=\u0406\u0441\u043f\u0430\u043d\u0441\u044c\u043a\u0430 \u043f\u0435\u0441\u0435\u0442\u0430
currenciesDisplayName.KRW=\u0412\u043e\u043d\u0430 \u041f\u0456\u0432\u0434\u0435\u043d\u043d\u043e\u0457 \u041a\u043e\u0440\u0435\u0457
+currenciesDisplayName.NLG=\u041d\u0456\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0433\u0443\u043b\u044c\u0434\u0435\u043d
+currenciesDisplayName.MRO=\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0441\u044c\u043a\u0430 \u0443\u0433\u0456\u044f
+currenciesDisplayName.BAD=\u0414\u0438\u043d\u0430\u0440 \u0411\u043e\u0441\u043d\u0456\u0457 \u0456 \u0413\u0435\u0446\u043e\u0433\u043e\u0432\u0438\u043d\u0438
+currenciesDisplayName.ZWD=\u0417\u0456\u043c\u0431\u0430\u0431\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesDisplayName.SEK=\u0428\u0432\u0435\u0434\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
+currenciesDisplayName.CSK=\u0427\u0435\u0445\u043e\u0441\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0430 \u0442\u0432\u0435\u0440\u0434\u0430 \u043a\u0440\u043e\u043d\u0430
currenciesDisplayName.BYR=\u0411\u0456\u043b\u043e\u0440\u0443\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.BYL=\u0411\u0456\u043b\u043e\u0440\u0443\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c (1992-1994)
-currenciesDisplayName.CSC=\u0427\u0435\u0445\u043e\u0441\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.KRO=\u0421\u0442\u0430\u0440\u0430 \u0432\u043e\u043d\u0430 \u041f\u0456\u0432\u0434\u0435\u043d\u043d\u043e\u0457 \u041a\u043e\u0440\u0435\u0457
-currenciesDisplayName.BYB=\u0411\u0456\u043b\u043e\u0440\u0443\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0440\u0443\u0431\u043b\u044c (1994-1999)
-currenciesDisplayName.SQS=\u0421\u043e\u043c\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433
-currenciesDisplayName.GRN=\u0413\u0440\u0435\u0446\u044c\u043a\u0430 \u043d\u043e\u0432\u0430 \u0434\u0440\u0430\u0445\u043c\u0430
+currenciesDisplayName.IRR=\u0406\u0440\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0430\u043b
currenciesDisplayName.PKR=\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.AFN=\u0410\u0444\u0433\u0430\u043d\u0456
-currenciesDisplayName.ZWD=\u0417\u0456\u043c\u0431\u0430\u0431\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.LKR=\u0428\u0440\u0456-\u043b\u0430\u043d\u043a\u0456\u0439\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.GRD=\u0413\u0440\u0435\u0446\u044c\u043a\u0430 \u0434\u0440\u0430\u0445\u043c\u0430
-currenciesDisplayName.IEP=\u0406\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.AFA=\u0410\u0444\u0433\u0430\u043d\u0456 (1927-2002)
-currenciesDisplayName.YDD=\u0404\u043c\u0435\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.RWF=\u0420\u0443\u0430\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.CRC=\u041a\u043e\u0441\u0442\u0430-\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043a\u043e\u043b\u043e\u043d
-currenciesDisplayName.TJS=\u0422\u0430\u0434\u0436\u0438\u0446\u044c\u043a\u0438\u0439 \u0441\u043e\u043c\u043e\u043d\u0456
-currenciesDisplayName.TJR=\u0422\u0430\u0434\u0436\u0438\u0446\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.EEK=\u0415\u0441\u0442\u043e\u043d\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.MDR=\u041c\u043e\u043b\u0434\u043e\u0432\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u0435\u0432\u0438\u0439 \u043a\u0443\u043f\u043e\u043d
-currenciesDisplayName.HKD=\u0413\u043e\u043d\u043a\u043e\u043d\u0433\u0456\u0432\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.DKK=\u0414\u0430\u0442\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.MDL=\u041c\u043e\u043b\u0434\u043e\u0432\u0441\u044c\u043a\u0438\u0439 \u043b\u0435\u0439
-currenciesDisplayName.GQF=\u0424\u0440\u0430\u043d\u043a \u0415\u043a\u0432\u0430\u0442\u043e\u0440\u0456\u0430\u043b\u044c\u043d\u043e\u0457 \u0413\u0432\u0456\u043d\u0435\u0457
-currenciesDisplayName.IDR=\u0406\u043d\u0434\u043e\u043d\u0435\u0437\u0456\u0439\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.AED=\u0414\u0438\u0440\u0445\u0435\u043c \u041e\u0410\u0415
-currenciesDisplayName.KPW=\u0412\u043e\u043d\u0430 \u041f\u0456\u0432\u043d\u0456\u0447\u043d\u043e\u0457 \u041a\u043e\u0440\u0435\u0457
-currenciesDisplayName.IDN=\u0406\u043d\u0434\u043e\u043d\u0435\u0437\u0456\u0439\u0441\u044c\u043a\u0430 \u043d\u043e\u0432\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.BWP=\u0411\u043e\u0442\u0441\u0432\u0430\u043d\u0441\u044c\u043a\u0430 \u043f\u0443\u043b\u0430
-currenciesDisplayName.VUV=\u0412\u0430\u043d\u0443\u0430\u0442\u0441\u044c\u043a\u0430 \u0432\u0430\u0442\u0443
-currenciesDisplayName.XID=\u0406\u0441\u043b\u0430\u043c\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.SOS=\u0421\u043e\u043c\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0448\u0438\u043b\u0456\u043d\u0433
-currenciesDisplayName.ADP=\u0410\u043d\u0434\u043e\u0440\u0440\u0441\u044c\u043a\u0430 \u043f\u0435\u0441\u0435\u0442\u0430
-currenciesDisplayName.RUR=\u0420\u043e\u0441\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c (1991-1998)
-currenciesDisplayName.GPF=\u0413\u0432\u0430\u0434\u0435\u043b\u0443\u043f\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.DJF=\u0424\u0440\u0430\u043d\u043a \u0414\u0436\u0456\u0431\u0443\u0442\u0456
-currenciesDisplayName.ADD=\u0410\u043d\u0434\u043e\u0440\u0440\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.MCF=\u041c\u043e\u043d\u0430\u043a\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.ECV=\u0415\u043a\u0432\u0430\u0434\u043e\u0440\u0441\u044c\u043a\u0438\u0439 UV\u0421
-currenciesDisplayName.ECS=\u0415\u043a\u0432\u0430\u0434\u043e\u0440\u0441\u044c\u043a\u0435 \u0441\u0443\u043a\u0440\u0435
-currenciesDisplayName.LIF=\u041b\u0456\u0445\u0442\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.RUB=\u0420\u043e\u0441\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.PHP=\u0424\u0456\u043b\u0456\u043f\u043f\u0456\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.UZS=\u0423\u0437\u0431\u0435\u0446\u044c\u043a\u0438\u0439 \u0441\u0443\u043c
-currenciesDisplayName.COP=\u041a\u043e\u043b\u0443\u043c\u0431\u0456\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.THB=\u0422\u0430\u0457\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0438\u0439 \u0431\u0430\u0442
-currenciesDisplayName.IBP=\u041f\u0456\u0432\u043d\u0456\u0447\u043d\u043e\u0456\u0440\u043b\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.BUR=\u0411\u0456\u0440\u043c\u0430\u043d\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.COF=\u041a\u043e\u043d\u0433\u043e\u043b\u0435\u0437\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.BUK=\u0411\u0456\u0440\u043c\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043a\u0456\u0430\u0442
-currenciesDisplayName.COB=\u041a\u043e\u043b\u0443\u043c\u0431\u0456\u0439\u0441\u044c\u043a\u0435 \u043f\u0430\u043f\u0435\u0440\u043e\u0432\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.UAK=\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0438\u0439 \u043a\u0430\u0440\u0431\u043e\u0432\u0430\u043d\u0435\u0446\u044c
-currenciesDisplayName.QAR=\u041a\u0430\u0442\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0430\u043b
-currenciesDisplayName.UAH=\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430 \u0433\u0440\u0438\u0432\u043d\u044f
-currenciesDisplayName.GNS=\u0413\u0432\u0456\u043d\u0435\u0439\u0441\u044c\u043a\u0435 \u0441\u0456\u043b\u0456
-currenciesDisplayName.CNY=\u041a\u0438\u0442\u0430\u0439\u0441\u044c\u043a\u0438\u0439 \u044e\u0430\u043d\u044c
-currenciesDisplayName.MZM=\u041c\u043e\u0437\u0430\u043c\u0431\u0456\u0446\u044c\u043a\u0438\u0439 \u043c\u0435\u0442\u0438\u043a\u0430\u043b
-currenciesDisplayName.UYU=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.GNI=\u0413\u0432\u0456\u043d\u0435\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a (1960-1972)
-currenciesDisplayName.SML=\u041b\u0456\u0440\u0430 \u0421\u0430\u043d-\u041c\u0430\u0440\u0438\u043d\u043e
-currenciesDisplayName.MZE=\u041c\u043e\u0437\u0430\u043c\u0431\u0456\u0446\u044c\u043a\u0438\u0439 \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.PGK=\u041a\u0456\u043d\u0430 \u041f\u0430\u043f\u0443\u0430 \u041d\u043e\u0432\u043e\u0457 \u0413\u0432\u0456\u043d\u0435\u0457
-currenciesDisplayName.OMS=\u041e\u043c\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0430\u043b \u0441\u0430\u0457\u0434\u0456
-currenciesDisplayName.GNF=\u0413\u0432\u0456\u0439\u043d\u0435\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.UYP=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e (1975-1993)
-currenciesDisplayName.OMR=\u041e\u043c\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0440\u0456\u0430\u043b
-currenciesDisplayName.XFU=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a UIC
-currenciesDisplayName.ZRZ=\u0417\u0430\u0457\u0440\u0441\u044c\u043a\u0438\u0439 \u0437\u0430\u0457\u0440
-currenciesDisplayName.BTR=\u0411\u0443\u0442\u0430\u043d\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.MAF=\u041c\u0430\u0440\u043e\u043a\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.MAD=\u041c\u0430\u0440\u043e\u043a\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u0440\u0445\u0435\u043c
-currenciesDisplayName.XFO=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0438\u0439 \u0437\u043e\u043b\u043e\u0442\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.BTN=\u0411\u0443\u0442\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043d\u0433\u0443\u043b\u0442\u0440\u0443\u043c
-currenciesDisplayName.UYF=\u0423\u0440\u0443\u0433\u0432\u0430\u0439\u0441\u044c\u043a\u0435 \u0441\u0438\u043b\u044c\u043d\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.ZRN=\u0417\u0430\u0457\u0440\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0437\u0430\u0457\u0440
-currenciesDisplayName.MYR=\u041c\u0430\u043b\u0430\u0439\u0437\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0440\u0438\u043d\u0433\u0456\u0442
-currenciesDisplayName.AZM=\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043c\u0430\u043d\u0430\u0442
-currenciesDisplayName.GMP=\u0413\u0430\u043c\u0431\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.KMF=\u041a\u043e\u043c\u043e\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.SLL=\u041b\u0435\u043e\u043d\u0435 \u0421\u044c\u0454\u0440\u0440\u0430-\u041b\u0435\u043e\u043d\u0435
-currenciesDisplayName.GMD=\u0413\u0430\u043c\u0431\u0456\u0439\u0441\u044c\u043a\u0430 \u0434\u0430\u043b\u0430\u0441\u0456
-currenciesDisplayName.XEU=\u0404\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u044c\u043a\u0430 \u0432\u0430\u043b\u044e\u0442\u043d\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044f
-currenciesDisplayName.BSP=\u0411\u0430\u0433\u0430\u043c\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.CMF=\u041a\u0430\u043c\u0435\u0440\u0443\u043d\u0441\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.MXV=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0438\u0439 UDI
-currenciesDisplayName.XEF=\u0424\u0440\u0430\u043d\u043a \u041a\u0424\u0410 BCEAEC
-currenciesDisplayName.BSD=\u0411\u0430\u0433\u0430\u043c\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
-currenciesDisplayName.MXP=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0435 \u0441\u0440\u0456\u0431\u043d\u0435 \u043f\u0435\u0441\u043e (1861-1992)
-currenciesDisplayName.MXN=\u041c\u0435\u043a\u0441\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.PES=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0441\u043e\u043b
-currenciesDisplayName.GLK=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.BRZ=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e (1942-1967)
-currenciesDisplayName.PEN=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0441\u043e\u043b
-currenciesDisplayName.CLP=\u0427\u0438\u043b\u0456\u0439\u0441\u044c\u043a\u0435 \u043f\u0435\u0441\u043e
-currenciesDisplayName.SKK=\u0421\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.PEI=\u041f\u0435\u0440\u0443\u0430\u043d\u0441\u044c\u043a\u0438\u0439 \u0456\u043d\u0442\u0456
-currenciesDisplayName.BRR=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e
-currenciesDisplayName.XDR=\u0421\u043f\u0435\u0446\u0456\u0430\u043b\u044c\u043d\u0456 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u043f\u043e\u0437\u0438\u0447\u0435\u043d\u043d\u044f
-currenciesDisplayName.FRF=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u043d\u043a
-currenciesDisplayName.BRN=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043d\u043e\u0432\u0435 \u043a\u0440\u0443\u0437\u0430\u0434\u043e
-currenciesDisplayName.CLF=\u0427\u0438\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 UF
-currenciesDisplayName.CLE=\u0427\u0438\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0435\u0441\u043a\u0443\u0434\u043e
-currenciesDisplayName.BRL=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0438\u0439 \u0440\u0435\u0430\u043b
-currenciesDisplayName.CLC=\u0427\u0438\u043b\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u043a\u043e\u043d\u0434\u043e\u0440
-currenciesDisplayName.BRE=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e (1990-1993)
-currenciesDisplayName.MWP=\u041c\u0430\u043b\u0430\u0432\u0456\u0439\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.BRC=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043a\u0440\u0443\u0437\u0430\u0434\u043e
-currenciesDisplayName.BRB=\u0411\u0440\u0430\u0437\u0438\u043b\u044c\u0441\u044c\u043a\u0435 \u043d\u043e\u0432\u0435 \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e (1967-1986)
-currenciesDisplayName.MWK=\u041c\u0430\u043b\u0430\u0432\u0456\u0439\u0441\u044c\u043a\u0430 \u043a\u0432\u0430\u0447\u0430
-currenciesDisplayName.PDR=\u041f\u0440\u0438\u0434\u043d\u0456\u0441\u0442\u0440\u043e\u0432\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.DEM=\u041d\u0456\u043c\u0435\u0446\u044c\u043a\u0430 \u043c\u0430\u0440\u043a\u0430
-currenciesDisplayName.TDF=\u0424\u0440\u0430\u043d\u043a \u0427\u0430\u0434\u0443
-currenciesDisplayName.PDN=\u041f\u0440\u0438\u0434\u043d\u0456\u0441\u0442\u0440\u043e\u0432\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0440\u0443\u0431\u043b\u044c
-currenciesDisplayName.PDK=\u041f\u0440\u0438\u0434\u043d\u0456\u0441\u0442\u0440\u043e\u0432\u0441\u044c\u043a\u0438\u0439 \u0440\u0443\u0431\u043b\u0435\u0432\u0438\u0439 \u043a\u0443\u043f\u043e\u043d
-currenciesDisplayName.NPR=\u041d\u0435\u043f\u0430\u043b\u044c\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.CKD=\u0414\u043e\u043b\u0430\u0440 \u041e\u0441\u0442\u0440\u043e\u0432\u0456\u0432 \u041a\u0443\u043a\u0430
-currenciesDisplayName.JPY=\u042f\u043f\u043e\u043d\u0441\u044c\u043a\u0430 \u0454\u043d\u0430
-currenciesDisplayName.MVR=\u041c\u0430\u043b\u044c\u0434\u0456\u0432\u0441\u044c\u043a\u0430 \u0440\u0443\u0444\u0456\u044f
-currenciesDisplayName.XCF=\u041d\u043e\u0432\u0438\u0439 \u0444\u0440\u0430\u043d\u043a \u041a\u0424\u0410
-currenciesDisplayName.MVP=\u041c\u0430\u043b\u044c\u0434\u0456\u0432\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.XCD=\u0414\u043e\u043b\u0430\u0440 \u0421\u0445\u0456\u0434\u043d\u0438\u0445 \u041a\u0438\u0440\u0438\u0431\u0456\u0432
-currenciesDisplayName.SIT=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u044c\u043a\u0438\u0439 \u0442\u043e\u043b\u0430\u0440
-currenciesDisplayName.YUR=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u0438\u0439 \u0440\u0435\u0444\u043e\u0440\u043c\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.AWG=\u0410\u0440\u0443\u0431\u0441\u044c\u043a\u0438\u0439 \u0433\u0443\u043b\u044c\u0434\u0435\u043d
-currenciesDisplayName.YUO=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u0438\u0439 \u0436\u043e\u0432\u0442\u043d\u0435\u0432\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.YUN=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u0438\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0432\u0430\u043d\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.YUM=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.TCC=\u041a\u0440\u043e\u043d\u0430 \u0422\u0435\u0440\u043a\u0441\u0430 \u0456 \u041a\u0430\u0439\u043a\u043e\u0441\u0430
-currenciesDisplayName.YUG=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u0438\u0439 \u0434\u0438\u043d\u0430\u0440 1994
-currenciesDisplayName.YUF=\u0414\u0438\u043d\u0430\u0440 \u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u043e\u0457 \u0424\u0435\u0434\u0435\u0440\u0430\u0446\u0456\u0457
-currenciesDisplayName.RON=\u0420\u0443\u043c\u0443\u043d\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u043b\u0435\u0439
-currenciesDisplayName.YUD=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0441\u044c\u043a\u0438\u0439 \u0442\u0432\u0435\u0440\u0434\u0438\u0439 \u0434\u0438\u043d\u0430\u0440
-currenciesDisplayName.ROL=\u0420\u0443\u043c\u0443\u043d\u0441\u044c\u043a\u0438\u0439 \u043b\u0435\u0439
-currenciesDisplayName.NOK=\u041d\u043e\u0440\u0432\u0435\u0437\u044c\u043a\u0430 \u043a\u0440\u043e\u043d\u0430
-currenciesDisplayName.MUR=\u041c\u0430\u0432\u0440\u0438\u043a\u0456\u0439\u0441\u044c\u043a\u0430 \u0440\u0443\u043f\u0456\u044f
-currenciesDisplayName.XBD=\u0404\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u044c\u043a\u0430 \u0440\u043e\u0437\u0440\u0430\u0445\u0443\u043d\u043a\u043e\u0432\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044f (XBD)
-currenciesDisplayName.GIP=\u0413\u0456\u0431\u0440\u0430\u043b\u0442\u0430\u0440\u0441\u044c\u043a\u0438\u0439 \u0444\u0443\u043d\u0442
-currenciesDisplayName.VNS=\u0412\u02bc\u0454\u0442\u043d\u0430\u043c\u0441\u044c\u043a\u0438\u0439 \u043d\u0430\u0446\u0456\u043e\u043d\u0430\u043b\u044c\u043d\u0438\u0439 \u0434\u043e\u043d\u0433
-currenciesDisplayName.XBC=\u0404\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u044c\u043a\u0430 \u0440\u043e\u0437\u0440\u0430\u0445\u0443\u043d\u043a\u043e\u0432\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044f (XBC)
-currenciesDisplayName.VNR=\u0414\u043e\u043d\u0433 \u0412\u02bc\u0454\u0442\u043d\u0430\u043c\u0441\u044c\u043a\u043e\u0457 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0456\u043a\u0438
-currenciesDisplayName.XBB=\u0404\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u044c\u043a\u0430 \u0433\u0440\u043e\u0448\u043e\u0432\u0430 \u043e\u0434\u0438\u043d\u0438\u0446\u044f
-currenciesDisplayName.KID=\u0414\u043e\u043b\u0430\u0440 \u041a\u0456\u0440\u0438\u0431\u0430\u0442\u0456
-currenciesDisplayName.SHP=\u0424\u0443\u043d\u0442 \u0421\u0432\u044f\u0442\u043e\u0457 \u0404\u043b\u0435\u043d\u0438
-currenciesDisplayName.VNN=\u0412\u02bc\u0454\u0442\u043d\u0430\u043c\u0441\u044c\u043a\u0438\u0439 \u043d\u043e\u0432\u0438\u0439 \u0434\u043e\u043d\u0433
-currenciesSymbol.JOD=JD
-currenciesSymbol.BOV=BOV
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LL
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=T Sh
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=CR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.XAF=XAF
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=Bs
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=Lm
-currenciesSymbol.AUD=$A
-currenciesSymbol.GHC=GHC
-currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=som
-currenciesSymbol.CHF=SwF
-currenciesSymbol.ATS=ATS
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=Br
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DA
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=J$
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LD
-currenciesSymbol.BMD=Ber$
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=UM
-currenciesSymbol.IRR=RI
-currenciesSymbol.SEK=SKr
-currenciesSymbol.ERN=ERN
+currenciesDisplayName.BMD=\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u044c\u043a\u0438\u0439 \u0434\u043e\u043b\u0430\u0440
+currenciesSymbol.BGL=lev
+currenciesSymbol.XCD=EC$
currenciesSymbol.KES=K Sh
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=Arg$
-currenciesSymbol.ARP=ARP
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
+currenciesSymbol.LKR=SL Re
+currenciesSymbol.CYP=\u00a3C
+currenciesSymbol.BYR=Rbl
+currenciesSymbol.MKD=MDen
+currenciesSymbol.VUV=VT
+currenciesSymbol.MWK=MK
+currenciesSymbol.BMD=Ber$
+currenciesSymbol.SCR=SR
+currenciesSymbol.IEP=IR\u00a3
+currenciesSymbol.AMD=dram
+currenciesSymbol.TOP=T$
+currenciesSymbol.NPR=Nrs
+currenciesSymbol.SOS=So. Sh.
+currenciesSymbol.CLP=Ch$
+currenciesSymbol.KWD=KD
currenciesSymbol.GEL=lari
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
+currenciesSymbol.AFN=Af
+currenciesSymbol.ZAR=R
+currenciesSymbol.ROL=leu
currenciesSymbol.IQD=ID
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=F$
-currenciesSymbol.NIO=NIO
-currenciesSymbol.MOP=MOP
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.XTR=XTR
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
+currenciesSymbol.HKD=HK$
+currenciesSymbol.ARS=Arg$
+currenciesSymbol.BRL=R$
+currenciesSymbol.ALL=lek
+currenciesSymbol.CRC=C
+currenciesSymbol.IDR=Rp
+currenciesSymbol.RUB=\u0440\u0443\u0431.
+currenciesSymbol.DKK=DKr
+currenciesSymbol.TZS=T Sh
currenciesSymbol.SBD=SI$
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.MNT=Tug
-currenciesSymbol.HUF=Ft
-currenciesSymbol.BIF=Fbu
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
+currenciesSymbol.NOK=NKr
+currenciesSymbol.UGX=U Sh
+currenciesSymbol.BEF=BF
currenciesSymbol.TTD=TT$
currenciesSymbol.SZL=E
-currenciesSymbol.NHF=NHF
+currenciesSymbol.STD=Db
+currenciesSymbol.UAH=UAH
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.INR=INR
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=T
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=LS
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=NA f.
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.LSL=M
-currenciesSymbol.GAF=GAF
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=Can$
-currenciesSymbol.BGL=lev
-currenciesSymbol.TRL=TL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=\u00a3C
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=G$
-currenciesSymbol.AMD=dram
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=Be
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=lek
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MDen
-currenciesSymbol.TPP=TPP
-currenciesSymbol.XPF=CFPF
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
+currenciesSymbol.FJD=F$
+currenciesSymbol.UYU=Ur$
currenciesSymbol.BDT=Tk
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=T$
-currenciesSymbol.XOF=XOF
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
+currenciesSymbol.QAR=QR
+currenciesSymbol.LBP=LL
+currenciesSymbol.MNT=Tug
+currenciesSymbol.DJF=DF
+currenciesSymbol.JOD=JD
+currenciesSymbol.SGD=S$
+currenciesSymbol.KHR=CR
+currenciesSymbol.SYP=LS
+currenciesSymbol.MTL=Lm
+currenciesSymbol.MZM=Mt
+currenciesSymbol.YER=YRl
currenciesSymbol.CVE=CVEsc
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=R
+currenciesSymbol.HUF=Ft
+currenciesSymbol.NZD=$NZ
+currenciesSymbol.OMR=RO
+currenciesSymbol.KZT=T
+currenciesSymbol.INR=INR
currenciesSymbol.DOP=RD$
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=U Sh
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=Db
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
+currenciesSymbol.NAD=N$
+currenciesSymbol.TRL=TL
+currenciesSymbol.COP=Col$
currenciesSymbol.HNL=L
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
+currenciesSymbol.KGS=som
+currenciesSymbol.ZWD=Z$
+currenciesSymbol.MYR=RM
+currenciesSymbol.SRG=Sf
currenciesSymbol.GTQ=Q
-currenciesSymbol.NZD=$NZ
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BDS$
-currenciesSymbol.NAD=N$
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.BAM=KM
-currenciesSymbol.BZD=BZ$
-currenciesSymbol.BAD=BAD
+currenciesSymbol.BIF=Fbu
currenciesSymbol.PLN=Zl
-currenciesSymbol.YER=YRl
-currenciesSymbol.SRG=Sf
-currenciesSymbol.CSK=CSK
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BYR=Rbl
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=Pra
-currenciesSymbol.AFN=Af
-currenciesSymbol.ZWD=Z$
-currenciesSymbol.LKR=SL Re
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IR\u00a3
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=C
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKr
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.IDR=Rp
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.VUV=VT
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=So. Sh.
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=Col$
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=Y
-currenciesSymbol.MZM=Mt
-currenciesSymbol.UYU=Ur$
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
currenciesSymbol.GNF=GF
-currenciesSymbol.UYP=UYP
-currenciesSymbol.OMR=RO
-currenciesSymbol.XFU=XFU
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.BTR=BTR
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.XFO=XFO
-currenciesSymbol.BTN=Nu
-currenciesSymbol.UYF=UYF
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.MYR=RM
-currenciesSymbol.AZM=AZM
-currenciesSymbol.GMP=GMP
+currenciesSymbol.LSL=M
+currenciesSymbol.VEB=Be
+currenciesSymbol.BOB=Bs
+currenciesSymbol.CNY=Y
currenciesSymbol.KMF=CF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.MXV=MXV
-currenciesSymbol.XEF=XEF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MEX$
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=Ch$
+currenciesSymbol.SEK=SKr
+currenciesSymbol.AUD=$A
+currenciesSymbol.LYD=LD
+currenciesSymbol.JMD=J$
currenciesSymbol.SKK=Sk
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=R$
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.TDF=TDF
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=Nrs
-currenciesSymbol.CKD=CKD
-currenciesSymbol.MVR=MVR
-currenciesSymbol.XCF=XCF
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=EC$
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=leu
-currenciesSymbol.NOK=NKr
-currenciesSymbol.MUR=MUR
-currenciesSymbol.XBD=XBD
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.XBC=XBC
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
+currenciesSymbol.CHF=SwF
+currenciesSymbol.ETB=Br
+currenciesSymbol.MRO=UM
+currenciesSymbol.BBD=BDS$
+currenciesSymbol.PKR=Pra
+currenciesSymbol.XPF=CFPF
+currenciesSymbol.TWD=NT$
+currenciesSymbol.BHD=BD
+currenciesSymbol.BTN=Nu
+currenciesSymbol.MXN=MEX$
+currenciesSymbol.DZD=DA
+currenciesSymbol.ANG=NA f.
+currenciesSymbol.BZD=BZ$
+currenciesSymbol.IRR=RI
+currenciesSymbol.GYD=G$
+currenciesSymbol.BAM=KM
+currenciesSymbol.CAD=Can$
shortMonths=\u0421\u0456\u0447®\u041b\u044e\u0442®\u0411\u0435\u0440®\u041a\u0432\u0456®\u0422\u0440\u0430®\u0427\u0435\u0440®\u041b\u0438\u043f®\u0421\u0435\u0440®\u0412\u0435\u0440®\u0416\u043e\u0432®\u041b\u0438\u0441®\u0413\u0440\u0443®®
months=\u0421\u0456\u0447\u0435\u043d\u044c®\u041b\u044e\u0442\u0438\u0439®\u0411\u0435\u0440\u0435\u0437\u0435\u043d\u044c®\u041a\u0432\u0456\u0442\u0435\u043d\u044c®\u0422\u0440\u0430\u0432\u0435\u043d\u044c®\u0427\u0435\u0440\u0432\u0435\u043d\u044c®\u041b\u0438\u043f\u0435\u043d\u044c®\u0421\u0435\u0440\u043f\u0435\u043d\u044c®\u0412\u0435\u0440\u0435\u0441\u0435\u043d\u044c®\u0416\u043e\u0432\u0442\u0435\u043d\u044c®\u041b\u0438\u0441\u0442\u043e\u043f\u0430\u0434®\u0413\u0440\u0443\u0434\u0435\u043d\u044c®®
shortWeekdays=®\u041d\u0434®\u041f\u043d®\u0412\u0442®\u0421\u0440®\u0427\u0442®\u041f\u0442®\u0421\u0431®
@@ -731,7 +378,9 @@ territories.GN=\u0413\u0432\u0456\u043d\u0435\u044f
territories.GM=\u0413\u0430\u043c\u0431\u0456\u044f
territories.GL=\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0456\u044f
territories.SV=\u0421\u0430\u043b\u044c\u0432\u0430\u0434\u043e\u0440
+territories.062=\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u043e-\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430 \u0410\u0437\u0456\u044f
territories.ST=\u0421\u0430\u043d-\u0422\u043e\u043c\u0435 \u0456 \u041f\u0440\u0456\u043d\u0441\u0456\u043f\u0456
+territories.061=\u041f\u043e\u043b\u0456\u043d\u0435\u0437\u0456\u044f
territories.GI=\u0413\u0456\u0431\u0440\u0430\u043b\u0442\u0430\u0440
territories.GH=\u0413\u0430\u043d\u0430
territories.SR=\u0421\u0443\u0440\u0438\u043d\u0430\u043c
@@ -755,9 +404,12 @@ territories.SC=\u0421\u0435\u0439\u0448\u0435\u043b\u0438
territories.SB=\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u043e\u0432\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438
territories.SA=\u0421\u0430\u0443\u0434\u0456\u0432\u0441\u044c\u043a\u0430 \u0410\u0440\u0430\u0432\u0456\u044f
territories.FR=\u0424\u0440\u0430\u043d\u0446\u0456\u044f
+territories.057=\u041c\u0456\u043a\u0440\u043e\u043d\u0435\u0437\u0456\u044f
territories.FO=\u0424\u0430\u0440\u0435\u0440\u0441\u044c\u043a\u0456 \u043e\u0441\u0442\u0440\u043e\u0432\u0438
territories.FM=\u041c\u0456\u043a\u0440\u043e\u043d\u0435\u0437\u0456\u044f
territories.RW=\u0420\u0443\u0430\u043d\u0434\u0430
+territories.054=\u041c\u0435\u043b\u0430\u043d\u0435\u0437\u0456\u044f
+territories.053=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0456\u044f \u0442\u0430 \u041d\u043e\u0432\u0430 \u0417\u0435\u043b\u0430\u043d\u0434\u0456\u044f
territories.FK=\u0424\u043e\u043b\u043a\u043b\u0435\u043d\u0434\u0441\u044c\u043a\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438 (\u041c\u0430\u043b\u044c\u0432\u0456\u043d\u0438)
territories.RU=\u0420\u043e\u0441\u0456\u044f
territories.FJ=\u0424\u0456\u0434\u0436\u0456
@@ -767,20 +419,26 @@ territories.RE=\u0420\u0435\u044e\u043d\u044c\u0439\u043e\u043d
territories.ET=\u0415\u0444\u0456\u043e\u043f\u0456\u044f
territories.ES=\u0406\u0441\u043f\u0430\u043d\u0456\u044f
territories.ER=\u0415\u0440\u0438\u0442\u0440\u0435\u044f
+territories.833=\u041e\u0441\u0442\u0440\u0456\u0432 \u041c\u0435\u043d
territories.EH=\u0417\u0430\u0445\u0456\u0434\u043d\u0430 \u0421\u0430\u0445\u0430\u0440\u0430
territories.EG=\u0404\u0433\u0438\u043f\u0435\u0442
+territories.830=\u041e\u0441\u0442\u0440\u043e\u0432\u0438 \u041b\u0430-\u041c\u0430\u043d\u0448\u0443
territories.EE=\u0415\u0441\u0442\u043e\u043d\u0456\u044f
+territories.QO=\u0406\u043d\u0448\u0430 \u041e\u043a\u0435\u0430\u043d\u0456\u044f
territories.EC=\u0415\u043a\u0432\u0430\u0434\u043e\u0440
territories.DZ=\u0410\u043b\u0436\u0438\u0440
territories.QA=\u041a\u0430\u0442\u0430\u0440
+territories.039=\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u0430 \u0404\u0432\u0440\u043e\u043f\u0430
territories.DO=\u0414\u043e\u043c\u0456\u043d\u0456\u043a\u0430\u043d\u0441\u044c\u043a\u0430 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0456\u043a\u0430
territories.PY=\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439
+territories.035=\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u043e-\u0421\u0445\u0456\u0434\u043d\u0430 \u0410\u0437\u0456\u044f
territories.DM=\u0414\u043e\u043c\u0456\u043d\u0456\u043a
territories.PW=\u041f\u0430\u043b\u0430\u0443
territories.DK=\u0414\u0430\u043d\u0456\u044f
territories.DJ=\u0414\u0436\u0456\u0431\u0443\u0442\u0456
territories.PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0456\u044f
territories.PS=\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0430
+territories.030=\u0421\u0445\u0456\u0434\u043d\u0430 \u0410\u0437\u0456\u044f
territories.PR=\u041f\u0443\u0435\u0440\u0442\u043e-\u0420\u0456\u043a\u043e
territories.DE=\u041d\u0456\u043c\u0435\u0447\u0447\u0438\u043d\u0430
territories.PN=\u041f\u0456\u0442\u043a\u0435\u0440\u043d
@@ -798,12 +456,14 @@ territories.CV=\u041a\u0430\u0431\u043e-\u0412\u0435\u0440\u0434\u0435
territories.PA=\u041f\u0430\u043d\u0430\u043c\u0430
territories.CU=\u041a\u0443\u0431\u0430
territories.CR=\u041a\u043e\u0441\u0442\u0430-\u0420\u0438\u043a\u0430
+territories.029=\u041a\u0430\u0440\u0438\u0431\u0438
territories.CO=\u041a\u043e\u043b\u0443\u043c\u0431\u0456\u044f
territories.CN=\u041a\u0438\u0442\u0430\u0439
territories.CM=\u041a\u0430\u043c\u0435\u0440\u0443\u043d
territories.CL=\u0427\u0438\u043b\u0456
territories.CK=\u041e\u0441\u0442\u0440\u043e\u0432\u0438 \u041a\u0443\u043a\u0430
territories.CI=\u041a\u043e\u0442-\u0434\u2019\u0406\u0432\u0443\u0430\u0440
+territories.021=\u041f\u0456\u0432\u043d\u0456\u0447\u043d\u0430 \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.CH=\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0456\u044f
territories.CG=\u041a\u043e\u043d\u0433\u043e
territories.CF=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e-\u0410\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0430 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0456\u043a\u0430
@@ -818,13 +478,20 @@ territories.BV=\u0411\u0443\u0432\u0435, \u043e\u0441\u0442\u0440\u0456\u0432
territories.BT=\u0411\u0443\u0442\u0430\u043d
territories.BS=\u0411\u0430\u0433\u0430\u043c\u0438
territories.BR=\u0411\u0440\u0430\u0437\u0438\u043b\u0456\u044f
+territories.019=\u0410\u043c\u0435\u0440\u0438\u043a\u0438
+territories.018=\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.NZ=\u041d\u043e\u0432\u0430 \u0417\u0435\u043b\u0430\u043d\u0434\u0456\u044f
territories.BO=\u0411\u043e\u043b\u0456\u0432\u0456\u044f
+territories.017=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.BN=\u0411\u0440\u0443\u043d\u0435\u0439
territories.BM=\u0411\u0435\u0440\u043c\u0443\u0434\u0438
+territories.015=\u041f\u0456\u0432\u043d\u0456\u0447\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
+territories.014=\u0421\u0445\u0456\u0434\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
+territories.013=\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430 \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.NU=\u041d\u0456\u044f
territories.BJ=\u0411\u0435\u043d\u0456\u043d
territories.BI=\u0411\u0443\u0440\u0443\u043d\u0434\u0456
+territories.011=\u0417\u0430\u0445\u0456\u0434\u043d\u0430 \u0410\u0444\u0440\u0438\u043a\u0430
territories.BH=\u0411\u0430\u0445\u0440\u0435\u0439\u043d
territories.NR=\u041d\u0430\u0443\u0440\u0443
territories.BG=\u0411\u043e\u043b\u0433\u0430\u0440\u0456\u044f
@@ -842,6 +509,7 @@ territories.NG=\u041d\u0456\u0433\u0435\u0440\u0456\u044f
territories.NF=\u041e\u0441\u0442\u0440\u0456\u0432 \u041d\u043e\u0440\u0444\u043e\u043b\u043a
territories.AZ=\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d
territories.NE=\u041d\u0456\u0433\u0435\u0440
+territories.AX=\u0410\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0456 \u043e\u0441\u0442\u0440\u043e\u0432\u0438
territories.NC=\u041d\u043e\u0432\u0430 \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0456\u044f
territories.AW=\u0410\u0440\u0443\u0431\u0430
territories.ZM=\u0417\u0430\u043c\u0431\u0456\u044f
@@ -850,19 +518,23 @@ territories.AU=\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0456\u044f
territories.AT=\u0410\u0432\u0441\u0442\u0440\u0456\u044f
territories.AS=\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0435 \u0421\u0430\u043c\u043e\u0430
territories.AR=\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430
+territories.009=\u041e\u043a\u0435\u0430\u043d\u0456\u044f
territories.AQ=\u0410\u043d\u0442\u0430\u0440\u043a\u0442\u0438\u043a\u0430
territories.MZ=\u041c\u043e\u0437\u0430\u043c\u0431\u0456\u043a
territories.AO=\u0410\u043d\u0433\u043e\u043b\u0430
territories.MY=\u041c\u0430\u043b\u0430\u0439\u0437\u0456\u044f
territories.AN=\u041d\u0456\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0456 \u0410\u043d\u0442\u0456\u043b\u044c\u0441\u044c\u043a\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438
territories.MX=\u041c\u0435\u043a\u0441\u0438\u043a\u0430
+territories.005=\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u0430 \u0410\u043c\u0435\u0440\u0438\u043a\u0430
territories.AM=\u0412\u0456\u0440\u043c\u0435\u043d\u0456\u044f
territories.MW=\u041c\u0430\u043b\u0430\u0432\u0456
territories.AL=\u0410\u043b\u0431\u0430\u043d\u0456\u044f
territories.MV=\u041c\u0430\u043b\u044c\u0434\u0456\u0432\u0438
territories.ZA=\u041f\u0410\u0420
territories.MU=\u041c\u0430\u0432\u0440\u0438\u043a\u0456\u0439
+territories.002=\u0410\u0444\u0440\u0438\u043a\u0430
territories.MT=\u041c\u0430\u043b\u044c\u0442\u0430
+territories.001=\u0421\u0432\u0456\u0442
territories.AI=\u0410\u043d\u0433\u0456\u043b\u044c\u044f
territories.MS=\u041c\u043e\u043d\u0441\u0435\u0440\u0440\u0430\u0442
territories.MR=\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0456\u044f
@@ -877,7 +549,6 @@ territories.MN=\u041c\u043e\u043d\u0433\u043e\u043b\u0456\u044f
territories.MM=\u041c\u02bc\u044f\u043d\u043c\u0430
territories.ML=\u041c\u0430\u043b\u0456
territories.MK=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0456\u044f
-territories.YU=\u042e\u0433\u043e\u0441\u043b\u0430\u0432\u0456\u044f
territories.YT=\u041c\u0430\u0439\u043e\u0442
territories.MH=\u041c\u0430\u0440\u0448\u0430\u043b\u043b\u043e\u0432\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438
territories.MG=\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440
@@ -887,10 +558,14 @@ territories.MA=\u041c\u0430\u0440\u043e\u043a\u043a\u043e
territories.YE=\u0404\u043c\u0435\u043d
territories.LY=\u041b\u0456\u0432\u0456\u044f
territories.LV=\u041b\u0430\u0442\u0432\u0456\u044f
+territories.155=\u0417\u0430\u0445\u0456\u0434\u043d\u0430 \u0404\u0432\u0440\u043e\u043f\u0430
territories.LU=\u041b\u044e\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433
+territories.154=\u041f\u0456\u0432\u043d\u0456\u0447\u043d\u0430 \u0404\u0432\u0440\u043e\u043f\u0430
territories.LT=\u041b\u0438\u0442\u0432\u0430
territories.LS=\u041b\u0435\u0441\u043e\u0442\u043e
territories.LR=\u041b\u0456\u0431\u0435\u0440\u0456\u044f
+territories.151=\u0421\u0445\u0456\u0434\u043d\u0430 \u0404\u0432\u0440\u043e\u043f\u0430
+territories.150=\u0404\u0432\u0440\u043e\u043f\u0430
territories.LK=\u0428\u0440\u0456-\u041b\u0430\u043d\u043a\u0430
territories.LI=\u041b\u0456\u0445\u0442\u0435\u043d\u0448\u0442\u0435\u0439\u043d
territories.LC=\u0421\u0435\u043d\u0442-\u041b\u044e\u0441\u0456\u044f
@@ -899,6 +574,8 @@ territories.LA=\u041b\u0430\u043e\u0441
territories.KZ=\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d
territories.KY=\u041a\u0430\u0439\u043c\u0430\u043d\u043e\u0432\u0456 \u043e\u0441\u0442\u0440\u043e\u0432\u0438
territories.KW=\u041a\u0443\u0432\u0435\u0439\u0442
+territories.145=\u0417\u0430\u0445\u0456\u0434\u043d\u0430 \u0410\u0437\u0456\u044f
+territories.142=\u0410\u0437\u0456\u044f
territories.KR=\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u0430 \u041a\u043e\u0440\u0435\u044f
territories.KP=\u041f\u0456\u0432\u043d\u0456\u0447\u043d\u0430 \u041a\u043e\u0440\u0435\u044f
territories.KN=\u0421\u0435\u043d\u0442-\u041a\u0456\u0442\u0441 \u0456 \u041d\u0435\u0432\u0456\u0441
@@ -951,8 +628,8 @@ territories.TM=\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0438\u0441\u0442\u043
languages.es=\u0406\u0441\u043f\u0430\u043d\u0441\u044c\u043a\u0430
languages.ku=\u041a\u0443\u0440\u0434\u0441\u044c\u043a\u0430
languages.eo=\u0415\u0441\u043f\u0435\u0440\u0430\u043d\u0442\u043e
-languages.ks=\u041a\u0430\u0448\u043c\u0456\u0440\u0441\u044c\u043a\u0430
languages.en=\u0410\u043d\u0433\u043b\u0456\u0439\u0441\u044c\u043a\u0430
+languages.ks=\u041a\u0430\u0448\u043c\u0456\u0440\u0441\u044c\u043a\u0430
languages.el=\u0413\u0440\u0435\u0446\u044c\u043a\u0430
languages.qu=\u041a\u0435\u0447\u0443\u0430
languages.ko=\u041a\u043e\u0440\u0435\u0439\u0441\u044c\u043a\u0430
@@ -975,8 +652,8 @@ languages.vi=\u0412\u02bc\u0454\u0442\u043d\u0430\u043c\u0441\u044c\u043a\u0430
languages.cy=\u0412\u0430\u043b\u043b\u0456\u0439\u0441\u044c\u043a\u0430
languages.pa=\u041f\u0430\u043d\u0434\u0436\u0430\u0431\u0456
languages.cs=\u0427\u0435\u0441\u044c\u043a\u0430
-languages.it=\u0406\u0442\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0430
languages.co=\u041a\u043e\u0440\u0441\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0430
+languages.it=\u0406\u0442\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0430
languages.is=\u0406\u0441\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0430
languages.uz=\u0423\u0437\u0431\u0435\u0446\u044c\u043a\u0430
languages.or=\u041e\u0440\u0456\u044f
@@ -1048,12 +725,12 @@ languages.sr=\u0421\u0435\u0440\u0431\u0441\u044c\u043a\u0430
languages.sq=\u0410\u043b\u0431\u0430\u043d\u0441\u044c\u043a\u0430
languages.ml=\u041c\u0430\u043b\u0430\u0439\u044f\u043b\u0430\u043c
languages.ab=\u0410\u0431\u0445\u0430\u0437\u044c\u043a\u0430
-languages.mk=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u044c\u043a\u0430
languages.aa=\u0410\u0444\u0430\u0440\u0441\u044c\u043a\u0430
+languages.mk=\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u044c\u043a\u0430
languages.so=\u0421\u043e\u043c\u0430\u043b\u0456
languages.sn=\u0428\u043e\u043d\u0430
-languages.mi=\u041c\u0430\u043e\u0440\u0456
languages.gd=\u0413\u0430\u0435\u043b\u044c\u0441\u044c\u043a\u0430
+languages.mi=\u041c\u0430\u043e\u0440\u0456
languages.sm=\u0421\u0430\u043c\u043e\u0430\u043d\u0441\u044c\u043a\u0430
languages.sl=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u044c\u043a\u0430
languages.mg=\u041c\u0430\u043b\u0430\u0433\u0430\u0441\u0456\u0439\u0441\u044c\u043a\u0430
@@ -1069,14 +746,14 @@ languages.fy=\u0424\u0440\u0438\u0437\u044c\u043a\u0430
languages.sa=\u0421\u0430\u043d\u0441\u043a\u0440\u0438\u0442
languages.fr=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0430
languages.lv=\u041b\u0430\u0442\u0432\u0456\u0439\u0441\u044c\u043a\u0430
-languages.lt=\u041b\u0438\u0442\u043e\u0432\u0441\u044c\u043a\u0430
languages.fo=\u0424\u0430\u0440\u0435\u0440\u0441\u044c\u043a\u0430
+languages.lt=\u041b\u0438\u0442\u043e\u0432\u0441\u044c\u043a\u0430
languages.rw=\u041a\u0456\u043d\u0430\u0440\u0443\u0430\u043d\u0434\u0430
languages.ru=\u0420\u043e\u0441\u0456\u0439\u0441\u044c\u043a\u0430
-languages.lo=\u041b\u0430\u043e\u0441\u044c\u043a\u0430
languages.fj=\u0424\u0456\u0434\u0436\u0456
-languages.ln=\u041b\u0456\u043d\u0433\u0430\u043b\u0430
+languages.lo=\u041b\u0430\u043e\u0441\u044c\u043a\u0430
languages.fi=\u0424\u0456\u043d\u0441\u044c\u043a\u0430
+languages.ln=\u041b\u0456\u043d\u0433\u0430\u043b\u0430
languages.ro=\u0420\u0443\u043c\u0443\u043d\u0441\u044c\u043a\u0430
languages.rn=\u041a\u0456\u0440\u0443\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u0430
languages.rm=\u0420\u0435\u0442\u0440\u043e\u0440\u043e\u043c\u0430\u043d\u0441\u044c\u043a\u0456 \u0434\u0456\u0430\u043b\u0435\u043a\u0442\u0438
@@ -1084,5 +761,5 @@ languages.fa=\u041f\u0435\u0440\u0441\u044c\u043a\u0430
languages.la=\u041b\u0430\u0442\u0438\u043d\u0441\u044c\u043a\u0430
languages.xh=\u041a\u0445\u043e\u0441\u0430
languages.eu=\u0411\u0430\u0441\u043a\u0456\u0432
-languages.ky=\u041a\u0438\u0440\u0433\u0438\u0437\u044c\u043a\u0430
languages.et=\u0415\u0441\u0442\u043e\u043d\u0441\u044c\u043a\u0430
+languages.ky=\u041a\u0438\u0440\u0433\u0438\u0437\u044c\u043a\u0430
diff --git a/resource/gnu/java/locale/LocaleInformation_ur.properties b/resource/gnu/java/locale/LocaleInformation_ur.properties
index d38179b73..a8bb439ac 100644
--- a/resource/gnu/java/locale/LocaleInformation_ur.properties
+++ b/resource/gnu/java/locale/LocaleInformation_ur.properties
@@ -5,7 +5,6 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesDisplayName.PKR=PKR
currenciesSymbol.PKR=Rs
territories.PK=\u067e\u0627\u06a9\u0633\u062a\u0627\u0646
languages.ur=\u0627\u0631\u062f\u0648
diff --git a/resource/gnu/java/locale/LocaleInformation_uz.properties b/resource/gnu/java/locale/LocaleInformation_uz.properties
index ec1fa9e5e..3ffc7a824 100644
--- a/resource/gnu/java/locale/LocaleInformation_uz.properties
+++ b/resource/gnu/java/locale/LocaleInformation_uz.properties
@@ -7,7 +7,41 @@
decimalSeparator=,
groupingSeparator=\u00a0
-currenciesDisplayName.UZS=UZS
+currenciesDisplayName.INR=\u04b2\u0438\u043d\u0434 \u0440\u0443\u043f\u0438\u044f\u0441\u0438
+currenciesDisplayName.RUB=\u0420\u0443\u0441 \u0440\u0443\u0431\u043b\u0438
+currenciesDisplayName.JPY=\u042f\u043f\u043e\u043d \u0439\u0435\u043d\u0430\u0441\u0438
+currenciesDisplayName.BRL=\u0411\u0440\u0430\u0437\u0438\u043b \u0440\u0435\u0430\u043b\u0438
+currenciesDisplayName.UZS=\u040e\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u043e\u043d \u0441\u045e\u043c
+currenciesDisplayName.CNY=\u0425\u0438\u0442\u043e\u0439 \u044e\u0430\u043d\u0438
+currenciesDisplayName.USD=\u0410\u049a\u0428 \u0434\u043e\u043b\u043b\u0430\u0440\u0438
+currenciesDisplayName.EUR=\u0415\u0432\u0440\u043e
+currenciesDisplayName.GBP=\u0418\u043d\u0433\u043b\u0438\u0437 \u0444\u0443\u043d\u0442 \u0441\u0442\u0435\u0440\u043b\u0438\u043d\u0433\u0438
currenciesSymbol.UZS=\u0441\u045e\u043c
+shortMonths=\u042f\u043d\u0432®\u0424\u0435\u0432®\u041c\u0430\u0440®\u0410\u043f\u0440®\u041c\u0430\u0439®\u0418\u044e\u043d®\u0418\u044e\u043b®\u0410\u0432\u0433®\u0421\u0435\u043d®\u041e\u043a\u0442®\u041d\u043e\u044f®\u0414\u0435\u043a®®
+months=\u042f\u043d\u0432\u0430\u0440\u044c®\u0424\u0435\u0432\u0440\u0430\u043b\u044c®\u041c\u0430\u0440\u0442®\u0410\u043f\u0440\u0435\u043b\u044c®\u041c\u0430\u0439®\u0418\u044e\u043d\u044c®\u0418\u044e\u043b\u044c®\u0410\u0432\u0433\u0443\u0441\u0442®\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c®\u041e\u043a\u0442\u044f\u0431\u0440\u044c®\u041d\u043e\u044f\u0431\u0440\u044c®\u0414\u0435\u043a\u0430\u0431\u0440\u044c®®
+shortWeekdays=®\u042f\u043a\u0448®\u0414\u0443\u0448®\u0421\u0435\u0448®\u0427\u043e\u0440®\u041f\u0430\u0439®\u0416\u0443\u043c®\u0428\u0430\u043d®
+weekdays=®\u042f\u043a\u0448\u0430\u043d\u0431\u0430®\u0414\u0443\u0448\u0430\u043d\u0431\u0430®\u0421\u0435\u0448\u0430\u043d\u0431\u0430®\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430®\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430®\u0416\u0443\u043c\u0430®\u0428\u0430\u043d\u0431\u0430®
+territories.FR=\u0424\u0440\u0430\u043d\u0446\u0438\u044f
+territories.IN=\u04b2\u0438\u043d\u0434\u0438\u0441\u0442\u043e\u043d
+territories.CN=\u0425\u0438\u0442\u043e\u0439
+territories.AF=\u0410\u0444\u0493\u043e\u043d\u0438\u0441\u0442\u043e\u043d
+territories.DE=\u041e\u043b\u043c\u043e\u043d\u0438\u044f
+territories.GB=\u0411\u0438\u0440\u043b\u0430\u0448\u0433\u0430\u043d \u049a\u0438\u0440\u043e\u043b\u043b\u0438\u043a
+territories.BR=\u0411\u0440\u0430\u0437\u0438\u043b\u0438\u044f
territories.UZ=\u040e\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u043e\u043d
+territories.RU=\u0420\u043e\u0441\u0441\u0438\u044f
+territories.JP=\u042f\u043f\u043e\u043d\u0438\u044f
+territories.US=\u049a\u045e\u0448\u043c\u0430 \u0428\u0442\u0430\u0442\u043b\u0430\u0440
+territories.IT=\u0418\u0442\u0430\u043b\u0438\u044f
+languages.zh=\u0425\u0438\u0442\u043e\u0439\u0447\u0430
+languages.en=\u0418\u043d\u0433\u043b\u0438\u0437\u0447\u0430
+languages.ru=\u0420\u0443\u0441\u0447\u0430
+languages.hi=\u04b2\u0438\u043d\u0434\u0447\u0430
+languages.ar=\u0410\u0440\u0430\u0431\u0447\u0430
+languages.it=\u0418\u0442\u0430\u043b\u044f\u043d\u0447\u0430
+languages.fr=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0447\u0430
+languages.de=\u041e\u043b\u043c\u043e\u043d\u0447\u0430
+languages.es=\u0418\u0441\u043f\u0430\u043d\u0447\u0430
+languages.ja=\u042f\u043f\u043e\u043d\u0447\u0430
languages.uz=\u040e\u0437\u0431\u0435\u043a
+languages.pt=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0447\u0430
diff --git a/resource/gnu/java/locale/LocaleInformation_mn_MN.properties b/resource/gnu/java/locale/LocaleInformation_uz_AF_Arab.properties
index 7bcb6b8da..6a58c5e9d 100644
--- a/resource/gnu/java/locale/LocaleInformation_mn_MN.properties
+++ b/resource/gnu/java/locale/LocaleInformation_uz_AF_Arab.properties
@@ -1,9 +1,8 @@
-# LocaleInformation_mn_MN.properties --
+# LocaleInformation_uz_AF_Arab.properties --
# Copyright (C) 1991-2005 Unicode, Inc.
# All rights reserved. Distributed under the Terms of Use
# in http://www.unicode.org/copyright.html.
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesDisplayName.MNT=MNT
-currenciesSymbol.MNT=\u20ae
+firstDayOfWeek=sat
diff --git a/resource/gnu/java/locale/LocaleInformation_uz_AF.properties b/resource/gnu/java/locale/LocaleInformation_uz_Arab.properties
index 5f654eadc..5a66a0fad 100644
--- a/resource/gnu/java/locale/LocaleInformation_uz_AF.properties
+++ b/resource/gnu/java/locale/LocaleInformation_uz_Arab.properties
@@ -1,4 +1,4 @@
-# LocaleInformation_uz_AF.properties --
+# LocaleInformation_uz_Arab.properties --
# Copyright (C) 1991-2005 Unicode, Inc.
# All rights reserved. Distributed under the Terms of Use
# in http://www.unicode.org/copyright.html.
@@ -11,7 +11,7 @@ minusSign=\u2212
zeroDigit=\u06f0
decimalSeparator=\u066b
groupingSeparator=\u066c
-currencyFormat=#,##0 \u00a4;-#,##0 \u00a4
+currencyFormat=#,##0.00 \u00a4;-#,##0.00 \u00a4
currenciesDisplayName.AFA=\u0627\u0641\u063a\u0627\u0646\u06cc
currenciesSymbol.AFA=\u0627\u0641\u063a\u0627\u0646\u06cc
shortMonths=\u062c\u0646\u0648®\u0641\u0628\u0631®\u0645\u0627\u0631®\u0627\u067e\u0631®\u0645\u0640\u06cc®\u062c\u0648\u0646®\u062c\u0648\u0644®\u0627\u06af\u0633®\u0633\u067e\u062a®\u0627\u06a9\u062a®\u0646\u0648\u0645®\u062f\u0633\u0645®®
diff --git a/resource/gnu/java/locale/LocaleInformation_uz_Latn.properties b/resource/gnu/java/locale/LocaleInformation_uz_Latn.properties
new file mode 100644
index 000000000..8d0c8c70d
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_uz_Latn.properties
@@ -0,0 +1,45 @@
+# LocaleInformation_uz_Latn.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currenciesDisplayName.INR=Hind rupiyasi
+currenciesDisplayName.RUB=Rus rubli
+currenciesDisplayName.JPY=Yapon yenasi
+currenciesDisplayName.BRL=Brazil reali
+currenciesDisplayName.UZS=O\u02bfzbekiston so\u02bfm
+currenciesDisplayName.CNY=Xitoy yuani
+currenciesDisplayName.USD=AQSH dollari
+currenciesDisplayName.EUR=Evro
+currenciesDisplayName.GBP=Ingliz funt sterlingi
+currenciesSymbol.UZS=so\u02bfm
+shortMonths=Yanv®Fev®Mar®Apr®May®Iyun®Iyul®Avg®Sen®Okt®Noya®Dek®®
+months=Yanvar®Fevral®Mart®Aprel®May®Iyun®Iyul®Avgust®Sentyabr®Oktyabr®Noyabr®Dekabr®®
+shortWeekdays=®Yaksh®Dush®Sesh®Chor®Pay®Jum®Shan®
+weekdays=®Yakshanba®Dushanba®Seshanba®Chorshanba®Payshanba®Juma®Shanba®
+territories.FR=Frantsiya
+territories.IN=Hindiston
+territories.CN=Xitoy
+territories.AF=Afg\u02bfoniston
+territories.DE=Olmoniya
+territories.GB=Birlashgan Qirollik
+territories.BR=Braziliya
+territories.UZ=O\u02bfzbekiston
+territories.RU=Rossiya
+territories.JP=Yaponiya
+territories.US=Qo'shma Shtatlar
+territories.IT=Italiya
+languages.zh=Xitoycha
+languages.en=Inglizcha
+languages.ru=Ruscha
+languages.hi=Hindcha
+languages.ar=Arabcha
+languages.it=Italyancha
+languages.fr=Frantsuzcha
+languages.de=Olmoncha
+languages.es=Ispancha
+languages.ja=Yaponcha
+languages.uz=o\u02bfzbek
+languages.pt=Portugalcha
diff --git a/resource/gnu/java/locale/LocaleInformation_vi.properties b/resource/gnu/java/locale/LocaleInformation_vi.properties
index 7ccdba413..e8482ca70 100644
--- a/resource/gnu/java/locale/LocaleInformation_vi.properties
+++ b/resource/gnu/java/locale/LocaleInformation_vi.properties
@@ -57,8 +57,8 @@ territories.SA=A-r\u1eadp X\u00ea-\u00fat
territories.FR=Ph\u00e1p
territories.FM=Mi-cr\u00f4-n\u00ea-xi-a
territories.RW=Ru-an-\u0111a
-territories.RU=Nga
territories.FJ=Phi-gi
+territories.RU=Nga
territories.FI=Ph\u1ea7n Lan
territories.RO=Ru-ma-ni
territories.ET=\u00ca-ti-\u00f4-pi-a
@@ -80,11 +80,12 @@ territories.PK=Pa-ki-xtan
territories.PH=Phi-lip-pin
territories.PG=Pa-pu-a Niu Ghi-n\u00ea
territories.CZ=C\u1ed9ng h\u00f2a S\u00e9c
-territories.PE=P\u00ea-ru
territories.CY=S\u00edp
+territories.PE=P\u00ea-ru
territories.CV=C\u00e1p-ve
-territories.PA=Pa-na-ma
territories.CU=Cu Ba
+territories.PA=Pa-na-ma
+territories.CS=S\u00e9c-bia
territories.CR=C\u1ed1t-xta Ri-ca
territories.CO=C\u00f4-l\u00f4m-bi-a
territories.CN=Trung Qu\u1ed1c
@@ -101,51 +102,50 @@ territories.BY=B\u00ea-la-r\u00fat
territories.BW=B\u1ed1t-xoa-na
territories.BS=Ba-ha-ma
territories.BR=Bra-xin
-territories.NZ=Niu Di-l\u00e2n
territories.BO=B\u00f4-li-vi-a
+territories.NZ=Niu Di-l\u00e2n
territories.BN=Bru-n\u00e2y
territories.BJ=B\u00ea-nanh
territories.BI=Bu-run-\u0111i
territories.BH=Ba-ren
territories.BG=Bun-ga-ri
territories.BF=Bu\u1ed1c-ki-na Pha-x\u00f4
-territories.NP=N\u00ea-pan
territories.BE=B\u1ec9
-territories.NO=Na Uy
+territories.NP=N\u00ea-pan
territories.BD=B\u0103ng-la-\u0111\u00e9t
+territories.NO=Na Uy
territories.BB=B\u00e1c-ba-\u0111\u1ed1t
territories.ZW=Dim-ba-bu-\u00ea
-territories.NL=H\u00e0 Lan
territories.BA=B\u00f4-xni-a H\u00e9c-x\u00ea-g\u00f4-vi-na
+territories.NL=H\u00e0 Lan
territories.NI=Ni-ca-ra-goa
territories.NG=Ni-gi\u00ea-ri-a
territories.AZ=Ai-d\u00e9c-bai-gian
territories.NE=Ni-gi\u00ea
territories.ZM=D\u0103m-bi-a
-territories.AU=\u00dac
territories.NA=Nam-mi-bi-a
+territories.AU=\u00dac
territories.AT=\u00c1o
territories.AR=\u00c1c-hen-ti-na
-territories.MZ=M\u00f4-d\u0103m-b\u00edch
territories.AO=\u0102ng-g\u00f4-la
+territories.MZ=M\u00f4-d\u0103m-b\u00edch
territories.MY=Ma-lay-xi-a
-territories.MX=M\u00ea-hi-c\u00f4
territories.AM=\u00c1c-m\u00ea-ni-a
-territories.MW=Ma-la-uy
+territories.MX=M\u00ea-hi-c\u00f4
territories.AL=An-ba-ni
+territories.MW=Ma-la-uy
territories.MV=Man-\u0111i-v\u01a1
territories.ZA=Nam Phi
territories.MU=M\u00f4-ri-x\u01a1
territories.MT=Man-ta
-territories.MR=M\u00f4-ri-ta-ni
territories.AG=An-ti-gu-a v\u00e0 Ba-bu-\u0111a
+territories.MR=M\u00f4-ri-ta-ni
territories.AF=\u00c1p-ga-ni-xtan
territories.AE=C\u00e1c Ti\u1ec3u V\u01b0\u01a1ng qu\u1ed1c A-r\u1eadp Th\u1ed1ng nh\u1ea5t
territories.MN=M\u00f4ng C\u1ed5
territories.MM=Mi-an-ma
territories.ML=Ma-li
territories.MK=Ma-x\u00ea-\u0111\u00f4-ni-a
-territories.YU=Nam T\u01b0
territories.MH=Qu\u1ea7n \u0111\u1ea3o M\u00e1c-san
territories.MG=Ma-\u0111a-g\u00e1t-xca
territories.MD=M\u00f4n-\u0111\u00f4-va
@@ -233,8 +233,8 @@ languages.yi=Ti\u1ebfng Y-\u0111it
languages.sa=Ti\u1ebfng Ph\u1ea1n
languages.cs=Ti\u1ebfng S\u00e9c
languages.lv=Ti\u1ebfng L\u00e1t-vi-a
-languages.it=Ti\u1ebfng \u00dd
languages.fr=Ti\u1ebfng Ph\u00e1p
+languages.it=Ti\u1ebfng \u00dd
languages.is=Ti\u1ebfng Ai-x\u01a1-len
languages.uz=Ti\u1ebfng U-d\u01a1-b\u1ebfch
languages.lt=Ti\u1ebfng L\u00edt-va
@@ -250,8 +250,8 @@ languages.ia=Ti\u1ebfng Khoa H\u1ecdc Qu\u1ed1c T\u1ebf
languages.la=Ti\u1ebfng La-tinh
languages.hy=Ti\u1ebfng \u00c1c-m\u00ea-ni
languages.et=Ti\u1ebfng E-xt\u00f4-ni-a
-languages.hu=Ti\u1ebfng Hung-ga-ri
languages.es=Ti\u1ebfng T\u00e2y Ban Nha
+languages.hu=Ti\u1ebfng Hung-ga-ri
languages.bo=Ti\u1ebfng T\u00e2y T\u1ea1ng
languages.hr=Ti\u1ebfng Cr\u00f4-a-ti-a
languages.eo=Ti\u1ebfng Qu\u1ed1c T\u1ebf Ng\u1eef
@@ -260,10 +260,10 @@ languages.el=Ti\u1ebfng Hy L\u1ea1p
languages.ko=Ti\u1ebfng H\u00e0n Qu\u1ed1c
languages.kn=Ti\u1ebfng Kan-na-\u0111a
languages.no=Ti\u1ebfng Na Uy
-languages.km=Ti\u1ebfng Campuchia
languages.bg=Ti\u1ebfng Bun-ga-ri
+languages.km=Ti\u1ebfng Campuchia
languages.tr=Ti\u1ebfng Th\u1ed5 Nh\u0129 K\u1ef3
-languages.hi=Ti\u1ebfng Hin-\u0111i
languages.be=Ti\u1ebfng B\u00ea-la-r\u00fat
+languages.hi=Ti\u1ebfng Hin-\u0111i
languages.nl=Ti\u1ebfng H\u00e0 Lan
languages.he=Ti\u1ebfng H\u00ea-br\u01a1
diff --git a/resource/gnu/java/locale/LocaleInformation_wal.properties b/resource/gnu/java/locale/LocaleInformation_wal.properties
new file mode 100644
index 000000000..f0485c2b1
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_wal.properties
@@ -0,0 +1,169 @@
+# LocaleInformation_wal.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+currenciesDisplayName.INR=\u12e8\u1215\u1295\u12f5 \u1229\u1352
+currenciesDisplayName.RUB=\u12e8\u122b\u123b \u1229\u1265\u120d
+currenciesDisplayName.JPY=\u12e8\u1303\u1353\u1295 \u12e8\u1295
+currenciesDisplayName.BRL=\u12e8\u1265\u122b\u12da\u120d \u122a\u120d
+currenciesDisplayName.CNY=\u12e8\u127b\u12ed\u1293 \u12e9\u12a0\u1295 \u1228\u1295\u121a\u1295\u1262
+currenciesDisplayName.USD=\u12e8\u12a0\u121c\u122a\u12ab\u1295 \u12f6\u120b\u122d
+currenciesDisplayName.EUR=\u12a0\u12cd\u122e
+currenciesDisplayName.ETB=\u12e8\u12a2\u1275\u12ee\u1335\u12eb \u1265\u122d
+currenciesDisplayName.GBP=\u12e8\u12a5\u1295\u130d\u120a\u12dd \u1353\u12cd\u1295\u12f5 \u1235\u1270\u122d\u120a\u1295\u130d
+currenciesSymbol.ETB=$
+currenciesSymbol.CNY=Y
+currenciesSymbol.USD=USD
+currenciesSymbol.BRL=R$
+shortMonths=\u1303\u1295\u12e9®\u134c\u1265\u1229®\u121b\u122d\u127d®\u12a4\u1355\u1228®\u121c\u12ed®\u1301\u1295®\u1301\u120b\u12ed®\u12a6\u1308\u1235®\u1234\u1355\u1274®\u12a6\u12ad\u1270®\u1296\u126c\u121d®\u12f2\u1234\u121d®®
+months=\u1303\u1295\u12e9\u12c8\u122a®\u134c\u1265\u1229\u12c8\u122a®\u121b\u122d\u127d®\u12a4\u1355\u1228\u120d®\u121c\u12ed®\u1301\u1295®\u1301\u120b\u12ed®\u12a6\u1308\u1235\u1275®\u1234\u1355\u1274\u121d\u1260\u122d®\u12a6\u12ad\u1270\u12cd\u1260\u122d®\u1296\u126c\u121d\u1260\u122d®\u12f2\u1234\u121d\u1260\u122d®®
+shortWeekdays=®\u12c8\u130b®\u1233\u12ed\u1296®\u121b\u1246\u1233®\u12a0\u1229\u12cb®\u1203\u1219\u1233®\u12a0\u122d\u1263®\u1244\u122b®
+weekdays=®\u12c8\u130b®\u1233\u12ed\u1296®\u121b\u1246\u1233\u129b®\u12a0\u1229\u12cb®\u1203\u1219\u1233®\u12a0\u122d\u1263®\u1244\u122b®
+firstDayOfWeek=sat
+eras=\u12a0\u12f3 \u12ce\u12f4®\u130d\u122e\u1270\u1273 \u120b\u12ed\u1273®
+ampms=\u121b\u1208\u12f6®\u1243\u121b®
+territories.AU=\u12a0\u12cd\u1235\u1275\u122c\u120a\u12eb
+territories.TD=\u127b\u12f5
+territories.AT=\u12a6\u1235\u1275\u122a\u12eb
+territories.GY=\u1309\u12eb\u1293
+territories.AR=\u12a0\u122d\u1300\u1295\u1272\u1293
+territories.GW=\u1262\u1233\u12ce
+territories.MY=\u121b\u120c\u12e2\u12eb
+territories.MX=\u121c\u12ad\u1232\u12ae
+territories.AN=\u1294\u12d8\u122d\u120b\u1295\u12f5\u1235 \u12a0\u1295\u1272\u120d\u1235
+territories.AM=\u12a0\u122d\u121c\u1292\u12eb
+territories.GR=\u130d\u122a\u12ad
+territories.ZA=\u12f0\u1261\u1265 \u12a0\u134d\u122a\u12ab
+territories.AL=\u12a0\u120d\u1263\u1292\u12eb
+territories.GQ=\u12a2\u12b3\u1276\u122a\u12eb\u120d \u130a\u1292
+territories.MU=\u121b\u1229\u1238\u1235
+territories.SY=\u1232\u122a\u12eb
+territories.MT=\u121b\u120d\u1273
+territories.GN=\u130a\u1292
+territories.MR=\u121e\u122a\u1274\u1292\u12eb
+territories.GM=\u130b\u121d\u1262\u12eb
+territories.MO=\u121b\u12ab\u12ce
+territories.AE=\u12e8\u1270\u1263\u1260\u1229\u1275 \u12a0\u1228\u1265 \u12a4\u121d\u122c\u1275\u1235
+territories.MN=\u121e\u1295\u130e\u120a\u12eb
+territories.AD=\u12a0\u1295\u12f6\u122b
+territories.MK=\u121b\u12a8\u12f6\u1292\u12eb
+territories.GF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u1309\u12ca\u12a0\u1293
+territories.SO=\u1231\u121b\u120c
+territories.GE=\u1306\u122d\u1302\u12eb
+territories.SN=\u1234\u1294\u130b\u120d
+territories.GB=\u12a5\u1295\u130d\u120a\u12dd
+territories.SK=\u1235\u120e\u126b\u12aa\u12eb
+territories.SI=\u1235\u120e\u126c\u1292\u12eb
+territories.MD=\u121e\u120d\u12f6\u126b
+territories.SG=\u1232\u1295\u130b\u1356\u122d
+territories.MA=\u121e\u122e\u12ae
+territories.SE=\u1235\u12ca\u12f5\u1295
+territories.SD=\u1231\u12f3\u1295
+territories.SA=\u1233\u12cd\u12f5\u12a0\u1228\u1262\u12eb
+territories.YE=\u12e8\u1218\u1295
+territories.LY=\u120a\u1262\u12eb
+territories.FR=\u1348\u1228\u1295\u1233\u12ed
+territories.LV=\u120b\u1275\u126a\u12eb
+territories.LT=\u120a\u1271\u12cc\u1292\u12eb
+territories.FM=\u121a\u12ad\u122e\u1294\u12e2\u12eb
+territories.RU=\u122b\u123a\u12eb
+territories.FJ=\u134a\u1302
+territories.FI=\u134a\u1295\u120b\u1295\u12f5
+territories.RO=\u122e\u121c\u1292\u12eb
+territories.LB=\u120a\u1263\u1296\u1235
+territories.ET=\u12a2\u1275\u12ee\u1335\u12eb
+territories.ES=\u1235\u1354\u1295
+territories.KW=\u12ad\u12cc\u1275
+territories.ER=\u12a4\u122d\u1275\u122b
+territories.KR=\u1230\u121c\u1295 \u12ae\u122a\u12eb
+territories.KP=\u12f0\u1261\u1265 \u12ae\u122a\u12eb
+territories.KM=\u12ae\u121e\u122e\u1235
+territories.EH=\u121d\u12d5\u122b\u1263\u12ca \u1233\u1205\u122b
+territories.EG=\u130d\u1265\u133d
+territories.EE=\u12a4\u1235\u1276\u1292\u12eb
+territories.EC=\u12a2\u12b3\u12f6\u122d
+territories.KH=\u12ab\u121d\u1266\u12f2\u12eb
+territories.DZ=\u12a0\u120d\u1304\u122a\u12eb
+territories.DO=\u12f6\u121a\u1292\u12ad \u122a\u1351\u1265\u120a\u12ad
+territories.DM=\u12f6\u121a\u1292\u12ab
+territories.DK=\u12f4\u1295\u121b\u122d\u12ad
+territories.JP=\u1303\u1353\u1295
+territories.JO=\u1306\u122d\u12f3\u1295
+territories.PR=\u1356\u122d\u1273 \u122a\u12ae
+territories.JM=\u1303\u121b\u12ed\u12ab
+territories.DE=\u1300\u122d\u1218\u1295
+territories.PL=\u1356\u120b\u1295\u12f5
+territories.PG=\u1353\u1351\u12cb \u1292\u12cd \u130a\u1292
+territories.PF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u1356\u120a\u1294\u12e2\u12eb
+territories.PE=\u1354\u1229
+territories.CZ=\u127c\u12ad \u122a\u1351\u1265\u120a\u12ad
+territories.VI=\u12e8\u12a0\u121c\u122a\u12ab \u1268\u122d\u1302\u1295 \u12f0\u1234\u1276\u127d
+territories.CY=\u1233\u12ed\u1355\u1228\u1235
+territories.VG=\u12e8\u12a5\u1295\u130d\u120a\u12dd \u12f5\u1295\u130d\u120d \u12f0\u1234\u1276\u127d
+territories.CV=\u12ac\u1355 \u126c\u122d\u12f4
+territories.VE=\u126c\u1295\u12d9\u12cc\u120b
+territories.CS=\u1230\u122d\u1262\u12eb
+territories.CO=\u12ae\u120e\u121d\u1262\u12eb
+territories.IT=\u1323\u120a\u12eb\u1295
+territories.CN=\u127b\u12ed\u1293
+territories.IS=\u12a0\u12ed\u1235\u120b\u1295\u12f5
+territories.CM=\u12ab\u121c\u1229\u1295
+territories.CL=\u127a\u120a
+territories.IQ=\u12a2\u122b\u1245
+territories.UZ=\u12e9\u12dd\u1260\u12aa\u1235\u1273\u1295
+territories.IN=\u1205\u1295\u12f5
+territories.CH=\u1235\u12ca\u12d8\u122d\u120b\u1295\u12f5
+territories.IL=\u12a5\u1235\u122b\u12a4\u120d
+territories.CF=\u12e8\u1218\u12ab\u12a8\u1208\u129b\u12cd \u12a0\u134d\u122a\u12ab \u122a\u1350\u1265\u120a\u12ad
+territories.US=\u12a0\u121c\u122a\u12ab
+territories.CD=\u12ae\u1295\u130e
+territories.IE=\u12a0\u12e8\u122d\u120b\u1295\u12f5
+territories.ID=\u12a2\u1295\u12f6\u1294\u12e2\u12eb
+territories.BZ=\u1264\u120a\u12d8
+territories.BY=\u1264\u120b\u1229\u1235
+territories.UG=\u12e9\u130b\u1295\u12f3
+territories.BT=\u1261\u1205\u1273\u1295
+territories.BR=\u1265\u122b\u12da\u120d
+territories.NZ=\u1292\u12cd \u12da\u120b\u1295\u12f5
+territories.HU=\u1200\u1295\u130b\u122a
+territories.BO=\u1266\u120a\u126a\u12eb
+territories.HT=\u1200\u12ed\u1272
+territories.BM=\u1264\u122d\u1219\u12f3
+territories.HR=\u12ad\u122e\u12a4\u123d\u12eb
+territories.TZ=\u1273\u1295\u12db\u1292\u12eb
+territories.BH=\u1263\u1205\u122c\u1295
+territories.BG=\u1261\u120d\u130c\u122a\u12eb
+territories.NP=\u1294\u1353\u120d
+territories.HK=\u1206\u1295\u130d \u12ae\u1295\u130d
+territories.TT=\u1275\u122a\u1292\u12f3\u12f5 \u12a5\u1293 \u1276\u1263\u130e
+territories.NO=\u1296\u122d\u12cc
+territories.BE=\u1264\u120d\u1304\u121d
+territories.TR=\u1271\u122d\u12ad
+territories.NL=\u1294\u12d8\u122d\u120b\u1295\u12f5
+territories.BB=\u1263\u122d\u1264\u12f6\u1235
+territories.BA=\u1266\u1235\u1292\u12eb \u12a5\u1293 \u1204\u122d\u12de\u130e\u126a\u1292\u12eb
+territories.TN=\u1271\u1292\u12da\u12eb
+territories.TL=\u121d\u1235\u122b\u1245 \u1272\u121e\u122d
+territories.NG=\u1293\u12ed\u1304\u122a\u12eb
+territories.TJ=\u1273\u1303\u12aa\u1235\u1273\u1295
+territories.AZ=\u12a0\u12d8\u122d\u1263\u1303\u1295
+territories.ZM=\u12db\u121d\u1262\u12eb
+territories.TH=\u1273\u12ed\u120b\u1295\u12f5
+territories.NC=\u1292\u12cd \u12ab\u120c\u12f6\u1292\u12eb
+territories.TF=\u12e8\u1348\u1228\u1295\u1233\u12ed \u12f0\u1261\u1263\u12ca \u130d\u12db\u1276\u127d
+territories.NA=\u1293\u121a\u1262\u12eb
+languages.zh=\u127b\u12ed\u1295\u129b
+languages.en=\u12a5\u1295\u130d\u120a\u12dd\u129b
+languages.ru=\u122b\u123d\u129b
+languages.hi=\u1210\u1295\u12f5\u129b
+languages.ar=\u12d0\u122d\u1262\u129b
+languages.wal=\u12c8\u120b\u12ed\u1273\u1271
+languages.it=\u1323\u120a\u12eb\u1295\u129b
+languages.fr=\u1348\u1228\u1295\u1233\u12ed\u129b
+languages.de=\u1300\u122d\u1218\u1295
+languages.es=\u1235\u1353\u1292\u123d
+languages.ja=\u1303\u1353\u1295\u129b
+languages.pt=\u1356\u122d\u1271\u130b\u120a\u129b
diff --git a/resource/gnu/java/locale/LocaleInformation_wal_ET.properties b/resource/gnu/java/locale/LocaleInformation_wal_ET.properties
new file mode 100644
index 000000000..eec1bedbb
--- /dev/null
+++ b/resource/gnu/java/locale/LocaleInformation_wal_ET.properties
@@ -0,0 +1,17 @@
+# LocaleInformation_wal_ET.properties --
+# Copyright (C) 1991-2005 Unicode, Inc.
+# All rights reserved. Distributed under the Terms of Use
+# in http://www.unicode.org/copyright.html.
+#
+# This file was automatically generated by gnu.localegen from CLDR.
+
+groupingSeparator=\u12c8
+currencyFormat=\u00a4#,##0.00;-\u00a4#,##0.00
+shortDateFormat=dd/MM/yy
+mediumDateFormat=dd-MMM-yyyy
+longDateFormat=dd MMMM yyyy
+fullDateFormat=EEEE\u1365 dd MMMM \u130b\u120b\u1233 yyyy G
+shortTimeFormat=h:mm a
+mediumTimeFormat=h:mm:ss a
+longTimeFormat=h:mm:ss a
+fullTimeFormat=h:mm:ss a
diff --git a/resource/gnu/java/locale/LocaleInformation_zh.properties b/resource/gnu/java/locale/LocaleInformation_zh.properties
index 035c2b5ce..1924cee31 100644
--- a/resource/gnu/java/locale/LocaleInformation_zh.properties
+++ b/resource/gnu/java/locale/LocaleInformation_zh.properties
@@ -6,740 +6,258 @@
# This file was automatically generated by gnu.localegen from CLDR.
localPatternChars=GanjkHmsSEDFwWxhKzAeugXZ
-currenciesDisplayName.JOD=\u7ea6\u65e6\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.XAU=\u9ec4\u91d1
-currenciesDisplayName.FOK=\u6cd5\u7f57\u7fa4\u5c9b\u514b\u6717
-currenciesDisplayName.LBP=\u9ece\u5df4\u5ae9\u78c5
-currenciesDisplayName.EUR=\u6b27\u5143
-currenciesDisplayName.VND=\u8d8a\u5357\u76fe
-currenciesDisplayName.TZS=\u5766\u6851\u5c3c\u4e9a\u5148\u4ee4
-currenciesDisplayName.BOP=\u73bb\u5229\u7ef4\u4e9a\u6bd4\u7d22
-currenciesDisplayName.KHR=\u67ec\u57d4\u5be8\u91cc\u5c14
-currenciesDisplayName.XAM=\u4e9a\u6d32\u8d27\u5e01\u5355\u4f4d
-currenciesDisplayName.BOL=\u73bb\u5229\u7ef4\u4e9a (1863-1962)
-currenciesDisplayName.KHO=\u67ec\u57d4\u5be8\u65e7\u91cc\u5c14
-currenciesDisplayName.ZMP=\u8d5e\u6bd4\u4e9a\u78c5
-currenciesDisplayName.AUP=\u6fb3\u5927\u5229\u4e9a\u78c5
-currenciesDisplayName.MTP=\u9a6c\u5c14\u4ed6\u78c5
-currenciesDisplayName.GHR=\u52a0\u7eb3\u91cd\u8bc4\u4f30\u585e\u7b2c
-currenciesDisplayName.ZMK=\u8d5e\u6bd4\u4e9a\u9a6c\u62c9\u7ef4
-currenciesDisplayName.XAD=\u4e9a\u6d32\u7b2c\u7eb3\u5c14\u5143\u5e10\u6237\u5355\u4f4d
-currenciesDisplayName.GHP=\u52a0\u7eb3\u78c5
-currenciesDisplayName.BOB=\u73bb\u5229\u7ef4\u4e9a
-currenciesDisplayName.GHO=\u52a0\u7eb3\u65e7\u585e\u7b2c
-currenciesDisplayName.MTL=\u9a6c\u5c14\u4ed6\u91cc\u62c9
-currenciesDisplayName.AUD=\u6fb3\u5927\u5229\u4e9a\u5143
-currenciesDisplayName.USS=\u7f8e\u5143 (\u540c\u4e00\u5929)
-currenciesDisplayName.ITL=\u610f\u5927\u5229\u91cc\u62c9
-currenciesDisplayName.USN=\u7f8e\u5143 (\u4e0b\u4e00\u5929)
-currenciesDisplayName.GHC=\u52a0\u7eb3\u585e\u7b2c
-currenciesDisplayName.SGD=\u65b0\u52a0\u5761\u5143
-currenciesDisplayName.PAB=\u5df4\u62ff\u9a6c\u5df4\u6ce2\u4e9a
-currenciesDisplayName.LAK=\u8001\u631d\u57fa\u666e
-currenciesDisplayName.KGS=\u5409\u5c14\u5409\u65af\u5766\u8428\u59c6
-currenciesDisplayName.CHF=\u745e\u58eb\u6cd5\u90ce
-currenciesDisplayName.ATS=\u5965\u5730\u5229\u897f\u4ee4
-currenciesDisplayName.USD=\u7f8e\u5143
-currenciesDisplayName.ETD=\u57c3\u585e\u4fc4\u6bd4\u4e9a\u5143
-currenciesDisplayName.BND=\u6c76\u83b1\u5143
-currenciesDisplayName.JMP=\u7259\u4e70\u52a0\u78c5
-currenciesDisplayName.ETB=\u57c3\u585e\u4fc4\u6bd4\u4e9a\u6bd4\u5c14
-currenciesDisplayName.DZG=\u963f\u5c14\u53ca\u5229\u4e9a\u6cd5\u90ce\u6bd4\u65af\u67e5
-currenciesDisplayName.DZF=\u963f\u5c14\u53ca\u5229\u4e9a\u65b0\u6cd5\u90ce
-currenciesDisplayName.DZD=\u963f\u5c14\u53ca\u5229\u4e9a\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.PYG=\u5df4\u62c9\u572d\u5e01
-currenciesDisplayName.LYP=\u5229\u6bd4\u4e9a\u78c5
-currenciesDisplayName.JMD=\u7259\u4e70\u52a0\u5143
-currenciesDisplayName.ISK=\u51b0\u5c9b\u514b\u6717
-currenciesDisplayName.ESP=\u897f\u73ed\u7259\u9a6c\u8d5b\u5854
-currenciesDisplayName.BMP=\u767e\u6155\u5927\u78c5
-currenciesDisplayName.LYD=\u5229\u6bd4\u4e9a\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.LYB=\u5229\u6bd4\u4e9a\u82f1\u56fd\u519b\u961f\u519b\u65b9\u91cc\u62c9
-currenciesDisplayName.BMD=\u767e\u6155\u5927\u5143
-currenciesDisplayName.NLG=\u8377\u5170\u76fe
-currenciesDisplayName.MRO=\u91cc\u5854\u5c3c\u4e9a\u4e4c\u5409\u4e9a
-currenciesDisplayName.IRR=\u4f0a\u6717\u91cc\u4e9a \u5c14
-currenciesDisplayName.SEK=\u745e\u58eb\u514b\u6717
-currenciesDisplayName.ERN=\u5384\u7acb\u7279\u91cc\u4e9a\u7eb3\u798f\u5361
+currenciesDisplayName.YDD=\u4e5f\u95e8\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.TWD=\u65b0\u53f0\u5e01
currenciesDisplayName.KES=\u80af\u5c3c\u4e9a\u5148\u4ee4
-currenciesDisplayName.CFF=\u4e2d\u975e\u5171\u548c\u56fd CFA \u6cd5\u90ce
+currenciesDisplayName.BYB=\u767d\u4fc4\u7f57\u65af\u65b0\u5362\u5e03 (1994-1999)
+currenciesDisplayName.LKR=\u65af\u91cc\u5170\u5361\u5362\u6bd4
+currenciesDisplayName.RWF=\u5362\u65fa\u8fbe\u6cd5\u90ce
+currenciesDisplayName.TJS=\u5854\u5409\u514b\u65af\u5766\u7d22\u83ab\u5c3c
+currenciesDisplayName.SDP=\u82cf\u4e39\u78c5
+currenciesDisplayName.TJR=\u5854\u5409\u514b\u65af\u5766\u5362\u5e03
+currenciesDisplayName.ERN=\u5384\u7acb\u7279\u91cc\u4e9a\u7eb3\u798f\u5361
+currenciesDisplayName.AFN=\u963f\u5bcc\u6c57\u5c3c
+currenciesDisplayName.GRD=\u5e0c\u814a\u5fb7\u62c9\u514b\u9a6c
+currenciesDisplayName.IEP=\u7231\u5c14\u5170\u78c5
currenciesDisplayName.ARS=\u963f\u6839\u5ef7\u6bd4\u7d22
+currenciesDisplayName.SDD=\u82cf\u4e39\u7b2c\u7eb3\u5c14\u5143
currenciesDisplayName.ARP=\u963f\u6839\u5ef7\u6bd4\u7d22 (1983-1985)
-currenciesDisplayName.ARM=\u963f\u6839\u5ef7\u6bd4\u7d22\u6807\u51c6\u5c40
-currenciesDisplayName.TWD=\u65b0\u53f0\u5e01
-currenciesDisplayName.SDP=\u82cf\u4e39\u78c5
currenciesDisplayName.GEL=\u4e54\u6cbb\u4e9a\u5e93\u84ec\u62c9\u745e
+currenciesDisplayName.AFA=\u963f\u5bcc\u6c57\u5c3c (1927-2002)
currenciesDisplayName.GEK=\u4e54\u6cbb\u4e9a\u5e93\u84ec\u62c9\u745e\u7279
-currenciesDisplayName.MQF=\u9a6c\u8482\u5c3c\u6cd5\u90ce
+currenciesDisplayName.CRC=\u54e5\u65af\u8fbe\u9ece\u52a0\u79d1\u9686
currenciesDisplayName.FKP=\u798f\u514b\u5170\u7fa4\u5c9b\u78c5
+currenciesDisplayName.EEK=\u7231\u6c99\u5c3c\u4e9a\u514b\u6717
+currenciesDisplayName.HKD=\u6e2f\u5143
+currenciesDisplayName.MDL=\u5357\u7279\u5e02\u5217\u4f0a
currenciesDisplayName.ARA=\u963f\u6839\u5ef7\u5965\u65af\u7279
-currenciesDisplayName.SDD=\u82cf\u4e39\u7b2c\u7eb3\u5c14\u5143
currenciesDisplayName.IQD=\u4f0a\u62c9\u514b\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.TVD=\u56fe\u74e6\u5362\u5143
currenciesDisplayName.SCR=\u585e\u820c\u5c14\u5362\u6bd4
+currenciesDisplayName.VUV=\u74e6\u52aa\u963f\u56fe
+currenciesDisplayName.DKK=\u4e39\u9ea6\u514b\u6717
+currenciesDisplayName.KPW=\u5317\u671d\u9c9c\u5e01
+currenciesDisplayName.GQE=\u8d64\u9053\u51e0\u5185\u4e9a\u7231\u514b\u5a01\u4e50
+currenciesDisplayName.IDR=\u5370\u5ea6\u5c3c\u897f\u4e9a\u76fe
currenciesDisplayName.LVR=\u62c9\u8131\u7ef4\u4e9a\u5362\u5e03
-currenciesDisplayName.FJP=\u6590\u6d4e\u78c5
+currenciesDisplayName.SOS=\u7d22\u9a6c\u91cc\u5148\u4ee4
+currenciesDisplayName.AED=\u963f\u8054\u914b\u8fea\u62c9\u59c6
+currenciesDisplayName.BWP=\u6ce2\u6e23\u90a3\u6251\u62c9
currenciesDisplayName.LVL=\u62c9\u8131\u7ef4\u4e9a\u62c9\u7279
-currenciesDisplayName.CDL=\u521a\u679c\u624e\u4f0a\u5c14
-currenciesDisplayName.CDG=\u521a\u679c\u5171\u548c\u56fd\u6cd5\u90ce
-currenciesDisplayName.CDF=\u521a\u679c\u6cd5\u90ce
-currenciesDisplayName.FJD=\u6590\u6d4e\u5143
+currenciesDisplayName.RUR=\u4fc4\u56fd\u5362\u5e03 (1991-1998)
currenciesDisplayName.NIO=\u5c3c\u52a0\u62c9\u74dc\u91d1\u54e5\u591a\u534e
+currenciesDisplayName.ADP=\u5b89\u9053\u5c14\u6bd4\u585e\u5854\u5143
+currenciesDisplayName.FJD=\u6590\u6d4e\u5143
currenciesDisplayName.MOP=\u6fb3\u95e8\u5143
-currenciesDisplayName.NIG=\u5c3c\u52a0\u62c9\u74dc\u91d1\u79d1\u591a\u5df4
+currenciesDisplayName.RUB=\u4fc4\u56fd\u5362\u5e03
+currenciesDisplayName.CDF=\u521a\u679c\u6cd5\u90ce
currenciesDisplayName.NIC=\u5c3c\u52a0\u62c9\u74dc\u79d1\u591a\u5df4
-currenciesDisplayName.FIN=\u82ac\u5170\u739b\u5361 (1860-1962)
-currenciesDisplayName.FIM=\u82ac\u5170\u739b\u5361
+currenciesDisplayName.DJF=\u5409\u5e03\u63d0\u6cd5\u90ce
currenciesDisplayName.SBD=\u6240\u7f57\u95e8\u7fa4\u5c9b\u5143
+currenciesDisplayName.UZS=\u4e4c\u5179\u522b\u514b\u65af\u5766\u5e01
+currenciesDisplayName.ECS=\u5384\u74dc\u591a\u5c14\u82cf\u514b\u96f7
+currenciesDisplayName.PHP=\u83f2\u5f8b\u5bbe\u6bd4\u7d22
+currenciesDisplayName.THB=\u6cf0\u94e2
currenciesDisplayName.LUF=\u5362\u68ee\u5821\u6cd5\u90ce
-currenciesDisplayName.TTO=\u7279\u7acb\u5c3c\u8fbe\u548c\u591a\u5df4\u54e5\u65e7\u5143
-currenciesDisplayName.AOS=\u5b89\u54e5\u62c9\u57c3\u65af\u5e93\u591a
-currenciesDisplayName.AOR=\u5b89\u6208\u62c9\u5bbd\u624e Reajustado (1995-1999)
-currenciesDisplayName.MNT=\u8499\u53e4\u56fe\u683c\u91cc\u514b
-currenciesDisplayName.HUF=\u5308\u7259\u5229\u7f36\u745e\u7279
-currenciesDisplayName.BIF=\u5e03\u9686\u8fea\u6cd5\u90ce
-currenciesDisplayName.AON=\u5b89\u6208\u62c9\u65b0\u5bbd\u624e (1990-2000)
-currenciesDisplayName.AOK=\u5b89\u6208\u62c9\u5bbd\u624e (1977-1990)
+currenciesDisplayName.FIM=\u82ac\u5170\u739b\u5361
currenciesDisplayName.TTD=\u7279\u7acb\u5c3c\u8fbe\u548c\u591a\u5df4\u54e5\u5143
currenciesDisplayName.SZL=\u65af\u5a01\u58eb\u5170\u5e01
-currenciesDisplayName.NHF=\u65b0\u8d6b\u5e03\u91cc\u5e95 CFP \u6cd5\u90ce
-currenciesDisplayName.GBP=\u82f1\u78c5
-currenciesDisplayName.SAS=\u6c99\u7279\u7279\u6743\u91cc\u4e9a\u5c14
+currenciesDisplayName.MNT=\u8499\u53e4\u56fe\u683c\u91cc\u514b
currenciesDisplayName.SAR=\u6c99\u7279\u91cc\u4e9a\u5c14
+currenciesDisplayName.UAK=\u4e4c\u514b\u5170\u5e01
+currenciesDisplayName.UAH=\u4e4c\u514b\u5170\u8d6b\u91cc\u7eb3
+currenciesDisplayName.HUF=\u5308\u7259\u5229\u7f36\u745e\u7279
+currenciesDisplayName.COP=\u54e5\u4f26\u6bd4\u4e9a\u6bd4\u7d22
+currenciesDisplayName.QAR=\u5361\u5854\u5c14\u91cc\u4e9a\u5c14
currenciesDisplayName.LTT=\u7acb\u9676\u5b9b\u5854\u54af\u5450\u53f8
-currenciesDisplayName.INR=\u5370\u5ea6\u5362\u6bd4
currenciesDisplayName.PTE=\u8461\u8404\u7259\u94c3\u6728
-currenciesDisplayName.AOA=\u5b89\u6208\u62c9\u5bbd\u624e
-currenciesDisplayName.PTC=\u8461\u8404\u7259\u5025\u6d82
+currenciesDisplayName.AOR=\u5b89\u6208\u62c9\u5bbd\u624e Reajustado (1995-1999)
+currenciesDisplayName.UYU=\u4e4c\u62c9\u572d\u6bd4\u7d22
+currenciesDisplayName.GBP=\u82f1\u78c5
+currenciesDisplayName.BIF=\u5e03\u9686\u8fea\u6cd5\u90ce
+currenciesDisplayName.INR=\u5370\u5ea6\u5362\u6bd4
+currenciesDisplayName.ZRZ=\u624e\u4f0a\u5c14\u5143
+currenciesDisplayName.AON=\u5b89\u6208\u62c9\u65b0\u5bbd\u624e (1990-2000)
currenciesDisplayName.LTL=\u7acb\u9676\u5b9b\u5229\u5854
currenciesDisplayName.KZT=\u54c8\u8428\u514b\u817e\u989d
-currenciesDisplayName.KZR=\u54c8\u8428\u514b\u5362\u5e03
-currenciesDisplayName.VGD=\u82f1\u56fd\u7ef4\u4eac\u7fa4\u5c9b\u5e01
-currenciesDisplayName.NGP=\u5c3c\u65e5\u5229\u4e9a\u78c5
-currenciesDisplayName.MMX=\u7f05\u7538\u5143\u5916\u6c47\u5238
+currenciesDisplayName.MZM=\u83ab\u6851\u6bd4\u514b\u5e01
+currenciesDisplayName.UYP=\u4e4c\u62c9\u572d\u6bd4\u7d22 (1975-1993)
+currenciesDisplayName.AOK=\u5b89\u6208\u62c9\u5bbd\u624e (1977-1990)
+currenciesDisplayName.BUK=\u7f05\u5143
+currenciesDisplayName.GNS=\u51e0\u5185\u4e9aSyli
+currenciesDisplayName.XFO=\u6cd5\u56fd\u91d1\u6cd5\u90ce
+currenciesDisplayName.PGK=\u5df4\u5e03\u4e9a\u65b0\u51e0\u5185\u4e9a\u57fa\u90a3
+currenciesDisplayName.SYP=\u53d9\u5229\u4e9a\u78c5
+currenciesDisplayName.MZE=\u83ab\u6851\u6bd4\u514b\u57c3\u65af\u5e93\u591a
+currenciesDisplayName.OMR=\u963f\u66fc\u91cc\u5c14
currenciesDisplayName.NGN=\u5c3c\u65e5\u5229\u4e9a\u5948\u62c9.
+currenciesDisplayName.ZRN=\u65b0\u624e\u4f0a\u5c14\u5143
+currenciesDisplayName.AOA=\u5b89\u6208\u62c9\u5bbd\u624e
+currenciesDisplayName.CNY=\u4eba\u6c11\u5e01
+currenciesDisplayName.MAF=\u6469\u6d1b\u54e5\u6cd5\u90ce
+currenciesDisplayName.GNF=\u51e0\u5185\u4e9a\u6cd5\u90ce
currenciesDisplayName.HTG=\u6d77\u5730\u53e4\u5fb7
-currenciesDisplayName.SYP=\u53d9\u5229\u4e9a\u78c5
-currenciesDisplayName.PSP=\u5df4\u52d2\u65af\u5766\u78c5
-currenciesDisplayName.BHD=\u5df4\u6797\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.MAD=\u6469\u6d1b\u54e5\u8fea\u62c9\u59c6
+currenciesDisplayName.TRY=\u65b0\u571f\u8033\u5176\u91cc\u62c9
currenciesDisplayName.MMK=\u7f05\u7538\u5f00\u4e9a\u7279
+currenciesDisplayName.MYR=\u9a6c\u6765\u897f\u4e9a\u5e01
+currenciesDisplayName.LSL=\u83b1\u7d22\u6258
+currenciesDisplayName.XEU=\u6b27\u6d32\u8d27\u5e01\u5355\u4f4d
+currenciesDisplayName.BHD=\u5df4\u6797\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.SLL=\u8d5b\u62c9\u91cc\u6602\u5e01
+currenciesDisplayName.BTN=\u4e0d\u4e39\u52aa\u624e\u59c6
+currenciesDisplayName.TRL=\u571f\u8033\u5176\u91cc\u62c9
+currenciesDisplayName.KMF=\u79d1\u6469\u7f57\u6cd5\u90ce
currenciesDisplayName.ANG=\u8377\u5170\u5b89\u66ff\u5170\u76fe
currenciesDisplayName.CZK=\u6377\u514b\u514b\u90ce
-currenciesDisplayName.IMP=\u66fc\u5c9b\u78c5
-currenciesDisplayName.BGX=\u4fdd\u52a0\u5229\u4e9a\u5217\u514b\u5916\u6c47\u5238
-currenciesDisplayName.LSL=\u83b1\u7d22\u6258
-currenciesDisplayName.BGO=\u4fdd\u52a0\u5229\u4e9a\u5217\u514b (1879-1952)
+currenciesDisplayName.KYD=\u5f00\u66fc\u5c9b\u5143
+currenciesDisplayName.GMD=\u5188\u6bd4\u4e9a\u8fbe\u62c9\u897f
currenciesDisplayName.BGN=\u4fdd\u52a0\u5229\u4e9a\u65b0\u5217\u514b
-currenciesDisplayName.BGM=\u4fdd\u52a0\u5229\u4e9a\u793e\u4f1a\u4e3b\u4e49\u5217\u514b
currenciesDisplayName.CAD=\u52a0\u62ff\u5927\u5143
currenciesDisplayName.BGL=\u4fdd\u52a0\u5229\u4e9a\u786c\u5217\u514b
-currenciesDisplayName.TRL=\u571f\u8033\u5176\u91cc\u62c9
-currenciesDisplayName.KYD=\u5f00\u66fc\u5c9b\u5143
-currenciesDisplayName.CYP=\u585e\u6d66\u8def\u65af\u78c5
+currenciesDisplayName.VEB=\u5185\u745e\u62c9\u535a\u5229\u74e6
+currenciesDisplayName.MLF=\u9a6c\u91cc\u6cd5\u90ce
currenciesDisplayName.ILS=\u4ee5\u8272\u5217\u65b0\u8c22\u5ba2\u5c14
+currenciesDisplayName.MXP=\u58a8\u897f\u54e5\u94f6\u6bd4\u7d22 (1861-1992)
+currenciesDisplayName.PES=\u79d8\u9c81\u7d22\u989d
currenciesDisplayName.GYD=\u572d\u4e9a\u90a3\u5143
-currenciesDisplayName.AMD=\u4e9a\u7f8e\u5c3c\u4e9a\u5fb7\u62c9\u59c6
+currenciesDisplayName.MXN=\u58a8\u897f\u54e5\u6bd4\u7d22
currenciesDisplayName.ILP=\u4ee5\u8272\u5217\u78c5
-currenciesDisplayName.MLF=\u9a6c\u91cc\u6cd5\u90ce
-currenciesDisplayName.ILL=\u4ee5\u8272\u5217\u8c22\u5ba2\u5c14
-currenciesDisplayName.VEB=\u5185\u745e\u62c9\u535a\u5229\u74e6
-currenciesDisplayName.ALX=\u963f\u5c14\u5df4\u5c3c\u4e9a\u5143\u5916\u6c47\u5238
+currenciesDisplayName.SKK=\u65af\u6d1b\u4f10\u514b\u79d1\u8def\u90a3
+currenciesDisplayName.CYP=\u585e\u6d66\u8def\u65af\u78c5
+currenciesDisplayName.XDR=\u7279\u522b\u63d0\u6b3e\u6743
+currenciesDisplayName.PEN=\u79d8\u9c81\u7d22\u989d\u5974\u827e\u631d
currenciesDisplayName.LRD=\u5229\u6bd4\u4e9a\u5143
-currenciesDisplayName.ALV=\u963f\u5c14\u5df4\u5c3c\u4e9a\u5217\u514b\u5e01
+currenciesDisplayName.PEI=\u79d8\u9c81\u56e0\u8482
+currenciesDisplayName.AMD=\u4e9a\u7f8e\u5c3c\u4e9a\u5fb7\u62c9\u59c6
+currenciesDisplayName.BSD=\u5df4\u54c8\u9a6c\u5143
currenciesDisplayName.HRK=\u514b\u7f57\u5730\u4e9a\u5e93\u5a1c\u5143
-currenciesDisplayName.REF=\u7559\u5c3c\u6c6a\u8054\u5408\u4f1a\u6cd5\u90ce
+currenciesDisplayName.CLP=\u667a\u5229 \u6bd4\u7d22
currenciesDisplayName.HRD=\u514b\u7f57\u5730\u4e9a\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.ALL=\u963f\u5c14\u5df4\u5c3c\u4e9a\u5217\u514b
-currenciesDisplayName.JEP=\u6cfd\u897f\u78c5
-currenciesDisplayName.ALK=\u963f\u5c14\u5df4\u5c3c\u4e9a\u5217\u514b (1946-1961)
-currenciesDisplayName.MKN=\u9a6c\u5176\u987f\u6234\u7eb3 (1992-1993)
-currenciesDisplayName.VDP=\u5317\u8d8a\u76ae\u827e\u65af\u7279\u660e\u76fe
-currenciesDisplayName.VDN=\u5317\u8d8a\u76ae\u827e\u65af\u7279\u65b0\u76fe
+currenciesDisplayName.FRF=\u6cd5\u56fd\u6cd5\u90ce
+currenciesDisplayName.BRR=\u5df4\u897f\u514b\u9c81\u585e\u7f57
currenciesDisplayName.MKD=\u9a6c\u5176\u987f\u6234\u7eb3
-currenciesDisplayName.VDD=\u5317\u8d8a\u76ae\u827e\u65af\u7279\u76fe
-currenciesDisplayName.TPP=\u5e1d\u6c76\u5e15\u5854\u5361
-currenciesDisplayName.BEL=\u6bd4\u5229\u65f6\u6cd5\u90ce\uff08\u91d1\u878d\uff09
-currenciesDisplayName.GWP=\u51e0\u5185\u4e9a\u6bd4\u7d22
-currenciesDisplayName.KWD=\u79d1\u5a01\u7279\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.GWM=\u8461\u8404\u7259\u51e0\u5185\u4e9a\u8ff7\u6d31\u745e
-currenciesDisplayName.BEF=\u6bd4\u5229\u65f6\u6cd5\u90ce
+currenciesDisplayName.CLF=\u667a\u5229 Unidades de Fomento
+currenciesDisplayName.ALL=\u963f\u5c14\u5df4\u5c3c\u4e9a\u5217\u514b
+currenciesDisplayName.BRN=\u5df4\u897f\u514b\u9c81\u585e\u7f57 Cruzado Novo
+currenciesDisplayName.MWK=\u9a6c\u62c9\u7ef4\u5938\u6070
+currenciesDisplayName.BRL=\u5df4\u897f\u91cc\u5c14
currenciesDisplayName.TPE=\u5e1d\u6c76\u57c3\u65af\u5e93\u591a
-currenciesDisplayName.BEC=\u6bd4\u5229\u65f6\u6cd5\u90ce\u5151\u6362\u5238
-currenciesDisplayName.GWE=\u8461\u8404\u7259\u51e0\u5185\u4e9a\u57c3\u65af\u5e93\u591a
+currenciesDisplayName.BRE=\u5df4\u897f\u514b\u9c81\u585e\u7f57 (1990-1993)
+currenciesDisplayName.BRC=\u5df4\u897f\u514b\u9c81\u585e\u7f57
+currenciesDisplayName.BRB=\u5df4\u897f\u514b\u9c81\u8d5b\u7f57 (1967-1986)
+currenciesDisplayName.DEM=\u5fb7\u56fd\u9a6c\u514b
+currenciesDisplayName.KWD=\u79d1\u5a01\u7279\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.XCD=\u4e1c\u52a0\u52d2\u6bd4\u5143
+currenciesDisplayName.NPR=\u5c3c\u6cca\u5c14\u5362\u6bd4
+currenciesDisplayName.GWP=\u51e0\u5185\u4e9a\u6bd4\u7d22
+currenciesDisplayName.YUN=\u5357\u65af\u62c9\u592b\u5151\u6362\u7b2c\u7eb3\u5c14\u5143
currenciesDisplayName.SVC=\u8428\u5c14\u74e6\u591a\u79d1\u6d1b\u6d85
-currenciesDisplayName.CWG=\u5e93\u62c9\u76fe
-currenciesDisplayName.BDT=\u5b5f\u52a0\u62c9\u8fbe\u5361
-currenciesDisplayName.TOS=\u6c64\u52a0\u78c5
+currenciesDisplayName.YUM=\u5357\u65af\u62c9\u592b\u504c\u5a01\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.BEL=\u6bd4\u5229\u65f6\u6cd5\u90ce\uff08\u91d1\u878d\uff09
+currenciesDisplayName.SIT=\u65af\u6d1b\u6587\u5c3c\u4e9a\u6dd8\u62c9
+currenciesDisplayName.JPY=\u65e5\u5143
+currenciesDisplayName.MVR=\u9a6c\u5c14\u4ee3\u592b\u7fa4\u5c9b\u82a6\u83f2\u4e9a
+currenciesDisplayName.GWE=\u8461\u8404\u7259\u51e0\u5185\u4e9a\u57c3\u65af\u5e93\u591a
+currenciesDisplayName.BEF=\u6bd4\u5229\u65f6\u6cd5\u90ce
currenciesDisplayName.TOP=\u6c64\u52a0\u5e01
+currenciesDisplayName.YUD=\u5357\u65af\u62c9\u592b\u786c\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.BEC=\u6bd4\u5229\u65f6\u6cd5\u90ce\u5151\u6362\u5238
currenciesDisplayName.SUR=\u82cf\u8054\u5362\u5e03
-currenciesDisplayName.SUN=\u82cf\u8054\u65b0\u5362\u5e03
-currenciesDisplayName.NCF=\u65b0\u5361\u91cc\u591a\u5c3c\u4e9a\u65b0\u6cd5\u90ce
-currenciesDisplayName.CVE=\u4f5b\u5f97\u89d2\u57c3\u65af\u5e93\u591a
-currenciesDisplayName.XNF=\u6cd5\u56fd\u5b89\u7684\u5217\u65af CFA \u6cd5\u90ce
+currenciesDisplayName.ROL=\u7f57\u9a6c\u5c3c\u4e9a\u956d
+currenciesDisplayName.DDM=\u4e1c\u5fb7\u5965\u65af\u7279\u9a6c\u514b
+currenciesDisplayName.BDT=\u5b5f\u52a0\u62c9\u8fbe\u5361
+currenciesDisplayName.AWG=\u963f\u9c81\u5df4\u57fa\u5c14\u5fb7\u5143
+currenciesDisplayName.XBB=\u6b27\u6d32\u91d1\u878d\u5355\u4f4d
+currenciesDisplayName.XBA=\u6b27\u6d32\u590d\u5408\u5355\u4f4d
+currenciesDisplayName.NOK=\u632a\u5a01\u514b\u6717
+currenciesDisplayName.MUR=\u6bdb\u91cc\u6c42\u65af\u5362\u6bd4
currenciesDisplayName.ZAR=\u5357\u975e\u5170\u7279
-currenciesDisplayName.DOP=\u591a\u7c73\u5c3c\u52a0\u6bd4\u7d22
-currenciesDisplayName.CUX=\u53e4\u5df4\u5916\u6c47\u5238
-currenciesDisplayName.ZAP=\u5357\u975e\u78c5
+currenciesDisplayName.SHP=\u5723\u8d6b\u52d2\u62ff\u78c5
+currenciesDisplayName.XAU=\u9ec4\u91d1
currenciesDisplayName.ZAL=\u5357\u975e\u5170\u7279 (\u91d1\u878d)
+currenciesDisplayName.VND=\u8d8a\u5357\u76fe
+currenciesDisplayName.TZS=\u5766\u6851\u5c3c\u4e9a\u5148\u4ee4
+currenciesDisplayName.GIP=\u76f4\u5e03\u7f57\u9640\u78c5
currenciesDisplayName.TND=\u7a81\u5c3c\u65af\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.CUP=\u53e4\u5df4\u6bd4\u7d22
-currenciesDisplayName.GUF=\u6cd5\u56fd\u5c5e\u572d\u4e9a\u90a3\u6cd5\u90ce
+currenciesDisplayName.CVE=\u4f5b\u5f97\u89d2\u57c3\u65af\u5e93\u591a
currenciesDisplayName.UGX=\u4e4c\u5e72\u8fbe\u5148\u4ee4
-currenciesDisplayName.LNR=\u9521\u5170\u5362\u6bd4
-currenciesDisplayName.AIF=\u963f\u53d1\u548c\u4f0a\u8428\u6cd5\u90ce
-currenciesDisplayName.VAL=\u68b5\u8c1b\u5188\u91cc\u62c9
-currenciesDisplayName.STE=\u5723\u591a\u7f8e\u666e\u6797\u897f\u6bd4\u94c3\u6728
+currenciesDisplayName.ZMK=\u8d5e\u6bd4\u4e9a\u9a6c\u62c9\u7ef4
+currenciesDisplayName.JOD=\u7ea6\u65e6\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.LBP=\u9ece\u5df4\u5ae9\u78c5
currenciesDisplayName.UGS=\u4e4c\u5e72\u8fbe\u5148\u4ee4 (1966-1987)
currenciesDisplayName.STD=\u5723\u591a\u7f8e\u666e\u6797\u897f\u6bd4\u90fd\u6bd4\u62c9
-currenciesDisplayName.MHD=\u9a6c\u7ecd\u5c14\u7fa4\u5c9b\u5143
-currenciesDisplayName.NZP=\u65b0\u897f\u5170\u78c5
currenciesDisplayName.WST=\u897f\u8428\u6469\u4e9a\u5854\u62c9
-currenciesDisplayName.WSP=\u897f\u8428\u6469\u4e9a\u78c5
-currenciesDisplayName.HNL=\u6d2a\u90fd\u62c9\u65af\u52d2\u76ae\u62c9
-currenciesDisplayName.XMF=\u6cd5\u56fd\u57ce\u5e02\u504c\u4f5b\u6cd5\u90ce
+currenciesDisplayName.KHR=\u67ec\u57d4\u5be8\u91cc\u5c14
+currenciesDisplayName.EUR=\u6b27\u5143
+currenciesDisplayName.DOP=\u591a\u7c73\u5c3c\u52a0\u6bd4\u7d22
+currenciesDisplayName.MTP=\u9a6c\u5c14\u4ed6\u78c5
+currenciesDisplayName.USS=\u7f8e\u5143 (\u540c\u4e00\u5929)
+currenciesDisplayName.BOP=\u73bb\u5229\u7ef4\u4e9a\u6bd4\u7d22
+currenciesDisplayName.MTL=\u9a6c\u5c14\u4ed6\u91cc\u62c9
+currenciesDisplayName.CUP=\u53e4\u5df4\u6bd4\u7d22
currenciesDisplayName.TMM=\u571f\u5e93\u66fc\u65af\u5766\u5e01
-currenciesDisplayName.GTQ=\u5371\u5730\u9a6c\u62c9
+currenciesDisplayName.USN=\u7f8e\u5143 (\u4e0b\u4e00\u5929)
+currenciesDisplayName.SGD=\u65b0\u52a0\u5761\u5143
currenciesDisplayName.NZD=\u65b0\u897f\u5170\u5143
-currenciesDisplayName.SSP=\u82cf\u683c\u5170\u78c5
-currenciesDisplayName.BBD=\u5df4\u5df4\u591a\u65af\u5143
+currenciesDisplayName.USD=\u7f8e\u5143
+currenciesDisplayName.HNL=\u6d2a\u90fd\u62c9\u65af\u52d2\u76ae\u62c9
+currenciesDisplayName.BOB=\u73bb\u5229\u7ef4\u4e9a
+currenciesDisplayName.ITL=\u610f\u5927\u5229\u91cc\u62c9
+currenciesDisplayName.PAB=\u5df4\u62ff\u9a6c\u5df4\u6ce2\u4e9a
+currenciesDisplayName.GTQ=\u5371\u5730\u9a6c\u62c9
+currenciesDisplayName.LAK=\u8001\u631d\u57fa\u666e
+currenciesDisplayName.GHC=\u52a0\u7eb3\u585e\u7b2c
+currenciesDisplayName.AUD=\u6fb3\u5927\u5229\u4e9a\u5143
currenciesDisplayName.NAD=\u7eb3\u7c73\u6bd4\u4e9a\u5143
+currenciesDisplayName.KGS=\u5409\u5c14\u5409\u65af\u5766\u8428\u59c6
currenciesDisplayName.MGF=\u9a6c\u8fbe\u52a0\u65af\u52a0\u6cd5\u90ce
+currenciesDisplayName.CHF=\u745e\u58eb\u6cd5\u90ce
+currenciesDisplayName.BBD=\u5df4\u5df4\u591a\u65af\u5143
currenciesDisplayName.MGA=\u9a6c\u8fbe\u52a0\u65af\u52a0\u963f\u65e5\u745e
-currenciesDisplayName.EGP=\u57c3\u53ca\u78c5
-currenciesDisplayName.BZH=\u5c5e\u6d2a\u90fd\u62c9\u65af\u5143
+currenciesDisplayName.PYG=\u5df4\u62c9\u572d\u5e01
currenciesDisplayName.PLZ=\u6ce2\u5170\u5179\u7f57\u63d0 (1950-1995)
-currenciesDisplayName.BAN=\u6ce2\u58eb\u5c3c\u4e9a-\u8d6b\u585e\u54e5\u7ef4\u7eb3\u65b0\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.PLX=\u6ce2\u5170\u7f8e\u5143 \u5916\u6c47\u5238
-currenciesDisplayName.BAM=\u6ce2\u58eb\u5c3c\u4e9a-\u8d6b\u585e\u54e5\u7ef4\u7eb3\u5151\u6362\u5238
-currenciesDisplayName.BZD=\u4f2f\u5229\u5179\u5143
-currenciesDisplayName.BAD=\u6ce2\u58eb\u5c3c\u4e9a-\u8d6b\u585e\u54e5\u7ef4\u7eb3\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.PLN=\u6ce2\u5170\u5179\u7f57\u63d0
currenciesDisplayName.YER=\u4e5f\u95e8\u91cc\u5c14
+currenciesDisplayName.ATS=\u5965\u5730\u5229\u897f\u4ee4
+currenciesDisplayName.ETB=\u57c3\u585e\u4fc4\u6bd4\u4e9a\u6bd4\u5c14
+currenciesDisplayName.BND=\u6c76\u83b1\u5143
+currenciesDisplayName.JMD=\u7259\u4e70\u52a0\u5143
+currenciesDisplayName.EGP=\u57c3\u53ca\u78c5
+currenciesDisplayName.PLN=\u6ce2\u5170\u5179\u7f57\u63d0
+currenciesDisplayName.DZD=\u963f\u5c14\u53ca\u5229\u4e9a\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.ISK=\u51b0\u5c9b\u514b\u6717
currenciesDisplayName.SRG=\u82cf\u91cc\u5357\u57fa\u5c14
-currenciesDisplayName.CSK=\u6377\u514b\u786c\u514b\u90ce
+currenciesDisplayName.LYD=\u5229\u6bd4\u4e9a\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.BZD=\u4f2f\u5229\u5179\u5143
+currenciesDisplayName.BAM=\u6ce2\u58eb\u5c3c\u4e9a-\u8d6b\u585e\u54e5\u7ef4\u7eb3\u5151\u6362\u5238
+currenciesDisplayName.ESP=\u897f\u73ed\u7259\u9a6c\u8d5b\u5854
currenciesDisplayName.KRW=\u97e9\u56fd\u5e01
+currenciesDisplayName.NLG=\u8377\u5170\u76fe
+currenciesDisplayName.MRO=\u91cc\u5854\u5c3c\u4e9a\u4e4c\u5409\u4e9a
+currenciesDisplayName.BAD=\u6ce2\u58eb\u5c3c\u4e9a-\u8d6b\u585e\u54e5\u7ef4\u7eb3\u7b2c\u7eb3\u5c14\u5143
+currenciesDisplayName.ZWD=\u6d25\u5df4\u5e03\u97e6\u5143
+currenciesDisplayName.SEK=\u745e\u58eb\u514b\u6717
+currenciesDisplayName.CSK=\u6377\u514b\u786c\u514b\u90ce
currenciesDisplayName.BYR=\u767d\u4fc4\u7f57\u65af\u5362\u5e03
-currenciesDisplayName.YEI=\u4e5f\u95e8\u963f\u9a6c\u8fea\u91cc\u5c14
-currenciesDisplayName.BYL=\u767d\u4fc4\u7f57\u65af\u5362\u5e03 (1992-1994)
-currenciesDisplayName.CSC=\u6377\u514b\u514b\u90ce
-currenciesDisplayName.KRO=\u97e9\u56fd\u65e7\u5e01
-currenciesDisplayName.KRH=\u97e9\u56fd\u5143
-currenciesDisplayName.BYB=\u767d\u4fc4\u7f57\u65af\u65b0\u5362\u5e03 (1994-1999)
-currenciesDisplayName.SQS=\u7d22\u9a6c\u91cc\u5927\u9646\u5148\u4ee4
-currenciesDisplayName.GRN=\u5e0c\u814a\u65b0\u5fb7\u62c9\u514b\u9a6c
+currenciesDisplayName.IRR=\u4f0a\u6717\u91cc\u4e9a \u5c14
currenciesDisplayName.PKR=\u5df4\u57fa\u65af\u5766\u5362\u6bd4
-currenciesDisplayName.AFN=\u963f\u5bcc\u6c57\u5c3c
-currenciesDisplayName.ZWD=\u6d25\u5df4\u5e03\u97e6\u5143
-currenciesDisplayName.LKR=\u65af\u91cc\u5170\u5361\u5362\u6bd4
-currenciesDisplayName.GRD=\u5e0c\u814a\u5fb7\u62c9\u514b\u9a6c
-currenciesDisplayName.IEP=\u7231\u5c14\u5170\u78c5
-currenciesDisplayName.AFA=\u963f\u5bcc\u6c57\u5c3c (1927-2002)
-currenciesDisplayName.YDD=\u4e5f\u95e8\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.RWF=\u5362\u65fa\u8fbe\u6cd5\u90ce
-currenciesDisplayName.CRC=\u54e5\u65af\u8fbe\u9ece\u52a0\u79d1\u9686
-currenciesDisplayName.TJS=\u5854\u5409\u514b\u65af\u5766\u7d22\u83ab\u5c3c
-currenciesDisplayName.TJR=\u5854\u5409\u514b\u65af\u5766\u5362\u5e03
-currenciesDisplayName.EEK=\u7231\u6c99\u5c3c\u4e9a\u514b\u6717
-currenciesDisplayName.GQP=\u8d64\u9053\u51e0\u5185\u4e9a\u5339\u585e\u5854
-currenciesDisplayName.MDR=\u5357\u7279\u5e02\u5362\u5e03
-currenciesDisplayName.HKD=\u6e2f\u5143
-currenciesDisplayName.DKK=\u4e39\u9ea6\u514b\u6717
-currenciesDisplayName.MDL=\u5357\u7279\u5e02\u5217\u4f0a
-currenciesDisplayName.GQF=\u8d64\u9053\u51e0\u5185\u4e9a\u6cd5\u90ce
-currenciesDisplayName.GQE=\u8d64\u9053\u51e0\u5185\u4e9a\u7231\u514b\u5a01\u4e50
-currenciesDisplayName.IDR=\u5370\u5ea6\u5c3c\u897f\u4e9a\u76fe
-currenciesDisplayName.AED=\u963f\u8054\u914b\u8fea\u62c9\u59c6
-currenciesDisplayName.KPW=\u5317\u671d\u9c9c\u5e01
-currenciesDisplayName.IDN=\u5370\u5ea6\u5c3c\u897f\u4e9a\u65b0\u76fe
-currenciesDisplayName.BWP=\u6ce2\u6e23\u90a3\u6251\u62c9
-currenciesDisplayName.MDC=\u5357\u7279\u5e02\u5217\u4f0a\u5e01
-currenciesDisplayName.IDJ=\u5370\u5ea6\u5c3c\u897f\u4e9a\u722a\u54c7\u76fe
-currenciesDisplayName.KPP=\u5317\u671d\u9c9c\u4eba\u6c11\u5e01
-currenciesDisplayName.IDG=\u5370\u5ea6\u5c3c\u897f\u4e9a\u5c3c\u5361\u76fe
-currenciesDisplayName.VUV=\u74e6\u52aa\u963f\u56fe
-currenciesDisplayName.XID=\u4f0a\u65af\u5170\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.SOS=\u7d22\u9a6c\u91cc\u5148\u4ee4
-currenciesDisplayName.ADP=\u5b89\u9053\u5c14\u6bd4\u585e\u5854\u5143
-currenciesDisplayName.RUR=\u4fc4\u56fd\u5362\u5e03 (1991-1998)
-currenciesDisplayName.GPF=\u74dc\u5fb7\u7f57\u666e\u5c9b\u6cd5\u90ce
-currenciesDisplayName.DJF=\u5409\u5e03\u63d0\u6cd5\u90ce
-currenciesDisplayName.ADD=\u5b89\u9053\u5c14\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.MCG=\u6469\u6d1b\u54e5\u9769\u547d\u65f6\u671f\u8d27\u5e01
-currenciesDisplayName.MCF=\u6469\u6d1b\u54e5\u65b0\u6cd5\u90ce
-currenciesDisplayName.ECS=\u5384\u74dc\u591a\u5c14\u82cf\u514b\u96f7
-currenciesDisplayName.LIF=\u5217\u652f\u6566\u58eb\u767b\u6cd5\u90ce
-currenciesDisplayName.RUB=\u4fc4\u56fd\u5362\u5e03
-currenciesDisplayName.PHP=\u83f2\u5f8b\u5bbe\u6bd4\u7d22
-currenciesDisplayName.UZS=\u4e4c\u5179\u522b\u514b\u65af\u5766\u5e01
-currenciesDisplayName.COP=\u54e5\u4f26\u6bd4\u4e9a\u6bd4\u7d22
-currenciesDisplayName.THB=\u6cf0\u94e2
-currenciesDisplayName.IBP=\u5317\u7231\u5c14\u5170\u78c5
-currenciesDisplayName.BUR=\u7f05\u7538\u5362\u6bd4
-currenciesDisplayName.COF=\u521a\u679c CFA \u6cd5\u90ce
-currenciesDisplayName.BUK=\u7f05\u5143
-currenciesDisplayName.COB=\u54e5\u4f26\u6bd4\u4e9a\u7eb8\u6bd4\u7d22
-currenciesDisplayName.UZC=\u4e4c\u5179\u522b\u514b\u65af\u5766\u8d27\u5e01\u5238
-currenciesDisplayName.UAK=\u4e4c\u514b\u5170\u5e01
-currenciesDisplayName.QAR=\u5361\u5854\u5c14\u91cc\u4e9a\u5c14
-currenciesDisplayName.UAH=\u4e4c\u514b\u5170\u8d6b\u91cc\u7eb3
-currenciesDisplayName.GNS=\u51e0\u5185\u4e9aSyli
-currenciesDisplayName.CNY=\u4eba\u6c11\u5e01
-currenciesDisplayName.MZM=\u83ab\u6851\u6bd4\u514b\u5e01
-currenciesDisplayName.CNX=\u4e2d\u56fd\u7f8e\u5143\u5916\u6c47\u5238
-currenciesDisplayName.UYU=\u4e4c\u62c9\u572d\u6bd4\u7d22
-currenciesDisplayName.GNI=\u51e0\u5185\u4e9a\u6cd5\u90ce (1960-1972)
-currenciesDisplayName.SML=\u5723\u9a6c\u5229\u8bfa\u91cc\u62c9
-currenciesDisplayName.MZE=\u83ab\u6851\u6bd4\u514b\u57c3\u65af\u5e93\u591a
-currenciesDisplayName.CNP=\u4e2d\u56fd\u4eba\u6c11\u7968\u5143
-currenciesDisplayName.GNF=\u51e0\u5185\u4e9a\u6cd5\u90ce
-currenciesDisplayName.PGK=\u5df4\u5e03\u4e9a\u65b0\u51e0\u5185\u4e9a\u57fa\u90a3
-currenciesDisplayName.OMS=\u963f\u66fc\u91cc\u5c14\u585e\u8fea
-currenciesDisplayName.OMR=\u963f\u66fc\u91cc\u5c14
-currenciesDisplayName.UYP=\u4e4c\u62c9\u572d\u6bd4\u7d22 (1975-1993)
-currenciesDisplayName.BTR=\u4e0d\u4e39\u5362\u6bd4
-currenciesDisplayName.ZRZ=\u624e\u4f0a\u5c14\u5143
-currenciesDisplayName.MAF=\u6469\u6d1b\u54e5\u6cd5\u90ce
-currenciesDisplayName.MAD=\u6469\u6d1b\u54e5\u8fea\u62c9\u59c6
-currenciesDisplayName.BTN=\u4e0d\u4e39\u52aa\u624e\u59c6
-currenciesDisplayName.XFO=\u6cd5\u56fd\u91d1\u6cd5\u90ce
-currenciesDisplayName.UYF=\u4e4c\u62c9\u572d\u6bd4\u7d22\u4f0f\u5c14\u7279
-currenciesDisplayName.MYR=\u9a6c\u6765\u897f\u4e9a\u5e01
-currenciesDisplayName.ZRN=\u65b0\u624e\u4f0a\u5c14\u5143
-currenciesDisplayName.GMP=\u5188\u6bd4\u4e9a\u78c5
-currenciesDisplayName.KMF=\u79d1\u6469\u7f57\u6cd5\u90ce
-currenciesDisplayName.SLL=\u8d5b\u62c9\u91cc\u6602\u5e01
-currenciesDisplayName.GMD=\u5188\u6bd4\u4e9a\u8fbe\u62c9\u897f
-currenciesDisplayName.XEU=\u6b27\u6d32\u8d27\u5e01\u5355\u4f4d
-currenciesDisplayName.BSP=\u5df4\u54c8\u9a6c\u78c5
-currenciesDisplayName.CMF=\u5580\u9ea6\u9686 CFA \u6cd5\u90ce
-currenciesDisplayName.BSD=\u5df4\u54c8\u9a6c\u5143
-currenciesDisplayName.MXP=\u58a8\u897f\u54e5\u94f6\u6bd4\u7d22 (1861-1992)
-currenciesDisplayName.MXN=\u58a8\u897f\u54e5\u6bd4\u7d22
-currenciesDisplayName.PES=\u79d8\u9c81\u7d22\u989d
-currenciesDisplayName.GLK=\u683c\u9675\u5170\u514b\u6717
-currenciesDisplayName.BRZ=\u5df4\u897f\u514b\u9c81\u585e\u7f57 (1942-1967)
-currenciesDisplayName.PEN=\u79d8\u9c81\u7d22\u989d\u5974\u827e\u631d
-currenciesDisplayName.CLP=\u667a\u5229 \u6bd4\u7d22
-currenciesDisplayName.SKK=\u65af\u6d1b\u4f10\u514b\u79d1\u8def\u90a3
-currenciesDisplayName.PEI=\u79d8\u9c81\u56e0\u8482
-currenciesDisplayName.BRR=\u5df4\u897f\u514b\u9c81\u585e\u7f57
-currenciesDisplayName.XDR=\u7279\u522b\u63d0\u6b3e\u6743
-currenciesDisplayName.FRG=\u6cd5\u56fd\u6cd5\u90ce\u6bd4\u65af\u67e5/\u6cd5\u90ce\u5e9e\u52a0\u83b1
-currenciesDisplayName.FRF=\u6cd5\u56fd\u6cd5\u90ce
-currenciesDisplayName.BRN=\u5df4\u897f\u514b\u9c81\u585e\u7f57 Cruzado Novo
-currenciesDisplayName.CLF=\u667a\u5229 Unidades de Fomento
-currenciesDisplayName.CLE=\u667a\u5229\u57c3\u65af\u5e93\u591a
-currenciesDisplayName.BRL=\u5df4\u897f\u91cc\u5c14
-currenciesDisplayName.CLC=\u667a\u5229\u80af\u675c
-currenciesDisplayName.BRE=\u5df4\u897f\u514b\u9c81\u585e\u7f57 (1990-1993)
-currenciesDisplayName.DES=\u5fb7\u56fd\u53f8\u8421\u9a6c\u514b
-currenciesDisplayName.MWP=\u9a6c\u62c9\u7ef4\u78c5
-currenciesDisplayName.BRC=\u5df4\u897f\u514b\u9c81\u585e\u7f57
-currenciesDisplayName.BRB=\u5df4\u897f\u514b\u9c81\u8d5b\u7f57 (1967-1986)
-currenciesDisplayName.MWK=\u9a6c\u62c9\u7ef4\u5938\u6070
-currenciesDisplayName.PDR=\u8f66\u57ce\u5362\u5e03
-currenciesDisplayName.DEM=\u5fb7\u56fd\u9a6c\u514b
-currenciesDisplayName.PDN=\u8f66\u57ce\u65b0\u5362\u5e03
-currenciesDisplayName.PDK=\u8f66\u57ce\u5362\u5e03\u5238
-currenciesDisplayName.NPR=\u5c3c\u6cca\u5c14\u5362\u6bd4
-currenciesDisplayName.CKD=\u5e93\u514b\u7fa4\u5c9b\u5143
-currenciesDisplayName.JPY=\u65e5\u5143
-currenciesDisplayName.MVR=\u9a6c\u5c14\u4ee3\u592b\u7fa4\u5c9b\u82a6\u83f2\u4e9a
-currenciesDisplayName.MVP=\u9a6c\u5c14\u4ee3\u592b\u7fa4\u5c9b\u5362\u6bd4
-currenciesDisplayName.XCD=\u4e1c\u52a0\u52d2\u6bd4\u5143
-currenciesDisplayName.SIT=\u65af\u6d1b\u6587\u5c3c\u4e9a\u6dd8\u62c9
-currenciesDisplayName.YUR=\u5357\u65af\u62c9\u592b\u6539\u9769\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.AWG=\u963f\u9c81\u5df4\u57fa\u5c14\u5fb7\u5143
-currenciesDisplayName.YUO=\u5357\u65af\u62c9\u592b\u5341\u6708\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.DDM=\u4e1c\u5fb7\u5965\u65af\u7279\u9a6c\u514b
-currenciesDisplayName.YUN=\u5357\u65af\u62c9\u592b\u5151\u6362\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.YUM=\u5357\u65af\u62c9\u592b\u504c\u5a01\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.TCC=\u7279\u514b\u65af\u548c\u51ef\u79d1\u65af\u7fa4\u5c9b\u514b\u6717
-currenciesDisplayName.YUG=\u5357\u65af\u62c9\u592b 1994 \u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.YUF=\u5357\u65af\u62c9\u592b\u8054\u90a6\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.RON=\u7f57\u9a6c\u5c3c\u4e9a\u65b0\u956d
-currenciesDisplayName.YUD=\u5357\u65af\u62c9\u592b\u786c\u7b2c\u7eb3\u5c14\u5143
-currenciesDisplayName.ROL=\u7f57\u9a6c\u5c3c\u4e9a\u956d
-currenciesDisplayName.SIB=\u65af\u6d1b\u6587\u5c3c\u4e9a\u6dd8\u62c9\u78c5
-currenciesDisplayName.NOK=\u632a\u5a01\u514b\u6717
-currenciesDisplayName.MUR=\u6bdb\u91cc\u6c42\u65af\u5362\u6bd4
-currenciesDisplayName.GIP=\u76f4\u5e03\u7f57\u9640\u78c5
-currenciesDisplayName.VNS=\u8d8a\u5357\u56fd\u5bb6\u76fe
-currenciesDisplayName.VNR=\u8d8a\u5357\u5171\u548c\u56fd\u76fe
-currenciesDisplayName.XBB=\u6b27\u6d32\u91d1\u878d\u5355\u4f4d
-currenciesDisplayName.XBA=\u6b27\u6d32\u590d\u5408\u5355\u4f4d
-currenciesDisplayName.KID=\u57fa\u91cc\u5df4\u65af\u5143
-currenciesDisplayName.SHP=\u5723\u8d6b\u52d2\u62ff\u78c5
-currenciesDisplayName.VNN=\u8d8a\u5357\u660e\u76fe
-currenciesSymbol.JOD=JOD
-currenciesSymbol.XAU=XAU
-currenciesSymbol.FOK=FOK
-currenciesSymbol.LBP=LBP
-currenciesSymbol.VND=VND
-currenciesSymbol.TZS=TZS
-currenciesSymbol.BOP=BOP
-currenciesSymbol.KHR=KHR
-currenciesSymbol.XAM=XAM
-currenciesSymbol.BOL=BOL
-currenciesSymbol.KHO=KHO
-currenciesSymbol.ZMP=ZMP
-currenciesSymbol.AUP=AUP
-currenciesSymbol.MTP=MTP
-currenciesSymbol.GHR=GHR
-currenciesSymbol.ZMK=ZMK
-currenciesSymbol.XAD=XAD
-currenciesSymbol.GHP=GHP
-currenciesSymbol.BOB=BOB
-currenciesSymbol.GHO=GHO
-currenciesSymbol.MTL=MTL
-currenciesSymbol.AUD=AUD
-currenciesSymbol.USS=USS
+currenciesDisplayName.BMD=\u767e\u6155\u5927\u5143
+currenciesSymbol.TWD=NT$
currenciesSymbol.ITL=ITL
-currenciesSymbol.USN=USN
-currenciesSymbol.GHC=GHC
+currenciesSymbol.JPY=JP\u00a5
currenciesSymbol.SGD=S$
-currenciesSymbol.PAB=PAB
-currenciesSymbol.LAK=LAK
-currenciesSymbol.KGS=KGS
-currenciesSymbol.CHF=CHF
-currenciesSymbol.ATS=ATS
+currenciesSymbol.CNY=\uffe5
+currenciesSymbol.HKD=HK$
currenciesSymbol.USD=US$
-currenciesSymbol.ETD=ETD
-currenciesSymbol.BND=BND
-currenciesSymbol.JMP=JMP
-currenciesSymbol.ETB=ETB
-currenciesSymbol.DZG=DZG
-currenciesSymbol.DZF=DZF
-currenciesSymbol.DZD=DZD
-currenciesSymbol.PYG=PYG
-currenciesSymbol.LYP=LYP
-currenciesSymbol.JMD=JMD
-currenciesSymbol.ISK=ISK
-currenciesSymbol.ESP=ESP
-currenciesSymbol.BMP=BMP
-currenciesSymbol.LYD=LYD
-currenciesSymbol.LYB=LYB
-currenciesSymbol.BMD=BMD
-currenciesSymbol.NLG=NLG
-currenciesSymbol.MRO=MRO
-currenciesSymbol.IRR=IRR
-currenciesSymbol.SEK=SEK
-currenciesSymbol.ERN=ERN
-currenciesSymbol.KES=KES
-currenciesSymbol.CFF=CFF
-currenciesSymbol.ARS=ARS
-currenciesSymbol.ARP=ARP
-currenciesSymbol.ARM=ARM
-currenciesSymbol.TWD=NT$
-currenciesSymbol.SDP=SDP
-currenciesSymbol.GEL=GEL
-currenciesSymbol.GEK=GEK
-currenciesSymbol.MQF=MQF
-currenciesSymbol.FKP=FKP
-currenciesSymbol.ARA=ARA
-currenciesSymbol.SDD=SDD
-currenciesSymbol.IQD=IQD
-currenciesSymbol.TVD=TVD
-currenciesSymbol.SCR=SCR
-currenciesSymbol.LVR=LVR
-currenciesSymbol.FJP=FJP
-currenciesSymbol.LVL=LVL
-currenciesSymbol.CDL=CDL
-currenciesSymbol.CDG=CDG
-currenciesSymbol.CDF=CDF
-currenciesSymbol.FJD=FJD
-currenciesSymbol.NIO=NIO
currenciesSymbol.MOP=P
-currenciesSymbol.NIG=NIG
-currenciesSymbol.NIC=NIC
-currenciesSymbol.FIN=FIN
-currenciesSymbol.FIM=FIM
-currenciesSymbol.SBD=SBD
-currenciesSymbol.LUF=LUF
-currenciesSymbol.TTO=TTO
-currenciesSymbol.AOS=AOS
-currenciesSymbol.AOR=AOR
-currenciesSymbol.MNT=MNT
-currenciesSymbol.HUF=HUF
-currenciesSymbol.BIF=BIF
-currenciesSymbol.AON=AON
-currenciesSymbol.AOK=AOK
-currenciesSymbol.TTD=TTD
-currenciesSymbol.SZL=SZL
-currenciesSymbol.NHF=NHF
-currenciesSymbol.SAS=SAS
currenciesSymbol.SAR=SRl
-currenciesSymbol.LTT=LTT
-currenciesSymbol.PTE=PTE
-currenciesSymbol.AOA=AOA
-currenciesSymbol.PTC=PTC
-currenciesSymbol.LTL=LTL
-currenciesSymbol.KZT=KZT
-currenciesSymbol.KZR=KZR
-currenciesSymbol.VGD=VGD
-currenciesSymbol.NGP=NGP
-currenciesSymbol.MMX=MMX
-currenciesSymbol.NGN=NGN
-currenciesSymbol.HTG=HTG
-currenciesSymbol.SYP=SYP
-currenciesSymbol.PSP=PSP
-currenciesSymbol.BHD=BHD
-currenciesSymbol.MMK=MMK
-currenciesSymbol.ANG=ANG
-currenciesSymbol.CZK=CZK
-currenciesSymbol.IMP=IMP
-currenciesSymbol.BGX=BGX
-currenciesSymbol.LSL=LSL
-currenciesSymbol.BGO=BGO
-currenciesSymbol.BGN=BGN
-currenciesSymbol.BGM=BGM
-currenciesSymbol.CAD=CAD
-currenciesSymbol.BGL=BGL
-currenciesSymbol.TRL=TRL
-currenciesSymbol.KYD=KYD
-currenciesSymbol.CYP=CYP
-currenciesSymbol.ILS=ILS
-currenciesSymbol.GYD=GYD
-currenciesSymbol.AMD=AMD
-currenciesSymbol.ILP=ILP
-currenciesSymbol.MLF=MLF
-currenciesSymbol.ILL=ILL
-currenciesSymbol.VEB=VEB
-currenciesSymbol.ALX=ALX
-currenciesSymbol.LRD=LRD
-currenciesSymbol.ALV=ALV
-currenciesSymbol.HRK=HRK
-currenciesSymbol.REF=REF
-currenciesSymbol.HRD=HRD
-currenciesSymbol.ALL=ALL
-currenciesSymbol.JEP=JEP
-currenciesSymbol.ALK=ALK
-currenciesSymbol.MKN=MKN
-currenciesSymbol.VDP=VDP
-currenciesSymbol.VDN=VDN
-currenciesSymbol.MKD=MKD
-currenciesSymbol.VDD=VDD
-currenciesSymbol.TPP=TPP
-currenciesSymbol.BEL=BEL
-currenciesSymbol.GWP=GWP
-currenciesSymbol.KWD=KWD
-currenciesSymbol.GWM=GWM
-currenciesSymbol.BEF=BEF
-currenciesSymbol.TPE=TPE
-currenciesSymbol.BEC=BEC
-currenciesSymbol.GWE=GWE
-currenciesSymbol.SVC=SVC
-currenciesSymbol.CWG=CWG
-currenciesSymbol.BDT=BDT
-currenciesSymbol.TOS=TOS
-currenciesSymbol.TOP=TOP
-currenciesSymbol.SUR=SUR
-currenciesSymbol.SUN=SUN
-currenciesSymbol.NCF=NCF
-currenciesSymbol.CVE=CVE
-currenciesSymbol.XNF=XNF
-currenciesSymbol.ZAR=ZAR
-currenciesSymbol.DOP=DOP
-currenciesSymbol.CUX=CUX
-currenciesSymbol.ZAP=ZAP
-currenciesSymbol.ZAL=ZAL
-currenciesSymbol.TND=TND
-currenciesSymbol.CUP=CUP
-currenciesSymbol.GUF=GUF
-currenciesSymbol.UGX=UGX
-currenciesSymbol.LNR=LNR
-currenciesSymbol.AIF=AIF
-currenciesSymbol.VAL=VAL
-currenciesSymbol.STE=STE
-currenciesSymbol.UGS=UGS
-currenciesSymbol.STD=STD
-currenciesSymbol.MHD=MHD
-currenciesSymbol.NZP=NZP
-currenciesSymbol.WST=WST
-currenciesSymbol.WSP=WSP
-currenciesSymbol.HNL=HNL
-currenciesSymbol.XMF=XMF
-currenciesSymbol.TMM=TMM
-currenciesSymbol.GTQ=GTQ
-currenciesSymbol.NZD=NZD
-currenciesSymbol.SSP=SSP
-currenciesSymbol.BBD=BBD
-currenciesSymbol.NAD=NAD
-currenciesSymbol.MGF=MGF
-currenciesSymbol.MGA=MGA
-currenciesSymbol.EGP=EGP
-currenciesSymbol.BZH=BZH
-currenciesSymbol.PLZ=PLZ
-currenciesSymbol.BAN=BAN
-currenciesSymbol.PLX=PLX
-currenciesSymbol.BAM=BAM
-currenciesSymbol.BZD=BZD
-currenciesSymbol.BAD=BAD
-currenciesSymbol.PLN=PLN
-currenciesSymbol.YER=YER
-currenciesSymbol.SRG=SRG
-currenciesSymbol.CSK=CSK
currenciesSymbol.KRW=\uffe6
-currenciesSymbol.BYR=BYR
-currenciesSymbol.YEI=YEI
-currenciesSymbol.BYL=BYL
-currenciesSymbol.CSC=CSC
-currenciesSymbol.KRO=KRO
-currenciesSymbol.KRH=KRH
-currenciesSymbol.BYB=BYB
-currenciesSymbol.SQS=SQS
-currenciesSymbol.GRN=GRN
-currenciesSymbol.PKR=PKR
-currenciesSymbol.AFN=AFN
-currenciesSymbol.ZWD=ZWD
-currenciesSymbol.LKR=LKR
-currenciesSymbol.GRD=GRD
-currenciesSymbol.IEP=IEP
-currenciesSymbol.AFA=AFA
-currenciesSymbol.YDD=YDD
-currenciesSymbol.RWF=RWF
-currenciesSymbol.CRC=CRC
-currenciesSymbol.TJS=TJS
-currenciesSymbol.TJR=TJR
-currenciesSymbol.EEK=EEK
-currenciesSymbol.GQP=GQP
-currenciesSymbol.MDR=MDR
-currenciesSymbol.HKD=HK$
-currenciesSymbol.DKK=DKK
-currenciesSymbol.MDL=MDL
-currenciesSymbol.GQF=GQF
-currenciesSymbol.GQE=GQE
-currenciesSymbol.IDR=IDR
-currenciesSymbol.AED=AED
-currenciesSymbol.KPW=KPW
-currenciesSymbol.IDN=IDN
-currenciesSymbol.BWP=BWP
-currenciesSymbol.MDC=MDC
-currenciesSymbol.IDJ=IDJ
-currenciesSymbol.KPP=KPP
-currenciesSymbol.IDG=IDG
-currenciesSymbol.VUV=VUV
-currenciesSymbol.XID=XID
-currenciesSymbol.SOS=SOS
-currenciesSymbol.ADP=ADP
-currenciesSymbol.RUR=RUR
-currenciesSymbol.GPF=GPF
-currenciesSymbol.DJF=DJF
-currenciesSymbol.ADD=ADD
-currenciesSymbol.MCG=MCG
-currenciesSymbol.MCF=MCF
-currenciesSymbol.ECS=ECS
-currenciesSymbol.LIF=LIF
-currenciesSymbol.RUB=RUB
-currenciesSymbol.PHP=PHP
-currenciesSymbol.UZS=UZS
-currenciesSymbol.COP=COP
-currenciesSymbol.THB=THB
-currenciesSymbol.IBP=IBP
-currenciesSymbol.BUR=BUR
-currenciesSymbol.COF=COF
-currenciesSymbol.BUK=BUK
-currenciesSymbol.COB=COB
-currenciesSymbol.UZC=UZC
-currenciesSymbol.UAK=UAK
-currenciesSymbol.QAR=QAR
-currenciesSymbol.UAH=UAH
-currenciesSymbol.GNS=GNS
-currenciesSymbol.CNY=\uffe5
-currenciesSymbol.MZM=MZM
-currenciesSymbol.CNX=CNX
-currenciesSymbol.UYU=UYU
-currenciesSymbol.GNI=GNI
-currenciesSymbol.SML=SML
-currenciesSymbol.MZE=MZE
-currenciesSymbol.CNP=CNP
-currenciesSymbol.PGK=PGK
-currenciesSymbol.OMS=OMS
-currenciesSymbol.GNF=GNF
-currenciesSymbol.UYP=UYP
-currenciesSymbol.OMR=OMR
-currenciesSymbol.BTR=BTR
-currenciesSymbol.ZRZ=ZRZ
-currenciesSymbol.MAF=MAF
-currenciesSymbol.MAD=MAD
-currenciesSymbol.BTN=BTN
-currenciesSymbol.XFO=XFO
-currenciesSymbol.UYF=UYF
-currenciesSymbol.MYR=MYR
-currenciesSymbol.ZRN=ZRN
-currenciesSymbol.GMP=GMP
-currenciesSymbol.KMF=KMF
-currenciesSymbol.SLL=SLL
-currenciesSymbol.GMD=GMD
-currenciesSymbol.XEU=XEU
-currenciesSymbol.BSP=BSP
-currenciesSymbol.CMF=CMF
-currenciesSymbol.BSD=BSD
-currenciesSymbol.MXP=MXP
-currenciesSymbol.MXN=MXN
-currenciesSymbol.PES=PES
-currenciesSymbol.GLK=GLK
-currenciesSymbol.BRZ=BRZ
-currenciesSymbol.PEN=PEN
-currenciesSymbol.CLP=CLP
-currenciesSymbol.SKK=SKK
-currenciesSymbol.PEI=PEI
-currenciesSymbol.BRR=BRR
-currenciesSymbol.XDR=XDR
-currenciesSymbol.FRG=FRG
-currenciesSymbol.FRF=FRF
-currenciesSymbol.BRN=BRN
-currenciesSymbol.CLF=CLF
-currenciesSymbol.CLE=CLE
-currenciesSymbol.BRL=BRL
-currenciesSymbol.CLC=CLC
-currenciesSymbol.BRE=BRE
-currenciesSymbol.DES=DES
-currenciesSymbol.MWP=MWP
-currenciesSymbol.BRC=BRC
-currenciesSymbol.BRB=BRB
-currenciesSymbol.MWK=MWK
-currenciesSymbol.PDR=PDR
-currenciesSymbol.DEM=DEM
-currenciesSymbol.PDN=PDN
-currenciesSymbol.PDK=PDK
-currenciesSymbol.NPR=NPR
-currenciesSymbol.CKD=CKD
-currenciesSymbol.JPY=JP\u00a5
-currenciesSymbol.MVR=MVR
-currenciesSymbol.MVP=MVP
-currenciesSymbol.XCD=XCD
-currenciesSymbol.SIT=SIT
-currenciesSymbol.YUR=YUR
-currenciesSymbol.AWG=AWG
-currenciesSymbol.YUO=YUO
-currenciesSymbol.DDM=DDM
-currenciesSymbol.YUN=YUN
-currenciesSymbol.YUM=YUM
-currenciesSymbol.TCC=TCC
-currenciesSymbol.YUG=YUG
-currenciesSymbol.YUF=YUF
-currenciesSymbol.RON=RON
-currenciesSymbol.YUD=YUD
-currenciesSymbol.ROL=ROL
-currenciesSymbol.SIB=SIB
-currenciesSymbol.NOK=NOK
-currenciesSymbol.MUR=MUR
-currenciesSymbol.GIP=GIP
-currenciesSymbol.VNS=VNS
-currenciesSymbol.VNR=VNR
-currenciesSymbol.XBB=XBB
-currenciesSymbol.XBA=XBA
-currenciesSymbol.KID=KID
-currenciesSymbol.SHP=SHP
-currenciesSymbol.VNN=VNN
shortMonths=\u4e00\u6708®\u4e8c\u6708®\u4e09\u6708®\u56db\u6708®\u4e94\u6708®\u516d\u6708®\u4e03\u6708®\u516b\u6708®\u4e5d\u6708®\u5341\u6708®\u5341\u4e00\u6708®\u5341\u4e8c\u6708®®
months=\u4e00\u6708®\u4e8c\u6708®\u4e09\u6708®\u56db\u6708®\u4e94\u6708®\u516d\u6708®\u4e03\u6708®\u516b\u6708®\u4e5d\u6708®\u5341\u6708®\u5341\u4e00\u6708®\u5341\u4e8c\u6708®®
-shortWeekdays=®\u65e5®\u4e00®\u4e8c®\u4e09®\u56db®\u4e94®\u516d®
+shortWeekdays=®\u5468\u65e5®\u5468\u4e00®\u5468\u4e8c®\u5468\u4e09®\u5468\u56db®\u5468\u4e94®\u5468\u516d®
weekdays=®\u661f\u671f\u65e5®\u661f\u671f\u4e00®\u661f\u671f\u4e8c®\u661f\u671f\u4e09®\u661f\u671f\u56db®\u661f\u671f\u4e94®\u661f\u671f\u516d®
eras=\u516c\u5143\u524d®\u516c\u5143®
ampms=\u4e0a\u5348®\u4e0b\u5348®
-zoneStrings=America/Indianapolis®EST®\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4®EST®\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4®©America/Halifax®AST®\u5927\u897f\u6d0b\u6807\u51c6\u65f6\u95f4®ADT®\u5927\u897f\u6d0b\u590f\u4ee4\u65f6\u95f4®©Pacific/Honolulu®HST®\u590f\u5a01\u5937\u6807\u51c6\u65f6\u95f4®HST®\u590f\u5a01\u5937\u6807\u51c6\u65f6\u95f4®©America/Denver®MST®\u5c71\u533a\u6807\u51c6\u65f6\u95f4®MDT®\u5c71\u533a\u590f\u4ee4\u65f6\u95f4®©America/Anchorage®AST®\u963f\u62c9\u65af\u52a0\u6807\u51c6\u65f6\u95f4®ADT®\u963f\u62c9\u65af\u52a0\u590f\u4ee4\u65f6\u95f4®©America/St_Johns®CNT®\u7ebd\u82ac\u5170\u6807\u51c6\u65f6\u95f4®CDT®\u7ebd\u82ac\u5170\u590f\u4ee4\u65f6\u95f4®©Africa/Casablanca®GMT®\u683c\u6797\u5a01\u6cbb\u6807\u51c6\u65f6\u95f4®GMT®\u683c\u6797\u5a01\u6cbb\u6807\u51c6\u65f6\u95f4®©America/Chicago®CST®\u4e2d\u592e\u6807\u51c6\u65f6\u95f4®CDT®\u4e2d\u592e\u590f\u4ee4\u65f6\u95f4®©Asia/Shanghai®CTT®\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4®CDT®\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4®©Asia/Tokyo®JST®\u65e5\u672c\u6807\u51c6\u65f6\u95f4®JST®\u65e5\u672c\u6807\u51c6\u65f6\u95f4®©America/New_York®EST®\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4®EDT®\u4e1c\u90e8\u590f\u4ee4\u65f6\u95f4®©Europe/Bucharest®EET®\u4e1c\u6b27\u6807\u51c6\u65f6\u95f4®EEST®\u4e1c\u6b27\u590f\u4ee4\u65f6\u95f4®©America/Los_Angeles®PST®\u592a\u5e73\u6d0b\u6807\u51c6\u65f6\u95f4®PDT®\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6\u95f4®©America/Phoenix®MST®\u5c71\u533a\u6807\u51c6\u65f6\u95f4®MST®\u5c71\u533a\u6807\u51c6\u65f6\u95f4®©Etc/GMT®GMT®\u683c\u6797\u5a01\u6cbb\u6807\u51c6\u65f6\u95f4®GMT®\u683c\u6797\u5a01\u6cbb\u6807\u51c6\u65f6\u95f4®©Asia/Jerusalem®IST®\u4ee5\u8272\u5217\u6807\u51c6\u65f6\u95f4®IDT®\u4ee5\u8272\u5217\u590f\u4ee4\u65f6\u95f4®©Europe/Paris®CET®\u4e2d\u6b27\u6807\u51c6\u65f6\u95f4®CEST®\u4e2d\u6b27\u590f\u4ee4\u65f6\u95f4®©
+zoneStrings=America/Halifax®AST®\u5927\u897f\u6d0b\u6807\u51c6\u65f6\u95f4®ADT®\u5927\u897f\u6d0b\u590f\u4ee4\u65f6\u95f4®©America/Indianapolis®EST®\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4®EST®\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4®©Europe/Paris®CET®\u4e2d\u6b27\u6807\u51c6\u65f6\u95f4®CEST®\u4e2d\u6b27\u590f\u4ee4\u65f6\u95f4®©America/Phoenix®MST®\u5c71\u533a\u6807\u51c6\u65f6\u95f4®MST®\u5c71\u533a\u6807\u51c6\u65f6\u95f4®©America/Los_Angeles®PST®\u592a\u5e73\u6d0b\u6807\u51c6\u65f6\u95f4®PDT®\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6\u95f4®©Pacific/Honolulu®HST®\u590f\u5a01\u5937\u6807\u51c6\u65f6\u95f4®HST®\u590f\u5a01\u5937\u6807\u51c6\u65f6\u95f4®©America/Denver®MST®\u5c71\u533a\u6807\u51c6\u65f6\u95f4®MDT®\u5c71\u533a\u590f\u4ee4\u65f6\u95f4®©Europe/Bucharest®EET®\u4e1c\u6b27\u6807\u51c6\u65f6\u95f4®EEST®\u4e1c\u6b27\u590f\u4ee4\u65f6\u95f4®©America/New_York®EST®\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4®EDT®\u4e1c\u90e8\u590f\u4ee4\u65f6\u95f4®©Asia/Tokyo®JST®\u65e5\u672c\u6807\u51c6\u65f6\u95f4®JST®\u65e5\u672c\u6807\u51c6\u65f6\u95f4®©America/Anchorage®AST®\u963f\u62c9\u65af\u52a0\u6807\u51c6\u65f6\u95f4®ADT®\u963f\u62c9\u65af\u52a0\u590f\u4ee4\u65f6\u95f4®©Asia/Shanghai®CTT®\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4®CDT®\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4®©America/Chicago®CST®\u4e2d\u592e\u6807\u51c6\u65f6\u95f4®CDT®\u4e2d\u592e\u590f\u4ee4\u65f6\u95f4®©Africa/Casablanca®GMT®\u683c\u6797\u5a01\u6cbb\u6807\u51c6\u65f6\u95f4®GMT®\u683c\u6797\u5a01\u6cbb\u6807\u51c6\u65f6\u95f4®©America/St_Johns®CNT®\u7ebd\u82ac\u5170\u6807\u51c6\u65f6\u95f4®CDT®\u7ebd\u82ac\u5170\u590f\u4ee4\u65f6\u95f4®©Asia/Jerusalem®IST®\u4ee5\u8272\u5217\u6807\u51c6\u65f6\u95f4®IDT®\u4ee5\u8272\u5217\u590f\u4ee4\u65f6\u95f4®©
territories.TL=\u4e1c\u5e1d\u6c76
territories.TK=\u6258\u514b\u52b3
territories.TJ=\u5854\u5409\u514b\u65af\u5766
@@ -762,7 +280,9 @@ territories.GN=\u51e0\u5185\u4e9a
territories.GM=\u5188\u6bd4\u4e9a
territories.GL=\u683c\u9675\u5170
territories.SV=\u8428\u5c14\u74e6\u591a
+territories.062=\u4e2d\u5357\u4e9a
territories.ST=\u5723\u591a\u7f8e\u548c\u666e\u6797\u897f\u6bd4
+territories.061=\u73bb\u91cc\u5c3c\u897f\u4e9a
territories.GI=\u76f4\u5e03\u7f57\u9640
territories.GH=\u52a0\u7eb3
territories.SR=\u82cf\u91cc\u5357
@@ -786,9 +306,12 @@ territories.SC=\u585e\u820c\u5c14
territories.SB=\u6240\u7f57\u95e8\u7fa4\u5c9b
territories.SA=\u6c99\u7279\u963f\u62c9\u4f2f
territories.FR=\u6cd5\u56fd
+territories.057=\u5bc6\u514b\u7f57\u5c3c\u897f\u4e9a
territories.FO=\u6cd5\u7f57\u7fa4\u5c9b
territories.FM=\u5bc6\u514b\u7f57\u5c3c\u897f\u4e9a\u8054\u90a6
territories.RW=\u5362\u65fa\u8fbe
+territories.054=\u7f8e\u62c9\u5c3c\u897f\u4e9a
+territories.053=\u6fb3\u5927\u5229\u4e9a\u548c\u65b0\u897f\u5170
territories.FK=\u798f\u514b\u5170\u7fa4\u5c9b
territories.RU=\u4fc4\u7f57\u65af\u8054\u90a6
territories.FJ=\u6590\u6d4e
@@ -798,20 +321,26 @@ territories.RE=\u7559\u5c3c\u6c6a
territories.ET=\u57c3\u585e\u4fc4\u6bd4\u4e9a
territories.ES=\u897f\u73ed\u7259
territories.ER=\u5384\u7acb\u7279\u91cc\u4e9a
+territories.833=\u66fc\u5c9b
territories.EH=\u897f\u6492\u54c8\u62c9
territories.EG=\u57c3\u53ca
+territories.830=\u6d77\u5ce1\u7fa4\u5c9b
territories.EE=\u7231\u6c99\u5c3c\u4e9a
+territories.QO=\u5927\u6d0b\u6d32\u8fb9\u8fdc\u7fa4\u5c9b
territories.EC=\u5384\u74dc\u591a\u5c14
territories.DZ=\u963f\u5c14\u53ca\u5229\u4e9a
territories.QA=\u5361\u5854\u5c14
+territories.039=\u5357\u6b27
territories.DO=\u591a\u7c73\u5c3c\u52a0\u5171\u548c\u56fd
territories.PY=\u5df4\u62c9\u572d
+territories.035=\u4e1c\u5357\u4e9a
territories.DM=\u591a\u7c73\u5c3c\u52a0\u5c98
territories.PW=\u5e15\u52b3
territories.DK=\u4e39\u9ea6
territories.DJ=\u5409\u5e03\u63d0
territories.PT=\u8461\u8404\u7259
territories.PS=\u5df4\u52d2\u65af\u5766\u9886\u571f
+territories.030=\u4e1c\u4e9a
territories.PR=\u6ce2\u591a\u9ece\u5404
territories.DE=\u5fb7\u56fd
territories.PN=\u76ae\u7279\u51ef\u6069
@@ -828,13 +357,16 @@ territories.CX=\u5723\u8bde\u5c9b
territories.CV=\u4f5b\u5f97\u89d2
territories.PA=\u5df4\u62ff\u9a6c
territories.CU=\u53e4\u5df4
+territories.CS=\u585e\u5c14\u7ef4\u4e9a\u548c\u9ed1\u5c71
territories.CR=\u54e5\u65af\u8fbe\u9ece\u52a0
+territories.029=\u52a0\u52d2\u6bd4\u6d77
territories.CO=\u54e5\u4f26\u6bd4\u4e9a
territories.CN=\u4e2d\u56fd
territories.CM=\u5580\u9ea6\u9686
territories.CL=\u667a\u5229
territories.CK=\u5e93\u514b\u7fa4\u5c9b
territories.CI=\u8c61\u7259\u6d77\u5cb8
+territories.021=\u5317\u7f8e\u6d32
territories.CH=\u745e\u58eb
territories.CG=\u521a\u679c
territories.CF=\u4e2d\u975e\u5171\u548c\u56fd
@@ -849,13 +381,20 @@ territories.BV=\u5e03\u7ef4\u7279\u5c9b
territories.BT=\u4e0d\u4e39
territories.BS=\u5df4\u54c8\u9a6c
territories.BR=\u5df4\u897f
+territories.019=\u7f8e\u6d32
+territories.018=\u5357\u975e
territories.NZ=\u65b0\u897f\u5170
territories.BO=\u73bb\u5229\u7ef4\u4e9a
+territories.017=\u4e2d\u975e
territories.BN=\u6587\u83b1
territories.BM=\u767e\u6155\u5927
+territories.015=\u5317\u975e
+territories.014=\u4e1c\u975e
+territories.013=\u4e2d\u7f8e\u6d32
territories.NU=\u7ebd\u57c3
territories.BJ=\u8d1d\u5b81
territories.BI=\u5e03\u9686\u8fea
+territories.011=\u897f\u975e
territories.BH=\u5df4\u6797
territories.NR=\u7459\u9c81
territories.BG=\u4fdd\u52a0\u5229\u4e9a
@@ -873,6 +412,7 @@ territories.NG=\u5c3c\u65e5\u5229\u4e9a
territories.NF=\u8bfa\u798f\u514b\u5c9b
territories.AZ=\u963f\u585e\u62dc\u7586
territories.NE=\u5c3c\u65e5\u5c14
+territories.AX=\u5965\u5170\u7fa4\u5c9b
territories.NC=\u65b0\u5580\u91cc\u591a\u5c3c\u4e9a
territories.AW=\u963f\u9c81\u5df4
territories.ZM=\u8d5e\u6bd4\u4e9a
@@ -881,19 +421,23 @@ territories.AU=\u6fb3\u5927\u5229\u4e9a
territories.AT=\u5965\u5730\u5229
territories.AS=\u7f8e\u5c5e\u8428\u6469\u4e9a
territories.AR=\u963f\u6839\u5ef7
+territories.009=\u5927\u6d0b\u6d32
territories.AQ=\u5357\u6781\u6d32
territories.MZ=\u83ab\u6851\u6bd4\u514b
territories.AO=\u5b89\u54e5\u62c9
territories.MY=\u9a6c\u6765\u897f\u4e9a
territories.AN=\u8377\u5c5e\u5b89\u7684\u5217\u65af\u7fa4\u5c9b
territories.MX=\u58a8\u897f\u54e5
+territories.005=\u5357\u7f8e\u6d32
territories.AM=\u4e9a\u7f8e\u5c3c\u4e9a
territories.MW=\u9a6c\u62c9\u7ef4
territories.AL=\u963f\u5c14\u5df4\u5c3c\u4e9a
territories.MV=\u9a6c\u5c14\u4ee3\u592b
territories.ZA=\u5357\u975e
territories.MU=\u6bdb\u91cc\u6c42\u65af
+territories.002=\u975e\u6d32
territories.MT=\u9a6c\u8033\u4ed6
+territories.001=\u4e16\u754c
territories.AI=\u5b89\u572d\u62c9
territories.MS=\u8499\u7279\u585e\u62c9\u7fa4\u5c9b
territories.MR=\u6bdb\u91cc\u5854\u5c3c\u4e9a
@@ -908,7 +452,6 @@ territories.MN=\u8499\u53e4
territories.MM=\u7f05\u7538
territories.ML=\u9a6c\u91cc
territories.MK=\u9a6c\u5176\u987f\u738b\u56fd
-territories.YU=\u5357\u65af\u62c9\u592b
territories.YT=\u9a6c\u7ea6\u7279
territories.MH=\u9a6c\u7ecd\u5c14\u7fa4\u5c9b
territories.MG=\u9a6c\u8fbe\u52a0\u65af\u52a0
@@ -918,10 +461,14 @@ territories.MA=\u6469\u6d1b\u54e5
territories.YE=\u4e5f\u95e8
territories.LY=\u5229\u6bd4\u4e9a
territories.LV=\u62c9\u8131\u7ef4\u4e9a
+territories.155=\u897f\u6b27
territories.LU=\u5362\u68ee\u5821
+territories.154=\u5317\u6b27
territories.LT=\u7acb\u9676\u5b9b
territories.LS=\u83b1\u7d22\u6258
territories.LR=\u5229\u6bd4\u91cc\u4e9a
+territories.151=\u4e1c\u6b27
+territories.150=\u6b27\u6d32
territories.LK=\u65af\u91cc\u5170\u5361
territories.LI=\u5217\u652f\u6566\u58eb\u767b
territories.LC=\u5723\u5362\u897f\u4e9a
@@ -930,6 +477,8 @@ territories.LA=\u8001\u631d\u4eba\u6c11\u6c11\u4e3b\u5171\u548c\u56fd
territories.KZ=\u54c8\u8428\u514b\u65af\u5766
territories.KY=\u5f00\u66fc\u7fa4\u5c9b
territories.KW=\u79d1\u5a01\u7279
+territories.145=\u897f\u4e9a
+territories.142=\u4e9a\u6d32
territories.KR=\u97e9\u56fd
territories.KP=\u5317\u671d\u9c9c
territories.KN=\u5723\u57fa\u8328\u548c\u5c3c\u7ef4\u65af
@@ -979,8 +528,8 @@ territories.TR=\u571f\u8033\u5176
territories.TO=\u6c64\u52a0
territories.TN=\u7a81\u5c3c\u65af
territories.TM=\u571f\u5e93\u66fc\u65af\u5766
-languages.gwi=\u5409\u7ef4\u514b\u7434\u6587
languages.akk=\u963f\u5361\u5fb7\u6587
+languages.gwi=\u5409\u7ef4\u514b\u7434\u6587
languages.ijo=\u4f0a\u4e54\u6587
languages.xh=\u73ed\u56fe\u6587
languages.sux=\u82cf\u9a6c\u6587
@@ -992,15 +541,15 @@ languages.pon=\u6ce2\u90a3\u8d1d\u6587
languages.min=\u7c73\u5357\u5361\u4fdd\u6587
languages.suk=\u82cf\u5e93\u9a6c\u6587
languages.wo=\u6c83\u5c14\u592b\u6587
-languages.lol=\u8499\u53e4\u6587
languages.kut=\u5e93\u7279\u5185\u6587
+languages.lol=\u8499\u53e4\u6587
languages.mic=\u7c73\u514b\u9a6c\u514b\u6587
languages.wa=\u83ef\u9686\u6587
languages.kum=\u5e93\u6885\u514b\u6587
languages.zap=\u8428\u6ce2\u8482\u514b\u6587
languages.cus=\u5176\u4ed6\u5e93\u65bd\u7279\u8bed\u7cfb
-languages.jbo=\u6d1b\u5409\u822c\uff08\u4eba\u5de5\u8bed\u8a00\uff09
languages.doi=\u591a\u683c\u6765\u6587
+languages.jbo=\u6d1b\u5409\u822c\uff08\u4eba\u5de5\u8bed\u8a00\uff09
languages.vo=\u6c83\u62c9\u666e\u514b\u6587
languages.oto=\u5965\u6258\u7c73\u8bed\u7cfb
languages.vi=\u8d8a\u5357\u6587
@@ -1023,8 +572,8 @@ languages.uk=\u4e4c\u514b\u5170\u6587
languages.ug=\u7ef4\u543e\u5c14\u6587
languages.fan=\u82b3\u683c\u6587
languages.ssa=\u5176\u4ed6\u5c3c\u7f57\u8428\u54c8\u5170\u6587
-languages.mga=\u4e2d\u53e4\u7231\u5c14\u5170\u6587
languages.bat=\u6ce2\u7f57\u7684\u6d77\u5730\u533a\u4e4b\u8bed\u8a00
+languages.mga=\u4e2d\u53e4\u7231\u5c14\u5170\u6587
languages.nyo=\u5c3c\u7ea6\u7f57\u8bed\u65cf
languages.bas=\u5df4\u8428\u6587
languages.nyn=\u5c3c\u6602\u79d1\u52d2\u6587
@@ -1052,8 +601,8 @@ languages.kru=\u5e93\u9c81\u514b\u6587
languages.tg=\u5854\u5409\u514b\u6587
languages.byn=\u5e03\u6797\u6587
languages.te=\u6cf0\u5362\u56fa\u6587
-languages.kro=\u514b\u9c81\u6587
languages.csb=\u5361\u8212\u6587
+languages.kro=\u514b\u9c81\u6587
languages.ta=\u6cf0\u7c73\u5c14\u6587
languages.tkl=\u9640\u514b\u5a04\u6587
languages.sw=\u65af\u74e6\u5e0c\u91cc\u6587
@@ -1076,8 +625,8 @@ languages.sk=\u65af\u6d1b\u4f10\u514b\u6587
languages.grb=\u683c\u5217\u535a\u6587
languages.si=\u50e7\u4f3d\u7f57\u6587
languages.sh=\u585e\u6ce2\u5c3c\u65af-\u514b\u7f57\u5730\u4e9a\u6587
-languages.crh=\u514b\u91cc\u7c73\u4e9a\u571f\u8033\u5176\u6587\uff1b\u514b\u91cc\u7c73\u4e9a\u5854\u5854\u6587
languages.afa=\u5176\u4ed6\u4e9a\u975e\u8bed\u7cfb
+languages.crh=\u514b\u91cc\u7c73\u4e9a\u571f\u8033\u5176\u6587\uff1b\u514b\u91cc\u7c73\u4e9a\u5854\u5854\u6587
languages.sg=\u6851\u6208\u6587
languages.se=\u5317\u8428\u8ff7\u6587
languages.sd=\u82cf\u4e39\u6587
@@ -1101,14 +650,14 @@ languages.son=\u6851\u6d77\u6587
languages.cpp=\u4e0d\u7eaf\u7cb9\u4e4b\u8461\u56fd\u65b9\u8a00
languages.sog=\u7d22\u683c\u8fea\u4e9a\u6587
languages.ada=\u963f\u5f53\u6885\u6587
-languages.kos=\u67ef\u53f8\u745e\u6069\u6587
-languages.hit=\u897f\u53f0\u6587
languages.cpf=\u4e0d\u7eaf\u7cb9\u4e4b\u6cd5\u56fd\u65b9\u8a00
+languages.hit=\u897f\u53f0\u6587
+languages.kos=\u67ef\u53f8\u745e\u6069\u6587
languages.cpe=\u4e0d\u7eaf\u7cb9\u4e4b\u82f1\u56fd\u65b9\u8a00
languages.him=\u8d6b\u9a6c\u67e5\u5229\u6587
-languages.kok=\u521a\u5361\u5c3c\u6587
-languages.hil=\u5e0c\u5229\u76d6\u519c\u6587
languages.got=\u54e5\u8fbe\u6587
+languages.hil=\u5e0c\u5229\u76d6\u519c\u6587
+languages.kok=\u521a\u5361\u5c3c\u6587
languages.gor=\u79d1\u6d1b\u6d85\u8fbe\u7f57\u6587
languages.gon=\u5c97\u5fb7\u6587
languages.din=\u4e01\u5361\u6587
@@ -1179,21 +728,21 @@ languages.ms=\u9a6c\u6765\u6587
languages.mr=\u9a6c\u62c9\u5730\u6587
languages.fro=\u53e4\u6cd5\u6587
languages.mo=\u6469\u5c14\u591a\u74e6\u6587
-languages.frm=\u4e2d\u53e4\u6cd5\u6587
languages.mn=\u8499\u53e4\u6587
-languages.jrb=\u72b9\u592a\u963f\u62c9\u4f2f\u8bed\u7cfb
+languages.frm=\u4e2d\u53e4\u6cd5\u6587
languages.ml=\u9a6c\u6765\u4e9a\u62c9\u59c6\u6587
+languages.jrb=\u72b9\u592a\u963f\u62c9\u4f2f\u8bed\u7cfb
languages.mk=\u9a6c\u5176\u987f\u6587
languages.mi=\u6bdb\u5229\u6587
languages.mh=\u9a6c\u7ecd\u5c14\u6587
languages.mg=\u9a6c\u5c14\u52a0\u4ec0\u6587
languages.mwr=\u9a6c\u5c14\u5c3c\u91cc\u6587
languages.bra=\u5e03\u62c9\u6770\u6587
-languages.den=\u53f8\u96f7\u592b\u6587
languages.lv=\u62c9\u812b\u7dad\u4e9e\u6587
+languages.den=\u53f8\u96f7\u592b\u6587
languages.lu=\u9c81\u5df4\u52a0\u4e39\u52a0\u6587
-languages.del=\u7279\u62c9\u74e6\u5370\u7b2c\u5b89\u4eba\u6587
languages.lt=\u7acb\u9676\u5b9b\u6587
+languages.del=\u7279\u62c9\u74e6\u5370\u7b2c\u5b89\u4eba\u6587
languages.lo=\u8001\u631d\u6587
languages.ln=\u6797\u52a0\u62c9\u6587
languages.li=\u6dcb\u5e03\u5c14\u5409\u6587
@@ -1246,38 +795,38 @@ languages.iu=\u7231\u65af\u57fa\u6469\u6587
languages.pap=\u5e15\u76ae\u4e9a\u5185\u6258\u6587
languages.it=\u610f\u5927\u5229\u6587
languages.sgn=\u624b\u8bed
-languages.is=\u51b0\u5c9b\u6587
languages.kha=\u5361\u897f\u6587
+languages.is=\u51b0\u5c9b\u6587
languages.chr=\u5f7b\u7f57\u57fa\u6587
languages.pam=\u90a6\u677f\u7259\u6587
languages.pal=\u5e15\u62c9\u7ef4\u6587
languages.chp=\u4f69\u74e6\u626c\u6587
-languages.io=\u7231\u5fb7\u83aa\u6587\uff08\u4eba\u5de5\u8bed\u8a00\uff09
languages.cho=\u4e54\u514b\u6258\u6587
+languages.io=\u7231\u5fb7\u83aa\u6587\uff08\u4eba\u5de5\u8bed\u8a00\uff09
languages.chn=\u5951\u52aa\u514b\u6587
languages.chm=\u9a6c\u91cc\u6587
languages.tyv=\u56fe\u74e6\u6587
languages.bnt=\u73ed\u56fe\u6587
languages.pag=\u90a6\u963f\u897f\u5357\u6587
-languages.ik=\u4f9d\u5974\u76ae\u7ef4\u514b\u6587
languages.chk=\u695a\u543e\u514b\u6587
-languages.ii=\u56db\u5ddd\u8bdd
+languages.ik=\u4f9d\u5974\u76ae\u7ef4\u514b\u6587
languages.haw=\u590f\u5a01\u5937\u6587
+languages.ii=\u56db\u5ddd\u8bdd
languages.lam=\u5170\u5df4\u6587
-languages.ig=\u4f0a\u683c\u535a\u6587
languages.chg=\u67e5\u52a0\u6587
+languages.ig=\u4f0a\u683c\u535a\u6587
languages.sga=\u53e4\u7231\u5c14\u5170\u6587
languages.paa=\u5176\u4ed6\u5df4\u5e03\u4e9a\u6587
languages.ie=\u62c9\u4e01\u56fd\u9645\u6587
languages.id=\u5370\u5ea6\u5c3c\u897f\u4e9a\u6587
languages.lah=\u62c9\u4ea8\u8fbe\u6587
-languages.day=\u8fbe\u96c5\u514b\u6587
languages.chb=\u5951\u5e03\u5361\u6587
+languages.day=\u8fbe\u96c5\u514b\u6587
languages.ia=\u62c9\u4e01\u56fd\u9645\u6587
languages.lad=\u62c9\u8fea\u8bfa\u6587
-languages.hz=\u8d6b\u96f7\u7f57\u6587
-languages.hai=\u6d77\u8fbe\u6587
languages.dar=\u8fbe\u5c14\u683c\u74e6\u6587
+languages.hai=\u6d77\u8fbe\u6587
+languages.hz=\u8d6b\u96f7\u7f57\u6587
languages.hy=\u4e9a\u7f8e\u5c3c\u4e9a\u6587
languages.ath=\u5176\u4ed6\u963f\u6492\u5df4\u65af\u5361\u8bed\u7cfb
languages.hu=\u5308\u7259\u5229\u6587
@@ -1298,9 +847,9 @@ languages.iro=\u4f0a\u6d1b\u90ed\u4f0a\u8d39\u6587
languages.gn=\u74dc\u62c9\u5c3c\u6587
languages.gl=\u52a0\u5229\u897f\u4e9a\u6587
languages.arw=\u963f\u62c9\u74e6\u514b\u6587
-languages.gez=\u5409\u5179\u6587
-languages.art=\u5176\u4ed6\u4eba\u5de5\u8bed\u8a00
languages.gd=\u82cf\u683c\u5170- \u76d6\u5c14\u6587
+languages.art=\u5176\u4ed6\u4eba\u5de5\u8bed\u8a00
+languages.gez=\u5409\u5179\u6587
languages.ira=\u4f0a\u6717\u6587
languages.ga=\u7231\u5c14\u5170\u6587
languages.arp=\u963f\u62c9\u5e15\u970d\u6587
@@ -1308,8 +857,8 @@ languages.arn=\u963f\u52b3\u574e\u6587
languages.fy=\u5f17\u91cc\u65af\u5170\u6587
languages.bla=\u53f8\u514b\u53f8\u5361\u6587
languages.ypk=\u55bb\u76ae\u514b\u6587
-languages.arc=\u963f\u62c9\u7c73\u6587
languages.fr=\u6cd5\u6587
+languages.arc=\u963f\u62c9\u7c73\u6587
languages.fo=\u6cd5\u7f57\u6587
languages.cel=\u5176\u4ed6\u51ef\u5c14\u7279\u8bed\u7cfb
languages.fj=\u6590\u6d4e\u6587
@@ -1333,9 +882,9 @@ languages.tum=\u901a\u5e03\u5361\u6587
languages.mos=\u83ab\u897f\u6587
languages.dz=\u4e0d\u4e39\u6587
languages.nic=\u5176\u4ed6\u5c3c\u65e5\u5c14\u521a\u679c\u8bed\u7cfb
-languages.lus=\u5362\u6652\u6587
-languages.fiu=\u82ac\u5308\u6587\uff08\u5176\u4ed6\uff09
languages.dv=\u8fea\u7ef4\u5e0c\u6587
+languages.fiu=\u82ac\u5308\u6587\uff08\u5176\u4ed6\uff09
+languages.lus=\u5362\u6652\u6587
languages.nia=\u5c3c\u5c14\u53f8\u6587
languages.moh=\u6469\u970d\u514b\u6587
languages.luo=\u5362\u5965\u6587
@@ -1358,8 +907,8 @@ languages.wak=\u74e6\u5580\u5c71\u6587
languages.sat=\u6851\u55d2\u5229\u6587
languages.cy=\u5a01\u5c14\u58eb\u6587
languages.sas=\u585e\u585e\u5361\u6587
-languages.kbd=\u5361\u5df4\u5c14\u8fbe\u6587
languages.cv=\u695a\u74e6\u4ec0\u6587
+languages.kbd=\u5361\u5df4\u5c14\u8fbe\u6587
languages.cu=\u5b97\u6559\u65af\u62c9\u592b\u6587
languages.mni=\u66fc\u5c3c\u666e\u91cc\u6587
languages.cs=\u6377\u514b\u6587
@@ -1371,17 +920,17 @@ languages.co=\u79d1\u897f\u5609\u6587
languages.sai=\u5176\u4ed6\u5357\u7f8e\u5370\u7b2c\u5b89\u6587
languages.mnc=\u6ee1\u6587
languages.sah=\u96c5\u5e93\u7279\u6587
-languages.kaw=\u5361\u5a01\u6587
-languages.inh=\u5370\u53e4\u4ec0\u6587
languages.gba=\u845b\u5df4\u4e9a\u6587
+languages.inh=\u5370\u53e4\u4ec0\u6587
+languages.kaw=\u5361\u5a01\u6587
languages.sad=\u6563\u8fbe\u7ef4\u6587
languages.ch=\u67e5\u83ab\u7f57\u6587
-languages.ine=\u5176\u4ed6\u5370\u6b27\u8bed\u7cfb
languages.bho=\u535a\u6770\u666e\u5c14\u6587
+languages.ine=\u5176\u4ed6\u5370\u6b27\u8bed\u7cfb
languages.enm=\u4e2d\u53e4\u82f1\u6587
-languages.kar=\u5580\u4f26\u6587
-languages.inc=\u5370\u5ea6\u6587\uff08\u5176\u4ed6\uff09
languages.ce=\u8f66\u81e3\u6587
+languages.inc=\u5370\u5ea6\u6587\uff08\u5176\u4ed6\uff09
+languages.kar=\u5580\u4f26\u6587
languages.gay=\u8fe6\u7ea6\u6587
languages.ca=\u52a0\u6cf0\u7f57\u5c3c\u4e9a\u6587
languages.umb=\u59c6\u5d29\u675c\u6587
@@ -1389,19 +938,19 @@ languages.syr=\u53d9\u5229\u4e9a\u6587
languages.kam=\u5361\u59c6\u5df4\u6587
languages.tsi=\u8482\u59c6\u897f\u4e9a\u6587
languages.ang=\u4e2d\u53e4\u82f1\u8bed
-languages.kac=\u5361\u7434\u6587
languages.cau=\u5176\u4ed6\u9ad8\u52a0\u7d22\u8bed\u7cfb
+languages.kac=\u5361\u7434\u6587
languages.kab=\u5361\u6bd4\u5c14\u6587
-languages.kaa=\u5361\u62c9\u5361\u5c14\u5e15\u514b\u6587
languages.bs=\u6ce2\u65af\u5c3c\u4e9a\u6587
-languages.car=\u5df4\u52d2\u6bd4\u6587
+languages.kaa=\u5361\u62c9\u5361\u5c14\u5e15\u514b\u6587
languages.br=\u5e03\u91cc\u591a\u5c3c\u6587
+languages.car=\u5df4\u52d2\u6bd4\u6587
languages.bo=\u897f\u85cf\u6587
languages.bn=\u5b5f\u52a0\u62c9\u6587
languages.bm=\u73ed\u5df4\u62c9\u6587
languages.gaa=\u52a0\u6587
-languages.cai=\u5176\u4ed6\u4e2d\u7f8e\u5370\u7b2c\u5b89\u8bed\u7cfb
languages.bi=\u6bd4\u65af\u62c9\u9a6c\u6587
+languages.cai=\u5176\u4ed6\u4e2d\u7f8e\u5370\u7b2c\u5b89\u8bed\u7cfb
languages.bh=\u6bd4\u54c8\u5c14\u6587
languages.bg=\u4fdd\u52a0\u5229\u4e9a\u6587
languages.be=\u767d\u4fc4\u7f57\u65af\u6587
@@ -1415,10 +964,10 @@ languages.az=\u963f\u585e\u62dc\u7586\u6587
languages.ay=\u827e\u9a6c\u62c9\u6587
languages.av=\u963f\u74e6\u5c14\u6587
languages.as=\u963f\u8428\u59c6\u6587
-languages.dsb=\u4e0b\u585e\u5c14\u7ef4\u4e9a\u6587
languages.ar=\u963f\u62c9\u4f2f\u6587
-languages.ilo=\u4f0a\u6d1b\u5e72\u8bfa\u6587
+languages.dsb=\u4e0b\u585e\u5c14\u7ef4\u4e9a\u6587
languages.elx=\u827e\u62c9\u7c73\u7279\u6587
+languages.ilo=\u4f0a\u6d1b\u5e72\u8bfa\u6587
languages.zh=\u4e2d\u6587
languages.pra=\u5370\u5ea6\u53e4\u4ee3\u53ca\u4e2d\u4e16\u7eaa\u4e4b\u4e2d\u90e8\u53ca\u5317\u90e8\u65b9\u8a00
languages.am=\u963f\u59c6\u54c8\u62c9\u6587
diff --git a/resource/gnu/java/locale/LocaleInformation_zh_Hant.properties b/resource/gnu/java/locale/LocaleInformation_zh_Hant.properties
index 0f79a7d5e..505cf5f10 100644
--- a/resource/gnu/java/locale/LocaleInformation_zh_Hant.properties
+++ b/resource/gnu/java/locale/LocaleInformation_zh_Hant.properties
@@ -5,394 +5,243 @@
#
# This file was automatically generated by gnu.localegen from CLDR.
-currenciesDisplayName.JOD=\u7d04\u65e6\u7b2c\u7d0d\u723e
-currenciesDisplayName.BOV=\u73bb\u5229\u7dad\u4e9e \u5e55\u591a
-currenciesDisplayName.XAU=\u9ec3\u91d1
-currenciesDisplayName.FOK=\u6cd5\u7f85\u5cf6\u514b\u6717
-currenciesDisplayName.LBP=\u9ece\u5df4\u5ae9\u938a
-currenciesDisplayName.EUR=\u6b50\u5143
-currenciesDisplayName.TZS=\u5766\u6851\u5c3c\u4e9e \u5148\u4ee4
-currenciesDisplayName.BOP=\u73bb\u5229\u7dad\u4e9e\u62ab\u7d22
-currenciesDisplayName.KHR=\u67ec\u57d4\u5be8\u745e\u723e
-currenciesDisplayName.XAM=\u4e9e\u6d32\u8ca8\u5e63\u55ae\u4f4d
-currenciesDisplayName.BOL=\u73bb\u5229\u7dad\u4e9e\u820a\u8ca8\u5e63\u55ae\u4f4d (1863-1962)
-currenciesDisplayName.KHO=\u67ec\u57d4\u5be8\u820a\u745e\u723e
-currenciesDisplayName.ZMP=\u8d0a\u6bd4\u4e9e\u938a
-currenciesDisplayName.AUP=\u6fb3\u5927\u5229\u4e9e\u938a
-currenciesDisplayName.XAF=\u897f\u975e \u6cd5\u90ce BEAC
-currenciesDisplayName.MTP=\u99ac\u723e\u4ed6\u938a
-currenciesDisplayName.GHR=\u8fe6\u7d0d\u91cd\u65b0\u4f30\u4ef7\u5f8c\u7684\u4ed9\u8515
-currenciesDisplayName.ZMK=\u5c1a\u6bd4\u4e9e\u514b\u74e6\u67e5
-currenciesDisplayName.XAD=\u4e9e\u6d32\u7b2c\u7d0d\u723e\u6703\u8a08\u55ae\u4f4d
-currenciesDisplayName.GHP=\u8fe6\u7d0d\u938a
-currenciesDisplayName.BOB=\u73bb\u5229\u7dad\u4e9e\u8ca8\u5e63\u55ae\u4f4d
-currenciesDisplayName.GHO=\u8fe6\u7d0d\u820a\u4ed9\u8515
-currenciesDisplayName.MTL=\u99ac\u723e\u4ed6\u91cc\u62c9
-currenciesDisplayName.AUD=\u6fb3\u5e63
-currenciesDisplayName.ITL=\u7fa9\u5927\u5229\u91cc\u62c9
-currenciesDisplayName.USN=\u7f8e\u5143 (\u7b2c\u4e8c\u5929)
-currenciesDisplayName.GHC=\u8fe6\u7d0d\u4ed9\u8515
-currenciesDisplayName.SGD=\u65b0\u52a0\u5761\u5e63
-currenciesDisplayName.PAB=\u5df4\u62ff\u99ac\u5df4\u6ce2\u4e9e
-currenciesDisplayName.LAK=\u8001\u64be \u958b\u666e
-currenciesDisplayName.KGS=\u5409\u723e\u5409\u65af\u7d22\u99ac
-currenciesDisplayName.ATS=\u5967\u5730\u5229\u5148\u4ee4
-currenciesDisplayName.ETD=\u57c3\u8cfd\u4fc4\u6bd4\u4e9e\u5143
-currenciesDisplayName.BND=\u6c76\u840a\u5143
-currenciesDisplayName.JMP=\u7259\u8cb7\u52a0\u938a
-currenciesDisplayName.ETB=\u8863\u7d22\u6bd4\u4e9e\u6bd4\u723e
-currenciesDisplayName.DZG=\u963f\u723e\u53ca\u5229\u4e9e\u6cd5\u90ce Germinal
-currenciesDisplayName.DZF=\u963f\u723e\u53ca\u5229\u4e9e\u65b0\u6cd5\u90ce
-currenciesDisplayName.DZD=\u963f\u723e\u53ca\u5229\u4e9e\u7b2c\u7d0d\u723e
-currenciesDisplayName.PYG=\u5df4\u62c9\u572d\u74dc\u62c9\u5c3c
-currenciesDisplayName.LYP=\u5229\u6bd4\u4e9e\u938a
-currenciesDisplayName.JMD=\u7259\u8cb7\u52a0\u5143
-currenciesDisplayName.ISK=\u51b0\u5cf6\u514b\u6717
-currenciesDisplayName.ESP=\u897f\u73ed\u7259\u966a\u58eb\u7279
-currenciesDisplayName.BMP=\u767e\u6155\u9054\u938a
-currenciesDisplayName.LYD=\u5229\u6bd4\u4e9e\u7b2c\u7d0d\u723e
-currenciesDisplayName.LYB=\u5229\u6bd4\u4e9e\u82f1\u570b\u7684\u8ecd\u4e8b\u7576\u5c40\u91cc\u62c9
-currenciesDisplayName.BMD=\u767e\u6155\u9054\u5e63
-currenciesDisplayName.NLG=\u8377\u862d\u76fe
-currenciesDisplayName.MRO=\u8305\u5229\u5854\u5c3c\u4e9e\u70cf\u5409\u4e9e
-currenciesDisplayName.IRR=\u4f0a\u6717\u91cc\u4e9e\u723e
-currenciesDisplayName.SEK=\u745e\u5178\u514b\u7f85\u7d0d
-currenciesDisplayName.ERN=\u5384\u7acb\u7279\u91cc\u4e9e\u7d0d\u514b\u6cd5
+currenciesDisplayName.YDD=\u8449\u9580\u7b2c\u7d0d\u723e
+currenciesDisplayName.TWD=\u65b0\u81fa\u5e63
currenciesDisplayName.KES=\u80af\u5c3c\u4e9e\u5148\u4ee4
-currenciesDisplayName.CFF=\u4e2d\u975e\u5171\u548c\u570b\u897f\u975e\u6cd5\u90ce
+currenciesDisplayName.BYB=\u767d\u4fc4\u7f85\u65af\u65b0\u76e7\u5e03 (1994-1999)
+currenciesDisplayName.LKR=\u65af\u91cc\u862d\u5361\u76e7\u5e03
+currenciesDisplayName.RWF=\u76e7\u5b89\u9054\u6cd5\u90ce
+currenciesDisplayName.TJS=\u5854\u5409\u514b\u65af\u5766 \u7d22\u83ab\u5c3c
+currenciesDisplayName.SDP=\u8607\u4e39\u938a
+currenciesDisplayName.TJR=\u5854\u5409\u514b\u65af\u5766\u76e7\u5e03
+currenciesDisplayName.ERN=\u5384\u7acb\u7279\u91cc\u4e9e\u7d0d\u514b\u6cd5
+currenciesDisplayName.GRD=\u5e0c\u81d8\u5fb7\u62c9\u514b\u99ac
+currenciesDisplayName.IEP=\u611b\u723e\u862d\u938a
currenciesDisplayName.ARS=\u963f\u6839\u5ef7\u62ab\u7d22
+currenciesDisplayName.SDD=\u8607\u4e39\u7b2c\u7d0d\u723e
currenciesDisplayName.ARP=\u963f\u6839\u5ef7\u62ab\u7d22(1983-1985)
-currenciesDisplayName.ARM=\u963f\u6839\u5ef7\u62ab\u7d22 Moneda Nacional
-currenciesDisplayName.TWD=\u65b0\u81fa\u5e63
-currenciesDisplayName.SDP=\u8607\u4e39\u938a
currenciesDisplayName.GEL=\u55ac\u6cbb\u62c9\u91cc
currenciesDisplayName.GEK=\u55ac\u6cbb \u5eab\u65c1 \u62c9\u91cc
-currenciesDisplayName.MQF=\u99ac\u63d0\u5c3c\u514b\u5cf6\u6cd5\u90ce
+currenciesDisplayName.CRC=\u54e5\u65af\u5927\u9ece\u52a0\u79d1\u90ce
currenciesDisplayName.FKP=\u798f\u514b\u862d\u7fa4\u5cf6\u938a
+currenciesDisplayName.EEK=\u611b\u6c99\u5c3c\u4e9e\u514b\u6717
+currenciesDisplayName.MDL=\u6469\u675c\u96f2\u5217\u4f0a
currenciesDisplayName.ARA=\u963f\u6839\u5ef7\u5967\u65af\u7279\u7d0d\u723e
-currenciesDisplayName.SDD=\u8607\u4e39\u7b2c\u7d0d\u723e
currenciesDisplayName.IQD=\u4f0a\u62c9\u514b\u7b2c\u7d0d\u723e
-currenciesDisplayName.TVD=\u5410\u74e6\u9b6f\u7f8e\u5143
currenciesDisplayName.SCR=\u585e\u820c\u723e\u7fa4\u5cf6\u76e7\u5e03
+currenciesDisplayName.VUV=\u842c\u90a3\u675c\u842c\u675c
+currenciesDisplayName.DKK=\u4e39\u9ea5\u514b\u7f85\u7d0d
+currenciesDisplayName.KPW=\u5317\u671d\u9bae\u5e63
+currenciesDisplayName.GQE=\u8d64\u9053\u5e7e\u5167\u4e9e\u57c3\u594e\u52d2
+currenciesDisplayName.IDR=\u5370\u5c3c - \u76e7\u5e03
currenciesDisplayName.LVR=\u62c9\u812b\u7dad\u4e9e\u76e7\u5e03
-currenciesDisplayName.FJP=\u6590\u6fdf\u938a
+currenciesDisplayName.SOS=\u7d22\u99ac\u5229\u4e9e\u5148\u4ee4
+currenciesDisplayName.AED=\u963f\u62c9\u4f2f\u806f\u5408\u5927\u516c\u570b\u8fea\u723e\u6c57
+currenciesDisplayName.BWP=\u6ce2\u672d\u90a3 - \u666e\u62c9
currenciesDisplayName.LVL=\u62c9\u812b\u7dad\u4e9e\u62c9\u7279\u9280\u5e63
-currenciesDisplayName.CDL=\u525b\u679c\u624e\u4f0a\u723e
-currenciesDisplayName.CDG=\u525b\u679c\u5171\u548c\u570b\u6cd5\u90ce
-currenciesDisplayName.CDF=\u525b\u679c\u6cd5\u90ce
-currenciesDisplayName.FJD=\u6590\u6fdf\u5143
+currenciesDisplayName.RUR=\u4fc4\u7f85\u65af\u76e7\u5e03 (1991-1998)
currenciesDisplayName.NIO=\u5c3c\u52a0\u62c9\u74dc \u91d1\u54e5\u591a\u83ef
+currenciesDisplayName.ADP=\u5b89\u9053\u723e\u966a\u58eb\u7279
+currenciesDisplayName.FJD=\u6590\u6fdf\u5143
currenciesDisplayName.MOP=\u6fb3\u9580\u5143
-currenciesDisplayName.NIG=\u5c3c\u52a0\u62c9\u74dc\u91d1\u91d1\u54e5\u591a\u83ef
-currenciesDisplayName.XTR=COMECON \u53ef\u8f49\u79fb\u76e7\u5e03
-currenciesDisplayName.FIN=\u82ac\u862d\u99ac\u514b (1860-1962)
-currenciesDisplayName.FIM=\u82ac\u862d\u99ac\u514b
+currenciesDisplayName.RUB=\u4fc4\u7f85\u65af\u76e7\u5e03
+currenciesDisplayName.CDF=\u525b\u679c\u6cd5\u90ce
+currenciesDisplayName.DJF=\u5409\u5e03\u5730\u6cd5\u90ce
+currenciesDisplayName.ECV=\u5384\u74dc\u591a\u723e\u7531\u91cc\u9054\u74e6\u5eb7\u65af\u5766 (UVC)
currenciesDisplayName.SBD=\u7d22\u7f85\u9580\u7fa4\u5cf6\u5143
+currenciesDisplayName.UZS=\u70cf\u8332\u5225\u514b\u65af\u5766 \u85a9\u6728
+currenciesDisplayName.ECS=\u5384\u74dc\u591a\u8607\u514b\u96f7
+currenciesDisplayName.PHP=\u83f2\u5f8b\u8cd3\u62ab\u7d22
+currenciesDisplayName.THB=\u6cf0\u9296
currenciesDisplayName.LUF=\u76e7\u68ee\u5821\u6cd5\u90ce
-currenciesDisplayName.TTO=\u7279\u7acb\u5c3c\u9054\u548c\u591a\u5df4\u54e5\u820a\u5143r
-currenciesDisplayName.AOS=\u5b89\u54e5\u62c9\u57c3\u65af\u5eab\u591a
-currenciesDisplayName.AOR=\u5b89\u54e5\u62c9\u65b0\u5bec\u624e Reajustado (1995-1999)
-currenciesDisplayName.MNT=\u8499\u53e4\u5716\u683c\u91cc\u514b
-currenciesDisplayName.HUF=\u5308\u7259\u5229 - \u798f\u6797
-currenciesDisplayName.BIF=\u84b2\u9686\u5730\u6cd5\u90ce
-currenciesDisplayName.AON=\u5b89\u54e5\u62c9\u65b0\u5bec\u624e (1990-2000)
-currenciesDisplayName.AOK=\u5b89\u54e5\u62c9\u5bec\u624e(1977-1990)
+currenciesDisplayName.FIM=\u82ac\u862d\u99ac\u514b
currenciesDisplayName.TTD=\u5343\u91cc\u9054\u53ca\u6258\u5df4\u54e5r
currenciesDisplayName.SZL=\u65af\u5a01\u58eb\u862d \u91cc\u90ce
-currenciesDisplayName.NHF=\u65b0\u8d6b\u5e03\u91cc\u5e95\u7fa4\u5cf6 CFP \u6cd5\u90ce
-currenciesDisplayName.GBP=\u82f1\u938a
-currenciesDisplayName.SAS=\u6c99\u70cf\u5730\u5b97\u4e3b\u91cc\u96c5
+currenciesDisplayName.MNT=\u8499\u53e4\u5716\u683c\u91cc\u514b
currenciesDisplayName.SAR=\u6c99\u70cf\u5730\u91cc\u96c5
+currenciesDisplayName.UAK=\u70cf\u514b\u862d \u5361\u672c\u74e6\u90a3\u8332
+currenciesDisplayName.UAH=\u70cf\u514b\u862d\u683c\u91cc\u592b\u90a3
+currenciesDisplayName.HUF=\u5308\u7259\u5229 - \u798f\u6797
+currenciesDisplayName.COP=\u54e5\u502b\u6bd4\u4e9e\u62ab\u7d22
+currenciesDisplayName.QAR=\u5361\u9054\u723e\u91cc\u4e9e\u723e
currenciesDisplayName.LTT=\u7acb\u9676\u5b9b\u7279\u7f85
-currenciesDisplayName.INR=\u5370\u5ea6\u76e7\u5e03
currenciesDisplayName.PTE=\u8461\u8404\u7259\u57c3\u65af\u5eab\u591a
-currenciesDisplayName.AOA=\u5b89\u54e5\u62c9\u5bec\u624e
-currenciesDisplayName.PTC=\u8461\u8404\u7259 \u5eb7\u62d6
+currenciesDisplayName.AOR=\u5b89\u54e5\u62c9\u65b0\u5bec\u624e Reajustado (1995-1999)
+currenciesDisplayName.UYU=\u70cf\u62c9\u572d\u62ab\u7d22
+currenciesDisplayName.GBP=\u82f1\u938a
+currenciesDisplayName.BIF=\u84b2\u9686\u5730\u6cd5\u90ce
+currenciesDisplayName.INR=\u5370\u5ea6\u76e7\u5e03
+currenciesDisplayName.ZRZ=\u624e\u4f0a\u723e\u624e\u4f0a\u723e
+currenciesDisplayName.AON=\u5b89\u54e5\u62c9\u65b0\u5bec\u624e (1990-2000)
currenciesDisplayName.LTL=\u7acb\u9676\u5b9b\u91cc\u5854
+currenciesDisplayName.XFU=\u6cd5\u570b UIC \u6cd5\u90ce
currenciesDisplayName.KZT=\u5361\u624e\u514b\u65af\u5766\u5766\u5409
-currenciesDisplayName.KZR=\u5361\u624e\u514b\u65af\u5766\u76e7\u5e03
-currenciesDisplayName.VGD=\u82f1\u5c6c\u7dad\u723e\u65af\u7fa4\u5cf6\u5143
-currenciesDisplayName.NGP=\u5948\u53ca\u5229\u4e9e\u938a
-currenciesDisplayName.MMX=\u7dec\u7538\u7f8e\u5143\u5916\u532f\u5238
-currenciesDisplayName.NGN=\u5948\u53ca\u5229\u4e9e\u5948\u62c9
+currenciesDisplayName.MZM=\u83ab\u4e09\u6bd4\u514b\u6885\u8482\u5361\u723e
+currenciesDisplayName.UYP=\u70cf\u62c9\u572d\u62ab\u7d22 (1975-1993)
+currenciesDisplayName.AOK=\u5b89\u54e5\u62c9\u5bec\u624e(1977-1990)
+currenciesDisplayName.BUK=\u7dec\u7538\u5143
+currenciesDisplayName.GNS=\u5e7e\u5167\u4e9e\u897f\u91cc
+currenciesDisplayName.XFO=\u6cd5\u570b\u91d1\u6cd5\u90ce
+currenciesDisplayName.PGK=\u5df4\u5e03\u4e9e\u7d10\u5e7e\u5167\u4e9e\u57fa\u90a3
currenciesDisplayName.SYP=\u6558\u5229\u4e9e\u938a
-currenciesDisplayName.PSP=\u5df4\u52d2\u65af\u5766\u938a
-currenciesDisplayName.BHD=\u5df4\u6797\u7b2c\u7d0d\u723e
+currenciesDisplayName.MZE=\u83ab\u6851\u6bd4\u514b\u57c3\u65af\u5eab\u591a
+currenciesDisplayName.OMR=\u963f\u66fc\u91cc\u5967
+currenciesDisplayName.NGN=\u5948\u53ca\u5229\u4e9e\u5948\u62c9
+currenciesDisplayName.ZRN=\u85a9\u4f0a\u624e\u65b0\u4f0a\u723e
+currenciesDisplayName.AOA=\u5b89\u54e5\u62c9\u5bec\u624e
+currenciesDisplayName.CNY=\u4eba\u6c11\u5e63
+currenciesDisplayName.GNF=\u5e7e\u5167\u4e9e\u6cd5\u90ce
currenciesDisplayName.MMK=\u7dec\u7538\u5143
+currenciesDisplayName.MYR=\u99ac\u4f86\u897f\u4e9e - \u6797\u5409\u7279
+currenciesDisplayName.LSL=\u8cf4\u7d22\u6258\u7f85\u8482
+currenciesDisplayName.XEU=\u6b50\u6d32\u8ca8\u5e63\u55ae\u4f4d
+currenciesDisplayName.BHD=\u5df4\u6797\u7b2c\u7d0d\u723e
+currenciesDisplayName.SLL=\u7345\u5b50\u5c71\u5229\u6602
+currenciesDisplayName.KMF=\u79d1\u6469\u7f85\u6cd5\u90ce
currenciesDisplayName.ANG=\u8377\u862d \u5b89\u68af\u862d \u76fe
currenciesDisplayName.CZK=\u6377\u514b\u514b\u6717
-currenciesDisplayName.IMP=\u66fc\u57ce\u5cf6\u82f1\u938a
-currenciesDisplayName.BGX=\u4fdd\u52a0\u5229\u4e9e\u5217\u5f17\u5916\u532f\u5238
-currenciesDisplayName.LSL=\u8cf4\u7d22\u6258\u7f85\u8482
-currenciesDisplayName.GAF=\u52a0\u84ec\u897f\u975e\u6cd5\u90ce
-currenciesDisplayName.BGO=\u4fdd\u52a0\u5229\u4e9e\u5217\u5f17 (1879-1952)
+currenciesDisplayName.AZM=\u963f\u585e\u62dc\u5f4a\u99ac\u7279\u7d0d
+currenciesDisplayName.KYD=\u958b\u66fc\u7fa4\u5cf6\u7f8e\u5143
+currenciesDisplayName.GMD=\u7518\u6bd4\u4e9e\u9054\u62c9\u897f
currenciesDisplayName.BGN=\u4fdd\u52a0\u5229\u4e9e\u65b0\u5217\u5f17
-currenciesDisplayName.BGM=\u4fdd\u52a0\u5229\u4e9e \u793e\u6703\u4e3b\u7fa9\u5217\u5f17
currenciesDisplayName.CAD=\u52a0\u5e63
+currenciesDisplayName.MXV=\u58a8\u897f\u54e5\u6cd5\u5f8b\u53cd\u8f49(UDI)
currenciesDisplayName.BGL=\u4fdd\u52a0\u5229\u4e9e\u786c\u5217\u5f17
-currenciesDisplayName.KYD=\u958b\u66fc\u7fa4\u5cf6\u7f8e\u5143
-currenciesDisplayName.CYP=\u8cfd\u6d66\u8def\u65af\u938a
+currenciesDisplayName.VEB=\u59d4\u5167\u745e\u62c9\u535a\u5229\u74e6
+currenciesDisplayName.MLF=\u99ac\u91cc\u6cd5\u90ce
currenciesDisplayName.ILS=\u4ee5\u8272\u5217\u65b0\u8b1d\u514b\u723e
+currenciesDisplayName.MXP=\u58a8\u897f\u54e5\u9280\u62ab\u7d22 (1861-1992)
+currenciesDisplayName.PES=\u79d8\u9b6f\u592a\u967d\u5e63
currenciesDisplayName.GYD=\u572d\u4e9e\u90a3\u5143
-currenciesDisplayName.AMD=\u4e9e\u7f8e\u5c3c\u4e9e\u5fb7\u62c9\u59c6
+currenciesDisplayName.MXN=\u58a8\u897f\u54e5 - \u62ab\u7d22
currenciesDisplayName.ILP=\u4ee5\u8272\u5217\u938a
-currenciesDisplayName.MLF=\u99ac\u91cc\u6cd5\u90ce
-currenciesDisplayName.ILL=\u4ee5\u8272\u5217\u8b1d\u5ba2\u723e
-currenciesDisplayName.VEB=\u59d4\u5167\u745e\u62c9\u535a\u5229\u74e6
-currenciesDisplayName.ALX=\u963f\u723e\u5df4\u5c3c\u4e9e\u5143\u5916\u532f\u5238
+currenciesDisplayName.SKK=\u65af\u6d1b\u4f10\u514b\u514b\u6717
+currenciesDisplayName.CYP=\u8cfd\u6d66\u8def\u65af\u938a
+currenciesDisplayName.XDR=\u7279\u6b8a\u63d0\u6b3e\u6b0a
+currenciesDisplayName.PEN=\u79d8\u9b6f\u65b0\u592a\u967d\u5e63
currenciesDisplayName.LRD=\u8cf4\u6bd4\u745e\u4e9e\u5143
-currenciesDisplayName.ALV=\u963f\u723e\u5df4\u5c3c\u4e9e\u5217\u514b\u5e63
+currenciesDisplayName.PEI=\u7955\u9b6f\u56e0\u8482
+currenciesDisplayName.AMD=\u4e9e\u7f8e\u5c3c\u4e9e\u5fb7\u62c9\u59c6
+currenciesDisplayName.BSD=\u5df4\u54c8\u99ac\u5143
currenciesDisplayName.HRK=\u514b\u7f85\u5730\u4e9e\u5eab\u7d0d
-currenciesDisplayName.REF=\u7559\u5c3c\u6c6a\u5cf6\u6cd5\u90ce
+currenciesDisplayName.CLP=\u667a\u5229\u62ab\u7d22
currenciesDisplayName.HRD=\u514b\u7f85\u5730\u4e9e\u7b2c\u7d0d\u723e
-currenciesDisplayName.ALL=\u963f\u723e\u5df4\u5c3c\u4e9e\u5217\u514b
-currenciesDisplayName.JEP=\u6fa4\u897f\u938a
-currenciesDisplayName.ALK=\u963f\u723e\u5df4\u5c3c\u4e9e\u5217\u514b (1946-1961)
-currenciesDisplayName.MKN=\u99ac\u5176\u9813\u7b2c\u7d0d\u723e(1992-1993)
-currenciesDisplayName.VDP=\u5317\u8d8a\u5357 \u540d \u76ae\u963f\u65af\u7279\u8d8a\u5357\u76fe
-currenciesDisplayName.VDN=\u5317\u8d8a\u5357\u65b0\u76fe
-currenciesDisplayName.MKD=\u99ac\u5176\u9813\u7b2c\u7d0d\u723e
-currenciesDisplayName.VDD=\u5317\u8d8a\u5357 \u76ae\u963f\u65af\u7279\u8d8a\u5357\u76fe
-currenciesDisplayName.TPP=\u5e1d\u6c76\u5143
currenciesDisplayName.XPF=CFP \u6cd5\u90ce
-currenciesDisplayName.BEL=\u6bd4\u5229\u6642\u6cd5\u90ce \uff08\u91d1\u878d\uff09
-currenciesDisplayName.GWP=\u5e7e\u5167\u4e9e\u62ab\u7d22\u62ab\u7d22
-currenciesDisplayName.KWD=\u79d1\u5a01\u7279\u7b2c\u7d0d\u723e
-currenciesDisplayName.GWM=\u8461\u5c6c\u5e7e\u5167\u4e9e\u7c73\u723e\u91cc\u65af
-currenciesDisplayName.BEF=\u6bd4\u5229\u6642\u6cd5\u90ce
+currenciesDisplayName.FRF=\u6cd5\u570b\u6cd5\u90ce
+currenciesDisplayName.BRR=\u5df4\u897f\u514b\u9b6f\u8cfd\u7f85
+currenciesDisplayName.MKD=\u99ac\u5176\u9813\u7b2c\u7d0d\u723e
+currenciesDisplayName.CLF=\u5361\u6797\u6cb9\u9054\u4f5b\u66fc\u8dce
+currenciesDisplayName.ALL=\u963f\u723e\u5df4\u5c3c\u4e9e\u5217\u514b
+currenciesDisplayName.BRN=\u5df4\u897f \u514b\u5982\u723e\u9054 \u8fb2\u74e6
+currenciesDisplayName.MWK=\u99ac\u62c9\u7dad\u514b\u74e6\u67e5
+currenciesDisplayName.BRL=\u5df4\u897f\u91cc\u62c9
currenciesDisplayName.TPE=\u5e1d\u6c76 \u57c3\u65af\u5eab\u591a
-currenciesDisplayName.BEC=\u6bd4\u5229\u6642\u6cd5\u90ce \uff08\u53ef\u8f49\u63db\uff09
-currenciesDisplayName.GWE=\u8461\u5c6c\u5e7e\u5167\u4e9e\u57c3\u65af\u5eab\u591a
+currenciesDisplayName.BRE=\u5df4\u897f\u514b\u9b6f\u8cfd\u7f85 (1990-1993)
+currenciesDisplayName.BRC=\u5df4\u897f\u514b\u9b6f\u8cfd\u7f85 (1986-1989)
+currenciesDisplayName.BRB=\u5df4\u897f\u514b\u9b6f\u85a9\u591a \u8fb2\u74e6 (1967-1986)
+currenciesDisplayName.DEM=\u5fb7\u570b\u99ac\u514b
+currenciesDisplayName.KWD=\u79d1\u5a01\u7279\u7b2c\u7d0d\u723e
+currenciesDisplayName.XCD=\u683c\u745e\u90a3\u9054\u5143
+currenciesDisplayName.NPR=\u5c3c\u6cca\u723e\u76e7\u5e03
+currenciesDisplayName.GWP=\u5e7e\u5167\u4e9e\u62ab\u7d22\u62ab\u7d22
+currenciesDisplayName.YUN=\u5357\u65af\u62c9\u592b \u53ef\u8f49\u63db\u7b2c\u7d0d\u723e
currenciesDisplayName.SVC=\u611b\u723e \u85a9\u723e\u74e6\u591a\u79d1\u90ce
-currenciesDisplayName.CWG=\u5eab\u62c9\u514b \u76fe
-currenciesDisplayName.BDT=\u5b5f\u52a0\u62c9\u5854\u5361
-currenciesDisplayName.TOS=\u6e6f\u52a0\u82f1\u938a
-currenciesDisplayName.TOP=\u6771\u52a0\u6f58\u52a0
+currenciesDisplayName.YUM=\u5357\u65af\u62c9\u592b\u632a\u5a01\u4e9e\u7b2c\u7d0d\u723e
+currenciesDisplayName.BEL=\u6bd4\u5229\u6642\u6cd5\u90ce \uff08\u91d1\u878d\uff09
+currenciesDisplayName.SIT=\u65af\u6d1b\u7dad\u5c3c\u4e9e\u6258\u52d2
+currenciesDisplayName.JPY=\u65e5\u5713
currenciesDisplayName.XOF=\u897f\u975e \u6cd5\u90ce BCEAO
+currenciesDisplayName.MVR=\u99ac\u723e\u5730\u592b\u6d77\u5cf6\u76e7\u975e\u4e9e
+currenciesDisplayName.GWE=\u8461\u5c6c\u5e7e\u5167\u4e9e\u57c3\u65af\u5eab\u591a
+currenciesDisplayName.BEF=\u6bd4\u5229\u6642\u6cd5\u90ce
+currenciesDisplayName.TOP=\u6771\u52a0\u6f58\u52a0
+currenciesDisplayName.YUD=\u5357\u65af\u62c9\u592b\u7b2c\u7d0d\u723e\u786c\u5e63
+currenciesDisplayName.BEC=\u6bd4\u5229\u6642\u6cd5\u90ce \uff08\u53ef\u8f49\u63db\uff09
currenciesDisplayName.SUR=\u8607\u806f\u76e7\u5e03
-currenciesDisplayName.SUN=\u8607\u806f\u65b0\u76e7\u5e03
-currenciesDisplayName.NCF=\u8d6b\u5e03\u91cc\u5e95\u7fa4\u5cf6 CFP \u6cd5\u90ce
-currenciesDisplayName.CVE=\u7dad\u5fb7\u89d2\u57c3\u65af\u5eab\u591a
-currenciesDisplayName.XNF=\u6cd5\u570b\u5b89\u7684\u5217\u65af\u7fa4\u5cf6 \u897f\u975e \u6cd5\u90ce
+currenciesDisplayName.ROL=\u7f85\u99ac\u5c3c\u4e9e\u5217\u4f0a
+currenciesDisplayName.DDM=\u6771\u5fb7\u6771\u5fb7\u99ac\u514b
+currenciesDisplayName.BDT=\u5b5f\u52a0\u62c9\u5854\u5361
+currenciesDisplayName.XBD=\u6b50\u6d32\u6703\u8a08\u55ae\u4f4d(XBD)
+currenciesDisplayName.AWG=\u963f\u9b6f\u5df4\u76fe
+currenciesDisplayName.XBC=\u6b50\u6d32\u6703\u8a08\u55ae\u4f4d(XBC)
+currenciesDisplayName.XBB=\u6b50\u6d32\u8ca8\u5e63\u55ae\u4f4d
+currenciesDisplayName.XBA=\u6b50\u6d32\u7d9c\u5408\u55ae\u4f4d
+currenciesDisplayName.NOK=\u632a\u5a01\u514b\u7f85\u7d0d
+currenciesDisplayName.MUR=\u6a21\u91cc\u897f\u65af\u76e7\u5e03
currenciesDisplayName.ZAR=\u5357\u975e\u862d\u7279
-currenciesDisplayName.DOP=\u591a\u660e\u5c3c\u52a0\u62ab\u7d22
-currenciesDisplayName.CUX=\u53e4\u5df4\u4eba\u5916\u532f\u5238
-currenciesDisplayName.ZAP=\u5357\u975e\u938a
+currenciesDisplayName.SHP=\u8056\u8d6b\u52d2\u62ff \u938a
+currenciesDisplayName.XAU=\u9ec3\u91d1
currenciesDisplayName.ZAL=\u5357\u975e - \u862d\u7279 (\u91d1\u878d)
+currenciesDisplayName.TZS=\u5766\u6851\u5c3c\u4e9e \u5148\u4ee4
+currenciesDisplayName.GIP=\u76f4\u5e03\u7f85\u9640\u938a
currenciesDisplayName.TND=\u7a81\u5c3c\u897f\u4e9e\u7b2c\u7d0d\u723e
-currenciesDisplayName.CUP=\u53e4\u5df4\u62ab\u7d22
-currenciesDisplayName.GUF=\u6cd5\u5c6c\u572d\u4e9e\u90a3\u6cd5\u90ce\u572d\u4e9e\u90a3
+currenciesDisplayName.CVE=\u7dad\u5fb7\u89d2\u57c3\u65af\u5eab\u591a
currenciesDisplayName.UGX=\u70cf\u5e72\u9054\u5148\u4ee4
-currenciesDisplayName.LNR=\u932b\u862d\u76e7\u5e03
-currenciesDisplayName.AIF=\u963f\u6cd5\u723e\u548c\u4f0a\u85a9\u6cd5\u90ce
-currenciesDisplayName.VAL=\u68b5\u8482\u5ca1\u57ce\u91cc\u62c9
-currenciesDisplayName.STE=\u8056\u591a\u7f8e\u5cf6\u548c\u666e\u6797\u897f\u6bd4\u5cf6\u57c3\u65af\u5eab\u591a
+currenciesDisplayName.ZMK=\u5c1a\u6bd4\u4e9e\u514b\u74e6\u67e5
+currenciesDisplayName.JOD=\u7d04\u65e6\u7b2c\u7d0d\u723e
+currenciesDisplayName.XAF=\u897f\u975e \u6cd5\u90ce BEAC
+currenciesDisplayName.LBP=\u9ece\u5df4\u5ae9\u938a
currenciesDisplayName.UGS=\u70cf\u5e72\u9054\u5148\u4ee4 (1966-1987)
currenciesDisplayName.STD=\u8056\u591a\u7f8e\u5cf6\u548c\u666e\u6797\u897f\u6bd4\u5cf6\u591a\u5e03\u62c9
-currenciesDisplayName.MHD=\u99ac\u7d39\u723e\u7fa4\u5cf6\u7f8e\u5143
-currenciesDisplayName.NZP=\u7d10\u897f\u862d\u938a
currenciesDisplayName.WST=\u897f\u85a9\u6469\u4e9e\u5854\u62c9
-currenciesDisplayName.WSP=\u897f\u85a9\u6469\u4e9e\u938a
-currenciesDisplayName.HNL=\u6d2a\u90fd\u62c9\u65af\u502b\u76ae\u62c9
-currenciesDisplayName.XMF=\u6cd5\u570b\u5927\u57ce\u5e02\u65b0 \u6cd5\u90ce
+currenciesDisplayName.KHR=\u67ec\u57d4\u5be8\u745e\u723e
+currenciesDisplayName.EUR=\u6b50\u5143
+currenciesDisplayName.DOP=\u591a\u660e\u5c3c\u52a0\u62ab\u7d22
+currenciesDisplayName.BOV=\u73bb\u5229\u7dad\u4e9e \u5e55\u591a
+currenciesDisplayName.MTP=\u99ac\u723e\u4ed6\u938a
+currenciesDisplayName.BOP=\u73bb\u5229\u7dad\u4e9e\u62ab\u7d22
+currenciesDisplayName.MTL=\u99ac\u723e\u4ed6\u91cc\u62c9
+currenciesDisplayName.CUP=\u53e4\u5df4\u62ab\u7d22
currenciesDisplayName.TMM=\u571f\u5eab\u66fc\u99ac\u7d0d\u7279
-currenciesDisplayName.GTQ=\u74dc\u5730\u99ac\u62c9\u683c\u67e5\u723e
+currenciesDisplayName.USN=\u7f8e\u5143 (\u7b2c\u4e8c\u5929)
+currenciesDisplayName.SGD=\u65b0\u52a0\u5761\u5e63
currenciesDisplayName.NZD=\u7d10\u897f\u862d\u5e63
-currenciesDisplayName.SSP=\u8607\u683c\u862d\u938a
-currenciesDisplayName.BBD=\u5df4\u8c9d\u591a\u5143
+currenciesDisplayName.HNL=\u6d2a\u90fd\u62c9\u65af\u502b\u76ae\u62c9
+currenciesDisplayName.BOB=\u73bb\u5229\u7dad\u4e9e\u8ca8\u5e63\u55ae\u4f4d
+currenciesDisplayName.ITL=\u7fa9\u5927\u5229\u91cc\u62c9
+currenciesDisplayName.PAB=\u5df4\u62ff\u99ac\u5df4\u6ce2\u4e9e
+currenciesDisplayName.GTQ=\u74dc\u5730\u99ac\u62c9\u683c\u67e5\u723e
+currenciesDisplayName.LAK=\u8001\u64be \u958b\u666e
+currenciesDisplayName.GHC=\u8fe6\u7d0d\u4ed9\u8515
+currenciesDisplayName.AUD=\u6fb3\u5e63
currenciesDisplayName.NAD=\u7d0d\u7c73\u6bd4\u4e9e\u5143
+currenciesDisplayName.KGS=\u5409\u723e\u5409\u65af\u7d22\u99ac
currenciesDisplayName.MGF=\u99ac\u9054\u52a0\u65af\u52a0\u6cd5\u90ce
+currenciesDisplayName.BBD=\u5df4\u8c9d\u591a\u5143
currenciesDisplayName.MGA=\u99ac\u9054\u52a0\u65af\u52a0\u827e\u745e\u723e
-currenciesDisplayName.EGP=\u57c3\u53ca\u938a
-currenciesDisplayName.BZH=\u82f1\u570b\u7684\u6d2a\u90fd\u62c9\u65af\u5143r
+currenciesDisplayName.PYG=\u5df4\u62c9\u572d\u74dc\u62c9\u5c3c
currenciesDisplayName.PLZ=\u6ce2\u862d\u8332\u7f85\u63d0 (1950-1995)
-currenciesDisplayName.BAN=\u6ce2\u58eb\u5c3c\u4e9e-\u9ed1\u585e\u54e5\u7dad\u90a3\u65b0\u7b2c\u7d0d\u723e
-currenciesDisplayName.PLX=\u6ce2\u862d\u7f8e\u5143\u5916\u532f\u5238
-currenciesDisplayName.BAM=\u6ce2\u58eb\u5c3c\u4e9e-\u9ed1\u585e\u54e5\u7dad\u90a3\u53ef\u8f49\u63db\u99ac\u514b
-currenciesDisplayName.BZD=\u4f2f\u5229\u8332\u5143
-currenciesDisplayName.BAD=\u6ce2\u58eb\u5c3c\u4e9e-\u9ed1\u585e\u54e5\u7dad\u90a3\u7b2c\u7d0d\u723e
-currenciesDisplayName.PLN=\u6ce2\u862d\u8332\u7f85\u63d0
currenciesDisplayName.YER=\u4e5f\u9580\u91cc\u4e9e\u723e
+currenciesDisplayName.ATS=\u5967\u5730\u5229\u5148\u4ee4
+currenciesDisplayName.ETB=\u8863\u7d22\u6bd4\u4e9e\u6bd4\u723e
+currenciesDisplayName.BND=\u6c76\u840a\u5143
+currenciesDisplayName.JMD=\u7259\u8cb7\u52a0\u5143
+currenciesDisplayName.EGP=\u57c3\u53ca\u938a
+currenciesDisplayName.PLN=\u6ce2\u862d\u8332\u7f85\u63d0
+currenciesDisplayName.DZD=\u963f\u723e\u53ca\u5229\u4e9e\u7b2c\u7d0d\u723e
+currenciesDisplayName.ISK=\u51b0\u5cf6\u514b\u6717
currenciesDisplayName.SRG=\u8607\u91cc\u5357\u76fe
-currenciesDisplayName.CSK=\u6377\u514b\u65af\u6d1b\u4f10\u514b\u786c\u514b\u6717
+currenciesDisplayName.LYD=\u5229\u6bd4\u4e9e\u7b2c\u7d0d\u723e
+currenciesDisplayName.BZD=\u4f2f\u5229\u8332\u5143
+currenciesDisplayName.BAM=\u6ce2\u58eb\u5c3c\u4e9e-\u9ed1\u585e\u54e5\u7dad\u90a3\u53ef\u8f49\u63db\u99ac\u514b
+currenciesDisplayName.ESP=\u897f\u73ed\u7259\u966a\u58eb\u7279
currenciesDisplayName.KRW=\u97d3\u570b\u571c
+currenciesDisplayName.NLG=\u8377\u862d\u76fe
+currenciesDisplayName.MRO=\u8305\u5229\u5854\u5c3c\u4e9e\u70cf\u5409\u4e9e
+currenciesDisplayName.BAD=\u6ce2\u58eb\u5c3c\u4e9e-\u9ed1\u585e\u54e5\u7dad\u90a3\u7b2c\u7d0d\u723e
+currenciesDisplayName.ZWD=\u8f9b\u5df4\u5a01\u5143
+currenciesDisplayName.SEK=\u745e\u5178\u514b\u7f85\u7d0d
+currenciesDisplayName.CSK=\u6377\u514b\u65af\u6d1b\u4f10\u514b\u786c\u514b\u6717
currenciesDisplayName.BYR=\u767d\u4fc4\u7f85\u65af\u76e7\u5e03
-currenciesDisplayName.YEI=\u4e5f\u9580\u963f\u99ac\u8fea\u91cc\u4e9e\u723e
-currenciesDisplayName.BYL=\u767d\u4fc4\u7f85\u65af\u76e7\u5e03 (1992-1994)
-currenciesDisplayName.CSC=\u6377\u514b\u514b\u6717
-currenciesDisplayName.KRO=\u5357\u97d3\u820a\u5e63
-currenciesDisplayName.KRH=\u97d3\u570b \u54c8\u74e6
-currenciesDisplayName.BYB=\u767d\u4fc4\u7f85\u65af\u65b0\u76e7\u5e03 (1994-1999)
-currenciesDisplayName.SQS=\u7d22\u99ac\u91cc\u862d\u5148\u4ee4
-currenciesDisplayName.GRN=\u5e0c\u81d8\u65b0\u5fb7\u62c9\u514b\u99ac
+currenciesDisplayName.IRR=\u4f0a\u6717\u91cc\u4e9e\u723e
currenciesDisplayName.PKR=\u5df4\u57fa\u65af\u5766\u76e7\u5e03
-currenciesDisplayName.ZWD=\u8f9b\u5df4\u5a01\u5143
-currenciesDisplayName.LKR=\u65af\u91cc\u862d\u5361\u76e7\u5e03
-currenciesDisplayName.GRD=\u5e0c\u81d8\u5fb7\u62c9\u514b\u99ac
-currenciesDisplayName.IEP=\u611b\u723e\u862d\u938a
-currenciesDisplayName.YDD=\u8449\u9580\u7b2c\u7d0d\u723e
-currenciesDisplayName.RWF=\u76e7\u5b89\u9054\u6cd5\u90ce
-currenciesDisplayName.CRC=\u54e5\u65af\u5927\u9ece\u52a0\u79d1\u90ce
-currenciesDisplayName.TJS=\u5854\u5409\u514b\u65af\u5766 \u7d22\u83ab\u5c3c
-currenciesDisplayName.TJR=\u5854\u5409\u514b\u65af\u5766\u76e7\u5e03
-currenciesDisplayName.EEK=\u611b\u6c99\u5c3c\u4e9e\u514b\u6717
-currenciesDisplayName.GQP=\u8d64\u9053\u5e7e\u5167\u4e9e\u6bd4\u585e\u5854
-currenciesDisplayName.MDR=\u6469\u675c\u96f2\u76e7\u5e03\u5eab\u65c1
-currenciesDisplayName.DKK=\u4e39\u9ea5\u514b\u7f85\u7d0d
-currenciesDisplayName.MDL=\u6469\u675c\u96f2\u5217\u4f0a
-currenciesDisplayName.GQF=\u8d64\u9053\u5e7e\u5167\u4e9e\u4f5b\u6717\u54e5
-currenciesDisplayName.GQE=\u8d64\u9053\u5e7e\u5167\u4e9e\u57c3\u594e\u52d2
-currenciesDisplayName.IDR=\u5370\u5c3c - \u76e7\u5e03
-currenciesDisplayName.AED=\u963f\u62c9\u4f2f\u806f\u5408\u5927\u516c\u570b\u8fea\u723e\u6c57
-currenciesDisplayName.KPW=\u5317\u671d\u9bae\u5e63
-currenciesDisplayName.IDN=\u5370\u5ea6\u5c3c\u897f\u4e9e\u65b0\u76e7\u5e03
-currenciesDisplayName.BWP=\u6ce2\u672d\u90a3 - \u666e\u62c9
-currenciesDisplayName.MDC=\u6469\u675c\u96f2\u5217\u4f0a\u5eab\u65c1
-currenciesDisplayName.IDJ=\u5370\u5ea6\u5c3c\u897f\u4e9e\u722a\u54c7\u76e7\u5e03
-currenciesDisplayName.KPP=\u5317\u671d\u9bae\u4eba\u6c11\u5e63
-currenciesDisplayName.IDG=\u5370\u5ea6\u5c3c\u897f\u4e9e\u5c3c\u53ef\u76fe
-currenciesDisplayName.VUV=\u842c\u90a3\u675c\u842c\u675c
-currenciesDisplayName.XID=\u4f0a\u65af\u862d\u7b2c\u7d0d\u723e
-currenciesDisplayName.SOS=\u7d22\u99ac\u5229\u4e9e\u5148\u4ee4
-currenciesDisplayName.ADP=\u5b89\u9053\u723e\u966a\u58eb\u7279
-currenciesDisplayName.RUR=\u4fc4\u7f85\u65af\u76e7\u5e03 (1991-1998)
-currenciesDisplayName.GPF=\u74dc\u5fb7\u7f85\u666e\u5cf6\u6cd5\u90ce
-currenciesDisplayName.DJF=\u5409\u5e03\u5730\u6cd5\u90ce
-currenciesDisplayName.ADD=\u5b89\u9053\u723e\u7b2c\u7d0d\u723e
-currenciesDisplayName.MCG=\u6469\u7d0d\u54e5\u6cd5\u90ce \u5091\u7c73\u90a3
-currenciesDisplayName.MCF=\u6469\u7d0d\u54e5\u65b0\u6cd5\u90ce
-currenciesDisplayName.ECV=\u5384\u74dc\u591a\u723e\u7531\u91cc\u9054\u74e6\u5eb7\u65af\u5766 (UVC)
-currenciesDisplayName.ECS=\u5384\u74dc\u591a\u8607\u514b\u96f7
-currenciesDisplayName.LIF=\u5217\u652f\u6566\u65af\u767b\u6cd5\u90ce
-currenciesDisplayName.RUB=\u4fc4\u7f85\u65af\u76e7\u5e03
-currenciesDisplayName.PHP=\u83f2\u5f8b\u8cd3\u62ab\u7d22
-currenciesDisplayName.UZS=\u70cf\u8332\u5225\u514b\u65af\u5766 \u85a9\u6728
-currenciesDisplayName.COP=\u54e5\u502b\u6bd4\u4e9e\u62ab\u7d22
-currenciesDisplayName.THB=\u6cf0\u9296
-currenciesDisplayName.IBP=\u5317\u611b\u723e\u862d\u938a
-currenciesDisplayName.BUR=\u7dec\u7538\u76e7\u5e03
-currenciesDisplayName.COF=\u525b\u679c\u897f\u975e\u6cd5\u90ce
-currenciesDisplayName.BUK=\u7dec\u7538\u5143
-currenciesDisplayName.COB=\u54e5\u502b\u6bd4\u4e9e\u62ab\u7d22\u9214
-currenciesDisplayName.UZC=\u70cf\u8332\u5225\u514b\u65af\u5766 \u5eab\u90a6 \u7d22\u99ac
-currenciesDisplayName.UAK=\u70cf\u514b\u862d \u5361\u672c\u74e6\u90a3\u8332
-currenciesDisplayName.QAR=\u5361\u9054\u723e\u91cc\u4e9e\u723e
-currenciesDisplayName.UAH=\u70cf\u514b\u862d\u683c\u91cc\u592b\u90a3
-currenciesDisplayName.GNS=\u5e7e\u5167\u4e9e\u897f\u91cc
-currenciesDisplayName.CNY=\u4eba\u6c11\u5e63
-currenciesDisplayName.MZM=\u83ab\u4e09\u6bd4\u514b\u6885\u8482\u5361\u723e
-currenciesDisplayName.CNX=\u4e2d\u570b\u7f8e\u5143\u5916\u532f\u5238
-currenciesDisplayName.UYU=\u70cf\u62c9\u572d\u62ab\u7d22
-currenciesDisplayName.GNI=\u5e7e\u5167\u4e9e\u6cd5\u90ce (1960-1972)
-currenciesDisplayName.SML=\u8056\u99ac\u5229\u8afe\u91cc\u62c9
-currenciesDisplayName.MZE=\u83ab\u6851\u6bd4\u514b\u57c3\u65af\u5eab\u591a
-currenciesDisplayName.CNP=\u4e2d\u570b\u4eba\u6c11\u5e63\u5143
-currenciesDisplayName.PGK=\u5df4\u5e03\u4e9e\u7d10\u5e7e\u5167\u4e9e\u57fa\u90a3
-currenciesDisplayName.OMS=\u963f\u66fc\u91cc\u4e9e\u723e\u4ed9\u8515i
-currenciesDisplayName.GNF=\u5e7e\u5167\u4e9e\u6cd5\u90ce
-currenciesDisplayName.UYP=\u70cf\u62c9\u572d\u62ab\u7d22 (1975-1993)
-currenciesDisplayName.OMR=\u963f\u66fc\u91cc\u5967
-currenciesDisplayName.XFU=\u6cd5\u570b UIC \u6cd5\u90ce
-currenciesDisplayName.BTR=\u4e0d\u4e39\u76e7\u5e03
-currenciesDisplayName.ZRZ=\u624e\u4f0a\u723e\u624e\u4f0a\u723e
-currenciesDisplayName.XFO=\u6cd5\u570b\u91d1\u6cd5\u90ce
-currenciesDisplayName.UYF=\u70cf\u62c9\u572d\u62ab\u7d22\u798f\u5384\u7279
-currenciesDisplayName.MYR=\u99ac\u4f86\u897f\u4e9e - \u6797\u5409\u7279
-currenciesDisplayName.ZRN=\u85a9\u4f0a\u624e\u65b0\u4f0a\u723e
-currenciesDisplayName.AZM=\u963f\u585e\u62dc\u5f4a\u99ac\u7279\u7d0d
-currenciesDisplayName.GMP=\u5ca1\u6bd4\u4e9e\u938a
-currenciesDisplayName.KMF=\u79d1\u6469\u7f85\u6cd5\u90ce
-currenciesDisplayName.SLL=\u7345\u5b50\u5c71\u5229\u6602
-currenciesDisplayName.GMD=\u7518\u6bd4\u4e9e\u9054\u62c9\u897f
-currenciesDisplayName.XEU=\u6b50\u6d32\u8ca8\u5e63\u55ae\u4f4d
-currenciesDisplayName.BSP=\u5df4\u54c8\u99ac\u938a
-currenciesDisplayName.CMF=\u5361\u9ea5\u9686\u897f\u975e\u6cd5\u90ce
-currenciesDisplayName.MXV=\u58a8\u897f\u54e5\u6cd5\u5f8b\u53cd\u8f49(UDI)
-currenciesDisplayName.XEF=\u897f\u975e \u6cd5\u90ce BCEAEC
-currenciesDisplayName.BSD=\u5df4\u54c8\u99ac\u5143
-currenciesDisplayName.MXP=\u58a8\u897f\u54e5\u9280\u62ab\u7d22 (1861-1992)
-currenciesDisplayName.MXN=\u58a8\u897f\u54e5 - \u62ab\u7d22
-currenciesDisplayName.PES=\u79d8\u9b6f\u592a\u967d\u5e63
-currenciesDisplayName.GLK=\u683c\u9675\u862d\u514b\u7f85\u9209
-currenciesDisplayName.BRZ=\u5df4\u897f\u514b\u9b6f\u8cfd\u7f85 (1942-1967)
-currenciesDisplayName.PEN=\u79d8\u9b6f\u65b0\u592a\u967d\u5e63
-currenciesDisplayName.CLP=\u667a\u5229\u62ab\u7d22
-currenciesDisplayName.SKK=\u65af\u6d1b\u4f10\u514b\u514b\u6717
-currenciesDisplayName.PEI=\u7955\u9b6f\u56e0\u8482
-currenciesDisplayName.BRR=\u5df4\u897f\u514b\u9b6f\u8cfd\u7f85
-currenciesDisplayName.XDR=\u7279\u6b8a\u63d0\u6b3e\u6b0a
-currenciesDisplayName.FRG=\u6cd5\u570b\u6cd5\u90ce \u6377\u7c73\u90a3/\u9f90\u52a0\u840a\u6cd5\u90ce
-currenciesDisplayName.FRF=\u6cd5\u570b\u6cd5\u90ce
-currenciesDisplayName.BRN=\u5df4\u897f \u514b\u5982\u723e\u9054 \u8fb2\u74e6
-currenciesDisplayName.CLF=\u5361\u6797\u6cb9\u9054\u4f5b\u66fc\u8dce
-currenciesDisplayName.CLE=\u667a\u5229\u57c3\u65af\u5eab\u591a
-currenciesDisplayName.BRL=\u5df4\u897f\u91cc\u62c9
-currenciesDisplayName.CLC=\u667a\u5229 \u5eb7\u5c0e
-currenciesDisplayName.BRE=\u5df4\u897f\u514b\u9b6f\u8cfd\u7f85 (1990-1993)
-currenciesDisplayName.DES=\u5fb7\u570b \u8607\u99ac\u514bSperrmark
-currenciesDisplayName.MWP=\u99ac\u62c9\u7dad\u938a
-currenciesDisplayName.BRC=\u5df4\u897f\u514b\u9b6f\u8cfd\u7f85 (1986-1989)
-currenciesDisplayName.BRB=\u5df4\u897f\u514b\u9b6f\u85a9\u591a \u8fb2\u74e6 (1967-1986)
-currenciesDisplayName.MWK=\u99ac\u62c9\u7dad\u514b\u74e6\u67e5
-currenciesDisplayName.PDR=\u8eca\u57ce\u76e7\u5e03
-currenciesDisplayName.DEM=\u5fb7\u570b\u99ac\u514b
-currenciesDisplayName.TDF=\u4e4d\u5f97 \u897f\u975e \u6cd5\u90ce
-currenciesDisplayName.PDN=\u8eca\u57ce\u65b0\u76e7\u5e03
-currenciesDisplayName.PDK=\u8eca\u57ce\u76e7\u5e03 Kupon
-currenciesDisplayName.NPR=\u5c3c\u6cca\u723e\u76e7\u5e03
-currenciesDisplayName.CKD=\u5eab\u514b\u7fa4\u5cf6\u5143
-currenciesDisplayName.JPY=\u65e5\u5713
-currenciesDisplayName.MVR=\u99ac\u723e\u5730\u592b\u6d77\u5cf6\u76e7\u975e\u4e9e
-currenciesDisplayName.XCF=\u897f\u975e \u65b0 \u6cd5\u90ce
-currenciesDisplayName.MVP=\u99ac\u723e\u5730\u592b\u76e7\u5e03
-currenciesDisplayName.XCD=\u683c\u745e\u90a3\u9054\u5143
-currenciesDisplayName.SIT=\u65af\u6d1b\u7dad\u5c3c\u4e9e\u6258\u52d2
-currenciesDisplayName.YUR=\u5357\u65af\u62c9\u592b\u6539\u5236\u5f8c\u7684\u7b2c\u7d0d\u723e
-currenciesDisplayName.AWG=\u963f\u9b6f\u5df4\u76fe
-currenciesDisplayName.YUO=\u5357\u65af\u62c9\u592b\u5341\u6708 \u7b2c\u7d0d\u723e
-currenciesDisplayName.DDM=\u6771\u5fb7\u6771\u5fb7\u99ac\u514b
-currenciesDisplayName.YUN=\u5357\u65af\u62c9\u592b \u53ef\u8f49\u63db\u7b2c\u7d0d\u723e
-currenciesDisplayName.YUM=\u5357\u65af\u62c9\u592b\u632a\u5a01\u4e9e\u7b2c\u7d0d\u723e
-currenciesDisplayName.TCC=\u571f\u8033\u5176\u4eba\u548c\u51f1\u79d1\u65af\u51a0
-currenciesDisplayName.YUG=\u5357\u65af\u62c9\u592b\u4eba1994 \u7b2c\u7d0d\u723e
-currenciesDisplayName.YUF=\u5357\u65af\u62c9\u592b\u806f\u90a6\u7b2c\u7d0d\u723e
-currenciesDisplayName.RON=\u7f85\u99ac\u5c3c\u4e9e\u65b0\u5217\u4f0a
-currenciesDisplayName.YUD=\u5357\u65af\u62c9\u592b\u7b2c\u7d0d\u723e\u786c\u5e63
-currenciesDisplayName.ROL=\u7f85\u99ac\u5c3c\u4e9e\u5217\u4f0a
-currenciesDisplayName.SIB=\u65af\u6d1b\u6587\u5c3c\u4e9e Tolar Bons
-currenciesDisplayName.NOK=\u632a\u5a01\u514b\u7f85\u7d0d
-currenciesDisplayName.MUR=\u6a21\u91cc\u897f\u65af\u76e7\u5e03
-currenciesDisplayName.XBD=\u6b50\u6d32\u6703\u8a08\u55ae\u4f4d(XBD)
-currenciesDisplayName.GIP=\u76f4\u5e03\u7f85\u9640\u938a
-currenciesDisplayName.VNS=\u8d8a\u5357\u570b\u5bb6\u76fe
-currenciesDisplayName.XBC=\u6b50\u6d32\u6703\u8a08\u55ae\u4f4d(XBC)
-currenciesDisplayName.VNR=\u8d8a\u5357\u5171\u548c\u570b \u76fe
-currenciesDisplayName.XBB=\u6b50\u6d32\u8ca8\u5e63\u55ae\u4f4d
-currenciesDisplayName.XBA=\u6b50\u6d32\u7d9c\u5408\u55ae\u4f4d
-currenciesDisplayName.SHP=\u8056\u8d6b\u52d2\u62ff \u938a
-currenciesDisplayName.VNN=\u8d8a\u5357\u65b0\u76fe
-currenciesSymbol.GBP=GBP
-currenciesSymbol.XOF=XOF
-currenciesSymbol.TDF=TDF
-currenciesSymbol.ECV=ECV
-currenciesSymbol.XAF=XAF
+currenciesDisplayName.BMD=\u767e\u6155\u9054\u5e63
+currenciesSymbol.MOP=MOP
+currenciesSymbol.SGD=SGD
+currenciesSymbol.KRW=KRW
currenciesSymbol.NZD=$NZ
currenciesSymbol.EUR=EUR
-currenciesSymbol.XPF=XPF
-currenciesSymbol.XTR=XTR
-currenciesSymbol.KRW=KRW
-currenciesSymbol.BOV=BOV
-currenciesSymbol.SGD=SGD
-currenciesSymbol.XEF=XEF
-currenciesSymbol.XBD=XBD
-currenciesSymbol.XFU=XFU
-currenciesSymbol.XBC=XBC
-currenciesSymbol.MXV=MXV
-currenciesSymbol.CNY=CNY
-currenciesSymbol.MOP=MOP
-currenciesSymbol.GAF=GAF
-currenciesSymbol.AZM=AZM
-currenciesSymbol.XCF=XCF
+currenciesSymbol.GBP=GBP
shortDateFormat=yyyy/M/d
mediumDateFormat=yyyy/M/d
longDateFormat=yyyy'\u5e74'M'\u6708'd'\u65e5'
@@ -401,7 +250,7 @@ shortTimeFormat=a h:mm
mediumTimeFormat=a h:mm:ss
longTimeFormat=ahh'\u6642'mm'\u5206'ss'\u79d2'
fullTimeFormat=ahh'\u6642'mm'\u5206'ss'\u79d2' z
-zoneStrings=America/Indianapolis®\u6771\u90e8\u6a19\u6e96\u6642\u9593®\u6771\u90e8\u6a19\u6e96\u6642\u9593®©America/Halifax®\u5927\u897f\u6d0b\u6a19\u6e96\u6642\u9593®\u5927\u897f\u6d0b\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Pacific/Honolulu®\u590f\u5a01\u5937\u6a19\u6e96\u6642\u9593®\u590f\u5a01\u5937\u6a19\u6e96\u6642\u9593®©America/Denver®\u5c71\u5340\u6a19\u6e96\u6642\u9593®\u5c71\u5340\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©America/Anchorage®\u963f\u62c9\u65af\u52a0\u6a19\u6e96\u6642\u9593®\u963f\u62c9\u65af\u52a0\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©America/St_Johns®\u7d10\u82ac\u862d\u6a19\u6e96\u6642\u9593®\u7d10\u82ac\u862d\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Africa/Casablanca®\u683c\u6797\u5a01\u6cbb\u6a19\u6e96\u6642\u9593®\u683c\u6797\u5a01\u6cbb\u6a19\u6e96\u6642\u9593®©America/Chicago®\u4e2d\u90e8\u6a19\u6e96\u6642\u9593®\u4e2d\u90e8\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Asia/Shanghai®\u4e2d\u570b\u6a19\u6e96\u6642\u9593®\u4e2d\u570b\u6a19\u6e96\u6642\u9593®©Asia/Tokyo®\u65e5\u672c\u6a19\u6e96\u6642\u9593®\u65e5\u672c\u6a19\u6e96\u6642\u9593®©America/New_York®\u6771\u90e8\u6a19\u6e96\u6642\u9593®\u6771\u90e8\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Europe/Bucharest®\u6771\u6b50\u6a19\u6e96\u6642\u9593®\u6771\u6b50\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©America/Los_Angeles®\u592a\u5e73\u6d0b\u6a19\u6e96\u6642\u9593®\u592a\u5e73\u6d0b\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©America/Phoenix®\u5c71\u5340\u6a19\u6e96\u6642\u9593®\u5c71\u5340\u6a19\u6e96\u6642\u9593®©Etc/GMT®\u683c\u6797\u5a01\u6cbb\u6a19\u6e96\u6642\u9593®\u683c\u6797\u5a01\u6cbb\u6a19\u6e96\u6642\u9593®©Asia/Jerusalem®\u4ee5\u8272\u5217\u6a19\u6e96\u6642\u9593®\u4ee5\u8272\u5217\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Europe/Paris®\u4e2d\u6b50\u6a19\u6e96\u6642\u9593®\u4e2d\u6b50\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©
+zoneStrings=America/Halifax®\u5927\u897f\u6d0b\u6a19\u6e96\u6642\u9593®\u5927\u897f\u6d0b\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©America/Indianapolis®\u6771\u90e8\u6a19\u6e96\u6642\u9593®\u6771\u90e8\u6a19\u6e96\u6642\u9593®©Europe/Paris®\u4e2d\u6b50\u6a19\u6e96\u6642\u9593®\u4e2d\u6b50\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©America/Phoenix®\u5c71\u5340\u6a19\u6e96\u6642\u9593®\u5c71\u5340\u6a19\u6e96\u6642\u9593®©America/Los_Angeles®\u592a\u5e73\u6d0b\u6a19\u6e96\u6642\u9593®\u592a\u5e73\u6d0b\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Pacific/Honolulu®\u590f\u5a01\u5937\u6a19\u6e96\u6642\u9593®\u590f\u5a01\u5937\u6a19\u6e96\u6642\u9593®©America/Denver®\u5c71\u5340\u6a19\u6e96\u6642\u9593®\u5c71\u5340\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Europe/Bucharest®\u6771\u6b50\u6a19\u6e96\u6642\u9593®\u6771\u6b50\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©America/New_York®\u6771\u90e8\u6a19\u6e96\u6642\u9593®\u6771\u90e8\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Asia/Tokyo®\u65e5\u672c\u6a19\u6e96\u6642\u9593®\u65e5\u672c\u6a19\u6e96\u6642\u9593®©America/Anchorage®\u963f\u62c9\u65af\u52a0\u6a19\u6e96\u6642\u9593®\u963f\u62c9\u65af\u52a0\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Asia/Shanghai®\u4e2d\u570b\u6a19\u6e96\u6642\u9593®\u4e2d\u570b\u6a19\u6e96\u6642\u9593®©America/Chicago®\u4e2d\u90e8\u6a19\u6e96\u6642\u9593®\u4e2d\u90e8\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Africa/Casablanca®\u683c\u6797\u5a01\u6cbb\u6a19\u6e96\u6642\u9593®\u683c\u6797\u5a01\u6cbb\u6a19\u6e96\u6642\u9593®©America/St_Johns®\u7d10\u82ac\u862d\u6a19\u6e96\u6642\u9593®\u7d10\u82ac\u862d\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©Asia/Jerusalem®\u4ee5\u8272\u5217\u6a19\u6e96\u6642\u9593®\u4ee5\u8272\u5217\u65e5\u5149\u7bc0\u7d04\u6642\u9593®©
territories.TL=\u6771\u5e1d\u6587
territories.TK=\u6258\u514b\u52de\u7fa4\u5cf6
territories.TJ=\u5854\u5409\u514b
@@ -424,7 +273,9 @@ territories.GN=\u5e7e\u5167\u4e9e
territories.GM=\u7518\u6bd4\u4e9e
territories.GL=\u683c\u9675\u862d
territories.SV=\u85a9\u723e\u74e6\u591a
+territories.062=\u4e2d\u5357\u4e9e
territories.ST=\u8056\u591a\u7f8e\u53ca\u666e\u6797\u897f\u6bd4
+territories.061=\u73bb\u91cc\u5c3c\u897f\u4e9e
territories.GI=\u76f4\u5e03\u7f85\u9640
territories.GH=\u8fe6\u7d0d
territories.SR=\u8607\u5229\u5357
@@ -445,9 +296,12 @@ territories.SC=\u585e\u5e2d\u723e
territories.SB=\u7d22\u7f85\u9580\u7fa4\u5cf6
territories.SA=\u6c99\u70cf\u5730\u963f\u62c9\u4f2f
territories.FR=\u6cd5\u570b
+territories.057=\u5bc6\u514b\u7f85\u5c3c\u897f\u4e9e
territories.FO=\u6cd5\u7f85\u7fa4\u5cf6
territories.FM=\u5bc6\u514b\u7f85\u5c3c\u897f\u4e9e\u7fa4\u5cf6
territories.RW=\u76e7\u5b89\u9054
+territories.054=\u7f8e\u62c9\u5c3c\u897f\u4e9e
+territories.053=\u6fb3\u6d32\u8207\u7d10\u897f\u862d
territories.FK=\u798f\u514b\u862d\u7fa4\u5cf6
territories.RU=\u4fc4\u7f85\u65af
territories.FJ=\u6590\u6fdf
@@ -456,16 +310,22 @@ territories.RO=\u7f85\u99ac\u5c3c\u4e9e
territories.RE=\u7559\u5c3c\u65fa
territories.ET=\u8863\u7d22\u6bd4\u4e9e
territories.ER=\u5384\u5229\u5782\u4e9e
+territories.833=\u66fc\u5cf6
+territories.830=\u6d77\u5cfd\u7fa4\u5cf6
territories.EE=\u611b\u6c99\u5c3c\u4e9e
+territories.QO=\u5927\u6d0b\u6d32\u908a\u7586\u7fa4\u5cf6
territories.EC=\u5384\u74dc\u591a\u723e
territories.DZ=\u963f\u723e\u53ca\u5229\u4e9e
territories.QA=\u5361\u9054
+territories.039=\u5357\u6b50
territories.DO=\u591a\u660e\u5c3c\u52a0\u5171\u548c\u570b
+territories.035=\u6771\u5357\u4e9e
territories.DM=\u591a\u660e\u5c3c\u52a0
territories.PW=\u5e1b\u7409
territories.DK=\u4e39\u9ea5
territories.DJ=\u5409\u5e03\u5730
territories.PS=\u5df4\u52d2\u65af\u5766
+territories.030=\u6771\u4e9e
territories.PR=\u73bb\u591a\u9ece\u514b
territories.DE=\u5fb7\u570b
territories.PN=\u76ae\u7279\u5eb7
@@ -480,6 +340,7 @@ territories.CY=\u8cfd\u666e\u52d2\u65af
territories.CX=\u8056\u8a95\u5cf6
territories.CV=\u7dad\u5fb7\u89d2
territories.PA=\u5df4\u62ff\u99ac
+territories.CS=\u585e\u723e\u7dad\u4e9e\u548c\u8499\u7279\u5c3c\u54e5\u7f85
territories.CR=\u54e5\u65af\u5927\u9ece\u52a0
territories.CO=\u54e5\u502b\u6bd4\u4e9e
territories.CN=\u4e2d\u83ef\u4eba\u6c11\u5171\u548c\u570b
@@ -500,6 +361,7 @@ territories.NZ=\u7d10\u897f\u862d
territories.BO=\u73bb\u5229\u7dad\u4e9e
territories.BN=\u6c76\u840a
territories.BM=\u767e\u6155\u9054
+territories.014=\u6771\u975e
territories.NU=\u7d10\u5a01\u5cf6
territories.BJ=\u8c9d\u5357
territories.BI=\u6d66\u9686\u5730
@@ -517,36 +379,36 @@ territories.NG=\u5948\u53ca\u5229\u4e9e
territories.NF=\u8afe\u798f\u514b\u5cf6
territories.AZ=\u4e9e\u585e\u62dc\u7136
territories.NE=\u5c3c\u65e5
+territories.AX=\u4e9e\u862d\u7fa4\u5cf6
territories.NC=\u65b0\u5580\u91cc\u591a\u5c3c\u4e9e\u7fa4\u5cf6
territories.AW=\u963f\u8def\u5df4
territories.ZM=\u5c1a\u6bd4\u4e9e
-territories.AU=\u6fb3\u6d32
territories.NA=\u7d0d\u7c73\u6bd4\u4e9e
+territories.AU=\u6fb3\u6d32
territories.AT=\u5967\u5730\u5229
territories.AS=\u7f8e\u5c6c\u85a9\u6469\u4e9e\u7fa4\u5cf6
territories.AQ=\u5357\u6975\u6d32
territories.MZ=\u83ab\u4e09\u6bd4\u514b
-territories.MY=\u99ac\u4f86\u897f\u4e9e
territories.AN=\u8377\u5c6c\u5b89\u5730\u5217\u65af
+territories.MY=\u99ac\u4f86\u897f\u4e9e
territories.AM=\u4e9e\u7f8e\u5c3c\u4e9e
-territories.MW=\u99ac\u62c9\u5a01
territories.AL=\u963f\u723e\u5df4\u5c3c\u4e9e
+territories.MW=\u99ac\u62c9\u5a01
territories.MV=\u99ac\u723e\u5730\u592b
territories.MU=\u6a21\u91cc\u897f\u65af
-territories.MT=\u99ac\u723e\u4ed6
territories.AI=\u5b89\u572d\u62c9\u5cf6
+territories.MT=\u99ac\u723e\u4ed6
territories.MS=\u8499\u7279\u8272\u62c9\u7279\u5cf6
-territories.MR=\u8305\u5229\u5854\u5c3c\u4e9e
territories.AG=\u5b89\u5730\u5361\u53ca\u5df4\u5e03\u9054
+territories.MR=\u8305\u5229\u5854\u5c3c\u4e9e
territories.MQ=\u99ac\u4e01\u5c3c\u514b\u5cf6
-territories.MP=\u5317\u99ac\u91cc\u5b89\u7d0d
territories.AE=\u963f\u62c9\u4f2f\u806f\u5408\u5927\u516c\u570b
-territories.MO=\u4e2d\u83ef\u4eba\u6c11\u5171\u548c\u570b\u6fb3\u9580\u7279\u5225\u884c\u653f\u5340
+territories.MP=\u5317\u99ac\u91cc\u5b89\u7d0d
territories.AD=\u5b89\u9053\u723e
+territories.MO=\u4e2d\u83ef\u4eba\u6c11\u5171\u548c\u570b\u6fb3\u9580\u7279\u5225\u884c\u653f\u5340
territories.MM=\u7dec\u7538
territories.ML=\u99ac\u5229
territories.MK=\u99ac\u5176\u9813
-territories.YU=\u585e\u723e\u7dad\u4e9e
territories.YT=\u99ac\u7d04\u7279
territories.MH=\u99ac\u7d39\u723e\u7fa4\u5cf6
territories.MG=\u99ac\u9054\u52a0\u65af\u52a0
@@ -554,16 +416,22 @@ territories.MD=\u6469\u723e\u591a\u74e6
territories.MC=\u6469\u7d0d\u54e5
territories.YE=\u8449\u9580
territories.LY=\u5229\u6bd4\u4e9e
+territories.155=\u897f\u6b50
territories.LV=\u62c9\u812b\u7dad\u4e9e
+territories.154=\u5317\u6b50
territories.LU=\u76e7\u68ee\u5821
territories.LS=\u8cf4\u7d22\u6265
+territories.151=\u6771\u6b50
territories.LR=\u8cf4\u6bd4\u745e\u4e9e
+territories.150=\u6b50\u6d32
territories.LK=\u65af\u91cc\u862d\u5361
territories.LI=\u5217\u652f\u6566\u65af\u767b
territories.LC=\u8056\u9732\u897f\u4e9e
territories.LA=\u5bee\u570b
territories.KZ=\u54c8\u85a9\u514b
territories.KY=\u958b\u66fc\u7fa4\u5cf6
+territories.145=\u897f\u4e9e
+territories.142=\u4e9e\u6d32
territories.KR=\u5357\u97d3
territories.KP=\u5317\u97d3
territories.KN=\u8056\u514b\u91cc\u65af\u591a\u798f\u53ca\u5c3c\u7dad\u65af
@@ -623,16 +491,16 @@ languages.wa=\u74e6\u9686\u6587
languages.kum=\u5eab\u5bc6\u514b\u6587
languages.zap=\u85a9\u6ce2\u7279\u514b\u6587
languages.cus=\u5eab\u65bd\u7279\u8a9e\u7cfb\uff08\u5176\u4ed6\uff09
-languages.jbo=\u908f\u8f2f\u6587
languages.doi=\u591a\u683c\u4f86\u6587
+languages.jbo=\u908f\u8f2f\u6587
languages.oto=\u5967\u6258\u7c73\u6587
languages.vai=\u8d8a\u5357\u6587
languages.rar=\u62c9\u7f85\u901a\u52a0\u6587
languages.ve=\u6eab\u9054\u6587
languages.rap=\u5fa9\u6d3b\u5cf6\u6587
languages.raj=\u62c9\u8cc8\u65af\u5766\u8af8\u6587
-languages.ota=\u9102\u5716\u66fc\u571f\u8033\u5176\u6587 (1500-1928)
languages.nzi=\u5c3c\u8332\u99ac\u6587
+languages.ota=\u9102\u5716\u66fc\u571f\u8033\u5176\u6587 (1500-1928)
languages.uz=\u70cf\u8332\u5225\u514b\u6587
languages.uga=\u70cf\u52a0\u5217\u6587
languages.tmh=\u5854\u99ac\u5947\u514b\u6587
@@ -644,10 +512,10 @@ languages.egy=\u53e4\u57c3\u53ca\u6587)
languages.ug=\u7dad\u543e\u723e\u6587
languages.fan=\u82b3\u65cf\u6587
languages.ssa=\u975e\u6d32\u6492\u54c8\u62c9\u6c99\u6f20\u908a\u7de3\u5730\u5e36\u6587
-languages.mga=\u611b\u723e\u862d\u6587\uff0c\u4e2d\u53e4 (900-1200)
languages.bat=\u6ce2\u7f85\u7684\u6587\uff08\u5176\u4ed6\uff09
-languages.nyo=\u5c3c\u5967\u56c9\u6587
+languages.mga=\u611b\u723e\u862d\u6587\uff0c\u4e2d\u53e4 (900-1200)
languages.bas=\u5df4\u85a9\u6587
+languages.nyo=\u5c3c\u5967\u56c9\u6587
languages.nyn=\u5c3c\u63da\u79d1\u840a\u6587
languages.nym=\u5c3c\u63da\u97cb\u9f4a\u6587
languages.hmn=\u5b5f\u6587
@@ -665,8 +533,8 @@ languages.tk=\u571f\u5eab\u66fc\u6587
languages.ti=\u63d0\u683c\u5229\u5c3c\u4e9e\u6587
languages.kru=\u5eab\u9b6f\u79d1\u6587
languages.te=\u6cf0\u76e7\u56fa\u6587
-languages.kro=\u514b\u9b6f\u6587
languages.csb=\u5361\u8212\u5e03\u6587
+languages.kro=\u514b\u9b6f\u6587
languages.ta=\u5766\u7c73\u723e\u6587
languages.tkl=\u6258\u514b\u52de\u6587
languages.efi=\u57c3\u83f2\u514b\u6587
@@ -685,8 +553,8 @@ languages.grc=\u53e4\u5e0c\u81d8\u6587 (\u81f3 1453)
languages.grb=\u54e5\u535a\u8a9e
languages.si=\u50e7\u4f3d\u7f85\u6587
languages.sh=\u585e\u723e\u7dad\u4e9e\u514b\u7f85\u57c3\u897f\u4e9e\u6587
-languages.crh=\u514b\u91cc\u7c73\u4e9e\u534a\u5cf6\u7684\u571f\u8033\u5176\u6587\uff1b\u514b\u91cc\u7c73\u4e9e\u534a\u5cf6\u7684\u5854\u5854\u723e\u6587
languages.afa=\u975e\u9583\u65cf\u53ca\u975e\u4e9e\u8a9e\u8a00
+languages.crh=\u514b\u91cc\u7c73\u4e9e\u534a\u5cf6\u7684\u571f\u8033\u5176\u6587\uff1b\u514b\u91cc\u7c73\u4e9e\u534a\u5cf6\u7684\u5854\u5854\u723e\u6587
languages.se=\u5317\u65b9\u85a9\u7c73\u6587
languages.sd=\u8607\u4e39\u6587
languages.udm=\u6c83\u8482\u827e\u514b\u6587
@@ -703,14 +571,14 @@ languages.tig=\u8482\u683c\u96f7\u6587
languages.cpp=\u6b50\u6d32\u8154\u8abf\u548c\u6d0b\u6d87\u6ff1\uff0c\u6e90\u81ea\u8461\u8404\u7259\u6587\u7684(\u5176\u4ed6)
languages.sog=\u7d22\u683c\u5e95\u4e9e\u7d0d\u6587
languages.ada=\u963f\u7576\u83ab\u6587
-languages.kos=\u79d1\u65af\u96f7\u6069\u6587
-languages.hit=\u8d6b\u68af\u6587
languages.cpf=\u6b50\u6d32\u8154\u8abf\u548c\u6d0b\u6d87\u6ff1\uff0c\u6e90\u81ea\u6cd5\u6587\u7684(\u5176\u4ed6)
+languages.hit=\u8d6b\u68af\u6587
+languages.kos=\u79d1\u65af\u96f7\u6069\u6587
languages.cpe=\u6b50\u6d32\u8154\u8abf\u548c\u6d0b\u6d87\u6ff1\uff0c\u6e90\u81ea\u82f1\u6587\u7684(\u5176\u4ed6)
languages.him=\u8d6b\u99ac\u67e5\u5229\u6587
-languages.kok=\u8ca2\u6839\u6587
-languages.hil=\u5e0c\u5229\u84cb\u8fb2\u6587
languages.got=\u54e5\u7279\u6587
+languages.hil=\u5e0c\u5229\u84cb\u8fb2\u6587
+languages.kok=\u8ca2\u6839\u6587
languages.gor=\u79d1\u9686\u9054\u7f85\u6587
languages.gon=\u5ca1\u5fb7\u6587
languages.nub=\u52aa\u6bd4\u4e9e\u6587
@@ -720,30 +588,30 @@ languages.goh=\u5fb7\u6587,\u4e0a\u53e4\u5168\u76db\u6642\u671f (ca.750-1050)
languages.ach=\u963f\u50d1\u5229\u6587
languages.yao=\u7464\u6587
languages.phi=\u5176\u4ed6\u83f2\u5f8b\u8cd3\u6587
-languages.ace=\u4e9e\u9f4a\u6587
languages.pl=\u6ce2\u862d\u6587
+languages.ace=\u4e9e\u9f4a\u6587
languages.pi=\u5df4\u5229\u6587
languages.bug=\u5e03\u5409\u65af\u6587
languages.sms=\u65af\u79d1\u7279\u85a9\u7c73\u6587
languages.bua=\u5e03\u91cc\u963f\u7279\u6587
languages.mas=\u99ac\u8cfd\u6587
languages.smn=\u4f0a\u7d0d\u88e1\u85a9\u7c73\u6587
-languages.map=\u5357\u5cf6\u6587
languages.os=\u5967\u585e\u63d0\u6587
+languages.map=\u5357\u5cf6\u6587
languages.or=\u6b50\u91cc\u4e9e\u6587
languages.smj=\u9b6f\u52d2\u85a9\u7c73\u6587
languages.smi=\u5176\u4ed6\u85a9\u7c73\u6587
languages.mak=\u671b\u52a0\u932b\u6587
languages.mai=\u9081\u8482\u5229\u6587
-languages.mag=\u99ac\u52a0\u4f0a\u6587
languages.oj=\u5967\u6770\u5e03\u74e6\u6587
+languages.mag=\u99ac\u52a0\u4f0a\u6587
languages.mad=\u99ac\u90fd\u62c9\u6587
languages.sma=\u5357\u85a9\u7c73\u6587
languages.oc=\u5967\u897f\u5766\u6587
languages.myv=\u5384\u723e\u8332\u4e9e\u6587
languages.dgr=\u591a\u683c\u91cc\u5e03\u6587
-languages.myn=\u99ac\u96c5\u6587
languages.ny=\u5c3c\u63da\u8cc8\u6587
+languages.myn=\u99ac\u96c5\u6587
languages.nv=\u7d0d\u74e6\u7d04\u6587
languages.nr=\u5357\u5730\u7562\u5217\u6587
languages.gmh=\u5fb7\u6587, \u4e2d\u53e4\u5168\u76db\u6642\u671f (ca.1050-1500)
@@ -761,12 +629,12 @@ languages.tem=\u63d0\u59c6\u6587
languages.my=\u7dec\u7538\u6587
languages.lez=\u7acb\u9676\u5b9b\u6587
languages.mt=\u99ac\u723e\u4ed6\u6587
-languages.peo=\u53e4\u6ce2\u65af\u6587 (ca.600-400 B.C.)
languages.ms=\u99ac\u4f86\u6587
+languages.peo=\u53e4\u6ce2\u65af\u6587 (ca.600-400 B.C.)
languages.mr=\u99ac\u62c9\u5730\u6587
languages.mo=\u6469\u723e\u591a\u74e6\u6587
-languages.jrb=\u7336\u592a\u6559-\u963f\u62c9\u4f2f\u6587
languages.ml=\u99ac\u4f86\u4e9e\u62c9\u59c6\u6587
+languages.jrb=\u7336\u592a\u6559-\u963f\u62c9\u4f2f\u6587
languages.mk=\u99ac\u5176\u9813\u6587
languages.mh=\u99ac\u7d39\u723e\u6587
languages.mg=\u99ac\u723e\u52a0\u4ec0\u6587
@@ -792,8 +660,8 @@ languages.kn=\u574e\u90a3\u9054\u6587
languages.km=\u9ad8\u68c9\u6587
languages.kl=\u683c\u9675\u862d\u6587
languages.kk=\u54c8\u85a9\u514b\u6587
-languages.kj=\u5ee3\u4e9e\u99ac\u6587
languages.rom=\u5409\u666e\u8cfd\u6587
+languages.kj=\u5ee3\u4e9e\u99ac\u6587
languages.sid=\u5e0c\u9054\u6469\u6587
languages.ki=\u5409\u5eab\u5c24\u4eba
languages.kg=\u525b\u679c\u6587
@@ -811,44 +679,44 @@ languages.fon=\u8c50\u6587
languages.xal=\u5361\u723e\u6885\u514b\u6587
languages.aus=\u6fb3\u6d32\u82f1\u6587
languages.kho=\u548c\u95d0[\u8207\u95d0]\u6587
-languages.pau=\u5e1b\u7409\u6587
languages.chy=\u6c99\u4f0a\u5b89\u6587
+languages.pau=\u5e1b\u7409\u6587
languages.iu=\u56e0\u7d10\u7279\u6587
-languages.it=\u7fa9\u5927\u5229\u6587
languages.pap=\u5e15\u76ae\u963f\u9580\u6258\u6587
+languages.it=\u7fa9\u5927\u5229\u6587
languages.sgn=\u624b\u8a9e
languages.is=\u51b0\u5cf6\u6587
languages.chr=\u67f4\u7f85\u57fa\u6587
languages.pam=\u6f58\u5e15\u5609\u6587
-languages.pal=\u5df4\u5217\u7dad\u6587
languages.chp=\u5947\u4f69\u74e6\u63da\u6587
-languages.io=\u4f0a\u6717\u6587
+languages.pal=\u5df4\u5217\u7dad\u6587
languages.cho=\u55ac\u514b\u6258\u6587
+languages.io=\u4f0a\u6717\u6587
languages.chn=\u5951\u5974\u514b\u6587
languages.chm=\u99ac\u91cc\u6587
languages.tyv=\u571f\u51e1\u6587
languages.bnt=\u73ed\u5716\u6587
-languages.ik=\u4f9d\u5974\u76ae\u7dad\u514b\u6587
-languages.pag=\u6f58\u52a0\u8f9b\u6587
languages.chk=\u8655\u5947\u65af\u6587
+languages.pag=\u6f58\u52a0\u8f9b\u6587
+languages.ik=\u4f9d\u5974\u76ae\u7dad\u514b\u6587
languages.ii=\u56db\u5ddd\u8a71
languages.lam=\u862d\u5df4\u6587
languages.ig=\u4f0a\u5e03\u6587
languages.sga=\u53e4\u611b\u723e\u862d\u6587\uff08\u81f3 900\uff09
-languages.ie=\u62c9\u4e01\u570b\u969b\u6587
languages.paa=\u5176\u4ed6\u5df4\u5e03\u4e9e\u8af8\u8a9e\u8a00
+languages.ie=\u62c9\u4e01\u570b\u969b\u6587
languages.id=\u5370\u5c3c\u6587
languages.lah=\u62c9\u4ea8\u9054\u6587
-languages.day=\u8fea\u96c5\u514b\u6587
languages.chb=\u5947\u5e03\u67e5\u6587
+languages.day=\u8fea\u96c5\u514b\u6587
languages.ia=\u62c9\u4e01\u570b\u969b\u6587
languages.lad=\u62c9\u8fea\u8afe\u6587
-languages.hz=\u8d6b\u96f7\u7f85\u6587
-languages.hai=\u6d77\u9054\u6587
languages.dar=\u9054\u723e\u683c\u74e6\u6587
+languages.hai=\u6d77\u9054\u6587
+languages.hz=\u8d6b\u96f7\u7f85\u6587
languages.hy=\u4e9e\u7f8e\u5c3c\u4e9e\u6587
languages.ath=\u963f\u85a9\u5df4\u65af\u5361\u6587
-languages.ht=\u6d77\u5730\u4eba
+languages.ht=\u6d77\u5730\u6587
languages.dak=\u9054\u79d1\u4ed6\u6587
languages.hr=\u514b\u7f85\u57c3\u897f\u4e9e\u6587
languages.ho=\u897f\u91cc\u83ab\u5716\u571f\u6587
@@ -859,18 +727,18 @@ languages.wen=\u6587\u5fb7\u6587
languages.gv=\u66fc\u5cf6\u6587
languages.gu=\u5409\u4e9e\u62c9\u5854\u6587
languages.sem=\u5176\u4ed6\u9583\u65cf\u8a9e\u8a00
-languages.iro=\u6613\u6d1b\u9b41\u6587
languages.sel=\u745f\u723e\u5361\u666e\u6587
+languages.iro=\u6613\u6d1b\u9b41\u6587
languages.gl=\u52a0\u91cc\u897f\u4e9e\u6587
-languages.gez=\u5409\u8332\u6587
-languages.art=\u5176\u4ed6\u4eba\u5de5\u8a9e\u8a00
languages.gd=\u8607\u683c\u862d - \u84cb\u723e\u6587
+languages.art=\u5176\u4ed6\u4eba\u5de5\u8a9e\u8a00
+languages.gez=\u5409\u8332\u6587
languages.ira=\u4f0a\u82b3\u6717\u6587
languages.ga=\u611b\u723e\u862d\u6587
languages.arn=\u963f\u52de\u574e\u6587
languages.fy=\u5f17\u91cc\u65af\u862d\u6587
languages.bla=\u932b\u514b\u932b\u5361\u6587
-languages.gem=\u5fb7\u570b\u7684(\u5176\u4ed6)
+languages.gem=\u5fb7\u570b\u6587(\u5176\u4ed6)
languages.ypk=\u611b\u65af\u57fa\u6469\u6587
languages.fo=\u6cd5\u7f85\u6587
languages.cel=\u514b\u723e\u7279\u6587\uff08\u5176\u4ed6\uff09
@@ -887,10 +755,10 @@ languages.niu=\u7d10\u57c3\u6587
languages.tup=\u5716\u76ae\u6587
languages.ee=\u57c3\u7def\u6587
languages.tum=\u5716\u59c6\u5e03\u5361\u6587
-languages.nic=\u5176\u4ed6\u5c3c\u65e5\u525b\u679c\u8a9e\u7cfb
-languages.lus=\u76e7\u6652\u6587
-languages.fiu=\u82ac\u862d-\u70cf\u6208\u723e\u65cf\u6587(\u5176\u4ed6)
languages.dv=\u8fea\u7dad\u897f\u6587
+languages.fiu=\u82ac\u862d-\u70cf\u6208\u723e\u65cf\u6587(\u5176\u4ed6)
+languages.lus=\u76e7\u6652\u6587
+languages.nic=\u5176\u4ed6\u5c3c\u65e5\u525b\u679c\u8a9e\u7cfb
languages.nia=\u5c3c\u4e9e\u65af\u6587
languages.moh=\u83ab\u970d\u514b\u6587
languages.luo=\u76e7\u5967\u6587
@@ -906,27 +774,27 @@ languages.da=\u4e39\u9ea5\u6587
languages.dum=\u8377\u862d\uff0c\u4e2d\u53e4 (ca. 1050-1350)
languages.mno=\u99ac\u8afe\u6ce2\u6587
languages.wak=\u5938\u57fa\u6b66\u7279\u6587
-languages.sat=\u6563\u5854\u5229\u6587
languages.cy=\u5a01\u723e\u58eb\u6587
+languages.sat=\u6563\u5854\u5229\u6587
languages.sas=\u6492\u6492\u514b\u6587
-languages.kbd=\u5361\u5df4\u723e\u9054\u6587
languages.cv=\u695a\u74e6\u751a\u6587
+languages.kbd=\u5361\u5df4\u723e\u9054\u6587
languages.mni=\u66fc\u5c3c\u666e\u88e1\u6587
-languages.sam=\u85a9\u746a\u5229\u4e9e\u963f\u62c9\u59c6\u6587
languages.cr=\u514b\u88e1\u6587
-languages.sal=\u85a9\u5229\u751a\u6587
+languages.sam=\u85a9\u746a\u5229\u4e9e\u963f\u62c9\u59c6\u6587
languages.dua=\u675c\u4e9e\u62c9\u6587
+languages.sal=\u85a9\u5229\u751a\u6587
languages.mnc=\u6eff\u65cf\u6587
languages.sah=\u96c5\u5eab\u7279\u6587
languages.gba=\u845b\u5df4\u4e9e\u6587
languages.sad=\u6851\u9054\u97cb\u6587
languages.ch=\u67e5\u83ab\u6d1b\u6587
-languages.ine=\u5370\u6b50\u8a9e\u7cfb\uff08\u5176\u4ed6\uff09
languages.bho=\u535a\u5091\u666e\u723e\u6587
+languages.ine=\u5370\u6b50\u8a9e\u7cfb\uff08\u5176\u4ed6\uff09
languages.enm=\u82f1\u6587\uff0c\u4e2d\u4e16\u7d00 (1100-1500)
-languages.kar=\u514b\u502b\u6587
-languages.inc=\u5370\u5ea6\u8a9e\u7cfb\uff08\u5176\u4ed6\uff09
languages.ce=\u8eca\u81e3\u6587
+languages.inc=\u5370\u5ea6\u8a9e\u7cfb\uff08\u5176\u4ed6\uff09
+languages.kar=\u514b\u502b\u6587
languages.gay=\u52a0\u7d04\u6587
languages.ca=\u52a0\u6cf0\u7f85\u5c3c\u4e9e\u6587
languages.umb=\u59c6\u672c\u675c\u6587
@@ -935,12 +803,12 @@ languages.tsi=\u6b3d\u897f\u5b89\u6587
languages.ang=\u53e4\u82f1\u6587 (ca.450-1100)
languages.cau=\u9ad8\u52a0\u7d22\u6587\uff08\u5176\u4ed6\uff09
languages.kab=\u5361\u6bd4\u723e\u6587
-languages.kaa=\u5361\u62c9\u5361\u723e\u5e15\u514b\u6587
languages.bs=\u6ce2\u58eb\u5c3c\u4e9e\u6587
+languages.kaa=\u5361\u62c9\u5361\u723e\u5e15\u514b\u6587
languages.bo=\u85cf\u6587
languages.gaa=\u52a0\u65cf\u6587
-languages.cai=\u4e2d\u7f8e\u5370\u7b2c\u5b89\u6587\uff08\u5176\u4ed6\uff09
languages.bi=\u6bd4\u65af\u62c9\u99ac\u6587
+languages.cai=\u4e2d\u7f8e\u5370\u7b2c\u5b89\u6587\uff08\u5176\u4ed6\uff09
languages.bh=\u6bd4\u54c8\u723e\u6587
languages.bg=\u4fdd\u52a0\u5229\u4e9e\u6587
languages.be=\u767d\u4fc4\u7f85\u65af\u6587
@@ -953,12 +821,12 @@ languages.ay=\u827e\u99ac\u62c9\u6587
languages.av=\u963f\u6cd5\u6587
languages.as=\u963f\u85a9\u59c6\u6587
languages.dsb=\u4e0b\u7d22\u5e03\u6587
-languages.ilo=\u4f0a\u6d1b\u95ca\u6587
languages.elx=\u57c3\u862d\u6587
+languages.ilo=\u4f0a\u6d1b\u95ca\u6587
languages.an=\u963f\u62c9\u8ca2\u6587
languages.pra=\u5370\u5ea6\u53e4\u4ee3\u53ca\u4e2d\u4e16\u7d00\u4e4b\u4e2d\u90e8\u53ca\u5317\u90e8\u65b9\u8a00
-languages.new=\u5c3c\u74e6\u723e\u6587
languages.ak=\u963f\u574e\u6587
+languages.new=\u5c3c\u74e6\u723e\u6587
languages.za=\u58ef\u6587
languages.af=\u5357\u975e\u8377\u862d\u6587
languages.ae=\u963f\u7def\u65af\u9640\u6587
diff --git a/resource/java/security/classpath.security b/resource/java/security/classpath.security
index cc7d49378..13d691bfe 100644
--- a/resource/java/security/classpath.security
+++ b/resource/java/security/classpath.security
@@ -35,8 +35,9 @@
# obligated to do so. If you do not wish to do so, delete this
# exception statement from your version.
-
+# Note that the settings and ordering here are mirrored in Security.
security.provider.1=gnu.java.security.provider.Gnu
security.provider.2=gnu.javax.crypto.jce.GnuCrypto
security.provider.3=gnu.javax.crypto.jce.GnuSasl
security.provider.4=gnu.javax.net.ssl.provider.Jessie
+security.provider.5=gnu.javax.security.auth.callback.GnuCallbacks
diff --git a/resource/javax/imageio/plugins/jpeg/MessagesBundle.properties b/resource/javax/imageio/plugins/jpeg/MessagesBundle.properties
new file mode 100644
index 000000000..8141c2a9a
--- /dev/null
+++ b/resource/javax/imageio/plugins/jpeg/MessagesBundle.properties
@@ -0,0 +1,9 @@
+# Localized error messages for javax.imageio.plugins.jpeg
+
+# Compression types
+compression.types.jpeg=JPEG
+
+# Compression quality descriptions
+compression.minimum=Minimum useful
+compression.default=Visually lossless
+compression.maximum=Maximum useful
diff --git a/scripts/generate-locale-list.sh b/scripts/generate-locale-list.sh
index fb55c1c28..3c6809de1 100755
--- a/scripts/generate-locale-list.sh
+++ b/scripts/generate-locale-list.sh
@@ -40,18 +40,30 @@ echo "obligated to do so. If you do not wish to do so, delete this"
echo "exception statement from your version. */"
echo
echo
-echo "package java.util;"
+echo "package gnu.java.locale;"
echo
echo "// This file was automatically generated by scripts/generate-locale-list.sh"
echo
echo
echo "class LocaleData"
echo "{"
-echo " public static String[] localeNames ="
+echo " public static final String[] localeNames ="
echo " {"
( cd $CLASSPATH_SRCDIR/resource/gnu/java/locale ; ls LocaleInformation_*.properties ) | xargs -n 1 echo | sed -e 's/LocaleInformation_\(.*\)\.properties/\1/' |
while read locale ; do echo " \"$locale\"," ; done
echo " };"
+
+echo
+echo " public static final String[] collatorLocaleNames ="
+echo " {"
+
+( cd $CLASSPATH_SRCDIR/resource/gnu/java/locale; grep -l collation_rules LocaleInformation_*.properties) |
+ xargs -n 1 echo | sed -e 's/LocaleInformation_\(.*\)\.properties/\1/' |
+ sed -e '/^$/ d' |
+ while read locale ; do echo " \"$locale\"," ; done
+
+echo " };"
+
echo "}"
diff --git a/tools/.cvsignore b/tools/.cvsignore
index eaae7d326..75730de04 100644
--- a/tools/.cvsignore
+++ b/tools/.cvsignore
@@ -1,3 +1,5 @@
+jarsigner
+keytool
Makefile.in
Makefile
tools.zip
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 65858f52a..7a8f1ce97 100755
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,17 +1,19 @@
## Input file for automake to generate the Makefile.in used by configure
+GLIBJ_CLASSPATH='$(top_builddir)/lib':'$(top_builddir)/lib/glibj.zip'
+
# Setup the compiler to use the GNU Classpath library we just build
if FOUND_GCJ
-JCOMPILER = $(GCJ) --bootclasspath '$(top_builddir)/lib' --classpath . -C
+JCOMPILER = $(GCJ) -encoding UTF-8 --bootclasspath $(GLIBJ_CLASSPATH) --classpath . -C
else
if FOUND_JIKES
-JCOMPILER = $(JIKES) -bootclasspath '' -extdirs '' -sourcepath '' --classpath $(top_builddir)/lib:.
+JCOMPILER = $(JIKES) $(JIKESENCODING) -bootclasspath '' -extdirs '' -sourcepath '' --classpath $(GLIBJ_CLASSPATH):.
else
if FOUND_GCJX
-JCOMPILER = $(GCJX) -bootclasspath '' -sourcepath '' -classpath $(top_builddir)/lib:.
+JCOMPILER = $(GCJX) -encoding UTF-8 -bootclasspath '' -sourcepath '' -classpath $(GLIBJ_CLASSPATH):.
else
if FOUND_ECJ
-JCOMPILER = $(ECJ) -bootclasspath '$(top_builddir)/lib' -classpath .
+JCOMPILER = $(ECJ) -encoding UTF-8 -bootclasspath $(GLIBJ_CLASSPATH) -classpath .
else
error dunno how to setup the JCOMPILER and compile
endif
@@ -19,6 +21,9 @@ endif
endif
endif
+bin_SCRIPTS = jarsigner keytool
+EXTRA_DIST = jarsigner.in keytool.in
+
# All our example java source files
TOOLS_JAVA_FILES = $(srcdir)/gnu/classpath/tools/*.java $(srcdir)/gnu/classpath/tools/*/*.java $(srcdir)/gnu/classpath/tools/*/*/*.java
@@ -30,7 +35,7 @@ TOOLS_ZIP = tools.zip
BUILT_SOURCES = $(TOOLS_ZIP)
# The templates that must be included into the generated zip file.
-GRMIC_TEMPLATES = $(srcdir)/gnu/classpath/tools/giop/grmic/templates/*.jav
+GRMIC_TEMPLATES = $(srcdir)/gnu/classpath/tools/giop/grmic/templates/*.jav
RMIC_TEMPLATES = $(srcdir)/gnu/classpath/tools/rmi/rmic/templates/*.jav
TOOLS_TEMPLATES = $(GRMIC_TEMPLATES) $(RMIC_TEMPLATES)
@@ -38,8 +43,10 @@ TOOLS_TEMPLATES = $(GRMIC_TEMPLATES) $(RMIC_TEMPLATES)
# This covers the built-in help texts, both for giop and rmic subpackages.
GIOP_HELPS = $(srcdir)/gnu/classpath/tools/giop/*.txt
RMI_HELPS = $(srcdir)/gnu/classpath/tools/rmi/*.txt
+JARSIGNER_HELPS = $(srcdir)/gnu/classpath/tools/jarsigner/*.txt
+KEYTOOL_HELPS = $(srcdir)/gnu/classpath/tools/keytool/*.txt
-TOOLS_HELPS = $(GIOP_HELPS) $(RMI_HELPS)
+TOOLS_HELPS = $(GIOP_HELPS) $(RMI_HELPS) $(JARSIGNER_HELPS) $(KEYTOOL_HELPS)
# The tool specific README files.
READMES = $(srcdir)/gnu/classpath/tools/giop/README
@@ -74,11 +81,15 @@ dist-hook:
$(TOOLS_ZIP): $(TOOLS_JAVA_FILES)
mkdir -p classes/gnu/classpath/tools/giop/grmic/templates
mkdir -p classes/gnu/classpath/tools/rmi/rmic/templates
+ mkdir -p classes/gnu/classpath/tools/jarsigner
+ mkdir -p classes/gnu/classpath/tools/keytool
cp $(RMIC_TEMPLATES) classes/gnu/classpath/tools/rmi/rmic/templates
- cp $(GRMIC_TEMPLATES) classes/gnu/classpath/tools/giop/grmic/templates
+ cp $(GRMIC_TEMPLATES) classes/gnu/classpath/tools/giop/grmic/templates
cp $(RMI_HELPS) classes/gnu/classpath/tools/rmi/
cp $(GIOP_HELPS) classes/gnu/classpath/tools/giop/
- $(JCOMPILER) -d classes $(TOOLS_JAVA_FILES)
+ cp $(JARSIGNER_HELPS) classes/gnu/classpath/tools/jarsigner/
+ cp $(KEYTOOL_HELPS) classes/gnu/classpath/tools/keytool/
+ $(JCOMPILER) -d classes $(TOOLS_JAVA_FILES)
(cd classes; \
if test "$(ZIP)" != ""; then $(ZIP) -r ../$(TOOLS_ZIP) .; fi; \
if test "$(FASTJAR)" != ""; then $(FASTJAR) cf ../$(TOOLS_ZIP) .; fi; \
diff --git a/tools/README b/tools/README
index de8c2c5b4..dc049d3b5 100644
--- a/tools/README
+++ b/tools/README
@@ -39,6 +39,20 @@ in gnu.classpath.tools.rmi package):
research and backward-compatibile applications, as
Classpath supports the 1.5 feature to replace such
stubs by proxy classes.
+* REGISTRY - The persistent RMI naming service.
+* RMID - The persistent RMI activation daemon, supports the
+ java.rmi.activation package.
-
- \ No newline at end of file
+== Security tools ==
+
+Security tools (currently) are used for signing and verifying JAR files
+as well as (planned) generating and managing cryptographic tokens and
+credentials.
+
+The list of individual tools, the name of their main class that should be
+invoked by the Java launcher, and a summary of what they provide follows:
+
+* jarsigner gnu.classpath.tools.jarsigner.Main
+ A drop-in replacement for the "jarsigner" tool.
+
+
diff --git a/tools/appletviewer.c b/tools/appletviewer.c
new file mode 100644
index 000000000..2609ccaf6
--- /dev/null
+++ b/tools/appletviewer.c
@@ -0,0 +1,235 @@
+/* appletviewer.c -- a native appletviewer wrapper for VMs that
+ support the JNI invocation interface
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+#include <jni.h>
+#include <glib.h>
+#include <string.h>
+#include <stdlib.h>
+#include "config.h"
+
+#ifndef JNI_VERSION_1_2
+# error JNI version 1.2 or greater required
+#endif
+
+union env_union
+{
+ void *void_env;
+ JNIEnv *jni_env;
+};
+
+int
+main (int argc, const char** argv)
+{
+ union env_union tmp;
+ JNIEnv* env;
+ JavaVM* jvm;
+ JavaVMInitArgs vm_args;
+ jint result;
+ jclass class_id;
+ jmethodID method_id;
+ jstring str;
+ jclass string_class_id;
+ jobjectArray args_array;
+ char** non_vm_argv;
+ int non_vm_argc;
+ int i;
+ int classpath_found = 0;
+
+ env = NULL;
+ jvm = NULL;
+
+ vm_args.nOptions = 0;
+ vm_args.options = NULL;
+
+ non_vm_argc = 0;
+ non_vm_argv = NULL;
+
+ if (argc > 1)
+ {
+ for (i = 1; i < argc; i++)
+ {
+ if (!strncmp (argv[i], "-J", 2))
+ {
+ if (!strncmp (argv[i], "-J-Djava.class.path=", 20))
+ classpath_found = 1;
+
+ /* A virtual machine option. */
+ vm_args.options = (JavaVMOption*) realloc (vm_args.options, (vm_args.nOptions + 1) * sizeof (JavaVMOption));
+
+ if (vm_args.options == NULL)
+ {
+ g_printerr ("appletviewer: realloc failed.\n");
+ goto destroy;
+ }
+
+ if (strlen (argv[i]) == 2)
+ {
+ g_printerr ("appletviewer: the -J option must not be followed by a space.\n");
+ goto destroy;
+ }
+ else
+ vm_args.options[vm_args.nOptions++].optionString = g_strdup (argv[i] + 2);
+ }
+ else if (!strncmp (argv[i], "--version", 9)
+ && argv[i][9] == '\0')
+ {
+ g_print ("appletviewer (GCJ Applet Viewer) " PACKAGE_VERSION "\n");
+ exit (0);
+ }
+ else if (!strncmp (argv[i], "-debug", 6)
+ && argv[i][6] == '\0')
+ {
+ /* FIXME: Ignore for now. The debug option will be
+ unsupported until we have the ability to debug
+ bytecode. For now, just strip it out of the argument
+ list. */
+ }
+ else
+ {
+ non_vm_argv = (char**) realloc (non_vm_argv, (non_vm_argc + 1) * sizeof (char*));
+ if (non_vm_argv == NULL)
+ {
+ g_printerr ("appletviewer: realloc failed.\n");
+ goto destroy;
+ }
+ non_vm_argv[non_vm_argc++] = g_strdup (argv[i]);
+ }
+ }
+ }
+
+ if (!classpath_found)
+ {
+ /* Set the invocation classpath. */
+ vm_args.options = (JavaVMOption*) realloc (vm_args.options, (vm_args.nOptions + 1) * sizeof (JavaVMOption));
+
+ if (vm_args.options == NULL)
+ {
+ g_printerr ("appletviewer: realloc failed.\n");
+ goto destroy;
+ }
+
+ vm_args.options[vm_args.nOptions++].optionString = "-Djava.class.path=" "@datadir@/@PACKAGE@/tools.zip";
+ }
+
+ /* Terminate vm_args.options with a NULL element. */
+ vm_args.options = (JavaVMOption*) realloc (vm_args.options, (vm_args.nOptions + 1) * sizeof (JavaVMOption));
+ if (vm_args.options == NULL)
+ {
+ g_printerr ("appletviewer: realloc failed.\n");
+ goto destroy;
+ }
+ vm_args.options[vm_args.nOptions].optionString = NULL;
+
+ /* Terminate non_vm_argv with a NULL element. */
+ non_vm_argv = (char**) realloc (non_vm_argv, (non_vm_argc + 1) * sizeof (char*));
+ if (non_vm_argv == NULL)
+ {
+ g_printerr ("appletviewer: realloc failed.\n");
+ goto destroy;
+ }
+ non_vm_argv[non_vm_argc] = NULL;
+
+ vm_args.version = JNI_VERSION_1_2;
+ vm_args.ignoreUnrecognized = JNI_TRUE;
+
+ result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args);
+
+ if (result < 0)
+ {
+ g_printerr ("appletviewer: couldn't create virtual machine\n");
+ goto destroy;
+ }
+
+ env = tmp.jni_env;
+
+ string_class_id = (*env)->FindClass (env, "java/lang/String");
+ if (string_class_id == NULL)
+ {
+ g_printerr ("appletviewer: FindClass failed.\n");
+ goto destroy;
+ }
+
+ args_array = (*env)->NewObjectArray (env, non_vm_argc, string_class_id, NULL);
+ if (args_array == NULL)
+ {
+ g_printerr ("appletviewer: NewObjectArray failed.\n");
+ goto destroy;
+ }
+
+ for (i = 0; i < non_vm_argc; i++)
+ {
+ str = (*env)->NewStringUTF (env, non_vm_argv[i]);
+ if (str == NULL)
+ {
+ g_printerr ("appletviewer: NewStringUTF failed.\n");
+ goto destroy;
+ }
+
+ (*env)->SetObjectArrayElement (env, args_array, i, str);
+ }
+
+ class_id = (*env)->FindClass (env, "gnu/classpath/tools/appletviewer/Main");
+ if (class_id == NULL)
+ {
+ g_printerr ("appletviewer: FindClass failed.\n");
+ goto destroy;
+ }
+
+ method_id = (*env)->GetStaticMethodID (env, class_id, "main", "([Ljava/lang/String;)V");
+
+ if (method_id == NULL)
+ {
+ g_printerr ("appletviewer: GetStaticMethodID failed.\n");
+ goto destroy;
+ }
+
+ (*env)->CallStaticVoidMethod (env, class_id, method_id, args_array);
+
+ destroy:
+
+ if (env != NULL)
+ {
+ if ((*env)->ExceptionOccurred (env))
+ (*env)->ExceptionDescribe (env);
+
+ if (jvm != NULL)
+ (*jvm)->DestroyJavaVM (jvm);
+ }
+
+ return 1;
+}
diff --git a/tools/appletviewer.in b/tools/appletviewer.in
new file mode 100644
index 000000000..61571d906
--- /dev/null
+++ b/tools/appletviewer.in
@@ -0,0 +1,63 @@
+#!/bin/sh
+
+## Copyright (C) 2006 Free Software Foundation, Inc.
+##
+## This file is a part of GNU Classpath.
+##
+## GNU Classpath is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or (at
+## your option) any later version.
+##
+## GNU Classpath is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with GNU Classpath; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+## USA.
+##
+## Linking this library statically or dynamically with other modules is
+## making a combined work based on this library. Thus, the terms and
+## conditions of the GNU General Public License cover the whole
+## combination.
+##
+## As a special exception, the copyright holders of this library give you
+## permission to link this library with independent modules to produce an
+## executable, regardless of the license terms of these independent
+## modules, and to copy and distribute the resulting executable under
+## terms of your choice, provided that you also meet, for each linked
+## independent module, the terms and conditions of the license of that
+## module. An independent module is a module which is not derived from
+## or based on this library. If you modify this library, you may extend
+## this exception to your version of the library, but you are not
+## obligated to do so. If you do not wish to do so, delete this
+## exception statement from your version.
+##
+##
+## A simple shell script to launch the GNU Classpath appletviewer tool.
+##
+
+prefix=@prefix@
+tools_dir=@datadir@/@PACKAGE@
+tools_cp=${tools_dir}/tools.zip
+
+# find the java executable...
+if [ -z "${JAVA}" ] ; then
+ if [ -n "${JAVA_HOME}" ] ; then
+ if [ -x "${JAVA_HOME}/jre/sh/java" ] ; then
+ JAVA="${JAVA_HOME}/jre/sh/java"
+ else
+ JAVA="${JAVA_HOME}/bin/java"
+ fi
+ else
+ JAVA=`which java 2> /dev/null `
+ if [ -z "${JAVA}" ] ; then
+ JAVA=java
+ fi
+ fi
+fi
+
+exec "${JAVA}" -Xbootclasspath/p:"${tools_cp}" gnu.classpath.tools.appletviewer.Main $@
diff --git a/tools/gnu/classpath/tools/HelpPrinter.java b/tools/gnu/classpath/tools/HelpPrinter.java
index 61a3e683b..89468918a 100644
--- a/tools/gnu/classpath/tools/HelpPrinter.java
+++ b/tools/gnu/classpath/tools/HelpPrinter.java
@@ -70,30 +70,47 @@ public class HelpPrinter
}
/**
- * Prints the help message and terminates.
+ * Prints the contents of the resource specified by the designated path.
*
- * @param helpResourcePath the path to the help resource, related to the
+ * @param helpResourcePath the path to a help resource, related to the
* HelpPrinter class.
*/
- public static void printHelpAndExit(String helpResourcePath)
+ public static void printHelp(String helpResourcePath)
{
InputStream in = HelpPrinter.class.getResourceAsStream(helpResourcePath);
- BufferedReader r = new BufferedReader(new InputStreamReader(in));
-
+ BufferedReader br = new BufferedReader(new InputStreamReader(in));
try
{
String s;
- while ((s = r.readLine()) != null)
- {
- System.out.println(s);
- }
- r.close();
+ while ((s = br.readLine()) != null)
+ System.out.println(s);
}
- catch (IOException e)
+ catch (IOException x)
{
System.err.print("Resource loading is broken:");
- e.printStackTrace();
+ x.printStackTrace(System.err);
+ }
+ finally
+ {
+ try
+ {
+ br.close();
+ }
+ catch (IOException ignored)
+ {
+ }
}
+ }
+
+ /**
+ * Prints the help message and terminates.
+ *
+ * @param helpResourcePath the path to the help resource, related to the
+ * HelpPrinter class.
+ */
+ public static void printHelpAndExit(String helpResourcePath)
+ {
+ printHelp(helpResourcePath);
System.exit(0);
}
}
diff --git a/tools/gnu/classpath/tools/appletviewer/AppletClassLoader.java b/tools/gnu/classpath/tools/appletviewer/AppletClassLoader.java
new file mode 100644
index 000000000..dfbedfe36
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/AppletClassLoader.java
@@ -0,0 +1,81 @@
+/* AppletClassLoader -- a loader for applet classes
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+
+public class AppletClassLoader extends URLClassLoader
+{
+ /**
+ * Constructs a new <code>AppletLoader</code> object.
+ *
+ * @param codebase the codebase of the applet
+ * @param archives the urls to add to the search path
+ */
+ public AppletClassLoader(URL codebase, ArrayList archives)
+ {
+ super(new URL[0]);
+
+ for (int count = 0; count < archives.size(); count++)
+ addURL((URL) archives.get(count));
+
+ addURL(codebase);
+ }
+
+ /**
+ * Finds the specified class. This method should be overridden by
+ * class loader implementations that follow the delegation model for
+ * loading classes, and will be invoked by the loadClass method after
+ * checking the parent class loader for the requested class. The default
+ * implementation throws a ClassNotFoundException.
+ *
+ * (description copied from java.lang.ClassLoader.findClass(String))
+ *
+ * @param name The name of the class.
+ *
+ * @return the resulting <code>Class</code> object.
+ *
+ * @exception ClassNotFoundException if the class is not found.
+ */
+ protected Class findClass(String name) throws ClassNotFoundException
+ {
+ return super.findClass(name);
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/AppletSecurityManager.java b/tools/gnu/classpath/tools/appletviewer/AppletSecurityManager.java
new file mode 100644
index 000000000..32ab31639
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/AppletSecurityManager.java
@@ -0,0 +1,95 @@
+/* AppletSecurityManager.java -- an applet security manager
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.io.FilePermission;
+import java.net.SocketPermission;
+import java.security.Permission;
+import java.security.SecurityPermission;
+import java.util.PropertyPermission;
+
+class AppletSecurityManager extends SecurityManager
+{
+ private boolean plugin;
+
+ AppletSecurityManager(boolean plugin)
+ {
+ this.plugin = plugin;
+ }
+
+ public void checkPermission(Permission permission)
+ {
+ if (permission == null)
+ throw new NullPointerException();
+
+ // FIXME: we need to restrict this.
+ //
+ // libgcj asks for "java.io.FilePermission <<ALL FILES>> execute"
+ // to be able to execute "addr2line" to get proper stack traces.
+ if (permission instanceof FilePermission)
+ return;
+
+ // FIXME: we need to restrict this.
+ if (permission instanceof SecurityPermission)
+ return;
+
+ // FIXME: is this really needed ?
+ if (permission instanceof PropertyPermission)
+ return;
+
+ // Needed to allow to access AWT event queue.
+ if (permission.getName().equals("accessEventQueue"))
+ return;
+
+ // Needed to create a class loader for each codebase.
+ if (permission.getName().equals("createClassLoader"))
+ return;
+
+ // FIXME: we need to allow access to codebase here.
+
+ if (permission instanceof SocketPermission // for net access
+ || permission instanceof RuntimePermission) // for checkWrite(FileDescriptor)
+ return;
+
+ if (! plugin && permission.getName().equals("exitVM"))
+ return;
+
+ // Reject all other permissions.
+ throw new SecurityException();
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/AppletTag.java b/tools/gnu/classpath/tools/appletviewer/AppletTag.java
new file mode 100644
index 000000000..b2d7ccb2b
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/AppletTag.java
@@ -0,0 +1,485 @@
+/* AppletTag.java -- a representation of an HTML APPLET tag
+ Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import gnu.xml.dom.html2.DomHTMLAppletElement;
+import gnu.xml.dom.html2.DomHTMLEmbedElement;
+import gnu.xml.dom.html2.DomHTMLObjectElement;
+
+import java.awt.Dimension;
+import java.awt.Toolkit;
+
+import java.io.File;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import java.text.NumberFormat;
+import java.text.ParseException;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Locale;
+
+/**
+ * @author Lillian Angel (langel@redhat.com)
+ * @author Thomas Fitzsimmons (fitzsim@redhat.com)
+ */
+class AppletTag
+{
+
+ /**
+ * The document base of this applet.
+ */
+ URL documentbase;
+
+ /**
+ * name of applet tag.
+ */
+ String name = "";
+
+ /**
+ * code of applet tag.
+ */
+ String code = "";
+
+ /**
+ * codebase of applet tag.
+ */
+ String codebase = "";
+
+ /**
+ * The archives.
+ */
+ ArrayList archives = new ArrayList();
+
+ /**
+ * The parameters.
+ */
+ HashMap parameters = new HashMap();
+
+ /**
+ * The screen size.
+ */
+ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+
+ /**
+ * Default constructor.
+ */
+ AppletTag()
+ {
+ // Do nothing.
+ }
+
+ /**
+ * Constructs an AppletTag and parses the given applet element.
+ *
+ * @param appElement - the Applet element to parse.
+ */
+ AppletTag(DomHTMLAppletElement appElement)
+ {
+ name = appElement.getName();
+ parameters.put("name", name);
+
+ parameters.put("object", appElement.getObject());
+ parameters.put("align", appElement.getAlign());
+ parameters.put("alt", appElement.getAlt());
+ parameters.put("height", appElement.getHeight());
+ parameters.put("hspace", Integer.toString(appElement.getHspace()));
+ parameters.put("vspace", Integer.toString(appElement.getVspace()));
+ parameters.put("width", appElement.getWidth());
+
+ TagParser.parseParams(appElement, this);
+
+ if (code.equals(""))
+ {
+ code = appElement.getCode();
+ if (code.equals(""))
+ code = appElement.getCls();
+ }
+
+ // Must initialize codebase before archives
+ if (codebase.equals(""))
+ {
+ codebase = appElement.getCodeBase();
+ if (codebase.equals(""))
+ codebase = appElement.getSrc();
+ }
+
+ if (archives.size() == 0)
+ {
+ String arcs = "";
+ String arch = appElement.getArchive();
+
+ if (code.indexOf(".") < 0)
+ arcs = code + ".jar";
+
+ if (!arch.equals(""))
+ arcs += "," + arch;
+
+ if (!arcs.equals(""))
+ archives = TagParser.parseArchives(arcs, this);
+ }
+ }
+
+ /**
+ * Constructs an AppletTag and parses the given embed element.
+ *
+ * @param embElement - the Embed element to parse.
+ */
+ AppletTag(DomHTMLEmbedElement embElement)
+ {
+ // In an EMBED tag, a parameter is any non-standard attribute. This
+ // is a problem for applets that take parameters named "code",
+ // "codebase", "archive", "object", or "type". The solution is to
+ // allow the same attributes, prefixed by "java_". The presence of
+ // a "java_" attribute indicates that the non-prefixed attribute
+ // should be interpreted as a parameter. For example if "java_code"
+ // and "code" attributes are present in the EMBED tag then the
+ // "code" attribute is interpreted as a parameter.
+
+ name = embElement.getName();
+ parameters.put("name", name);
+
+ String jobj = embElement.getJavaObject();
+ if (!jobj.equals(""))
+ parameters.put("java_object", jobj);
+ else
+ parameters.put("object", embElement.getObject());
+
+ parameters.put("width", embElement.getWidth());
+ parameters.put("height", embElement.getHeight());
+ parameters.put("align", embElement.getAlign());
+ parameters.put("alt", embElement.getAlt());
+ parameters.put("hspace", Integer.toString(embElement.getHspace()));
+ parameters.put("mayscript", embElement.getMayscript());
+ parameters.put("pluginspage", embElement.getPluginsPage());
+ parameters.put("title", embElement.getTitle());
+ parameters.put("type", embElement.getType());
+ parameters.put("java_type", embElement.getJavaType());
+ parameters.put("vspace", Integer.toString(embElement.getVspace()));
+
+ TagParser.parseParams(embElement, this);
+
+ // Must initialize codebase before archives
+ if (codebase.equals(""))
+ {
+ String javacb = embElement.getJavaCodeBase();
+ if (!javacb.equals(""))
+ codebase = javacb;
+ else
+ codebase = embElement.getCodeBase();
+ }
+
+ if (code.equals(""))
+ {
+ String jcode = embElement.getJavaCode();
+ if (!jcode.equals(""))
+ code = jcode;
+ else
+ code = embElement.getCode();
+ }
+
+ if (archives.size() == 0)
+ {
+ String arcs = "";
+ String jarch = embElement.getJavaArchive();
+ String arch = embElement.getArchive();
+
+ if (code.indexOf(".") < 0)
+ arcs = code + ".jar";
+
+ if (!jarch.equals(""))
+ arcs += "," + jarch;
+ else if (!arch.equals(""))
+ arcs += "," + arch;
+
+ if (!arcs.equals(""))
+ archives = TagParser.parseArchives(arcs, this);
+ }
+ }
+
+ /**
+ * Constructs an AppletTag and parses the given object element.
+ *
+ * @param objElement - the Object element to parse.
+ */
+ AppletTag(DomHTMLObjectElement objElement)
+ {
+ // In an OBJECT tag, a parameter is any non-standard attribute. This
+ // is a problem for applets that take parameters named "code",
+ // "codebase", "archive", "object", or "type". The solution is to
+ // allow the same attributes, prefixed by "java_". The presence of
+ // a "java_" attribute indicates that the non-prefixed attribute
+ // should be interpreted as a parameter. For example if "java_code"
+ // and "code" attributes are present in the OBJECT tag then the
+ // "code" attribute is interpreted as a parameter.
+
+ name = objElement.getName();
+ parameters.put("name", name);
+
+ String jobj = objElement.getJavaObject();
+ if (!jobj.equals(""))
+ parameters.put("java_object", jobj);
+ else
+ parameters.put("object", objElement.getObject());
+
+ parameters.put("type", objElement.getType());
+ parameters.put("java_type", objElement.getJavaType());
+ parameters.put("align", objElement.getAlign());
+ parameters.put("codetype", objElement.getCodeType());
+ parameters.put("data", objElement.getData());
+ parameters.put("declare", Boolean.toString(objElement.getDeclare()));
+ parameters.put("height", objElement.getHeight());
+ parameters.put("hspace", Integer.toString(objElement.getHspace()));
+ parameters.put("border", objElement.getBorder());
+ parameters.put("standby", objElement.getStandby());
+ parameters.put("tabindex", Integer.toString(objElement.getTabIndex()));
+ parameters.put("usemap", objElement.getUseMap());
+ parameters.put("vspace", Integer.toString(objElement.getVspace()));
+ parameters.put("width", objElement.getWidth());
+ parameters.put("mayscript", objElement.getMayscript());
+ parameters.put("scriptable", objElement.getScriptable());
+
+ TagParser.parseParams(objElement, this);
+
+ // Must initialize codebase before archives
+ if (codebase.equals(""))
+ {
+ String javacb = objElement.getJavaCodeBase();
+ if (! javacb.equals(""))
+ codebase = javacb;
+ else
+ codebase = objElement.getCodeBase();
+ }
+
+ if (code.equals(""))
+ {
+ String jcode = objElement.getJavaCode();
+ if (!jcode.equals(""))
+ code = jcode;
+ else
+ code = objElement.getCode();
+ }
+
+ if (archives.size() == 0)
+ {
+ String arcs = "";
+ String jarch = objElement.getJavaArchive();
+ String arch = objElement.getArchive();
+
+ if (code.indexOf(".") < 0)
+ arcs = code + ".jar";
+
+ if (!jarch.equals(""))
+ arcs += "," + jarch;
+ else if (!arch.equals(""))
+ arcs += "," + arch;
+
+ if (!arcs.equals(""))
+ archives = TagParser.parseArchives(arcs, this);
+ }
+ }
+
+ /**
+ * String representation of the tag.
+ *
+ * @return the string representation.
+ */
+ public String toString()
+ {
+ return (" name=" + name + "\n" + " code=" + code + "\n" + " codebase="
+ + codebase + "\n" + " archive=" + archives + "\n" + " parameters="
+ + parameters + "\n" + " documentbase=" + documentbase + "\n");
+ }
+
+ /**
+ * Returns the size of the applet.
+ *
+ * @return the size.
+ */
+ Dimension getSize()
+ {
+ Dimension size = new Dimension(320, 200);
+
+ try
+ {
+ String widthStr = (String) parameters.get("width");
+
+ if (widthStr != null && ! widthStr.equals(""))
+ {
+ if (widthStr.charAt(widthStr.length() - 1) == '%')
+ {
+ double p = NumberFormat.getPercentInstance(Locale.US).parse(widthStr).intValue() / 100.0;
+ size.width = (int)(p * screenSize.width);
+ }
+ else
+ size.width = NumberFormat.getInstance(Locale.US).parse(widthStr).intValue();
+ }
+ }
+ catch (ParseException e)
+ {
+ // Use default.
+ }
+
+ try
+ {
+ String heightStr = (String) parameters.get("height");
+
+ if (heightStr != null && !heightStr.equals(""))
+ {
+ if (heightStr.charAt(heightStr.length() - 1) == '%')
+ {
+ double p = NumberFormat.getPercentInstance(Locale.US).parse(heightStr).intValue() / 100.0;
+ size.height = (int) (p * screenSize.height);
+ }
+ else
+ size.height = NumberFormat.getInstance(Locale.US).parse(heightStr).intValue();
+ }
+ }
+ catch (ParseException e)
+ {
+ // Use default.
+ }
+
+ return size;
+ }
+
+ /**
+ * Gets the code base.
+ *
+ * @return the codebase.
+ */
+ String getCodeBase()
+ {
+ return codebase;
+ }
+
+ /**
+ * Gets the archive list.
+ *
+ * @return the archive list.
+ */
+ ArrayList getArchives()
+ {
+ return archives;
+ }
+
+ /**
+ * Gets the code.
+ *
+ * @return the code.
+ */
+ String getCode()
+ {
+ return code;
+ }
+
+ /**
+ * Gets the document base.
+ *
+ * @return the document base.
+ */
+ URL getDocumentBase()
+ {
+ return documentbase;
+ }
+
+ /**
+ * Gets the specified parameter.
+ *
+ * @param name - the specified parameter.
+ * @return the parameter.
+ */
+ String getParameter(String name)
+ {
+ return (String) parameters.get(name.toLowerCase());
+ }
+
+ /**
+ * Prepends the base to the codebase.
+ *
+ * @return the new URL.
+ */
+ URL prependCodeBase(String base) throws MalformedURLException
+ {
+ if (documentbase == null)
+ documentbase = TagParser.db;
+
+ URL fullcodebase;
+
+ //If no codebase was specified, default to documentbase.
+ if (codebase.equals(""))
+ {
+ if (documentbase.getFile().endsWith(File.separator))
+ fullcodebase = documentbase;
+ else
+ {
+ String dirname = documentbase.getFile();
+
+ // Determine dirname for file by stripping everything
+ // past the last file separator.
+ dirname = dirname.substring(0,
+ dirname.lastIndexOf(File.separatorChar) + 1);
+
+ fullcodebase = new URL(documentbase.getProtocol(),
+ documentbase.getHost(),
+ documentbase.getPort(), dirname);
+ }
+ }
+ else
+ {
+ // codebase was specified.
+ URL codebaseURL = new URL(documentbase, codebase);
+
+ if ("file".equals(codebaseURL.getProtocol()))
+ {
+ if (new File(codebaseURL.getFile()).isDirectory() && !codebase.endsWith(File.separator))
+ fullcodebase = new URL(documentbase, codebase + File.separator);
+ else
+ fullcodebase = new URL(documentbase, codebase);
+ }
+ else if (codebase.endsWith(File.separator))
+ fullcodebase = new URL(documentbase, codebase);
+ else
+ fullcodebase = new URL(documentbase, codebase + File.separator);
+ }
+
+ return new URL(fullcodebase, base);
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/AppletWarning.java b/tools/gnu/classpath/tools/appletviewer/AppletWarning.java
new file mode 100644
index 000000000..b2376a4cb
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/AppletWarning.java
@@ -0,0 +1,66 @@
+/* AppletWarning -- a security warning message display dialog
+ Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import javax.swing.JOptionPane;
+
+/**
+ * @author Michael Koch (konqueror@gmx.de)
+ */
+public class AppletWarning
+{
+ private static String TITLE = "WARNING";
+ private static boolean showWarning = false;
+
+ private static String MESSAGE =
+ "The current version of this applet plugin does not provide\n" +
+ "a security manager capable of handling Java (tm) applets. Applets\n" +
+ "have UNRESTRICTED access to your computer. This means they can do\n" +
+ "anything you can do, like deleting all your important data.\n\n" +
+ "Continue ?";
+
+ public static int show()
+ {
+ if (showWarning)
+ return JOptionPane.showConfirmDialog(null, MESSAGE, TITLE,
+ JOptionPane.YES_NO_OPTION,
+ JOptionPane.WARNING_MESSAGE);
+ else
+ return JOptionPane.YES_OPTION;
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/CommonAppletContext.java b/tools/gnu/classpath/tools/appletviewer/CommonAppletContext.java
new file mode 100644
index 000000000..7e118e931
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/CommonAppletContext.java
@@ -0,0 +1,133 @@
+/* CommonAppletContext.java -- a common applet's context
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.applet.Applet;
+import java.applet.AppletContext;
+import java.applet.AudioClip;
+import java.awt.Image;
+import java.awt.Toolkit;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+
+/*
+ * CommonAppletContext represents the common context stuff for both
+ * types, plugins and standalone.
+ */
+abstract class CommonAppletContext
+ implements AppletContext
+{
+ // FIXME: this needs to be static, and we need one AppletContext per
+ // Applet.
+ List applets = new ArrayList();
+ HashMap streams = new HashMap();
+
+ void addApplet(Applet applet)
+ {
+ applets.add(applet);
+ }
+
+ ///////////////////////////////
+ //// AppletContext methods ////
+ ///////////////////////////////
+ public AudioClip getAudioClip(URL url)
+ {
+ return Applet.newAudioClip(url);
+ }
+
+ public Image getImage(URL url)
+ {
+ return Toolkit.getDefaultToolkit().getImage(url);
+ }
+
+ public Applet getApplet(String name)
+ {
+ Applet a;
+ String appletName;
+ Iterator i = applets.iterator();
+
+ while (i.hasNext())
+ {
+ a = (Applet) i.next();
+
+ appletName = a.getParameter("name");
+ if (a != null && appletName != null && appletName.equals(name))
+ return a;
+ }
+ return null;
+ }
+
+ public Enumeration getApplets()
+ {
+ return Collections.enumeration(applets);
+ }
+
+ public void showDocument(URL url)
+ {
+ showDocument(url, "_self");
+ }
+
+ /*
+ // FIXME: implement.
+ public abstract void showDocument (URL url, String target);
+
+ // FIXME: implement.
+ public abstract void showStatus (String status);
+ */
+ public void setStream(String key, InputStream stream)
+ {
+ streams.put(key, stream);
+ }
+
+ public InputStream getStream(String key)
+ {
+ return (InputStream) streams.get(key);
+ }
+
+ public Iterator getStreamKeys()
+ {
+ return streams.keySet().iterator();
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/CommonAppletStub.java b/tools/gnu/classpath/tools/appletviewer/CommonAppletStub.java
new file mode 100644
index 000000000..bc0cc45e1
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/CommonAppletStub.java
@@ -0,0 +1,138 @@
+/* CommonAppletStub.java -- an applet-browser interface class
+ Copyright (C) 2003, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.applet.AppletContext;
+import java.applet.AppletStub;
+import java.applet.Applet;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+
+class CommonAppletStub
+ implements AppletStub
+{
+ private AppletTag tag;
+ private AppletContext context;
+ private Applet applet;
+
+ CommonAppletStub(AppletTag tag, AppletContext context, Applet applet)
+ {
+ this.tag = tag;
+ this.context = context;
+ this.applet = applet;
+ }
+
+ ////////////////////////////////
+ ////// AppletStub Methods //////
+ ////////////////////////////////
+
+ /**
+ * Tests whether or not this applet is currently active. An applet
+ * becomes active just before the browser invokes start (), and
+ * becomes inactive just before the browser invokes stop ().
+ *
+ * @return true if applet is active, false otherwise
+ */
+ public boolean isActive()
+ {
+ return true;
+ }
+
+ /**
+ * Returns the basename URL of the document in which this applet is
+ * embedded.
+ *
+ * @return the document base url.
+ */
+ public URL getDocumentBase()
+ {
+ return tag.getDocumentBase();
+ }
+
+ /**
+ * Returns the URL of the code base for this applet.
+ *
+ * @return the codebase url
+ */
+ public URL getCodeBase()
+ {
+ try
+ {
+ return tag.prependCodeBase("");
+ }
+ catch (MalformedURLException e)
+ {
+ throw new RuntimeException("unknown codebase");
+ }
+ }
+
+ /**
+ * Returns the value of the specified parameter that was specified
+ * in the <code>APPLET</code> tag for this applet.
+ *
+ * @param name the key name
+ *
+ * @return the key value
+ */
+ public String getParameter(String name)
+ {
+ return (String) tag.getParameter(name.toLowerCase());
+ }
+
+ /**
+ * Returns the applet context for this applet.
+ *
+ * @return the context
+ */
+ public AppletContext getAppletContext()
+ {
+ return context;
+ }
+
+ /**
+ * Requests that the applet window for this applet be resized.
+ *
+ * @param width the new witdh
+ * @param height the new height
+ */
+ public void appletResize(int width, int height)
+ {
+ applet.setBounds (0, 0, width, height);
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/ConsoleDialog.java b/tools/gnu/classpath/tools/appletviewer/ConsoleDialog.java
new file mode 100644
index 000000000..9c937cc77
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/ConsoleDialog.java
@@ -0,0 +1,175 @@
+/* ConsoleDialog -- a console dialog for applets
+ Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.Panel;
+import java.awt.TextArea;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+
+/**
+ * This class is a little dialog showing standard output and standard error output.
+ *
+ * @author Michael Koch (konqueror@gmx.de)
+ */
+public class ConsoleDialog extends Frame
+ implements ActionListener
+{
+ static class InternalOutputStream extends OutputStream
+ {
+ private ConsoleDialog console;
+
+ public InternalOutputStream(ConsoleDialog console)
+ {
+ super();
+ this.console = console;
+ }
+
+ public void write(int data) throws IOException
+ {
+ console.print(String.valueOf((char) data));
+ }
+ }
+
+ private TextArea textArea;
+ private Button buttonClear;
+ private Button buttonHide;
+ private PrintStream printStream;
+
+ /**
+ * Creates a console dialog object.
+ */
+ public ConsoleDialog()
+ {
+ super(Main.messages.getString("gcjwebplugin.console_title"));
+
+ setSize(400, 200);
+ setLayout(new BorderLayout());
+ addWindowListener(new WindowAdapter()
+ {
+ public void windowClosing(WindowEvent event)
+ {
+ hide();
+ }
+ });
+
+ textArea = new TextArea();
+ textArea.setEditable(false);
+ add(textArea);
+
+ Panel panel = new Panel();
+ panel.setLayout(new FlowLayout());
+ add(panel, BorderLayout.SOUTH);
+
+ buttonClear = new Button(Main.messages.getString("gcjwebplugin.console_clear"));
+ buttonClear.addActionListener(this);
+ panel.add(buttonClear);
+
+ buttonHide = new Button(Main.messages.getString("gcjwebplugin.console_hide"));
+ buttonHide.addActionListener(this);
+ panel.add(buttonHide);
+
+ printStream = new PrintStream(new InternalOutputStream(this));
+ clearTextArea();
+ }
+
+ /**
+ * Clears the content of the textarea and inserts the initial text.
+ */
+ public void clearTextArea()
+ {
+ textArea.setText("");
+
+ println("java.vm.version: " + System.getProperty("java.vm.version"));
+ println("java.vm.vendor: " + System.getProperty("java.vm.vendor"));
+ }
+
+ /**
+ * Print a message into the console dialog.
+ *
+ * @param message the message to print.
+ */
+ public void print(String message)
+ {
+ textArea.append(message);
+ }
+
+ /**
+ * Print a line into the console dialog.
+ *
+ * @param message the line to print.
+ */
+ public void println(String message)
+ {
+ print(message + "\n");
+ }
+
+ /**
+ * Perform actions on button clicks inside the console dialog.
+ *
+ * @param event the event.
+ */
+ public void actionPerformed(ActionEvent event)
+ {
+ if (event.getSource() == buttonHide)
+ hide(); // Hide console window.
+ else if (event.getSource() == buttonClear)
+ clearTextArea(); // Clear text area and insert standard messages.
+ }
+
+ /**
+ * Returns a <code>PrintStream</code> object that prints into the
+ * console dialog.
+ *
+ * @return the <code>PrintStream</code> object.
+ */
+ public PrintStream getPrintStream()
+ {
+ return printStream;
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/ErrorApplet.java b/tools/gnu/classpath/tools/appletviewer/ErrorApplet.java
new file mode 100644
index 000000000..059dbee40
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/ErrorApplet.java
@@ -0,0 +1,53 @@
+/* ErrorApplet.java -- an applet to load in case of an error
+ Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.applet.Applet;
+import java.awt.BorderLayout;
+import java.awt.Button;
+
+public class ErrorApplet extends Applet
+{
+ public ErrorApplet(String message)
+ {
+ setLayout(new BorderLayout());
+
+ Button button = new Button(message);
+ add(button);
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/Main.java b/tools/gnu/classpath/tools/appletviewer/Main.java
new file mode 100644
index 000000000..878b2be8a
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/Main.java
@@ -0,0 +1,303 @@
+/* Main.java -- a standalone viewer for Java applets
+ Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import gnu.classpath.tools.getopt.ClasspathToolParser;
+import gnu.classpath.tools.getopt.Option;
+import gnu.classpath.tools.getopt.OptionException;
+import gnu.classpath.tools.getopt.OptionGroup;
+import gnu.classpath.tools.getopt.Parser;
+import java.applet.Applet;
+import java.awt.Dimension;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ResourceBundle;
+
+
+class Main
+{
+ /**
+ * The localized strings are kept in a separate file.
+ */
+ public static final ResourceBundle messages = ResourceBundle.getBundle
+ ("gnu.classpath.tools.appletviewer.MessagesBundle");
+
+ private static HashMap classLoaderCache = new HashMap();
+
+ private static ClassLoader getClassLoader(URL codebase, ArrayList archives)
+ {
+ // Should load class loader each time. It is possible that there
+ // are more than one applet to be loaded with different archives.
+ AppletClassLoader loader = new AppletClassLoader(codebase, archives);
+ classLoaderCache.put(codebase, loader);
+
+ return loader;
+ }
+
+ private static String code = null;
+ private static String codebase = null;
+ private static String archive = null;
+ private static List parameters = new ArrayList();
+ private static Dimension dimensions = new Dimension(-1, -1);
+ private static String pipeInName = null;
+ private static String pipeOutName = null;
+ private static boolean pluginMode = false;
+ private static Parser parser = null;
+
+ static Applet createApplet(AppletTag tag)
+ {
+ Applet applet = null;
+
+ try
+ {
+ ClassLoader loader = getClassLoader(tag.prependCodeBase(""),
+ tag.getArchives());
+ String code = tag.getCode();
+
+ if (code.endsWith(".class"))
+ code = code.substring(0, code.length() - 6).replace('/', '.');
+
+ Class c = loader.loadClass(code);
+ applet = (Applet) c.newInstance();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ if (applet == null)
+ applet = new ErrorApplet("Error loading applet");
+
+ return applet;
+ }
+
+ protected static boolean verbose;
+
+ /**
+ * The main method starting the applet viewer.
+ *
+ * @param args the arguments given on the command line.
+ *
+ * @exception IOException if an error occurs.
+ */
+ public static void main(String[] args) throws IOException
+ {
+ parser = new ClasspathToolParser("appletviewer", true);
+ parser.setHeader("usage: appletviewer [OPTION] --code=FILE | URL...");
+
+ OptionGroup attributeGroup = new OptionGroup("Applet tag options");
+
+ attributeGroup.add(new Option("code", Main.messages.getString
+ ("gcjwebplugin.code_description"),
+ "<code attribute>")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ code = argument;
+ }
+ });
+ attributeGroup.add(new Option("codebase", Main.messages.getString
+ ("gcjwebplugin.codebase_description"),
+ "<codebase attribute>")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ codebase = argument;
+ }
+ });
+ attributeGroup.add(new Option("archive", Main.messages.getString
+ ("gcjwebplugin.archive_description"),
+ "<archive attribute>")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ archive = argument;
+ }
+ });
+ attributeGroup.add(new Option("width", Main.messages.getString
+ ("gcjwebplugin.width_description"),
+ "<width attribute>")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ dimensions.width = Integer.parseInt(argument);
+ }
+ });
+ attributeGroup.add(new Option("height", Main.messages.getString
+ ("gcjwebplugin.height_description"),
+ "<height attribute>")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ dimensions.height = Integer.parseInt(argument);
+ }
+ });
+ attributeGroup.add(new Option("param", Main.messages.getString
+ ("gcjwebplugin.param_description"),
+ "<name>,<value>")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ parameters.add(argument);
+ }
+ });
+ OptionGroup pluginGroup = new OptionGroup("Plugin option");
+ pluginGroup.add(new Option("plugin", Main.messages.getString
+ ("gcjwebplugin.plugin_description"),
+ "<input pipe>,<output pipe>")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ pluginMode = true;
+ int comma = argument.indexOf(',');
+ pipeInName = argument.substring(0, comma);
+ pipeOutName = argument.substring(comma + 1);
+ }
+ });
+ OptionGroup debuggingGroup = new OptionGroup("Debugging option");
+ debuggingGroup.add(new Option ("verbose", Main.messages.getString
+ ("gcjwebplugin.verbose_description"),
+ null)
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ verbose = true;
+ }
+ });
+ OptionGroup compatibilityGroup = new OptionGroup("Compatibility options");
+ compatibilityGroup.add(new Option("debug", Main.messages.getString
+ ("gcjwebplugin.debug_description"),
+ null)
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ // Currently ignored.
+ }
+ });
+ compatibilityGroup.add(new Option("encoding", Main.messages.getString
+ ("gcjwebplugin.encoding_description"),
+ "<character set>")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ // FIXME: We should probably be using
+ // java.nio.charset.CharsetDecoder to handle the encoding. What
+ // is the status of Classpath's implementation?
+ }
+ });
+ compatibilityGroup.add(new Option('J', Main.messages.getString
+ ("gcjwebplugin.j_description"),
+ "<virtual machine option>")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ // -J should be handled by the appletviewer wrapper binary.
+ // We add it here so that it shows up in the --help output.
+ }
+ });
+ parser.add(attributeGroup);
+ parser.add(pluginGroup);
+ parser.add(debuggingGroup);
+ parser.add(compatibilityGroup);
+
+ String[] urls = parser.parse(args);
+
+ // Print arguments.
+ printArguments(args);
+
+ args = urls;
+
+ if (dimensions.height < 0)
+ dimensions.height = 200;
+
+ if (dimensions.width < 0)
+ dimensions.width = (int) (1.6 * dimensions.height);
+
+ //System.setSecurityManager(new AppletSecurityManager(pluginMode));
+
+ if (pluginMode)
+ {
+ InputStream in;
+ OutputStream out;
+
+ in = new FileInputStream(pipeInName);
+ out = new FileOutputStream(pipeOutName);
+
+ PluginAppletViewer.start(in, out);
+ }
+ else
+ {
+ if (code == null)
+ {
+ // The --code option wasn't given and there are no URL
+ // arguments so we have nothing to work with.
+ if (args.length == 0)
+ {
+ System.err.println(Main.messages.getString("gcjwebplugin.no_input_files"));
+ System.exit(1);
+ }
+ // Create a standalone appletviewer from a list of URLs.
+ new StandaloneAppletViewer(args);
+ }
+ else
+ {
+ // Create a standalone appletviewer from the --code
+ // option.
+ new StandaloneAppletViewer(code, codebase, archive, parameters, dimensions);
+ }
+ }
+ }
+
+ static void printArguments(String[] args)
+ {
+ if (verbose)
+ {
+ System.out.println("raw arguments:");
+
+ for (int i = 0; i < args.length; i++)
+ System.out.println(" " + args[i]);
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/PluginAppletContext.java b/tools/gnu/classpath/tools/appletviewer/PluginAppletContext.java
new file mode 100644
index 000000000..a0e6acd12
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/PluginAppletContext.java
@@ -0,0 +1,72 @@
+/* PluginAppletContext.java -- an applet's context within a web browser
+ Copyright (C) 2003, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.net.URL;
+import java.io.IOException;
+
+/*
+ * PluginAppletContext represents the context within a webpage of a
+ * group of applets that all share the same codebase.
+ */
+class PluginAppletContext extends CommonAppletContext
+{
+ public void showDocument(URL url, String target)
+ {
+ try
+ {
+ PluginAppletViewer.write("url " + url + " " + target);
+ }
+ catch(IOException e)
+ {
+ System.err.println("showDocument failed: " + e);
+ }
+ }
+
+ public void showStatus(String status)
+ {
+ try
+ {
+ PluginAppletViewer.write("status " + status);
+ }
+ catch(IOException e)
+ {
+ System.err.println("showDocument failed: " + e);
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/PluginAppletViewer.java b/tools/gnu/classpath/tools/appletviewer/PluginAppletViewer.java
new file mode 100644
index 000000000..fdb8097b4
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/PluginAppletViewer.java
@@ -0,0 +1,172 @@
+/* PluginAppletViewer.java -- manages embeddable applet windows
+ Copyright (C) 2003, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.MalformedURLException;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+
+
+/**
+ * PluginAppletViewer communicates through pipes with a web browser
+ * plugin. A PluginAppletViewer manages applet windows that may be
+ * embedded into web pages.
+ */
+class PluginAppletViewer
+{
+ // A mapping of instance IDs to PluginAppletWindows.
+ static HashMap appletWindows = new HashMap ();
+
+ private static BufferedReader pluginInputStream;
+ private static BufferedWriter pluginOutputStream;
+
+ static void start(InputStream inputStream, OutputStream outputStream)
+ throws MalformedURLException, IOException
+ {
+ // Set up input and output pipes. Use UTF-8 encoding.
+ pluginInputStream =
+ new BufferedReader(new InputStreamReader(inputStream,
+ Charset.forName("UTF-8")));
+ pluginOutputStream =
+ new BufferedWriter(new OutputStreamWriter(outputStream,
+ Charset.forName("UTF-8")));
+
+ write("running");
+
+ // Read first message.
+ String message = read();
+
+ PluginAppletWindow currentWindow = null;
+
+ while (true)
+ {
+ if (message.startsWith("instance"))
+ {
+ // Read applet instance identifier.
+ String key = message.substring(9);
+
+ if (appletWindows.get(key) == null)
+ appletWindows.put(key, new PluginAppletWindow());
+
+ currentWindow = (PluginAppletWindow) appletWindows.get(key);
+ }
+ else if (message.startsWith("tag"))
+ {
+ int pos = message.indexOf(' ', 4);
+ String documentbase = message.substring(4, pos);
+ String tag = message.substring(pos + 1);
+ currentWindow.setParser(tag, documentbase);
+ }
+ else if (message.startsWith("handle"))
+ {
+ long handle = Long.parseLong(message.substring(7));
+
+ currentWindow.setHandle(handle);
+ }
+ else if (message.startsWith("width"))
+ {
+ int width = Integer.parseInt(message.substring(6));
+
+ currentWindow.setSize(width, currentWindow.getHeight());
+ }
+ else if (message.startsWith("height"))
+ {
+ int height = Integer.parseInt(message.substring(7));
+
+ currentWindow.setSize(currentWindow.getWidth(), height);
+ }
+ else if (message.startsWith("destroy"))
+ {
+ appletWindows.remove(currentWindow);
+ currentWindow.dispose();
+ }
+
+ // Read next message.
+ message = read();
+ }
+ }
+
+ /**
+ * Write string to plugin.
+ *
+ * @param message the message to write
+ *
+ * @exception IOException if an error occurs
+ */
+ static void write(String message) throws IOException
+ {
+ pluginOutputStream.write(message, 0, message.length());
+ pluginOutputStream.newLine();
+ pluginOutputStream.flush();
+
+ System.err.println(" PIPE: applet viewer wrote: " + message);
+ }
+
+ /**
+ * Read string from plugin.
+ *
+ * @return the read string
+ *
+ * @exception IOException if an error occurs
+ */
+ static String read() throws IOException
+ {
+ String message = pluginInputStream.readLine();
+
+ System.err.println(" PIPE: applet viewer read: " + message);
+
+ if (message == null || message.equals("shutdown"))
+ {
+ // Close input/output channels to plugin.
+ pluginInputStream.close();
+ pluginOutputStream.close();
+
+ System.err.println("appletviewer: exiting plugin applet viewer");
+ System.exit(0);
+ }
+
+ return message;
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/PluginAppletWindow.java b/tools/gnu/classpath/tools/appletviewer/PluginAppletWindow.java
new file mode 100644
index 000000000..6d36e1cf0
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/PluginAppletWindow.java
@@ -0,0 +1,454 @@
+/* PluginAppletWindow.java -- an embeddable applet window
+ Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import gnu.java.awt.EmbeddedWindow;
+
+import java.applet.Applet;
+import java.applet.AppletContext;
+import java.awt.Dimension;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.ContainerEvent;
+import java.awt.event.ContainerListener;
+import java.awt.event.HierarchyBoundsListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import java.awt.event.InputMethodEvent;
+import java.awt.event.InputMethodListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import javax.swing.JOptionPane;
+
+
+class PluginAppletWindow
+ extends EmbeddedWindow
+ implements ContainerListener, ComponentListener, MouseListener,
+ MouseMotionListener, InputMethodListener, HierarchyListener,
+ HierarchyBoundsListener
+{
+
+ // This class implements various listeners because the author of an applet
+ // may attach listeners to it, unaware of the applet's parent (this class).
+ // So, we must pass all listener events on this plugin applet window to the
+ // actual applet.
+
+ private static HashMap contexts = new HashMap();
+ private Applet applet;
+ private TagParser parser;
+ private AppletTag tag;
+
+ PluginAppletWindow()
+ {
+ super();
+ addContainerListener(this);
+ addComponentListener(this);
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ addInputMethodListener(this);
+ addHierarchyListener(this);
+ addHierarchyBoundsListener(this);
+ }
+
+ ///////////////////////////////////
+ /// ContainerListener Methods /////
+ ///////////////////////////////////
+
+ /**
+ * This method is called when a component is added to the container.
+ *
+ * @param event the <code>ContainerEvent</code> indicating component
+ * addition
+ */
+ public void componentAdded(ContainerEvent event)
+ {
+ if (applet != null)
+ {
+ ContainerListener[] l = applet.getContainerListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentAdded(event);
+ }
+ }
+
+ /**
+ * This method is called when a component is removed from the container.
+ *
+ * @param event the <code>ContainerEvent</code> indicating component removal
+ */
+ public void componentRemoved(ContainerEvent event)
+ {
+ if (applet != null)
+ {
+ ContainerListener[] l = applet.getContainerListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentRemoved(event);
+ }
+ }
+
+ ///////////////////////////////////
+ /// ComponentListener Methods /////
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the component is resized.
+ *
+ * @param event the <code>ComponentEvent</code> indicating the resize
+ */
+ public void componentResized(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentResized(event);
+ }
+ }
+
+ /**
+ * This method is called when the component is moved.
+ *
+ * @param event the <code>ComponentEvent</code> indicating the move
+ */
+ public void componentMoved(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentMoved(event);
+ }
+ }
+
+ /**
+ * This method is called when the component is made visible.
+ *
+ * @param event the <code>ComponentEvent</code> indicating the visibility
+ */
+ public void componentShown(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentShown(event);
+ }
+ }
+
+ /**
+ * This method is called when the component is hidden.
+ *
+ * @param event the <code>ComponentEvent</code> indicating the visibility
+ */
+ public void componentHidden(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentHidden(event);
+ }
+ }
+
+ ///////////////////////////////////
+ ////// MouseListener Methods //////
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the mouse is clicked (pressed and released
+ * in short succession) on a component.
+ *
+ * @param event the <code>MouseEvent</code> indicating the click
+ */
+ public void mouseClicked(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseClicked(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse is pressed over a component.
+ *
+ * @param event the <code>MouseEvent</code> for the press
+ */
+ public void mousePressed(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mousePressed(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse is released over a component.
+ *
+ * @param event the <code>MouseEvent</code> for the release
+ */
+ public void mouseReleased(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseReleased(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse enters a component.
+ *
+ * @param event the <code>MouseEvent</code> for the entry
+ */
+ public void mouseEntered(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseEntered(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse exits a component.
+ *
+ * @param event the <code>MouseEvent</code> for the exit
+ */
+ public void mouseExited(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseExited(event);
+ }
+ }
+
+ ///////////////////////////////////
+ /// MouseMotionListener Methods ///
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the mouse is moved over a component
+ * while a button has been pressed.
+ *
+ * @param event the <code>MouseEvent</code> indicating the motion
+ */
+ public void mouseDragged(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseMotionListener[] l = applet.getMouseMotionListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseDragged(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse is moved over a component
+ * while no button is pressed.
+ *
+ * @param event the <code>MouseEvent</code> indicating the motion
+ */
+ public void mouseMoved(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseMotionListener[] l = applet.getMouseMotionListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseMoved(event);
+ }
+ }
+
+ ///////////////////////////////////
+ /// InputMethodListener Methods ///
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the text is changed.
+ *
+ * @param event the <code>InputMethodEvent</code> indicating the text change
+ */
+ public void inputMethodTextChanged(InputMethodEvent event)
+ {
+ if (applet != null)
+ {
+ InputMethodListener[] l = applet.getInputMethodListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].inputMethodTextChanged(event);
+ }
+ }
+
+ /**
+ * This method is called when the cursor position within the text is changed.
+ *
+ * @param event the <code>InputMethodEvent</code> indicating the change
+ */
+ public void caretPositionChanged(InputMethodEvent event)
+ {
+ if (applet != null)
+ {
+ InputMethodListener[] l = applet.getInputMethodListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].caretPositionChanged(event);
+ }
+ }
+
+ ///////////////////////////////////
+ //// HierarchyListener Methods ////
+ ///////////////////////////////////
+
+ /**
+ * Called when the hierarchy of this component changes. Use
+ * <code>getChangeFlags()</code> on the event to see what exactly changed.
+ *
+ * @param e the event describing the change
+ */
+ public void hierarchyChanged(HierarchyEvent event)
+ {
+ if (applet != null)
+ {
+ HierarchyListener[] l = applet.getHierarchyListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].hierarchyChanged(event);
+ }
+ }
+
+ /////////////////////////////////////////
+ //// HierarchyBoundsListener Methods ////
+ /////////////////////////////////////////
+
+ /**
+ * Called when an ancestor component of the source is moved.
+ *
+ * @param e the event describing the ancestor's motion
+ */
+ public void ancestorMoved(HierarchyEvent e)
+ {
+ if (applet != null)
+ {
+ HierarchyBoundsListener[] l = applet.getHierarchyBoundsListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].ancestorMoved(e);
+ }
+ }
+
+ /**
+ * Called when an ancestor component is resized.
+ *
+ * @param e the event describing the ancestor's resizing
+ */
+ public void ancestorResized(HierarchyEvent e)
+ {
+ if (applet != null)
+ {
+ HierarchyBoundsListener[] l = applet.getHierarchyBoundsListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].ancestorResized(e);
+ }
+ }
+
+ void setParser(String tag, String documentbase) throws MalformedURLException, IOException
+ {
+ URL documentbaseURL = TagParser.getLocationToURL(documentbase);
+ StringReader in = new StringReader(tag);
+ this.parser = new TagParser(in, documentbaseURL);
+ }
+
+ // /////////////////////////////////
+ // //// EmbeddedWindow Method //////
+ // /////////////////////////////////
+
+ /**
+ * Set the native handle of the window system to embed the window in.
+ *
+ * @param handle the native handle.
+ */
+ public void setHandle(long handle)
+ {
+ super.setHandle(handle);
+ addNotify();
+
+ ArrayList l = parser.parseAppletTags();
+ int s = l.size();
+
+ for (int i = 0; i < s; i++)
+ {
+ tag = (AppletTag) l.get(i);
+ applet = Main.createApplet(tag);
+
+ if (contexts.get(tag.getCodeBase()) == null)
+ contexts.put(tag.getCodeBase(), new PluginAppletContext());
+
+ int result = AppletWarning.show();
+ if (result == JOptionPane.NO_OPTION)
+ return;
+
+ add(applet);
+
+ AppletContext context = (AppletContext) contexts.get(tag.getCodeBase());
+ ((PluginAppletContext) context).addApplet(applet);
+
+ applet.setStub(new CommonAppletStub(tag, context, applet));
+ Dimension size = getSize();
+ if (size.width == 0 || size.height == 0)
+ size = tag.getSize();
+ applet.setSize(size);
+
+ // Initialize the applet before showing this window so that
+ // the applet doesn't receive events before it has been
+ // initialized.
+ applet.init();
+ applet.start();
+ setVisible(true);
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/StandaloneAppletContext.java b/tools/gnu/classpath/tools/appletviewer/StandaloneAppletContext.java
new file mode 100644
index 000000000..a779f068a
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/StandaloneAppletContext.java
@@ -0,0 +1,75 @@
+/* StandaloneAppletContext.java -- an applet's context within the
+ standalone viewer
+ Copyright (C) 2003, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.net.URL;
+import java.util.Iterator;
+import java.util.List;
+
+
+/**
+ * StandaloneAppletContext represents the context within a webpage of a
+ * group of applets that all share the same codebase.
+ */
+class StandaloneAppletContext extends CommonAppletContext
+{
+ private List appletWindows;
+
+ StandaloneAppletContext(List appletWindows)
+ {
+ this.appletWindows = appletWindows;
+ }
+
+ public void showDocument(URL url, String target)
+ {
+ System.err.println("showDocument is not implemented in standalone mode");
+ }
+
+ // In standalone mode, there are potentially several windows, each
+ // with its own status bar. In plugin mode, all the applets in the
+ // same context (on the same page) share the browser's status bar.
+ // The best way to simulate the plugin mode behaviour in standalone
+ // mode is to show the same status on each window's status bar.
+ public void showStatus(String status)
+ {
+ Iterator window = appletWindows.iterator();
+ while (window.hasNext())
+ ((StandaloneAppletWindow) window.next()).showStatus(status);
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/StandaloneAppletViewer.java b/tools/gnu/classpath/tools/appletviewer/StandaloneAppletViewer.java
new file mode 100644
index 000000000..2b58f4b87
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/StandaloneAppletViewer.java
@@ -0,0 +1,144 @@
+/* StandaloneAppletViewer.java -- a standalone viewer for Java applets
+ Copyright (C) 2003, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.awt.Dimension;
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+
+/**
+ * StandaloneAppletViewer displays an applet in its own Frame. Most
+ * of the context that is available to an applet within a webpage is
+ * available to it in StandaloneAppletViewer.
+ */
+class StandaloneAppletViewer extends Main
+{
+ static ArrayList appletTags = new ArrayList();
+ static ArrayList appletWindows = new ArrayList();
+
+ StandaloneAppletViewer(String[] urls)
+ throws MalformedURLException, IOException
+ {
+ // Handle each file specified on the command line.
+ for (int i = 0; i < urls.length; i++)
+ {
+ TagParser parser = new TagParser(urls[i]);
+ appletTags.addAll(parser.parseAppletTags());
+ }
+
+ printTags();
+ createWindows();
+ }
+
+ StandaloneAppletViewer(String code, String codebase, String archives,
+ List parameters, Dimension dimensions)
+ throws IOException
+ {
+ if (!(code.equals("") || code.endsWith(".class")))
+ {
+ System.err.println("appletviewer: option '--code' requires a class filename");
+ System.exit(1);
+ }
+
+ String tagString =
+ "<EMBED"
+ + " CODE=\"" + code + "\""
+ + " WIDTH=" + dimensions.width
+ + " HEIGHT=" + dimensions.height
+ + " CODEBASE=\"" + codebase + "\""
+ + " ARCHIVE=\"" + archives + "\">";
+
+ // Handle parameters.
+ Iterator pairs = parameters.iterator();
+ while (pairs.hasNext())
+ {
+ StringTokenizer paramTokenizer =
+ new StringTokenizer((String) pairs.next(), ",");
+ tagString +=
+ "<PARAM NAME=" + paramTokenizer.nextToken().trim() + " VALUE="
+ + paramTokenizer.nextToken().trim() + ">";
+ }
+
+ tagString += "</EMBED>";
+
+ StringReader reader = new StringReader(tagString);
+ String path = System.getProperty("user.dir") + File.separator;
+ TagParser parser = new TagParser(reader,
+ new URL("file", "", path));
+ appletTags.addAll(parser.parseAppletTags());
+
+ printTags();
+ createWindows();
+ }
+
+ void printTags()
+ {
+ if (verbose)
+ {
+ System.out.println("parsed applet tags:");
+
+ for (int i = 0; i < appletTags.size(); i++)
+ {
+ AppletTag tag = (AppletTag) appletTags.get(i);
+
+ System.out.println(" tag " + i + ":");
+ System.out.println(tag);
+ }
+ }
+ }
+
+ void createWindows()
+ {
+ for (int i = 0; i < appletTags.size(); i++)
+ {
+ AppletTag tag = (AppletTag) appletTags.get(i);
+
+ // Create a StandaloneAppletWindow and add it to the
+ // appletWindows list.
+ new StandaloneAppletWindow(tag, appletWindows);
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/StandaloneAppletWindow.java b/tools/gnu/classpath/tools/appletviewer/StandaloneAppletWindow.java
new file mode 100644
index 000000000..3b337bf80
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/StandaloneAppletWindow.java
@@ -0,0 +1,559 @@
+/* StandaloneAppletWindow.java -- an applet frame
+ Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import java.applet.Applet;
+import java.applet.AppletContext;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Insets;
+import java.awt.Label;
+import java.awt.Menu;
+import java.awt.MenuBar;
+import java.awt.MenuItem;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.ContainerEvent;
+import java.awt.event.ContainerListener;
+import java.awt.event.HierarchyBoundsListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import java.awt.event.InputMethodEvent;
+import java.awt.event.InputMethodListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.HashMap;
+import java.util.List;
+
+class StandaloneAppletWindow
+ extends Frame
+ implements ActionListener, ContainerListener, ComponentListener,
+ MouseListener, MouseMotionListener, InputMethodListener, HierarchyListener,
+ HierarchyBoundsListener
+{
+
+ // This class implements various listeners because the author of an applet
+ // may attach listeners to it, unaware of the applet's parent (this class).
+ // So, we must pass all listener events on this plugin applet window to the
+ // actual applet.
+
+ private static int testWindowCount;
+ private static HashMap contexts = new HashMap();
+ private Applet applet;
+ private Label status = new Label();
+
+ private MenuItem restartItem;
+ private MenuItem reloadItem;
+ private MenuItem cancelItem;
+ private MenuItem saveItem;
+ private MenuItem startItem;
+ private MenuItem cloneItem;
+ private MenuItem tagItem;
+ private MenuItem infoItem;
+ private MenuItem editItem;
+ private MenuItem encodingItem;
+ private MenuItem printItem;
+ private MenuItem propertiesItem;
+ private MenuItem closeItem;
+ private MenuItem quitItem;
+
+ StandaloneAppletWindow(AppletTag tag, List appletWindows)
+ {
+ appletWindows.add(this);
+ applet = Main.createApplet(tag);
+
+ if (contexts.get(tag.codebase) == null)
+ contexts.put(tag.codebase, new StandaloneAppletContext(appletWindows));
+
+ setLayout(new BorderLayout());
+ add(applet, BorderLayout.CENTER);
+ add(status, BorderLayout.SOUTH);
+
+ addWindowListener(new WindowAdapter()
+ {
+ public void windowClosing(WindowEvent event)
+ {
+ applet.stop();
+ StandaloneAppletWindow.this.hide();
+ System.exit(0);
+ }
+ });
+
+ addContainerListener(this);
+ addComponentListener(this);
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ addInputMethodListener(this);
+ addHierarchyListener(this);
+ addHierarchyBoundsListener(this);
+
+ restartItem = new MenuItem(Main.messages.getString("gcjwebplugin.menu_restart"));
+ restartItem.setEnabled(false);
+ restartItem.addActionListener(this);
+ reloadItem = new MenuItem(Main.messages.getString("gcjwebplugin.menu_reload"));
+ reloadItem.setEnabled(false);
+ reloadItem.addActionListener(this);
+ cancelItem = new MenuItem(Main.messages.getString("gcjwebplugin.menu_cancel"));
+ cancelItem.setEnabled(false);
+ cancelItem.addActionListener(this);
+ saveItem = new MenuItem(Main.messages.getString("gcjwebplugin.menu_save"));
+ saveItem.setEnabled(false);
+ saveItem.addActionListener(this);
+ startItem = new MenuItem(Main.messages.getString("gcjwebplugin.menu_start"));
+ startItem.setEnabled(false);
+ startItem.addActionListener(this);
+ cloneItem = new MenuItem(Main.messages.getString("gcjwebplugin.menu_clone"));
+ cloneItem.setEnabled(false);
+ cloneItem.addActionListener(this);
+ closeItem = new MenuItem(Main.messages.getString("gcjwebplugin.menu_close"));
+ closeItem.setEnabled(false);
+ closeItem.addActionListener(this);
+ tagItem =
+ new MenuItem(Main.messages.getString("gcjwebplugin.menu_tag"));
+ tagItem.setEnabled(false);
+ tagItem.addActionListener(this);
+ infoItem =
+ new MenuItem(Main.messages.getString("gcjwebplugin.menu_info"));
+ infoItem.setEnabled(false);
+ infoItem.addActionListener(this);
+ editItem =
+ new MenuItem(Main.messages.getString("gcjwebplugin.menu_edit"));
+ editItem.setEnabled(false);
+ editItem.addActionListener(this);
+ editItem.setEnabled(false);
+ encodingItem =
+ new MenuItem(Main.messages.getString("gcjwebplugin.menu_encoding"));
+ encodingItem.setEnabled(false);
+ encodingItem.addActionListener(this);
+ printItem =
+ new MenuItem(Main.messages.getString("gcjwebplugin.menu_print"));
+ printItem.setEnabled(false);
+ printItem.addActionListener(this);
+ propertiesItem =
+ new MenuItem(Main.messages.getString("gcjwebplugin.menu_properties"));
+ propertiesItem.setEnabled(false);
+ propertiesItem.addActionListener(this);
+ quitItem = new MenuItem(Main.messages.getString("gcjwebplugin.menu_quit"));
+ quitItem.addActionListener(this);
+
+ MenuBar menuBar = new MenuBar();
+ Menu menuApplet = new Menu(Main.messages.getString("gcjwebplugin.menu_title"));
+ menuBar.add(menuApplet);
+ menuApplet.add(restartItem);
+ menuApplet.add(reloadItem);
+ menuApplet.add(cancelItem);
+ menuApplet.add(saveItem);
+ menuApplet.add(startItem);
+ menuApplet.add(cloneItem);
+ menuApplet.addSeparator();
+ menuApplet.add(tagItem);
+ menuApplet.add(infoItem);
+ menuApplet.add(editItem);
+ menuApplet.add(encodingItem);
+ menuApplet.addSeparator();
+ menuApplet.add(printItem);
+ menuApplet.addSeparator();
+ menuApplet.add(propertiesItem);
+ menuApplet.addSeparator();
+ menuApplet.add(closeItem);
+ menuApplet.add(quitItem);
+ setMenuBar(menuBar);
+ setTitle("GCJ Applet Viewer: " + tag.code);
+
+ AppletContext context = (AppletContext) contexts.get(tag.codebase);
+ ((StandaloneAppletContext) context).addApplet(applet);
+
+ applet.setStub(new CommonAppletStub(tag, context, applet));
+
+ // Create the frame's peer. Otherwise getPreferredSize will read
+ // its insets as 0.
+ addNotify();
+ Insets i = getInsets();
+ Dimension size = tag.getSize();
+ setSize(i.left + size.width + i.right,
+ i.top + size.height + status.getPreferredSize().height
+ + i.bottom);
+ applet.setSize(size);
+
+ // Initialize the applet before showing this window so that the
+ // applet doesn't receive events before it has been initialized.
+ applet.init();
+ applet.start();
+ setVisible(true);
+ }
+
+ private void closeWindow()
+ {
+ applet.stop();
+ StandaloneAppletViewer.appletWindows.remove(this);
+ StandaloneAppletWindow.this.hide();
+ }
+
+ public void actionPerformed(ActionEvent e)
+ {
+ if (e.getSource() == quitItem)
+ {
+ closeWindow();
+ System.exit(0);
+ }
+ else if (e.getSource() == closeItem)
+ {
+ // Close current window.
+ closeWindow();
+
+ // Exit if there are other windows left.
+ if (StandaloneAppletViewer.appletWindows.isEmpty())
+ System.exit(0);
+ }
+ }
+
+ void showStatus(String status)
+ {
+ this.status.setText(status);
+ }
+
+
+ ///////////////////////////////////
+ /// ContainerListener Methods /////
+ ///////////////////////////////////
+
+ /**
+ * This method is called when a component is added to the container.
+ *
+ * @param event the <code>ContainerEvent</code> indicating component
+ * addition
+ */
+ public void componentAdded(ContainerEvent event)
+ {
+ if (applet != null)
+ {
+ ContainerListener[] l = applet.getContainerListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentAdded(event);
+ }
+ }
+
+ /**
+ * This method is called when a component is removed from the container.
+ *
+ * @param event the <code>ContainerEvent</code> indicating component removal
+ */
+ public void componentRemoved(ContainerEvent event)
+ {
+ if (applet != null)
+ {
+ ContainerListener[] l = applet.getContainerListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentRemoved(event);
+ }
+ }
+
+ ///////////////////////////////////
+ /// ComponentListener Methods /////
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the component is resized.
+ *
+ * @param event the <code>ComponentEvent</code> indicating the resize
+ */
+ public void componentResized(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentResized(event);
+ }
+ }
+
+ /**
+ * This method is called when the component is moved.
+ *
+ * @param event the <code>ComponentEvent</code> indicating the move
+ */
+ public void componentMoved(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentMoved(event);
+ }
+ }
+
+ /**
+ * This method is called when the component is made visible.
+ *
+ * @param event the <code>ComponentEvent</code> indicating the visibility
+ */
+ public void componentShown(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentShown(event);
+ }
+ }
+
+ /**
+ * This method is called when the component is hidden.
+ *
+ * @param event the <code>ComponentEvent</code> indicating the visibility
+ */
+ public void componentHidden(ComponentEvent event)
+ {
+ if (applet != null)
+ {
+ ComponentListener[] l = applet.getComponentListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].componentHidden(event);
+ }
+ }
+
+ ///////////////////////////////////
+ ////// MouseListener Methods //////
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the mouse is clicked (pressed and released
+ * in short succession) on a component.
+ *
+ * @param event the <code>MouseEvent</code> indicating the click
+ */
+ public void mouseClicked(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseClicked(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse is pressed over a component.
+ *
+ * @param event the <code>MouseEvent</code> for the press
+ */
+ public void mousePressed(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mousePressed(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse is released over a component.
+ *
+ * @param event the <code>MouseEvent</code> for the release
+ */
+ public void mouseReleased(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseReleased(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse enters a component.
+ *
+ * @param event the <code>MouseEvent</code> for the entry
+ */
+ public void mouseEntered(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseEntered(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse exits a component.
+ *
+ * @param event the <code>MouseEvent</code> for the exit
+ */
+ public void mouseExited(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseListener[] l = applet.getMouseListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseExited(event);
+ }
+ }
+
+ ///////////////////////////////////
+ /// MouseMotionListener Methods ///
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the mouse is moved over a component
+ * while a button has been pressed.
+ *
+ * @param event the <code>MouseEvent</code> indicating the motion
+ */
+ public void mouseDragged(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseMotionListener[] l = applet.getMouseMotionListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseDragged(event);
+ }
+ }
+
+ /**
+ * This method is called when the mouse is moved over a component
+ * while no button is pressed.
+ *
+ * @param event the <code>MouseEvent</code> indicating the motion
+ */
+ public void mouseMoved(MouseEvent event)
+ {
+ if (applet != null)
+ {
+ MouseMotionListener[] l = applet.getMouseMotionListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].mouseMoved(event);
+ }
+ }
+
+ ///////////////////////////////////
+ /// InputMethodListener Methods ///
+ ///////////////////////////////////
+
+ /**
+ * This method is called when the text is changed.
+ *
+ * @param event the <code>InputMethodEvent</code> indicating the text change
+ */
+ public void inputMethodTextChanged(InputMethodEvent event)
+ {
+ if (applet != null)
+ {
+ InputMethodListener[] l = applet.getInputMethodListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].inputMethodTextChanged(event);
+ }
+ }
+
+ /**
+ * This method is called when the cursor position within the text is changed.
+ *
+ * @param event the <code>InputMethodEvent</code> indicating the change
+ */
+ public void caretPositionChanged(InputMethodEvent event)
+ {
+ if (applet != null)
+ {
+ InputMethodListener[] l = applet.getInputMethodListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].caretPositionChanged(event);
+ }
+ }
+
+ ///////////////////////////////////
+ //// HierarchyListener Methods ////
+ ///////////////////////////////////
+
+ /**
+ * Called when the hierarchy of this component changes. Use
+ * <code>getChangeFlags()</code> on the event to see what exactly changed.
+ *
+ * @param e the event describing the change
+ */
+ public void hierarchyChanged(HierarchyEvent event)
+ {
+ if (applet != null)
+ {
+ HierarchyListener[] l = applet.getHierarchyListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].hierarchyChanged(event);
+ }
+ }
+
+ /////////////////////////////////////////
+ //// HierarchyBoundsListener Methods ////
+ /////////////////////////////////////////
+
+ /**
+ * Called when an ancestor component of the source is moved.
+ *
+ * @param e the event describing the ancestor's motion
+ */
+ public void ancestorMoved(HierarchyEvent e)
+ {
+ if (applet != null)
+ {
+ HierarchyBoundsListener[] l = applet.getHierarchyBoundsListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].ancestorMoved(e);
+ }
+ }
+
+ /**
+ * Called when an ancestor component is resized.
+ *
+ * @param e the event describing the ancestor's resizing
+ */
+ public void ancestorResized(HierarchyEvent e)
+ {
+ if (applet != null)
+ {
+ HierarchyBoundsListener[] l = applet.getHierarchyBoundsListeners();
+ for (int i = 0; i < l.length; i++)
+ l[i].ancestorResized(e);
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/appletviewer/TagParser.java b/tools/gnu/classpath/tools/appletviewer/TagParser.java
new file mode 100644
index 000000000..68dce97e0
--- /dev/null
+++ b/tools/gnu/classpath/tools/appletviewer/TagParser.java
@@ -0,0 +1,302 @@
+/* TagParser.java -- a parser for applet tags
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.appletviewer;
+
+import gnu.javax.swing.text.html.parser.HTML_401F;
+
+import gnu.xml.dom.DomNode;
+import gnu.xml.dom.html2.DomHTMLAppletElement;
+import gnu.xml.dom.html2.DomHTMLDocument;
+import gnu.xml.dom.html2.DomHTMLEmbedElement;
+import gnu.xml.dom.html2.DomHTMLObjectElement;
+import gnu.xml.dom.html2.DomHTMLParamElement;
+import gnu.xml.dom.html2.DomHTMLParser;
+
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.Reader;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import org.w3c.dom.NodeList;
+
+
+public class TagParser
+{
+
+ /**
+ * Parsed document.
+ */
+ DomHTMLDocument document;
+
+ /**
+ * The document base of this applet.
+ */
+ URL documentbase;
+
+ /**
+ * The document base of all the applets.
+ */
+ static URL db;
+
+ /**
+ * The tags in the document.
+ */
+ Vector tags = new Vector();
+
+ /**
+ * Default constructor.
+ */
+ TagParser()
+ {
+ // Do nothing.
+ }
+
+ /**
+ * Constructs and parses document using the given location.
+ *
+ * @param location - location of applet
+ */
+ TagParser(String location) throws IOException
+ {
+ documentbase = getLocationToURL(location);
+ db = documentbase;
+ InputStreamReader in = new InputStreamReader(documentbase.openStream());
+ document = (DomHTMLDocument) (new DomHTMLParser(HTML_401F.getInstance()).parseDocument(in));
+ }
+
+ /**
+ * Constructs and parses document.
+ *
+ * @param in - Reader to parse document from.
+ * @param documentBase - the URL of the applet
+ * @throws IOException - is thrown if any IO error occurs.
+ */
+ TagParser(Reader in, URL documentBase) throws IOException
+ {
+ documentbase = documentBase;
+ db = documentbase;
+ document = (DomHTMLDocument) (new DomHTMLParser(HTML_401F.getInstance()).parseDocument(in));
+ }
+
+ /**
+ * Parses all applet tags in document.
+ *
+ * @return a list of AppletTag objects representing the applet tags
+ * in document
+ */
+ ArrayList parseAppletTags()
+ {
+ ArrayList allTags = new ArrayList();
+ if (document == null)
+ return null;;
+
+ recurseDocument(document.getChildNodes());
+
+ int sz = tags.size();
+ for (int j = 0; j < sz; j++)
+ {
+ Object curr = tags.get(j);
+ // Order of checking is important here.
+ // Must check embed element before applet element
+ // because DomHTMLEmbedElement extends DomHTMLAppletElement
+ AppletTag a = null;
+ if (curr instanceof DomHTMLEmbedElement)
+ a = new AppletTag((DomHTMLEmbedElement) curr);
+ else if (curr instanceof DomHTMLAppletElement)
+ a = new AppletTag((DomHTMLAppletElement) curr);
+ else if (curr instanceof DomHTMLObjectElement)
+ a = new AppletTag((DomHTMLObjectElement) curr);
+ a.documentbase = documentbase;
+ allTags.add(a);
+ }
+
+ return allTags;
+ }
+
+ /**
+ * Recurses the document in search for the appropriate tags.
+ *
+ * @param list - the Node list.
+ */
+ private void recurseDocument(NodeList list)
+ {
+ // Recurse and store all APPLET, OBJECT and EMBED tags.
+ int length = list.getLength();
+ for (int i = 0; i < length; i++)
+ {
+ DomNode curr = (DomNode) list.item(i);
+ if ((curr instanceof DomHTMLEmbedElement) ||
+ (curr instanceof DomHTMLAppletElement) ||
+ (curr instanceof DomHTMLObjectElement))
+ tags.add(curr);
+ recurseDocument(curr.getChildNodes());
+ }
+ }
+
+ /**
+ * Parses the param elements for a given node.
+ *
+ * @param node - the node element to parse.
+ */
+ static void parseParams(DomNode node, AppletTag t)
+ {
+ boolean ja = false;
+ boolean jb = false;
+ boolean jc = false;
+ NodeList l = node.getChildNodes();
+ int size = l.getLength();
+
+ if (size != 0)
+ for (int i = 0; i < size; i++)
+ {
+ Object c = l.item(i);
+ if (! (c instanceof DomHTMLParamElement))
+ continue;
+ DomHTMLParamElement curr = (DomHTMLParamElement) c;
+ String key = curr.getName();
+ String val = curr.getValue();
+
+ if (key.equals("java_code"))
+ {
+ jc = true;
+ t.code = val;
+ }
+ else if (key.equals("java_codebase"))
+ {
+ jb = true;
+ t.codebase = val;
+ }
+ else if (!jc && key.equals("code"))
+ t.code = val;
+ else if (!jc && key.equals("classid"))
+ {
+ int x = val.indexOf(":");
+ if (x != -1)
+ val = val.substring(x + 1);
+ t.code = val;
+ }
+ else if (!jb && key.equals("codebase"))
+ t.codebase = val;
+ else if (key.equals("java_archive"))
+ {
+ ja = true;
+ t.archives = parseArchives(val, t);
+ val = t.archives.toString();
+ }
+ else if (!ja && key.equals("archive"))
+ {
+ t.archives = parseArchives(val, t);
+ val = t.archives.toString();
+ }
+
+ t.parameters.put(key.toLowerCase(), val);
+ }
+ }
+
+ /**
+ * Parses the archive string and returns a list.
+ *
+ * @param the list of archives (comma-separated) in a String.
+ */
+ static ArrayList parseArchives(String arcs, AppletTag t)
+ {
+ try
+ {
+ ArrayList list = new ArrayList();
+
+ StringTokenizer tagTokenizer = new StringTokenizer(arcs, ",");
+ while (tagTokenizer.hasMoreTokens())
+ list.add(t.prependCodeBase(tagTokenizer.nextToken().trim()));
+
+ return list;
+ }
+ catch (MalformedURLException e)
+ {
+ }
+ return null;
+ }
+
+ /**
+ * Gets the location to the URL, given a location.
+ *
+ * @param location - the given location.
+ * @return the URL.
+ */
+ static URL getLocationToURL(String location) throws IOException
+ {
+ URL tmpDocumentBase = null;
+
+ try
+ {
+ // Try parsing location as a URL.
+ tmpDocumentBase = new URL(location);
+
+ // If no file was specified in the URL the assume the user
+ // meant the root page.
+ String f = tmpDocumentBase.getFile();
+ if (f.indexOf(".") == -1 && !f.endsWith(File.separator))
+ if (new File(tmpDocumentBase.getFile()).isDirectory())
+ tmpDocumentBase = new URL(location.concat(File.separator));
+ }
+ catch (MalformedURLException e)
+ {
+ // location is not a URL. See if it is an HTML file.
+ String path;
+
+ if (location.startsWith(File.separator))
+ path = new File(location).getCanonicalPath();
+ else
+ path = new File(System.getProperty("user.dir") + File.separator
+ + location).getCanonicalPath();
+
+ tmpDocumentBase = new URL("file", "", path);
+
+ if (new File(tmpDocumentBase.getFile()).isDirectory())
+ tmpDocumentBase = new URL("file", "", path + File.separator);
+ }
+
+ return tmpDocumentBase;
+ }
+}
diff --git a/tools/gnu/classpath/tools/common/CallbackUtil.java b/tools/gnu/classpath/tools/common/CallbackUtil.java
new file mode 100644
index 000000000..398bb6cae
--- /dev/null
+++ b/tools/gnu/classpath/tools/common/CallbackUtil.java
@@ -0,0 +1,145 @@
+/* CallbackUtil.java -- Callback related utilities
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.common;
+
+import gnu.javax.security.auth.callback.ConsoleCallbackHandler;
+
+import java.security.Provider;
+import java.security.Security;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.CallbackHandler;
+
+/**
+ * A <i>Helper</i> class containing general purpose utlity methods dealing with
+ * callback handlers and their <i>Security Provider</i>.
+ */
+public abstract class CallbackUtil
+{
+ private static final Logger log = Logger.getLogger(CallbackUtil.class.getName());
+
+ // default 0-arguments constructor
+
+ // Class methods
+ // --------------------------------------------------------------------------
+
+ /**
+ * Return an implementation of the {@link CallbackHandler}, from any
+ * {@link Provider}, capable of handling callbacks through the <i>console</i>;
+ * i.e. <code>System.in</code> and <code>System.out</code>.
+ * <p>
+ * If no <i>Security Provider</i> for this type of callback was found, this
+ * method returns the default GNU implementation.
+ *
+ * @return a console {@link CallbackHandler} implementation.
+ */
+ public static final CallbackHandler getConsoleHandler()
+ {
+ CallbackHandler result = getHandler("Console");
+ if (result == null)
+ {
+ log.fine("No console callback handler found. Will use ours");
+ result = new ConsoleCallbackHandler();
+ }
+ return result;
+ }
+
+ /**
+ * Return a {@link CallbackHandler}, of a designated type, for interacting
+ * with the user.
+ * <p>
+ * This method first finds all currently installed <i>Security Providers</i>
+ * capable of providing such service and then in turn attempts to instantiate
+ * the handler from those providers. As soon as one provider returns a non-
+ * null instance of the callback handler, the search stops and that instance
+ * is returned.
+ *
+ * @return a {@link CallbackHandler} of the designated type, or
+ * <code>null</code> if no provider was found for theis type of
+ * callback.
+ */
+ private static final CallbackHandler getHandler(String handlerType)
+ {
+ log.entering(CallbackUtil.class.getName(), "getHandler", handlerType);
+
+ CallbackHandler result = null;
+ String service = "CallbackHandler." + handlerType;
+ Provider[] providers = Security.getProviders(service);
+ if (providers != null)
+ for (int i = 0; i < providers.length; i++)
+ {
+ Provider p = providers[i];
+ String className = p.getProperty(service);
+ if (className != null)
+ try
+ {
+ result = (CallbackHandler) Class.forName(className.trim()).newInstance();
+ }
+ catch (InstantiationException x)
+ {
+ log.fine("InstantiationException while creating ["
+ + className + "] from provider [" + p.getName()
+ + "]. Ignore");
+ }
+ catch (IllegalAccessException x)
+ {
+ log.fine("IllegalAccessException while creating ["
+ + className + "] from provider [" + p.getName()
+ + "]. Ignore");
+ }
+ catch (ClassNotFoundException x)
+ {
+ log.fine("ClassNotFoundException while creating ["
+ + className + "] from provider [" + p.getName()
+ + "]. Ignore");
+ }
+
+ if (result != null)
+ {
+
+ log.fine("Will use [" + result.getClass().getName()
+ + "] from [" + p.getName() + "]");
+ break;
+ }
+ }
+
+ log.exiting(CallbackUtil.class.getName(), "getHandler", result);
+ return result;
+ }
+}
diff --git a/tools/gnu/classpath/tools/common/ProviderUtil.java b/tools/gnu/classpath/tools/common/ProviderUtil.java
new file mode 100644
index 000000000..8d0434433
--- /dev/null
+++ b/tools/gnu/classpath/tools/common/ProviderUtil.java
@@ -0,0 +1,163 @@
+/* ProviderUtil.java -- Security Provider related utilities
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.common;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.Provider;
+import java.security.Security;
+import java.util.logging.Logger;
+
+/**
+ * A <i>Helper</i> class containing general purpose utlity methods dealing with
+ * installing and removing <i>Security Providers</i> at runtime.
+ */
+public abstract class ProviderUtil
+{
+ private static final Logger log = Logger.getLogger(ProviderUtil.class.getName());
+
+ // default 0-arguments constructor
+
+ // Class methods
+ // --------------------------------------------------------------------------
+
+ /**
+ * Attempt to (a) instantiate, and (b) add a designated {@link Provider} by
+ * inserting at at the top of the list of <i>Security Providers</i> already
+ * present at runtime, only if it is not already installed.
+ * <p>
+ * <b>IMPORTANT</b>: This method overrides the security check usually carried
+ * out by the security manager when inserting a new {@link Provider}.
+ *
+ * @param providerClass a fully qualified, non-null, class name of a
+ * <i>Security Provider</i> to add if it is not already installed.
+ * @return an instance of {@link SecurityProviderInfo} referencing the
+ * {@link Provider} instance created with the designated class name,
+ * and its position in the underlying JVM runtime.
+ */
+ public static final SecurityProviderInfo addProvider(String providerClass)
+ {
+ log.entering(ProviderUtil.class.getName(), "addProvider", providerClass);
+
+ Provider provider = null;
+ try
+ {
+ provider = (Provider) Class.forName(providerClass.trim()).newInstance();
+ }
+ catch (InstantiationException x)
+ {
+ log.fine("InstantiationException while creating [" + providerClass
+ + "]. Ignore");
+ }
+ catch (IllegalAccessException x)
+ {
+ log.fine("IllegalAccessException while creating [" + providerClass
+ + "]. Ignore");
+ }
+ catch (ClassNotFoundException x)
+ {
+ log.fine("ClassNotFoundException while creating [" + providerClass
+ + "]. Ignore");
+ }
+
+ int position = provider != null ? addProvider(provider) : -1;
+ SecurityProviderInfo result = new SecurityProviderInfo(provider, position);
+
+ log.exiting(ProviderUtil.class.getName(), "addProvider", result);
+ return result;
+ }
+
+ /**
+ * Attempt to add the designated {@link Provider} by inserting at at the top
+ * of the list of <i>Security Providers</i> already present at runtime, only
+ * if it is not already installed.
+ * <p>
+ * <b>IMPORTANT</b>: This method overrides the security check usually carried
+ * out by the security manager when inserting a new {@link Provider}.
+ *
+ * @param provider a non-null <i>Security Provider</i> to add if it is not
+ * already installed.
+ * @return the new position of the designated provider in the list if it was
+ * not already present, or <code>-1</code> if it was already
+ * installed.
+ */
+ public static final int addProvider(final Provider provider)
+ {
+ log.entering(ProviderUtil.class.getName(), "addProvider", provider);
+
+ Integer actualPosition = (Integer) AccessController.doPrivileged(new PrivilegedAction()
+ {
+ public Object run()
+ {
+ int result = Security.insertProviderAt(provider, 1);
+ return Integer.valueOf(result);
+ }
+ });
+
+ int result = actualPosition.intValue();
+ log.fine("Provider [" + provider.getName() + "] installed? " + (result != - 1));
+
+ log.exiting(ProviderUtil.class.getName(), "addProvider", actualPosition);
+ return result;
+ }
+
+ /**
+ * Remove a designated <i>Security Provider</i>.
+ * <p>
+ * <b>IMPORTANT</b>: This method overrides the security check usually carried
+ * out by the security manager when removing a {@link Provider}.
+ *
+ * @param providerName the name of the {@link Provider} to remove.
+ */
+ public static final void removeProvider(final String providerName)
+ {
+ log.entering(ProviderUtil.class.getName(), "removeProvider", providerName);
+
+ AccessController.doPrivileged(new PrivilegedAction()
+ {
+ public Object run()
+ {
+ Security.removeProvider(providerName);
+ return null;
+ }
+ });
+
+ log.exiting(ProviderUtil.class.getName(), "removeProvider");
+ }
+}
diff --git a/tools/gnu/classpath/tools/common/SecurityProviderInfo.java b/tools/gnu/classpath/tools/common/SecurityProviderInfo.java
new file mode 100644
index 000000000..e12ee4fe3
--- /dev/null
+++ b/tools/gnu/classpath/tools/common/SecurityProviderInfo.java
@@ -0,0 +1,99 @@
+/* SecurityProviderInfo.java -- Data Access Object for a security provider
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.common;
+
+import java.security.Provider;
+
+/**
+ * A Data Access Object (DAO) referenceing a <i>Security Provider</i> and its
+ * position in the list of installed <i>Security Providers</i> in the underlying
+ * JVM runtime.
+ */
+public class SecurityProviderInfo
+{
+ final private Provider provider;
+ final private int position;
+ private transient String str;
+
+ /**
+ * Constructs an instance of <code>SecurityProviderInfo</code>.
+ * <p>
+ * Used by {@link ProviderUtil} to indicate the result of adding a provider,
+ * given its class name.
+ *
+ * @param provider the possibly <code>null</code> {@link Provider}.
+ * @param position the position of <code>provider</code> in the list of
+ * <i>Security Providers</i> in the underlying JVM runtime. <code>-1</code>
+ * if that provider (a) is <code>null</code>, or (b) was not added because it
+ * was already there.
+ */
+ SecurityProviderInfo(Provider provider, int position)
+ {
+ super();
+
+ this.provider = provider;
+ this.position = position;
+ }
+
+ /** @return the possibly <code>null</code> {@link Provider} instance. */
+ public Provider getProvider()
+ {
+ return this.provider;
+ }
+
+ /**
+ * @return the position of the {@link Provider}, or <code>-1</code> if it
+ * was not added.
+ */
+ public int getPosition()
+ {
+ return this.position;
+ }
+
+ public String toString()
+ {
+ if (str == null)
+ if (provider == null)
+ str = "SecurityProviderInfo{null, -1}";
+ else
+ str = "SecurityProviderInfo{" + provider.getName() + ", " + position + "}";
+
+ return str;
+ }
+}
diff --git a/tools/gnu/classpath/tools/getopt/ClasspathToolParser.java b/tools/gnu/classpath/tools/getopt/ClasspathToolParser.java
new file mode 100644
index 000000000..be382a7a4
--- /dev/null
+++ b/tools/gnu/classpath/tools/getopt/ClasspathToolParser.java
@@ -0,0 +1,71 @@
+/* ClasspathToolParser.java -- Parser subclass for classpath tools
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.getopt;
+
+import gnu.classpath.Configuration;
+
+/**
+ * This is like the Parser class, but is specialized for use by
+ * tools distributed with GNU Classpath. In particular it automatically
+ * computes the version string using the program's name.
+ */
+public class ClasspathToolParser
+ extends Parser
+{
+ private static String getVersionString(String programName)
+ {
+ return (programName + " (GNU Classpath) "
+ + Configuration.CLASSPATH_VERSION
+ + "\n\n"
+ + "Copyright 2006 Free Software Foundation, Inc.\n"
+ + "This is free software; see the source for copying conditions. There is NO\n"
+ + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.");
+
+ }
+
+ public ClasspathToolParser(String programName)
+ {
+ super(programName, getVersionString(programName));
+ }
+
+ public ClasspathToolParser(String programName, boolean longOnly)
+ {
+ super(programName, getVersionString(programName), longOnly);
+ }
+}
diff --git a/tools/gnu/classpath/tools/getopt/FileArgumentCallback.java b/tools/gnu/classpath/tools/getopt/FileArgumentCallback.java
new file mode 100644
index 000000000..0c44745c9
--- /dev/null
+++ b/tools/gnu/classpath/tools/getopt/FileArgumentCallback.java
@@ -0,0 +1,61 @@
+/* FileArgumentCallback.java - handle non-option command line arguments
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.getopt;
+
+/**
+ * This is a callback class which is used when a "file name" is found by the
+ * command-line parser. A file name is any command-line argument which does not
+ * start with a dash and which is not the argument of some preceding option.
+ */
+public abstract class FileArgumentCallback
+{
+ /**
+ * Create a new instance.
+ */
+ protected FileArgumentCallback()
+ {
+ }
+
+ /**
+ * This is called when a file argument is seen.
+ *
+ * @param fileArgument the file name
+ */
+ public abstract void notifyFile(String fileArgument);
+}
diff --git a/tools/gnu/classpath/tools/getopt/Option.java b/tools/gnu/classpath/tools/getopt/Option.java
new file mode 100644
index 000000000..e54aaa103
--- /dev/null
+++ b/tools/gnu/classpath/tools/getopt/Option.java
@@ -0,0 +1,201 @@
+/* Option.java - represent a command-line option
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.getopt;
+
+/**
+ * This is the base class representing an option. An option can have a short
+ * form. This is a single character, like '-x'. An option can have a long form,
+ * like '--verbose'; if the parser is working in "long option only" mode, then a
+ * long flag has a single dash, like '-verbose'. Both a long and a short form
+ * may be specified; it is not valid to have neither. A description is mandatory
+ * for options; this is used to automatically generate '--help' output.
+ */
+public abstract class Option
+{
+ private char shortName;
+
+ private String longName;
+
+ private String description;
+
+ private String argumentName;
+
+ /**
+ * Create a new option with the given short name and description.
+ *
+ * @param shortName the short name
+ * @param description the description
+ */
+ protected Option(char shortName, String description)
+ {
+ this.shortName = shortName;
+ this.description = description;
+ }
+
+ /**
+ * Create a new option with the given short name and description.
+ *
+ * @param shortName the short name
+ * @param description the description
+ * @param argumentName the descriptive name of the argument, if this option
+ * takes an argument; otherwise null
+ */
+ protected Option(char shortName, String description, String argumentName)
+ {
+ this.shortName = shortName;
+ this.description = description;
+ this.argumentName = argumentName;
+ }
+
+ /**
+ * Create a new option with the given long name and description. The long name
+ * should be specified without any leading dashes.
+ *
+ * @param longName the long name
+ * @param description the description
+ */
+ protected Option(String longName, String description)
+ {
+ this.longName = longName;
+ this.description = description;
+ }
+
+ /**
+ * Create a new option with the given long name and description. The long name
+ * should be specified without any leading dashes.
+ *
+ * @param longName the long name
+ * @param description the description
+ * @param argumentName the descriptive name of the argument, if this option
+ * takes an argument; otherwise null
+ */
+ protected Option(String longName, String description, String argumentName)
+ {
+ this.longName = longName;
+ this.description = description;
+ this.argumentName = argumentName;
+ }
+
+ /**
+ * Create a new option with the given short and long names and description.
+ * The long name should be specified without any leading dashes.
+ *
+ * @param longName the long name
+ * @param shortName the short name
+ * @param description the description
+ */
+ protected Option(String longName, char shortName, String description)
+ {
+ this.shortName = shortName;
+ this.longName = longName;
+ this.description = description;
+ }
+
+ /**
+ * Create a new option with the given short and long names and description.
+ * The long name should be specified without any leading dashes.
+ *
+ * @param longName the long name
+ * @param shortName the short name
+ * @param description the description
+ * @param argumentName the descriptive name of the argument, if this option
+ * takes an argument; otherwise null
+ */
+ protected Option(String longName, char shortName, String description,
+ String argumentName)
+ {
+ this.shortName = shortName;
+ this.longName = longName;
+ this.argumentName = argumentName;
+ this.description = description;
+ }
+
+ /**
+ * Return the short name of the option, or \0 if none.
+ */
+ public char getShortName()
+ {
+ return shortName;
+ }
+
+ /**
+ * Return the long name of the option, or null if none.
+ */
+ public String getLongName()
+ {
+ return longName;
+ }
+
+ /**
+ * Return true if the argument takes an option.
+ */
+ public boolean getTakesArgument()
+ {
+ return argumentName != null;
+ }
+
+ /**
+ * Return the name of the argument. If the option does not take an argument,
+ * returns null.
+ */
+ public String getArgumentName()
+ {
+ return argumentName;
+ }
+
+ /**
+ * Return the description of the option.
+ */
+ public String getDescription()
+ {
+ // FIXME: localization.
+ return description;
+ }
+
+ /**
+ * This is called by the parser when this option is recognized. It may be
+ * called multiple times during a single parse. If this option takes an
+ * argument, the argument will be passed in. Otherwise the argument will be
+ * null.
+ *
+ * @param argument the argument
+ * @throws OptionException if the option or its argument is somehow invalid
+ */
+ public abstract void parsed(String argument) throws OptionException;
+}
diff --git a/tools/gnu/classpath/tools/getopt/OptionException.java b/tools/gnu/classpath/tools/getopt/OptionException.java
new file mode 100644
index 000000000..a09d716f4
--- /dev/null
+++ b/tools/gnu/classpath/tools/getopt/OptionException.java
@@ -0,0 +1,52 @@
+/* OptionException.java - when command-line processing fails
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.getopt;
+
+/**
+ * An OptionException is thrown internally when an error is seen when parsing a
+ * command line.
+ */
+public class OptionException
+ extends Exception
+{
+ public OptionException(String message)
+ {
+ super(message);
+ }
+}
diff --git a/tools/gnu/classpath/tools/getopt/OptionGroup.java b/tools/gnu/classpath/tools/getopt/OptionGroup.java
new file mode 100644
index 000000000..d83b273ba
--- /dev/null
+++ b/tools/gnu/classpath/tools/getopt/OptionGroup.java
@@ -0,0 +1,171 @@
+/* OptionGroup.java - a group of related command-line options
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.getopt;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * An option group holds a collection of Options. It also has a name. Option
+ * groups are primarily useful for grouping help output.
+ */
+public class OptionGroup
+{
+ private String name;
+
+ ArrayList options = new ArrayList();
+
+ /**
+ * Create a new nameless option group. This can only be used by Parser.
+ */
+ OptionGroup()
+ {
+ }
+
+ /**
+ * Create a new option group with the indicated name.
+ *
+ * @param name the name
+ */
+ public OptionGroup(String name)
+ {
+ this.name = name;
+ }
+
+ /**
+ * Add an option to this option group.
+ *
+ * @param opt the option to add
+ */
+ public void add(Option opt)
+ {
+ options.add(opt);
+ }
+
+ /**
+ * Print the help output for this option group.
+ *
+ * @param out the stream to which to print
+ */
+ public void printHelp(PrintStream out)
+ {
+ // Compute maximum lengths.
+ int maxArgLen = 0;
+ int maxShortLen = 0;
+ Iterator it = options.iterator();
+ while (it.hasNext())
+ {
+ Option option = (Option) it.next();
+ String argName = option.getArgumentName();
+ // First compute the width required for the short
+ // option. "2" is the initial indentation. In the
+ // GNU style we don't print an argument name for
+ // a short option if there is also a long name for
+ // the option.
+ int thisArgLen = 2;
+ if (option.getShortName() != '\0')
+ {
+ // The name of the option plus some padding.
+ thisArgLen += 4;
+ }
+ maxShortLen = Math.max(thisArgLen, maxShortLen);
+ if (option.getLongName() != null)
+ {
+ // FIXME: different if parsing in 'long option only'
+ // mode.
+ thisArgLen += 2 + option.getLongName().length();
+ }
+ // We only need to add the argument name in once,
+ // and we don't let it contribute to the width of
+ // the short name.
+ if (argName != null)
+ thisArgLen += 1 + argName.length();
+ maxArgLen = Math.max(maxArgLen, thisArgLen);
+ }
+
+ // Print the help.
+ if (name != null)
+ out.println(name + ":");
+ it = options.iterator();
+ while (it.hasNext())
+ {
+ Option option = (Option) it.next();
+ String argName = option.getArgumentName();
+ int column = 0;
+ if (option.getShortName() != '\0')
+ {
+ out.print(" -");
+ out.print(option.getShortName());
+ column += 4;
+ if (option.getLongName() == null)
+ {
+ if (argName != null)
+ {
+ out.print(' ');
+ out.print(argName);
+ column += 1 + argName.length();
+ }
+ out.print(" ");
+ }
+ else
+ out.print(", ");
+ column += 2;
+ }
+ for (; column < maxShortLen; ++column)
+ out.print(' ');
+ if (option.getLongName() != null)
+ {
+ out.print("--");
+ out.print(option.getLongName());
+ column += 2 + option.getLongName().length();
+ if (argName != null)
+ {
+ out.print("=" + argName);
+ column += 1 + argName.length();
+ }
+ }
+ for (; column < maxArgLen; ++column)
+ out.print(' ');
+ // FIXME: should have a better heuristic for padding.
+ out.print(" ");
+ out.println(option.getDescription());
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/getopt/Parser.java b/tools/gnu/classpath/tools/getopt/Parser.java
new file mode 100644
index 000000000..8d70c01d0
--- /dev/null
+++ b/tools/gnu/classpath/tools/getopt/Parser.java
@@ -0,0 +1,314 @@
+/* Parser.java - parse command line options
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.getopt;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * An instance of this class is used to parse command-line options. It does "GNU
+ * style" argument recognition and also automatically handles "--help" and
+ * "--version" processing. It can also be put in "long option only" mode. In
+ * this mode long options are recognized with a single dash (as well as a double
+ * dash) and strings of options like "-abc" are never parsed as a collection of
+ * short options.
+ */
+public class Parser
+{
+ private String programName;
+
+ private String headerText;
+
+ private String footerText;
+
+ private boolean longOnly;
+
+ private ArrayList options = new ArrayList();
+
+ private ArrayList optionGroups = new ArrayList();
+
+ private OptionGroup defaultGroup = new OptionGroup();
+
+ // These are used while parsing.
+ private int currentIndex;
+
+ private String[] args;
+
+ /**
+ * Create a new parser. The program name is used when printing error messages.
+ * The version string is printed verbatim in response to "--version".
+ *
+ * @param programName the name of the program
+ * @param versionString the program's version information
+ */
+ public Parser(String programName, String versionString)
+ {
+ this(programName, versionString, false);
+ }
+
+ /**
+ * Create a new parser. The program name is used when printing error messages.
+ * The version string is printed verbatim in response to "--version".
+ *
+ * @param programName the name of the program
+ * @param versionString the program's version information
+ * @param longOnly true if the parser should work in long-option-only mode
+ */
+ public Parser(String programName, final String versionString, boolean longOnly)
+ {
+ this.programName = programName;
+ this.longOnly = longOnly;
+ defaultGroup.add(new Option("help", "print this help, then exit")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ printHelp(System.out);
+ System.exit(0);
+ }
+ });
+ defaultGroup.add(new Option("version", "print version number, then exit")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ System.out.println(versionString);
+ System.exit(0);
+ }
+ });
+ add(defaultGroup);
+ }
+
+ /**
+ * Set the header text that is printed by --help.
+ *
+ * @param headerText the header text
+ */
+ public void setHeader(String headerText)
+ {
+ this.headerText = headerText;
+ }
+
+ /**
+ * Set the footer text that is printed by --help.
+ *
+ * @param footerText the footer text
+ */
+ public void setFooter(String footerText)
+ {
+ this.footerText = footerText;
+ }
+
+ /**
+ * Add an option to this parser. The option is added to the default option
+ * group; this affects where it is placed in the help output.
+ *
+ * @param opt the option
+ */
+ public synchronized void add(Option opt)
+ {
+ options.add(opt);
+ defaultGroup.add(opt);
+ }
+
+ /**
+ * Add an option group to this parser. All the options in this group will be
+ * recognized by the parser.
+ *
+ * @param group the option group
+ */
+ public synchronized void add(OptionGroup group)
+ {
+ options.addAll(group.options);
+ optionGroups.add(group);
+ }
+
+ void printHelp(PrintStream out)
+ {
+ if (headerText != null)
+ {
+ out.println(headerText);
+ out.println();
+ }
+
+ Iterator it = optionGroups.iterator();
+ while (it.hasNext())
+ {
+ OptionGroup group = (OptionGroup) it.next();
+ group.printHelp(out);
+ out.println();
+ }
+
+ if (footerText != null)
+ out.println(footerText);
+ }
+
+ private String getArgument(String request) throws OptionException
+ {
+ ++currentIndex;
+ if (currentIndex >= args.length)
+ throw new OptionException("option '" + request + "' requires an argument");
+ return args[currentIndex];
+ }
+
+ private void handleLongOption(String real, int index) throws OptionException
+ {
+ String option = real.substring(index);
+ String justName = option;
+ int eq = option.indexOf('=');
+ if (eq != - 1)
+ justName = option.substring(0, eq);
+ Option found = null;
+ for (int i = options.size() - 1; i >= 0; --i)
+ {
+ Option opt = (Option) options.get(i);
+ if (justName.equals(opt.getLongName()))
+ {
+ found = opt;
+ break;
+ }
+ }
+ if (found == null)
+ throw new OptionException("unrecognized option '" + real + "'");
+ String argument = null;
+ if (found.getTakesArgument())
+ {
+ if (eq == - 1)
+ argument = getArgument(real);
+ else
+ argument = option.substring(eq + 1);
+ }
+ else if (eq != - 1)
+ {
+ throw new OptionException("option '" + real.substring(0, eq + index)
+ + "' doesn't allow an argument");
+ }
+ found.parsed(argument);
+ }
+
+ private void handleShortOption(char option) throws OptionException
+ {
+ Option found = null;
+ for (int i = options.size() - 1; i >= 0; --i)
+ {
+ Option opt = (Option) options.get(i);
+ if (option == opt.getShortName())
+ {
+ found = opt;
+ break;
+ }
+ }
+ if (found == null)
+ throw new OptionException("unrecognized option '-" + option + "'");
+ String argument = null;
+ if (found.getTakesArgument())
+ argument = getArgument("-" + option);
+ found.parsed(argument);
+ }
+
+ private void handleShortOptions(String option) throws OptionException
+ {
+ for (int i = 1; i < option.length(); ++i)
+ {
+ handleShortOption(option.charAt(i));
+ }
+ }
+
+ /**
+ * Parse a command line. Any files which are found will be passed to the file
+ * argument callback. This method will exit on error or when --help or
+ * --version is specified.
+ *
+ * @param inArgs the command-line arguments
+ * @param files the file argument callback
+ */
+ public synchronized void parse(String[] inArgs, FileArgumentCallback files)
+ {
+ try
+ {
+ args = inArgs;
+ for (currentIndex = 0; currentIndex < args.length; ++currentIndex)
+ {
+ if (args[currentIndex].length() == 0
+ || args[currentIndex].charAt(0) != '-'
+ || "-".equals(args[currentIndex]))
+ {
+ files.notifyFile(args[currentIndex]);
+ continue;
+ }
+ if ("--".equals(args[currentIndex]))
+ break;
+ if (args[currentIndex].charAt(1) == '-')
+ handleLongOption(args[currentIndex], 2);
+ else if (longOnly)
+ handleLongOption(args[currentIndex], 1);
+ else
+ handleShortOptions(args[currentIndex]);
+ }
+ // Add remaining arguments to leftovers.
+ for (++currentIndex; currentIndex < args.length; ++currentIndex)
+ files.notifyFile(args[currentIndex]);
+ }
+ catch (OptionException err)
+ {
+ System.err.println(programName + ": " + err.getMessage());
+ System.err.println(programName + ": Try '" + programName
+ + " --help' for more information.");
+ System.exit(1);
+ }
+ }
+
+ /**
+ * Parse a command line. Any files which are found will be returned. This
+ * method will exit on error or when --help or --version is specified.
+ *
+ * @param inArgs the command-line arguments
+ */
+ public String[] parse(String[] inArgs)
+ {
+ final ArrayList fileResult = new ArrayList();
+ parse(inArgs, new FileArgumentCallback()
+ {
+ public void notifyFile(String fileArgument)
+ {
+ fileResult.add(fileArgument);
+ }
+ });
+ return (String[]) fileResult.toArray(new String[0]);
+ }
+}
diff --git a/tools/gnu/classpath/tools/giop/GRMIC.java b/tools/gnu/classpath/tools/giop/GRMIC.java
index 16ff96f56..a372cfd66 100644
--- a/tools/gnu/classpath/tools/giop/GRMIC.java
+++ b/tools/gnu/classpath/tools/giop/GRMIC.java
@@ -17,23 +17,7 @@ You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.giop;
@@ -105,6 +89,10 @@ public class GRMIC
verbose = true;
compiler.setVerbose(true);
}
+ else if (c.equals("-force"))
+ {
+ compiler.setForce(true);
+ }
else if (c.equals("-d"))
{
int f = i + 1;
diff --git a/tools/gnu/classpath/tools/giop/GRMIC.txt b/tools/gnu/classpath/tools/giop/GRMIC.txt
index fcde83895..08aaf148f 100644
--- a/tools/gnu/classpath/tools/giop/GRMIC.txt
+++ b/tools/gnu/classpath/tools/giop/GRMIC.txt
@@ -19,6 +19,9 @@ Usage: grmic <options> <class names>
-help Print this help text
-v Print version
-verbose Verbose output
+ -force Try to generate code even if the input classes seem not
+ consistent with RMI specification.
+
and <class names> can include one or more non abstract classes that implement
Remote and are accessible via current class path.
diff --git a/tools/gnu/classpath/tools/giop/IorParser.java b/tools/gnu/classpath/tools/giop/IorParser.java
index 7d70c8aca..411b8997d 100644
--- a/tools/gnu/classpath/tools/giop/IorParser.java
+++ b/tools/gnu/classpath/tools/giop/IorParser.java
@@ -17,23 +17,7 @@ You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.giop;
diff --git a/tools/gnu/classpath/tools/giop/grmic/CompilationError.java b/tools/gnu/classpath/tools/giop/grmic/CompilationError.java
index c6b3e56e8..d1fa814ee 100644
--- a/tools/gnu/classpath/tools/giop/grmic/CompilationError.java
+++ b/tools/gnu/classpath/tools/giop/grmic/CompilationError.java
@@ -17,23 +17,7 @@ You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.giop.grmic;
diff --git a/tools/gnu/classpath/tools/giop/grmic/Generator.java b/tools/gnu/classpath/tools/giop/grmic/Generator.java
index a45e8d398..17ab821ec 100644
--- a/tools/gnu/classpath/tools/giop/grmic/Generator.java
+++ b/tools/gnu/classpath/tools/giop/grmic/Generator.java
@@ -17,23 +17,7 @@ You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.giop.grmic;
diff --git a/tools/gnu/classpath/tools/giop/grmic/GiopIo.java b/tools/gnu/classpath/tools/giop/grmic/GiopIo.java
index 3714c4ce4..0e0df7bc5 100644
--- a/tools/gnu/classpath/tools/giop/grmic/GiopIo.java
+++ b/tools/gnu/classpath/tools/giop/grmic/GiopIo.java
@@ -17,23 +17,7 @@ You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.giop.grmic;
diff --git a/tools/gnu/classpath/tools/giop/grmic/GiopRmicCompiler.java b/tools/gnu/classpath/tools/giop/grmic/GiopRmicCompiler.java
index c19f635c6..4beba1c9f 100644
--- a/tools/gnu/classpath/tools/giop/grmic/GiopRmicCompiler.java
+++ b/tools/gnu/classpath/tools/giop/grmic/GiopRmicCompiler.java
@@ -17,23 +17,7 @@ You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.giop.grmic;
@@ -115,6 +99,11 @@ public class GiopRmicCompiler
* Verbose output
*/
protected boolean verbose = false;
+
+ /**
+ * Force mode - do not check the exceptions
+ */
+ protected boolean force = false;
/**
* Clear data, preparing for the next compilation.
@@ -204,7 +193,7 @@ public class GiopRmicCompiler
remEx = true;
break;
}
- if (! remEx)
+ if (! remEx && !force)
throw new CompilationError(m[i].getName() + ", defined in "
+ c.getName()
+ ", does not throw "
@@ -483,6 +472,14 @@ public class GiopRmicCompiler
{
warnings = warn;
}
+
+ /**
+ * Set the error ignore mode.
+ */
+ public void setForce(boolean isforce)
+ {
+ force = isforce;
+ }
/**
* Get the package name.
diff --git a/tools/gnu/classpath/tools/giop/grmic/HashFinder.java b/tools/gnu/classpath/tools/giop/grmic/HashFinder.java
index 216e73953..2efdb1e76 100644
--- a/tools/gnu/classpath/tools/giop/grmic/HashFinder.java
+++ b/tools/gnu/classpath/tools/giop/grmic/HashFinder.java
@@ -1,3 +1,25 @@
+/* HashFinder.java -- finds the hash character.
+ Copyright (C) 2006 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+*/
+
+
package gnu.classpath.tools.giop.grmic;
import java.util.HashSet;
diff --git a/tools/gnu/classpath/tools/giop/grmic/MethodGenerator.java b/tools/gnu/classpath/tools/giop/grmic/MethodGenerator.java
index 9a44fad79..80148d51a 100644
--- a/tools/gnu/classpath/tools/giop/grmic/MethodGenerator.java
+++ b/tools/gnu/classpath/tools/giop/grmic/MethodGenerator.java
@@ -17,23 +17,7 @@ You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.giop.grmic;
diff --git a/tools/gnu/classpath/tools/jar/Action.java b/tools/gnu/classpath/tools/jar/Action.java
new file mode 100644
index 000000000..fea60f797
--- /dev/null
+++ b/tools/gnu/classpath/tools/jar/Action.java
@@ -0,0 +1,50 @@
+/* Action.java - an action taken by the jar driver
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.jar;
+
+import java.io.IOException;
+
+public abstract class Action
+{
+ protected Action()
+ {
+ }
+
+ public abstract void run(Main parameters) throws IOException;
+}
diff --git a/tools/gnu/classpath/tools/jar/Creator.java b/tools/gnu/classpath/tools/jar/Creator.java
new file mode 100644
index 000000000..a636fca6b
--- /dev/null
+++ b/tools/gnu/classpath/tools/jar/Creator.java
@@ -0,0 +1,192 @@
+/* Creator.java - create a new jar file
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.jar;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.zip.CRC32;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class Creator
+ extends Action
+{
+ ZipOutputStream outputStream;
+
+ private long copyFile(CRC32 crc, InputStream is, OutputStream output)
+ throws IOException
+ {
+ byte[] buffer = new byte[1024];
+ long size = 0;
+ while (true)
+ {
+ int len = is.read(buffer);
+ if (len == - 1)
+ break;
+ size += len;
+ output.write(buffer, 0, len);
+ crc.update(buffer, 0, len);
+ }
+ output.close();
+ return size;
+ }
+
+ protected void writeFile(boolean isDirectory, InputStream inputFile,
+ String filename, boolean verbose) throws IOException
+ {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ CRC32 crc = new CRC32();
+ long size;
+ if (isDirectory)
+ {
+ size = 0;
+ }
+ else
+ {
+ size = copyFile(crc, inputFile, out);
+ }
+
+ ZipEntry entry = new ZipEntry(filename);
+ entry.setCrc(crc.getValue());
+ entry.setSize(size);
+
+ outputStream.putNextEntry(entry);
+ out.writeTo(outputStream);
+ outputStream.closeEntry();
+
+ if (verbose)
+ {
+ long csize = entry.getCompressedSize();
+ long perc;
+ if (size == 0)
+ perc = 0;
+ else
+ perc = 100 - (100 * csize) / size;
+ System.out.println("adding: " + filename + " (in=" + size + ") (out="
+ + entry.getSize() + ") (stored " + perc + "%)");
+ }
+ }
+
+ protected void writeFile(File file, String filename, boolean verbose)
+ throws IOException
+ {
+ boolean isDirectory = file.isDirectory();
+ InputStream inputStream = null;
+ if (isDirectory)
+ {
+ if (filename.charAt(filename.length() - 1) != '/')
+ filename += '/';
+ }
+ else
+ inputStream = new FileInputStream(file);
+ writeFile(isDirectory, inputStream, filename, verbose);
+ }
+
+ private void addEntries(ArrayList result, Entry entry)
+ {
+ if (entry.file.isDirectory())
+ {
+ String name = entry.name;
+ if (name.charAt(name.length() - 1) != '/')
+ {
+ name += '/';
+ entry = new Entry(entry.file, name);
+ }
+ result.add(entry);
+ String[] files = entry.file.list();
+ for (int i = 0; i < files.length; ++i)
+ addEntries(result, new Entry(new File(entry.file, files[i]),
+ entry.name + '/' + files[i]));
+ }
+ else
+ result.add(entry);
+ }
+
+ private ArrayList getAllEntries(Main parameters)
+ {
+ Iterator it = parameters.entries.iterator();
+ ArrayList allEntries = new ArrayList();
+ while (it.hasNext())
+ {
+ Entry entry = (Entry) it.next();
+ addEntries(allEntries, entry);
+ }
+ return allEntries;
+ }
+
+ protected ArrayList writeCommandLineEntries(Main parameters, File zipFile)
+ throws IOException
+ {
+ outputStream = new ZipOutputStream(
+ new BufferedOutputStream(
+ new FileOutputStream(
+ zipFile)));
+ outputStream.setMethod(parameters.storageMode);
+ ArrayList allEntries = getAllEntries(parameters);
+ Iterator it = parameters.entries.iterator();
+ while (it.hasNext())
+ {
+ Entry entry = (Entry) it.next();
+ writeFile(entry.file, entry.name, parameters.verbose);
+ }
+ return allEntries;
+ }
+
+ protected void close() throws IOException
+ {
+ // FIXME: handle manifest options here.
+ // FIXME: handle index file here ...?
+ outputStream.finish();
+ outputStream.close();
+ }
+
+ public void run(Main parameters) throws IOException
+ {
+ writeCommandLineEntries(parameters, parameters.archiveFile);
+ close();
+ }
+}
diff --git a/tools/gnu/classpath/tools/jar/Entry.java b/tools/gnu/classpath/tools/jar/Entry.java
new file mode 100644
index 000000000..aa8679aab
--- /dev/null
+++ b/tools/gnu/classpath/tools/jar/Entry.java
@@ -0,0 +1,60 @@
+/* Entry.java - represent a single file to write to a jar
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.jar;
+
+import java.io.File;
+
+public class Entry
+{
+ public File file;
+
+ public String name;
+
+ public Entry(File file, String name)
+ {
+ this.file = file;
+ this.name = name;
+ }
+
+ public Entry(File file)
+ {
+ this.file = file;
+ this.name = file.toString();
+ }
+}
diff --git a/tools/gnu/classpath/tools/jar/Extractor.java b/tools/gnu/classpath/tools/jar/Extractor.java
new file mode 100644
index 000000000..245f5e36c
--- /dev/null
+++ b/tools/gnu/classpath/tools/jar/Extractor.java
@@ -0,0 +1,100 @@
+/* Extractor.java - action to extract from a jar file
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.jar;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class Extractor
+ extends Action
+{
+ private void copyFile(InputStream input, File output) throws IOException
+ {
+ FileOutputStream os = new FileOutputStream(output);
+ byte[] buffer = new byte[1024];
+ while (true)
+ {
+ int len = input.read(buffer);
+ if (len == - 1)
+ break;
+ os.write(buffer, 0, len);
+ }
+ os.close();
+ }
+
+ public void run(Main parameters) throws IOException
+ {
+ ZipFile zip = new ZipFile(parameters.archiveFile);
+ Enumeration e = zip.entries();
+ while (e.hasMoreElements())
+ {
+ ZipEntry entry = (ZipEntry) e.nextElement();
+ File file = new File(entry.getName());
+ if (entry.isDirectory())
+ {
+ if (file.mkdirs())
+ {
+ if (parameters.verbose)
+ System.out.println(" created: " + file);
+ }
+ continue;
+ }
+
+ File parent = file.getParentFile();
+ if (parent != null)
+ parent.mkdirs();
+
+ InputStream input = zip.getInputStream(entry);
+ copyFile(input, file);
+ input.close();
+
+ if (parameters.verbose)
+ {
+ String leader = (entry.getMethod() == ZipEntry.STORED ? " extracted"
+ : " inflated");
+ System.out.println(leader + ": " + file);
+ }
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/jar/Lister.java b/tools/gnu/classpath/tools/jar/Lister.java
new file mode 100644
index 000000000..fe5792e76
--- /dev/null
+++ b/tools/gnu/classpath/tools/jar/Lister.java
@@ -0,0 +1,84 @@
+/* Lister.java - action to list contents of a jar file
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.jar;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class Lister
+ extends Action
+{
+ private void listJar(File jarFile, boolean verbose) throws IOException
+ {
+ ZipFile zipFile = new ZipFile(jarFile);
+ Enumeration i = zipFile.entries();
+ MessageFormat format = null;
+ if (verbose)
+ format = new MessageFormat(" {0,date,E M dd HH:mm:ss z yyyy} {1}");
+ while (i.hasMoreElements())
+ {
+ ZipEntry entry = (ZipEntry) i.nextElement();
+ if (verbose)
+ {
+ // No easy way to right-justify the size using
+ // MessageFormat -- how odd.
+ long size = entry.getSize();
+ String s = " " + size;
+ int index = Math.min(s.length() - 5, 5);
+ System.out.print(s.substring(index));
+ Object[] values = new Object[] { new Date(entry.getTime()),
+ entry.getName() };
+ System.out.println(format.format(values));
+ }
+ else
+ System.out.println(entry.getName());
+ }
+ zipFile.close();
+ }
+
+ public void run(Main parameters) throws IOException
+ {
+ listJar(parameters.archiveFile, parameters.verbose);
+ }
+}
diff --git a/tools/gnu/classpath/tools/jar/Main.java b/tools/gnu/classpath/tools/jar/Main.java
new file mode 100644
index 000000000..ee4da3c27
--- /dev/null
+++ b/tools/gnu/classpath/tools/jar/Main.java
@@ -0,0 +1,225 @@
+/* Main.java - jar program main()
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.jar;
+
+import gnu.classpath.tools.getopt.ClasspathToolParser;
+import gnu.classpath.tools.getopt.FileArgumentCallback;
+import gnu.classpath.tools.getopt.Option;
+import gnu.classpath.tools.getopt.OptionException;
+import gnu.classpath.tools.getopt.OptionGroup;
+import gnu.classpath.tools.getopt.Parser;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.zip.ZipOutputStream;
+
+public class Main
+{
+ // The mode of operation. This is the class representing
+ // the action; we make a new instance before using it. It
+ // must be a subclass of Action. 'null' means the mode
+ // has not yet been set.
+ Class operationMode;
+
+ // The archive file name.
+ File archiveFile;
+
+ // The zip storage mode.
+ int storageMode = ZipOutputStream.DEFLATED;
+
+ // True if we should read file names from stdin.
+ boolean readNamesFromStdin = false;
+
+ // True for verbose mode.
+ boolean verbose = false;
+
+ // True if we want a manifest file.
+ boolean wantManifest = true;
+
+ // Name of manifest file to use.
+ File manifestFile;
+
+ // A list of Entry objects, each describing a file to write.
+ ArrayList entries = new ArrayList();
+
+ // Used only while parsing.
+ String changedDirectory;
+
+ class HandleFile
+ extends FileArgumentCallback
+ {
+ public void notifyFile(String fileArgument)
+ {
+ Entry entry;
+ if (changedDirectory != null)
+ {
+ entry = new Entry(new File(changedDirectory, fileArgument),
+ fileArgument);
+ changedDirectory = null;
+ }
+ else
+ entry = new Entry(new File(fileArgument));
+ entries.add(entry);
+ }
+ }
+
+ // An option that knows how to set the operation mode.
+ private class ModeOption
+ extends Option
+ {
+ private Class mode;
+
+ public ModeOption(char shortName, String description, Class mode)
+ {
+ super(shortName, description);
+ this.mode = mode;
+ }
+
+ public void parsed(String argument) throws OptionException
+ {
+ if (operationMode != null)
+ throw new OptionException("operation mode already specified");
+ operationMode = mode;
+ }
+ }
+
+ private Parser initializeParser()
+ {
+ Parser p = new ClasspathToolParser("jar");
+ p.setHeader("Usage: jar -ctxu [OPTIONS] jar-file [-C DIR FILE] FILE...");
+
+ OptionGroup grp = new OptionGroup("Operation mode");
+ grp.add(new ModeOption('c', "create a new archive", Creator.class));
+ grp.add(new ModeOption('x', "extract from archive", Extractor.class));
+ grp.add(new ModeOption('t', "list archive contents", Lister.class));
+ grp.add(new ModeOption('u', "update archive", Updater.class));
+ p.add(grp);
+
+ grp = new OptionGroup("Operation modifiers");
+ grp.add(new Option('f', "specify archive file name", "FILE")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ // FIXME: error if already set.
+ archiveFile = new File(argument);
+ }
+ });
+ grp.add(new Option('0', "store only; no ZIP compression")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ storageMode = ZipOutputStream.STORED;
+ }
+ });
+ grp.add(new Option('v', "verbose operation")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ verbose = true;
+ }
+ });
+ grp.add(new Option('M', "do not create a manifest file")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ wantManifest = false;
+ }
+ });
+ grp.add(new Option('m', "specify manifest file", "FILE")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ manifestFile = new File(argument);
+ }
+ });
+ // -@
+ p.add(grp);
+
+ grp = new OptionGroup("File name selection");
+ grp.add(new Option('C', "change to directory before the next file",
+ "DIR FILE")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ changedDirectory = argument;
+ }
+ });
+ p.add(grp);
+ // -i - need to parse classes
+
+ return p;
+ }
+
+ private void run(String[] args) throws OptionException,
+ InstantiationException, IllegalAccessException, IOException
+ {
+ Parser p = initializeParser();
+ // Special hack to emulate old tar-style commands.
+ if (args[0].charAt(0) != '-')
+ args[0] = '-' + args[0];
+ p.parse(args, new HandleFile());
+ if (operationMode == null)
+ throw new OptionException("must specify one of -t, -c, -u, or -x");
+ if (changedDirectory != null)
+ throw new OptionException("-C argument requires both directory and filename");
+ Action t = (Action) operationMode.newInstance();
+ t.run(this);
+ }
+
+ public static void main(String[] args)
+ {
+ Main jarprogram = new Main();
+ try
+ {
+ jarprogram.run(args);
+ }
+ catch (OptionException arg)
+ {
+ System.err.println("jar: " + arg.getMessage());
+ System.exit(1);
+ }
+ catch (Exception e)
+ {
+ System.err.println("jar: internal error:");
+ e.printStackTrace(System.err);
+ System.exit(1);
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/jar/Updater.java b/tools/gnu/classpath/tools/jar/Updater.java
new file mode 100644
index 000000000..9046b42b0
--- /dev/null
+++ b/tools/gnu/classpath/tools/jar/Updater.java
@@ -0,0 +1,81 @@
+/* Updater.java - action to update a jar file
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.jar;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class Updater
+ extends Creator
+{
+ public void run(Main parameters) throws IOException
+ {
+ // Write all the new entries to a temporary file.
+ File tmpFile = File.createTempFile("jarcopy", null);
+ ArrayList newEntries = writeCommandLineEntries(parameters, tmpFile);
+ HashSet set = new HashSet();
+ Iterator it = newEntries.iterator();
+ while (it.hasNext())
+ {
+ Entry entry = (Entry) it.next();
+ set.add(entry.name);
+ }
+
+ // Now read the old file and copy extra entries to the new file.
+ ZipFile zip = new ZipFile(parameters.archiveFile);
+ Enumeration e = zip.entries();
+ while (e.hasMoreElements())
+ {
+ ZipEntry entry = (ZipEntry) e.nextElement();
+ if (set.contains(entry.getName()))
+ continue;
+ writeFile(entry.isDirectory(), zip.getInputStream(entry),
+ zip.getName(), parameters.verbose);
+ }
+
+ close();
+ tmpFile.renameTo(parameters.archiveFile);
+ }
+}
diff --git a/tools/gnu/classpath/tools/jarsigner/HashUtils.java b/tools/gnu/classpath/tools/jarsigner/HashUtils.java
new file mode 100644
index 000000000..2286063f1
--- /dev/null
+++ b/tools/gnu/classpath/tools/jarsigner/HashUtils.java
@@ -0,0 +1,122 @@
+/* Utils.java -- Utility methods for JAR file signing/verification
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.jarsigner;
+
+import gnu.java.security.hash.Sha160;
+import gnu.java.security.util.Base64;
+import gnu.java.util.jar.JarUtils;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.logging.Logger;
+
+/**
+ * Collection of utility methods used in JAR file signing and verification.
+ */
+class HashUtils
+{
+ private static final Logger log = Logger.getLogger(HashUtils.class.getName());
+ private Sha160 sha = new Sha160();
+
+ // default 0-arguments constructor
+
+ /**
+ * @param stream the input stream to digest.
+ * @return a base-64 representation of the resulting SHA-1 digest of the
+ * contents of the designated input stream.
+ * @throws IOException if an I/O related exception occurs during the process.
+ */
+ String hashStream(InputStream stream) throws IOException
+ {
+ BufferedInputStream bis = new BufferedInputStream(stream, 4096);
+ byte[] buffer = new byte[4096];
+ int count = 0;
+ int n;
+ while ((n = bis.read(buffer)) != - 1)
+ if (n > 0)
+ {
+ sha.update(buffer, 0, n);
+ count += n;
+ }
+
+ byte[] hash = sha.digest();
+ log.finest("Hashed " + count + " byte(s)");
+ String result = Base64.encode(hash);
+ return result;
+ }
+
+ /**
+ * @param ba the byte array to digest.
+ * @return a base-64 representation of the resulting SHA-1 digest of the
+ * contents of the designated buffer.
+ */
+ String hashByteArray(byte[] ba) throws IOException
+ {
+ sha.update(ba);
+ byte[] hash = sha.digest();
+ log.finest("Hashed " + ba.length + " byte(s)");
+ String result = Base64.encode(hash);
+ return result;
+ }
+
+ /**
+ * @param name the JAR entry name
+ * @param entryHash the hash of the entry file which appears in the
+ * manifest.
+ * @return the base-64 encoded form of the hash of the corresponding Manifest
+ * JAR entry which will appear in the SF file under the entry with the
+ * same name.
+ * @throws UnsupportedEncodingException If UTF-8 character encoding is not
+ * supported on this platform.
+ */
+ String hashManifestEntry(String name, String entryHash)
+ throws UnsupportedEncodingException
+ {
+ sha.update((JarUtils.NAME + ": " + name).getBytes("UTF-8"));
+ sha.update(JarUtils.CRLF);
+ sha.update((Main.DIGEST + ": " + entryHash).getBytes("UTF-8"));
+ sha.update(JarUtils.CRLF);
+ sha.update(JarUtils.CRLF);
+ byte[] sfHash = sha.digest();
+ String result = Base64.encode(sfHash);
+ return result;
+ }
+}
diff --git a/tools/gnu/classpath/tools/jarsigner/JarSigner.java b/tools/gnu/classpath/tools/jarsigner/JarSigner.java
new file mode 100644
index 000000000..40bee9fe9
--- /dev/null
+++ b/tools/gnu/classpath/tools/jarsigner/JarSigner.java
@@ -0,0 +1,167 @@
+/* JarSigner.java -- The signing handler of the gjarsigner tool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.jarsigner;
+
+import gnu.classpath.SystemProperties;
+import gnu.java.util.jar.JarUtils;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.logging.Logger;
+
+/**
+ * The JAR signing handler of the <code>gjarsigner</code> tool.
+ */
+public class JarSigner
+{
+ private static final Logger log = Logger.getLogger(JarSigner.class.getName());
+ /** The owner tool of this handler. */
+ private Main main;
+
+ JarSigner(Main main)
+ {
+ super();
+
+ this.main = main;
+ }
+
+ void start() throws Exception
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ JarFile jarFile = new JarFile(main.getJarFileName());
+ SFHelper sfHelper = new SFHelper(jarFile);
+
+ sfHelper.startSigning();
+
+ // 1. compute the digests
+ for (Enumeration e = jarFile.entries(); e.hasMoreElements(); )
+ {
+ JarEntry je = (JarEntry) e.nextElement();
+ String jeName = je.getName();
+ if (jeName.equals(JarFile.MANIFEST_NAME)
+ || jeName.endsWith(File.separator))
+ continue;
+
+ sfHelper.updateEntry(je);
+ if (main.isVerbose())
+ System.out.println(Messages.getString("JarSigner.1") + jeName); //$NON-NLS-1$
+ }
+
+ sfHelper.finishSigning(main.isSectionsOnly());
+ if (main.isVerbose())
+ System.out.println(Messages.getString("JarSigner.2") + JarFile.MANIFEST_NAME); //$NON-NLS-1$
+
+ // 2. write jar entries and manifest
+ File signedJarFile = File.createTempFile("gcp-", ".jar"); //$NON-NLS-1$ //$NON-NLS-2$
+ FileOutputStream fos = new FileOutputStream(signedJarFile);
+ JarOutputStream outSignedJarFile = new JarOutputStream(fos,
+ sfHelper.getManifest());
+ for (Enumeration e = jarFile.entries(); e.hasMoreElements(); )
+ {
+ JarEntry je = (JarEntry) e.nextElement();
+ String jeName = je.getName();
+ if (jeName.equals(JarFile.MANIFEST_NAME)
+ || jeName.endsWith(File.separator))
+ continue;
+
+ log.finest("Processing " + jeName); //$NON-NLS-1$
+ JarEntry newEntry = new JarEntry(jeName);
+ newEntry.setTime(je.getTime());
+ outSignedJarFile.putNextEntry(newEntry);
+ InputStream jeis = jarFile.getInputStream(je);
+ copyFromTo(jeis, outSignedJarFile);
+ }
+
+ // 3. create the .SF file
+ String signaturesFileName = main.getSigFileName();
+ String sfFileName = JarUtils.META_INF + signaturesFileName
+ + JarUtils.SF_SUFFIX;
+ log.finest("Processing " + sfFileName); //$NON-NLS-1$
+ JarEntry sfEntry = new JarEntry(sfFileName);
+ sfEntry.setTime(System.currentTimeMillis());
+ outSignedJarFile.putNextEntry(sfEntry);
+ sfHelper.writeSF(outSignedJarFile);
+ log.finer("Created .SF file"); //$NON-NLS-1$
+ if (main.isVerbose())
+ System.out.println(Messages.getString("JarSigner.8") + sfFileName); //$NON-NLS-1$
+
+ // 4. create the .DSA file
+ String dsaFileName = JarUtils.META_INF + signaturesFileName
+ + JarUtils.DSA_SUFFIX;
+ log.finest("Processing " + dsaFileName); //$NON-NLS-1$
+ JarEntry dsaEntry = new JarEntry(dsaFileName);
+ dsaEntry.setTime(System.currentTimeMillis());
+ outSignedJarFile.putNextEntry(dsaEntry);
+ sfHelper.writeDSA(outSignedJarFile,
+ main.getSignerPrivateKey(),
+ main.getSignerCertificateChain(),
+ main.isInternalSF());
+ log.finer("Created .DSA file"); //$NON-NLS-1$
+ if (main.isVerbose())
+ System.out.println(Messages.getString("JarSigner.11") + dsaFileName); //$NON-NLS-1$
+
+ // cleanup
+ outSignedJarFile.close();
+ fos.close();
+ signedJarFile.renameTo(new File(main.getSignedJarFileName()));
+ log.finer("Renamed signed JAR file"); //$NON-NLS-1$
+ if (main.isVerbose())
+ System.out.println(SystemProperties.getProperty("line.separator") //$NON-NLS-1$
+ + Messages.getString("JarSigner.14")); //$NON-NLS-1$
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ private void copyFromTo(InputStream in, JarOutputStream out)
+ throws IOException
+ {
+ byte[] buffer = new byte[8192];
+ int n;
+ while ((n = in.read(buffer)) != -1)
+ if (n > 0)
+ out.write(buffer, 0, n);
+ }
+}
diff --git a/tools/gnu/classpath/tools/jarsigner/JarVerifier.java b/tools/gnu/classpath/tools/jarsigner/JarVerifier.java
new file mode 100644
index 000000000..f80147dfa
--- /dev/null
+++ b/tools/gnu/classpath/tools/jarsigner/JarVerifier.java
@@ -0,0 +1,339 @@
+/* JarVerifier.java -- The verification handler of the gjarsigner tool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.jarsigner;
+
+import gnu.java.security.OID;
+import gnu.java.security.Registry;
+import gnu.java.security.pkcs.PKCS7SignedData;
+import gnu.java.security.pkcs.SignerInfo;
+import gnu.java.security.sig.ISignature;
+import gnu.java.security.sig.ISignatureCodec;
+import gnu.java.security.sig.dss.DSSSignature;
+import gnu.java.security.sig.dss.DSSSignatureX509Codec;
+import gnu.java.security.sig.rsa.RSAPKCS1V1_5Signature;
+import gnu.java.security.sig.rsa.RSAPKCS1V1_5SignatureX509Codec;
+import gnu.java.security.util.Util;
+import gnu.java.util.jar.JarUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.PublicKey;
+import java.security.cert.Certificate;
+import java.security.cert.CRLException;
+import java.security.cert.CertificateException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.logging.Logger;
+import java.util.zip.ZipException;
+
+/**
+ * The JAR verification handler of the <code>gjarsigner</code> tool.
+ */
+public class JarVerifier
+{
+ private static final Logger log = Logger.getLogger(JarVerifier.class.getName());
+ /** The owner tool of this handler. */
+ private Main main;
+ private HashUtils util = new HashUtils();
+ /** The JAR file to verify. */
+ private JarFile jarFile;
+ /** Map of jar entry names to their hash. */
+ private Map entryHashes = new HashMap();
+
+ JarVerifier(Main main)
+ {
+ super();
+
+ this.main = main;
+ }
+
+ void start() throws Exception
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ String jarFileName = main.getJarFileName();
+ jarFile = new JarFile(jarFileName);
+
+ // 1. find all signature (.SF) files
+ List sfFiles = new ArrayList();
+ for (Enumeration e = jarFile.entries(); e.hasMoreElements(); )
+ {
+ JarEntry je = (JarEntry) e.nextElement();
+ String jeName = je.getName();
+ if (! (jeName.startsWith(JarUtils.META_INF)
+ && jeName.endsWith(JarUtils.SF_SUFFIX)))
+ continue;
+
+ // only interested in .SF files in, and not deeper than, META-INF
+ String[] jeNameParts = jeName.split("/"); //$NON-NLS-1$
+ if (jeNameParts.length != 2)
+ continue;
+
+ String sfName = jeNameParts[1];
+ String sigFileName = sfName.substring(0, sfName.length() - 3);
+ sfFiles.add(sigFileName);
+ }
+
+ // 2. verify each one
+ if (sfFiles.isEmpty())
+ System.out.println(Messages.getString("JarVerifier.2")); //$NON-NLS-1$
+ else
+ {
+ int limit = sfFiles.size();
+ int count = 0;
+ for (Iterator it = sfFiles.iterator(); it.hasNext(); )
+ {
+ String alias = (String) it.next();
+ if (verifySF(alias))
+ if (verifySFEntries(alias))
+ count++;
+ }
+
+ if (count == 0)
+ System.out.println(Messages.getString("JarVerifier.3")); //$NON-NLS-1$
+ else if (count != limit)
+ System.out.println(Messages.getFormattedString("JarVerifier.4", //$NON-NLS-1$
+ new Integer[] {Integer.valueOf(count),
+ Integer.valueOf(limit)}));
+ else
+ System.out.println(Messages.getFormattedString("JarVerifier.7", //$NON-NLS-1$
+ Integer.valueOf(limit)));
+ }
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ /**
+ * @param sigFileName the name of the signature file; i.e. the name to use for
+ * both the .SF and .DSA files.
+ * @return <code>true</code> if the designated file-name (usually a key-store
+ * <i>alias</i> name) has been successfully checked as the signer of the
+ * corresponding <code>.SF</code> file. Returns <code>false</code> otherwise.
+ * @throws IOException
+ * @throws ZipException
+ * @throws CertificateException
+ * @throws CRLException
+ */
+ private boolean verifySF(String sigFileName) throws CRLException,
+ CertificateException, ZipException, IOException
+ {
+ log.entering(this.getClass().getName(), "verifySF"); //$NON-NLS-1$
+ log.finest("About to verify signature of " + sigFileName + "..."); //$NON-NLS-1$ //$NON-NLS-2$
+
+ // 1. find the corresponding .DSA file for this .SF file
+ JarEntry dsaEntry = jarFile.getJarEntry(JarUtils.META_INF + sigFileName
+ + JarUtils.DSA_SUFFIX);
+ if (dsaEntry == null)
+ throw new SecurityException(Messages.getFormattedString("JarVerifier.13", //$NON-NLS-1$
+ sigFileName));
+ // 2. read the .DSA file contents as a PKCS7 SignedData
+ InputStream in = jarFile.getInputStream(dsaEntry);
+ PKCS7SignedData pkcs7SignedData = new PKCS7SignedData(in);
+
+ // 4. get the encrypted digest octet string from the first SignerInfo
+ // this octet string is the digital signature of the .SF file contents
+ Set signerInfos = pkcs7SignedData.getSignerInfos();
+ if (signerInfos == null || signerInfos.isEmpty())
+ throw new SecurityException(Messages.getString("JarVerifier.14")); //$NON-NLS-1$
+
+ SignerInfo signerInfo = (SignerInfo) signerInfos.iterator().next();
+ byte[] encryptedDigest = signerInfo.getEncryptedDigest();
+ if (encryptedDigest == null)
+ throw new SecurityException(Messages.getString("JarVerifier.16")); //$NON-NLS-1$
+
+ log.finest("\n" + Util.dumpString(encryptedDigest, "--- signedSFBytes ")); //$NON-NLS-1$ //$NON-NLS-2$
+
+ // 5. get the signer public key
+ Certificate cert = pkcs7SignedData.getCertificates()[0];
+ PublicKey verifierKey = cert.getPublicKey();
+ log.finest("--- verifier public key = " + verifierKey); //$NON-NLS-1$
+
+ // 6. verify the signature file signature
+ OID digestEncryptionAlgorithmOID = signerInfo.getDigestEncryptionAlgorithmId();
+ ISignature signatureAlgorithm;
+ ISignatureCodec signatureCodec;
+ if (digestEncryptionAlgorithmOID.equals(Main.DSA_SIGNATURE_OID))
+ {
+ signatureAlgorithm = new DSSSignature();
+ signatureCodec = new DSSSignatureX509Codec();
+ }
+ else
+ {
+ signatureAlgorithm = new RSAPKCS1V1_5Signature(Registry.MD5_HASH);
+ signatureCodec = new RSAPKCS1V1_5SignatureX509Codec();
+ }
+
+ Map signatureAttributes = new HashMap();
+ signatureAttributes.put(ISignature.VERIFIER_KEY, verifierKey);
+ signatureAlgorithm.setupVerify(signatureAttributes);
+
+ Object herSignature = signatureCodec.decodeSignature(encryptedDigest);
+
+ // 7. verify the signature file contents
+ JarEntry sfEntry = jarFile.getJarEntry(JarUtils.META_INF + sigFileName
+ + JarUtils.SF_SUFFIX);
+ in = jarFile.getInputStream(sfEntry);
+ byte[] buffer = new byte[2048];
+ int n;
+ while ((n = in.read(buffer)) != -1)
+ if (n > 0)
+ signatureAlgorithm.update(buffer, 0, n);
+
+ boolean result = signatureAlgorithm.verify(herSignature);
+ log.finer("Signature block [" + sigFileName + "] is " //$NON-NLS-1$ //$NON-NLS-2$
+ + (result ? "" : "NOT ") + "OK"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+ log.exiting(this.getClass().getName(), "verifySF", Boolean.valueOf(result)); //$NON-NLS-1$
+ return result;
+ }
+
+ /**
+ * This method is called after at least one signer (usually a key-store
+ * <code>alias</code> name) was found to be trusted; i.e. his/her signature
+ * block in the corresponding <code>.DSA</code> file was successfully
+ * verified using his/her public key.
+ * <p>
+ * This method, uses the contents of the corresponding <code>.SF</code> file
+ * to compute and verify the hashes of the manifest entries in the JAR file.
+ *
+ * @param alias the name of the signature file; i.e. the name to use for both
+ * the .SF and .DSA files.
+ * @return <code>true</code> if all the entries in the corresponding
+ * <code>.SF</code> file have the same hash values as their
+ * alter-ego in the <i>manifest</i> file of the JAR file inquestion.
+ * @throws IOException if an I/O related exception occurs during the process.
+ */
+ private boolean verifySFEntries(String alias) throws IOException
+ {
+ log.entering(this.getClass().getName(), "verifySFEntries"); //$NON-NLS-1$
+
+ // 1. read the signature file
+ JarEntry jarEntry = jarFile.getJarEntry(JarUtils.META_INF + alias
+ + JarUtils.SF_SUFFIX);
+ InputStream in = jarFile.getInputStream(jarEntry);
+ Attributes attr = new Attributes();
+ Map entries = new HashMap();
+ JarUtils.readSFManifest(attr, entries, in);
+
+ // 2. The .SF file by default includes a header containing a hash of the
+ // entire manifest file. When the header is present, then the verification
+ // can check to see whether or not the hash in the header indeed matches
+ // the hash of the manifest file.
+ boolean result = false;
+ String hash = attr.getValue(Main.DIGEST_MANIFEST_ATTR);
+ if (hash != null)
+ result = verifyManifest(hash);
+
+ // A verification is still considered successful if none of the files that
+ // were in the JAR file when the signature was generated have been changed
+ // since then, which is the case if the hashes in the non-header sections
+ // of the .SF file equal the hashes of the corresponding sections in the
+ // manifest file.
+ //
+ // 3. Read each file in the JAR file that has an entry in the .SF file.
+ // While reading, compute the file's digest, and then compare the result
+ // with the digest for this file in the manifest section. The digests
+ // should be the same, or verification fails.
+ if (! result)
+ for (Iterator it = entries.keySet().iterator(); it.hasNext();)
+ {
+ Entry me = (Entry) it.next();
+ String name = (String) me.getKey();
+ attr = (Attributes) me.getValue();
+ hash = attr.getValue(Main.DIGEST_ATTR);
+ result = verifySFEntry(name, hash);
+ if (! result)
+ break;
+ }
+
+ log.exiting(this.getClass().getName(), "verifySFEntries",
+ Boolean.valueOf(result)); //$NON-NLS-1$
+ return result;
+ }
+
+ /**
+ * @param hash Base-64 encoded form of the manifest's digest.
+ * @return <code>true</code> if our computation of the manifest's hash
+ * matches the given value; <code>false</code> otherwise.
+ * @throws IOException if unable to acquire the JAR's manifest entry.
+ */
+ private boolean verifyManifest(String hash) throws IOException
+ {
+ return verifySFEntry(JarFile.MANIFEST_NAME, hash);
+ }
+
+ /**
+ * @param name the name of a JAR entry to verify.
+ * @param hash Base-64 encoded form of the designated entry's digest.
+ * @return <code>true</code> if our computation of the JAR entry's hash
+ * matches the given value; <code>false</code> otherwise.
+ * @throws IOException if an exception occurs while returning the entry's
+ * input stream.
+ */
+ private boolean verifySFEntry(String name, String hash) throws IOException
+ {
+ String expectedValue = getEntryHash(JarFile.MANIFEST_NAME);
+ boolean result = expectedValue.equalsIgnoreCase(hash);
+ log.finest("Is " + name + " OK? " + result); //$NON-NLS-1$ //$NON-NLS-2$
+ return result;
+ }
+
+ private String getEntryHash(String entryName) throws IOException
+ {
+ String result = (String) entryHashes.get(entryName);
+ if (result == null)
+ {
+ JarEntry manifest = jarFile.getJarEntry(entryName);
+ InputStream in = jarFile.getInputStream(manifest);
+ result = util.hashStream(in);
+ entryHashes.put(entryName, result);
+ }
+
+ return result;
+ }
+}
diff --git a/tools/gnu/classpath/tools/jarsigner/Main.java b/tools/gnu/classpath/tools/jarsigner/Main.java
new file mode 100644
index 000000000..f460a96cc
--- /dev/null
+++ b/tools/gnu/classpath/tools/jarsigner/Main.java
@@ -0,0 +1,567 @@
+/* Main.java -- JAR signing and verification tool not unlike jarsigner
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.jarsigner;
+
+import gnu.classpath.SystemProperties;
+import gnu.classpath.tools.HelpPrinter;
+import gnu.classpath.tools.common.CallbackUtil;
+import gnu.classpath.tools.common.ProviderUtil;
+import gnu.java.security.OID;
+import gnu.java.security.Registry;
+import gnu.javax.security.auth.callback.ConsoleCallbackHandler;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.Key;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.Security;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.util.Locale;
+import java.util.jar.Attributes.Name;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+/**
+ * The GNU Classpath implementation of the <i>jarsigner</i> tool.
+ * <p>
+ * The <i>jarsigner</i> tool is used to sign and verify JAR (Java ARchive)
+ * files.
+ * <p>
+ * This implementation is intended to be compatible with the behaviour
+ * described in the public documentation of the same tool included in JDK 1.4.
+ */
+public class Main
+{
+ private static final Logger log = Logger.getLogger(Main.class.getName());
+ private static final String HELP_PATH = "jarsigner/jarsigner.txt"; //$NON-NLS-1$
+ private static final Locale EN_US_LOCALE = new Locale("en", "US"); //$NON-NLS-1$ //$NON-NLS-2$
+ static final String DIGEST = "SHA1-Digest"; //$NON-NLS-1$
+ static final String DIGEST_MANIFEST = "SHA1-Digest-Manifest"; //$NON-NLS-1$
+ static final Name DIGEST_ATTR = new Name(DIGEST);
+ static final Name DIGEST_MANIFEST_ATTR = new Name(DIGEST_MANIFEST);
+ static final OID DSA_SIGNATURE_OID = new OID(Registry.DSA_OID_STRING);
+ static final OID RSA_SIGNATURE_OID = new OID(Registry.RSA_OID_STRING);
+
+ private boolean verify;
+ private String ksURL;
+ private String ksType;
+ private String password;
+ private String ksPassword;
+ private String sigFileName;
+ private String signedJarFileName;
+ private boolean verbose;
+ private boolean certs;
+ private boolean internalSF;
+ private boolean sectionsOnly;
+ private String providerClassName;
+ private String jarFileName;
+ private String alias;
+
+ protected Provider provider;
+ private boolean providerInstalled;
+ private char[] ksPasswordChars;
+ private KeyStore store;
+ private char[] passwordChars;
+ private PrivateKey signerPrivateKey;
+ private Certificate[] signerCertificateChain;
+ /** The callback handler to use when needing to interact with user. */
+ private CallbackHandler handler;
+
+ private Main()
+ {
+ super();
+ }
+
+ public static final void main(String[] args)
+ {
+ log.entering(Main.class.getName(), "main", args); //$NON-NLS-1$
+
+ Main tool = new Main();
+ try
+ {
+ tool.processArgs(args);
+ tool.start();
+ }
+ catch (SecurityException x)
+ {
+ log.throwing(Main.class.getName(), "main", x); //$NON-NLS-1$
+ System.err.println(Messages.getString("Main.7") + x.getMessage()); //$NON-NLS-1$
+ }
+ catch (Exception x)
+ {
+ log.throwing(Main.class.getName(), "main", x); //$NON-NLS-1$
+ System.err.println(Messages.getString("Main.9") + x); //$NON-NLS-1$
+ }
+
+ tool.teardown();
+
+ log.exiting(Main.class.getName(), "main"); //$NON-NLS-1$
+ // System.exit(0);
+ }
+
+ // helper methods -----------------------------------------------------------
+
+ /**
+ * Read the command line arguments setting the tool's parameters in
+ * preparation for the user desired action.
+ *
+ * @param args an array of options (strings).
+ * @throws Exception if an exceptio occurs during the process.
+ */
+ private void processArgs(String[] args) throws Exception
+ {
+ log.entering(this.getClass().getName(), "processArgs", args); //$NON-NLS-1$
+
+ HelpPrinter.checkHelpKey(args, HELP_PATH);
+ if (args == null || args.length == 0)
+ HelpPrinter.printHelpAndExit(HELP_PATH);
+
+ int limit = args.length;
+ log.finest("args.length=" + limit); //$NON-NLS-1$
+ int i = 0;
+ String opt;
+ while (i < limit)
+ {
+ opt = args[i++];
+ log.finest("args[" + (i - 1) + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-verify".equals(opt)) // -verify //$NON-NLS-1$
+ verify = true;
+ else if ("-keystore".equals(opt)) // -keystore URL //$NON-NLS-1$
+ ksURL = args[i++];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE //$NON-NLS-1$
+ ksType = args[i++];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD //$NON-NLS-1$
+ ksPassword = args[i++];
+ else if ("-keypass".equals(opt)) // -keypass PASSWORD //$NON-NLS-1$
+ password = args[i++];
+ else if ("-sigfile".equals(opt)) // -sigfile NAME //$NON-NLS-1$
+ sigFileName = args[i++];
+ else if ("-signedjar".equals(opt)) // -signedjar FILE_NAME //$NON-NLS-1$
+ signedJarFileName = args[i++];
+ else if ("-verbose".equals(opt)) // -verbose //$NON-NLS-1$
+ verbose = true;
+ else if ("-certs".equals(opt)) // -certs //$NON-NLS-1$
+ certs = true;
+ else if ("-internalsf".equals(opt)) // -internalsf //$NON-NLS-1$
+ internalSF = true;
+ else if ("-sectionsonly".equals(opt)) // -sectionsonly //$NON-NLS-1$
+ sectionsOnly = true;
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME //$NON-NLS-1$
+ providerClassName = args[i++];
+ else
+ {
+ jarFileName = opt;
+ if (! verify)
+ alias = args[i++];
+
+ break;
+ }
+ }
+
+ if (i < limit) // more options than needed
+ log.fine("Last argument is assumed at index #" + (i - 1) //$NON-NLS-1$
+ + ". Remaining arguments (" + args[i] //$NON-NLS-1$
+ + "...) will be ignored"); //$NON-NLS-1$
+
+ setupCommonParams();
+ if (verify)
+ {
+ log.finer("Will verify with the following parameters:"); //$NON-NLS-1$
+ log.finer(" jar-file = '" + jarFileName + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer("Options:"); //$NON-NLS-1$
+ log.finer(" provider = '" + providerClassName + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer(" verbose ? " + verbose); //$NON-NLS-1$
+ log.finer(" certs ? " + certs); //$NON-NLS-1$
+ log.finer(" internalsf ? " + internalSF); //$NON-NLS-1$
+ log.finer(" sectionsonly ? " + sectionsOnly); //$NON-NLS-1$
+ }
+ else // sign
+ {
+ setupSigningParams();
+
+ log.finer("Will sign with the following parameters:"); //$NON-NLS-1$
+ log.finer(" jar-file = '" + jarFileName + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer(" alias = '" + alias + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer("Options:"); //$NON-NLS-1$
+ log.finer(" keystore = '" + ksURL + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer(" storetype = '" + ksType + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer(" storepass = '" + ksPassword + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer(" keypass = '" + password + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer(" sigfile = '" + sigFileName + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer(" signedjar = '" + signedJarFileName + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer(" provider = '" + providerClassName + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ log.finer(" verbose ? " + verbose); //$NON-NLS-1$
+ log.finer(" internalsf ? " + internalSF); //$NON-NLS-1$
+ log.finer(" sectionsonly ? " + sectionsOnly); //$NON-NLS-1$
+ }
+
+ log.exiting(this.getClass().getName(), "processArgs"); //$NON-NLS-1$
+ }
+
+ /**
+ * Invokes the <code>start()</code> method of the concrete handler.
+ * <p>
+ * Depending on the result of processing the command line arguments, this
+ * handler may be one for signing the jar, or verifying it.
+ *
+ * @throws Exception if an exception occurs during the process.
+ */
+ private void start() throws Exception
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ if (verify)
+ {
+ JarVerifier jv = new JarVerifier(this);
+ jv.start();
+ }
+ else
+ {
+ JarSigner js = new JarSigner(this);
+ js.start();
+ }
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ /**
+ * Ensures that the underlying JVM is left in the same state as we found it
+ * when we first launched the tool. Specifically, if we have installed a new
+ * security provider then now is the time to remove it.
+ * <p>
+ * Note (rsn): this may not be necessary if we terminate the JVM; i.e. call
+ * {@link System#exit(int)} at the end of the tool's invocation. Nevertheless
+ * it's good practive to return the JVM to its initial state.
+ */
+ private void teardown()
+ {
+ log.entering(this.getClass().getName(), "teardown"); //$NON-NLS-1$
+
+ if (providerInstalled)
+ ProviderUtil.removeProvider(provider.getName());
+
+ log.exiting(this.getClass().getName(), "teardown"); //$NON-NLS-1$
+ }
+
+ /**
+ * After processing the command line arguments, this method is invoked to
+ * process the common parameters which may have been encountered among the
+ * actual arguments.
+ * <p>
+ * Common parameters are those which are allowed in both signing and
+ * verification modes.
+ *
+ * @throws InstantiationException if a security provider class name is
+ * specified but that class name is that of either an interface or
+ * an abstract class.
+ * @throws IllegalAccessException if a security provider class name is
+ * specified but no 0-arguments constructor is defined for that
+ * class.
+ * @throws ClassNotFoundException if a security provider class name is
+ * specified but no such class was found in the classpath.
+ * @throws IOException if the JAR file name for signing, or verifying, does
+ * not exist, exists but denotes a directory, or is not readable.
+ */
+ private void setupCommonParams() throws InstantiationException,
+ IllegalAccessException, ClassNotFoundException, IOException
+ {
+ log.entering(this.getClass().getName(), "setupCommonParams"); //$NON-NLS-1$
+
+ if (jarFileName == null)
+ HelpPrinter.printHelpAndExit(HELP_PATH);
+
+ File jar = new File(jarFileName);
+ if (! jar.exists())
+ throw new FileNotFoundException(jarFileName);
+
+ if (jar.isDirectory())
+ throw new IOException(Messages.getFormattedString("Main.70", jarFileName)); //$NON-NLS-1$
+
+ if (! jar.canRead())
+ throw new IOException(Messages.getFormattedString("Main.72", jarFileName)); //$NON-NLS-1$ //$NON-NLS-2$
+
+ if (providerClassName != null && providerClassName.length() > 0)
+ {
+ provider = (Provider) Class.forName(providerClassName).newInstance();
+ // is it already installed?
+ String providerName = provider.getName();
+ Provider installedProvider = Security.getProvider(providerName);
+ if (installedProvider != null)
+ log.finer("Provider " + providerName + " is already installed"); //$NON-NLS-1$ //$NON-NLS-2$
+ else // install it
+ installNewProvider();
+ }
+
+ if (! verbose && certs)
+ {
+ log.fine("Option <certs> is set but <verbose> is not. Ignored"); //$NON-NLS-1$
+ certs = false;
+ }
+
+ log.exiting(this.getClass().getName(), "setupCommonParams"); //$NON-NLS-1$
+ }
+
+ /**
+ * Install the user defined security provider in the underlying JVM.
+ * <p>
+ * Also record this fact so we can remove it when we exit the tool.
+ */
+ private void installNewProvider()
+ {
+ log.entering(this.getClass().getName(), "installNewProvider"); //$NON-NLS-1$
+
+ providerInstalled = ProviderUtil.addProvider(provider) != -1;
+
+ log.exiting(this.getClass().getName(), "installNewProvider"); //$NON-NLS-1$
+ }
+
+ /**
+ * After processing the command line arguments, this method is invoked to
+ * process the parameters which may have been encountered among the actual
+ * arguments, and which are specific to the signing action of the tool.
+ *
+ * @throws KeyStoreException if no implementation of the designated (or
+ * default type) of a key store is availabe.
+ * @throws IOException if an I/O related exception occurs during the process.
+ * @throws NoSuchAlgorithmException if an implementation of an algorithm used
+ * by the key store is not available.
+ * @throws CertificateException if an exception occurs while reading a
+ * certificate from the key store.
+ * @throws UnsupportedCallbackException if no implementation of a password
+ * callback is available.
+ * @throws UnrecoverableKeyException if the wrong password was used to unlock
+ * the key store.
+ * @throws SecurityException if the designated alias is not known to the key
+ * store or is not an Alias of a Key Entry.
+ */
+ private void setupSigningParams() throws KeyStoreException, IOException,
+ NoSuchAlgorithmException, CertificateException,
+ UnsupportedCallbackException, UnrecoverableKeyException
+ {
+ log.entering(this.getClass().getName(), "setupSigningParams"); //$NON-NLS-1$
+
+ if (ksURL == null || ksURL.trim().length() == 0)
+ {
+ String userHome = SystemProperties.getProperty("user.home"); //$NON-NLS-1$
+ if (userHome == null || userHome.trim().length() == 0)
+ throw new SecurityException(Messages.getString("Main.85")); //$NON-NLS-1$
+
+ ksURL = "file:" + userHome.trim() + "/.keystore"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ else
+ {
+ ksURL = ksURL.trim();
+ if (ksURL.indexOf(":") == -1) //$NON-NLS-1$
+ ksURL = "file:" + ksURL; //$NON-NLS-1$
+ }
+
+ if (ksType == null || ksType.trim().length() == 0)
+ ksType = KeyStore.getDefaultType();
+ else
+ ksType = ksType.trim();
+
+ store = KeyStore.getInstance(ksType);
+
+ if (ksPassword == null)
+ {
+ // ask the user to provide one
+ PasswordCallback pcb = new PasswordCallback(Messages.getString("Main.92"), //$NON-NLS-1$
+ false);
+ getCallbackHandler().handle(new Callback[] { pcb });
+ ksPasswordChars = pcb.getPassword();
+ }
+ else
+ ksPasswordChars = ksPassword.toCharArray();
+
+ URL url = new URL(ksURL);
+ InputStream stream = url.openStream();
+ store.load(stream, ksPasswordChars);
+
+ if (alias == null)
+ HelpPrinter.printHelpAndExit(HELP_PATH);
+
+ if (! store.containsAlias(alias))
+ throw new SecurityException(Messages.getFormattedString("Main.6", alias)); //$NON-NLS-1$
+
+ if (! store.isKeyEntry(alias))
+ throw new SecurityException(Messages.getFormattedString("Main.95", alias)); //$NON-NLS-1$
+
+ Key key;
+ if (password == null)
+ {
+ passwordChars = ksPasswordChars;
+ try
+ {
+ key = store.getKey(alias, passwordChars);
+ }
+ catch (UnrecoverableKeyException x)
+ {
+ // ask the user to provide one
+ String prompt = Messages.getFormattedString("Main.97", alias); //$NON-NLS-1$
+ PasswordCallback pcb = new PasswordCallback(prompt, false);
+ getCallbackHandler().handle(new Callback[] { pcb });
+ passwordChars = pcb.getPassword();
+ // take 2
+ key = store.getKey(alias, passwordChars);
+ }
+ }
+ else
+ {
+ passwordChars = password.toCharArray();
+ key = store.getKey(alias, passwordChars);
+ }
+
+ if (! (key instanceof PrivateKey))
+ throw new SecurityException(Messages.getFormattedString("Main.99", alias)); //$NON-NLS-1$
+
+ signerPrivateKey = (PrivateKey) key;
+ signerCertificateChain = store.getCertificateChain(alias);
+ log.finest(String.valueOf(signerCertificateChain));
+
+ if (sigFileName == null)
+ sigFileName = alias;
+
+ sigFileName = sigFileName.toUpperCase(EN_US_LOCALE);
+ if (sigFileName.length() > 8)
+ sigFileName = sigFileName.substring(0, 8);
+
+ char[] chars = sigFileName.toCharArray();
+ for (int i = 0; i < chars.length; i++)
+ {
+ char c = chars[i];
+ if (! (Character.isLetter(c)
+ || Character.isDigit(c)
+ || c == '_'
+ || c == '-'))
+ chars[i] = '_';
+ }
+
+ sigFileName = new String(chars);
+
+ if (signedJarFileName == null)
+ signedJarFileName = jarFileName;
+
+ log.exiting(this.getClass().getName(), "setupSigningParams"); //$NON-NLS-1$
+ }
+
+ boolean isVerbose()
+ {
+ return verbose;
+ }
+
+ boolean isCerts()
+ {
+ return certs;
+ }
+
+ String getSigFileName()
+ {
+ return this.sigFileName;
+ }
+
+ String getJarFileName()
+ {
+ return this.jarFileName;
+ }
+
+ boolean isSectionsOnly()
+ {
+ return this.sectionsOnly;
+ }
+
+ boolean isInternalSF()
+ {
+ return this.internalSF;
+ }
+
+ PrivateKey getSignerPrivateKey()
+ {
+ return this.signerPrivateKey;
+ }
+
+ Certificate[] getSignerCertificateChain()
+ {
+ return signerCertificateChain;
+ }
+
+ String getSignedJarFileName()
+ {
+ return this.signedJarFileName;
+ }
+
+ /**
+ * Return a CallbackHandler which uses the Console (System.in and System.out)
+ * for interacting with the user.
+ * <p>
+ * This method first finds all currently installed security providers capable
+ * of providing such service and then in turn attempts to instantiate the
+ * handler from those providers. As soon as one provider returns a non-null
+ * instance of the callback handler, the search stops and that instance is
+ * set to be used from now on.
+ * <p>
+ * If no installed providers were found, this method falls back on the GNU
+ * provider, by-passing the Security search mechanism. The default console
+ * callback handler implementation is {@link ConsoleCallbackHandler}.
+ *
+ * @return a console-based {@link CallbackHandler}.
+ */
+ protected CallbackHandler getCallbackHandler()
+ {
+ if (handler == null)
+ handler = CallbackUtil.getConsoleHandler();
+
+ return handler;
+ }
+}
diff --git a/tools/gnu/classpath/tools/jarsigner/Messages.java b/tools/gnu/classpath/tools/jarsigner/Messages.java
new file mode 100644
index 000000000..284639115
--- /dev/null
+++ b/tools/gnu/classpath/tools/jarsigner/Messages.java
@@ -0,0 +1,115 @@
+/* Messages.java -- I18N related helper class
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.jarsigner;
+
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.logging.Logger;
+
+/**
+ * An initially generated Eclipse helper class to ease the use of localized
+ * messages.
+ * <p>
+ * Enriched to handle localized message formats.
+ */
+class Messages
+{
+ private static final Logger log = Logger.getLogger(Messages.class.getName());
+ private static final String BUNDLE_NAME = "gnu.classpath.tools.jarsigner.MessageBundle"; //$NON-NLS-1$
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+ private static final Map CACHED_FORMATS = new HashMap(5);
+
+ private Messages()
+ {
+ super();
+ }
+
+ public static String getString(String key)
+ {
+ try
+ {
+ return RESOURCE_BUNDLE.getString(key);
+ }
+ catch (MissingResourceException e)
+ {
+ return constructMessage(key, null);
+ }
+ }
+
+ public static String getFormattedString(String key, Object args)
+ {
+ MessageFormat mf = (MessageFormat) CACHED_FORMATS.get(key);
+ if (mf == null)
+ {
+ String formatString = getString(key);
+ if (formatString.startsWith("!"))
+ return constructMessage(key, args);
+
+ mf = new MessageFormat(formatString);
+ CACHED_FORMATS.put(key, mf);
+ }
+
+ // if the argument is not an array, then build one consisiting of the
+ // sole argument before passing it to the format() method
+ try
+ {
+ if (args instanceof Object[])
+ return mf.format(args);
+
+ return mf.format(new Object[] { args });
+ }
+ catch (IllegalArgumentException x)
+ {
+ log.fine("Exception while rendering a message format keyed by ["
+ + key + "]: " + mf.toPattern());
+ return constructMessage(mf.toPattern(), args);
+ }
+ }
+
+ private static final String constructMessage(String m, Object args)
+ {
+ if (args == null)
+ return '!' + m + '!';
+
+ return '!' + m + '!' + String.valueOf(args) + '!';
+ }
+}
diff --git a/tools/gnu/classpath/tools/jarsigner/SFHelper.java b/tools/gnu/classpath/tools/jarsigner/SFHelper.java
new file mode 100644
index 000000000..b4e5cc193
--- /dev/null
+++ b/tools/gnu/classpath/tools/jarsigner/SFHelper.java
@@ -0,0 +1,373 @@
+/* SFHelper -- A .SF file helper
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.jarsigner;
+
+import gnu.java.security.OID;
+import gnu.java.security.Registry;
+import gnu.java.security.der.DER;
+import gnu.java.security.der.DERValue;
+import gnu.java.security.pkcs.PKCS7Data;
+import gnu.java.security.pkcs.PKCS7SignedData;
+import gnu.java.security.pkcs.SignerInfo;
+import gnu.java.security.sig.ISignature;
+import gnu.java.security.sig.ISignatureCodec;
+import gnu.java.security.sig.dss.DSSSignature;
+import gnu.java.security.sig.dss.DSSSignatureX509Codec;
+import gnu.java.security.sig.rsa.RSAPKCS1V1_5Signature;
+import gnu.java.security.sig.rsa.RSAPKCS1V1_5SignatureX509Codec;
+import gnu.java.security.util.Util;
+import gnu.java.util.jar.JarUtils;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.security.PrivateKey;
+import java.security.cert.CRLException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509CRL;
+import java.security.interfaces.DSAPrivateKey;
+import java.security.interfaces.RSAPrivateKey;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.logging.Logger;
+
+import javax.security.auth.x500.X500Principal;
+import java.security.cert.X509Certificate;
+
+/**
+ * A helper class for the .SF file found in signed jars.
+ */
+public class SFHelper
+{
+ // Constants and fields
+ // --------------------------------------------------------------------------
+
+ private static final Logger log = Logger.getLogger(SFHelper.class.getName());
+ private static final int READY = 0;
+ private static final int STARTED = 1;
+ private static final int FINISHED = 2;
+ private static final int SF_GENERATED = 3;
+ private static final int DSA_GENERATED = 4;
+ /** http://asn1.elibel.tm.fr/cgi-bin/oid/display?oid=1.3.14.3.2.26&action=display */
+ private static final OID hashAlgorithmIdentifierSHA1 = new OID("1.3.14.3.2.26"); //$NON-NLS-1$
+
+ private int state;
+ private JarFile jar;
+ private Manifest manifest;
+ private Attributes sfMainAttributes;
+ private Map sfEntries;
+ private byte[] sfBytes;
+ private HashUtils util;
+
+ // Constructor(s)
+ // --------------------------------------------------------------------------
+
+ /**
+ * @param jar the JAR archive the .SF file belongs to.
+ */
+ public SFHelper(JarFile jar)
+ {
+ super();
+
+ this.jar = jar;
+ this.state = READY;
+ }
+
+ // Class methods
+ // --------------------------------------------------------------------------
+
+ // Instance methods
+ // --------------------------------------------------------------------------
+
+ /**
+ * Writes the contents of the <code>.SF</code> file to the designated JAR
+ * output stream. Line-endings are platform-independent and consist of the
+ * 2-codepoint sequence <code>0x0D</code> and <code>0x0A</code>.
+ *
+ * @param jar the JAR output stream to write a <code>.SF</code> file to.
+ * @throws IOException if an I/O related exception occurs during the process.
+ */
+ void writeSF(JarOutputStream jar) throws IOException
+ {
+ if (this.state != FINISHED)
+ throw new IllegalStateException(Messages.getString("SFHelper.1")); //$NON-NLS-1$
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ JarUtils.writeSFManifest(sfMainAttributes, sfEntries, baos);
+ sfBytes = baos.toByteArray();
+ log.finest("\n" + Util.dumpString(sfBytes, "+++ sfBytes ")); //$NON-NLS-1$ //$NON-NLS-2$
+ jar.write(sfBytes);
+ jar.flush();
+
+ this.state = SF_GENERATED;
+ }
+
+ /**
+ * The contents of the .DSA file is the DER encoded form of a PKCS#7
+ * ContentInfo of the type SignedData.
+ * <p>
+ * The ContentInfo ASN.1 syntax is as described in the "PKCS#7 Cryptographic
+ * Message Syntax Standard" (RSA Labs) specifications:
+ * <pre>
+ * ContentInfo ::= SEQUENCE {
+ * contentType ContentType,
+ * content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL
+ * }
+ *
+ * ContentType ::= OBJECT IDENTIFIER
+ * </pre>
+ * <p>
+ * The ContentType is an OID which determines the type of the contents field
+ * that follows it. For the .DSA file the OID is "1.2.840.113549.1.7.2", while
+ * the content field is the byte array representing the DER encoded form of a
+ * SignedData content-type. The ASN.1 syntax of the SignedData type is as
+ * follows:
+ * <pre>
+ * SignedData ::= SEQUENCE {
+ * version Version, -- always 1 for PKCS#7 1.5
+ * digestAlgorithms DigestAlgorithmIdentifiers,
+ * contentInfo ContentInfo,
+ * certificates [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
+ * crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
+ * signerInfos SignerInfos
+ * }
+ *
+ * DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier
+ *
+ * SignerInfos ::= SET OF SignerInfo
+ * </pre>
+ * <p>
+ * Finally the SignerInfo is a per-signer structure. Its ASN.1 syntax looks
+ * like so:
+ * <pre>
+ * SignerInfo ::= SEQUENCE {
+ * version Version, -- always 1 for PKCS#7 1.5
+ * issuerAndSerialNumber IssuerAndSerialNumber,
+ * digestAlgorithm DigestAlgorithmIdentifier,
+ * authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
+ * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
+ * encryptedDigest EncryptedDigest,
+ * unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
+ * }
+ *
+ * EncryptedDigest ::= OCTET STRING
+ * </pre>
+ *
+ * @param jar the JAR output stream to write a <code>.DSA</code> file to.
+ * @param signerKey the private key to sign with.
+ * @param certificates the possibly null signer certificate chain.
+ * @param internalSF if <code>true</code> then include the .SF file contents
+ * in the signed .DSA file; otherwise don't.
+ * @throws IOException if an I/O related exception occurs during the process.
+ * @throws CRLException
+ * @throws CertificateEncodingException
+ */
+ void writeDSA(JarOutputStream jar, PrivateKey signerKey,
+ Certificate[] certificates, boolean internalSF)
+ throws IOException, CertificateEncodingException, CRLException
+ {
+ if (this.state != SF_GENERATED)
+ throw new IllegalStateException(Messages.getString("SFHelper.4")); //$NON-NLS-1$
+
+ log.finest("+++ signer private key = " + signerKey); //$NON-NLS-1$
+ ISignature signatureAlgorithm;
+ ISignatureCodec signatureCodec;
+ OID digestEncryptionAlgorithmOID;
+ if (signerKey instanceof DSAPrivateKey)
+ {
+ signatureAlgorithm = new DSSSignature();
+ signatureCodec = new DSSSignatureX509Codec();
+ digestEncryptionAlgorithmOID = Main.DSA_SIGNATURE_OID;
+ }
+ else if (signerKey instanceof RSAPrivateKey)
+ {
+ signatureAlgorithm = new RSAPKCS1V1_5Signature(Registry.MD5_HASH);
+ signatureCodec = new RSAPKCS1V1_5SignatureX509Codec();
+ digestEncryptionAlgorithmOID = Main.RSA_SIGNATURE_OID;
+ }
+ else
+ throw new SecurityException(Messages.getString("SFHelper.6")); //$NON-NLS-1$
+
+ Map signatureAttributes = new HashMap();
+ signatureAttributes.put(ISignature.SIGNER_KEY, signerKey);
+ signatureAlgorithm.setupSign(signatureAttributes);
+ signatureAlgorithm.update(sfBytes, 0, sfBytes.length);
+ Object signature = signatureAlgorithm.sign();
+ byte[] signedSFBytes = signatureCodec.encodeSignature(signature);
+ log.finest("\n" + Util.dumpString(signedSFBytes, "+++ signedSFBytes ")); //$NON-NLS-1$ //$NON-NLS-2$
+
+ Set digestAlgorithms = new HashSet();
+ List digestAlgorithm = new ArrayList(2);
+ DERValue derDigestAlgorithmOID = new DERValue(DER.OBJECT_IDENTIFIER,
+ hashAlgorithmIdentifierSHA1);
+ DERValue derDigestAlgorithmParams = new DERValue(DER.NULL, null);
+ digestAlgorithm.add(derDigestAlgorithmOID);
+ digestAlgorithm.add(derDigestAlgorithmParams);
+ DERValue derDigestAlgorithm = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ digestAlgorithm);
+ digestAlgorithms.add(derDigestAlgorithm);
+
+ // TODO (rsn): test with internalsf == true
+ PKCS7Data data = internalSF ? new PKCS7Data(sfBytes) : null;
+
+ X509CRL[] crls = null;
+
+ Set signerInfos = new HashSet();
+ X509Certificate cert = (X509Certificate) certificates[0];
+ X500Principal issuer = cert.getIssuerX500Principal();
+ BigInteger serialNumber = cert.getSerialNumber();
+ byte[] authenticatedAttributes = null;
+ byte[] encryptedDigest = signedSFBytes;
+ byte[] unauthenticatedAttributes = null;
+ SignerInfo signerInfo = new SignerInfo(issuer,
+ serialNumber,
+ hashAlgorithmIdentifierSHA1,
+ authenticatedAttributes,
+ digestEncryptionAlgorithmOID,
+ encryptedDigest,
+ unauthenticatedAttributes);
+ signerInfos.add(signerInfo);
+
+ PKCS7SignedData dsaContents = new PKCS7SignedData(digestAlgorithms,
+ data,
+ certificates,
+ crls,
+ signerInfos);
+ dsaContents.encode(jar);
+
+ jar.flush();
+ this.state = DSA_GENERATED;
+ }
+
+ Manifest getManifest()
+ {
+ return this.manifest;
+ }
+
+ // own methods --------------------------------------------------------------
+
+ void startSigning() throws IOException
+ {
+ if (this.state != READY)
+ throw new IllegalStateException(Messages.getString("SFHelper.9")); //$NON-NLS-1$
+
+ Manifest oldManifest = jar.getManifest();
+ this.manifest = oldManifest == null ? new Manifest()
+ : new Manifest(oldManifest);
+ this.sfMainAttributes = new Attributes();
+ this.sfEntries = new HashMap();
+ util = new HashUtils();
+
+ this.state = STARTED;
+ }
+
+ /**
+ * Hashes the designated JAR entry (the file itself); adds the resulting hash
+ * as an attribute to the manifest, and computes the hash of the added (to
+ * the Manifest) two headers and add the result as an attribute of the
+ * corresponding entry in the .SF file.
+ */
+ void updateEntry(JarEntry entry) throws IOException
+ {
+ if (this.state != STARTED)
+ throw new IllegalStateException(Messages.getString("SFHelper.10")); //$NON-NLS-1$
+
+ String name = entry.getName();
+ InputStream jeis = jar.getInputStream(entry);
+ String hash = util.hashStream(jeis);
+ log.finer("Hash of " + name + " = " + hash); //$NON-NLS-1$ //$NON-NLS-2$
+
+ Attributes mainfestAttributes = manifest.getAttributes(name);
+ if (mainfestAttributes == null)
+ {
+ mainfestAttributes = new Attributes();
+ manifest.getEntries().put(name, mainfestAttributes);
+ }
+
+ mainfestAttributes.putValue(Main.DIGEST, hash);
+
+ // hash the newly added 2-header block and add it as an attribute to .SF
+
+ String sfHash = util.hashManifestEntry(name, hash);
+ Attributes sfAttributes = (Attributes) sfEntries.get(name);
+ if (sfAttributes == null)
+ {
+ sfAttributes = new Attributes();
+ sfEntries.put(name, sfAttributes);
+ }
+
+ sfAttributes.putValue(Main.DIGEST, sfHash);
+ log.finest("Name: " + name); //$NON-NLS-1$
+ log.finest(Main.DIGEST + ": " + sfHash); //$NON-NLS-1$
+ log.finest(""); //$NON-NLS-1$
+ }
+
+ /**
+ * @param sectionsOnly whether to compute, in addition to the files, the hash
+ * of the mainfest itself (<code>false</code>) or not (<code>true</code>).
+ */
+ void finishSigning(boolean sectionsOnly) throws IOException
+ {
+ if (state != STARTED)
+ throw new IllegalStateException(Messages.getString("SFHelper.10")); //$NON-NLS-1$
+
+ if (sectionsOnly)
+ return;
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ manifest.write(baos);
+ baos.flush();
+ String manifestHash = util.hashByteArray(baos.toByteArray());
+ log.fine("Hashed Manifest " + manifestHash); //$NON-NLS-1$
+ sfMainAttributes.putValue(Main.DIGEST_MANIFEST, manifestHash);
+
+ this.state = FINISHED;
+ }
+}
diff --git a/tools/gnu/classpath/tools/jarsigner/jarsigner.txt b/tools/gnu/classpath/tools/jarsigner/jarsigner.txt
new file mode 100644
index 000000000..e615609c1
--- /dev/null
+++ b/tools/gnu/classpath/tools/jarsigner/jarsigner.txt
@@ -0,0 +1,116 @@
+NAME
+ jarsigner - Java ARchive (JAR) file signing and verification tool
+
+SYNOPSIS
+ jarsigner [OPTION]... FILE ALIAS
+ jarsigner -verify [OPTION]... FILE
+
+DESCRIPTION
+ When the first form is used, the tool signs the designated JAR file.
+ The second form, on the other hand, is used to verify a previously
+ signed JAR file.
+
+ FILE is the .JAR file to process; i.e. to sign if the first syntax form
+ is used, or to verify if the second syntax form is used instead.
+
+ ALIAS must be a known Alias of a Key Entry in the designated key store.
+ The private key material associated with this Alias is then used for
+ signing the designated .JAR file.
+
+SIGNING OPTIONS
+ -keystore URL
+ Use this option to specify the location of the key store to use.
+ The default value is a file URL referencing the file named
+ ".keystore" (all lower case and without the enclosing quotes)
+ located in the path returned by the call to
+ java.lang.System#getProperty(String) using "user.home" as
+ argument.
+
+ If a URL was specified, but was found to be malformed --e.g.
+ missing protocol element-- the tool will attempt to use the URL
+ value as a file-name (with absolute or relative path-name) of a
+ key store --as if the protocol was "file:".
+
+ -storetype STORE_TYPE
+ Use this option to specify the type of the key store to use.
+ The default value, if this option is omitted, is that of the
+ property "keystore.type" in the security properties file, which
+ is obtained by invoking the static method call getDefaultType()
+ in java.security.KeyStore.
+
+ -storepass PASSWORD
+ Use this option to specify the password which will be used to
+ unlock the key store. If this option is missing, the User will
+ be prompted to provide a password.
+
+ -keypass PASSWORD
+ Use this option to specify the password which the tool will use
+ to unlock the Key Entry associated with the designated Alias.
+
+ If this option is omitted, the tool will first attempt to unlock
+ the Key Entry using the same password protecting the key store.
+ If this fails, you will then be prompted to provide a password.
+
+ -sigfile NAME
+ Use this option to designate a literal that will be used to
+ construct file names for both the .SF and .DSA signature files.
+ These files will be generated, by the tool, and placed in the
+ META-INF directory of the signed JAR. Permissible characters
+ for NAME must be in the range "a-zA-Z0-9_-". All characters
+ will be converted to upper-case ones.
+
+ If this option is missing, the first eight characters of the
+ ALIAS argument will be used. When this is the case, any
+ character in ALIAS that is outside the permissible range of
+ characters will be replaced by an underscore.
+
+ -signedjar FILE_NAME
+ Use this option to specify the file name of the signed JAR. If
+ this option is omitted, then the signed JAR will be named the
+ same as FILE; i.e. the input JAR file will be replaced with the
+ signed copy.
+
+VERIFICATION OPTIONS
+ -verify
+ Use this option to indicate that the tool is to be used for
+ verification purposes.
+
+ -certs This option is used in conjunction with the -verbose option.
+ When present, along with the -verbose option, the tool will
+ print more detailed information about the certificates of the
+ signer(s) being processed.
+
+COMMON OPTIONS
+ -verbose
+ Use this option to force the tool to generate more verbose
+ messages, during its processing.
+
+ -internalsf
+ When present, the tool will include --which otherwise it does
+ not-- the .SF file in the .DSA generated file.
+
+ -sectionsonly
+ When present, the tool will include in the .SF generated file
+ --which otherwise it does not-- a header containing a hash of
+ the whole manifest file. When that header is included, the
+ tool can quickly check, during verification, if the hash (in
+ the header) matches or not the manifest file.
+
+ -provider PROVIDER_CLASS_NAME
+ A fully qualified class name of a Security Provider to add to
+ the current list of Security Providers already installed in the
+ JVM in-use. If a provider class is specified with this option,
+ and was successfully added to the runtime --i.e. it was not
+ already installed-- then the tool will attempt to remove this
+ Security Provider before exiting.
+
+ -help Prints this help text.
+
+REPORTING BUGS
+ Please report bugs at http://www.gnu.org/software/classpath/bugs.html
+
+COPYRIGHT
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This is free software; see the source for copying conditions. There is
+ NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE.
diff --git a/tools/gnu/classpath/tools/jarsigner/package.html b/tools/gnu/classpath/tools/jarsigner/package.html
new file mode 100644
index 000000000..50574ddb7
--- /dev/null
+++ b/tools/gnu/classpath/tools/jarsigner/package.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- package.html - describes classes in gnu.classpath.tools.jarsigner
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. -->
+
+<html>
+<head>
+ <title>GNU Classpath - gnu.classpath.tools.jarsigner</title>
+</head>
+
+<body>
+This package contains the classes that provide an implementation of the
+Security Tool: <code>jarsigner</code>. The behaviour of these classes should
+match that of the same tool provided in the RI version 1.4.2, except for the
+following:
+
+<ul>
+ <li>The RI tool accepts -J<i>javaoption</i> options which it then passes to
+ the underlying JVM. This is because the RI tool acts as a <i>wrapper</i>
+ around the JVM launcher.
+ <p>
+ This implementation DOES NOT support these options.
+ </li>
+</ul>
+</body>
+</html>
diff --git a/tools/gnu/classpath/tools/keytool/CertReqCmd.java b/tools/gnu/classpath/tools/keytool/CertReqCmd.java
new file mode 100644
index 000000000..0c64246e8
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/CertReqCmd.java
@@ -0,0 +1,405 @@
+/* CertReqCmd.java -- The certreq command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.java.security.OID;
+import gnu.java.security.der.BitString;
+import gnu.java.security.der.DER;
+import gnu.java.security.der.DERReader;
+import gnu.java.security.der.DERValue;
+import gnu.java.security.der.DERWriter;
+import gnu.java.security.util.Base64;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.math.BigInteger;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SignatureException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.x500.X500Principal;
+
+/**
+ * The <b>-certreq</b> keytool command handler is used to generate a Certificate
+ * Signing Request (CSR) in PKCS#10 format.
+ * <p>
+ * The ASN.1 specification of a CSR, as stated in RFC-2986 is as follows:
+ * <p>
+ * <pre>
+ * CertificationRequest ::= SEQUENCE {
+ * certificationRequestInfo CertificationRequestInfo,
+ * signatureAlgorithm AlgorithmIdentifier,
+ * signature BIT STRING
+ * }
+ *
+ * CertificationRequestInfo ::= SEQUENCE {
+ * version INTEGER -- v1(0)
+ * subject Name,
+ * subjectPKInfo SubjectPublicKeyInfo,
+ * attributes [0] IMPLICIT Attributes -- see note later
+ * }
+ *
+ * SubjectPublicKeyInfo ::= SEQUENCE {
+ * algorithm AlgorithmIdentifier,
+ * subjectPublicKey BIT STRING
+ * }
+ * </pre>
+ * <b>IMPORTANT</b>: Some documentation (e.g. RSA examples) claims that the
+ * <code>attributes</code> field is <i>OPTIONAL</i> while <i>RFC-2986</i>
+ * implies the opposite. This implementation considers this field, by default,
+ * as <i>OPTIONAL</i>, unless the option <code>-attributes</code> is included
+ * on the command line.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-alias ALIAS</dt>
+ * <dd>Every entry, be it a <i>Key Entry</i> or a <i>Trusted
+ * Certificate</i>, in a key store is uniquely identified by a user-defined
+ * <i>Alias</i> string. Use this option to specify the <i>Alias</i> to use
+ * when referring to an entry in the key store. Unless specified otherwise,
+ * a default value of <code>mykey</code> shall be used when this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-sigalg ALGORITHM</dt>
+ * <dd>The canonical name of the digital signature algorithm to use for
+ * signing the certificate. If this option is omitted, a default value will
+ * be chosen based on the type of the private key associated with the
+ * designated <i>Alias</i>. If the private key is a <code>DSA</code> one,
+ * the value for the signature algorithm will be <code>SHA1withDSA</code>.
+ * If on the other hand the private key is an <code>RSA</code> one, then
+ * the tool will use <code>MD5withRSA</code> as the signature algorithm.
+ * <p></dd>
+ *
+ * <dt>-file FILE_NAME</dt>
+ *
+ * <dt>-keypass PASSWORD</dt>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.
+ * <p></dd>
+ *
+ * <dt>-attributes</dt>
+ * <dd>Use this option to force the tool to encode a NULL DER value in the
+ * CSR as the value of the Attributes field.</dd>
+ * </dl>
+ */
+class CertReqCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(CertReqCmd.class.getName());
+ private String _alias;
+ private String _sigAlgorithm;
+ private String _certReqFileName;
+ private String _password;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+ private boolean nullAttributes;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param alias the alias to use. */
+ public void setAlias(String alias)
+ {
+ this._alias = alias;
+ }
+
+ /**
+ * @param algorithm the canonical name of the digital signature algorithm to
+ * use.
+ */
+ public void setSigalg(String algorithm)
+ {
+ this._sigAlgorithm = algorithm;
+ }
+
+ /** @param pathName the fully qualified path name of the file to process. */
+ public void setFile(String pathName)
+ {
+ this._certReqFileName = pathName;
+ }
+
+ /** @param password the (private) key password to use. */
+ public void setKeypass(String password)
+ {
+ this._password = password;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ /**
+ * @param flag whether to use, or not, a <code>NULL</code> DER value for
+ * the certificate's Attributes field.
+ */
+ public void setAttributes(String flag)
+ {
+ this.nullAttributes = Boolean.valueOf(flag).booleanValue();
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-alias".equals(opt)) // -alias ALIAS //$NON-NLS-1$
+ _alias = args[++i];
+ else if ("-sigalg".equals(opt)) // -sigalg ALGORITHM //$NON-NLS-1$
+ _sigAlgorithm = args[++i];
+ else if ("-file".equals(opt)) // -file FILE_NAME //$NON-NLS-1$
+ _certReqFileName = args[++i];
+ else if ("-keypass".equals(opt)) // -keypass PASSWORD //$NON-NLS-1$
+ _password = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE //$NON-NLS-1$
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL //$NON-NLS-1$
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD //$NON-NLS-1$
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME //$NON-NLS-1$
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt)) //$NON-NLS-1$
+ verbose = true;
+ else if ("-attributes".equals(opt)) //$NON-NLS-1$
+ nullAttributes = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setOutputStreamParam(_certReqFileName);
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ setAliasParam(_alias);
+ setKeyPasswordNoPrompt(_password);
+// setSignatureAlgorithm(_sigAlgorithm);
+
+ log.finer("-certreq handler will use the following options:"); //$NON-NLS-1$
+ log.finer(" -alias=" + alias); //$NON-NLS-1$
+ log.finer(" -sigalg=" + _sigAlgorithm); //$NON-NLS-1$
+ log.finer(" -file=" + _certReqFileName); //$NON-NLS-1$
+ log.finer(" -keypass=" + _password); //$NON-NLS-1$
+ log.finer(" -storetype=" + storeType); //$NON-NLS-1$
+ log.finer(" -keystore=" + storeURL); //$NON-NLS-1$
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars)); //$NON-NLS-1$
+ log.finer(" -provider=" + provider); //$NON-NLS-1$
+ log.finer(" -v=" + verbose); //$NON-NLS-1$
+ log.finer(" -attributes=" + nullAttributes); //$NON-NLS-1$
+ }
+
+ void start() throws KeyStoreException, NoSuchAlgorithmException, IOException,
+ UnsupportedCallbackException, UnrecoverableKeyException,
+ InvalidKeyException, SignatureException
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ // 1. get the key entry and certificate chain associated to alias
+ Key privateKey = getAliasPrivateKey();
+ Certificate[] chain = store.getCertificateChain(alias);
+
+ // 2. get alias's DN and public key to use in the CSR
+ X509Certificate bottomCertificate = (X509Certificate) chain[0];
+ X500Principal aliasName = bottomCertificate.getIssuerX500Principal();
+ PublicKey publicKey = bottomCertificate.getPublicKey();
+
+ // 3. generate the CSR
+ setSignatureAlgorithmParam(_sigAlgorithm, privateKey);
+ byte[] derBytes = getCSR(aliasName, publicKey, (PrivateKey) privateKey);
+
+ // 4. encode it in base-64 and write it to outStream
+ String encoded = Base64.encode(derBytes, 0, derBytes.length, true);
+ PrintWriter writer = new PrintWriter(outStream, true);
+ writer.println("-----BEGIN NEW CERTIFICATE REQUEST-----"); //$NON-NLS-1$
+ writer.println(encoded);
+ writer.println("-----END NEW CERTIFICATE REQUEST-----"); //$NON-NLS-1$
+
+ if (verbose)
+ {
+ if (! systemOut)
+ System.out.println(Messages.getFormattedString("CertReqCmd.27", //$NON-NLS-1$
+ _certReqFileName));
+ System.out.println(Messages.getString("CertReqCmd.28")); //$NON-NLS-1$
+ }
+
+ writer.close();
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ // own methods --------------------------------------------------------------
+
+ /**
+ * @param aliasName
+ * @param publicKey
+ * @param privateKey
+ * @return the DER encoded Certificate Signing Request.
+ * @throws IOException
+ * @throws InvalidKeyException
+ * @throws SignatureException
+ */
+ private byte[] getCSR(X500Principal aliasName, PublicKey publicKey,
+ PrivateKey privateKey)
+ throws IOException, InvalidKeyException, SignatureException
+ {
+ DERValue derVersion = new DERValue(DER.INTEGER, BigInteger.ZERO);
+ DERValue derSubject = new DERReader(aliasName.getEncoded()).read();
+ DERValue derSubjectPKInfo = new DERReader(publicKey.getEncoded()).read();
+ byte[] b = nullAttributes ? new byte[] { 0x05, 0x00 } : new byte[0];
+ DERValue derAttributes = new DERValue(DER.CONSTRUCTED | DER.CONTEXT | 0,
+ b.length, b, null);
+ ArrayList certRequestInfo = new ArrayList(4);
+ certRequestInfo.add(derVersion);
+ certRequestInfo.add(derSubject);
+ certRequestInfo.add(derSubjectPKInfo);
+ certRequestInfo.add(derAttributes);
+ DERValue derCertRequestInfo = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ certRequestInfo);
+
+ OID sigAlgorithmID = getSignatureAlgorithmOID();
+ DERValue derSigAlgorithmID = new DERValue(DER.OBJECT_IDENTIFIER,
+ sigAlgorithmID);
+ ArrayList sigAlgorithm = new ArrayList(2);
+ sigAlgorithm.add(derSigAlgorithmID);
+ if (! sigAlgorithmID.equals(Command.SHA1_WITH_DSA)) // it's an RSA-based
+ sigAlgorithm.add(new DERValue(DER.NULL, null));
+
+ sigAlgorithm.trimToSize();
+ DERValue derSignatureAlgorithm = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ sigAlgorithm);
+
+ signatureAlgorithm.initSign(privateKey);
+ signatureAlgorithm.update(derCertRequestInfo.getEncoded());
+ byte[] sigBytes = signatureAlgorithm.sign();
+ DERValue derSignature = new DERValue(DER.BIT_STRING, new BitString(sigBytes));
+
+ ArrayList csr = new ArrayList(3);
+ csr.add(derCertRequestInfo);
+ csr.add(derSignatureAlgorithm);
+ csr.add(derSignature);
+ DERValue derCSR = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE, csr);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ DERWriter.write(baos, derCSR);
+ byte[] result = baos.toByteArray();
+
+ return result;
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/Command.java b/tools/gnu/classpath/tools/keytool/Command.java
new file mode 100644
index 000000000..a59614644
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/Command.java
@@ -0,0 +1,1147 @@
+/* Command.java -- Abstract implementation of a keytool command handler
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.classpath.SystemProperties;
+import gnu.classpath.tools.common.CallbackUtil;
+import gnu.classpath.tools.common.ProviderUtil;
+import gnu.classpath.tools.common.SecurityProviderInfo;
+import gnu.java.security.OID;
+import gnu.java.security.Registry;
+import gnu.java.security.der.BitString;
+import gnu.java.security.der.DER;
+import gnu.java.security.der.DERReader;
+import gnu.java.security.der.DERValue;
+import gnu.java.security.der.DERWriter;
+import gnu.java.security.hash.IMessageDigest;
+import gnu.java.security.hash.MD5;
+import gnu.java.security.hash.Sha160;
+import gnu.java.security.util.Util;
+import gnu.java.security.x509.X500DistinguishedName;
+import gnu.javax.security.auth.callback.ConsoleCallbackHandler;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.math.BigInteger;
+import java.net.URL;
+import java.net.URLConnection;
+import java.security.InvalidKeyException;
+import java.security.InvalidParameterException;
+import java.security.Key;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.security.interfaces.DSAKey;
+import java.security.interfaces.RSAKey;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.logging.Logger;
+import java.util.prefs.Preferences;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+/**
+ * A base class of the keytool command to facilitate implementation of concrete
+ * keytool Handlers.
+ */
+abstract class Command
+{
+ // Fields and constants -----------------------------------------------------
+
+ private static final Logger log = Logger.getLogger(Command.class.getName());
+ /** Default value for the ALIAS argument. */
+ private static final String DEFAULT_ALIAS = "mykey"; //$NON-NLS-1$
+ /** Default algorithm for key-pair generation. */
+ private static final String DEFAULT_KEY_ALGORITHM = "DSA"; //$NON-NLS-1$
+ /** Default DSA digital signature algorithm to use with DSA keys. */
+ private static final String DSA_SIGNATURE_ALGORITHM = "SHA1withDSA"; //$NON-NLS-1$
+ /** Default RSA digital signature algorithm to use with RSA keys. */
+ private static final String RSA_SIGNATURE_ALGORITHM = "MD5withRSA"; //$NON-NLS-1$
+ /** Default validity (in days) of newly generated certificates. */
+ private static final int DEFAULT_VALIDITY = 90;
+ /** OID of SHA1withDSA signature algorithm as stated in RFC-2459. */
+ protected static final OID SHA1_WITH_DSA = new OID("1.2.840.10040.4.3"); //$NON-NLS-1$
+ /** OID of MD2withRSA signature algorithm as stated in RFC-2459. */
+ private static final OID MD2_WITH_RSA = new OID("1.2.840.113549.1.1.2"); //$NON-NLS-1$
+ /** OID of MD5withRSA signature algorithm as stated in RFC-2459. */
+ private static final OID MD5_WITH_RSA = new OID("1.2.840.113549.1.1.4"); //$NON-NLS-1$
+ /** OID of SHA1withRSA signature algorithm as stated in RFC-2459. */
+ private static final OID SHA1_WITH_RSA = new OID("1.2.840.113549.1.1.5"); //$NON-NLS-1$
+ /** Number of milliseconds in one day. */
+ private static final long MILLIS_IN_A_DAY = 24 * 60 * 60 * 1000L;
+
+ /** The Alias to use. */
+ protected String alias;
+ /** The password characters protecting a Key Entry. */
+ protected char[] keyPasswordChars;
+ /** A security provider to add. */
+ protected Provider provider;
+ /** The key store type. */
+ protected String storeType;
+ /** The password characters protecting the key store. */
+ protected char[] storePasswordChars;
+ /** The key store URL. */
+ protected URL storeURL;
+ /** The input stream from the key store URL. */
+ protected InputStream storeStream;
+ /** The key store instance to use. */
+ protected KeyStore store;
+ /** The output stream the concrete handler will use. */
+ protected OutputStream outStream;
+ /** Whether we are printing to System.out. */
+ protected boolean systemOut;
+ /** The key-pair generation algorithm instance to use. */
+ protected KeyPairGenerator keyPairGenerator;
+ /** The digital signature algorithm instance to use. */
+ protected Signature signatureAlgorithm;
+ /** Validity period, in number of days, to use when generating certificates. */
+ protected int validityInDays;
+ /** The input stream the concrete handler will use. */
+ protected InputStream inStream;
+ /** Whether verbose output is required or not. */
+ protected boolean verbose;
+
+ /** MD5 hash to use when generating certificate fingerprints. */
+ private IMessageDigest md5 = new MD5();
+ /** SHA1 hash to use when generating certificate fingerprints. */
+ private IMessageDigest sha = new Sha160();
+ /** The new position of a user-defined provider if it is not already installed. */
+ private int providerNdx = -2;
+ /** The callback handler to use when needing to interact with user. */
+ private CallbackHandler handler;
+
+ // Constructor(s) -----------------------------------------------------------
+
+ // default 0-arguments constructor
+
+ // Methods ------------------------------------------------------------------
+
+ /**
+ * A public method to allow using any keytool command handler programmatically
+ * by using a JavaBeans style of parameter(s) initialization. The user is
+ * assumed to have set individually the required options through their
+ * respective setters before invoking this method.
+ * <p>
+ * If an exception is encountered during the processing of the command, this
+ * implementation attempts to release any resources that may have been
+ * allocated at the time the exception occurs, before re-throwing that
+ * exception.
+ *
+ * @throws Exception if an exception occurs during the processing of this
+ * command. For a more comprehensive list of exceptions that may
+ * occur, see the documentation of the {@link #setup()} and
+ * {@link #start()} methods.
+ */
+ public void doCommand() throws Exception
+ {
+ try
+ {
+ setup();
+ start();
+ }
+ finally
+ {
+ teardown();
+ }
+ }
+
+ /**
+ * @param flag whether to use, or not, more verbose output while processing
+ * the command.
+ */
+ public void setVerbose(String flag)
+ {
+ this.verbose = Boolean.valueOf(flag).booleanValue();
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ /**
+ * Given a potential sub-array of options for this concrete handler, starting
+ * at position <code>startIndex + 1</code>, potentially followed by other
+ * commands and their options, this method sets up this concrete command
+ * handler with its own options and returns the index of the first unprocessed
+ * argument in the array.
+ * <p>
+ * The general contract of this method is that it is invoked with the
+ * <code>startIndex</code> argument pointing to the keyword argument that
+ * uniquelly identifies the command itself; e.g. <code>-genkey</code> or
+ * <code>-list</code>, etc...
+ *
+ * @param args an array of options for this handler and possibly other
+ * commands and their options.
+ * @param startIndex the index of the first argument in <code>args</code> to
+ * process.
+ * @return the index of the first unprocessed argument in <code>args</code>.
+ */
+ abstract int processArgs(String[] args, int startIndex);
+
+ /**
+ * Initialize this concrete command handler for later invocation of the
+ * {@link #start()} or {@link #doCommand()} methods.
+ * <p>
+ * Handlers usually initialize their local variables and resources within the
+ * scope of this call.
+ *
+ * @throws IOException if an I/O related exception, such as opening an input
+ * stream, occurs during the execution of this method.
+ * @throws UnsupportedCallbackException if a requested callback handler
+ * implementation was not found, or was found but encountered an
+ * exception during its processing.
+ * @throws ClassNotFoundException if a designated security provider class was
+ * not found.
+ * @throws IllegalAccessException no 0-arguments constructor for the
+ * designated security provider class was found.
+ * @throws InstantiationException the designated security provider class is
+ * not instantiable.
+ * @throws KeyStoreException if an exception occurs during the instantiation
+ * of the KeyStore.
+ * @throws CertificateException if a certificate related exception, such as
+ * expiry, occurs during the loading of the KeyStore.
+ * @throws NoSuchAlgorithmException if no current security provider can
+ * provide a needed algorithm referenced by the KeyStore or one of
+ * its Key Entries or Certificates.
+ */
+ abstract void setup() throws Exception;
+
+ /**
+ * Do the real work this handler is supposed to do.
+ * <p>
+ * The code in this (abstract) class throws a <i>Not implemented yet</i>
+ * runtime exception. Concrete implementations MUST override this method.
+ *
+ * @throws CertificateException If no concrete implementation was found for a
+ * certificate Factory of a designated type. In this tool, the type
+ * is usually X.509 v1.
+ * @throws KeyStoreException if a keys-store related exception occurs; e.g.
+ * the key store has not been initialized.
+ * @throws IOException if an I/O related exception occurs during the process.
+ * @throws SignatureException if a digital signature related exception occurs.
+ * @throws InvalidKeyException if the genereated keys are invalid.
+ * @throws UnrecoverableKeyException if the password used to unlock a key in
+ * the key store was invalid.
+ * @throws NoSuchAlgorithmException if a concrete implementation of an
+ * algorithm used to store a Key Entry was not found at runtime.
+ * @throws UnsupportedCallbackException if a requested callback handler
+ * implementation was not found, or was found but encountered an
+ * exception during its processing.
+ */
+ void start() throws Exception
+ {
+ throw new RuntimeException("Not implemented yet"); //$NON-NLS-1$
+ }
+
+ /**
+ * Tear down the handler, releasing any resources which may have been
+ * allocated at setup time.
+ */
+ void teardown()
+ {
+ log.entering(this.getClass().getName(), "teardown"); //$NON-NLS-1$
+
+ if (storeStream != null)
+ try
+ {
+ storeStream.close();
+ }
+ catch (IOException ignored)
+ {
+ log.fine("Exception while closing key store URL stream. Ignored: " //$NON-NLS-1$
+ + ignored);
+ }
+
+ if (outStream != null)
+ {
+ try
+ {
+ outStream.flush();
+ }
+ catch (IOException ignored)
+ {
+ }
+
+ if (! systemOut)
+ try
+ {
+ outStream.close();
+ }
+ catch (IOException ignored)
+ {
+ }
+ }
+
+ if (inStream != null)
+ try
+ {
+ inStream.close();
+ }
+ catch (IOException ignored)
+ {
+ }
+
+ if (providerNdx > 0)
+ ProviderUtil.removeProvider(provider.getName());
+
+ log.exiting(this.getClass().getName(), "teardown"); //$NON-NLS-1$
+ }
+
+ // parameter setup and validation methods -----------------------------------
+
+ /**
+ * Convenience method to setup the key store given its type, its password, its
+ * location and portentially a specialized security provider.
+ *
+ * @param className the potentially null fully qualified class name of a
+ * security provider to add at runtime, if no installed provider is
+ * able to provide a key store implementation of the desired type.
+ * @param type the potentially null type of the key store to request from the
+ * key store factory.
+ * @param password the potentially null password protecting the key store.
+ * @param url the URL of the key store.
+ */
+ protected void setKeyStoreParams(String className, String type,
+ String password, String url)
+ throws IOException, UnsupportedCallbackException, KeyStoreException,
+ NoSuchAlgorithmException, CertificateException
+ {
+ setProviderClassNameParam(className);
+ setKeystoreTypeParam(type);
+ setKeystorePasswordParam(password);
+ setKeystoreURLParam(url);
+ }
+
+ /**
+ * Set a security provider class name to (install and) use for key store
+ * related operations.
+ *
+ * @param className the possibly null, fully qualified class name of a
+ * security provider to add, if it is not already installed, to the
+ * set of available providers.
+ */
+ protected void setProviderClassNameParam(String className)
+ {
+ log.finest("setProviderClassNameParam(" + className + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (className != null && className.trim().length() > 0)
+ {
+ className = className.trim();
+ SecurityProviderInfo spi = ProviderUtil.addProvider(className);
+ provider = spi.getProvider();
+ if (provider == null)
+ log.fine("Was unable to add provider from class " + className);
+
+ providerNdx = spi.getPosition();
+ }
+ }
+
+ /**
+ * Set the type of key store to initialize, load and use.
+ *
+ * @param type the possibly null type of the key store. if this argument is
+ * <code>null</code>, or is an empty string, then this method sets
+ * the type of the key store to be the default value returned from
+ * the invocation of the {@link KeyStore#getDefaultType()} method.
+ * For GNU Classpath this is <i>gkr</i> which stands for the "Gnu
+ * KeyRing" specifications.
+ */
+ protected void setKeystoreTypeParam(String type)
+ {
+ log.finest("setKeystoreTypeParam(" + type + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (type == null || type.trim().length() == 0)
+ storeType = KeyStore.getDefaultType();
+ else
+ storeType = type.trim();
+ }
+
+ /**
+ * Set the key password given a command line option argument. If no value was
+ * present on the command line then prompt the user to provide one.
+ *
+ * @param password a possibly null key password gleaned from the command line.
+ * @throws IOException if an I/O related exception occurs.
+ * @throws UnsupportedCallbackException if no concrete implementation of a
+ * password callback was found at runtime.
+ */
+ protected void setKeyPasswordParam(String password) throws IOException,
+ UnsupportedCallbackException
+ {
+ setKeyPasswordNoPrompt(password);
+ if (keyPasswordChars == null)
+ setKeyPasswordParam();
+ }
+
+ /**
+ * Set the Alias to use when associating Key Entries and Trusted Certificates
+ * in the current key store.
+ *
+ * @param name the possibly null alias to use. If this arfument is
+ * <code>null</code>, then a default value of <code>mykey</code>
+ * will be used instead.
+ */
+ protected void setAliasParam(String name)
+ {
+ alias = name == null ? DEFAULT_ALIAS : name.trim();
+ }
+
+ /**
+ * Set the key password given a command line option argument.
+ *
+ * @param password a possibly null key password gleaned from the command line.
+ */
+ protected void setKeyPasswordNoPrompt(String password)
+ {
+ if (password != null)
+ keyPasswordChars = password.toCharArray();
+ }
+
+ /**
+ * Prompt the user to provide a password to protect a Key Entry in the key
+ * store.
+ *
+ * @throws IOException if an I/O related exception occurs.
+ * @throws UnsupportedCallbackException if no concrete implementation of a
+ * password callback was found at runtime.
+ * @throws SecurityException if no password is available, even after prompting
+ * the user.
+ */
+ protected void setKeyPasswordParam() throws IOException,
+ UnsupportedCallbackException
+ {
+ String prompt = Messages.getFormattedString("Command.21", alias); //$NON-NLS-1$
+ PasswordCallback pcb = new PasswordCallback(prompt, false);
+ getCallbackHandler().handle(new Callback[] { pcb });
+ keyPasswordChars = pcb.getPassword();
+ pcb.clearPassword();
+ if (keyPasswordChars == null)
+ throw new SecurityException(Messages.getString("Command.23")); //$NON-NLS-1$
+ }
+
+ protected void setKeystorePasswordParam(String password) throws IOException,
+ UnsupportedCallbackException
+ {
+ if (password != null)
+ storePasswordChars = password.toCharArray();
+ else // ask the user to provide one
+ {
+ String prompt = Messages.getString("Command.24"); //$NON-NLS-1$
+ PasswordCallback pcb = new PasswordCallback(prompt, false);
+ getCallbackHandler().handle(new Callback[] { pcb });
+ storePasswordChars = pcb.getPassword();
+ pcb.clearPassword();
+ }
+ log.finest("storePasswordChars = [" + String.valueOf(storePasswordChars)+ "]"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * Set the key store URL to use.
+ *
+ * @param url
+ * @throws IOException
+ * @throws KeyStoreException
+ * @throws UnsupportedCallbackException
+ * @throws NoSuchAlgorithmException
+ * @throws CertificateException
+ */
+ protected void setKeystoreURLParam(String url) throws IOException,
+ KeyStoreException, UnsupportedCallbackException, NoSuchAlgorithmException,
+ CertificateException
+ {
+ log.finest("setKeystoreURLParam(" + url + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (url == null || url.trim().length() == 0)
+ {
+ String userHome = SystemProperties.getProperty("user.home"); //$NON-NLS-1$
+ if (userHome == null || userHome.trim().length() == 0)
+ throw new InvalidParameterException(Messages.getString("Command.36")); //$NON-NLS-1$
+
+ url = userHome.trim() + "/.keystore"; //$NON-NLS-1$
+ // if it does not exist create it
+ new File(url).createNewFile();
+ url = "file:" + url; //$NON-NLS-1$
+ }
+ else
+ {
+ url = url.trim();
+ if (url.indexOf(":") == -1) // if it does not exist create it //$NON-NLS-1$
+ new File(url).createNewFile();
+
+ url = "file:" + url; //$NON-NLS-1$
+ }
+
+ boolean newKeyStore = false;
+ storeURL = new URL(url);
+ storeStream = storeURL.openStream();
+ if (storeStream.available() == 0)
+ {
+ log.fine("Store is empty. Will use <null> when loading, to create it"); //$NON-NLS-1$
+ newKeyStore = true;
+ }
+
+ try
+ {
+ store = KeyStore.getInstance(storeType);
+ }
+ catch (KeyStoreException x)
+ {
+ if (provider != null)
+ throw x;
+
+ log.fine("Exception while getting key store with default provider(s)." //$NON-NLS-1$
+ + " Will prompt user for another provider and continue"); //$NON-NLS-1$
+ String prompt = Messages.getString("Command.40"); //$NON-NLS-1$
+ NameCallback ncb = new NameCallback(prompt);
+ getCallbackHandler().handle(new Callback[] { ncb });
+ String className = ncb.getName();
+ setProviderClassNameParam(className); // we may have a Provider
+ if (provider == null)
+ {
+ x.fillInStackTrace();
+ throw x;
+ }
+ // try again
+ store = KeyStore.getInstance(storeType, provider);
+ }
+
+ // now we have a KeyStore instance. load it
+ // KeyStore public API claims: "...In order to create an empty keystore,
+ // you pass null as the InputStream argument to the load method.
+ if (newKeyStore)
+ store.load(null, storePasswordChars);
+ else
+ store.load(storeStream, storePasswordChars);
+
+ // close the stream
+ try
+ {
+ storeStream.close();
+ storeStream = null;
+ }
+ catch (IOException x)
+ {
+ log.fine("Exception while closing the key store input stream: " + x //$NON-NLS-1$
+ + ". Ignore"); //$NON-NLS-1$
+ }
+ }
+
+ protected void setOutputStreamParam(String fileName) throws SecurityException,
+ IOException
+ {
+ if (fileName == null || fileName.trim().length() == 0)
+ {
+ outStream = System.out;
+ systemOut = true;
+ }
+ else
+ {
+ fileName = fileName.trim();
+ File outFile = new File(fileName);
+ if (! outFile.exists())
+ {
+ boolean ok = outFile.createNewFile();
+ if (!ok)
+ throw new InvalidParameterException(Messages.getFormattedString("Command.19", //$NON-NLS-1$
+ fileName));
+ }
+ else
+ {
+ if (! outFile.isFile())
+ throw new InvalidParameterException(Messages.getFormattedString("Command.42", //$NON-NLS-1$
+ fileName));
+ if (! outFile.canWrite())
+ throw new InvalidParameterException(Messages.getFormattedString("Command.44", //$NON-NLS-1$
+ fileName));
+ }
+ outStream = new FileOutputStream(outFile);
+ }
+ }
+
+ protected void setInputStreamParam(String fileName)
+ throws FileNotFoundException
+ {
+ if (fileName == null || fileName.trim().length() == 0)
+ inStream = System.in;
+ else
+ {
+ fileName = fileName.trim();
+ File inFile = new File(fileName);
+ if (! (inFile.exists() && inFile.isFile() && inFile.canRead()))
+ throw new InvalidParameterException(Messages.getFormattedString("Command.46", //$NON-NLS-1$
+ fileName));
+ inStream = new FileInputStream(inFile);
+ }
+ }
+
+ /**
+ * Set both the key-pair generation algorithm, and the digital signature
+ * algorithm instances to use when generating new entries.
+ *
+ * @param kpAlg the possibly null name of a key-pair generator algorithm.
+ * if this argument is <code>null</code> or is an empty string, the
+ * "DSS" algorithm will be used.
+ * @param sigAlg the possibly null name of a digital signature algorithm.
+ * If this argument is <code>null</code> or is an empty string, this
+ * method uses the "SHA1withDSA" (Digital Signature Standard, a.k.a.
+ * DSA, with the Secure Hash Algorithm function) as the default
+ * algorithm if, and only if, the key-pair generation algorithm ends
+ * up being "DSS"; otherwise, if the key-pair generation algorithm
+ * was "RSA", then the "MD5withRSA" signature algorithm will be used.
+ * If the key-pair generation algorithm is neither "DSS" (or its
+ * alias "DSA"), nor is it "RSA", then an exception is thrown.
+ * @throws NoSuchAlgorithmException if no concrete implementation of the
+ * designated algorithm is available.
+ */
+ protected void setAlgorithmParams(String kpAlg, String sigAlg)
+ throws NoSuchAlgorithmException
+ {
+ if (kpAlg == null || kpAlg.trim().length() == 0)
+ kpAlg = DEFAULT_KEY_ALGORITHM;
+ else
+ kpAlg = kpAlg.trim().toLowerCase();
+
+ keyPairGenerator = KeyPairGenerator.getInstance(kpAlg);
+
+ if (sigAlg == null || sigAlg.trim().length() == 0)
+ if (kpAlg.equalsIgnoreCase(Registry.DSS_KPG)
+ || kpAlg.equalsIgnoreCase(Registry.DSA_KPG))
+ sigAlg = DSA_SIGNATURE_ALGORITHM;
+ else if (kpAlg.equalsIgnoreCase(Registry.RSA_KPG))
+ sigAlg = RSA_SIGNATURE_ALGORITHM;
+ else
+ throw new IllegalArgumentException(
+ Messages.getFormattedString("Command.20", //$NON-NLS-1$
+ new String[] { sigAlg, kpAlg }));
+ else
+ sigAlg = sigAlg.trim().toLowerCase();
+
+ signatureAlgorithm = Signature.getInstance(sigAlg);
+ }
+
+ /**
+ * Set the signature algorithm to use when digitally signing private keys,
+ * certificates, etc...
+ * <p>
+ * If the designated algorithm name is <code>null</code> or is an empty
+ * string, this method checks the private key (the second argument) and based
+ * on its type decides which algorithm to use. The keytool public
+ * specification states that if the private key is a DSA key, then the
+ * signature algorithm will be <code>SHA1withDSA</code>, otherwise if it is
+ * an RSA private key, then the signature algorithm will be
+ * <code>MD5withRSA</code>. If the private key is neither a private DSA nor
+ * a private RSA key, then this method throws an
+ * {@link IllegalArgumentException}.
+ *
+ * @param algorithm the possibly null name of a digital signature algorithm.
+ * @param privateKey an instance of a private key to use as a fal-back option
+ * when <code>algorithm</code> is invalid.
+ * @throws NoSuchAlgorithmException if no concrete implementation of the
+ * designated, or default, signature algorithm is available.
+ */
+ protected void setSignatureAlgorithmParam(String algorithm, Key privateKey)
+ throws NoSuchAlgorithmException
+ {
+ if (algorithm == null || algorithm.trim().length() == 0)
+ if (privateKey instanceof DSAKey)
+ algorithm = DSA_SIGNATURE_ALGORITHM;
+ else if (privateKey instanceof RSAKey)
+ algorithm = RSA_SIGNATURE_ALGORITHM;
+ else
+ throw new InvalidParameterException(Messages.getString("Command.48")); //$NON-NLS-1$
+ else
+ algorithm = algorithm.trim();
+
+ signatureAlgorithm = Signature.getInstance(algorithm);
+ }
+
+ /**
+ * Set the validity period, in number of days, to use when issuing new
+ * certificates.
+ *
+ * @param days the number of days, as a string, the generated certificate will
+ * be valid for, starting from today's date. if this argument is
+ * <code>null</code>, a default value of <code>90</code> days
+ * will be used.
+ * @throws NumberFormatException if the designated string is not a decimal
+ * integer.
+ * @throws InvalidParameterException if the integer value of the non-null
+ * string is not greater than zero.
+ */
+ protected void setValidityParam(String days)
+ {
+ if (days == null || days.trim().length() == 0)
+ validityInDays = DEFAULT_VALIDITY;
+ else
+ {
+ days = days.trim();
+ validityInDays = Integer.parseInt(days);
+ if (validityInDays < 1)
+ throw new InvalidParameterException(Messages.getString("Command.51")); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * RFC-2459 (http://rfc.net/rfc2459.html) fully describes the structure and
+ * semantics of X.509 certificates. The ASN.1 structures below are gleaned
+ * from that reference.
+ *
+ * <pre>
+ * Certificate ::= SEQUENCE {
+ * tbsCertificate TBSCertificate,
+ * signatureAlgorithm AlgorithmIdentifier,
+ * signatureValue BIT STRING
+ * }
+ *
+ * TBSCertificate ::= SEQUENCE {
+ * version [0] EXPLICIT Version DEFAULT v1,
+ * serialNumber CertificateSerialNumber,
+ * signature AlgorithmIdentifier,
+ * issuer Name,
+ * validity Validity,
+ * subject Name,
+ * subjectPublicKeyInfo SubjectPublicKeyInfo
+ * }
+ *
+ * Version ::= INTEGER { v1(0), v2(1), v3(2) }
+ *
+ * CertificateSerialNumber ::= INTEGER
+ *
+ * Validity ::= SEQUENCE {
+ * notBefore Time,
+ * notAfter Time
+ * }
+ *
+ * Time ::= CHOICE {
+ * utcTime UTCTime,
+ * generalTime GeneralizedTime
+ * }
+ *
+ * UniqueIdentifier ::= BIT STRING
+ *
+ * SubjectPublicKeyInfo ::= SEQUENCE {
+ * algorithm AlgorithmIdentifier,
+ * subjectPublicKey BIT STRING
+ * }
+ * </pre>
+ *
+ * @param distinguishedName the X.500 Distinguished Name to use as both the
+ * Issuer and Subject of the self-signed certificate to generate.
+ * @param publicKey the public key of the issuer/subject.
+ * @param privateKey the private key of the issuer/signer.
+ * @return the DER encoded form of a self-signed X.509 v1 certificate.
+ * @throws IOException If an I/O related exception occurs during the process.
+ * @throws SignatureException If a digital signature related exception occurs.
+ * @throws InvalidKeyException if the designated private key is invalid.
+ * @throws InvalidParameterException if the concrete signature algorithm does
+ * not know its name, no OID is known/supported for that name, or we
+ * were unable to match the name to a known string for which we can
+ * use a standard OID.
+ */
+ protected byte[] getSelfSignedCertificate(X500DistinguishedName distinguishedName,
+ PublicKey publicKey,
+ PrivateKey privateKey)
+ throws IOException, SignatureException, InvalidKeyException
+ {
+ log.entering(this.getClass().getName(), "getSelfSignedCertificate", //$NON-NLS-1$
+ new Object[] { distinguishedName, publicKey, privateKey });
+
+ byte[] versionBytes = new DERValue(DER.INTEGER, BigInteger.ZERO).getEncoded();
+ DERValue derVersion = new DERValue(DER.CONSTRUCTED | DER.CONTEXT | 0,
+ versionBytes.length, versionBytes, null);
+
+ // NOTE (rsn): the next 3 lines should be atomic but they're not.
+ Preferences prefs = Preferences.systemNodeForPackage(this.getClass());
+ int lastSerialNumber = prefs.getInt(Main.LAST_SERIAL_NUMBER, 0) + 1;
+ prefs.putInt(Main.LAST_SERIAL_NUMBER, lastSerialNumber);
+ DERValue derSerialNumber = new DERValue(DER.INTEGER,
+ BigInteger.valueOf(lastSerialNumber));
+
+ OID signatureID = getSignatureAlgorithmOID();
+ DERValue derSignatureID = new DERValue(DER.OBJECT_IDENTIFIER, signatureID);
+ ArrayList signature = new ArrayList(1);
+ signature.add(derSignatureID);
+ // rfc-2459 states the following:
+ //
+ // for the DSA signature:
+ // ...Where the id-dsa-with-sha1 algorithm identifier appears as the
+ // algorithm field in an AlgorithmIdentifier, the encoding shall omit
+ // the parameters field. That is, the AlgorithmIdentifier shall be a
+ // SEQUENCE of one component - the OBJECT IDENTIFIER id-dsa-with-sha1.
+ //
+ // for RSA signatures:
+ // ...When any of these three OIDs (i.e. xxxWithRSAEncryption) appears
+ // within the ASN.1 type AlgorithmIdentifier, the parameters component of
+ // that type shall be the ASN.1 type NULL.
+ if (! signatureID.equals(SHA1_WITH_DSA))
+ signature.add(new DERValue(DER.NULL, null));
+
+ DERValue derSignature = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ signature);
+
+ DERValue derIssuer = new DERReader(distinguishedName.getDer()).read();
+
+ long notBefore = System.currentTimeMillis();
+ long notAfter = notBefore + validityInDays * MILLIS_IN_A_DAY;
+
+ ArrayList validity = new ArrayList(2);
+ validity.add(new DERValue(DER.UTC_TIME, new Date(notBefore)));
+ validity.add(new DERValue(DER.UTC_TIME, new Date(notAfter)));
+ DERValue derValidity = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ validity);
+
+ // for a self-signed certificate subject and issuer are identical
+ DERValue derSubject = derIssuer;
+
+ DERValue derSubjectPublicKeyInfo = new DERReader(publicKey.getEncoded()).read();
+
+ ArrayList tbsCertificate = new ArrayList(7);
+ tbsCertificate.add(derVersion);
+ tbsCertificate.add(derSerialNumber);
+ tbsCertificate.add(derSignature);
+ tbsCertificate.add(derIssuer);
+ tbsCertificate.add(derValidity);
+ tbsCertificate.add(derSubject);
+ tbsCertificate.add(derSubjectPublicKeyInfo);
+ DERValue derTBSCertificate = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ tbsCertificate);
+
+ // The 'signature' field MUST contain the same algorithm identifier as the
+ // 'signatureAlgorithm' field in the sequence Certificate.
+ DERValue derSignatureAlgorithm = derSignature;
+
+ signatureAlgorithm.initSign(privateKey);
+ signatureAlgorithm.update(derTBSCertificate.getEncoded());
+ byte[] sigBytes = signatureAlgorithm.sign();
+ DERValue derSignatureValue = new DERValue(DER.BIT_STRING,
+ new BitString(sigBytes));
+
+ ArrayList certificate = new ArrayList(3);
+ certificate.add(derTBSCertificate);
+ certificate.add(derSignatureAlgorithm);
+ certificate.add(derSignatureValue);
+ DERValue derCertificate = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
+ certificate);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ DERWriter.write(baos, derCertificate);
+ byte[] result = baos.toByteArray();
+
+ log.exiting(this.getClass().getName(), "getSelfSignedCertificate"); //$NON-NLS-1$
+ return result;
+ }
+
+ /**
+ * This method attempts to find, and return, an OID representing the digital
+ * signature algorithm used to sign the certificate. The OIDs returned are
+ * those described in RFC-2459. They are listed here for the sake of
+ * completness.
+ *
+ * <pre>
+ * id-dsa-with-sha1 OBJECT IDENTIFIER ::= {
+ * iso(1) member-body(2) us(840) x9-57 (10040) x9cm(4) 3
+ * }
+ *
+ * md2WithRSAEncryption OBJECT IDENTIFIER ::= {
+ * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) 2
+ * }
+ *
+ * md5WithRSAEncryption OBJECT IDENTIFIER ::= {
+ * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) 4
+ * }
+ *
+ * sha-1WithRSAEncryption OBJECT IDENTIFIER ::= {
+ * iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) 5
+ * }
+ * </pre>
+ *
+ * <b>IMPORTANT</b>: This method checks the signature algorithm name against
+ * (a) The GNU algorithm implementation's name, and (b) publicly referenced
+ * names of the same algorithm. In other words this search is not
+ * comprehensive and may fail for uncommon names of the same algorithms.
+ *
+ * @return the OID of the signature algorithm in use.
+ * @throws InvalidParameterException if the concrete signature algorithm does
+ * not know its name, no OID is known/supported for that name, or we
+ * were unable to match the name to a known string for which we can
+ * return an OID.
+ */
+ protected OID getSignatureAlgorithmOID()
+ {
+ String algorithm = signatureAlgorithm.getAlgorithm();
+ // if we already have a non-null signature then the name was valid. the
+ // only case where algorithm is invalid would be if the implementation is
+ // flawed. check anyway
+ if (algorithm == null || algorithm.trim().length() == 0)
+ throw new InvalidParameterException(Messages.getString("Command.52")); //$NON-NLS-1$
+
+ algorithm = algorithm.trim();
+ if (algorithm.equalsIgnoreCase(Registry.DSS_SIG)
+ || algorithm.equalsIgnoreCase("SHA1withDSA")) //$NON-NLS-1$
+ return SHA1_WITH_DSA;
+
+ if (algorithm.equalsIgnoreCase(Registry.RSA_PKCS1_V1_5_SIG + "-" //$NON-NLS-1$
+ + Registry.MD2_HASH)
+ || algorithm.equalsIgnoreCase("MD2withRSA")) //$NON-NLS-1$
+ return MD2_WITH_RSA;
+
+ if (algorithm.equalsIgnoreCase(Registry.RSA_PKCS1_V1_5_SIG + "-" //$NON-NLS-1$
+ + Registry.MD5_HASH)
+ || algorithm.equalsIgnoreCase("MD5withRSA") //$NON-NLS-1$
+ || algorithm.equalsIgnoreCase("rsa")) //$NON-NLS-1$
+ return MD5_WITH_RSA;
+
+ if (algorithm.equalsIgnoreCase(Registry.RSA_PKCS1_V1_5_SIG + "-" //$NON-NLS-1$
+ + Registry.SHA160_HASH)
+ || algorithm.equalsIgnoreCase("SHA1withRSA")) //$NON-NLS-1$
+ return SHA1_WITH_RSA;
+
+ throw new InvalidParameterException(Messages.getFormattedString("Command.60", //$NON-NLS-1$
+ algorithm));
+ }
+
+ /**
+ * Saves the key store using the designated password. This operation is called
+ * by handlers if/when the key store password has changed, or amendements have
+ * been made to the contents of the store; e.g. addition of a new Key Entry or
+ * a Trusted Certificate.
+ *
+ * @param password the password protecting the key store.
+ * @throws IOException if an I/O related exception occurs during the process.
+ * @throws CertificateException if any of the certificates in the current key
+ * store could not be persisted.
+ * @throws NoSuchAlgorithmException if a required data integrity algorithm
+ * implementation was not found.
+ * @throws KeyStoreException if the key store has not been loaded previously.
+ */
+ protected void saveKeyStore(char[] password) throws IOException,
+ KeyStoreException, NoSuchAlgorithmException, CertificateException
+ {
+ log.entering(this.getClass().getName(), "saveKeyStore", String.valueOf(password)); //$NON-NLS-1$
+
+ URLConnection con = storeURL.openConnection();
+ con.setDoOutput(true);
+ con.setUseCaches(false);
+ OutputStream out = con.getOutputStream();
+ if (verbose)
+ System.out.println(Messages.getFormattedString("Command.63", storeURL.getPath())); //$NON-NLS-1$
+
+ store.store(out, password);
+ out.flush();
+ out.close();
+
+ log.exiting(this.getClass().getName(), "saveKeyStore"); //$NON-NLS-1$
+ }
+
+ /**
+ * Convenience method. Calls the method with the same name passing it the
+ * same password characters used to initially load the key-store.
+ *
+ * @throws IOException if an I/O related exception occurs during the process.
+ * @throws KeyStoreException if the key store has not been loaded previously.
+ * @throws NoSuchAlgorithmException if a required data integrity algorithm
+ * implementation was not found.
+ * @throws CertificateException if any of the certificates in the current key
+ * store could not be persisted.
+ */
+ protected void saveKeyStore() throws IOException, KeyStoreException,
+ NoSuchAlgorithmException, CertificateException
+ {
+ saveKeyStore(storePasswordChars);
+ }
+
+ /**
+ * Prints a human-readable form of the designated certificate to a designated
+ * {@link PrintWriter}.
+ *
+ * @param certificate the certificate to process.
+ * @param writer where to print it.
+ * @throws CertificateEncodingException if an exception occurs while obtaining
+ * the DER encoded form <code>certificate</code>.
+ */
+ protected void printVerbose(Certificate certificate, PrintWriter writer)
+ throws CertificateEncodingException
+ {
+ X509Certificate x509 = (X509Certificate) certificate;
+ writer.println(Messages.getFormattedString("Command.66", x509.getSubjectDN())); //$NON-NLS-1$
+ writer.println(Messages.getFormattedString("Command.67", x509.getIssuerDN())); //$NON-NLS-1$
+ writer.println(Messages.getFormattedString("Command.68", x509.getSerialNumber())); //$NON-NLS-1$
+ writer.println(Messages.getFormattedString("Command.69", x509.getNotBefore())); //$NON-NLS-1$
+ writer.println(Messages.getFormattedString("Command.70", x509.getNotAfter())); //$NON-NLS-1$
+ writer.println(Messages.getString("Command.71")); //$NON-NLS-1$
+ byte[] derBytes = certificate.getEncoded();
+ writer.println(Messages.getFormattedString("Command.72", digest(md5, derBytes))); //$NON-NLS-1$
+ writer.println(Messages.getFormattedString("Command.73", digest(sha, derBytes))); //$NON-NLS-1$
+ }
+
+ /**
+ * Convenience method. Prints a human-readable form of the designated
+ * certificate to <code>System.out</code>.
+ *
+ * @param certificate the certificate to process.
+ * @throws CertificateEncodingException if an exception occurs while obtaining
+ * the DER encoded form <code>certificate</code>.
+ */
+ protected void printVerbose(Certificate certificate)
+ throws CertificateEncodingException
+ {
+ printVerbose(certificate, new PrintWriter(System.out, true));
+ }
+
+ /**
+ * Digest the designated contents with MD5 and return a string representation
+ * suitable for use as a fingerprint; i.e. sequence of hexadecimal pairs of
+ * characters separated by a colon.
+ *
+ * @param contents the non-null contents to digest.
+ * @return a sequence of hexadecimal pairs of characters separated by colons.
+ */
+ protected String digestWithMD5(byte[] contents)
+ {
+ return digest(md5, contents);
+ }
+
+ private String digest(IMessageDigest hash, byte[] encoded)
+ {
+ hash.update(encoded);
+ byte[] b = hash.digest();
+ StringBuilder sb = new StringBuilder().append(Util.toString(b, 0, 1));
+ for (int i = 1; i < b.length; i++)
+ sb.append(":").append(Util.toString(b, i, 1)); //$NON-NLS-1$
+
+ String result = sb.toString();
+ return result;
+ }
+
+ /**
+ * Ensure that the currently set Alias is contained in the currently set key
+ * store; otherwise throw an exception.
+ *
+ * @throws KeyStoreException if the keystore has not been loaded.
+ * @throws IllegalArgumentException if the currently set alias is not known to
+ * the currently set key store.
+ */
+ protected void ensureStoreContainsAlias() throws KeyStoreException
+ {
+ if (! store.containsAlias(alias))
+ throw new IllegalArgumentException(Messages.getFormattedString("Command.75", //$NON-NLS-1$
+ alias));
+ }
+
+ /**
+ * Ensure that the currently set Alias is associated with a Key Entry in the
+ * currently set key store; otherwise throw an exception.
+ *
+ * @throws KeyStoreException if the keystore has not been loaded.
+ * @throws SecurityException if the currently set alias is not a Key Entry in
+ * the currently set key store.
+ */
+ protected void ensureAliasIsKeyEntry() throws KeyStoreException
+ {
+ if (! store.isKeyEntry(alias))
+ throw new SecurityException(Messages.getFormattedString("Command.77", //$NON-NLS-1$
+ alias));
+ }
+
+ protected Key getAliasPrivateKey() throws KeyStoreException,
+ NoSuchAlgorithmException, IOException, UnsupportedCallbackException,
+ UnrecoverableKeyException
+ {
+ ensureAliasIsKeyEntry();
+ Key result;
+ if (keyPasswordChars == null)
+ try
+ {
+ result = store.getKey(alias, storePasswordChars);
+ // it worked. assign to keyPasswordChars for later use
+ keyPasswordChars = storePasswordChars;
+ }
+ catch (UnrecoverableKeyException x)
+ {
+ // prompt the user to provide one
+ setKeyPasswordParam();
+ result = store.getKey(alias, keyPasswordChars);
+ }
+ else
+ result = store.getKey(alias, keyPasswordChars);
+
+ return result;
+ }
+
+ /**
+ * Return a CallbackHandler which uses the Console (System.in and System.out)
+ * for interacting with the user.
+ * <p>
+ * This method first finds all currently installed security providers capable
+ * of providing such service and then in turn attempts to instantiate the
+ * handler from those providers. As soon as one provider returns a non-null
+ * instance of the callback handler, the search stops and that instance is
+ * set to be used from now on.
+ * <p>
+ * If no installed providers were found, this method falls back on the GNU
+ * provider, by-passing the Security search mechanism. The default console
+ * callback handler implementation is {@link ConsoleCallbackHandler}.
+ *
+ * @return a console-based {@link CallbackHandler}.
+ */
+ protected CallbackHandler getCallbackHandler()
+ {
+ if (handler == null)
+ handler = CallbackUtil.getConsoleHandler();
+
+ return handler;
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/DeleteCmd.java b/tools/gnu/classpath/tools/keytool/DeleteCmd.java
new file mode 100644
index 000000000..968af50f8
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/DeleteCmd.java
@@ -0,0 +1,235 @@
+/* DeleteCmd.java -- The delete command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import java.io.IOException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+/**
+ * The <b>-delete</b> keytool command handler is used to delete from the key
+ * store the entry associated with a designated alias.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-alias ALIAS</dt>
+ * <dd>Every entry, be it a <i>Key Entry</i> or a <i>Trusted
+ * Certificate</i>, in a key store is uniquely identified by a user-defined
+ * <i>Alias</i> string. Use this option to specify the <i>Alias</i> to use
+ * when referring to an entry in the key store. Unless specified otherwise,
+ * a default value of <code>mykey</code> shall be used when this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.</dd>
+ * </dl>
+ */
+class DeleteCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(DeleteCmd.class.getName());
+ private String _alias;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param alias the alias to use. */
+ public void setAlias(String alias)
+ {
+ this._alias = alias;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-alias".equals(opt)) // -alias ALIAS //$NON-NLS-1$
+ _alias = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE //$NON-NLS-1$
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL //$NON-NLS-1$
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD //$NON-NLS-1$
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME //$NON-NLS-1$
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt)) //$NON-NLS-1$
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ setTheAlias(_alias);
+
+ log.finer("-delete handler will use the following options:"); //$NON-NLS-1$
+ log.finer(" -alias=" + alias); //$NON-NLS-1$
+ log.finer(" -storetype=" + storeType); //$NON-NLS-1$
+ log.finer(" -keystore=" + storeURL); //$NON-NLS-1$
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars)); //$NON-NLS-1$
+ log.finer(" -provider=" + provider); //$NON-NLS-1$
+ log.finer(" -v=" + verbose); //$NON-NLS-1$
+ }
+
+ void start() throws KeyStoreException, NoSuchAlgorithmException,
+ CertificateException, IOException
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ ensureStoreContainsAlias();
+ store.deleteEntry(alias);
+ saveKeyStore();
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ // own methods --------------------------------------------------------------
+
+ /**
+ * Set the alias to delete from the key store.
+ * <p>
+ * Unlike in other keytool handlers, the default value (<i>mykey</i>) for the
+ * Alias is not used. Instead, if an alias was not found on the command line,
+ * the user is prompted to enter one.
+ *
+ * @param anAlias a possibly null Alias gleaned from the command line.
+ * @throws IOException if an I/O related exception occurs during the process.
+ * @throws UnsupportedCallbackException if no implementation of a password
+ * callback handler was found.
+ */
+ private void setTheAlias(String anAlias) throws IOException,
+ UnsupportedCallbackException
+ {
+ if (anAlias == null || anAlias.trim().length() == 0)
+ {
+ String prompt = Messages.getString("DeleteCmd.19"); //$NON-NLS-1$
+ NameCallback ncb = new NameCallback(prompt);
+ getCallbackHandler().handle(new Callback[] { ncb });
+ anAlias = ncb.getName();
+ if (anAlias == null || anAlias.trim().length() == 0)
+ throw new SecurityException(Messages.getString("DeleteCmd.20")); //$NON-NLS-1$
+ }
+ alias = anAlias.trim();
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/ExportCmd.java b/tools/gnu/classpath/tools/keytool/ExportCmd.java
new file mode 100644
index 000000000..c1c0d4f83
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/ExportCmd.java
@@ -0,0 +1,266 @@
+/* ExportCmd.java -- The export command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.java.security.util.Base64;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.security.KeyStoreException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.util.logging.Logger;
+
+/**
+ * The <b>-export</b> keytool command handler is used to read the certificate
+ * associated with a designated alias from the key store, and write it to a
+ * designated file.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-alias ALIAS</dt>
+ * <dd>Every entry, be it a <i>Key Entry</i> or a <i>Trusted
+ * Certificate</i>, in a key store is uniquely identified by a user-defined
+ * <i>Alias</i> string. Use this option to specify the <i>Alias</i> to use
+ * when referring to an entry in the key store. Unless specified otherwise,
+ * a default value of <code>mykey</code> shall be used when this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-file FILE_NAME</dt>
+ * <dd>The fully qualified path of the file where the certificate will be
+ * exported to. If omitted, STDOUT will be used instead.
+ * <p></dd>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-rfc</dt>
+ * <dd>Use RFC-1421 specifications when encoding the output.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Output the certificate in binary DER encoding. This is the default
+ * output format of the command if neither <code>-rfc</code> nor
+ * <code>-v</code> options were detected on the command line. If both this
+ * option and the <code>-rfc</code> option are detected on the command
+ * line, the tool will opt for the RFC-1421 style encoding.</dd>
+ * </dl>
+ */
+class ExportCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(ExportCmd.class.getName());
+ private String _alias;
+ private String _certFileName;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+ private boolean rfc;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param alias the alias to use. */
+ public void setAlias(String alias)
+ {
+ this._alias = alias;
+ }
+
+ /** @param pathName the fully qualified path name of the file to process. */
+ public void setFile(String pathName)
+ {
+ this._certFileName = pathName;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ /**
+ * @param flag whether to use, or not, RFC-1421 format when exporting the
+ * certificate(s).
+ */
+ public void setRfc(String flag)
+ {
+ this.rfc = Boolean.valueOf(flag).booleanValue();
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt);
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-alias".equals(opt)) // -alias ALIAS
+ _alias = args[++i];
+ else if ("-file".equals(opt)) // -file FILE_NAME
+ _certFileName = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME
+ _providerClassName = args[++i];
+ else if ("-rfc".equals(opt))
+ rfc = true;
+ else if ("-v".equals(opt))
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setOutputStreamParam(_certFileName);
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ setAliasParam(_alias);
+
+ log.finer("-export handler will use the following options:");
+ log.finer(" -alias=" + alias);
+ log.finer(" -file=" + _certFileName);
+ log.finer(" -storetype=" + storeType);
+ log.finer(" -keystore=" + storeURL);
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars));
+ log.finer(" -provider=" + provider);
+ log.finer(" -rfc=" + rfc);
+ log.finer(" -v=" + verbose);
+ }
+
+ void start() throws KeyStoreException, CertificateEncodingException,
+ IOException
+ {
+ log.entering(this.getClass().getName(), "start");
+
+ ensureStoreContainsAlias();
+ Certificate certificate;
+ if (store.isCertificateEntry(alias))
+ {
+ log.fine("Alias [" + alias + "] is a trusted certificate");
+ certificate = store.getCertificate(alias);
+ }
+ else
+ {
+ log.fine("Alias [" + alias + "] is a key entry");
+ Certificate[] chain = store.getCertificateChain(alias);
+ certificate = chain[0];
+ }
+
+ byte[] derBytes = certificate.getEncoded();
+ if (rfc)
+ {
+ String encoded = Base64.encode(derBytes, 0, derBytes.length, true);
+ PrintWriter pw = new PrintWriter(outStream, true);
+ pw.println("-----BEGIN CERTIFICATE-----");
+ pw.println(encoded);
+ pw.println("-----END CERTIFICATE-----");
+ }
+ else
+ outStream.write(derBytes);
+
+ // stream is closed in Command.teardown()
+ log.exiting(this.getClass().getName(), "start");
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/GenKeyCmd.java b/tools/gnu/classpath/tools/keytool/GenKeyCmd.java
new file mode 100644
index 000000000..2d92134c2
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/GenKeyCmd.java
@@ -0,0 +1,511 @@
+/* GenKeyCmd.java -- The genkey command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.java.security.util.Util;
+import gnu.java.security.x509.X500DistinguishedName;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SignatureException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.TextInputCallback;
+import javax.security.auth.callback.TextOutputCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+/**
+ * The <b>-genkey</b> keytool command handler is used to generate a key pair (a
+ * public, and associated private keys). It then generates a self-signed X509 v1
+ * certificate (authenticating the public key) and stores this certificate and
+ * the private key in the key store associating both to a designated alias.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-alias ALIAS</dt>
+ * <dd>Every entry, be it a <i>Key Entry</i> or a <i>Trusted
+ * Certificate</i>, in a key store is uniquely identified by a user-defined
+ * <i>Alias</i> string. Use this option to specify the <i>Alias</i> to use
+ * when referring to an entry in the key store. Unless specified otherwise,
+ * a default value of <code>mykey</code> shall be used when this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-keyalg ALGORITHM</dt>
+ * <dd>Use this option to specify the canonical name of the key-pair
+ * generation algorithm. The default value for this option is
+ * <code>DSS</code> (a synonym for the Digital Signature Algorithm also
+ * known as <code>DSA</code>).
+ * <p></dd>
+ *
+ * <dt>-keysize KEY_SIZE</dt>
+ * <dd>Use this option to specify the number of bits of the shared modulus
+ * (for both the public and private keys) to use when generating new keys.
+ * A default value of <code>1024</code> will be used if this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-sigalg ALGORITHM</dt>
+ * <dd>The canonical name of the digital signature algorithm to use for
+ * signing certificates. If this option is omitted, a default value will be
+ * chosen based on the type of the key-pair; i.e. the algorithm that ends
+ * up being used by the <code>-keyalg</code> option. If the key-pair
+ * generation algorithm is <code>DSA</code>, the value for the signature
+ * algorithm will be <code>SHA1withDSA</code>. If on the other hand the
+ * key-pair generation algorithm is <code>RSA</code>, then the tool will
+ * use <code>MD5withRSA</code> as the signature algorithm.
+ * <p></dd>
+ *
+ * <dt>-dname NAME</dt>
+ * <dd>This a mandatory value for this command. If this option is omitted
+ * the tool will prompt you to enter a <i>Distinguished Name</i> to use as
+ * both the <i>Owner</i> and <i>Issuer</i> of the generated self-signed
+ * certificate.
+ * <p>
+ * The syntax of a valid value for this option MUST follow RFC-2253
+ * specifications. Namely the following components (with their accepted
+ * meaning) will be recognized. Note that the component name is case-
+ * insensitive:
+ * <dl>
+ * <dt>CN</dt>
+ * <dd>The Common Name; e.g. "host.domain.com"</dd>
+ *
+ * <dt>OU</dt>
+ * <dd>The Organizational Unit; e.g. "IT Department"</dd>
+ *
+ * <dt>O</dt>
+ * <dd>The Organization Name; e.g. "The Sample Company"</dd>
+ *
+ * <dt>L</dt>
+ * <dd>The Locality Name; e.g. "Sydney"</dd>
+ *
+ * <dt>ST</dt>
+ * <dd>The State Name; e.g. "New South Wales"</dd>
+ *
+ * <dt>C</dt>
+ * <dd>The 2-letter Country identifier; e.g. "AU"</dd>
+ * </dl>
+ * <p>
+ * When specified with a <code>-dname</code> option, each pair of component
+ * / value will be separated from the other with a comma. Each component
+ * and value pair MUST be separated by an equal sign. For example, the
+ * following is a valid DN value:
+ * <pre>
+ * CN=host.domain.com, O=The Sample Company, L=Sydney, ST=NSW, C=AU
+ * </pre>
+ * If this option is omitted, the tool will prompt you to enter the
+ * information through the console.
+ * <p></dd>
+ *
+ * <dt>-keypass PASSWORD</dt>
+ * <dd>Use this option to specify the password which the tool will use to
+ * protect the newly created Key Entry.
+ * <p>
+ * If this option is omitted, you will be prompted to provide a password.
+ * <p></dd>
+ *
+ * <dt>-validity DAY_COUNT</dt>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.</dd>
+ * </dl>
+ */
+class GenKeyCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(GenKeyCmd.class.getName());
+ /** Default key size in bits. */
+ private static final int DEFAULT_KEY_SIZE = 1024;
+
+ private String _alias;
+ private String _keyAlgorithm;
+ private String _keySizeStr;
+ private String _sigAlgorithm;
+ private String _dName;
+ private String _password;
+ private String _validityStr;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+ private int keySize;
+ private X500DistinguishedName distinguishedName;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param alias the alias to use. */
+ public void setAlias(String alias)
+ {
+ this._alias = alias;
+ }
+
+ /** @param algorithm the canonical name of the key-pair algorithm to use. */
+ public void setKeyalg(String algorithm)
+ {
+ this._keyAlgorithm = algorithm;
+ }
+
+ /**
+ * @param bits the string representation of the number of bits (a decimal
+ * positive integer) the modulus of the generated keys (private and
+ * public) should have.
+ */
+ public void setKeysize(String bits)
+ {
+ this._validityStr = bits;
+ }
+
+ /**
+ * @param algorithm the canonical name of the digital signature algorithm to
+ * use.
+ */
+ public void setSigalg(String algorithm)
+ {
+ this._sigAlgorithm = algorithm;
+ }
+
+ /** @param name the distiniguished name to use. */
+ public void setDname(String name)
+ {
+ this._dName = name;
+ }
+
+ /** @param password the (private) key password to use. */
+ public void setKeypass(String password)
+ {
+ this._password = password;
+ }
+
+ /**
+ * @param days the string representation of the number of days (a decimal,
+ * positive integer) to assign to the generated certificate.
+ */
+ public void setValidity(String days)
+ {
+ this._validityStr = days;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-alias".equals(opt)) // -alias ALIAS //$NON-NLS-1$
+ _alias = args[++i];
+ else if ("-keyalg".equals(opt)) // -keyalg ALGORITHM //$NON-NLS-1$
+ _keyAlgorithm = args[++i];
+ else if ("-keysize".equals(opt)) // -keysize KEY_SIZE //$NON-NLS-1$
+ _keySizeStr = args[++i];
+ else if ("-sigalg".equals(opt)) // -sigalg ALGORITHM //$NON-NLS-1$
+ _sigAlgorithm = args[++i];
+ else if ("-dname".equals(opt)) // -dname NAME //$NON-NLS-1$
+ _dName = args[++i];
+ else if ("-keypass".equals(opt)) // -keypass PASSWORD //$NON-NLS-1$
+ _password = args[++i];
+ else if ("-validity".equals(opt)) // -validity DAY_COUNT //$NON-NLS-1$
+ _validityStr = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE //$NON-NLS-1$
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL //$NON-NLS-1$
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD //$NON-NLS-1$
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME //$NON-NLS-1$
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt)) //$NON-NLS-1$
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ setAliasParam(_alias);
+ setKeyPasswordParam(_password);
+ setAlgorithmParams(_keyAlgorithm, _sigAlgorithm);
+ setKeySize(_keySizeStr);
+ setDName(_dName);
+ setValidityParam(_validityStr);
+
+ log.finer("-genkey handler will use the following options:"); //$NON-NLS-1$
+ log.finer(" -alias=" + alias); //$NON-NLS-1$
+ log.finer(" -keyalg=" + keyPairGenerator.getAlgorithm()); //$NON-NLS-1$
+ log.finer(" -keysize=" + keySize); //$NON-NLS-1$
+ log.finer(" -sigalg=" + signatureAlgorithm.getAlgorithm()); //$NON-NLS-1$
+ log.finer(" -dname=" + distinguishedName); //$NON-NLS-1$
+ log.finer(" -keypass=" + String.valueOf(keyPasswordChars)); //$NON-NLS-1$
+ log.finer(" -validity=" + validityInDays); //$NON-NLS-1$
+ log.finer(" -storetype=" + storeType); //$NON-NLS-1$
+ log.finer(" -keystore=" + storeURL); //$NON-NLS-1$
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars)); //$NON-NLS-1$
+ log.finer(" -provider=" + provider); //$NON-NLS-1$
+ log.finer(" -v=" + verbose); //$NON-NLS-1$
+ }
+
+ void start() throws CertificateException, KeyStoreException,
+ InvalidKeyException, SignatureException, IOException,
+ NoSuchAlgorithmException
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ // 1. generate a new key-pair
+ log.fine("About to generate key-pair...");
+ keyPairGenerator.initialize(keySize);
+ KeyPair kp = keyPairGenerator.generateKeyPair();
+ PublicKey publicKey = kp.getPublic();
+ PrivateKey privateKey = kp.getPrivate();
+
+ // 2. generate a self-signed certificate
+ log.fine("About to generate a self-signed certificate...");
+ byte[] derBytes = getSelfSignedCertificate(distinguishedName,
+ publicKey,
+ privateKey);
+ log.finest(Util.dumpString(derBytes, "derBytes ")); //$NON-NLS-1$
+ CertificateFactory x509Factory = CertificateFactory.getInstance(Main.X_509);
+ ByteArrayInputStream bais = new ByteArrayInputStream(derBytes);
+ Certificate certificate = x509Factory.generateCertificate(bais);
+ log.finest("certificate = " + certificate); //$NON-NLS-1$
+
+ // 3. store it, w/ its private key, associating them to alias
+ Certificate[] chain = new Certificate[] { certificate };
+ log.finest("About to store newly generated material in key store..."); //$NON-NLS-1$
+ store.setKeyEntry(alias, privateKey, keyPasswordChars, chain);
+
+ // 4. persist the key store
+ saveKeyStore();
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ // own methods --------------------------------------------------------------
+
+ /**
+ * @param size the desired key size as a string.
+ * @throws NumberFormatException if the string does not represent a valid
+ * decimal integer value.
+ */
+ private void setKeySize(String size)
+ {
+ if (size == null || size.trim().length() == 0)
+ this.keySize = DEFAULT_KEY_SIZE;
+ else
+ {
+ size = size.trim();
+ keySize = Integer.parseInt(size);
+ // When generating a DSA key pair, the key size must be in the range
+ // from 512 to 1024 bits, and must be a multiple of 64. The default
+ // key size for any algorithm is 1024 bits
+ if (keySize < 1)
+ throw new IllegalArgumentException(Messages.getString("GenKeyCmd.54")); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @param name the X.500 distinguished name of the principal for whom the
+ * key/certificate are being generated.
+ * @throws UnsupportedCallbackException if no implementation of a name
+ * callback is available.
+ * @throws IOException if an I/O related exception occurs during the process.
+ * @throws IllegalArgumentException if the designated, or captured, value is
+ * not a valid X.500 distinguished name.
+ */
+ private void setDName(String name) throws IOException,
+ UnsupportedCallbackException
+ {
+ if (name != null && name.trim().length() > 0)
+ name = name.trim();
+ else
+ {
+ // prompt user to provide one
+ String dnTxt = Messages.getString("GenKeyCmd.0"); //$NON-NLS-1$
+ String oDefault = Messages.getString("GenKeyCmd.6"); //$NON-NLS-1$
+ String lDefault = Messages.getString("GenKeyCmd.7"); //$NON-NLS-1$
+ String stDefault = Messages.getString("GenKeyCmd.8"); //$NON-NLS-1$
+ String cDefault = Messages.getString("GenKeyCmd.9"); //$NON-NLS-1$
+ String cnPrompt = Messages.getString("GenKeyCmd.10"); //$NON-NLS-1$
+ String oPrompt = Messages.getFormattedString("GenKeyCmd.11", oDefault); //$NON-NLS-1$
+ String ouPrompt = Messages.getString("GenKeyCmd.13"); //$NON-NLS-1$
+ String lPrompt = Messages.getFormattedString("GenKeyCmd.14", lDefault); //$NON-NLS-1$
+ String stPrompt = Messages.getFormattedString("GenKeyCmd.16", stDefault); //$NON-NLS-1$
+ String cPrompt = Messages.getFormattedString("GenKeyCmd.18", cDefault); //$NON-NLS-1$
+
+ TextOutputCallback dnCB = new TextOutputCallback(TextOutputCallback.INFORMATION,
+ dnTxt);
+ TextInputCallback cnCB = new TextInputCallback(cnPrompt);
+ TextInputCallback oCB = new TextInputCallback(oPrompt, oDefault);
+ TextInputCallback ouCB = new TextInputCallback(ouPrompt);
+ TextInputCallback lCB = new TextInputCallback(lPrompt, lDefault);
+ TextInputCallback sCB = new TextInputCallback(stPrompt, stDefault);
+ TextInputCallback cCB = new TextInputCallback(cPrompt, cDefault);
+ getCallbackHandler().handle(new Callback[] { dnCB, cnCB, oCB, ouCB, lCB, sCB, cCB });
+ StringBuilder sb = new StringBuilder();
+
+ // handle CN
+ name = parseUserPrompt(cnCB);
+ if (name != null && name.length() > 0)
+ sb.append("CN=").append(name); //$NON-NLS-1$
+
+ // handle O
+ name = parseUserPrompt(oCB);
+ if (name != null && name.length() > 0)
+ sb.append(",O=").append(name); //$NON-NLS-1$
+
+ // handle OU
+ name = parseUserPrompt(ouCB);
+ if (name != null && name.length() > 0)
+ sb.append(",OU=").append(name.trim()); //$NON-NLS-1$
+
+ // handle L
+ name = parseUserPrompt(lCB);
+ if (name != null && name.length() > 0)
+ sb.append(",L=").append(name.trim()); //$NON-NLS-1$
+
+ // handle ST
+ name = parseUserPrompt(sCB);
+ if (name != null && name.length() > 0)
+ sb.append(",ST=").append(name.trim()); //$NON-NLS-1$
+
+ // handle C
+ name = parseUserPrompt(cCB);
+ if (name != null && name.length() > 0)
+ sb.append(",C=").append(name.trim()); //$NON-NLS-1$
+
+ name = sb.toString().trim();
+ }
+
+ log.fine("dName=[" + name + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+ distinguishedName = new X500DistinguishedName(name);
+ }
+
+ private String parseUserPrompt(TextInputCallback ticb)
+ {
+ String result = ticb.getText();
+ if (result == null || result.trim().length() == 0)
+ result = ticb.getDefaultText();
+ else if (result.trim().equals(".")) //$NON-NLS-1$
+ result = null;
+ else
+ result = result.trim();
+
+ return result;
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/IdentityDBCmd.java b/tools/gnu/classpath/tools/keytool/IdentityDBCmd.java
new file mode 100644
index 000000000..cb6b6dac2
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/IdentityDBCmd.java
@@ -0,0 +1,185 @@
+/* IdentityDBCmd.java -- The identitydb command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import java.util.logging.Logger;
+
+/**
+ * <b>NOT IMPLEMENTED YET</b>
+ * <p>
+ * The <b>-identitydb</b> keytool command handler is used to read the JDK 1.1.x-
+ * style identity database and add its entries to the key store. If a key store
+ * does not exist, it is created.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-file FILE_NAME</dt>
+ * <dd>The fully qualified path of the identity file to import. If this
+ * option is omitted, the tool will process STDIN.
+ * <p></dd>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.</dd>
+ * </dl>
+ */
+class IdentityDBCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(IdentityDBCmd.class.getName());
+ private String _idbFileName;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param pathName the fully qualified path name of the file to process. */
+ public void setFile(String pathName)
+ {
+ this._idbFileName = pathName;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt);
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-file".equals(opt)) // -file FILE_NAME
+ _idbFileName = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt))
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setInputStreamParam(_idbFileName);
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+
+ log.finer("-identitydb handler will use the following options:");
+ log.finer(" -file=" + _idbFileName);
+ log.finer(" -storetype=" + storeType);
+ log.finer(" -keystore=" + storeURL);
+ log.finer(" -storepass=" + new String(storePasswordChars));
+ log.finer(" -provider=" + provider);
+ log.finer(" -v=" + verbose);
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/ImportCmd.java b/tools/gnu/classpath/tools/keytool/ImportCmd.java
new file mode 100644
index 000000000..b5058b581
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/ImportCmd.java
@@ -0,0 +1,751 @@
+/* ImportCmd.java -- The import command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.classpath.SystemProperties;
+import gnu.java.security.x509.X509CertPath;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.Key;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertPathValidator;
+import java.security.cert.CertPathValidatorException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.PKIXCertPathValidatorResult;
+import java.security.cert.PKIXParameters;
+import java.security.interfaces.DSAParams;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.ConfirmationCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+/**
+ * The <code>-import</code> keytool command handler is used to read an X.509
+ * certificate, or a PKCS#7 Certificate Reply from a designated input source and
+ * incorporate the certificates into the key store.
+ * <p>
+ * If the <i>Alias</i> does not already exist in the key store, the tool treats
+ * the certificate read from the input source as a new Trusted Certificate. It
+ * then attempts to discover a chain-of-trust, starting from that certificate
+ * and ending at another <i>Trusted Certificate</i>, already stored in the key
+ * store. If the <code>-trustcacerts</code> option is present, an additional
+ * key store, of type <code>JKS</code> named <code>cacerts</code>, and assumed
+ * to be present in <code>${JAVA_HOME}/lib/security</code> will also be
+ * consulted if found --<code>${JAVA_HOME}</code> refers to the location of an
+ * installed Java Runtime Environment (JRE). If no chain-of-trust can be
+ * established, and unless the <code>-noprompt</code> option has been specified,
+ * the certificate is printed to STDOUT and the user is prompted for a
+ * confirmation.
+ * <p>
+ * If <i>Alias</i> exists in the key store, the tool will treat the
+ * certificate(s) read from the input source as a <i>Certificate Reply</i>,
+ * which can be a chain of certificates, that eventually would replace the chain
+ * of certificates associated with the <i>Key Entry</i> of that <i>Alias</i>.
+ * The substitution of the certificates only occurs if a chain-of-trust can be
+ * established between the bottom certificate of the chain read from the input
+ * file and the <i>Trusted Certificates</i> already present in the key store.
+ * Again, if the <code>-trustcacerts</code> option is specified, additional
+ * <i>Trusted Certificates</i> in the same <code>cacerts</code> key store will
+ * be considered. If no chain-of-trust can be established, the operation will
+ * abort.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-alias ALIAS</dt>
+ * <dd>Every entry, be it a <i>Key Entry</i> or a <i>Trusted
+ * Certificate</i>, in a key store is uniquely identified by a user-defined
+ * <i>Alias</i> string. Use this option to specify the <i>Alias</i> to use
+ * when referring to an entry in the key store. Unless specified otherwise,
+ * a default value of <code>mykey</code> shall be used when this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-file FILE_NAME</dt>
+ * <dd>The fully qualified path of the file to read from. If omitted, the
+ * tool will process STDIN.
+ * <p></dd>
+ *
+ * <dt>-keypass PASSWORD</dt>
+ * <dd>Use this option to specify the password which the tool will use to
+ * protect the <i>Key Entry</i> associated with the designated <i>Alias</i>,
+ * when replacing this <i>Alias</i>' chain of certificates with that found
+ * in the certificate reply.
+ * <p>
+ * If this option is omitted, and the chain-of-trust for the certificate
+ * reply has been established, the tool will first attempt to unlock the
+ * <i>Key Entry</i> using the same password protecting the key store. If
+ * this fails, you will then be prompted to provide a password.
+ * <p></dd>
+ *
+ * <dt>-noprompt</dt>
+ * <dd>Use this option to prevent the tool from prompting the user.
+ * <p></dd>
+ *
+ * <dt>-trustcacerts</dt>
+ * <dd>Use this option to indicate to the tool that a key store, of type
+ * <code>JKS</code>, named <code>cacerts</code>, and usually located in
+ * <code>lib/security</code> in an installed Java Runtime Environment
+ * should be considered when trying to establish chain-of-trusts.
+ * <p></dd>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.</dd>
+ * </dl>
+ */
+class ImportCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(ImportCmd.class.getName());
+ private String _alias;
+ private String _certFileName;
+ private String _password;
+ private boolean noPrompt;
+ private boolean trustCACerts;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+ private CertificateFactory x509Factory;
+ private boolean imported;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param alias the existing alias to use. */
+ public void setAlias(String alias)
+ {
+ this._alias = alias;
+ }
+
+ /** @param pathName the fully qualified path name of the file to process. */
+ public void setFile(String pathName)
+ {
+ this._certFileName = pathName;
+ }
+
+ /** @param password the existing (private) key password to use. */
+ public void setKeypass(String password)
+ {
+ this._password = password;
+ }
+
+ /**
+ * @param flag whether to prompt, or not, the user to verify certificate
+ * fingerprints.
+ */
+ public void setNoprompt(String flag)
+ {
+ this.noPrompt = Boolean.valueOf(flag).booleanValue();
+ }
+
+ /**
+ * @param flag whether to trust, or not, certificates found in the
+ * <code>cacerts</code> key store.
+ */
+ public void setTrustcacerts(String flag)
+ {
+ this.trustCACerts = Boolean.valueOf(flag).booleanValue();
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-alias".equals(opt)) // -alias ALIAS //$NON-NLS-1$
+ _alias = args[++i];
+ else if ("-file".equals(opt)) // -file FILE_NAME //$NON-NLS-1$
+ _certFileName = args[++i];
+ else if ("-keypass".equals(opt)) // -keypass PASSWORD //$NON-NLS-1$
+ _password = args[++i];
+ else if ("-noprompt".equals(opt)) //$NON-NLS-1$
+ noPrompt = true;
+ else if ("-trustcacerts".equals(opt)) //$NON-NLS-1$
+ trustCACerts = true;
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE //$NON-NLS-1$
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL //$NON-NLS-1$
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD //$NON-NLS-1$
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME //$NON-NLS-1$
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt)) //$NON-NLS-1$
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setInputStreamParam(_certFileName);
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ setAliasParam(_alias);
+ setKeyPasswordNoPrompt(_password);
+
+ log.finer("-import handler will use the following options:"); //$NON-NLS-1$
+ log.finer(" -alias=" + alias); //$NON-NLS-1$
+ log.finer(" -file=" + _certFileName); //$NON-NLS-1$
+ log.finer(" -keypass=" + _password); //$NON-NLS-1$
+ log.finer(" -noprompt=" + noPrompt); //$NON-NLS-1$
+ log.finer(" -trustcacerts=" + trustCACerts); //$NON-NLS-1$
+ log.finer(" -storetype=" + storeType); //$NON-NLS-1$
+ log.finer(" -keystore=" + storeURL); //$NON-NLS-1$
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars)); //$NON-NLS-1$
+ log.finer(" -provider=" + provider); //$NON-NLS-1$
+ log.finer(" -v=" + verbose); //$NON-NLS-1$
+ }
+
+ void start() throws CertificateException, KeyStoreException, IOException,
+ UnsupportedCallbackException, NoSuchAlgorithmException,
+ CertPathValidatorException, UnrecoverableKeyException
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ x509Factory = CertificateFactory.getInstance("X.509"); //$NON-NLS-1$
+ // the alias will tell us whether we're dealing with
+ // a new trusted certificate or a certificate reply
+ if (! store.containsAlias(alias))
+ importNewTrustedCertificate();
+ else
+ {
+ ensureAliasIsKeyEntry();
+ importCertificateReply();
+ }
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ // own methods --------------------------------------------------------------
+
+ /**
+ * When importing a new trusted certificate, <i>alias</i> MUST NOT yet exist
+ * in the key store.
+ * <p>
+ * Before adding the certificate to the key store and associate it with the
+ * designated Alias, this method tries to verify it by attempting to construct
+ * a chain of trust from that certificate to a self-signed certificate
+ * (belonging to a root CA), using (already) trusted certificates that are
+ * available in the key store.
+ * <p>
+ * If the <code>-trustcacerts</code> option was detected on the command
+ * line, additional trusted certificates are considered for establishing the
+ * chain of trust. Those additional certificates are assumed to be in a key
+ * store, of type <code>JKS</code> named <code>cacerts</code> and usually
+ * located in <code>${JAVA_HOME}/lib/security</code>, where
+ * <code>${JAVA_HOME}</code> is the root folder location of a Java runtime.
+ * <p>
+ * If this method fails to establish a trust path from the certificate to be
+ * imported up to a trusted self-signed certificate, the certificate is
+ * printed to <code>STDOUT</code>, and the user is prompted to verify it,
+ * with the option of aborting the import operation. If however the option
+ * <code>-noprompt</code> was detected on the command line, no interaction
+ * with the user will take place and the import operation will abort.
+ *
+ * @throws CertificateException
+ * @throws KeyStoreException
+ * @throws NoSuchAlgorithmException
+ * @throws UnsupportedCallbackException
+ * @throws IOException
+ * @throws UnrecoverableKeyException
+ * @throws CertPathValidatorException
+ */
+ private void importNewTrustedCertificate() throws CertificateException,
+ KeyStoreException, NoSuchAlgorithmException, IOException,
+ UnsupportedCallbackException, CertPathValidatorException,
+ UnrecoverableKeyException
+ {
+ log.entering(this.getClass().getName(), "importNewTrustedCertificate"); //$NON-NLS-1$
+
+ Certificate certificate = x509Factory.generateCertificate(inStream);
+ log.finest("certificate = " + certificate); //$NON-NLS-1$
+ LinkedList orderedReply = new LinkedList();
+ orderedReply.addLast(certificate);
+
+ if (findTrustAndUpdate(orderedReply, ! noPrompt))
+ {
+ store.setCertificateEntry(alias, certificate);
+ System.out.println(Messages.getString("ImportCmd.29")); //$NON-NLS-1$
+ saveKeyStore();
+ }
+ else
+ System.out.println(Messages.getString("ImportCmd.28")); //$NON-NLS-1$
+
+ log.exiting(this.getClass().getName(), "importNewTrustedCertificate"); //$NON-NLS-1$
+ }
+
+ /**
+ * A certificate reply is a certificate, whose Owner is stored in the key
+ * store associated to the designated Alias, and now signed by supposedly a
+ * trusted CA (Certificate Authority). In other words, the Subject in this
+ * certificate reply is Alias's own and the Issuer is a CA.
+ * <p>
+ * When importing a certificate reply, the reply is validated using trusted
+ * certificates from the key store, and optionally (if the option
+ * <code>-trustcacerts</code> was detected on the command line) certificates
+ * found in the key store, of type <code>JKS</code> named <code>cacerts</code>
+ * located in <code>${JAVA_HOME}/lib/security</code>, where
+ * <code>${JAVA_HOME}</code> is the root folder location of a Java runtime.
+ *
+ * @throws CertificateException
+ * @throws UnsupportedCallbackException
+ * @throws IOException
+ * @throws KeyStoreException
+ * @throws CertPathValidatorException
+ * @throws NoSuchAlgorithmException
+ * @throws UnrecoverableKeyException
+ */
+ private void importCertificateReply() throws CertificateException,
+ IOException, UnsupportedCallbackException, KeyStoreException,
+ NoSuchAlgorithmException, CertPathValidatorException,
+ UnrecoverableKeyException
+ {
+ log.entering(this.getClass().getName(), "importCertificateReply"); //$NON-NLS-1$
+
+ Collection certificates = x509Factory.generateCertificates(inStream);
+ ensureReplyIsOurs(certificates);
+ // we now have established that the public keys are the same.
+ // find a chain-of-trust if one exists
+ if (certificates.size() == 1)
+ importCertificate((Certificate) certificates.iterator().next());
+ else
+ importChain(certificates);
+
+ log.exiting(this.getClass().getName(), "importCertificateReply"); //$NON-NLS-1$
+ }
+
+ /**
+ * If the reply is a single X.509 certificate, keytool attempts to establish a
+ * trust chain, starting at the certificate reply and ending at a self-signed
+ * certificate (belonging to a root CA). The certificate reply and the
+ * hierarchy of certificates used to authenticate the certificate reply form
+ * the new certificate chain of alias. If a trust chain cannot be established,
+ * the certificate reply is not imported. In this case, keytool does not print
+ * out the certificate, nor does it prompt the user to verify it. This is
+ * because it is very hard (if not impossible) for a user to determine the
+ * authenticity of the certificate reply.
+ *
+ * @param certificate the certificate reply to import into the key store.
+ * @throws NoSuchAlgorithmException
+ * @throws CertPathValidatorException
+ * @throws UnsupportedCallbackException
+ * @throws IOException
+ * @throws UnrecoverableKeyException
+ * @throws KeyStoreException
+ * @throws CertificateException
+ */
+ private void importCertificate(Certificate certificate)
+ throws NoSuchAlgorithmException, CertPathValidatorException,
+ KeyStoreException, UnrecoverableKeyException, IOException,
+ UnsupportedCallbackException, CertificateException
+ {
+ log.entering(this.getClass().getName(), "importCertificate", certificate); //$NON-NLS-1$
+
+ LinkedList reply = new LinkedList();
+ reply.addLast(certificate);
+
+ if (! findTrustAndUpdate(reply, false))
+ throw new CertPathValidatorException(Messages.getString("ImportCmd.34")); //$NON-NLS-1$
+
+ Certificate[] newChain = (Certificate[]) reply.toArray(new Certificate[0]);
+ Key privateKey = getAliasPrivateKey();
+ store.setKeyEntry(alias, privateKey, keyPasswordChars, newChain);
+ saveKeyStore();
+
+ log.exiting(this.getClass().getName(), "importCertificate"); //$NON-NLS-1$
+ }
+
+ /**
+ * If the reply is a PKCS#7 formatted certificate chain, the chain is first
+ * ordered (with the user certificate first and the self-signed root CA
+ * certificate last), before keytool attempts to match the root CA certificate
+ * provided in the reply with any of the trusted certificates in the key store
+ * or the "cacerts" keystore file (if the -trustcacerts option was specified).
+ * If no match can be found, the information of the root CA certificate is
+ * printed out, and the user is prompted to verify it, e.g., by comparing the
+ * displayed certificate fingerprints with the fingerprints obtained from some
+ * other (trusted) source of information, which might be the root CA itself.
+ * The user then has the option of aborting the import operation. If the
+ * -noprompt option is given, however, there will be no interaction with the
+ * user.
+ *
+ * @param chain the collection of certificates parsed from the user
+ * designated input.
+ * @throws UnsupportedCallbackException
+ * @throws IOException
+ * @throws UnrecoverableKeyException
+ * @throws KeyStoreException
+ * @throws CertPathValidatorException
+ * @throws NoSuchAlgorithmException
+ * @throws CertificateException
+ */
+ private void importChain(Collection chain) throws NoSuchAlgorithmException,
+ CertPathValidatorException, KeyStoreException, UnrecoverableKeyException,
+ IOException, UnsupportedCallbackException, CertificateException
+ {
+ log.entering(this.getClass().getName(), "importChain", chain); //$NON-NLS-1$
+
+ LinkedList reply = orderChain(chain);
+ if (findTrustAndUpdate(reply, ! noPrompt))
+ {
+ Certificate[] newChain = (Certificate[]) reply.toArray(new Certificate[0]);
+ Key privateKey = getAliasPrivateKey();
+ store.setKeyEntry(alias, privateKey, keyPasswordChars, newChain);
+ saveKeyStore();
+ }
+
+ log.exiting(this.getClass().getName(), "importChain"); //$NON-NLS-1$
+ }
+
+ /**
+ * Check to ensure that alias's public key is the subject of the first
+ * certificate in the passed certificate collection. Throws an exception if
+ * the public keys do not match.
+ *
+ * @param certificates a {@link Collection} of certificate replies (either a
+ * signle certificate reply, or a PKCS#7 certificate reply chain)
+ * usually sent by a CA as a response to a Certificate Signing
+ * Request (CSR).
+ * @throws IOException
+ * @throws UnsupportedCallbackException
+ * @throws KeyStoreException
+ */
+ private void ensureReplyIsOurs(Collection certificates) throws IOException,
+ UnsupportedCallbackException, KeyStoreException
+ {
+ log.entering(this.getClass().getName(), "ensureReplyIsOurs"); //$NON-NLS-1$
+
+ Certificate certificate = (Certificate) certificates.iterator().next();
+ log.finest("certificate = " + certificate); //$NON-NLS-1$
+ Certificate[] chain = store.getCertificateChain(alias);
+ if (chain == null)
+ throw new IllegalArgumentException(Messages.getFormattedString("ImportCmd.37", //$NON-NLS-1$
+ alias));
+ Certificate anchor = chain[0];
+ PublicKey anchorPublicKey = anchor.getPublicKey();
+ PublicKey certPublicKey = certificate.getPublicKey();
+ boolean sameKey;
+ if (anchorPublicKey instanceof DSAPublicKey)
+ {
+ DSAPublicKey pk1 = (DSAPublicKey) anchorPublicKey;
+ if (!(certPublicKey instanceof DSAPublicKey))
+ throw new IllegalArgumentException(Messages.getString("ImportCmd.38")); //$NON-NLS-1$
+
+ sameKey = areEqual(pk1, (DSAPublicKey) certPublicKey);
+ }
+ else if (anchorPublicKey instanceof RSAPublicKey)
+ {
+ RSAPublicKey pk1 = (RSAPublicKey) anchorPublicKey;
+ if (!(certPublicKey instanceof RSAPublicKey))
+ throw new IllegalArgumentException(Messages.getString("ImportCmd.38")); //$NON-NLS-1$
+
+ sameKey = areEqual(pk1, (RSAPublicKey) certPublicKey);
+ }
+ else
+ throw new IllegalArgumentException(
+ Messages.getFormattedString("ImportCmd.40", //$NON-NLS-1$
+ new String[] { alias,
+ anchorPublicKey.getClass().getName() }));
+ if (! sameKey)
+ throw new IllegalArgumentException(Messages.getString("ImportCmd.41")); //$NON-NLS-1$
+
+ log.exiting(this.getClass().getName(), "ensureReplyIsOurs"); //$NON-NLS-1$
+ }
+
+ private boolean areEqual(DSAPublicKey pk1, DSAPublicKey pk2)
+ {
+ if (pk1.getY().compareTo(pk2.getY()) != 0)
+ return false;
+
+ DSAParams p1 = pk1.getParams();
+ DSAParams p2 = pk2.getParams();
+ if (p1.getG().compareTo(p2.getG()) != 0)
+ return false;
+
+ if (p1.getP().compareTo(p2.getP()) != 0)
+ return false;
+
+ return p1.getQ().compareTo(p2.getQ()) == 0;
+ }
+
+ private boolean areEqual(RSAPublicKey pk1, RSAPublicKey pk2)
+ {
+ if (pk1.getPublicExponent().compareTo(pk2.getPublicExponent()) != 0)
+ return false;
+
+ return pk1.getModulus().compareTo(pk2.getModulus()) == 0;
+ }
+
+ /**
+ * @param chain
+ * @return the input collection, ordered with own certificate first, and CA's
+ * self-signed certificate last.
+ */
+ private LinkedList orderChain(Collection chain)
+ {
+ log.entering(this.getClass().getName(), "orderChain"); //$NON-NLS-1$
+
+ LinkedList result = new LinkedList();
+
+
+ log.entering(this.getClass().getName(), "orderChain", result); //$NON-NLS-1$
+ return result;
+ }
+
+ /**
+ * Given an ordered list of certificates, this method attempts to validate the
+ * chain, and if successful, updates the key store entry for the designated
+ * alias. The list of certificates is expected to be ordered as a chain, where
+ * the first is the alias's own certificate and the last being a self-signed
+ * CA certificate.
+ * <p>
+ * if <code>promptUser</code> is <code>true</code>, then even if no
+ * anchor trust certificate is found, the user is prompted to approve, or not,
+ * the import operation. On the other hand if the <code>promptUser</code>
+ * parameter is <code>false</code> then this method will throw an exception
+ * if no trust anchor is to be found.
+ *
+ * @param reply an ordered certificate path, where the last entry is the CA's
+ * self-signed certificate.
+ * @param promptUser a boolean flag indicating whether or not to prompt the
+ * user for explicit trust in a CA certificate.
+ * @return <code>true</code> if the validation succeeds; or <code>false</code>
+ * otherwise.
+ * @throws NoSuchAlgorithmException
+ * @throws CertPathValidatorException
+ * @throws UnsupportedCallbackException
+ * @throws IOException
+ * @throws UnrecoverableKeyException
+ * @throws KeyStoreException
+ * @throws CertificateEncodingException
+ */
+ private boolean findTrustAndUpdate(LinkedList reply, boolean promptUser)
+ throws IOException, NoSuchAlgorithmException, CertPathValidatorException,
+ KeyStoreException, UnrecoverableKeyException, UnsupportedCallbackException,
+ CertificateEncodingException
+ {
+ log.entering(this.getClass().getName(), "findTrustAndUpdate"); //$NON-NLS-1$
+
+ X509CertPath certPath = new X509CertPath(reply);
+ CertPathValidator validator = CertPathValidator.getInstance("PKIX"); //$NON-NLS-1$
+ PKIXCertPathValidatorResult cpvr = findTrustInStore(certPath, validator);
+ if (cpvr == null && trustCACerts)
+ cpvr = findTrustInCACerts(certPath, validator);
+
+ boolean result = false;
+ if (cpvr == null)
+ {
+ if (promptUser)
+ {
+ printVerbose((Certificate) reply.getLast());
+ ConfirmationCallback ccb;
+ ccb = new ConfirmationCallback(Messages.getString("ImportCmd.32"), //$NON-NLS-1$
+ ConfirmationCallback.INFORMATION,
+ ConfirmationCallback.YES_NO_OPTION,
+ ConfirmationCallback.NO);
+ getCallbackHandler().handle(new Callback[] { ccb });
+ int answer = ccb.getSelectedIndex();
+ result = answer == ConfirmationCallback.YES;
+ }
+ }
+ else
+ {
+ log.fine("Found a chain-of-trust anchored by " + cpvr.getTrustAnchor()); //$NON-NLS-1$
+ Certificate trustedCert = cpvr.getTrustAnchor().getTrustedCert();
+ reply.addLast(trustedCert);
+ result = true;
+ }
+
+ log.entering(this.getClass().getName(), "findTrustAndUpdate", //$NON-NLS-1$
+ Boolean.valueOf(result));
+ return result;
+ }
+
+ private PKIXCertPathValidatorResult findTrustInStore(X509CertPath certPath,
+ CertPathValidator validator)
+ {
+ log.entering(this.getClass().getName(), "findTrustInStore"); //$NON-NLS-1$
+
+ PKIXCertPathValidatorResult result;
+ try
+ {
+ PKIXParameters params = new PKIXParameters(store);
+ result = (PKIXCertPathValidatorResult) validator.validate(certPath, params);
+ }
+ catch (Exception x)
+ {
+ log.log(Level.FINE,
+ "Exception in findTrustInStore(). Ignore + Return NULL", //$NON-NLS-1$
+ x);
+ result = null;
+ }
+
+ log.exiting(this.getClass().getName(), "findTrustInStore", result); //$NON-NLS-1$
+ return result;
+ }
+
+ private PKIXCertPathValidatorResult findTrustInCACerts(X509CertPath certPath,
+ CertPathValidator validator)
+ {
+ log.entering(this.getClass().getName(), "findTrustInCACerts"); //$NON-NLS-1$
+
+ FileInputStream stream = null;
+ PKIXCertPathValidatorResult result = null;
+ try
+ {
+ KeyStore cacerts = KeyStore.getInstance("jks"); //$NON-NLS-1$
+ String cacertsPath = SystemProperties.getProperty("java.home");
+ String fs = SystemProperties.getProperty("file.separator"); //$NON-NLS-1$
+ cacertsPath = new StringBuilder(cacertsPath).append(fs)
+ .append("lib").append(fs) //$NON-NLS-1$
+ .append("security").append(fs) //$NON-NLS-1$
+ .append("cacerts").toString(); //$NON-NLS-1$
+ stream = new FileInputStream(cacertsPath);
+ cacerts.load(stream, "changeit".toCharArray()); //$NON-NLS-1$
+ PKIXParameters params = new PKIXParameters(cacerts);
+ result = (PKIXCertPathValidatorResult) validator.validate(certPath,
+ params);
+ }
+ catch (Exception x)
+ {
+ log.log(Level.FINE,
+ "Exception in findTrustInCACerts(). Ignore + Return NULL", //$NON-NLS-1$
+ x);
+ }
+ finally
+ {
+ if (stream != null)
+ try
+ {
+ stream.close();
+ }
+ catch (Exception ignored)
+ {
+ }
+ }
+
+ log.exiting(this.getClass().getName(), "findTrustInCACerts", result); //$NON-NLS-1$
+ return result;
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/KeyCloneCmd.java b/tools/gnu/classpath/tools/keytool/KeyCloneCmd.java
new file mode 100644
index 000000000..5936719f7
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/KeyCloneCmd.java
@@ -0,0 +1,344 @@
+/* KeyCloneCmd.java -- The keyclone command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import java.io.IOException;
+import java.security.Key;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.TextOutputCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+/**
+ * The <b>-keyclone</b> keytool command handler is used to clone an existing
+ * key store entry associated with a designated alias, with its private key and
+ * chain of certificates.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-alias ALIAS</dt>
+ * <dd>Every entry, be it a <i>Key Entry</i> or a <i>Trusted
+ * Certificate</i>, in a key store is uniquely identified by a user-defined
+ * <i>Alias</i> string. Use this option to specify the <i>Alias</i> to use
+ * when referring to an entry in the key store. Unless specified otherwise,
+ * a default value of <code>mykey</code> shall be used when this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-dest ALIAS</dt>
+ * <dd>Use this option to specify the new <i>Alias</i> which will be used
+ * to identify the cloned copy of the <i>Key Entry</i>.
+ * <p></dd>
+ *
+ * <dt>-keypass PASSWORD</dt>
+ * <dd>Use this option to specify the password which the tool will use to
+ * unlock the <i>Key Entry</i> associated with the designated <i>Alias</i>.
+ * <p>
+ * If this option is omitted, the tool will first attempt to unlock the
+ * <i>Key Entry</i> using the same password protecting the key store. If
+ * this fails, you will then be prompted to provide a password.
+ * <p></dd>
+ *
+ * <dt>-new PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the private key
+ * material of the newly cloned copy of the <i>Key Entry</i>.
+ * <p></dd>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.</dd>
+ * </dl>
+ */
+class KeyCloneCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(KeyCloneCmd.class.getName());
+ private String _alias;
+ private String _destAlias;
+ private String _password;
+ private String _newPassword;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+ private String destinationAlias;
+ private char[] newKeyPasswordChars;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param alias the existing alias to use. */
+ public void setAlias(String alias)
+ {
+ this._alias = alias;
+ }
+
+ /** @param alias the new alias to use. */
+ public void setDest(String alias)
+ {
+ this._destAlias = alias;
+ }
+
+ /** @param password the existing (private) key password to use. */
+ public void setKeypass(String password)
+ {
+ this._password = password;
+ }
+
+ /** @param password the new (private) key password to use. */
+ public void setNew(String password)
+ {
+ this._newPassword = password;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-alias".equals(opt)) // -alias ALIAS //$NON-NLS-1$
+ _alias = args[++i];
+ else if ("-dest".equals(opt)) // -dest ALIAS //$NON-NLS-1$
+ _destAlias = args[++i];
+ else if ("-keypass".equals(opt)) // -keypass PASSWORD //$NON-NLS-1$
+ _password = args[++i];
+ else if ("-new".equals(opt)) // -new PASSWORD //$NON-NLS-1$
+ _newPassword = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE //$NON-NLS-1$
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL //$NON-NLS-1$
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD //$NON-NLS-1$
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME //$NON-NLS-1$
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt)) //$NON-NLS-1$
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ setAliasParam(_alias);
+ setKeyPasswordNoPrompt(_password);
+ setDestinationAlias(_destAlias);
+// setNewKeyPassword(_newPassword);
+
+ log.finer("-keyclone handler will use the following options:"); //$NON-NLS-1$
+ log.finer(" -alias=" + alias); //$NON-NLS-1$
+ log.finer(" -dest=" + destinationAlias); //$NON-NLS-1$
+ log.finer(" -keypass=" + _password); //$NON-NLS-1$
+ log.finer(" -new=" + _newPassword); //$NON-NLS-1$
+ log.finer(" -storetype=" + storeType); //$NON-NLS-1$
+ log.finer(" -keystore=" + storeURL); //$NON-NLS-1$
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars)); //$NON-NLS-1$
+ log.finer(" -provider=" + provider); //$NON-NLS-1$
+ log.finer(" -v=" + verbose); //$NON-NLS-1$
+ }
+
+ void start() throws KeyStoreException, NoSuchAlgorithmException, IOException,
+ UnsupportedCallbackException, UnrecoverableKeyException,
+ CertificateException
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ if (store.containsAlias(destinationAlias))
+ throw new SecurityException(Messages.getString("KeyCloneCmd.23")); //$NON-NLS-1$
+
+ Key privateKey = getAliasPrivateKey();
+
+ setNewKeyPassword(_newPassword);
+ Certificate[] chain = store.getCertificateChain(alias);
+
+ store.setKeyEntry(destinationAlias, privateKey, newKeyPasswordChars, chain);
+
+ saveKeyStore();
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ // own methods --------------------------------------------------------------
+
+ private void setDestinationAlias(String name) throws IOException,
+ UnsupportedCallbackException
+ {
+ if (name == null || name.trim().length() == 0) // ask user to provide one
+ {
+ NameCallback ncb = new NameCallback(Messages.getString("KeyCloneCmd.26")); //$NON-NLS-1$
+ getCallbackHandler().handle(new Callback[] { ncb });
+ name = ncb.getName();
+ if (name == null || name.trim().length() == 0)
+ throw new IllegalArgumentException(Messages.getString("KeyCloneCmd.27")); //$NON-NLS-1$
+ }
+
+ destinationAlias = name.trim();
+ }
+
+ private void setNewKeyPassword(String password) throws IOException,
+ UnsupportedCallbackException
+ {
+ if (password != null) // ask user to provide one
+ newKeyPasswordChars = password.toCharArray();
+ else
+ {
+ boolean ok = false;
+ Callback[] prompts = new Callback[1];
+ Callback[] errors = new Callback[1];
+ for (int i = 0; i < 3; i++)
+ if (prompt4NewPassword(getCallbackHandler(), prompts, errors))
+ {
+ ok = true;
+ break;
+ }
+ if (! ok)
+ throw new SecurityException(Messages.getString("StorePasswdCmd.19")); //$NON-NLS-1$
+ }
+ }
+
+ private boolean prompt4NewPassword(CallbackHandler handler,
+ Callback[] prompts, Callback[] errors)
+ throws IOException, UnsupportedCallbackException
+ {
+ String p = Messages.getFormattedString("KeyCloneCmd.28", //$NON-NLS-1$
+ new String[] { destinationAlias,
+ String.valueOf(keyPasswordChars) });
+ PasswordCallback pcb = new PasswordCallback(p, false);
+ prompts[0] = pcb;
+ handler.handle(prompts);
+ char[] pwd1 = pcb.getPassword();
+ pcb.clearPassword();
+ if (pwd1 == null || pwd1.length == 0)
+ {
+ newKeyPasswordChars = (char[]) keyPasswordChars.clone();
+ return true;
+ }
+
+ if (pwd1.length < 6)
+ {
+ errors[0] = new TextOutputCallback(TextOutputCallback.ERROR,
+ Messages.getString("StorePasswdCmd.21")); //$NON-NLS-1$
+ handler.handle(errors);
+ return false;
+ }
+
+ newKeyPasswordChars = pwd1;
+ return true;
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/KeyPasswdCmd.java b/tools/gnu/classpath/tools/keytool/KeyPasswdCmd.java
new file mode 100644
index 000000000..9dc7b8164
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/KeyPasswdCmd.java
@@ -0,0 +1,339 @@
+/* KeyPasswdCmd.java -- The keypasswd command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.classpath.SystemProperties;
+
+import java.io.IOException;
+import java.security.Key;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.util.Arrays;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.TextOutputCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+/**
+ * The <b>-keypasswd</b> keytool command handler is used to change the password
+ * protecting the private key associated to a designated alias.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-alias ALIAS</dt>
+ * <dd>Every entry, be it a <i>Key Entry</i> or a <i>Trusted
+ * Certificate</i>, in a key store is uniquely identified by a user-defined
+ * <i>Alias</i> string. Use this option to specify the <i>Alias</i> to use
+ * when referring to an entry in the key store. Unless specified otherwise,
+ * a default value of <code>mykey</code> shall be used when this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-keypass PASSWORD</dt>
+ * <dd>Use this option to specify the password which the tool will use to
+ * unlock the <i>Key Entry</i> associated with the designated <i>Alias</i>.
+ * <p>
+ * If this option is omitted, the tool will first attempt to unlock the
+ * <i>Key Entry</i> using the same password protecting the key store. If
+ * this fails, you will then be prompted to provide a password.
+ * <p></dd>
+ *
+ * <dt>-new PASSWORD</dt>
+ * <dd>The new, and different, password which will be used to protect the
+ * private key material of the designated Key Entry.
+ * <p></dd>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.</dd>
+ * </dl>
+ */
+class KeyPasswdCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(KeyPasswdCmd.class.getName());
+ private String _alias;
+ private String _password;
+ private String _newPassword;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+ private char[] newPasswordChars;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param alias the alias to use. */
+ public void setAlias(String alias)
+ {
+ this._alias = alias;
+ }
+
+ /** @param password the existing (private) key password to use. */
+ public void setKeypass(String password)
+ {
+ this._password = password;
+ }
+
+ /** @param password the new (private) key password to use. */
+ public void setNew(String password)
+ {
+ this._newPassword = password;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-alias".equals(opt)) // -alias ALIAS //$NON-NLS-1$
+ _alias = args[++i];
+ else if ("-keypass".equals(opt)) // -keypass PASSWORD //$NON-NLS-1$
+ _password = args[++i];
+ else if ("-new".equals(opt)) // -new PASSWORD //$NON-NLS-1$
+ _newPassword = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE //$NON-NLS-1$
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL //$NON-NLS-1$
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD //$NON-NLS-1$
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME //$NON-NLS-1$
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt)) //$NON-NLS-1$
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ setAliasParam(_alias);
+ setKeyPasswordNoPrompt(_password);
+// setNewKeyPassword(_newPassword);
+
+ log.finer("-keypasswd handler will use the following options:"); //$NON-NLS-1$
+ log.finer(" -alias=" + alias); //$NON-NLS-1$
+ log.finer(" -keypass=" + _password); //$NON-NLS-1$
+ log.finer(" -new=" + _newPassword); //$NON-NLS-1$
+ log.finer(" -storetype=" + storeType); //$NON-NLS-1$
+ log.finer(" -keystore=" + storeURL); //$NON-NLS-1$
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars)); //$NON-NLS-1$
+ log.finer(" -provider=" + provider); //$NON-NLS-1$
+ log.finer(" -v=" + verbose); //$NON-NLS-1$
+ }
+
+ void start() throws KeyStoreException, NoSuchAlgorithmException, IOException,
+ UnsupportedCallbackException, UnrecoverableKeyException,
+ CertificateException
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ // 1. get the key entry and certificate chain associated to alias
+ Key privateKey = getAliasPrivateKey();
+ Certificate[] chain = store.getCertificateChain(alias);
+
+ // 2. replace the old entry
+ setNewKeyPassword(_newPassword);
+ store.setKeyEntry(alias, privateKey, newPasswordChars, chain);
+
+ // 3. persist the key store
+ saveKeyStore();
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ // own methods --------------------------------------------------------------
+
+ /**
+ * Set the new password to use for protecting Alias's private key.
+ *
+ * @param password the new key password. if <code>null</code> prompt the
+ * user to provide one. When prompting, the password is entered twice
+ * and compared for a match.
+ * @throws IOException if an I/O related exception occurs during the process.
+ * @throws UnsupportedCallbackException if no implementation of a password
+ * callback handler was found.
+ */
+ private void setNewKeyPassword(String password) throws IOException,
+ UnsupportedCallbackException
+ {
+ if (password != null)
+ newPasswordChars = password.toCharArray();
+ else
+ {
+ boolean ok = false;
+ Callback[] prompts = new Callback[1];
+ Callback[] errors = new Callback[1];
+ for (int i = 0; i < 3; i++)
+ if (prompt4NewPassword(getCallbackHandler(), prompts, errors))
+ {
+ ok = true;
+ break;
+ }
+ if (! ok)
+ throw new SecurityException(Messages.getString("StorePasswdCmd.19")); //$NON-NLS-1$
+ }
+ }
+
+ private boolean prompt4NewPassword(CallbackHandler handler,
+ Callback[] prompts, Callback[] errors)
+ throws IOException, UnsupportedCallbackException
+ {
+ // prompt user (1st time) to provide one
+ String p = Messages.getFormattedString("KeyPasswdCmd.24", alias); //$NON-NLS-1$
+ PasswordCallback pcb = new PasswordCallback(p, false);
+ prompts[0] = pcb;
+ handler.handle(prompts);
+ char[] pwd1 = pcb.getPassword();
+ pcb.clearPassword();
+ String ls = SystemProperties.getProperty("line.separator"); //$NON-NLS-1$
+ if (pwd1 == null || pwd1.length < 6)
+ {
+ String m = Messages.getString("StorePasswdCmd.21") + ls; //$NON-NLS-1$
+ errors[0] = new TextOutputCallback(TextOutputCallback.ERROR, m);
+ handler.handle(errors);
+ return false;
+ }
+
+ if (Arrays.equals(keyPasswordChars, pwd1))
+ {
+ String m = Messages.getString("StorePasswdCmd.22") + ls; //$NON-NLS-1$
+ errors[0] = new TextOutputCallback(TextOutputCallback.ERROR, m);
+ handler.handle(errors);
+ return false;
+ }
+
+ // prompt user (2nd time) for confirmation
+ p = Messages.getFormattedString("KeyPasswdCmd.28", alias); //$NON-NLS-1$
+ pcb = new PasswordCallback(p, false);
+ prompts[0] = pcb;
+ handler.handle(prompts);
+ char[] pwd2 = pcb.getPassword();
+ pcb.clearPassword();
+ if (! Arrays.equals(pwd1, pwd2))
+ {
+ String m = Messages.getString("StorePasswdCmd.24") + ls; //$NON-NLS-1$
+ errors[0] = new TextOutputCallback(TextOutputCallback.ERROR, m);
+ handler.handle(errors);
+ return false;
+ }
+
+ newPasswordChars = pwd2;
+ return true;
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/ListCmd.java b/tools/gnu/classpath/tools/keytool/ListCmd.java
new file mode 100644
index 000000000..655242785
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/ListCmd.java
@@ -0,0 +1,380 @@
+/* ListCmd.java -- The list command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.java.security.util.Base64;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.security.KeyStoreException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.util.Enumeration;
+import java.util.logging.Logger;
+
+/**
+ * The <b>-list</b> keytool command handler is used to output one or all key
+ * store entries.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-alias ALIAS</dt>
+ * <dd>Every entry, be it a <i>Key Entry</i> or a <i>Trusted
+ * Certificate</i>, in a key store is uniquely identified by a user-defined
+ * <i>Alias</i> string. Use this option to specify the <i>Alias</i> to use
+ * when referring to an entry in the key store. Unless specified otherwise,
+ * a default value of <code>mykey</code> shall be used when this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-rfc</dt>
+ * <dd>Use RFC-1421 specifications when encoding the output.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Output the certificate in human-readable format. If both this option
+ * and the <code>-rfc</code> option are detected on the command line, the
+ * tool will opt for the human-readable form and will not abort the
+ * command.</dd>
+ * </dl>
+ */
+class ListCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(ListCmd.class.getName());
+ private String _alias;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+ private boolean rfc;
+ private boolean all;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param alias the alias to use. */
+ public void setAlias(String alias)
+ {
+ this._alias = alias;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ /**
+ * @param flag whether to use, or not, RFC-1421 format when listing the
+ * certificate(s).
+ */
+ public void setRfc(String flag)
+ {
+ this.rfc = Boolean.valueOf(flag).booleanValue();
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-alias".equals(opt)) // -alias ALIAS //$NON-NLS-1$
+ _alias = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE //$NON-NLS-1$
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL //$NON-NLS-1$
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD //$NON-NLS-1$
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME //$NON-NLS-1$
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt)) //$NON-NLS-1$
+ verbose = true;
+ else if ("-rfc".equals(opt)) //$NON-NLS-1$
+ rfc = true;
+ else
+ break;
+ }
+
+ all = _alias == null;
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setOutputStreamParam(null); // use stdout
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ if (! all)
+ setAliasParam(_alias);
+
+ if (verbose & rfc)
+ {
+ log.warning("Both -v and -rfc options were found on the command line. " //$NON-NLS-1$
+ + "Only the former will be considered"); //$NON-NLS-1$
+ rfc = false;
+ }
+
+ log.finer("-list handler will use the following options:"); //$NON-NLS-1$
+ log.finer(" -alias=" + alias); //$NON-NLS-1$
+ log.finer(" -storetype=" + storeType); //$NON-NLS-1$
+ log.finer(" -keystore=" + storeURL); //$NON-NLS-1$
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars)); //$NON-NLS-1$
+ log.finer(" -provider=" + provider); //$NON-NLS-1$
+ log.finer(" -v=" + verbose); //$NON-NLS-1$
+ log.finer(" -rfc=" + rfc); //$NON-NLS-1$
+ }
+
+ void start() throws KeyStoreException, CertificateEncodingException,
+ IOException
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ PrintWriter writer = new PrintWriter(outStream, true);
+ writer.println(Messages.getFormattedString("ListCmd.21", store.getType())); //$NON-NLS-1$
+ writer.println(Messages.getFormattedString("ListCmd.22", //$NON-NLS-1$
+ store.getProvider().getName()));
+ if (all)
+ {
+ log.finest("About to list all aliases in key store..."); //$NON-NLS-1$
+ writer.println();
+ writer.println(Messages.getFormattedString("ListCmd.24", //$NON-NLS-1$
+ Integer.valueOf(store.size())));
+ for (Enumeration e = store.aliases(); e.hasMoreElements(); )
+ {
+ String anAlias = (String) e.nextElement();
+ if (anAlias != null)
+ list1Alias(anAlias, writer);
+ }
+ }
+ else
+ list1Alias(alias, writer);
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ // own methods --------------------------------------------------------------
+
+ /**
+ * Prints the certificate(s) associated with the designated alias.
+ *
+ * @param anAlias a non-null string denoting an alias in the key-store.
+ * @param writer where to print.
+ * @throws KeyStoreException if an exception occurs while obtaining the
+ * certificate associated to the designated alias.
+ * @throws CertificateEncodingException if an exception occurs while obtaining
+ * the DER encoded form of the certificate.
+ * @throws IOException if an I/O related exception occurs during the process.
+ */
+ private void list1Alias(String anAlias, PrintWriter writer)
+ throws KeyStoreException, CertificateEncodingException, IOException
+ {
+ log.entering(this.getClass().getName(), "list1Alias", anAlias); //$NON-NLS-1$
+
+ writer.println();
+ writer.println(Messages.getFormattedString("ListCmd.30", anAlias)); //$NON-NLS-1$
+ writer.println(Messages.getFormattedString("ListCmd.31", store.getCreationDate(anAlias))); //$NON-NLS-1$
+
+ if (store.isCertificateEntry(anAlias))
+ {
+ writer.println(Messages.getString("ListCmd.32")); //$NON-NLS-1$
+ Certificate certificate = store.getCertificate(anAlias);
+ print1Certificate(certificate, writer);
+ }
+ else if (store.isKeyEntry(anAlias))
+ {
+ writer.println(Messages.getString("ListCmd.33")); //$NON-NLS-1$
+ Certificate[] chain = store.getCertificateChain(anAlias);
+ print1Chain(chain, writer);
+ }
+ else
+ throw new IllegalArgumentException(Messages.getFormattedString("ListCmd.34", //$NON-NLS-1$
+ anAlias));
+ log.exiting(this.getClass().getName(), "list1Alias"); //$NON-NLS-1$
+ }
+
+ /**
+ * Prints the designated certificate chain, or a fingerprint of the first
+ * certificate (bottom) in the chain, depending on the values of the flags
+ * <code>v</code> (for verbose) and <code>rfc</code>.
+ * <p>
+ * If both flags are <code>false</code>, only the fingerprint is generated,
+ * otherwise, if the <code>v</code> flag is set, then a human readable output
+ * is generated. If <code>rfc</code> is set, then an RFC-1421 like output
+ * is generated.
+ * <p>Note that both <code>v</code> and <code>rfc</code> cannot both be
+ * <code>true</code> at the same time.
+ *
+ * @param chain the certificate chain to process.
+ * @param writer where to print.
+ * @throws CertificateEncodingException if an exception occurs while obtaining
+ * the DER encoded form of the certificate.
+ */
+ private void print1Chain(Certificate[] chain, PrintWriter writer)
+ throws CertificateEncodingException
+ {
+ if (!verbose && !rfc)
+ fingerprint(chain[0], writer);
+ else
+ {
+ int limit = chain.length;
+ writer.println(Messages.getFormattedString("ListCmd.38", //$NON-NLS-1$
+ Integer.valueOf(limit)));
+ writer.println(Messages.getString("ListCmd.39")); //$NON-NLS-1$
+ print1Certificate(chain[0], writer);
+ for (int i = 1; i < limit; i++)
+ {
+ writer.println();
+ writer.println(Messages.getFormattedString("ListCmd.40", //$NON-NLS-1$
+ Integer.valueOf(i + 1)));
+ print1Certificate(chain[i], writer);
+ }
+ writer.println();
+ writer.println(Messages.getString("ListCmd.42")); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Prints the designated certificate, or its fingerprint, depending on the
+ * values of the flags <code>v</code> (for verbose) and <code>rfc</code>.
+ * <p>
+ * If both flags are <code>false</code>, only a fingerprint is generated,
+ * otherwise, if the <code>v</code> flag is set, then a human readable output
+ * is generated. If <code>rfc</code> is set, then an RFC-1421 like output
+ * is generated.
+ * <p>Note that both <code>v</code> and <code>rfc</code> cannot both be
+ * <code>true</code> at the same time.
+ *
+ * @param certificate the certificate to process.
+ * @param writer where to print.
+ * @throws CertificateEncodingException if an exception occurs while obtaining
+ * the DER encoded form of the certificate.
+ */
+ private void print1Certificate(Certificate certificate, PrintWriter writer)
+ throws CertificateEncodingException
+ {
+ if (verbose)
+ printVerbose(certificate, writer);
+ else if (rfc)
+ printRFC1421(certificate, writer);
+ else
+ fingerprint(certificate, writer);
+ }
+
+ private void printRFC1421(Certificate certificate, PrintWriter writer)
+ throws CertificateEncodingException
+ {
+ byte[] derBytes = certificate.getEncoded();
+ String encoded = Base64.encode(derBytes, 0, derBytes.length, true);
+ writer.println(Messages.getString("ListCmd.43")); //$NON-NLS-1$
+ writer.println(encoded);
+ writer.println(Messages.getString("ListCmd.44")); //$NON-NLS-1$
+ }
+
+ private void fingerprint(Certificate certificate, PrintWriter writer)
+ throws CertificateEncodingException
+ {
+ byte[] derBytes = certificate.getEncoded();
+ String fingerPrint = digestWithMD5(derBytes);
+ writer.println(Messages.getFormattedString("ListCmd.45", fingerPrint)); //$NON-NLS-1$
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/Main.java b/tools/gnu/classpath/tools/keytool/Main.java
new file mode 100644
index 000000000..fb7aa4509
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/Main.java
@@ -0,0 +1,219 @@
+/* Main.java -- Implementation of the keytool security tool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.classpath.tools.HelpPrinter;
+import gnu.classpath.tools.common.ProviderUtil;
+import gnu.java.security.Registry;
+import gnu.javax.crypto.jce.GnuCrypto;
+import gnu.javax.security.auth.callback.GnuCallbacks;
+
+import java.util.logging.Logger;
+
+/**
+ * The GNU Classpath implementation of the keytool security tool.
+ * <p>
+ * Except for the <code>-identitydb</code> command, available for importing
+ * JDK 1.1 <i>identities</i> into a key store, this implementation is intended
+ * to be compatible with the behaviour described in the public documentation of
+ * the same tool included in JDK 1.4.
+ */
+public class Main
+{
+ private static final Logger log = Logger.getLogger(Main.class.getName());
+ /** The relative file path to the command tool's help text. */
+ private static final String HELP_PATH = "keytool/keytool.txt"; //$NON-NLS-1$
+ /** The Preferences key name for the last issued certificate serial nbr. */
+ static final String LAST_SERIAL_NUMBER = "lastSerialNumber"; //$NON-NLS-1$
+ /** Constant denoting the X.509 certificate type. */
+ static final String X_509 = "X.509"; //$NON-NLS-1$
+
+ /** Whether we have already printed the help text or not. */
+ private boolean helpPrinted;
+ /** The new position of GnuCRYPTO provider if it is not already installed. */
+ private int gnuCryptoProviderNdx = -2;
+ /** The new position of GNU Callbacks provider if it is not already installed. */
+ private int gnuCallbacksNdx = -2;
+
+ private Main()
+ {
+ super();
+ }
+
+ public static final void main(String[] args)
+ {
+ log.entering(Main.class.getName(), "main", args); //$NON-NLS-1$
+
+ Main tool = new Main();
+ try
+ {
+ tool.setup();
+ tool.start(args);
+ }
+ catch (SecurityException x)
+ {
+ log.throwing(Main.class.getName(), "main", x); //$NON-NLS-1$
+ System.err.println(Messages.getString("Main.6") + x.getMessage()); //$NON-NLS-1$
+ }
+ catch (Exception x)
+ {
+ log.throwing(Main.class.getName(), "main", x); //$NON-NLS-1$
+ System.err.println(Messages.getString("Main.8") + x); //$NON-NLS-1$
+ }
+ finally
+ {
+ tool.teardown();
+ }
+
+ log.exiting(Main.class.getName(), "main"); //$NON-NLS-1$
+ // System.exit(0);
+ }
+
+ // helper methods -----------------------------------------------------------
+
+ private void start(String[] args) throws Exception
+ {
+ log.entering(this.getClass().getName(), "start", args); //$NON-NLS-1$
+
+ if (args == null)
+ args = new String[0];
+
+ int limit = args.length;
+ log.finest("args.length=" + limit); //$NON-NLS-1$
+ int i = 0;
+ String opt;
+ Command cmd;
+ while (i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ cmd = null;
+ if ("-genkey".equals(opt)) //$NON-NLS-1$
+ cmd = new GenKeyCmd();
+ else if ("-import".equals(opt)) //$NON-NLS-1$
+ cmd = new ImportCmd();
+ else if ("-selfcert".equals(opt)) //$NON-NLS-1$
+ cmd = new SelfCertCmd();
+ else if ("-identitydb".equals(opt)) //$NON-NLS-1$
+ cmd = new IdentityDBCmd();
+ else if ("-certreq".equals(opt)) //$NON-NLS-1$
+ cmd = new CertReqCmd();
+ else if ("-export".equals(opt)) //$NON-NLS-1$
+ cmd = new ExportCmd();
+ else if ("-list".equals(opt)) //$NON-NLS-1$
+ cmd = new ListCmd();
+ else if ("-printcert".equals(opt)) //$NON-NLS-1$
+ cmd = new PrintCertCmd();
+ else if ("-keyclone".equals(opt)) //$NON-NLS-1$
+ cmd = new KeyCloneCmd();
+ else if ("-storepasswd".equals(opt)) //$NON-NLS-1$
+ cmd = new StorePasswdCmd();
+ else if ("-keypasswd".equals(opt)) //$NON-NLS-1$
+ cmd = new KeyPasswdCmd();
+ else if ("-delete".equals(opt)) //$NON-NLS-1$
+ cmd = new DeleteCmd();
+ else if ("-help".equals(opt)) //$NON-NLS-1$
+ {
+ printHelp();
+ i++;
+ }
+ else
+ {
+ log.fine("Unknown command [" + opt + "] at index #" + i //$NON-NLS-1$ //$NON-NLS-2$
+ + ". Arguments from that token onward will be ignored"); //$NON-NLS-1$
+ break;
+ }
+
+ if (cmd != null)
+ {
+ i = cmd.processArgs(args, i);
+ cmd.doCommand();
+ }
+ }
+
+ // the -help command is the default; i.e.
+ // keytool
+ // is equivalent to:
+ // keytool -help
+ if (i == 0)
+ printHelp();
+
+ if (i < limit) // more options than needed
+ log.fine("Last recognized argument is assumed at index #" + (i - 1) //$NON-NLS-1$
+ + ". Remaining arguments (" + args[i] + "...) will be ignored"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ log.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ private void setup()
+ {
+ log.entering(this.getClass().getName(), "setup"); //$NON-NLS-1$
+
+ gnuCryptoProviderNdx = ProviderUtil.addProvider(new GnuCrypto());
+ gnuCallbacksNdx = ProviderUtil.addProvider(new GnuCallbacks());
+
+ log.exiting(this.getClass().getName(), "setup"); //$NON-NLS-1$
+ }
+
+ private void teardown()
+ {
+ log.entering(this.getClass().getName(), "teardown"); //$NON-NLS-1$
+
+ // if we added our own providers remove them
+ if (gnuCryptoProviderNdx > 0)
+ ProviderUtil.removeProvider(Registry.GNU_CRYPTO);
+
+ if (gnuCallbacksNdx > 0)
+ ProviderUtil.removeProvider("GNU-CALLBACKS"); //$NON-NLS-1$
+
+ log.exiting(this.getClass().getName(), "teardown"); //$NON-NLS-1$
+ }
+
+ private void printHelp()
+ {
+ if (helpPrinted)
+ return;
+
+ HelpPrinter.printHelp(HELP_PATH);
+ helpPrinted = true;
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/Messages.java b/tools/gnu/classpath/tools/keytool/Messages.java
new file mode 100644
index 000000000..e3308e021
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/Messages.java
@@ -0,0 +1,115 @@
+/* Messages.java -- I18N related helper class
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.logging.Logger;
+
+/**
+ * An initially generated Eclipse helper class to ease the use of localized
+ * messages.
+ * <p>
+ * Enriched to handle localized message formats.
+ */
+class Messages
+{
+ private static final Logger log = Logger.getLogger(Messages.class.getName());
+ private static final String BUNDLE_NAME = "gnu.classpath.tools.keytool.MessageBundle"; //$NON-NLS-1$
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+ private static final Map CACHED_FORMATS = new HashMap(5);
+
+ private Messages()
+ {
+ super();
+ }
+
+ public static String getString(String key)
+ {
+ try
+ {
+ return RESOURCE_BUNDLE.getString(key);
+ }
+ catch (MissingResourceException e)
+ {
+ return constructMessage(key, null);
+ }
+ }
+
+ public static String getFormattedString(String key, Object args)
+ {
+ MessageFormat mf = (MessageFormat) CACHED_FORMATS.get(key);
+ if (mf == null)
+ {
+ String formatString = getString(key);
+ if (formatString.startsWith("!"))
+ return constructMessage(key, args);
+
+ mf = new MessageFormat(formatString);
+ CACHED_FORMATS.put(key, mf);
+ }
+
+ // if the argument is not an array, then build one consisiting of the
+ // sole argument before passing it to the format() method
+ try
+ {
+ if (args instanceof Object[])
+ return mf.format(args);
+
+ return mf.format(new Object[] { args });
+ }
+ catch (IllegalArgumentException x)
+ {
+ log.fine("Exception while rendering a message format keyed by ["
+ + key + "]: " + mf.toPattern());
+ return constructMessage(mf.toPattern(), args);
+ }
+ }
+
+ private static final String constructMessage(String m, Object args)
+ {
+ if (args == null)
+ return '!' + m + '!';
+
+ return '!' + m + '!' + String.valueOf(args) + '!';
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/PrintCertCmd.java b/tools/gnu/classpath/tools/keytool/PrintCertCmd.java
new file mode 100644
index 000000000..9ba1d5970
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/PrintCertCmd.java
@@ -0,0 +1,123 @@
+/* PrintCertCmd.java -- The printcert command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import java.io.PrintWriter;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.util.logging.Logger;
+
+/**
+ * The <b>-printcert</b> keytool command handler is used to read a certificate
+ * from a designated file, and print its contents in a human-readable format.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-file FILE_NAME</dt>
+ * <dd>The fully qualified path of the file to read the certificate from.
+ * If this option is omitted, the tool will process STDIN.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.</dd>
+ * </dl>
+ */
+class PrintCertCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(PrintCertCmd.class.getName());
+ private String _certFileName;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param pathName the fully qualified path name of the file to process. */
+ public void setFile(String pathName)
+ {
+ this._certFileName = pathName;
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt);
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-file".equals(opt)) // -file FILE_NAME
+ _certFileName = args[++i];
+ else if ("-v".equals(opt))
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setInputStreamParam(_certFileName);
+
+ log.finer("-printcert handler will use the following options:");
+ log.finer(" -file=" + _certFileName);
+ log.finer(" -v=" + verbose);
+ }
+
+ void start() throws CertificateException
+ {
+ log.entering(getClass().getName(), "start");
+
+ CertificateFactory x509Factory = CertificateFactory.getInstance(Main.X_509);
+ Certificate certificate = x509Factory.generateCertificate(inStream);
+ PrintWriter writer = new PrintWriter(System.out, true);
+ writer.println();
+ printVerbose(certificate, writer);
+
+ log.exiting(getClass().getName(), "start");
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/SelfCertCmd.java b/tools/gnu/classpath/tools/keytool/SelfCertCmd.java
new file mode 100644
index 000000000..db7d45994
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/SelfCertCmd.java
@@ -0,0 +1,371 @@
+/* SelfCertCmd.java -- The selfcert command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.java.security.x509.X500DistinguishedName;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SignatureException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.x500.X500Principal;
+
+/**
+ * The <b>-selfcert</b> keytool command handler is used to generate a self-
+ * signed X.509 version 1 certificate using key store credentials stored under a
+ * designated alias.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-alias ALIAS</dt>
+ * <dd>Every entry, be it a <i>Key Entry</i> or a <i>Trusted
+ * Certificate</i>, in a key store is uniquely identified by a user-defined
+ * <i>Alias</i> string. Use this option to specify the <i>Alias</i> to use
+ * when referring to an entry in the key store. Unless specified otherwise,
+ * a default value of <code>mykey</code> shall be used when this option is
+ * omitted from the command line.
+ * <p></dd>
+ *
+ * <dt>-sigalg ALGORITHM</dt>
+ * <dd>The canonical name of the digital signature algorithm to use for
+ * signing the certificate. If this option is omitted, a default value will
+ * be chosen based on the type of the private key associated with the
+ * designated <i>Alias</i>. If the private key is a <code>DSA</code> one,
+ * the value for the signature algorithm will be <code>SHA1withDSA</code>.
+ * If on the other hand the private key is an <code>RSA</code> one, then
+ * the tool will use <code>MD5withRSA</code> as the signature algorithm.
+ * <p></dd>
+ *
+ * <dt>-dname NAME</dt>
+ * <dd>Use this option to specify the <i>Distinguished Name</i> of the
+ * newly generated self-signed certificate. If this option is omitted, the
+ * existing <i>Distinguished Name</i> of the base certificate in the chain
+ * associated with the designated <i>Alias</i> will be used instead.
+ * <p>
+ * The syntax of a valid value for this option MUST follow RFC-2253
+ * specifications. Namely the following components (with their accepted
+ * meaning) will be recognized. Note that the component name is case-
+ * insensitive:
+ * <dl>
+ * <dt>CN</dt>
+ * <dd>The Common Name; e.g. "host.domain.com"</dd>
+ *
+ * <dt>OU</dt>
+ * <dd>The Organizational Unit; e.g. "IT Department"</dd>
+ *
+ * <dt>O</dt>
+ * <dd>The Organization Name; e.g. "The Sample Company"</dd>
+ *
+ * <dt>L</dt>
+ * <dd>The Locality Name; e.g. "Sydney"</dd>
+ *
+ * <dt>ST</dt>
+ * <dd>The State Name; e.g. "New South Wales"</dd>
+ *
+ * <dt>C</dt>
+ * <dd>The 2-letter Country identifier; e.g. "AU"</dd>
+ * </dl>
+ * <p>
+ * When specified with a <code>-dname</code> option, each pair of component
+ * / value will be separated from the other with a comma. Each component
+ * and value pair MUST be separated by an equal sign. For example, the
+ * following is a valid DN value:
+ * <pre>
+ * CN=host.domain.com, O=The Sample Company, L=Sydney, ST=NSW, C=AU
+ * </pre>
+ * <p></dd>
+ *
+ * <dt>-validity DAY_COUNT</dt>
+ *
+ * <dt>-keypass PASSWORD</dt>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.</dd>
+ * </dl>
+ */
+class SelfCertCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(SelfCertCmd.class.getName());
+ private String _alias;
+ private String _sigAlgorithm;
+ private String _dName;
+ private String _password;
+ private String _validityStr;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+ private X500DistinguishedName distinguishedName;
+ private int validityInDays;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param alias the alias to use. */
+ public void setAlias(String alias)
+ {
+ this._alias = alias;
+ }
+
+ /**
+ * @param algorithm the canonical name of the digital signature algorithm to
+ * use.
+ */
+ public void setSigalg(String algorithm)
+ {
+ this._sigAlgorithm = algorithm;
+ }
+
+ /**
+ * @param name the distiniguished name of both the issuer and subject (since
+ * we are dealing with a self-signed certificate) to use.
+ */
+ public void setDname(String name)
+ {
+ this._dName = name;
+ }
+
+ /**
+ * @param days the string representation of the number of days (a decimal,
+ * positive integer) to assign to the generated (self-signed)
+ * certificate.
+ */
+ public void setValidity(String days)
+ {
+ this._validityStr = days;
+ }
+
+ /** @param password the (private) key password to use. */
+ public void setKeypass(String password)
+ {
+ this._password = password;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt);
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-alias".equals(opt)) // -alias ALIAS
+ _alias = args[++i];
+ else if ("-sigalg".equals(opt)) // -sigalg ALGORITHM
+ _sigAlgorithm = args[++i];
+ else if ("-dname".equals(opt)) // -dname NAME
+ _dName = args[++i];
+ else if ("-keypass".equals(opt)) // -keypass PASSWORD
+ _password = args[++i];
+ else if ("-validity".equals(opt)) // -validity DAY_COUNT
+ _validityStr = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt))
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ setAliasParam(_alias);
+ setKeyPasswordNoPrompt(_password);
+// setDName(_dName);
+ setValidityParam(_validityStr);
+// setSignatureAlgorithm(_sigAlgorithm);
+
+ log.finer("-selfcert handler will use the following options:");
+ log.finer(" -alias=" + alias);
+ log.finer(" -sigalg=" + _sigAlgorithm);
+ log.finer(" -dname=" + _dName);
+ log.finer(" -keypass=" + _password);
+ log.finer(" -validity=" + validityInDays);
+ log.finer(" -storetype=" + storeType);
+ log.finer(" -keystore=" + storeURL);
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars));
+ log.finer(" -provider=" + provider);
+ log.finer(" -v=" + verbose);
+ }
+
+ void start() throws KeyStoreException, NoSuchAlgorithmException,
+ UnrecoverableKeyException, IOException, UnsupportedCallbackException,
+ InvalidKeyException, SignatureException, CertificateException
+ {
+ log.entering(getClass().getName(), "start");
+
+ // 1. get the key entry and certificate chain associated to alias
+ Key privateKey = getAliasPrivateKey();
+ Certificate[] chain = store.getCertificateChain(alias);
+
+ // 2. if the user has not supplied a DN use one from the certificate chain
+ X509Certificate bottomCertificate = (X509Certificate) chain[0];
+ X500Principal defaultPrincipal = bottomCertificate.getIssuerX500Principal();
+ setDName(_dName, defaultPrincipal);
+
+ // 4. get alias's public key from certificate's SubjectPublicKeyInfo
+ PublicKey publicKey = bottomCertificate.getPublicKey();
+
+ // 5. issue the self-signed certificate
+ setSignatureAlgorithmParam(_sigAlgorithm, privateKey);
+
+ byte[] derBytes = getSelfSignedCertificate(distinguishedName,
+ publicKey,
+ (PrivateKey) privateKey);
+ CertificateFactory x509Factory = CertificateFactory.getInstance("X.509");
+ ByteArrayInputStream bais = new ByteArrayInputStream(derBytes);
+ Certificate certificate = x509Factory.generateCertificate(bais);
+
+ // 6. store it, w/ its private key, associating them to alias
+ chain = new Certificate[] { certificate };
+ store.setKeyEntry(alias, privateKey, keyPasswordChars, chain);
+
+ // 7. persist the key store
+ saveKeyStore();
+
+ log.exiting(getClass().getName(), "start");
+ }
+
+ // own methods --------------------------------------------------------------
+
+ private void setDName(String name, X500Principal defaultName)
+ {
+ if (name != null && name.trim().length() > 0)
+ name = name.trim();
+ else
+ {
+ // If dname is supplied at the command line, it is used as the X.500
+ // Distinguished Name for both the issuer and subject of the certificate.
+ // Otherwise, the X.500 Distinguished Name associated with alias (at the
+ // bottom of its existing certificate chain) is used.
+ name = defaultName.toString().trim();
+ }
+
+ distinguishedName = new X500DistinguishedName(name);
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/StorePasswdCmd.java b/tools/gnu/classpath/tools/keytool/StorePasswdCmd.java
new file mode 100644
index 000000000..1eb053c1c
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/StorePasswdCmd.java
@@ -0,0 +1,275 @@
+/* StorePasswdCmd.java -- The storepasswd command handler of the keytool
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.keytool;
+
+import gnu.classpath.SystemProperties;
+
+import java.io.IOException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.util.Arrays;
+import java.util.logging.Logger;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.TextOutputCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+
+/**
+ * The <b>-storepasswd</b> keytool command handler is used to change the
+ * password which protects the integrity of the key store.
+ * <p>
+ * Possible options for this command are:
+ * <p>
+ * <dl>
+ * <dt>-new PASSWORD</dt>
+ * <dd>The new, and different, password which will be used to protect the
+ * designated key store.
+ * <p></dd>
+ *
+ * <dt>-storetype STORE_TYP}</dt>
+ * <dd>Use this option to specify the type of the key store to use. The
+ * default value, if this option is omitted, is that of the property
+ * <code>keystore.type</code> in the security properties file, which is
+ * obtained by invoking the {@link java.security.KeyStore#getDefaultType()}
+ * static method.
+ * <p></dd>
+ *
+ * <dt>-keystore URL</dt>
+ * <dd>Use this option to specify the location of the key store to use.
+ * The default value is a file {@link java.net.URL} referencing the file
+ * named <code>.keystore</code> located in the path returned by the call to
+ * {@link java.lang.System#getProperty(String)} using <code>user.home</code>
+ * as argument.
+ * <p>
+ * If a URL was specified, but was found to be malformed --e.g. missing
+ * protocol element-- the tool will attempt to use the URL value as a file-
+ * name (with absolute or relative path-name) of a key store --as if the
+ * protocol was <code>file:</code>.
+ * <p></dd>
+ *
+ * <dt>-storepass PASSWORD</dt>
+ * <dd>Use this option to specify the password protecting the key store. If
+ * this option is omitted from the command line, you will be prompted to
+ * provide a password.
+ * <p></dd>
+ *
+ * <dt>-provider PROVIDER_CLASS_NAME</dt>
+ * <dd>A fully qualified class name of a Security Provider to add to the
+ * current list of Security Providers already installed in the JVM in-use.
+ * If a provider class is specified with this option, and was successfully
+ * added to the runtime --i.e. it was not already installed-- then the tool
+ * will attempt to removed this Security Provider before exiting.
+ * <p></dd>
+ *
+ * <dt>-v</dt>
+ * <dd>Use this option to enable more verbose output.</dd>
+ * </dl>
+ */
+class StorePasswdCmd extends Command
+{
+ private static final Logger log = Logger.getLogger(StorePasswdCmd.class.getName());
+ private String _newPassword;
+ private String _ksType;
+ private String _ksURL;
+ private String _ksPassword;
+ private String _providerClassName;
+ private char[] newStorePasswordChars;
+
+ // default 0-arguments constructor
+
+ // public setters -----------------------------------------------------------
+
+ /** @param password the new key-store password to use. */
+ public void setNew(String password)
+ {
+ this._newPassword = password;
+ }
+
+ /** @param type the key-store type to use. */
+ public void setStoretype(String type)
+ {
+ this._ksType = type;
+ }
+
+ /** @param url the key-store URL to use. */
+ public void setKeystore(String url)
+ {
+ this._ksURL = url;
+ }
+
+ /** @param password the key-store password to use. */
+ public void setStorepass(String password)
+ {
+ this._ksPassword = password;
+ }
+
+ /** @param className a security provider fully qualified class name to use. */
+ public void setProvider(String className)
+ {
+ this._providerClassName = className;
+ }
+
+ // life-cycle methods -------------------------------------------------------
+
+ int processArgs(String[] args, int i)
+ {
+ int limit = args.length;
+ String opt;
+ while (++i < limit)
+ {
+ opt = args[i];
+ log.finest("args[" + i + "]=" + opt); //$NON-NLS-1$ //$NON-NLS-2$
+ if (opt == null || opt.length() == 0)
+ continue;
+
+ if ("-new".equals(opt)) // -new PASSWORD //$NON-NLS-1$
+ _newPassword = args[++i];
+ else if ("-storetype".equals(opt)) // -storetype STORE_TYPE //$NON-NLS-1$
+ _ksType = args[++i];
+ else if ("-keystore".equals(opt)) // -keystore URL //$NON-NLS-1$
+ _ksURL = args[++i];
+ else if ("-storepass".equals(opt)) // -storepass PASSWORD //$NON-NLS-1$
+ _ksPassword = args[++i];
+ else if ("-provider".equals(opt)) // -provider PROVIDER_CLASS_NAME //$NON-NLS-1$
+ _providerClassName = args[++i];
+ else if ("-v".equals(opt)) //$NON-NLS-1$
+ verbose = true;
+ else
+ break;
+ }
+
+ return i;
+ }
+
+ void setup() throws Exception
+ {
+ setKeyStoreParams(_providerClassName, _ksType, _ksPassword, _ksURL);
+ setNewKeystorePassword(_newPassword);
+
+ log.finer("-storepasswd handler will use the following options:"); //$NON-NLS-1$
+ log.finer(" -new=" + String.valueOf(newStorePasswordChars)); //$NON-NLS-1$
+ log.finer(" -storetype=" + storeType); //$NON-NLS-1$
+ log.finer(" -keystore=" + storeURL); //$NON-NLS-1$
+ log.finer(" -storepass=" + String.valueOf(storePasswordChars)); //$NON-NLS-1$
+ log.finer(" -provider=" + provider); //$NON-NLS-1$
+ log.finer(" -v=" + verbose); //$NON-NLS-1$
+ }
+
+ void start() throws KeyStoreException, NoSuchAlgorithmException,
+ CertificateException, IOException
+ {
+ log.entering(this.getClass().getName(), "start"); //$NON-NLS-1$
+
+ saveKeyStore(newStorePasswordChars);
+
+ log.exiting(getClass().getName(), "start"); //$NON-NLS-1$
+ }
+
+ // own methods --------------------------------------------------------------
+
+ protected void setNewKeystorePassword(String password) throws IOException,
+ UnsupportedCallbackException
+ {
+ if (password != null)
+ newStorePasswordChars = password.toCharArray();
+ else
+ {
+ boolean ok = false;
+ Callback[] prompts = new Callback[1];
+ Callback[] errors = new Callback[1];
+ for (int i = 0; i < 3; i++)
+ if (prompt4NewPassword(getCallbackHandler(), prompts, errors))
+ {
+ ok = true;
+ break;
+ }
+ if (! ok)
+ throw new SecurityException(Messages.getString("StorePasswdCmd.19")); //$NON-NLS-1$
+ }
+ }
+
+ private boolean prompt4NewPassword(CallbackHandler handler,
+ Callback[] prompts, Callback[] errors)
+ throws IOException, UnsupportedCallbackException
+ {
+ // prompt user (1st time) to provide one
+ String p = Messages.getString("StorePasswdCmd.20"); //$NON-NLS-1$
+ PasswordCallback pcb = new PasswordCallback(p, false);
+ prompts[0] = pcb;
+ handler.handle(prompts);
+ char[] pwd1 = pcb.getPassword();
+ pcb.clearPassword();
+ String ls = SystemProperties.getProperty("line.separator"); //$NON-NLS-1$
+ if (pwd1 == null || pwd1.length < 6)
+ {
+ String m = Messages.getString("StorePasswdCmd.21") + ls; //$NON-NLS-1$
+ errors[0] = new TextOutputCallback(TextOutputCallback.ERROR, m);
+ handler.handle(errors);
+ return false;
+ }
+
+ if (Arrays.equals(storePasswordChars, pwd1))
+ {
+ String m = Messages.getString("StorePasswdCmd.22") + ls; //$NON-NLS-1$
+ errors[0] = new TextOutputCallback(TextOutputCallback.ERROR, m);
+ handler.handle(errors);
+ return false;
+ }
+
+ // prompt user (2nd time) for confirmation
+ pcb = new PasswordCallback(Messages.getString("StorePasswdCmd.23"), false); //$NON-NLS-1$
+ prompts[0] = pcb;
+ handler.handle(prompts);
+ char[] pwd2 = pcb.getPassword();
+ pcb.clearPassword();
+ if (! Arrays.equals(pwd1, pwd2))
+ {
+ String m = Messages.getString("StorePasswdCmd.24") + ls; //$NON-NLS-1$
+ errors[0] = new TextOutputCallback(TextOutputCallback.ERROR, m);
+ handler.handle(errors);
+ return false;
+ }
+
+ newStorePasswordChars = pwd2;
+ return true;
+ }
+}
diff --git a/tools/gnu/classpath/tools/keytool/keytool.txt b/tools/gnu/classpath/tools/keytool/keytool.txt
new file mode 100644
index 000000000..15f9b96f9
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/keytool.txt
@@ -0,0 +1,616 @@
+NAME
+ keytool - manage private keys and public certificates
+
+SYNOPSIS
+ keytool [COMMAND]...
+
+DESCRIPTION
+ A Java-based tool for managing both Key Entries as well as Trusted
+ Certificates.
+
+ Multiple COMMANDs may be specified at once, each complete with its own
+ options. keytool will parse all the arguments, before processing, and
+ executing, each COMMAND. If an exception occurs while executing one
+ COMMAND keytool will abort.
+
+ A COMMAND can be one of the followings:
+
+ -genkey [OPTION]...
+ Generate a new Key Entry, eventually creating a new key store.
+
+ -import [OPTION]...
+ Add, to a key store, Key Entries (private keys and certificate
+ chains authenticating the public keys) and Trusted Certificates
+ (3rd party certificates which can be used as Trust anchors when
+ building chains-of-trust).
+
+ -selfcert [OPTION]...
+ Generate a new self-signed Trusted Certificate.
+
+ -identitydb [OPTION]...
+ NOT IMPLEMENTED YET.
+ Import a JDK 1.1 style Identity Database.
+
+ -certreq [OPTION]...
+ Issue a Certificate Signing Request (CSR) which can be then sent
+ to a Certification Authority (CA) to issue a certificate signed
+ (by the CA) and authenticating the Subject of the request.
+
+ -export [OPTION]...
+ Export a Certificate from a key store.
+
+ -list [OPTION]...
+ Print one or all Certificates in a key store to STDOUT.
+
+ -printcert [OPTION]...
+ Print a human-readable form of a Certificate in a designated
+ file to STDOUT.
+
+ -keyclone [OPTION]...
+ Clone a Key Entry in a key store.
+
+ -storepasswd [OPTION]...
+ Change the password protecting a key store.
+
+ -keypasswd [OPTION]...
+ Change the password protecting a Key Entry in a key store.
+
+ -delete [OPTION]...
+ Delete a Key Entry or a Trusted Certificate from a key store.
+
+ -help Display this text.
+
+OPTIONS COMMON TO MORE THAN ONE COMMAND
+ The following OPTIONs are used in more than one COMMAND. They are
+ described here to reduce redundancy.
+
+ -alias ALIAS
+ Every entry, be it a Key Entry or a Trusted Certificate, in a
+ key store is uniquely identified by a user-defined Alias string.
+ Use this option to specify the Alias to use when referring to an
+ entry in the key store. Unless specified otherwise, a default
+ value of "mykey" (all lower case, without the enclosing quotes)
+ shall be used when this option is omitted from the command line.
+
+ -keyalg ALGORITHM
+ Use this option to specify the canonical name of the key-pair
+ generation algorithm. The default value for this option is
+ "DSS" (a synonym for the Digital Signature Algorithm also known
+ as DSA).
+
+ -keysize SIZE
+ Use this option to specify the number of bits of the shared
+ modulus (for both the public and private keys) to use when
+ generating new keys. A default value of 1024 will be used if
+ this option is omitted from the command line.
+
+ -validity DAY_COUNT
+ Use this option to specify the number of days a newly generated
+ certificate will be valid for. The default value is 90 (days)
+ if this option is omitted from the command line.
+
+ -storetype STORE_TYPE
+ Use this option to specify the type of the key store to use.
+ The default value, if this option is omitted, is that of the
+ property "keystore.type" in the security properties file, which
+ is obtained by invoking the static method call getDefaultType()
+ in java.security.KeyStore.
+
+ -storepass PASSWORD
+ Use this option to specify the password protecting the key
+ store. If this option is omitted from the command line, you
+ will be prompted to provide a password.
+
+ -keystore URL
+ Use this option to specify the location of the key store to use.
+ The default value is a file URL referencing the file named
+ ".keystore" (all lower case and without the enclosing quotes)
+ located in the path returned by the call to
+ java.lang.System#getProperty(String) using "user.home" as
+ argument.
+
+ If a URL was specified, but was found to be malformed --e.g.
+ missing protocol element-- the tool will attempt to use the URL
+ value as a file-name (with absolute or relative path-name) of a
+ key store --as if the protocol was "file:".
+
+ -provider PROVIDER_CLASS_NAME
+ A fully qualified class name of a Security Provider to add to
+ the current list of Security Providers already installed in the
+ JVM in-use. If a provider class is specified with this option,
+ and was successfully added to the runtime --i.e. it was not
+ already installed-- then the tool will attempt to remove this
+ Security Provider before exiting.
+
+ -file FILE_NAME
+ Use this option to designate a file to use with a command. When
+ specified with this option, the value is expected to be the
+ fully qualified path of a file accessible by the File System.
+ Depending on the command, the file may be used as input or as
+ output. When this option is omitted from the command line,
+ STDIN will be used instead, as the source of input, and STDOUT
+ will be used instead as the output destination.
+
+ -v Unless specified otherwise, use this option to enable more
+ verbose output.
+
+X.500 DISTINGUISHED NAME
+ A Distinguished Name (or DN) MUST be supplied with some of the COMMANDs
+ using a -dname option. The syntax of a valid value for this option MUST
+ follow RFC-2253 specifications. Namely the following components (with
+ their accepted meaning) will be recognized. Note that the component
+ name is case-insensitive:
+
+ CN The Common Name; e.g. "host.domain.com"
+ OU The Organizational Unit; e.g. "IT Department"
+ O The Organization Name; e.g. "The Sample Company"
+ L The Locality Name; e.g. "Sydney"
+ ST The State Name; e.g. "New South Wales"
+ C The 2-letter Country identifier; e.g. "AU"
+
+ When specified with a -dname option, each pair of component/value will
+ be separated from the other with a comma. Each component and value pair
+ MUST be separated by an equal sign. For example, the following is
+ a valid DN value:
+
+ CN=host.domain.com, O=The Sample Company, L=Sydney, ST=NSW, C=AU
+
+ If the Distinguished Name is required, and no valid default value can be
+ used, the tool will prompt you to enter the information through the
+ console.
+
+-genkey COMMAND
+ Generate a new key-pair (both private and public keys), and save these
+ credentials in the key store as a Key Entry, associated with the
+ designated (if was specified in the -alias option) or default (if the
+ -alias option is omitted) Alias.
+
+ The private key material will be protected with a user-defined password
+ (see -keypass option). The public key on the other hand will be part
+ of a self-signed X.509 certificate, which will form a 1-element chain
+ and will be saved in the key store.
+
+ -alias ALIAS
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keyalg ALGORITHM
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keysize KEY_SIZE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -sigalg ALGORITHM
+ The canonical name of the digital signature algorithm to use for
+ signing certificates. If this option is omitted, a default
+ value will be chosen based on the type of the key-pair; i.e. the
+ algorithm that ends up being used by the -keyalg option. If the
+ key-pair generation algorithm is "DSA", the value for the
+ signature algorithm will be "SHA1withDSA". If on the other hand
+ the key-pair generation algorithm is "RSA", then the tool will
+ use "MD5withRSA" as the signature algorithm.
+
+ -dname NAME
+ This a mandatory value for the command. If no value is
+ specified --i.e. the -dname option is omitted-- the tool will
+ prompt you to enter a Distinguished Name to use as both the
+ Owner and Issuer of the generated self-signed certificate.
+
+ (see X.500 DISTINGUISHED NAME)
+
+ -keypass PASSWORD
+ Use this option to specify the password which the tool will use
+ to protect the newly created Key Entry.
+
+ If this option is omitted, you will be prompted to provide a
+ password.
+
+ -validity DAY_COUNT
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+-import COMMAND
+ Read an X.509 certificate, or a PKCS#7 Certificate Reply from a
+ designated input source and incorporate the certificates into the key
+ store.
+
+ If the Alias does not already exist in the key store, the tool treats
+ the certificate read from the input source as a new Trusted Certificate.
+ It then attempts to discover a chain-of-trust, starting from that
+ certificate and ending at another Trusted Certificate, already stored in
+ the key store. If the -trustcacerts option is present, an additional
+ key store, of type "JKS" named "cacerts", and assumed to be present in
+ ${JAVA_HOME}/lib/security will also be consulted if found --${JAVA_HOME}
+ refers to the location of an installed Java Runtime Environment (JRE).
+ If no chain-of-trust can be established, and unless the -noprompt option
+ has been specified, the certificate is printed to STDOUT and the user is
+ prompted for a confirmation.
+
+ If Alias exists in the key store, the tool will treat the certificate(s)
+ read from the input source as a Certificate Reply, which can be a chain
+ of certificates, that eventually would replace the chain of certificates
+ associated with the Key Entry of that Alias. The substitution of the
+ certificates only occurs if a chain-of-trust can be established between
+ the bottom certificate of the chain read from the input file and the
+ Trusted Certificates already present in the key store. Again, if the
+ -trustcacerts option is specified, additional Trusted Certificates in
+ the same "cacerts" key store will be considered. If no chain-of-trust
+ can be established, the operation will abort.
+
+ -alias ALIAS
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -file FILE_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keypass PASSWORD
+ Use this option to specify the password which the tool will use
+ to protect the Key Entry associated with the designated Alias,
+ when replacing this Alias' chain of certificates with that found
+ in the certificate reply.
+
+ If this option is omitted, and the chain-of-trust for the
+ certificate reply has been established, the tool will first
+ attempt to unlock the Key Entry using the same password
+ protecting the key store. If this fails, you will then be
+ prompted to provide a password.
+
+ -noprompt
+ Use this option to prevent the tool from prompting the user.
+
+ -trustcacerts
+ Use this option to indicate to the tool that a key store, of
+ type "JKS", named "cacerts", and usually located in lib/security
+ in an installed Java Runtime Environment should be considered
+ when trying to establish chain-of-trusts.
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+-selfcert COMMAND
+ Generate a self-signed X.509 version 1 certificate. The newly generated
+ certificate will form a chain of one element which will replace the
+ previous chain associated with the designated Alias (if -alias option
+ was specified), or the default Alias (if -alias option was omitted).
+
+ -alias ALIAS
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -sigalg ALGORITHM
+ The canonical name of the digital signature algorithm to use for
+ signing the certificate. If this option is omitted, a default
+ value will be chosen based on the type of the private key
+ associated with the designated Alias. If the private key is a
+ "DSA" one, the value for the signature algorithm will be
+ "SHA1withDSA". If on the other hand the private key is an "RSA"
+ one, then the tool will use "MD5withRSA" as the signature
+ algorithm.
+
+ -dname NAME
+ Use this option to specify the Distinguished Name of the newly
+ generated self-signed certificate. If this option is omitted,
+ the existing Distinguished Name of the base certificate in the
+ chain associated with the designated Alias will be used instead.
+
+ (see X.500 DISTINGUISHED NAME)
+
+ -validity DAY_COUNT
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keypass PASSWORD
+ Use this option to specify the password which the tool will use
+ to unlock the Key Entry associated with the designated Alias.
+
+ If this option is omitted, the tool will first attempt to unlock
+ the Key Entry using the same password protecting the key store.
+ If this fails, you will then be prompted to provide a password.
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+-identitydb COMMAND
+ NOT IMPLEMENTED YET.
+
+ Import a JDK 1.1 style Identity Database.
+
+ -file FILE_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+-certreq COMMAND
+ Generate a PKCS#10 Certificate Signing Request (CSR) and writes it to
+ a designated output destination. The contents of the destination
+ should look something like the following:
+
+ -----BEGIN NEW CERTIFICATE REQUEST-----
+ MIICYTCCAiECAQAwXzEUMBIGA1UEAwwLcnNuQGdudS5vcmcxGzAZBgNVBAoMElUg
+ Q29tcGFueTEPMA0GA1UEBwwGU3lkbmV5MQwwCgYDVQQIDANOU1cxCzAJBgNVBACC
+ ...
+ FCTlKlok8KwGuIVwNVOfQLRX+O5kAhQ/a4RTZme2L8PnpvgRwrf7Eg8D6w==
+ -----END NEW CERTIFICATE REQUEST-----
+
+ IMPORTANT: Some documentation (e.g. RSA examples) claims that the
+ Attributes field, in the CSR is OPTIONAL while RFC-2986 implies the
+ opposite. This implementation considers this field, by default, as
+ OPTIONAL, unless the option -attributes is specified on the command
+ line.
+
+ -alias ALIAS
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -sigalg ALGORITHM
+ The canonical name of the digital signature algorithm to use for
+ signing the certificate. If this option is omitted, a default
+ value will be chosen based on the type of the private key
+ associated with the designated Alias. If the private key is a
+ "DSA" one, the value for the signature algorithm will be
+ "SHA1withDSA". If on the other hand the private key is an "RSA"
+ one, then the tool will use "MD5withRSA" as the signature
+ algorithm.
+
+ -file FILE_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keypass PASSWORD
+ Use this option to specify the password which the tool will use
+ to unlock the Key Entry associated with the designated Alias.
+
+ If this option is omitted, the tool will first attempt to unlock
+ the Key Entry using the same password protecting the key store.
+ If this fails, you will then be prompted to provide a password.
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -attributes
+ Use this option to force the tool to encode a NULL DER value in
+ the CSR as the value of the Attributes field.
+
+-export COMMAND
+ Export a certificate stored in the key store to a designated output
+ destination, either in binary format (if the -v option is specified),
+ or in RFC-1421 compliant encoding (if the -rfc option is specified
+ instead).
+
+ -alias ALIAS
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -file FILE_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -rfc Use RFC-1421 specifications when encoding the output.
+
+ -v Output the certificate in binary DER encoding. This is the
+ default output format of the command if neither -rfc nor -v
+ options were detected on the command line. If both this option
+ and the -rfc option are detected on the command line, the tool
+ will opt for the RFC-1421 style encoding.
+
+-list COMMAND
+ Print one or all of the key store entries to STDOUT. Usually this
+ command will only print a fingerprint of the certificate, unless either
+ the -rfc or the -v option is specified.
+
+ -alias ALIAS
+ If this option is omitted, the tool will print ALL the entries
+ found in the key store.
+
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -rfc Use RFC-1421 specifications when encoding the output.
+
+ -v Output the certificate in human-readable format. If both this
+ option and the -rfc option are detected on the command line,
+ the tool will opt for the human-readable form and will not
+ abort the command.
+
+-printcert COMMAND
+ Read a certificate from a designated input source and print it to STDOUT
+ in a human-readable form.
+
+ -file FILE_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+-keyclone COMMAND
+ Clone an existing Key Entry and store it under a new (different) Alias
+ protecting, its private key material with possibly a new password.
+
+ -alias ALIAS
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -dest ALIAS
+ Use this option to specify the new Alias which will be used to
+ identify the cloned copy of the Key Entry.
+
+ -keypass PASSWORD
+ Use this option to specify the password which the tool will use
+ to unlock the Key Entry associated with the designated Alias.
+
+ If this option is omitted, the tool will first attempt to unlock
+ the Key Entry using the same password protecting the key store.
+ If this fails, you will then be prompted to provide a password.
+
+ -new PASSWORD
+ Use this option to specify the password protecting the private
+ key material of the newly cloned copy of the Key Entry.
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+-storepasswd COMMAND
+ Change the password protecting a key store.
+
+ -new PASSWORD
+ The new, and different, password which will be used to protect
+ the designated key store.
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+-keypasswd COMMAND
+ Change the password protecting the private key material of a designated
+ Key Entry.
+
+ -alias ALIAS
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keypass PASSWORD
+ Use this option to specify the password which the tool will use
+ to unlock the Key Entry associated with the designated Alias.
+
+ If this option is omitted, the tool will first attempt to unlock
+ the Key Entry using the same password protecting the key store.
+ If this fails, you will then be prompted to provide a password.
+
+ -new PASSWORD
+ The new, and different, password which will be used to protect
+ the private key material of the designated Key Entry.
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+-delete COMMAND
+ Delete a designated key store entry.
+
+ -alias ALIAS
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storetype STORE_TYPE
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -keystore URL
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -storepass PASSWORD
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -provider PROVIDER_CLASS_NAME
+ (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+ -v (see OPTIONS COMMON TO MORE THAN ONE COMMAND)
+
+REPORTING BUGS
+ Please report bugs at http://www.gnu.org/software/classpath/bugs.html
+
+COPYRIGHT
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ This is free software; see the source for copying conditions. There is
+ NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE.
diff --git a/tools/gnu/classpath/tools/keytool/package.html b/tools/gnu/classpath/tools/keytool/package.html
new file mode 100644
index 000000000..c447b8d01
--- /dev/null
+++ b/tools/gnu/classpath/tools/keytool/package.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- package.html - describes classes in gnu.classpath.tools.keytool
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. -->
+
+<html>
+<head>
+<title>GNU Classpath - gnu.classpath.tools.keytool</title>
+</head>
+
+<body>
+This package contains the classes that provide an implementation of the
+Security Tool: <code>keytool</code>. The behaviour of these classes should
+match that of the same tool provided in the RI version 1.4.2, except for the
+following:
+
+<ul>
+ <li>The RI tool accepts -J<i>javaoption</i> options which it then passes to
+ the underlying JVM. This is because the RI tool acts as a <i>wrapper</i>
+ around the JVM launcher.
+ <p>
+ This implementation DOES NOT support these options.
+ </li>
+
+ <li>The RI tool is capable of importing JDK-1.1 style <i>identities</i>.
+ <p>
+ This implementation does not offer this feature.
+ </li>
+</ul>
+</body>
+</html>
diff --git a/tools/gnu/classpath/tools/rmi/Persistent.java b/tools/gnu/classpath/tools/rmi/Persistent.java
new file mode 100644
index 000000000..5cd1efe91
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/Persistent.java
@@ -0,0 +1,87 @@
+/* PersistentBidiHasthable.java -- Constants for the persistent tables.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.rmi;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * The static fields, shared by the multiple classes, implementing the
+ * persistent work.
+ *
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+public interface Persistent
+{
+ /**
+ * Sheduled termination task.
+ */
+ static class ExitTask extends TimerTask
+ {
+ public void run()
+ {
+ System.exit(0);
+ }
+ }
+
+ /**
+ * The timer, sheduling all disk database update events, shared by all
+ * instances.
+ */
+ static Timer timer = new Timer(true);
+
+ /**
+ * The longest time, in ms, after that the database content on the disk must
+ * be updated. The algorithm is written to avoid the very frequent writings to
+ * the disk.
+ */
+ static long SAVE_AT_MOST_AFTER = 5000;
+
+ /**
+ * States how long the database may stay not updated during the intensive
+ * operations, in ms. Otherwise the intensively used structure may never
+ * be stored to the disk.
+ */
+ static long ALWAYS_UPDATE = 300000;
+
+ /**
+ * Write the database content to the disk.
+ */
+ void writeContent();
+
+}
diff --git a/tools/gnu/classpath/tools/rmi/PersistentBidiHashTable.java b/tools/gnu/classpath/tools/rmi/PersistentBidiHashTable.java
new file mode 100644
index 000000000..94b5bcbee
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/PersistentBidiHashTable.java
@@ -0,0 +1,268 @@
+/* PersistentBidiHasthable.java -- Bidirectional persistent hash table.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.rmi;
+
+import gnu.classpath.tools.rmi.rmid.ActivationSystemImpl;
+import gnu.java.rmi.activation.BidiTable;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TimerTask;
+
+/**
+ * The persistent bidirectional hash table, maps both a to b and b to a. The
+ * changes are written to dist after SAVE_AT_MOST_AFTER time from the latest
+ * database change or at most after ALWAYS_UPDATE, if the database is updated
+ * very frequently. To ensure that no information is lost, the shutdown method
+ * must be called before exit.
+ *
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+public class PersistentBidiHashTable extends BidiTable implements
+ Persistent
+{
+ class WriteToDiskTask extends TimerTask
+ {
+ /**
+ * Save the database.
+ */
+ public void run()
+ {
+ writeContent();
+ sheduled = null;
+ }
+ }
+
+ /**
+ * Replaces instances of ActivationSystemImpl into the currently active
+ * instance of the ActivationSystemImpl
+ */
+ class AdaptedReader extends ObjectInputStream
+ {
+ AdaptedReader(InputStream in) throws IOException
+ {
+ super(in);
+ enableResolveObject(true);
+ }
+
+ protected Object resolveObject(Object obj) throws IOException
+ {
+ if (obj instanceof ActivationSystemImpl)
+ return ActivationSystemImpl.singleton2;
+ else
+ return obj;
+ }
+ }
+
+ /**
+ * The database file.
+ */
+ File database;
+
+ /**
+ * The currently sheduled write to disk task, null if none.
+ */
+ WriteToDiskTask sheduled = null;
+
+ /**
+ * The time, when the disk database was last updated.
+ */
+ long lastUpdated;
+
+ /**
+ * Create the unitialised instance that must be initalised when
+ * ActivationSystemImpl.singleton2 is assigned.
+ */
+ public PersistentBidiHashTable()
+ {
+ // Do not initalise the table fields - the initalise method must be
+ // called later.
+ super(0);
+ }
+
+ /**
+ * Create a new persistent table that stores its information into the given
+ * file. The ActivationSystemImpl.singleton2 must be assigned.
+ *
+ * @param file
+ * the file, where the table stores its information.
+ * @param coldStart
+ * if true, the existing file with this name will be erased and
+ * ignored. Otherwise, it will be assumed that the file contains the
+ * persistent table information.
+ */
+ public void init(File file, boolean coldStart)
+ {
+ try
+ {
+ database = file;
+ if (database.exists())
+ {
+ if (coldStart)
+ {
+ k2v = new Hashtable();
+ v2k = new Hashtable();
+ database.delete();
+ }
+ else
+ {
+ FileInputStream fi = new FileInputStream(file);
+ BufferedInputStream b = new BufferedInputStream(fi);
+ ObjectInputStream oin = new AdaptedReader(b);
+
+ k2v = (Map) oin.readObject();
+ oin.close();
+
+ v2k = new Hashtable(k2v.size());
+
+ // Reguild v2k from k2v:
+ Iterator en = k2v.keySet().iterator();
+ Object key;
+ while (en.hasNext())
+ {
+ key = en.next();
+ v2k.put(k2v.get(key), key);
+ }
+ }
+ }
+ else
+ {
+ k2v = new Hashtable();
+ v2k = new Hashtable();
+ }
+ }
+ catch (Exception ioex)
+ {
+ InternalError ierr = new InternalError("Unable to intialize with file "
+ + file);
+ ierr.initCause(ioex);
+ throw ierr;
+ }
+ }
+
+ /**
+ * Write the database content to the disk.
+ */
+ public synchronized void writeContent()
+ {
+ try
+ {
+ FileOutputStream fou = new FileOutputStream(database);
+ BufferedOutputStream b = new BufferedOutputStream(fou);
+ ObjectOutputStream oout = new ObjectOutputStream(b);
+ oout.writeObject(k2v);
+ oout.close();
+ }
+ catch (Exception ioex)
+ {
+ InternalError ierr = new InternalError(
+ "Failed to write database to disk: "
+ + database);
+ ierr.initCause(ioex);
+ throw ierr;
+ }
+ }
+
+ /**
+ * Mark the modified database as modified. The database will be written after
+ * several seconds, unless another modification occurs.
+ */
+ public void markDirty()
+ {
+ if (System.currentTimeMillis() - lastUpdated > ALWAYS_UPDATE)
+ {
+ // Force storing to disk under intensive operation.
+ writeContent();
+ lastUpdated = System.currentTimeMillis();
+ if (sheduled != null)
+ {
+ sheduled.cancel();
+ sheduled = null;
+ }
+ }
+ else
+ {
+ // Otherwise coalesce the disk database copy update events.
+ if (sheduled != null)
+ sheduled.cancel();
+ sheduled = new WriteToDiskTask();
+ timer.schedule(sheduled, SAVE_AT_MOST_AFTER);
+ }
+ }
+
+ /**
+ * Save the current database state to the disk before exit.
+ */
+ public void shutdown()
+ {
+ if (sheduled != null)
+ {
+ writeContent();
+ sheduled = null;
+ }
+ }
+
+ /**
+ * Update the memory maps and mark as should be written to the disk.
+ */
+ public void put(Object key, Object value)
+ {
+ super.put(key, value);
+ markDirty();
+ }
+
+ /**
+ * Update the memory maps and mark as should be written to the disk.
+ */
+ public void removeKey(Object key)
+ {
+ super.removeKey(key);
+ markDirty();
+ }
+
+}
diff --git a/tools/gnu/classpath/tools/rmi/PersistentHashTable.java b/tools/gnu/classpath/tools/rmi/PersistentHashTable.java
new file mode 100644
index 000000000..925e829ff
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/PersistentHashTable.java
@@ -0,0 +1,246 @@
+/* PersistentHasthable.java -- Persistent hash table.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.rmi;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.TimerTask;
+
+/**
+ * The persistent hash table. The changes are written to dist after
+ * SAVE_AT_MOST_AFTER time from the latest database change or at most after
+ * ALWAYS_UPDATE, if the database is updated very frequently. To ensure that no
+ * information is lost, the shutdown method must be called before exit.
+ *
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+public class PersistentHashTable
+ extends Hashtable
+ implements Serializable, Persistent
+{
+
+ /**
+ * Use serialVersionUID for interoperability
+ */
+ private static final long serialVersionUID = 1;
+
+ class WriteToDiskTask extends TimerTask
+ {
+ /**
+ * Save the database.
+ */
+ public void run()
+ {
+ writeContent();
+ sheduled = null;
+ }
+ }
+
+ /**
+ * The database file.
+ */
+ File database;
+
+ /**
+ * The currently sheduled write to disk task, null if none.
+ */
+ WriteToDiskTask sheduled = null;
+
+ /**
+ * The time, when the disk database was last updated.
+ */
+ long lastUpdated;
+
+ /**
+ * Setting to false prevents the automated disk update.
+ * The initial value is true to prevent writing while reading and is set
+ * to false in createInstance.
+ */
+ transient boolean ready;
+
+ /**
+ * Use static method to obtain the instance.
+ */
+ private PersistentHashTable(File file)
+ {
+ if (file == null)
+ throw new NullPointerException("Null file provided");
+ database = file;
+ }
+
+ /**
+ * Create a new persistent table that stores its information into the given
+ * file.
+ *
+ * @param file
+ * the file, where the table stores its information.
+ * @param coldStart
+ * if true, the existing file with this name will be erased and
+ * ignored. Otherwise, it will be assumed that the file contains the
+ * persistent table information.
+ */
+ public static Map createInstance(File file, boolean coldStart)
+ {
+ try
+ {
+ PersistentHashTable k2v;
+ if (file.exists())
+ {
+ if (coldStart)
+ {
+ file.delete();
+ k2v = new PersistentHashTable(file);
+ }
+ else
+ {
+ FileInputStream fi = new FileInputStream(file);
+ BufferedInputStream b = new BufferedInputStream(fi);
+ ObjectInputStream oin = new ObjectInputStream(b);
+
+ k2v = (PersistentHashTable) oin.readObject();
+ oin.close();
+ }
+ }
+ else
+ k2v = new PersistentHashTable(file);
+
+ k2v.ready = true;
+ return k2v;
+ }
+ catch (Exception ioex)
+ {
+ InternalError ierr = new InternalError("Unable to intialize with file "
+ + file);
+ ierr.initCause(ioex);
+ throw ierr;
+ }
+ }
+
+
+ /**
+ * Write the database content to the disk.
+ */
+ public synchronized void writeContent()
+ {
+ try
+ {
+ FileOutputStream fou = new FileOutputStream(database);
+ BufferedOutputStream b = new BufferedOutputStream(fou);
+ ObjectOutputStream oout = new ObjectOutputStream(b);
+ oout.writeObject(this);
+ oout.close();
+ }
+ catch (Exception ioex)
+ {
+ InternalError ierr = new InternalError(
+ "Failed to write database to disk: "+ database);
+ ierr.initCause(ioex);
+ throw ierr;
+ }
+ }
+
+ /**
+ * Mark the modified database as modified. The database will be written after
+ * several seconds, unless another modification occurs.
+ */
+ public void markDirty()
+ {
+ if (System.currentTimeMillis() - lastUpdated > ALWAYS_UPDATE)
+ {
+ // Force storing to disk under intensive operation.
+ writeContent();
+ lastUpdated = System.currentTimeMillis();
+ if (sheduled != null)
+ {
+ sheduled.cancel();
+ sheduled = null;
+ }
+ }
+ else
+ {
+ // Otherwise coalesce the disk database copy update events.
+ if (sheduled != null)
+ sheduled.cancel();
+ sheduled = new WriteToDiskTask();
+ timer.schedule(sheduled, SAVE_AT_MOST_AFTER);
+ }
+ }
+
+ /**
+ * Save the current database state to the disk before exit.
+ */
+ public void shutdown()
+ {
+ if (sheduled != null)
+ {
+ writeContent();
+ sheduled = null;
+ }
+ }
+
+ /**
+ * Update the memory maps and mark as should be written to the disk.
+ */
+ public Object put(Object key, Object value)
+ {
+ super.put(key, value);
+ if (ready)
+ markDirty();
+ return value;
+ }
+
+ /**
+ * Update the memory maps and mark as should be written to the disk.
+ */
+ public Object remove(Object key)
+ {
+ Object removed = super.remove(key);
+ if (ready)
+ markDirty();
+ return removed;
+ }
+
+}
diff --git a/tools/gnu/classpath/tools/rmi/REGISTRY.java b/tools/gnu/classpath/tools/rmi/REGISTRY.java
new file mode 100644
index 000000000..63f633f99
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/REGISTRY.java
@@ -0,0 +1,165 @@
+/* REGISTY.java -- RMI registry starter.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.rmi;
+
+import gnu.classpath.tools.HelpPrinter;
+import gnu.classpath.tools.rmi.registry.RegistryImpl;
+import gnu.java.rmi.server.UnicastServerRef;
+
+import java.io.File;
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.rmi.server.ObjID;
+import java.rmi.server.RMIServerSocketFactory;
+import java.util.Hashtable;
+import java.util.Map;
+
+/**
+ * The optionally persistent RMI registry implementation.
+ *
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+public class REGISTRY
+{
+ /**
+ * The stop command.
+ */
+ public static String STOP = "gnu.classpath.tools.rmi.registry.command.STOP";
+
+ /**
+ * If true, the registry prints registration events to console.
+ */
+ public static boolean verbose = false;
+
+ /**
+ * The RMI registry implementation entry point.
+ */
+ public static void main(String[] args)
+ {
+ String HelpPath = "rmi/REGISTRY.txt";
+ HelpPrinter.checkHelpKey(args, HelpPath);
+
+ // Parse parameters:
+ String folder = ".";
+ boolean cold = false;
+ boolean trans = false;
+ boolean stop = false;
+
+ int port = Registry.REGISTRY_PORT;
+ RMIServerSocketFactory ssf = null;
+
+ for (int i = 0; i < args.length; i++)
+ {
+ String a = args[i];
+ if (a.equals("-restart"))
+ cold = true;
+ else if (a.equals("-transient"))
+ trans = true;
+ else if (a.equals("-verbose"))
+ verbose = true;
+ else if (a.equals("-stop"))
+ stop = true;
+ else if (i < args.length - 1)
+ {
+ // The additional key parameter is possible.
+ if (a.equals("-port"))
+ port = Integer.parseInt(args[++i]);
+ else if (a.equals("-folder"))
+ folder = args[++i];
+ }
+ }
+
+ if (!stop)
+ {
+ Map table;
+ if (trans)
+ table = new Hashtable();
+ else
+ {
+ // Start the system.
+ File dataFolder = new File(folder);
+ if (!dataFolder.exists())
+ dataFolder.mkdirs();
+ table = PersistentHashTable.createInstance(
+ new File(dataFolder, "rmiregistry.data"), cold);
+ }
+
+ RegistryImpl system = new RegistryImpl(table);
+
+ // We must export with the specific activation id that is only
+ // possible when going into the gnu.java.rmi
+ try
+ {
+ UnicastServerRef sref = new UnicastServerRef(
+ new ObjID(ObjID.REGISTRY_ID), port, ssf);
+
+ sref.exportObject(system);
+ System.out.println("The RMI naming service is listening at " + port);
+ }
+ catch (Exception ex)
+ {
+ System.out.println("Failed to start RMI naming service at " + port);
+ }
+ }
+ else
+ {
+ // Stop the naming service.
+ try
+ {
+ Registry r = LocateRegistry.getRegistry(port);
+ // Search for this specific line will command to stop the registry.
+
+ // Our service returns null, but any other service will thrown
+ // NotBoundException.
+ r.unbind(STOP);
+ }
+ catch (RemoteException e)
+ {
+ System.out.println("Failed to stop RMI naming service at " + port);
+ }
+ catch (NotBoundException e)
+ {
+ System.out.println("The naming service at port "+port+" is not a "+
+ REGISTRY.class.getName());
+ }
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/rmi/REGISTRY.txt b/tools/gnu/classpath/tools/rmi/REGISTRY.txt
new file mode 100644
index 000000000..7d8e19232
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/REGISTRY.txt
@@ -0,0 +1,28 @@
+The persistent RMI naming service, required for the remote method invocations
+(packages java.rmi.*, java.rmi.Registry.*).
+
+Copyright 2006 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+Please report bugs at http://www.gnu.org/software/classpath/bugs.html
+
+Usage: rmiregistry <options>
+
+ where <options> includes:
+ -port N Start the registry on the given local port. If this key
+ is not specified, the service starts on the port 1099.
+ -verbose Log binding events to stdout.
+ -stop Stop the running naming service at the given port.
+
+ -transient Start transient registry service that does not write any
+ data to the disk. Such service looses the stored bindings if
+ restarted. If this key is not specified, the
+ persistent naming service is started.
+ -restart "Cold start:, clear the persistent naming database, if any.
+ -folder Folder Store the persistent binding file in the given folder. If this
+ key is not specified, the file with persistent bindings is
+ stored into the current folder.
+
+
+
diff --git a/tools/gnu/classpath/tools/rmi/RMIC.java b/tools/gnu/classpath/tools/rmi/RMIC.java
index 09021dd3f..c44453011 100644
--- a/tools/gnu/classpath/tools/rmi/RMIC.java
+++ b/tools/gnu/classpath/tools/rmi/RMIC.java
@@ -17,30 +17,13 @@ You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.rmi;
import gnu.classpath.tools.HelpPrinter;
import gnu.classpath.tools.giop.GRMIC;
-import gnu.classpath.tools.giop.grmic.GiopRmicCompiler;
import gnu.classpath.tools.rmi.rmic.RmicCompiler;
import java.io.File;
@@ -114,6 +97,10 @@ public class RMIC
verbose = true;
compiler.setVerbose(true);
}
+ else if (c.equals("-force"))
+ {
+ compiler.setForce(true);
+ }
else if (c.equals("-d"))
{
int f = i + 1;
diff --git a/tools/gnu/classpath/tools/rmi/RMIC.txt b/tools/gnu/classpath/tools/rmi/RMIC.txt
index df1de9ea6..7ec371e9a 100644
--- a/tools/gnu/classpath/tools/rmi/RMIC.txt
+++ b/tools/gnu/classpath/tools/rmi/RMIC.txt
@@ -16,6 +16,8 @@ Usage: rmic <options> <class names>
-help Print this help text
-v Print version
-verbose Verbose output
+ -force Try to generate code even if the input classes seem not
+ consistent with RMI specification.
-1.2 Generate v 1.2 stubs (default)*
diff --git a/tools/gnu/classpath/tools/rmi/RMID.java b/tools/gnu/classpath/tools/rmi/RMID.java
new file mode 100644
index 000000000..81d09671a
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/RMID.java
@@ -0,0 +1,189 @@
+/* RMID.java -- the RMI activation daemon.
+ Copyright (c) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.rmi;
+
+import gnu.classpath.tools.HelpPrinter;
+import gnu.classpath.tools.rmi.rmid.ActivationSystemImpl;
+import gnu.java.rmi.activation.ActivationSystemTransient;
+import gnu.java.rmi.server.UnicastServerRef;
+
+import java.io.File;
+import java.net.InetAddress;
+import java.rmi.Remote;
+import java.rmi.activation.ActivationSystem;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.rmi.server.ObjID;
+import java.rmi.server.RMIServerSocketFactory;
+
+
+/**
+ * The persistent RMI activation daemon.
+ *
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+public class RMID
+{
+ /**
+ * The RMI server socket factory.
+ */
+ static RMIServerSocketFactory ACTIVATION_REGISTY_SOCKET_FACTORY = null;
+
+ /**
+ * The activation registry port.
+ */
+ static int ACTIVATION_REGISTRY_PORT = ActivationSystem.SYSTEM_PORT;
+
+ /**
+ * The activation system name.
+ */
+ static String ACTIVATION_SYSTEM_NAME = "java.rmi.activation.ActivationSystem";
+
+ /**
+ * The RMI activation daemon entry point.
+ */
+ public static void main(String[] args)
+ {
+ String HelpPath = "rmi/RMID.txt";
+ HelpPrinter.checkHelpKey(args, HelpPath);
+
+ // Parse parameters:
+ boolean stop = false;
+ String folder = ".";
+ boolean cold = false;
+ boolean trans = false;
+
+ for (int i = 0; i < args.length; i++)
+ {
+ String a = args[i];
+ if (a.equals("-verbose"))
+ ActivationSystemTransient.debug = true;
+ else if (a.equals("-stop"))
+ stop = true;
+ else if (a.equals("-restart"))
+ cold = true;
+ else if (a.equals("-transient"))
+ trans = true;
+ else if (i < args.length - 1)
+ {
+ // The additional key parameter is possible.
+ if (a.equals("-port"))
+ ACTIVATION_REGISTRY_PORT = Integer.parseInt(args[++i]);
+ else if (a.equals("-folder"))
+ folder = args[++i];
+ }
+ }
+
+ try
+ {
+ if (!stop)
+ {
+ // Start the system.
+ File dataFolder = new File(folder);
+ if (!dataFolder.exists())
+ dataFolder.mkdirs();
+ ActivationSystem system;
+
+ if (trans)
+ system = ActivationSystemTransient.getInstance();
+ else
+ system = ActivationSystemImpl.getInstance(dataFolder, cold);
+
+ // We must export with the specific activation id that is only
+ // possible when going into the gnu.java.rmi.activation.
+ UnicastServerRef sref = new UnicastServerRef(
+ new ObjID(ObjID.ACTIVATOR_ID), ACTIVATION_REGISTRY_PORT,
+ ACTIVATION_REGISTY_SOCKET_FACTORY);
+ Remote systemStub = sref.exportObject(system);
+
+ // Start the naming system on the activation system port
+ // (if not already running).
+
+ Registry r;
+ try
+ {
+ // Expect the naming service running first.
+ // The local host may want to use the shared registry
+ r = LocateRegistry.getRegistry(ACTIVATION_REGISTRY_PORT);
+ r.rebind(ACTIVATION_SYSTEM_NAME, systemStub);
+ }
+ catch (Exception ex)
+ {
+ // The naming service is not running. Start it.
+ r = LocateRegistry.createRegistry(ACTIVATION_REGISTRY_PORT);
+ r.rebind(ACTIVATION_SYSTEM_NAME, systemStub);
+ }
+ String host = InetAddress.getLocalHost().getCanonicalHostName();
+ System.out.println("The RMI daemon is listening on " + host +
+ " (port "
+ + ACTIVATION_REGISTRY_PORT + ")");
+
+ }
+ else
+ {
+ // Stop the activation system.
+ Registry r;
+ try
+ {
+ System.out.print("Stopping RMI daemon at "
+ + ACTIVATION_REGISTRY_PORT+" ... ");
+ // Expect the naming service running first.
+ // The local host may want to use the shared registry
+ r = LocateRegistry.getRegistry(ACTIVATION_REGISTRY_PORT);
+ ActivationSystem asys =
+ (ActivationSystem) r.lookup(ACTIVATION_SYSTEM_NAME);
+ asys.shutdown();
+ System.out.println("OK.");
+ }
+ catch (Exception ex)
+ {
+ System.out.println("The RMI daemon seems not running at "
+ + ACTIVATION_REGISTRY_PORT);
+ if (ActivationSystemTransient.debug)
+ ex.printStackTrace();
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ System.out.println("Failed to start the RMI daemon.");
+ if (ActivationSystemTransient.debug)
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/rmi/RMID.txt b/tools/gnu/classpath/tools/rmi/RMID.txt
new file mode 100644
index 000000000..a62613fd4
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/RMID.txt
@@ -0,0 +1,30 @@
+The persistent RMI activation daemon, support RMI object activation
+(package java.rmi.activation.*).
+
+Copyright 2006 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+Please report bugs at http://www.gnu.org/software/classpath/bugs.html
+
+Usage: rmid <options>
+
+ where <options> includes:
+ -port N Start the service on the given local port. If this key
+ is not specified, the service starts on the port 1098.
+ -verbose Log registration events to stdout.
+ -stop Stop the running activation service at the given port.
+
+ -transient Start transient activation service that does not write any
+ data to the disk. Such service looses the stored activation
+ descriptors, if restarted. If this key is not specified, the
+ persistent naming service is started.
+ -restart "Cold start:, clear the activation descriptor database, if any.
+ -folder Folder Store the persistent descriptor file in the given folder. If this
+ key is not specified, the file with persistent activation
+ information is stored into the current folder.
+
+All activation groups are activated on the same virtual machine, where the
+daemon is running. For security reasons, all the classes, required for
+activation, must be available in the classpath of that machine.
+ \ No newline at end of file
diff --git a/tools/gnu/classpath/tools/rmi/registry/RegistryImpl.java b/tools/gnu/classpath/tools/rmi/registry/RegistryImpl.java
new file mode 100644
index 000000000..90bd3a6bd
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/registry/RegistryImpl.java
@@ -0,0 +1,139 @@
+/* RegistryImpl.java -- the RMI registry implementation
+ Copyright (c) 1996, 1997, 1998, 1999, 2002, 2005, 2006
+ Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.rmi.registry;
+
+import gnu.classpath.tools.rmi.Persistent;
+import gnu.classpath.tools.rmi.REGISTRY;
+
+import java.rmi.AccessException;
+import java.rmi.AlreadyBoundException;
+import java.rmi.NotBoundException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.registry.Registry;
+import java.util.ArrayList;
+import java.util.Map;
+
+/**
+ * The optionally persistent registry implementation.
+ *
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+public class RegistryImpl implements Registry
+{
+ /**
+ * The binding table.
+ */
+ Map bindings;
+
+ /**
+ * Create the registry implementation that uses the given bidirectinal
+ * table to keep the data.
+ */
+ public RegistryImpl(Map aTable)
+ {
+ bindings = aTable;
+ }
+
+ /** @inheritDoc */
+ public Remote lookup(String name) throws RemoteException, NotBoundException,
+ AccessException
+ {
+ Object obj = bindings.get(name);
+ if (obj == null)
+ throw new NotBoundException(name);
+ return ((Remote) obj);
+ }
+
+ /** @inheritDoc */
+ public void bind(String name, Remote obj) throws RemoteException,
+ AlreadyBoundException, AccessException
+ {
+ if (REGISTRY.verbose)
+ System.out.println("Bind "+name);
+ if (bindings.containsKey(name))
+ throw new AlreadyBoundException(name);
+ bindings.put(name, obj);
+ }
+
+ /** @inheritDoc */
+ public void unbind(String name) throws RemoteException, NotBoundException,
+ AccessException
+ {
+ if (name.equals(REGISTRY.STOP))
+ {
+ if (bindings instanceof Persistent)
+ ((Persistent) bindings).writeContent();
+ // Terminate in 10 seconds.
+ System.out.println("Shutdown command received. Will terminate in 10 s");
+ Persistent.timer.schedule(new Persistent.ExitTask(), 10000);
+ }
+ else
+ {
+ if (REGISTRY.verbose)
+ System.out.println("Unbind "+name);
+
+ if (!bindings.containsKey(name))
+ throw new NotBoundException(name);
+ else
+ bindings.remove(name);
+ }
+ }
+
+ /** @inheritDoc */
+ public void rebind(String name, Remote obj) throws RemoteException,
+ AccessException
+ {
+ if (REGISTRY.verbose)
+ System.out.println("Rebind "+name);
+ bindings.put(name, obj);
+ }
+
+ /** @inheritDoc */
+ public String[] list() throws RemoteException, AccessException
+ {
+ // Create a separated array to prevent race conditions.
+ ArrayList keys = new ArrayList(bindings.keySet());
+ int n = keys.size();
+ String[] rt = new String[n];
+ for (int i = 0; i < n; i++)
+ rt[i] = (String) keys.get(i);
+ return rt;
+ }
+}
diff --git a/tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Skel.java b/tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Skel.java
new file mode 100644
index 000000000..36b7d94a5
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Skel.java
@@ -0,0 +1,278 @@
+/* RegistryImpl_Skel.java
+ Copyright (C) 2002, 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.rmi.registry;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.rmi.MarshalException;
+import java.rmi.Remote;
+import java.rmi.UnmarshalException;
+import java.rmi.server.Operation;
+import java.rmi.server.RemoteCall;
+import java.rmi.server.SkeletonMismatchException;
+
+/**
+ * This skeleton supports unlikely cases when the naming service is
+ * contacted from other interoperable java implementation that still uses
+ * the old style skeleton-dependent invocations.
+ */
+public final class RegistryImpl_Skel
+ implements java.rmi.server.Skeleton
+{
+ private static final long interfaceHash = 4905912898345647071L;
+
+ /**
+ * Repeated multiple times.
+ */
+ static final String EUM = "error unmarshalling arguments for Registry";
+
+ /**
+ * Repeated multiple times.
+ */
+ static final String EMR = "error marshalling return from Registry";
+
+ private static final Operation[] operations =
+ {
+ new Operation("void bind(java.lang.String, Remote"),
+ new Operation("java.lang.String[] list("),
+ new Operation("Remote lookup(java.lang.String"),
+ new Operation("void rebind(java.lang.String, Remote"),
+ new Operation("void unbind(java.lang.String")
+ };
+
+ public Operation[] getOperations()
+ {
+ return ((Operation[]) operations.clone());
+ }
+
+ public void dispatch(Remote obj, RemoteCall call,
+ int opnum, long hash) throws java.lang.Exception
+ {
+ if (opnum < 0)
+ {
+ if (hash == 7583982177005850366L)
+ opnum = 0;
+ else if (hash == 2571371476350237748L)
+ opnum = 1;
+ else if (hash == -7538657168040752697L)
+ opnum = 2;
+ else if (hash == -8381844669958460146L)
+ opnum = 3;
+ else if (hash == 7305022919901907578L)
+ opnum = 4;
+ else
+ throw new SkeletonMismatchException("interface hash mismatch");
+ }
+ else if (hash != interfaceHash)
+ throw new SkeletonMismatchException("interface hash mismatch");
+
+ RegistryImpl server = (RegistryImpl) obj;
+ switch (opnum)
+ {
+ case 0:
+ {
+ java.lang.String $param_0;
+ Remote $param_1;
+ try
+ {
+ ObjectInput in = call.getInputStream();
+ $param_0 = (java.lang.String) in.readObject();
+ $param_1 = (Remote) in.readObject();
+
+ }
+ catch (IOException e)
+ {
+ throw new UnmarshalException(EUM, e);
+ }
+ catch (java.lang.ClassCastException e)
+ {
+ throw new UnmarshalException(EUM, e);
+ }
+ finally
+ {
+ call.releaseInputStream();
+ }
+ server.bind($param_0, $param_1);
+ try
+ {
+ ObjectOutput out = call.getResultStream(true);
+ }
+ catch (IOException e)
+ {
+ throw new MarshalException(EMR, e);
+ }
+ break;
+ }
+
+ case 1:
+ {
+ try
+ {
+ ObjectInput in = call.getInputStream();
+
+ }
+ catch (IOException e)
+ {
+ throw new UnmarshalException(EUM, e);
+ }
+ finally
+ {
+ call.releaseInputStream();
+ }
+ java.lang.String[] $result = server.list();
+ try
+ {
+ ObjectOutput out = call.getResultStream(true);
+ out.writeObject($result);
+ }
+ catch (IOException e)
+ {
+ throw new MarshalException(EMR, e);
+ }
+ break;
+ }
+
+ case 2:
+ {
+ java.lang.String $param_0;
+ try
+ {
+ ObjectInput in = call.getInputStream();
+ $param_0 = (java.lang.String) in.readObject();
+
+ }
+ catch (IOException e)
+ {
+ throw new UnmarshalException(EUM, e);
+ }
+ catch (java.lang.ClassCastException e)
+ {
+ throw new UnmarshalException(EUM, e);
+ }
+ finally
+ {
+ call.releaseInputStream();
+ }
+ Remote $result = server.lookup($param_0);
+ try
+ {
+ ObjectOutput out = call.getResultStream(true);
+ out.writeObject($result);
+ }
+ catch (IOException e)
+ {
+ throw new MarshalException(EMR, e);
+ }
+ break;
+ }
+
+ case 3:
+ {
+ java.lang.String $param_0;
+ Remote $param_1;
+ try
+ {
+ ObjectInput in = call.getInputStream();
+ $param_0 = (java.lang.String) in.readObject();
+ $param_1 = (Remote) in.readObject();
+
+ }
+ catch (IOException e)
+ {
+ throw new UnmarshalException(EUM, e);
+ }
+ catch (java.lang.ClassCastException e)
+ {
+ throw new UnmarshalException(EUM, e);
+ }
+ finally
+ {
+ call.releaseInputStream();
+ }
+ server.rebind($param_0, $param_1);
+ try
+ {
+ ObjectOutput out = call.getResultStream(true);
+ }
+ catch (IOException e)
+ {
+ throw new MarshalException(EMR, e);
+ }
+ break;
+ }
+
+ case 4:
+ {
+ java.lang.String $param_0;
+ try
+ {
+ ObjectInput in = call.getInputStream();
+ $param_0 = (java.lang.String) in.readObject();
+
+ }
+ catch (IOException e)
+ {
+ throw new UnmarshalException(EUM, e);
+ }
+ catch (java.lang.ClassCastException e)
+ {
+ throw new UnmarshalException(EUM, e);
+ }
+ finally
+ {
+ call.releaseInputStream();
+ }
+ server.unbind($param_0);
+ try
+ {
+ ObjectOutput out = call.getResultStream(true);
+ }
+ catch (IOException e)
+ {
+ throw new MarshalException(EMR, e);
+ }
+ break;
+ }
+
+ default:
+ throw new UnmarshalException("invalid method number");
+ }
+ }
+}
diff --git a/tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Stub.java b/tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Stub.java
new file mode 100644
index 000000000..d8cac5bfc
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/registry/RegistryImpl_Stub.java
@@ -0,0 +1,263 @@
+/* RegistryImpl_Stub.java -- Registry stub.
+ Copyright (c) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.rmi.registry;
+
+import java.rmi.AccessException;
+import java.rmi.AlreadyBoundException;
+import java.rmi.NotBoundException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.registry.Registry;
+
+import java.lang.reflect.Method;
+import java.rmi.server.RemoteRef;
+import java.rmi.server.RemoteStub;
+import java.rmi.UnexpectedException;
+
+/**
+ * This class delegates its method calls to the remote RMI object, referenced
+ * by {@link RemoteRef}.
+ *
+ * It is normally generated with rmic.
+ */
+public final class RegistryImpl_Stub
+ extends RemoteStub
+ implements Registry
+{
+ /**
+ * Use serialVersionUID for interoperability
+ */
+ private static final long serialVersionUID = 3;
+
+ /**
+ * The explaining message for {@ling UnexpectedException}.
+ */
+ private static final String exception_message =
+ "undeclared checked exception";
+
+ /* All remote methods, invoked by this stub: */
+ private static final Method met_list;
+ private static final Method met_rebind;
+ private static final Method met_unbind;
+ private static final Method met_lookup;
+ private static final Method met_bind;
+ private static final Object[] NO_ARGS = new Object[0];
+ static
+ {
+ final Class[] NO_ARGSc = new Class[0];
+ try
+ {
+ met_list =
+ Registry.class.getMethod("list", NO_ARGSc);
+ met_rebind =
+ Registry.class.getMethod("rebind", new Class[]
+ {
+ String.class, Remote.class
+ });
+ met_unbind =
+ Registry.class.getMethod("unbind", new Class[]
+ {
+ String.class
+ });
+ met_lookup =
+ Registry.class.getMethod("lookup", new Class[]
+ {
+ String.class
+ });
+ met_bind =
+ Registry.class.getMethod("bind", new Class[]
+ {
+ String.class, Remote.class
+ });
+
+ }
+ catch (NoSuchMethodException nex)
+ {
+ NoSuchMethodError err = new NoSuchMethodError(
+ "RegistryImpl_Stub class initialization failed");
+ err.initCause(nex);
+ throw err;
+ }
+ }
+
+ /**
+ * Create the instance for _RegistryImpl_Stub that forwards method calls to the
+ * remote object.
+ *
+ * @para the reference to the remote object.
+ */
+ public RegistryImpl_Stub(RemoteRef reference)
+ {
+ super(reference);
+ }
+
+ /* Methods */
+ /** @inheritDoc */
+ public String [] list()
+ throws RemoteException, AccessException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_list,
+ NO_ARGS,
+ 2571371476350237748L);
+ return (String []) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public void rebind(String p0, Remote p1)
+ throws RemoteException, AccessException
+ {
+ try
+ {
+ ref.invoke(this, met_rebind,
+ new Object[] {p0, p1},
+ -8381844669958460146L);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public void unbind(String p0)
+ throws RemoteException, NotBoundException, AccessException
+ {
+ try
+ {
+ ref.invoke(this, met_unbind,
+ new Object[] {p0},
+ 7305022919901907578L);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public Remote lookup(String p0)
+ throws RemoteException, NotBoundException, AccessException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_lookup,
+ new Object[] {p0},
+ -7538657168040752697L);
+ return (Remote) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public void bind(String p0, Remote p1)
+ throws RemoteException, AlreadyBoundException, AccessException
+ {
+ try
+ {
+ ref.invoke(this, met_bind,
+ new Object[] {p0, p1},
+ 7583982177005850366L);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+
+}
diff --git a/tools/gnu/classpath/tools/rmi/registry/package.html b/tools/gnu/classpath/tools/rmi/registry/package.html
new file mode 100644
index 000000000..71df83b61
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/registry/package.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- package.html - describes classes in gnu.java.rmi.registry package.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. -->
+
+<html>
+<head><title>GNU Classpath - gnu.classpath.tools.rmi.registry</title></head>
+
+<body>
+<p></p>
+
+</body>
+</html>
diff --git a/tools/gnu/classpath/tools/rmi/rmic/RmiMethodGenerator.java b/tools/gnu/classpath/tools/rmi/rmic/RmiMethodGenerator.java
index 9b7f9358b..8da486571 100644
--- a/tools/gnu/classpath/tools/rmi/rmic/RmiMethodGenerator.java
+++ b/tools/gnu/classpath/tools/rmi/rmic/RmiMethodGenerator.java
@@ -22,18 +22,7 @@
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
-
- As a special exception, the copyright holders of this library give you
- permission to link this library with independent modules to produce an
- executable, regardless of the license terms of these independent
- modules, and to copy and distribute the resulting executable under
- terms of your choice, provided that you also meet, for each linked
- independent module, the terms and conditions of the license of that
- module. An independent module is a module which is not derived from
- or based on this library. If you modify this library, you may extend
- this exception to your version of the library, but you are not
- obligated to do so. If you do not wish to do so, delete this
- exception statement from your version. */
+*/
package gnu.classpath.tools.rmi.rmic;
@@ -43,7 +32,6 @@ import gnu.java.rmi.server.RMIHashes;
import java.lang.reflect.Method;
import java.util.Properties;
-import java.util.zip.Adler32;
/**
* Keeps information about the single method and generates the code fragments,
diff --git a/tools/gnu/classpath/tools/rmi/rmic/RmicCompiler.java b/tools/gnu/classpath/tools/rmi/rmic/RmicCompiler.java
index 498dff7b2..bc51aad38 100644
--- a/tools/gnu/classpath/tools/rmi/rmic/RmicCompiler.java
+++ b/tools/gnu/classpath/tools/rmi/rmic/RmicCompiler.java
@@ -22,18 +22,7 @@ Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.rmi.rmic;
diff --git a/tools/gnu/classpath/tools/rmi/rmic/WrapUnWrapper.java b/tools/gnu/classpath/tools/rmi/rmic/WrapUnWrapper.java
index 6451a7074..8ee4fa5f2 100644
--- a/tools/gnu/classpath/tools/rmi/rmic/WrapUnWrapper.java
+++ b/tools/gnu/classpath/tools/rmi/rmic/WrapUnWrapper.java
@@ -17,28 +17,11 @@ You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
+*/
package gnu.classpath.tools.rmi.rmic;
-import java.lang.reflect.Method;
public class WrapUnWrapper
{
diff --git a/tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12Method.jav b/tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12Method.jav
index 1069884b9..9aaf8f5ad 100644
--- a/tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12Method.jav
+++ b/tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12Method.jav
@@ -19,7 +19,7 @@
catch (Exception e)
{
UnexpectedException uex = new UnexpectedException(exception_message);
- uex.initCause(e);
+ uex.detail = e;
throw uex;
}
}
diff --git a/tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12MethodVoid.jav b/tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12MethodVoid.jav
index f67098a4f..860a93c84 100644
--- a/tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12MethodVoid.jav
+++ b/tools/gnu/classpath/tools/rmi/rmic/templates/Stub_12MethodVoid.jav
@@ -18,7 +18,7 @@
catch (Exception e)
{
UnexpectedException uex = new UnexpectedException(exception_message);
- uex.initCause(e);
+ uex.detail = e;
throw uex;
}
}
diff --git a/tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl.java b/tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl.java
new file mode 100644
index 000000000..dda40b06c
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl.java
@@ -0,0 +1,244 @@
+/* ActivationSystemImpl.java -- implementation of the activation system.
+ Copyright (c) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath.tools.rmi.rmid;
+
+import gnu.classpath.tools.rmi.Persistent;
+import gnu.classpath.tools.rmi.PersistentBidiHashTable;
+import gnu.java.rmi.activation.ActivationSystemTransient;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.rmi.MarshalledObject;
+import java.rmi.RemoteException;
+import java.rmi.activation.ActivationDesc;
+import java.rmi.activation.ActivationException;
+import java.rmi.activation.ActivationGroupDesc;
+import java.rmi.activation.ActivationGroupID;
+import java.rmi.activation.ActivationID;
+import java.rmi.activation.ActivationInstantiator;
+import java.rmi.activation.ActivationMonitor;
+import java.rmi.activation.ActivationSystem;
+import java.rmi.activation.Activator;
+import java.rmi.activation.UnknownGroupException;
+import java.rmi.activation.UnknownObjectException;
+
+/**
+ * Implements the rmid activation system.
+ *
+ * @author Audrius Meskauskas (audriusa@bioinformatics.org)
+ */
+public class ActivationSystemImpl extends ActivationSystemTransient implements
+ ActivationSystem, Activator, ActivationMonitor, Serializable
+{
+ /**
+ * Use for interoperability.
+ */
+ private static final long serialVersionUID = 1;
+
+ /**
+ * The singleton instance of this class.
+ */
+ public static ActivationSystemImpl singleton2;
+
+ /**
+ * Obtain the singleton instance of this class.
+ *
+ * @param folder the folder, where the activation system will keep its files.
+ * @param cold do the cold start if true, hot (usual) if false.
+ */
+ public static ActivationSystem getInstance(File folder, boolean cold)
+ {
+ if (singleton2 == null)
+ singleton2 = new ActivationSystemImpl(folder, cold);
+ return singleton2;
+ }
+
+ /**
+ * Creates the group with transient maps.
+ *
+ * @param folder
+ * the folder, where the activation system will keep its files.
+ * @param cold
+ * do the cold start if true, hot (usual) if false.
+ */
+ protected ActivationSystemImpl(File folder, boolean cold)
+ {
+ super(new PersistentBidiHashTable(), new PersistentBidiHashTable());
+ singleton2 = this;
+ ((PersistentBidiHashTable) groupDescs).init(
+ new File(folder, "asi_objects.data"), cold);
+ ((PersistentBidiHashTable) descriptions).init(
+ new File(folder, "asi_groups.data"), cold);
+ }
+
+ /** @inheritDoc */
+ public MarshalledObject activate(ActivationID id, boolean force)
+ throws ActivationException, UnknownObjectException, RemoteException
+ {
+ return super.activate(id, force);
+ }
+
+ /** @inheritDoc */
+ public ActivationMonitor activeGroup(ActivationGroupID id,
+ ActivationInstantiator group,
+ long incarnation)
+ throws UnknownGroupException, ActivationException, RemoteException
+ {
+ return super.activeGroup(id, group, incarnation);
+ }
+
+ /** @inheritDoc */
+ public void activeObject(ActivationID id, MarshalledObject obj)
+ throws UnknownObjectException, RemoteException
+ {
+ super.activeObject(id, obj);
+ }
+
+ /** @inheritDoc */
+ public ActivationDesc getActivationDesc(ActivationID id)
+ throws ActivationException, UnknownObjectException, RemoteException
+ {
+ return super.getActivationDesc(id);
+ }
+
+ public ActivationGroupDesc getActivationGroupDesc(ActivationGroupID groupId)
+ throws ActivationException, UnknownGroupException, RemoteException
+ {
+ return super.getActivationGroupDesc(groupId);
+ }
+
+ /** @inheritDoc */
+ public void inactiveGroup(ActivationGroupID groupId, long incarnation)
+ throws UnknownGroupException, RemoteException
+ {
+ super.inactiveGroup(groupId, incarnation);
+ }
+
+ /** @inheritDoc */
+ public void inactiveObject(ActivationID id) throws UnknownObjectException,
+ RemoteException
+ {
+ super.inactiveObject(id);
+ }
+
+ /** @inheritDoc */
+ public ActivationGroupID registerGroup(ActivationGroupDesc groupDesc)
+ throws ActivationException, RemoteException
+ {
+ return super.registerGroup(groupDesc);
+ }
+
+ /** @inheritDoc */
+ public ActivationID registerObject(ActivationDesc desc)
+ throws ActivationException, UnknownGroupException, RemoteException
+ {
+ return super.registerObject(desc);
+ }
+
+ /** @inheritDoc */
+ public ActivationDesc setActivationDesc(ActivationID id, ActivationDesc desc)
+ throws ActivationException, UnknownObjectException,
+ UnknownGroupException, RemoteException
+ {
+ return super.setActivationDesc(id, desc);
+ }
+
+ /** @inheritDoc */
+ public ActivationGroupDesc setActivationGroupDesc(
+ ActivationGroupID groupId, ActivationGroupDesc groupDesc)
+ throws ActivationException, UnknownGroupException, RemoteException
+ {
+ return super.setActivationGroupDesc(groupId, groupDesc);
+ }
+
+ /**
+ * This method saves the state of the activation system and then
+ * terminates in 10 seconds.
+ */
+ public void shutdown() throws RemoteException
+ {
+ super.shutdown();
+ System.out.println("Shutdown command received. Will terminate in 10 s");
+ Persistent.timer.schedule(new Persistent.ExitTask(), 10000);
+ }
+
+ /** @inheritDoc */
+ public void unregisterGroup(ActivationGroupID groupId)
+ throws ActivationException, UnknownGroupException, RemoteException
+ {
+ super.unregisterGroup(groupId);
+ }
+
+ /** @inheritDoc */
+ public void unregisterObject(ActivationID id) throws ActivationException,
+ UnknownObjectException, RemoteException
+ {
+ super.unregisterObject(id);
+ }
+
+ /**
+ * Read the object from the input stream.
+ *
+ * @param in the stream to read from
+ *
+ * @throws IOException if thrown by the stream
+ * @throws ClassNotFoundException
+ */
+ private void readObject(ObjectInputStream in) throws IOException,
+ ClassNotFoundException
+ {
+ // Read no fields.
+ }
+
+ /**
+ * Write the object to the output stream.
+ *
+ * @param out the stream to write int
+ * @throws IOException if thrown by the stream
+ * @throws ClassNotFoundException
+ */
+ private void writeObject(ObjectOutputStream out) throws IOException,
+ ClassNotFoundException
+ {
+ // Write no fields.
+ };
+
+}
diff --git a/tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl_Stub.java b/tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl_Stub.java
new file mode 100644
index 000000000..22fa10e4b
--- /dev/null
+++ b/tools/gnu/classpath/tools/rmi/rmid/ActivationSystemImpl_Stub.java
@@ -0,0 +1,556 @@
+/* ActivationSystemImpl.java -- implementation of the activation system.
+ Copyright (c) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.tools.rmi.rmid;
+
+import java.rmi.MarshalledObject;
+import java.rmi.RemoteException;
+import java.rmi.activation.ActivationDesc;
+import java.rmi.activation.ActivationException;
+import java.rmi.activation.ActivationGroupDesc;
+import java.rmi.activation.ActivationGroupID;
+import java.rmi.activation.ActivationID;
+import java.rmi.activation.ActivationInstantiator;
+import java.rmi.activation.ActivationMonitor;
+import java.rmi.activation.ActivationSystem;
+import java.rmi.activation.Activator;
+import java.rmi.activation.UnknownGroupException;
+import java.rmi.activation.UnknownObjectException;
+
+import java.lang.reflect.Method;
+import java.rmi.server.RemoteRef;
+import java.rmi.server.RemoteStub;
+import java.rmi.UnexpectedException;
+
+/**
+ * This class delegates its method calls to the remote RMI object, referenced
+ * by {@link RemoteRef}.
+ *
+ * It is normally generated with rmic.
+ */
+public final class ActivationSystemImpl_Stub
+ extends RemoteStub
+ implements ActivationMonitor, Activator, ActivationSystem
+{
+ /**
+ * Use serialVersionUID for interoperability
+ */
+ private static final long serialVersionUID = 2;
+
+ /**
+ * The explaining message for {@ling UnexpectedException}.
+ */
+ private static final String exception_message =
+ "undeclared checked exception";
+
+ /* All remote methods, invoked by this stub: */
+ private static final Method met_setActivationGroupDesc;
+ private static final Method met_inactiveGroup;
+ private static final Method met_unregisterObject;
+ private static final Method met_getActivationDesc;
+ private static final Method met_setActivationDesc;
+ private static final Method met_shutdown;
+ private static final Method met_activate;
+ private static final Method met_activeGroup;
+ private static final Method met_registerGroup;
+ private static final Method met_getActivationGroupDesc;
+ private static final Method met_activeObject;
+ private static final Method met_registerObject;
+ private static final Method met_inactiveObject;
+ private static final Method met_unregisterGroup;
+ private static final Object[] NO_ARGS = new Object[0];
+ static
+ {
+ final Class[] NO_ARGSc = new Class[0];
+ try
+ {
+ met_setActivationGroupDesc =
+ ActivationSystem.class.getMethod("setActivationGroupDesc", new Class[]
+ {
+ ActivationGroupID.class, ActivationGroupDesc.class
+ });
+ met_inactiveGroup =
+ ActivationMonitor.class.getMethod("inactiveGroup", new Class[]
+ {
+ ActivationGroupID.class, long.class
+ });
+ met_unregisterObject =
+ ActivationSystem.class.getMethod("unregisterObject", new Class[]
+ {
+ ActivationID.class
+ });
+ met_getActivationDesc =
+ ActivationSystem.class.getMethod("getActivationDesc", new Class[]
+ {
+ ActivationID.class
+ });
+ met_setActivationDesc =
+ ActivationSystem.class.getMethod("setActivationDesc", new Class[]
+ {
+ ActivationID.class, ActivationDesc.class
+ });
+ met_shutdown =
+ ActivationSystem.class.getMethod("shutdown", NO_ARGSc);
+ met_activate =
+ Activator.class.getMethod("activate", new Class[]
+ {
+ ActivationID.class, boolean.class
+ });
+ met_activeGroup =
+ ActivationSystem.class.getMethod("activeGroup", new Class[]
+ {
+ ActivationGroupID.class, ActivationInstantiator.class, long.class
+ });
+ met_registerGroup =
+ ActivationSystem.class.getMethod("registerGroup", new Class[]
+ {
+ ActivationGroupDesc.class
+ });
+ met_getActivationGroupDesc =
+ ActivationSystem.class.getMethod("getActivationGroupDesc", new Class[]
+ {
+ ActivationGroupID.class
+ });
+ met_activeObject =
+ ActivationMonitor.class.getMethod("activeObject", new Class[]
+ {
+ ActivationID.class, MarshalledObject.class
+ });
+ met_registerObject =
+ ActivationSystem.class.getMethod("registerObject", new Class[]
+ {
+ ActivationDesc.class
+ });
+ met_inactiveObject =
+ ActivationMonitor.class.getMethod("inactiveObject", new Class[]
+ {
+ ActivationID.class
+ });
+ met_unregisterGroup =
+ ActivationSystem.class.getMethod("unregisterGroup", new Class[]
+ {
+ ActivationGroupID.class
+ });
+
+ }
+ catch (NoSuchMethodException nex)
+ {
+ NoSuchMethodError err = new NoSuchMethodError(
+ "ActivationSystemImpl_Stub class initialization failed");
+ err.initCause(nex);
+ throw err;
+ }
+ }
+
+ /**
+ * Create the instance for _ActivationSystemImpl_Stub that forwards method calls to the
+ * remote object.
+ *
+ * @para the reference to the remote object.
+ */
+ public ActivationSystemImpl_Stub(RemoteRef reference)
+ {
+ super(reference);
+ }
+
+ /* Methods */
+ /** @inheritDoc */
+ public ActivationGroupDesc setActivationGroupDesc(ActivationGroupID p0,
+ ActivationGroupDesc p1)
+ throws ActivationException, UnknownGroupException, RemoteException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_setActivationGroupDesc,
+ new Object[] { p0, p1 },
+ 1213918527826541191L);
+ return (ActivationGroupDesc) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public void inactiveGroup(ActivationGroupID p0, long p1)
+ throws UnknownGroupException, RemoteException
+ {
+ try
+ {
+ ref.invoke(this, met_inactiveGroup, new Object[] { p0, new Long(p1) },
+ -399287892768650944L);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public void unregisterObject(ActivationID p0) throws ActivationException,
+ UnknownObjectException, RemoteException
+ {
+ try
+ {
+ ref.invoke(this, met_unregisterObject, new Object[] { p0 },
+ -6843850585331411084L);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public ActivationDesc getActivationDesc(ActivationID p0)
+ throws ActivationException, UnknownObjectException, RemoteException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_getActivationDesc,
+ new Object[] { p0 }, 4830055440982622087L);
+ return (ActivationDesc) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public ActivationDesc setActivationDesc(ActivationID p0, ActivationDesc p1)
+ throws ActivationException, UnknownObjectException,
+ UnknownGroupException, RemoteException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_setActivationDesc,
+ new Object[] { p0, p1 },
+ 7128043237057180796L);
+ return (ActivationDesc) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public void shutdown() throws RemoteException
+ {
+ try
+ {
+ ref.invoke(this, met_shutdown, NO_ARGS, -7207851917985848402L);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public MarshalledObject activate(ActivationID p0, boolean p1)
+ throws ActivationException, UnknownObjectException, RemoteException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_activate,
+ new Object[] { p0, new Boolean(p1) },
+ -8767355154875805558L);
+ return (MarshalledObject) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public ActivationMonitor activeGroup(ActivationGroupID p0,
+ ActivationInstantiator p1, long p2)
+ throws UnknownGroupException, ActivationException, RemoteException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_activeGroup,
+ new Object[] { p0, p1, new Long(p2) },
+ -4575843150759415294L);
+ return (ActivationMonitor) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public ActivationGroupID registerGroup(ActivationGroupDesc p0)
+ throws ActivationException, RemoteException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_registerGroup,
+ new Object[] { p0 }, 6921515268192657754L);
+ return (ActivationGroupID) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public ActivationGroupDesc getActivationGroupDesc(ActivationGroupID p0)
+ throws ActivationException, UnknownGroupException, RemoteException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_getActivationGroupDesc,
+ new Object[] { p0 }, -8701843806548736528L);
+ return (ActivationGroupDesc) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public void activeObject(ActivationID p0, MarshalledObject p1)
+ throws UnknownObjectException, RemoteException
+ {
+ try
+ {
+ ref.invoke(this, met_activeObject, new Object[] { p0, p1 },
+ 2543984342209939736L);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public ActivationID registerObject(ActivationDesc p0)
+ throws ActivationException, UnknownGroupException, RemoteException
+ {
+ try
+ {
+ Object result = ref.invoke(this, met_registerObject,
+ new Object[] { p0 }, -3006759798994351347L);
+ return (ActivationID) result;
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public void inactiveObject(ActivationID p0) throws UnknownObjectException,
+ RemoteException
+ {
+ try
+ {
+ ref.invoke(this, met_inactiveObject, new Object[] { p0 },
+ -4165404120701281807L);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+ /** @inheritDoc */
+ public void unregisterGroup(ActivationGroupID p0) throws ActivationException,
+ UnknownGroupException, RemoteException
+ {
+ try
+ {
+ ref.invoke(this, met_unregisterGroup, new Object[] { p0 },
+ 3768097077835970701L);
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (RemoteException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ UnexpectedException uex = new UnexpectedException(exception_message);
+ uex.detail = e;
+ throw uex;
+ }
+ }
+
+
+}
diff --git a/tools/jarsigner.in b/tools/jarsigner.in
new file mode 100644
index 000000000..cea95a288
--- /dev/null
+++ b/tools/jarsigner.in
@@ -0,0 +1,63 @@
+#!/bin/sh
+
+## Copyright (C) 2006 Free Software Foundation, Inc.
+##
+## This file is a part of GNU Classpath.
+##
+## GNU Classpath is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or (at
+## your option) any later version.
+##
+## GNU Classpath is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with GNU Classpath; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+## USA.
+##
+## Linking this library statically or dynamically with other modules is
+## making a combined work based on this library. Thus, the terms and
+## conditions of the GNU General Public License cover the whole
+## combination.
+##
+## As a special exception, the copyright holders of this library give you
+## permission to link this library with independent modules to produce an
+## executable, regardless of the license terms of these independent
+## modules, and to copy and distribute the resulting executable under
+## terms of your choice, provided that you also meet, for each linked
+## independent module, the terms and conditions of the license of that
+## module. An independent module is a module which is not derived from
+## or based on this library. If you modify this library, you may extend
+## this exception to your version of the library, but you are not
+## obligated to do so. If you do not wish to do so, delete this
+## exception statement from your version.
+##
+##
+## A simple shell script to launch the GNU Classpath jarsigner tool.
+##
+
+prefix=@prefix@
+tools_dir=@datadir@/@PACKAGE@
+tools_cp=${tools_dir}/tools.zip
+
+# find the java executable...
+if [ -z "${JAVA}" ] ; then
+ if [ -n "${JAVA_HOME}" ] ; then
+ if [ -x "${JAVA_HOME}/jre/sh/java" ] ; then
+ JAVA="${JAVA_HOME}/jre/sh/java"
+ else
+ JAVA="${JAVA_HOME}/bin/java"
+ fi
+ else
+ JAVA=`which java 2> /dev/null `
+ if [ -z "${JAVA}" ] ; then
+ JAVA=java
+ fi
+ fi
+fi
+
+exec "${JAVA}" -Xbootclasspath/p:"${tools_cp}" gnu.classpath.tools.jarsigner.Main $@
diff --git a/tools/keytool.in b/tools/keytool.in
new file mode 100644
index 000000000..6c11dc407
--- /dev/null
+++ b/tools/keytool.in
@@ -0,0 +1,63 @@
+#!/bin/sh
+
+## Copyright (C) 2006 Free Software Foundation, Inc.
+##
+## This file is a part of GNU Classpath.
+##
+## GNU Classpath is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or (at
+## your option) any later version.
+##
+## GNU Classpath is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with GNU Classpath; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+## USA.
+##
+## Linking this library statically or dynamically with other modules is
+## making a combined work based on this library. Thus, the terms and
+## conditions of the GNU General Public License cover the whole
+## combination.
+##
+## As a special exception, the copyright holders of this library give you
+## permission to link this library with independent modules to produce an
+## executable, regardless of the license terms of these independent
+## modules, and to copy and distribute the resulting executable under
+## terms of your choice, provided that you also meet, for each linked
+## independent module, the terms and conditions of the license of that
+## module. An independent module is a module which is not derived from
+## or based on this library. If you modify this library, you may extend
+## this exception to your version of the library, but you are not
+## obligated to do so. If you do not wish to do so, delete this
+## exception statement from your version.
+##
+##
+## A simple shell script to launch the GNU Classpath keytool tool.
+##
+
+prefix=@prefix@
+tools_dir=@datadir@/@PACKAGE@
+tools_cp=${tools_dir}/tools.zip
+
+# find the java executable...
+if [ -z "${JAVA}" ] ; then
+ if [ -n "${JAVA_HOME}" ] ; then
+ if [ -x "${JAVA_HOME}/jre/sh/java" ] ; then
+ JAVA="${JAVA_HOME}/jre/sh/java"
+ else
+ JAVA="${JAVA_HOME}/bin/java"
+ fi
+ else
+ JAVA=`which java 2> /dev/null `
+ if [ -z "${JAVA}" ] ; then
+ JAVA=java
+ fi
+ fi
+fi
+
+exec "${JAVA}" -Xbootclasspath/p:"${tools_cp}" gnu.classpath.tools.keytool.Main $@
diff --git a/vm/reference/gnu/classpath/Unsafe.java b/vm/reference/gnu/classpath/Unsafe.java
new file mode 100644
index 000000000..6e4ec9802
--- /dev/null
+++ b/vm/reference/gnu/classpath/Unsafe.java
@@ -0,0 +1,328 @@
+/* Unsafe.java - Unsafe operations needed for concurrency
+ Copyright (C) 2006 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.classpath;
+
+import java.lang.reflect.Field;
+
+/**
+ * This class should provide access to low-level operations and its
+ * use should be limited to trusted code. Fields can be accessed using
+ * memory addresses, with undefined behaviour occurring if invalid memory
+ * addresses are given.
+ *
+ * @author Tom Tromey (tromey@redhat.com)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
+ */
+public final class Unsafe
+{
+ // Singleton class.
+ private static Unsafe unsafe = new Unsafe();
+
+ /**
+ * Private default constructor to prevent creation of an arbitrary
+ * number of instances.
+ */
+ private Unsafe()
+ {
+ }
+
+ /**
+ * Retrieve the singleton instance of <code>Unsafe</code>. The calling
+ * method should guard this instance from untrusted code, as it provides
+ * access to low-level operations such as direct memory access.
+ *
+ * @throws SecurityException if a security manager exists and prevents
+ * access to the system properties.
+ */
+ public static Unsafe getUnsafe()
+ {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkPropertiesAccess();
+ return unsafe;
+ }
+
+ /**
+ * Returns the memory address offset of the given static field.
+ * The offset is merely used as a means to access a particular field
+ * in the other methods of this class. The value is unique to the given
+ * field and the same value should be returned on each subsequent call.
+ *
+ * @param field the field whose offset should be returned.
+ * @return the offset of the given field.
+ */
+ public native long objectFieldOffset(Field field);
+
+ /**
+ * Compares the value of the integer field at the specified offset
+ * in the supplied object with the given expected value, and updates
+ * it if they match. The operation of this method should be atomic,
+ * thus providing an uninterruptible way of updating an integer field.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the integer field within <code>obj</code>.
+ * @param expect the expected value of the field.
+ * @param update the new value of the field if it equals <code>expect</code>.
+ * @return true if the field was changed.
+ */
+ public native boolean compareAndSwapInt(Object obj, long offset,
+ int expect, int update);
+
+ /**
+ * Compares the value of the long field at the specified offset
+ * in the supplied object with the given expected value, and updates
+ * it if they match. The operation of this method should be atomic,
+ * thus providing an uninterruptible way of updating a long field.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the long field within <code>obj</code>.
+ * @param expect the expected value of the field.
+ * @param update the new value of the field if it equals <code>expect</code>.
+ * @return true if the field was changed.
+ */
+ public native boolean compareAndSwapLong(Object obj, long offset,
+ long expect, long update);
+
+ /**
+ * Compares the value of the object field at the specified offset
+ * in the supplied object with the given expected value, and updates
+ * it if they match. The operation of this method should be atomic,
+ * thus providing an uninterruptible way of updating an object field.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the object field within <code>obj</code>.
+ * @param expect the expected value of the field.
+ * @param update the new value of the field if it equals <code>expect</code>.
+ * @return true if the field was changed.
+ */
+ public native boolean compareAndSwapObject(Object obj, long offset,
+ Object expect, Object update);
+
+ /**
+ * Sets the value of the integer field at the specified offset in the
+ * supplied object to the given value. This is an ordered or lazy
+ * version of <code>putIntVolatile(Object,long,int)</code>, which
+ * doesn't guarantee the immediate visibility of the change to other
+ * threads. It is only really useful where the integer field is
+ * <code>volatile</code>, and is thus expected to change unexpectedly.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the integer field within <code>obj</code>.
+ * @param value the new value of the field.
+ * @see #putIntVolatile(Object,long,int)
+ */
+ public native void putOrderedInt(Object obj, long offset, int value);
+
+ /**
+ * Sets the value of the long field at the specified offset in the
+ * supplied object to the given value. This is an ordered or lazy
+ * version of <code>putLongVolatile(Object,long,long)</code>, which
+ * doesn't guarantee the immediate visibility of the change to other
+ * threads. It is only really useful where the long field is
+ * <code>volatile</code>, and is thus expected to change unexpectedly.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the long field within <code>obj</code>.
+ * @param value the new value of the field.
+ * @see #putLongVolatile(Object,long,long)
+ */
+ public native void putOrderedLong(Object obj, long offset, long value);
+
+ /**
+ * Sets the value of the object field at the specified offset in the
+ * supplied object to the given value. This is an ordered or lazy
+ * version of <code>putObjectVolatile(Object,long,Object)</code>, which
+ * doesn't guarantee the immediate visibility of the change to other
+ * threads. It is only really useful where the object field is
+ * <code>volatile</code>, and is thus expected to change unexpectedly.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the object field within <code>obj</code>.
+ * @param value the new value of the field.
+ */
+ public native void putOrderedObject(Object obj, long offset, Object value);
+
+ /**
+ * Sets the value of the integer field at the specified offset in the
+ * supplied object to the given value, with volatile store semantics.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the integer field within <code>obj</code>.
+ * @param value the new value of the field.
+ */
+ public native void putIntVolatile(Object obj, long offset, int value);
+
+ /**
+ * Retrieves the value of the integer field at the specified offset in the
+ * supplied object with volatile load semantics.
+ *
+ * @param obj the object containing the field to read.
+ * @param offset the offset of the integer field within <code>obj</code>.
+ */
+ public native int getIntVolatile(Object obj, long offset);
+
+ /**
+ * Sets the value of the long field at the specified offset in the
+ * supplied object to the given value, with volatile store semantics.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the long field within <code>obj</code>.
+ * @param value the new value of the field.
+ * @see #putLong(Object,long,long)
+ */
+ public native void putLongVolatile(Object obj, long offset, long value);
+
+ /**
+ * Sets the value of the long field at the specified offset in the
+ * supplied object to the given value.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the long field within <code>obj</code>.
+ * @param value the new value of the field.
+ * @see #putLongVolatile(Object,long,long)
+ */
+ public native void putLong(Object obj, long offset, long value);
+
+ /**
+ * Retrieves the value of the long field at the specified offset in the
+ * supplied object with volatile load semantics.
+ *
+ * @param obj the object containing the field to read.
+ * @param offset the offset of the long field within <code>obj</code>.
+ * @see #getLong(Object,long)
+ */
+ public native long getLongVolatile(Object obj, long offset);
+
+ /**
+ * Retrieves the value of the long field at the specified offset in the
+ * supplied object.
+ *
+ * @param obj the object containing the field to read.
+ * @param offset the offset of the long field within <code>obj</code>.
+ * @see #getLongVolatile(Object,long)
+ */
+ public native long getLong(Object obj, long offset);
+
+ /**
+ * Sets the value of the object field at the specified offset in the
+ * supplied object to the given value, with volatile store semantics.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the object field within <code>obj</code>.
+ * @param value the new value of the field.
+ * @see #putObject(Object,long,Object)
+ */
+ public native void putObjectVolatile(Object obj, long offset, Object value);
+
+ /**
+ * Sets the value of the object field at the specified offset in the
+ * supplied object to the given value.
+ *
+ * @param obj the object containing the field to modify.
+ * @param offset the offset of the object field within <code>obj</code>.
+ * @param value the new value of the field.
+ * @see #putObjectVolatile(Object,long,Object)
+ */
+ public native void putObject(Object obj, long offset, Object value);
+
+ /**
+ * Retrieves the value of the object field at the specified offset in the
+ * supplied object with volatile load semantics.
+ *
+ * @param obj the object containing the field to read.
+ * @param offset the offset of the object field within <code>obj</code>.
+ */
+ public native Object getObjectVolatile(Object obj, long offset);
+
+ /**
+ * Returns the offset of the first element for a given array class.
+ * To access elements of the array class, this value may be used along
+ * with that returned by
+ * <a href="#arrayIndexScale"><code>arrayIndexScale</code></a>,
+ * if non-zero.
+ *
+ * @param arrayClass the class for which the first element's address should
+ * be obtained.
+ * @return the offset of the first element of the array class.
+ * @see #arrayIndexScale(Class)
+ */
+ public native int arrayBaseOffset(Class arrayClass);
+
+ /**
+ * Returns the scale factor used for addressing elements of the supplied
+ * array class. Where a suitable scale factor can not be returned (e.g.
+ * for primitive types), zero should be returned. The returned value
+ * can be used with
+ * <a href="#arrayBaseOffset"><code>arrayBaseOffset</code></a>
+ * to access elements of the class.
+ *
+ * @param arrayClass the class whose scale factor should be returned.
+ * @return the scale factor, or zero if not supported for this array class.
+ */
+ public native int arrayIndexScale(Class arrayClass);
+
+ /**
+ * Releases the block on a thread created by
+ * <a href="#park"><code>park</code></a>. This method can also be used
+ * to terminate a blockage caused by a prior call to <code>park</code>.
+ * This operation is unsafe, as the thread must be guaranteed to be
+ * live. This is true of Java, but not native code.
+ *
+ * @param thread the thread to unblock.
+ */
+ public native void unpark(Thread thread);
+
+ /**
+ * Blocks the thread until a matching
+ * <a href="#unpark"><code>unpark</code></a> occurs, the thread is
+ * interrupted or the optional timeout expires. If an <code>unpark</code>
+ * call has already occurred, this also counts. A timeout value of zero
+ * is defined as no timeout. When <code>isAbsolute</code> is
+ * <code>true</code>, the timeout is in milliseconds relative to the
+ * epoch. Otherwise, the value is the number of nanoseconds which must
+ * occur before timeout. This call may also return spuriously (i.e.
+ * for no apparent reason).
+ *
+ * @param isAbsolute true if the timeout is specified in milliseconds from
+ * the epoch.
+ * @param time either the number of nanoseconds to wait, or a time in
+ * milliseconds from the epoch to wait for.
+ */
+ public native void park(boolean isAbsolute, long time);
+
+}
diff --git a/vm/reference/gnu/java/lang/VMInstrumentationImpl.java b/vm/reference/gnu/java/lang/VMInstrumentationImpl.java
new file mode 100644
index 000000000..eee94702d
--- /dev/null
+++ b/vm/reference/gnu/java/lang/VMInstrumentationImpl.java
@@ -0,0 +1,108 @@
+/* VMInstrumentationImpl.java -- interface for the GNU implementation
+ of InstrumentationImpl
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.lang;
+
+import java.lang.instrument.ClassDefinition;
+import java.lang.instrument.Instrumentation;
+
+/**
+ * @author Nicolas Geoffray (nicolas.geoffray@menlina.com)
+ * @since 1.5
+ */
+final class VMInstrumentationImpl
+{
+
+ /**
+ * Returns if the current JVM supports class redefinition
+ *
+ * @return true if the current JVM supports class redefinition
+ */
+ static native boolean isRedefineClassesSupported();
+
+ /**
+ * Redefines classes given as parameters. The method has to call
+ * the callTransformers from InstrumentationImpl
+ *
+ * @param inst an instrumentation object
+ * @param definitions an array of bytecode<->class correspondance
+ *
+ * @throws ClassNotFoundException if a class cannot be found
+ * @throws UnmodifiableClassException if a class cannot be modified
+ * @throws UnsupportedOperationException if the JVM does not support
+ * redefinition or the redefinition made unsupported changes
+ * @throws ClassFormatError if a class file is not valid
+ * @throws NoClassDefFoundError if a class name is not equal to the name
+ * in the class file specified
+ * @throws UnsupportedClassVersionError if the class file version numbers
+ * are unsupported
+ * @throws ClassCircularityError if circularity occured with the new
+ * classes
+ * @throws LinkageError if a linkage error occurs
+ */
+ static native void redefineClasses(Instrumentation inst,
+ ClassDefinition[] definitions);
+
+ /**
+ * Get all the classes loaded by the JVM.
+ *
+ * @return an array containing all the classes loaded by the JVM. The array
+ * is empty if no class is loaded.
+ */
+ static native Class[] getAllLoadedClasses();
+
+ /**
+ * Get all the classes loaded by a given class loader
+ *
+ * @param loader the loader
+ *
+ * @return an array containing all the classes loaded by the given loader.
+ * The array is empty if no class was loaded by the loader.
+ */
+ static native Class[] getInitiatedClasses(ClassLoader loader);
+
+ /**
+ * Get the size of an object. The object is not null
+ *
+ * @param objectToSize the object
+ * @return the size of the object
+ */
+ static native long getObjectSize(Object objectToSize);
+
+}
diff --git a/vm/reference/java/lang/VMClass.java b/vm/reference/java/lang/VMClass.java
index 1b4c13e6b..25965068d 100644
--- a/vm/reference/java/lang/VMClass.java
+++ b/vm/reference/java/lang/VMClass.java
@@ -1,5 +1,5 @@
/* VMClass.java -- VM Specific Class methods
- Copyright (C) 2003, 2004 Free Software Foundation
+ Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation
This file is part of GNU Classpath.
@@ -37,11 +37,14 @@ exception statement from your version. */
package java.lang;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
/*
* This class is a reference version, mainly for compiling a class library
@@ -51,9 +54,11 @@ import java.lang.reflect.Modifier;
/**
*
- * @author Etienne Gagnon <etienne.gagnon@uqam.ca>
- * @author Archie Cobbs <archie@dellroad.org>
- * @author C. Brian Jones <cbj@gnu.org>
+ * @author Etienne Gagnon (etienne.gagnon@uqam.ca)
+ * @author Archie Cobbs (archie@dellroad.org)
+ * @author C. Brian Jones (cbj@gnu.org)
+ * @author Tom Tromey (tromey@cygnus.com)
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
*/
final class VMClass
{
@@ -278,4 +283,172 @@ final class VMClass
*/
static native void throwException(Throwable t);
+ /**
+ * Returns the simple name for the specified class, as used in the source
+ * code. For normal classes, this is the content returned by
+ * <code>getName()</code> which follows the last ".". Anonymous
+ * classes have no name, and so the result of calling this method is
+ * "". The simple name of an array consists of the simple name of
+ * its component type, followed by "[]". Thus, an array with the
+ * component type of an anonymous class has a simple name of simply
+ * "[]".
+ *
+ * @param klass the class whose simple name should be returned.
+ * @return the simple name for this class.
+ */
+ static String getSimpleName(Class klass)
+ {
+ if (isArray(klass))
+ {
+ return getComponentType(klass).getSimpleName() + "[]";
+ }
+ String fullName = getName(klass);
+ return fullName.substring(fullName.lastIndexOf(".") + 1);
+ }
+
+ /**
+ * Returns all annotations directly defined by the specified class. If
+ * there are no annotations associated with this class, then a zero-length
+ * array will be returned. The returned array may be modified by the client
+ * code, but this will have no effect on the annotation content of this
+ * class, and hence no effect on the return value of this method for
+ * future callers.
+ *
+ * @param klass the class whose annotations should be returned.
+ * @return the annotations directly defined by the specified class.
+ * @since 1.5
+ */
+ static native Annotation[] getDeclaredAnnotations(Class klass);
+
+ /**
+ * <p>
+ * Returns the canonical name of the specified class, as defined by section
+ * 6.7 of the Java language specification. Each package, top-level class,
+ * top-level interface and primitive type has a canonical name. A member
+ * class has a canonical name, if its parent class has one. Likewise,
+ * an array type has a canonical name, if its component type does.
+ * Local or anonymous classes do not have canonical names.
+ * </p>
+ * <p>
+ * The canonical name for top-level classes, top-level interfaces and
+ * primitive types is always the same as the fully-qualified name.
+ * For array types, the canonical name is the canonical name of its
+ * component type with `[]' appended.
+ * </p>
+ * <p>
+ * The canonical name of a member class always refers to the place where
+ * the class was defined, and is composed of the canonical name of the
+ * defining class and the simple name of the member class, joined by `.'.
+ * For example, if a <code>Person</code> class has an inner class,
+ * <code>M</code>, then both its fully-qualified name and canonical name
+ * is <code>Person.M</code>. A subclass, <code>Staff</code>, of
+ * <code>Person</code> refers to the same inner class by the fully-qualified
+ * name of <code>Staff.M</code>, but its canonical name is still
+ * <code>Person.M</code>.
+ * </p>
+ * <p>
+ * Where no canonical name is present, <code>null</code> is returned.
+ * </p>
+ *
+ * @param klass the class whose canonical name should be retrieved.
+ * @return the canonical name of the class, or <code>null</code> if the
+ * class doesn't have a canonical name.
+ * @since 1.5
+ */
+ static String getCanonicalName(Class klass)
+ {
+ if (isArray(klass))
+ {
+ String componentName = getComponentType(klass).getCanonicalName();
+ if (componentName != null)
+ return componentName + "[]";
+ }
+ if (isMemberClass(klass))
+ {
+ String memberName = getDeclaringClass(klass).getCanonicalName();
+ if (memberName != null)
+ return memberName + "." + getSimpleName(klass);
+ }
+ if (isLocalClass(klass) || isAnonymousClass(klass))
+ return null;
+ return getName(klass);
+ }
+
+ /**
+ * Returns the class which immediately encloses the specified class. If
+ * the class is a top-level class, this method returns <code>null</code>.
+ *
+ * @param klass the class whose enclosing class should be returned.
+ * @return the immediate enclosing class, or <code>null</code> if this is
+ * a top-level class.
+ * @since 1.5
+ */
+ static native Class getEnclosingClass(Class klass);
+
+ /**
+ * Returns the constructor which immediately encloses the specified class.
+ * If the class is a top-level class, or a local or anonymous class
+ * immediately enclosed by a type definition, instance initializer
+ * or static initializer, then <code>null</code> is returned.
+ *
+ * @param klass the class whose enclosing constructor should be returned.
+ * @return the immediate enclosing constructor if the specified class is
+ * declared within a constructor. Otherwise, <code>null</code>
+ * is returned.
+ * @since 1.5
+ */
+ static native Constructor getEnclosingConstructor(Class klass);
+
+ /**
+ * Returns the method which immediately encloses the specified class. If
+ * the class is a top-level class, or a local or anonymous class
+ * immediately enclosed by a type definition, instance initializer
+ * or static initializer, then <code>null</code> is returned.
+ *
+ * @param klass the class whose enclosing method should be returned.
+ * @return the immediate enclosing method if the specified class is
+ * declared within a method. Otherwise, <code>null</code>
+ * is returned.
+ * @since 1.5
+ */
+ static native Method getEnclosingMethod(Class klass);
+
+ /**
+ * Returns the class signature as specified in Class File Format
+ * chapter in the VM specification, or null if the class is not
+ * generic.
+ *
+ * @param klass the klass to test.
+ * @return a ClassSignature string.
+ * @since 1.5
+ */
+ static native String getClassSignature(Class klass);
+
+ /**
+ * Returns true if the specified class represents an anonymous class.
+ *
+ * @param klass the klass to test.
+ * @return true if the specified class represents an anonymous class.
+ * @since 1.5
+ */
+ static native boolean isAnonymousClass(Class klass);
+
+ /**
+ * Returns true if the specified class represents an local class.
+ *
+ * @param klass the klass to test.
+ * @return true if the specified class represents an local class.
+ * @since 1.5
+ */
+ static native boolean isLocalClass(Class klass);
+
+ /**
+ * Returns true if the specified class represents an member class.
+ *
+ * @param klass the klass to test.
+ * @return true if the specified class represents an member class.
+ * @since 1.5
+ */
+ static native boolean isMemberClass(Class klass);
+
} // class VMClass
diff --git a/vm/reference/java/lang/VMClassLoader.java b/vm/reference/java/lang/VMClassLoader.java
index 7412afecc..4caa58c2a 100644
--- a/vm/reference/java/lang/VMClassLoader.java
+++ b/vm/reference/java/lang/VMClassLoader.java
@@ -1,6 +1,6 @@
/* VMClassLoader.java -- Reference implementation of native interface
required by ClassLoader
- Copyright (C) 1998, 2001, 2002, 2004, 2005 Free Software Foundation
+ Copyright (C) 1998, 2001, 2002, 2004, 2005, 2006 Free Software Foundation
This file is part of GNU Classpath.
@@ -39,17 +39,23 @@ exception statement from your version. */
package java.lang;
-import gnu.classpath.SystemProperties;
import gnu.classpath.Configuration;
+import gnu.classpath.SystemProperties;
+import gnu.java.lang.InstrumentationImpl;
+import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.instrument.Instrumentation;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.ProtectionDomain;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.zip.ZipFile;
@@ -98,6 +104,7 @@ final class VMClassLoader
"GNU Classpath",
"GNU",
Configuration.CLASSPATH_VERSION,
+ null,
null);
definedPackages.put(packages[i], p);
@@ -235,12 +242,46 @@ final class VMClassLoader
/**
* Returns a String[] of native package names. The default
- * implementation returns an empty array, or you may decide
- * this needs native help.
+ * implementation tries to load a list of package from
+ * the META-INF/INDEX.LIST file in the boot jar file.
+ * If not found or if any exception is raised, it returns
+ * an empty array. You may decide this needs native help.
*/
private static String[] getBootPackages()
{
- return new String[0];
+ URL indexList = getResource("META-INF/INDEX.LIST");
+ if (indexList != null)
+ {
+ try
+ {
+ Set packageSet = new HashSet();
+ String line;
+ int lineToSkip = 3;
+ BufferedReader reader = new BufferedReader(
+ new InputStreamReader(
+ indexList.openStream()));
+ while ((line = reader.readLine()) != null)
+ {
+ if (lineToSkip == 0)
+ {
+ if (line.length() == 0)
+ lineToSkip = 1;
+ else
+ packageSet.add(line.replace('/', '.'));
+ }
+ else
+ lineToSkip--;
+ }
+ reader.close();
+ return (String[]) packageSet.toArray(new String[packageSet.size()]);
+ }
+ catch (IOException e)
+ {
+ return new String[0];
+ }
+ }
+ else
+ return new String[0];
}
@@ -345,4 +386,45 @@ final class VMClassLoader
* for this class.
*/
static native Class findLoadedClass(ClassLoader cl, String name);
+
+ /**
+ * The Instrumentation object created by the vm when agents are defined.
+ */
+ static final Instrumentation instrumenter = null;
+
+ /**
+ * Call the transformers of the possible Instrumentation object. This
+ * implementation assumes the instrumenter is a
+ * <code>InstrumentationImpl</code> object. VM implementors would
+ * have to redefine this method if they provide their own implementation
+ * of the <code>Instrumentation</code> interface.
+ *
+ * @param loader the initiating loader
+ * @param name the name of the class
+ * @param data the data representing the classfile, in classfile format
+ * @param offset the offset into the data where the classfile starts
+ * @param len the length of the classfile data in the array
+ * @param pd the protection domain
+ * @return the new data representing the classfile
+ */
+ static final Class defineClassWithTransformers(ClassLoader loader,
+ String name, byte[] data, int offset, int len, ProtectionDomain pd)
+ {
+
+ if (instrumenter != null)
+ {
+ byte[] modifiedData = new byte[len];
+ System.arraycopy(data, offset, modifiedData, 0, len);
+ modifiedData =
+ ((InstrumentationImpl)instrumenter).callTransformers(loader, name,
+ null, pd, modifiedData);
+
+ return defineClass(loader, name, modifiedData, 0, modifiedData.length,
+ pd);
+ }
+ else
+ {
+ return defineClass(loader, name, data, offset, len, pd);
+ }
+ }
}
diff --git a/vm/reference/java/lang/VMProcess.java b/vm/reference/java/lang/VMProcess.java
index 26cfcc9bc..076e5999d 100644
--- a/vm/reference/java/lang/VMProcess.java
+++ b/vm/reference/java/lang/VMProcess.java
@@ -42,7 +42,10 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
/**
* Represents one external process. Each instance of this class is in
@@ -92,6 +95,7 @@ final class VMProcess extends Process
InputStream stdout; // process output stream
InputStream stderr; // process error stream
int exitValue; // process exit value
+ boolean redirect; // redirect stderr -> stdout
//
// Dedicated thread that does all the fork()'ing and wait()'ing
@@ -196,7 +200,8 @@ final class VMProcess extends Process
{
try
{
- process.nativeSpawn(process.cmd, process.env, process.dir);
+ process.nativeSpawn(process.cmd, process.env, process.dir,
+ process.redirect);
process.state = RUNNING;
activeMap.put(new Long(process.pid), process);
}
@@ -215,7 +220,8 @@ final class VMProcess extends Process
}
// Constructor
- private VMProcess(String[] cmd, String[] env, File dir) throws IOException
+ private VMProcess(String[] cmd, String[] env, File dir, boolean redirect)
+ throws IOException
{
// Initialize this process
@@ -223,6 +229,7 @@ final class VMProcess extends Process
this.cmd = cmd;
this.env = env;
this.dir = dir;
+ this.redirect = redirect;
// Add process to the new process work list and wakeup processThread
synchronized (workList)
@@ -275,11 +282,20 @@ final class VMProcess extends Process
// Invoked by native code (from nativeSpawn()) to record process info.
private void setProcessInfo(OutputStream stdin,
- InputStream stdout, InputStream stderr, long pid)
+ InputStream stdout, InputStream stderr, long pid)
{
this.stdin = stdin;
this.stdout = stdout;
- this.stderr = stderr;
+ if (stderr == null)
+ this.stderr = new InputStream()
+ {
+ public int read() throws IOException
+ {
+ return -1;
+ }
+ };
+ else
+ this.stderr = stderr;
this.pid = pid;
}
@@ -288,7 +304,24 @@ final class VMProcess extends Process
*/
static Process exec(String[] cmd, String[] env, File dir) throws IOException
{
- return new VMProcess(cmd, env, dir);
+ return new VMProcess(cmd, env, dir, false);
+ }
+
+ static Process exec(List cmd, Map env,
+ File dir, boolean redirect) throws IOException
+ {
+ String[] acmd = (String[]) cmd.toArray(new String[cmd.size()]);
+ String[] aenv = new String[env.size()];
+
+ int i = 0;
+ Iterator iter = env.entrySet().iterator();
+ while (iter.hasNext())
+ {
+ Map.Entry entry = (Map.Entry) iter.next();
+ aenv[i++] = entry.getKey() + "=" + entry.getValue();
+ }
+
+ return new VMProcess(acmd, aenv, dir, redirect);
}
public OutputStream getOutputStream()
@@ -347,7 +380,8 @@ final class VMProcess extends Process
*
* @throws IOException if the O/S process could not be created.
*/
- native void nativeSpawn(String[] cmd, String[] env, File dir)
+ native void nativeSpawn(String[] cmd, String[] env, File dir,
+ boolean redirect)
throws IOException;
/**
diff --git a/vm/reference/java/lang/VMSystem.java b/vm/reference/java/lang/VMSystem.java
index 8a83cad92..f96986df3 100644
--- a/vm/reference/java/lang/VMSystem.java
+++ b/vm/reference/java/lang/VMSystem.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package java.lang;
+import java.util.List;
+
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileDescriptor;
@@ -50,6 +52,7 @@ import java.io.PrintStream;
* VM must implement.
*
* @author John Keiser
+ * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
*/
final class VMSystem
{
@@ -135,40 +138,76 @@ final class VMSystem
public static native long currentTimeMillis();
/**
+ * <p>
+ * Returns the current value of a nanosecond-precise system timer.
+ * The value of the timer is an offset relative to some arbitrary fixed
+ * time, which may be in the future (making the value negative). This
+ * method is useful for timing events where nanosecond precision is
+ * required. This is achieved by calling this method before and after the
+ * event, and taking the difference betweent the two times:
+ * </p>
+ * <p>
+ * <code>long startTime = System.nanoTime();</code><br />
+ * <code>... <emph>event code</emph> ...</code><br />
+ * <code>long endTime = System.nanoTime();</code><br />
+ * <code>long duration = endTime - startTime;</code><br />
+ * </p>
+ * <p>
+ * Note that the value is only nanosecond-precise, and not accurate; there
+ * is no guarantee that the difference between two values is really a
+ * nanosecond. Also, the value is prone to overflow if the offset
+ * exceeds 2^63.
+ * </p>
+ *
+ * @return the time of a system timer in nanoseconds.
+ * @since 1.5
+ */
+ public static long nanoTime()
+ {
+ return currentTimeMillis() * 1000;
+ }
+
+ /**
+ * Returns a list of 'name=value' pairs representing the current environment
+ * variables.
+ *
+ * @return a list of 'name=value' pairs.
+ */
+ static native List environ();
+
+ /**
* Helper method which creates the standard input stream.
* VM implementors may choose to construct these streams differently.
* This method can also return null if the stream is created somewhere
* else in the VM startup sequence.
*/
-
- static InputStream makeStandardInputStream()
- {
- return new BufferedInputStream(new FileInputStream(FileDescriptor.in));
- }
-
+ static InputStream makeStandardInputStream()
+ {
+ return new BufferedInputStream(new FileInputStream(FileDescriptor.in));
+ }
+
/**
* Helper method which creates the standard output stream.
* VM implementors may choose to construct these streams differently.
* This method can also return null if the stream is created somewhere
* else in the VM startup sequence.
*/
+ static PrintStream makeStandardOutputStream()
+ {
+ return new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)), true);
+ }
- static PrintStream makeStandardOutputStream()
- {
- return new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)), true);
- }
/**
* Helper method which creates the standard error stream.
* VM implementors may choose to construct these streams differently.
* This method can also return null if the stream is created somewhere
* else in the VM startup sequence.
*/
-
- static PrintStream makeStandardErrorStream()
- {
- return new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.err)), true);
- }
-
+ static PrintStream makeStandardErrorStream()
+ {
+ return new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.err)), true);
+ }
+
/**
* Gets the value of an environment variable.
* Always returning null is a valid (but not very useful) implementation.
diff --git a/vm/reference/java/lang/VMThread.java b/vm/reference/java/lang/VMThread.java
index aa0b8347a..302de6c35 100644
--- a/vm/reference/java/lang/VMThread.java
+++ b/vm/reference/java/lang/VMThread.java
@@ -1,5 +1,5 @@
/* VMThread -- VM interface for Thread of executable code
- Copyright (C) 2003, 2004, 2005 Free Software Foundation
+ Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation
This file is part of GNU Classpath.
@@ -123,7 +123,9 @@ final class VMThread
{
try
{
- thread.group.uncaughtException(thread, t);
+ Thread.UncaughtExceptionHandler handler;
+ handler = thread.getUncaughtExceptionHandler();
+ handler.uncaughtException(thread, t);
}
catch(Throwable ignore)
{
diff --git a/vm/reference/java/lang/reflect/Constructor.java b/vm/reference/java/lang/reflect/Constructor.java
index 3789fbb9a..521190b66 100644
--- a/vm/reference/java/lang/reflect/Constructor.java
+++ b/vm/reference/java/lang/reflect/Constructor.java
@@ -1,5 +1,5 @@
/* java.lang.reflect.Constructor - reflection of Java constructors
- Copyright (C) 1998, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2001, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -40,6 +40,8 @@ package java.lang.reflect;
import gnu.java.lang.ClassHelper;
+import gnu.java.lang.reflect.MethodSignatureParser;
+
import java.util.Arrays;
/**
@@ -76,11 +78,15 @@ import java.util.Arrays;
* @status updated to 1.4
*/
public final class Constructor
-extends AccessibleObject implements Member
+ extends AccessibleObject
+ implements GenericDeclaration, Member
{
private Class clazz;
private int slot;
+ private static final int CONSTRUCTOR_MODIFIERS
+ = Modifier.PRIVATE | Modifier.PROTECTED | Modifier.PUBLIC;
+
/**
* This class is uninstantiable except from native code.
*/
@@ -114,6 +120,13 @@ extends AccessibleObject implements Member
}
/**
+ * Return the raw modifiers for this constructor. In particular
+ * this will include the synthetic and varargs bits.
+ * @return the constructor's modifiers
+ */
+ private native int getModifiersInternal();
+
+ /**
* Gets the modifiers this constructor uses. Use the <code>Modifier</code>
* class to interpret the values. A constructor can only have a subset of the
* following modifiers: public, private, protected.
@@ -121,7 +134,31 @@ extends AccessibleObject implements Member
* @return an integer representing the modifiers to this Member
* @see Modifier
*/
- public native int getModifiers();
+ public int getModifiers()
+ {
+ return getModifiersInternal() & CONSTRUCTOR_MODIFIERS;
+ }
+
+ /**
+ * Return true if this constructor is synthetic, false otherwise.
+ * A synthetic member is one which is created by the compiler,
+ * and which does not appear in the user's source code.
+ * @since 1.5
+ */
+ public boolean isSynthetic()
+ {
+ return (getModifiersInternal() & Modifier.SYNTHETIC) != 0;
+ }
+
+ /**
+ * Return true if this is a varargs constructor, that is if
+ * the constructor takes a variable number of arguments.
+ * @since 1.5
+ */
+ public boolean isVarArgs()
+ {
+ return (getModifiersInternal() & Modifier.VARARGS) != 0;
+ }
/**
* Get the parameter list for this constructor, in declaration order. If the
@@ -186,7 +223,7 @@ extends AccessibleObject implements Member
public String toString()
{
// 128 is a reasonable buffer initial size for constructor
- StringBuffer sb = new StringBuffer(128);
+ StringBuilder sb = new StringBuilder(128);
Modifier.toString(getModifiers(), sb).append(' ');
sb.append(getDeclaringClass().getName()).append('(');
Class[] c = getParameterTypes();
@@ -206,7 +243,46 @@ extends AccessibleObject implements Member
}
return sb.toString();
}
-
+
+ /* FIXME[GENERICS]: Add X extends GenericDeclaration and TypeVariable<X> */
+ static void addTypeParameters(StringBuilder sb, TypeVariable[] typeArgs)
+ {
+ if (typeArgs.length == 0)
+ return;
+ sb.append('<');
+ for (int i = 0; i < typeArgs.length; ++i)
+ {
+ if (i > 0)
+ sb.append(',');
+ sb.append(typeArgs[i]);
+ }
+ sb.append("> ");
+ }
+
+ public String toGenericString()
+ {
+ StringBuilder sb = new StringBuilder(128);
+ Modifier.toString(getModifiers(), sb).append(' ');
+ addTypeParameters(sb, getTypeParameters());
+ sb.append(getDeclaringClass().getName()).append('(');
+ Type[] types = getGenericParameterTypes();
+ if (types.length > 0)
+ {
+ sb.append(types[0]);
+ for (int i = 1; i < types.length; ++i)
+ sb.append(',').append(types[i]);
+ }
+ sb.append(')');
+ types = getGenericExceptionTypes();
+ if (types.length > 0)
+ {
+ sb.append(" throws ").append(types[0]);
+ for (int i = 1; i < types.length; i++)
+ sb.append(',').append(types[i]);
+ }
+ return sb.toString();
+ }
+
/**
* Create a new instance by invoking the constructor. Arguments are
* automatically unwrapped and widened, if needed.<p>
@@ -248,4 +324,75 @@ extends AccessibleObject implements Member
int slot)
throws InstantiationException, IllegalAccessException,
InvocationTargetException;
+
+ /**
+ * Returns an array of <code>TypeVariable</code> objects that represents
+ * the type variables declared by this constructor, in declaration order.
+ * An array of size zero is returned if this constructor has no type
+ * variables.
+ *
+ * @return the type variables associated with this constructor.
+ * @throws GenericSignatureFormatError if the generic signature does
+ * not conform to the format specified in the Virtual Machine
+ * specification, version 3.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Add <Constructor<T>> */
+ public TypeVariable[] getTypeParameters()
+ {
+ String sig = getSignature();
+ if (sig == null)
+ return new TypeVariable[0];
+ MethodSignatureParser p = new MethodSignatureParser(this, sig);
+ return p.getTypeParameters();
+ }
+
+ /**
+ * Return the String in the Signature attribute for this constructor. If there
+ * is no Signature attribute, return null.
+ */
+ private native String getSignature();
+
+ /**
+ * Returns an array of <code>Type</code> objects that represents
+ * the exception types declared by this constructor, in declaration order.
+ * An array of size zero is returned if this constructor declares no
+ * exceptions.
+ *
+ * @return the exception types declared by this constructor.
+ * @throws GenericSignatureFormatError if the generic signature does
+ * not conform to the format specified in the Virtual Machine
+ * specification, version 3.
+ * @since 1.5
+ */
+ public Type[] getGenericExceptionTypes()
+ {
+ String sig = getSignature();
+ if (sig == null)
+ return getExceptionTypes();
+ MethodSignatureParser p = new MethodSignatureParser(this, sig);
+ return p.getGenericExceptionTypes();
+ }
+
+ /**
+ * Returns an array of <code>Type</code> objects that represents
+ * the parameter list for this constructor, in declaration order.
+ * An array of size zero is returned if this constructor takes no
+ * parameters.
+ *
+ * @return a list of the types of the constructor's parameters
+ * @throws GenericSignatureFormatError if the generic signature does
+ * not conform to the format specified in the Virtual Machine
+ * specification, version 3.
+ * @since 1.5
+ */
+ public Type[] getGenericParameterTypes()
+ {
+ String sig = getSignature();
+ if (sig == null)
+ return getParameterTypes();
+ MethodSignatureParser p = new MethodSignatureParser(this, sig);
+ return p.getGenericParameterTypes();
+ }
}
+
diff --git a/vm/reference/java/lang/reflect/Field.java b/vm/reference/java/lang/reflect/Field.java
index 5475aa272..5121700fe 100644
--- a/vm/reference/java/lang/reflect/Field.java
+++ b/vm/reference/java/lang/reflect/Field.java
@@ -1,5 +1,5 @@
/* java.lang.reflect.Field - reflection of Java fields
- Copyright (C) 1998, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2001, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -40,6 +40,8 @@ package java.lang.reflect;
import gnu.java.lang.ClassHelper;
+import gnu.java.lang.reflect.FieldSignatureParser;
+
/**
* The Field class represents a member variable of a class. It also allows
* dynamic access to a member, via reflection. This works for both
@@ -80,6 +82,11 @@ extends AccessibleObject implements Member
private String name;
private int slot;
+ private static final int FIELD_MODIFIERS
+ = Modifier.FINAL | Modifier.PRIVATE | Modifier.PROTECTED
+ | Modifier.PUBLIC | Modifier.STATIC | Modifier.TRANSIENT
+ | Modifier.VOLATILE;
+
/**
* This class is uninstantiable except natively.
*/
@@ -110,6 +117,12 @@ extends AccessibleObject implements Member
}
/**
+ * Return the raw modifiers for this field.
+ * @return the field's modifiers
+ */
+ private native int getModifiersInternal();
+
+ /**
* Gets the modifiers this field uses. Use the <code>Modifier</code>
* class to interpret the values. A field can only have a subset of the
* following modifiers: public, private, protected, static, final,
@@ -118,7 +131,29 @@ extends AccessibleObject implements Member
* @return an integer representing the modifiers to this Member
* @see Modifier
*/
- public native int getModifiers();
+ public int getModifiers()
+ {
+ return getModifiersInternal() & FIELD_MODIFIERS;
+ }
+
+ /**
+ * Return true if this field is synthetic, false otherwise.
+ * @since 1.5
+ */
+ public boolean isSynthetic()
+ {
+ return (getModifiersInternal() & Modifier.SYNTHETIC) != 0;
+ }
+
+ /**
+ * Return true if this field represents an enum constant,
+ * false otherwise.
+ * @since 1.5
+ */
+ public boolean isEnumConstant()
+ {
+ return (getModifiersInternal() & Modifier.ENUM) != 0;
+ }
/**
* Gets the type of this field.
@@ -171,7 +206,7 @@ extends AccessibleObject implements Member
public String toString()
{
// 64 is a reasonable buffer initial size for field
- StringBuffer sb = new StringBuffer(64);
+ StringBuilder sb = new StringBuilder(64);
Modifier.toString(getModifiers(), sb).append(' ');
sb.append(ClassHelper.getUserName(getType())).append(' ');
sb.append(getDeclaringClass().getName()).append('.');
@@ -179,6 +214,16 @@ extends AccessibleObject implements Member
return sb.toString();
}
+ public String toGenericString()
+ {
+ StringBuilder sb = new StringBuilder(64);
+ Modifier.toString(getModifiers(), sb).append(' ');
+ sb.append(getGenericType()).append(' ');
+ sb.append(getDeclaringClass().getName()).append('.');
+ sb.append(getName());
+ return sb.toString();
+ }
+
/**
* Get the value of this Field. If it is primitive, it will be wrapped
* in the appropriate wrapper type (boolean = java.lang.Boolean).<p>
@@ -588,4 +633,30 @@ extends AccessibleObject implements Member
*/
public native void setDouble(Object o, double value)
throws IllegalAccessException;
+
+ /**
+ * Return the generic type of the field. If the field type is not a generic
+ * type, the method returns the same as <code>getType()</code>.
+ *
+ * @throws GenericSignatureFormatError if the generic signature does
+ * not conform to the format specified in the Virtual Machine
+ * specification, version 3.
+ * @since 1.5
+ */
+ public Type getGenericType()
+ {
+ String signature = getSignature();
+ if (signature == null)
+ return getType();
+ FieldSignatureParser p = new FieldSignatureParser(getDeclaringClass(),
+ signature);
+ return p.getFieldType();
+ }
+
+ /**
+ * Return the String in the Signature attribute for this field. If there
+ * is no Signature attribute, return null.
+ */
+ private native String getSignature();
+
}
diff --git a/vm/reference/java/lang/reflect/Method.java b/vm/reference/java/lang/reflect/Method.java
index 4da8d5c66..a9920241b 100644
--- a/vm/reference/java/lang/reflect/Method.java
+++ b/vm/reference/java/lang/reflect/Method.java
@@ -1,5 +1,5 @@
/* java.lang.reflect.Method - reflection of Java methods
- Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1998, 2001, 2002, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -40,6 +40,8 @@ package java.lang.reflect;
import gnu.java.lang.ClassHelper;
+import gnu.java.lang.reflect.MethodSignatureParser;
+
import java.util.Arrays;
/**
@@ -76,12 +78,17 @@ import java.util.Arrays;
* @status updated to 1.4
*/
public final class Method
-extends AccessibleObject implements Member
+extends AccessibleObject implements Member, GenericDeclaration
{
Class declaringClass;
String name;
int slot;
+ private static final int METHOD_MODIFIERS
+ = Modifier.ABSTRACT | Modifier.FINAL | Modifier.NATIVE
+ | Modifier.PRIVATE | Modifier.PROTECTED | Modifier.PUBLIC
+ | Modifier.STATIC | Modifier.STRICT | Modifier.SYNCHRONIZED;
+
/**
* This class is uninstantiable.
*/
@@ -112,6 +119,12 @@ extends AccessibleObject implements Member
}
/**
+ * Return the raw modifiers for this method.
+ * @return the method's modifiers
+ */
+ private native int getModifiersInternal();
+
+ /**
* Gets the modifiers this method uses. Use the <code>Modifier</code>
* class to interpret the values. A method can only have a subset of the
* following modifiers: public, private, protected, abstract, static,
@@ -120,7 +133,40 @@ extends AccessibleObject implements Member
* @return an integer representing the modifiers to this Member
* @see Modifier
*/
- public native int getModifiers();
+ public int getModifiers()
+ {
+ return getModifiersInternal() & METHOD_MODIFIERS;
+ }
+
+ /**
+ * Return true if this method is a bridge method. A bridge method
+ * is generated by the compiler in some situations involving
+ * generics and inheritance.
+ * @since 1.5
+ */
+ public boolean isBridge()
+ {
+ return (getModifiersInternal() & Modifier.BRIDGE) != 0;
+ }
+
+ /**
+ * Return true if this method is synthetic, false otherwise.
+ * @since 1.5
+ */
+ public boolean isSynthetic()
+ {
+ return (getModifiersInternal() & Modifier.SYNTHETIC) != 0;
+ }
+
+ /**
+ * Return true if this is a varargs method, that is if
+ * the method takes a variable number of arguments.
+ * @since 1.5
+ */
+ public boolean isVarArgs()
+ {
+ return (getModifiersInternal() & Modifier.VARARGS) != 0;
+ }
/**
* Gets the return type of this method.
@@ -212,7 +258,7 @@ extends AccessibleObject implements Member
public String toString()
{
// 128 is a reasonable buffer initial size for constructor
- StringBuffer sb = new StringBuffer(128);
+ StringBuilder sb = new StringBuilder(128);
Modifier.toString(getModifiers(), sb).append(' ');
sb.append(ClassHelper.getUserName(getReturnType())).append(' ');
sb.append(getDeclaringClass().getName()).append('.');
@@ -235,6 +281,33 @@ extends AccessibleObject implements Member
return sb.toString();
}
+ public String toGenericString()
+ {
+ // 128 is a reasonable buffer initial size for constructor
+ StringBuilder sb = new StringBuilder(128);
+ Modifier.toString(getModifiers(), sb).append(' ');
+ Constructor.addTypeParameters(sb, getTypeParameters());
+ sb.append(getGenericReturnType()).append(' ');
+ sb.append(getDeclaringClass().getName()).append('.');
+ sb.append(getName()).append('(');
+ Type[] types = getGenericParameterTypes();
+ if (types.length > 0)
+ {
+ sb.append(types[0]);
+ for (int i = 1; i < types.length; i++)
+ sb.append(',').append(types[i]);
+ }
+ sb.append(')');
+ types = getGenericExceptionTypes();
+ if (types.length > 0)
+ {
+ sb.append(" throws ").append(types[0]);
+ for (int i = 1; i < types.length; i++)
+ sb.append(',').append(types[i]);
+ }
+ return sb.toString();
+ }
+
/**
* Invoke the method. Arguments are automatically unwrapped and widened,
* and the result is automatically wrapped, if needed.<p>
@@ -289,4 +362,93 @@ extends AccessibleObject implements Member
private native Object invokeNative(Object o, Object[] args,
Class declaringClass, int slot)
throws IllegalAccessException, InvocationTargetException;
+
+ /**
+ * Returns an array of <code>TypeVariable</code> objects that represents
+ * the type variables declared by this constructor, in declaration order.
+ * An array of size zero is returned if this class has no type
+ * variables.
+ *
+ * @return the type variables associated with this class.
+ * @throws GenericSignatureFormatError if the generic signature does
+ * not conform to the format specified in the Virtual Machine
+ * specification, version 3.
+ * @since 1.5
+ */
+ /* FIXME[GENERICS]: Should be TypeVariable<Method>[] */
+ public TypeVariable[] getTypeParameters()
+ {
+ String sig = getSignature();
+ if (sig == null)
+ return new TypeVariable[0];
+ MethodSignatureParser p = new MethodSignatureParser(this, sig);
+ return p.getTypeParameters();
+ }
+
+ /**
+ * Return the String in the Signature attribute for this method. If there
+ * is no Signature attribute, return null.
+ */
+ private native String getSignature();
+
+ /**
+ * Returns an array of <code>Type</code> objects that represents
+ * the exception types declared by this method, in declaration order.
+ * An array of size zero is returned if this method declares no
+ * exceptions.
+ *
+ * @return the exception types declared by this method.
+ * @throws GenericSignatureFormatError if the generic signature does
+ * not conform to the format specified in the Virtual Machine
+ * specification, version 3.
+ * @since 1.5
+ */
+ public Type[] getGenericExceptionTypes()
+ {
+ String sig = getSignature();
+ if (sig == null)
+ return getExceptionTypes();
+ MethodSignatureParser p = new MethodSignatureParser(this, sig);
+ return p.getGenericExceptionTypes();
+ }
+
+ /**
+ * Returns an array of <code>Type</code> objects that represents
+ * the parameter list for this method, in declaration order.
+ * An array of size zero is returned if this method takes no
+ * parameters.
+ *
+ * @return a list of the types of the method's parameters
+ * @throws GenericSignatureFormatError if the generic signature does
+ * not conform to the format specified in the Virtual Machine
+ * specification, version 3.
+ * @since 1.5
+ */
+ public Type[] getGenericParameterTypes()
+ {
+ String sig = getSignature();
+ if (sig == null)
+ return getParameterTypes();
+ MethodSignatureParser p = new MethodSignatureParser(this, sig);
+ return p.getGenericParameterTypes();
+ }
+
+ /**
+ * Returns the return type of this method.
+ *
+ * @return the return type of this method
+ * @throws GenericSignatureFormatError if the generic signature does
+ * not conform to the format specified in the Virtual Machine
+ * specification, version 3.
+ * @since 1.5
+ */
+ public Type getGenericReturnType()
+ {
+ String sig = getSignature();
+ if (sig == null)
+ return getReturnType();
+ MethodSignatureParser p = new MethodSignatureParser(this, sig);
+ return p.getGenericReturnType();
+ }
}
+
diff --git a/vm/reference/java/lang/reflect/VMArray.java b/vm/reference/java/lang/reflect/VMArray.java
new file mode 100644
index 000000000..d6277aebd
--- /dev/null
+++ b/vm/reference/java/lang/reflect/VMArray.java
@@ -0,0 +1,65 @@
+/* java.lang.reflect.VMArray - VM class for array manipulation by reflection.
+ Copyright (C) 1998, 1999, 2001, 2003, 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.lang.reflect;
+
+import gnu.classpath.Configuration;
+
+class VMArray
+{
+
+ static
+ {
+ if (Configuration.INIT_LOAD_LIBRARY)
+ {
+ System.loadLibrary("javalangreflect");
+ }
+ }
+
+ /**
+ * Dynamically create an array of objects.
+ *
+ * @param type guaranteed to be a valid object type
+ * @param dim the length of the array
+ * @return the new array
+ * @throws NegativeArraySizeException if dim is negative
+ * @throws OutOfMemoryError if memory allocation fails
+ */
+ static native Object createObjectArray(Class type, int dim);
+
+}
diff --git a/vm/reference/java/security/VMSecureRandom.java b/vm/reference/java/security/VMSecureRandom.java
new file mode 100644
index 000000000..dc67d8719
--- /dev/null
+++ b/vm/reference/java/security/VMSecureRandom.java
@@ -0,0 +1,134 @@
+/* VMSecureRandom.java -- random seed generator.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is a part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.security;
+
+import gnu.classpath.SystemProperties;
+import gnu.java.security.action.GetSecurityPropertyAction;
+
+import java.net.URL;
+
+/**
+ * VM-specific methods for generating real (or almost real) random
+ * seeds. VM implementors should write a version of this class that
+ * reads random bytes from some system source.
+ *
+ * <p>The default implementation of this class runs eight threads that
+ * increment counters in a tight loop, and XORs each counter to
+ * produce one byte of seed data. This is not very efficient, and is
+ * not guaranteed to be random (the thread scheduler is probably
+ * deterministic, after all). If possible, VM implementors should
+ * reimplement this class so it obtains a random seed from a system
+ * facility, such as a system entropy gathering device or hardware
+ * random number generator.
+ */
+final class VMSecureRandom
+{
+
+ /**
+ * Generate a random seed. Implementations are free to generate
+ * fewer random bytes than are requested, and leave the remaining
+ * bytes of the destination buffer as zeros. Implementations SHOULD,
+ * however, make a best-effort attempt to satisfy the request.
+ *
+ * @param buffer The destination buffer.
+ * @param offset The offset in the buffer to start putting bytes.
+ * @param length The number of random bytes to generate.
+ */
+ static int generateSeed(byte[] buffer, int offset, int length)
+ {
+ if (length < 0)
+ throw new IllegalArgumentException("length must be nonnegative");
+ if (offset < 0 || offset + length > buffer.length)
+ throw new IndexOutOfBoundsException();
+
+ Spinner[] spinners = new Spinner[8];
+ int n = 0x1;
+ for (int i = 0; i < spinners.length; i++)
+ {
+ spinners[i] = new Spinner((byte) n);
+ Thread t = new Thread(spinners[i]);
+ t.start();
+ n <<= 1;
+ }
+
+ // Wait until at least one spinner has started.
+ while (!(spinners[0].running || spinners[1].running || spinners[2].running
+ || spinners[3].running || spinners[4].running || spinners[5].running
+ || spinners[6].running || spinners[7].running))
+ {
+ Thread.yield();
+ }
+
+ for (int i = offset; i < length; i++)
+ {
+ buffer[i] = (byte) (spinners[0].value ^ spinners[1].value ^ spinners[2].value
+ ^ spinners[3].value ^ spinners[4].value ^ spinners[5].value
+ ^ spinners[6].value ^ spinners[7].value);
+ Thread.yield();
+ }
+
+ for (int i = 0; i < spinners.length; i++)
+ spinners[i].stop();
+
+ return length;
+ }
+
+ static class Spinner implements Runnable
+ {
+ volatile byte value;
+ volatile boolean running;
+
+ Spinner(final byte initial)
+ {
+ value = initial;
+ }
+
+ public void run()
+ {
+ running = true;
+ while (running)
+ value++;
+ }
+
+ private void stop()
+ {
+ running = false;
+ }
+ }
+} \ No newline at end of file