@libp2p/crypto 5.1.15 → 5.1.17-15eeedba1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -4
- package/dist/index.min.js.map +4 -4
- package/dist/src/ciphers/aes-gcm.browser.d.ts +1 -1
- package/dist/src/ciphers/aes-gcm.d.ts +1 -1
- package/dist/src/ciphers/index.d.ts +1 -1
- package/dist/src/ciphers/index.js +1 -1
- package/dist/src/hmac/index.browser.js +1 -1
- package/dist/src/hmac/index.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/keys/ecdh/index.browser.d.ts +1 -1
- package/dist/src/keys/ecdsa/ecdsa.js +2 -2
- package/dist/src/keys/ecdsa/ecdsa.js.map +1 -1
- package/dist/src/keys/ecdsa/utils.js +2 -2
- package/dist/src/keys/ed25519/ed25519.js +2 -2
- package/dist/src/keys/ed25519/ed25519.js.map +1 -1
- package/dist/src/keys/ed25519/index.d.ts.map +1 -1
- package/dist/src/keys/ed25519/index.js +2 -16
- package/dist/src/keys/ed25519/index.js.map +1 -1
- package/dist/src/keys/ed25519/utils.js +2 -2
- package/dist/src/keys/ephemeral-keys.d.ts +1 -1
- package/dist/src/keys/ephemeral-keys.js +1 -1
- package/dist/src/keys/index.d.ts +5 -5
- package/dist/src/keys/index.js +13 -13
- package/dist/src/keys/key-stretcher.d.ts +1 -1
- package/dist/src/keys/rsa/index.browser.d.ts +1 -1
- package/dist/src/keys/rsa/index.browser.js +1 -1
- package/dist/src/keys/rsa/index.d.ts +1 -1
- package/dist/src/keys/rsa/index.js +1 -1
- package/dist/src/keys/rsa/rsa.js +1 -1
- package/dist/src/keys/rsa/utils.js +3 -3
- package/dist/src/keys/rsa/utils.js.map +1 -1
- package/dist/src/keys/secp256k1/secp256k1.js +2 -2
- package/dist/src/keys/secp256k1/secp256k1.js.map +1 -1
- package/dist/src/keys/secp256k1/utils.js +1 -1
- package/dist/src/webcrypto/index.d.ts +1 -1
- package/dist/src/webcrypto/index.js +1 -1
- package/package.json +12 -7
- package/src/ciphers/aes-gcm.browser.ts +1 -1
- package/src/ciphers/aes-gcm.ts +1 -1
- package/src/ciphers/index.ts +1 -1
- package/src/hmac/index.browser.ts +1 -1
- package/src/hmac/index.ts +1 -1
- package/src/index.ts +4 -4
- package/src/keys/ecdh/index.browser.ts +1 -1
- package/src/keys/ecdsa/ecdsa.ts +2 -2
- package/src/keys/ecdsa/utils.ts +2 -2
- package/src/keys/ed25519/ed25519.ts +2 -2
- package/src/keys/ed25519/index.ts +2 -18
- package/src/keys/ed25519/utils.ts +2 -2
- package/src/keys/ephemeral-keys.ts +1 -1
- package/src/keys/index.ts +16 -16
- package/src/keys/key-stretcher.ts +1 -1
- package/src/keys/rsa/index.browser.ts +1 -1
- package/src/keys/rsa/index.ts +1 -1
- package/src/keys/rsa/rsa.ts +1 -1
- package/src/keys/rsa/utils.ts +3 -3
- package/src/keys/secp256k1/secp256k1.ts +2 -2
- package/src/keys/secp256k1/utils.ts +1 -1
- package/src/webcrypto/index.ts +1 -1
- package/dist/typedoc-urls.json +0 -40
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import crypto from 'crypto'
|
|
2
|
+
import { ed25519 as ed } from '@noble/curves/ed25519.js'
|
|
2
3
|
import { concat as uint8arrayConcat } from 'uint8arrays/concat'
|
|
3
4
|
import { fromString as uint8arrayFromString } from 'uint8arrays/from-string'
|
|
4
5
|
import { toString as uint8arrayToString } from 'uint8arrays/to-string'
|
|
@@ -16,24 +17,7 @@ export { PUBLIC_KEY_BYTE_LENGTH as publicKeyLength }
|
|
|
16
17
|
export { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength }
|
|
17
18
|
|
|
18
19
|
function derivePublicKey (privateKey: Uint8Array): Uint8Array {
|
|
19
|
-
|
|
20
|
-
format: 'jwk',
|
|
21
|
-
key: {
|
|
22
|
-
crv: 'Ed25519',
|
|
23
|
-
x: '',
|
|
24
|
-
d: uint8arrayToString(privateKey, 'base64url'),
|
|
25
|
-
kty: 'OKP'
|
|
26
|
-
}
|
|
27
|
-
})
|
|
28
|
-
const jwk = keyObject.export({
|
|
29
|
-
format: 'jwk'
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
if (jwk.x == null || jwk.x === '') {
|
|
33
|
-
throw new Error('Could not export JWK public key')
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return uint8arrayFromString(jwk.x, 'base64url')
|
|
20
|
+
return ed.getPublicKey(privateKey)
|
|
37
21
|
}
|
|
38
22
|
|
|
39
23
|
export function generateKey (): Uint8ArrayKeyPair {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { InvalidParametersError } from '@libp2p/interface'
|
|
2
|
-
import { Ed25519PublicKey as Ed25519PublicKeyClass, Ed25519PrivateKey as Ed25519PrivateKeyClass } from './ed25519.
|
|
3
|
-
import * as crypto from './index.
|
|
2
|
+
import { Ed25519PublicKey as Ed25519PublicKeyClass, Ed25519PrivateKey as Ed25519PrivateKeyClass } from './ed25519.ts'
|
|
3
|
+
import * as crypto from './index.ts'
|
|
4
4
|
import type { Ed25519PublicKey, Ed25519PrivateKey } from '@libp2p/interface'
|
|
5
5
|
|
|
6
6
|
export function unmarshalEd25519PrivateKey (bytes: Uint8Array): Ed25519PrivateKey {
|
package/src/keys/index.ts
CHANGED
|
@@ -9,26 +9,26 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { InvalidParametersError, UnsupportedKeyTypeError } from '@libp2p/interface'
|
|
12
|
-
import { ECDSAPrivateKey as ECDSAPrivateKeyClass } from './ecdsa/ecdsa.
|
|
13
|
-
import { ECDSA_P_256_OID, ECDSA_P_384_OID, ECDSA_P_521_OID } from './ecdsa/index.
|
|
14
|
-
import { generateECDSAKeyPair, pkiMessageToECDSAPrivateKey, pkiMessageToECDSAPublicKey, unmarshalECDSAPrivateKey, unmarshalECDSAPublicKey } from './ecdsa/utils.
|
|
15
|
-
import { privateKeyLength as ed25519PrivateKeyLength, publicKeyLength as ed25519PublicKeyLength } from './ed25519/index.
|
|
16
|
-
import { generateEd25519KeyPair, generateEd25519KeyPairFromSeed, unmarshalEd25519PrivateKey, unmarshalEd25519PublicKey } from './ed25519/utils.
|
|
17
|
-
import * as pb from './keys.
|
|
18
|
-
import { decodeDer } from './rsa/der.
|
|
19
|
-
import { RSAES_PKCS1_V1_5_OID } from './rsa/index.
|
|
20
|
-
import { pkcs1ToRSAPrivateKey, pkixToRSAPublicKey, generateRSAKeyPair, pkcs1MessageToRSAPrivateKey, pkixMessageToRSAPublicKey, jwkToRSAPrivateKey } from './rsa/utils.
|
|
21
|
-
import { privateKeyLength as secp256k1PrivateKeyLength, publicKeyLength as secp256k1PublicKeyLength } from './secp256k1/index.
|
|
22
|
-
import { generateSecp256k1KeyPair, unmarshalSecp256k1PrivateKey, unmarshalSecp256k1PublicKey } from './secp256k1/utils.
|
|
23
|
-
import type { Curve } from './ecdsa/index.
|
|
12
|
+
import { ECDSAPrivateKey as ECDSAPrivateKeyClass } from './ecdsa/ecdsa.ts'
|
|
13
|
+
import { ECDSA_P_256_OID, ECDSA_P_384_OID, ECDSA_P_521_OID } from './ecdsa/index.ts'
|
|
14
|
+
import { generateECDSAKeyPair, pkiMessageToECDSAPrivateKey, pkiMessageToECDSAPublicKey, unmarshalECDSAPrivateKey, unmarshalECDSAPublicKey } from './ecdsa/utils.ts'
|
|
15
|
+
import { privateKeyLength as ed25519PrivateKeyLength, publicKeyLength as ed25519PublicKeyLength } from './ed25519/index.ts'
|
|
16
|
+
import { generateEd25519KeyPair, generateEd25519KeyPairFromSeed, unmarshalEd25519PrivateKey, unmarshalEd25519PublicKey } from './ed25519/utils.ts'
|
|
17
|
+
import * as pb from './keys.ts'
|
|
18
|
+
import { decodeDer } from './rsa/der.ts'
|
|
19
|
+
import { RSAES_PKCS1_V1_5_OID } from './rsa/index.ts'
|
|
20
|
+
import { pkcs1ToRSAPrivateKey, pkixToRSAPublicKey, generateRSAKeyPair, pkcs1MessageToRSAPrivateKey, pkixMessageToRSAPublicKey, jwkToRSAPrivateKey } from './rsa/utils.ts'
|
|
21
|
+
import { privateKeyLength as secp256k1PrivateKeyLength, publicKeyLength as secp256k1PublicKeyLength } from './secp256k1/index.ts'
|
|
22
|
+
import { generateSecp256k1KeyPair, unmarshalSecp256k1PrivateKey, unmarshalSecp256k1PublicKey } from './secp256k1/utils.ts'
|
|
23
|
+
import type { Curve } from './ecdsa/index.ts'
|
|
24
24
|
import type { PrivateKey, PublicKey, KeyType, RSAPrivateKey, Secp256k1PrivateKey, Ed25519PrivateKey, Secp256k1PublicKey, Ed25519PublicKey, ECDSAPrivateKey, ECDSAPublicKey } from '@libp2p/interface'
|
|
25
25
|
import type { MultihashDigest } from 'multiformats'
|
|
26
26
|
import type { Digest } from 'multiformats/hashes/digest'
|
|
27
27
|
|
|
28
|
-
export { generateEphemeralKeyPair } from './ecdh/index.
|
|
29
|
-
export type { Curve } from './ecdh/index.
|
|
30
|
-
export type { ECDHKey, EnhancedKey, EnhancedKeyPair, ECDHKeyPair } from './interface.
|
|
31
|
-
export { keyStretcher } from './key-stretcher.
|
|
28
|
+
export { generateEphemeralKeyPair } from './ecdh/index.ts'
|
|
29
|
+
export type { Curve } from './ecdh/index.ts'
|
|
30
|
+
export type { ECDHKey, EnhancedKey, EnhancedKeyPair, ECDHKeyPair } from './interface.ts'
|
|
31
|
+
export { keyStretcher } from './key-stretcher.ts'
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Generates a keypair of the given type and bitsize
|
|
@@ -2,7 +2,7 @@ import { InvalidParametersError } from '@libp2p/interface'
|
|
|
2
2
|
import { concat as uint8ArrayConcat } from 'uint8arrays/concat'
|
|
3
3
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
4
4
|
import * as hmac from '../hmac/index.js'
|
|
5
|
-
import type { EnhancedKey, EnhancedKeyPair } from './interface.
|
|
5
|
+
import type { EnhancedKey, EnhancedKeyPair } from './interface.ts'
|
|
6
6
|
|
|
7
7
|
interface Cipher {
|
|
8
8
|
ivSize: number
|
|
@@ -2,7 +2,7 @@ import { InvalidParametersError } from '@libp2p/interface'
|
|
|
2
2
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
3
3
|
import randomBytes from '../../random-bytes.js'
|
|
4
4
|
import webcrypto from '../../webcrypto/index.js'
|
|
5
|
-
import * as utils from './utils.
|
|
5
|
+
import * as utils from './utils.ts'
|
|
6
6
|
import type { JWKKeyPair } from '../interface.js'
|
|
7
7
|
import type { AbortOptions } from '@libp2p/interface'
|
|
8
8
|
import type { Uint8ArrayList } from 'uint8arraylist'
|
package/src/keys/rsa/index.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { promisify } from 'node:util'
|
|
|
3
3
|
import { InvalidParametersError } from '@libp2p/interface'
|
|
4
4
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
5
5
|
import randomBytes from '../../random-bytes.js'
|
|
6
|
-
import * as utils from './utils.
|
|
6
|
+
import * as utils from './utils.ts'
|
|
7
7
|
import type { JWKKeyPair } from '../interface.js'
|
|
8
8
|
import type { AbortOptions } from '@libp2p/interface'
|
|
9
9
|
import type { Uint8ArrayList } from 'uint8arraylist'
|
package/src/keys/rsa/rsa.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { base58btc } from 'multiformats/bases/base58'
|
|
2
2
|
import { CID } from 'multiformats/cid'
|
|
3
3
|
import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
|
|
4
|
-
import { hashAndSign, utils, hashAndVerify } from './index.
|
|
4
|
+
import { hashAndSign, utils, hashAndVerify } from './index.ts'
|
|
5
5
|
import type { RSAPublicKey as RSAPublicKeyInterface, RSAPrivateKey as RSAPrivateKeyInterface, AbortOptions } from '@libp2p/interface'
|
|
6
6
|
import type { Digest } from 'multiformats/hashes/digest'
|
|
7
7
|
import type { Uint8ArrayList } from 'uint8arraylist'
|
package/src/keys/rsa/utils.ts
CHANGED
|
@@ -4,9 +4,9 @@ import { create } from 'multiformats/hashes/digest'
|
|
|
4
4
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
5
5
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
6
6
|
import * as pb from '../keys.js'
|
|
7
|
-
import { decodeDer, encodeBitString, encodeInteger, encodeSequence } from './der.
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
7
|
+
import { decodeDer, encodeBitString, encodeInteger, encodeSequence } from './der.ts'
|
|
8
|
+
import { generateRSAKey, rsaKeySize } from './index.ts'
|
|
9
|
+
import { RSAPrivateKey as RSAPrivateKeyClass, RSAPublicKey as RSAPublicKeyClass } from './rsa.ts'
|
|
10
10
|
import type { JWKKeyPair } from '../interface.js'
|
|
11
11
|
import type { RSAPrivateKey, RSAPublicKey } from '@libp2p/interface'
|
|
12
12
|
import type { Digest } from 'multiformats/hashes/digest'
|
|
@@ -3,8 +3,8 @@ import { CID } from 'multiformats/cid'
|
|
|
3
3
|
import { identity } from 'multiformats/hashes/identity'
|
|
4
4
|
import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
|
|
5
5
|
import { publicKeyToProtobuf } from '../index.js'
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { hashAndVerify, hashAndSign } from './index.ts'
|
|
7
|
+
import { validateSecp256k1PublicKey, compressSecp256k1PublicKey, computeSecp256k1PublicKey, validateSecp256k1PrivateKey } from './utils.ts'
|
|
8
8
|
import type { Secp256k1PublicKey as Secp256k1PublicKeyInterface, Secp256k1PrivateKey as Secp256k1PrivateKeyInterface, AbortOptions } from '@libp2p/interface'
|
|
9
9
|
import type { Digest } from 'multiformats/hashes/digest'
|
|
10
10
|
import type { Uint8ArrayList } from 'uint8arraylist'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { InvalidPrivateKeyError, InvalidPublicKeyError } from '@libp2p/interface'
|
|
2
2
|
import { secp256k1 as secp } from '@noble/curves/secp256k1.js'
|
|
3
|
-
import { Secp256k1PublicKey as Secp256k1PublicKeyClass, Secp256k1PrivateKey as Secp256k1PrivateKeyClass } from './secp256k1.
|
|
3
|
+
import { Secp256k1PublicKey as Secp256k1PublicKeyClass, Secp256k1PrivateKey as Secp256k1PrivateKeyClass } from './secp256k1.ts'
|
|
4
4
|
import type { Secp256k1PublicKey, Secp256k1PrivateKey } from '@libp2p/interface'
|
|
5
5
|
|
|
6
6
|
const PRIVATE_KEY_BYTE_LENGTH = 32
|
package/src/webcrypto/index.ts
CHANGED
package/dist/typedoc-urls.json
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"AESCipher": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_crypto.ciphers.AES_GCM.AESCipher.html",
|
|
3
|
-
"CreateAESCipherOptions": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_crypto.ciphers.AES_GCM.CreateAESCipherOptions.html",
|
|
4
|
-
"create": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.ciphers.AES_GCM.create.html",
|
|
5
|
-
"HMAC": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_crypto.hmac.HMAC.html",
|
|
6
|
-
"./hmac:HMAC": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_crypto.hmac.HMAC.html",
|
|
7
|
-
"./hmac:create": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.hmac.create.html",
|
|
8
|
-
"pbkdf2": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.index.pbkdf2.html",
|
|
9
|
-
"randomBytes": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.index.randomBytes.html",
|
|
10
|
-
"ECDHKey": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_crypto.keys.ECDHKey.html",
|
|
11
|
-
"ECDHKeyPair": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_crypto.keys.ECDHKeyPair.html",
|
|
12
|
-
"EnhancedKey": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_crypto.keys.EnhancedKey.html",
|
|
13
|
-
"EnhancedKeyPair": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_crypto.keys.EnhancedKeyPair.html",
|
|
14
|
-
"Curve": "https://libp2p.github.io/js-libp2p/types/_libp2p_crypto.keys.Curve.html",
|
|
15
|
-
"generateEphemeralKeyPair": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.generateEphemeralKeyPair.html",
|
|
16
|
-
"generateKeyPair": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.generateKeyPair.html",
|
|
17
|
-
"./keys:generateKeyPair": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.generateKeyPair.html",
|
|
18
|
-
"generateKeyPairFromSeed": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.generateKeyPairFromSeed.html",
|
|
19
|
-
"./keys:generateKeyPairFromSeed": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.generateKeyPairFromSeed.html",
|
|
20
|
-
"keyStretcher": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.keyStretcher.html",
|
|
21
|
-
"privateKeyFromCryptoKeyPair": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyFromCryptoKeyPair.html",
|
|
22
|
-
"./keys:privateKeyFromCryptoKeyPair": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyFromCryptoKeyPair.html",
|
|
23
|
-
"privateKeyFromProtobuf": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyFromProtobuf.html",
|
|
24
|
-
"./keys:privateKeyFromProtobuf": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyFromProtobuf.html",
|
|
25
|
-
"privateKeyFromRaw": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyFromRaw.html",
|
|
26
|
-
"./keys:privateKeyFromRaw": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyFromRaw.html",
|
|
27
|
-
"privateKeyToCryptoKeyPair": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyToCryptoKeyPair.html",
|
|
28
|
-
"./keys:privateKeyToCryptoKeyPair": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyToCryptoKeyPair.html",
|
|
29
|
-
"privateKeyToProtobuf": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyToProtobuf.html",
|
|
30
|
-
"./keys:privateKeyToProtobuf": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.privateKeyToProtobuf.html",
|
|
31
|
-
"publicKeyFromMultihash": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.publicKeyFromMultihash.html",
|
|
32
|
-
"./keys:publicKeyFromMultihash": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.publicKeyFromMultihash.html",
|
|
33
|
-
"publicKeyFromProtobuf": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.publicKeyFromProtobuf.html",
|
|
34
|
-
"./keys:publicKeyFromProtobuf": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.publicKeyFromProtobuf.html",
|
|
35
|
-
"publicKeyFromRaw": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.publicKeyFromRaw.html",
|
|
36
|
-
"./keys:publicKeyFromRaw": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.publicKeyFromRaw.html",
|
|
37
|
-
"publicKeyToProtobuf": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.publicKeyToProtobuf.html",
|
|
38
|
-
"./keys:publicKeyToProtobuf": "https://libp2p.github.io/js-libp2p/functions/_libp2p_crypto.keys.publicKeyToProtobuf.html",
|
|
39
|
-
"default": "https://libp2p.github.io/js-libp2p/variables/_libp2p_crypto.webcrypto.default.html"
|
|
40
|
-
}
|