[{"name":"Eos.Asset","comment":"\n\n@docs Asset\n\n\n## Dealing with JSON\n\n@docs encode, decoder\n\n","unions":[],"aliases":[{"name":"Asset","comment":" An asset is simply an amount of a given symbol.\n","args":[],"type":"{ amount : Basics.Float, symbol : Eos.Symbol.Symbol }"}],"values":[{"name":"decoder","comment":" Decode an [Asset](#Asset) from JSON.\n","type":"Json.Decode.Decoder Eos.Asset.Asset"},{"name":"encode","comment":" Encode an [Asset](#Asset) into JSON.\n","type":"Eos.Asset.Asset -> Json.Encode.Value"}],"binops":[]},{"name":"Eos.Authorization","comment":" An authorization is what is used to declare who is performing an action. It\nuses the user's name and a [Permission](Eos-Permission).\n\n@docs Authorization\n\n\n## Dealing with JSON\n\n@docs encode\n\n","unions":[],"aliases":[{"name":"Authorization","comment":" An authorization is just a name and a permission.\n","args":[],"type":"{ actor : Eos.Name.Name, permission : Eos.Permission.Permission }"}],"values":[{"name":"encode","comment":" Turn an authorization into a JSON value.\n","type":"Eos.Authorization.Authorization -> Json.Encode.Value"}],"binops":[]},{"name":"Eos.Checksum","comment":"\n\n@docs Checksum\n\n@docs encode, decoder\n\n@docs fromString, toString\n\n","unions":[{"name":"Checksum","comment":" A Checksum\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"decoder","comment":" Decode a Checksum.\n","type":"Json.Decode.Decoder Eos.Checksum.Checksum"},{"name":"encode","comment":" Encode a [Checksum](#Checksum) into JSON.\n","type":"Eos.Checksum.Checksum -> Json.Encode.Value"},{"name":"fromString","comment":" Turn a String into a Checksum\n","type":"String.String -> Eos.Checksum.Checksum"},{"name":"toString","comment":" Turn a Checksum into a String\n","type":"Eos.Checksum.Checksum -> String.String"}],"binops":[]},{"name":"Eos.EosType","comment":" This module is only used internally by the library. It is not meant to be used\ndirectly by the user, unless you're using the code generation tool to build\ndynamic forms.\n\n@docs EosType\n\n","unions":[{"name":"EosType","comment":" This includes all of the native types, declared in [abi\\_serializer::configure\\_built\\_in\\_types()](https://github.com/EOSIO/eos/blob/de78b49b5765c88f4e005046d1489c3905985b94/libraries/chain/abi_serializer.cpp#L89-L127).\n\nIt only doesn't support `bytes`. If you need support for `bytes`, please open an\nissue on GitHub\n\n","args":[],"cases":[["EosBool",[]],["EosInt",[]],["EosFloat",[]],["TimePoint",[]],["TimePointSec",[]],["BlockTimestampType",[]],["Name",[]],["EosString",[]],["Checksum",[]],["PublicKey",[]],["Signature",[]],["Symbol",[]],["SymbolCode",[]],["Asset",[]],["ExtendedAsset",[]],["EosList",["Eos.EosType.EosType"]]]}],"aliases":[],"values":[],"binops":[]},{"name":"Eos.ExtendedAsset","comment":"\n\n@docs ExtendedAsset\n\n\n## Dealing with JSON\n\n@docs encode, decoder\n\n","unions":[],"aliases":[{"name":"ExtendedAsset","comment":" An extended asset is simply an [Asset](Eos-Asset), but with a contract [Name](Eos-Name)\n","args":[],"type":"{ amount : Basics.Float, symbol : Eos.Symbol.Symbol, contract : Eos.Name.Name }"}],"values":[{"name":"decoder","comment":" Decode an [ExtendedAsset](#ExtendedAsset) from JSON.\n","type":"Json.Decode.Decoder Eos.ExtendedAsset.ExtendedAsset"},{"name":"encode","comment":" Encode an [ExtendedAsset](#ExtendedAsset) into JSON.\n","type":"Eos.ExtendedAsset.ExtendedAsset -> Json.Encode.Value"}],"binops":[]},{"name":"Eos.Name","comment":" Name is a very fundamental basic type of EOSIO. It is used to identify\naccounts, permissions, actions, tables, etc.\n\n@docs Name\n\n\n## Converting to and from `String`\n\n@docs toString, fromString, Error, errorToString\n\n\n## Dealing with JSON\n\n@docs encode, decoder\n\n","unions":[{"name":"Error","comment":" The `Error` type represents all of the possible errors when converting a [Name](#Name)\n[fromString](#fromString).\n\n    fromString \"0123456789\"\n    --> Err (InvalidCharacters ( '0', [ '6', '7', '8', '9' ] ))\n\n    fromString \"eosio.\"\n    --> Err DotInLastPlace\n\n    fromString \"\"\n    --> Err TooShort\n\n    fromString \"a.very.long.name\"\n    --> Err TooLong\n\n","args":[],"cases":[["InvalidCharacters",["( Char.Char, List.List Char.Char )"]],["DotInLastPlace",[]],["TooShort",[]],["TooLong",[]]]},{"name":"Name","comment":" Names are strings of up to 12 characters in length. They can include\ncharacters a-z, 1-5, and the dot character (except for the last character).\n\nIn order to generate a `Name`, you can use [fromString](#fromString) or\n[decoder](#decoder).\n\nTo display a `Name`, use the [toString](#toString) function. You can also\n[encode](#encode) a `Name`\n\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"decoder","comment":" Decode a [Name](#Name) from JSON. You can use this to receive a [Name](#Name)\nfrom the blockchain or some server. It already does all of the validation necessary\nto ensure the [Name](#Name) is valid.\n","type":"Json.Decode.Decoder Eos.Name.Name"},{"name":"encode","comment":" Encode a [Name](#Name) into JSON. You can use this to send a [Name](#Name) to\nthe blockchain or some server.\n","type":"Eos.Name.Name -> Json.Encode.Value"},{"name":"errorToString","comment":" You can use this function to convert an [Error](#Error) into a human-readable\n`String`.\n","type":"Eos.Name.Error -> String.String"},{"name":"fromString","comment":" Convert a regular `String` into a [Name](#Name). Since there are some\nrestrictions on the possible names, this function can fail with an [Error](#Error).\n\n    fromString \"eosio.token\"\n        |> Result.map toString\n    --> Ok \"eosio.token\"\n\n    fromString \"0123456789\"\n    --> Err (InvalidCharacters ( '0', [ '6', '7', '8', '9' ] ))\n\n    fromString \"eosio.\"\n    --> Err DotInLastPlace\n\n    fromString \"\"\n    --> Err TooShort\n\n    fromString \"a.very.long.name\"\n    --> Err TooLong\n\n","type":"String.String -> Result.Result Eos.Name.Error Eos.Name.Name"},{"name":"toString","comment":" Convert a [Name](#Name) to a regular `String`. This is useful if you want to\ndisplay names in your application.\n\n    fromString \"eosio.token\"\n        |> Result.map toString\n    --> Ok \"eosio.token\"\n\n","type":"Eos.Name.Name -> String.String"}],"binops":[]},{"name":"Eos.Permission","comment":" Permissions control what EOSIO accounts can do and how actions are authorized.\nThey are organized in a hierarchical structure, with the root permission being\nthe `Owner` permission. The `Active` permission is a child of the `Owner`.\n\n@docs Permission\n\n\n## Working with JSON\n\n@docs encode, decoder\n\n@docs toString\n\n","unions":[{"name":"Permission","comment":" There are two permissions by default: Owner and Active. However, each account\nmay have arbitrary permissions (that's what `Custom` is for).\n","args":[],"cases":[["Owner",[]],["Active",[]],["Custom",["Eos.Name.Name"]]]}],"aliases":[],"values":[{"name":"decoder","comment":" Decode a JSON value into a Permission\n","type":"Json.Decode.Decoder Eos.Permission.Permission"},{"name":"encode","comment":" Turn a permission into a JSON value.\n","type":"Eos.Permission.Permission -> Json.Encode.Value"},{"name":"toString","comment":" Turn a Permission into a String\n","type":"Eos.Permission.Permission -> String.String"}],"binops":[]},{"name":"Eos.PublicKey","comment":"\n\n@docs PublicKey\n\n@docs encode, decoder\n\n@docs fromString, toString\n\n","unions":[{"name":"PublicKey","comment":" A PublicKey\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"decoder","comment":" Decode a PublicKey.\n","type":"Json.Decode.Decoder Eos.PublicKey.PublicKey"},{"name":"encode","comment":" Encode a [PublicKey](#PublicKey) into JSON.\n","type":"Eos.PublicKey.PublicKey -> Json.Encode.Value"},{"name":"fromString","comment":" Turn a String into a PublicKey\n","type":"String.String -> Eos.PublicKey.PublicKey"},{"name":"toString","comment":" Turn a PublicKey into a String\n","type":"Eos.PublicKey.PublicKey -> String.String"}],"binops":[]},{"name":"Eos.Query","comment":" Perform queries to get data from tables. The CLI gives you functions to perform\ntype-safe queries, and this module helps you actually turn them into Cmds.\n\n@docs Query\n\n@docs send\n\n@docs Response\n\n@docs withBaseUrl, withLimit, withLowerBound, withUpperBound, withReverse\n\n@docs Cursor\n\n@docs Index\n\n@docs map\n\n","unions":[{"name":"Cursor","comment":" Used to set the lower bound or upper bound with [withLowerBound](#withLowerBound)\nor [withUpperBound](#withUpperBound). You can get one of these from [send](#send).\n","args":[],"cases":[]},{"name":"Index","comment":" The Index to use when sending a [Query](#Query).\n","args":[],"cases":[["Primary",[]],["Secondary",[]],["Tertiary",[]],["Fourth",[]],["Fifth",[]],["Sixth",[]],["Seventh",[]],["Eighth",[]],["Ninth",[]],["Tenth",[]]]},{"name":"Query","comment":" The `Query` type. It's only exposed so that the CLI can have access to it.\nYou shouldn't construct it by hand.\n","args":["response"],"cases":[["Query",["{ scope : String.String, indexPosition : Maybe.Maybe Eos.Query.Index, lowerBound : Maybe.Maybe Eos.Query.Cursor, upperBound : Maybe.Maybe Eos.Query.Cursor, limit : Maybe.Maybe Basics.Int, reverse : Basics.Bool, baseUrl : String.String, contract : String.String, table : String.String, decoder : Json.Decode.Decoder response }"]]]}],"aliases":[{"name":"Response","comment":" A response from a [Query](#Query). It contains the results, and also\npagination data. You can check if there is more data to be fetched with the\n`hasMore` field. If there is, you can use the `nextCursor` field to fetch the\nnext page of data with [withLowerBound](#withLowerBound) or\n[withUpperBound](#withUpperBound).\n","args":["response"],"type":"{ hasMore : Basics.Bool, nextCursor : Eos.Query.Cursor, result : List.List response }"}],"values":[{"name":"map","comment":" Map the response of a Query. This is here so the CLI can use it. You probably\nshouldn't need to use it.\n","type":"(response -> mappedResponse) -> Eos.Query.Query response -> Eos.Query.Query mappedResponse"},{"name":"send","comment":" Send a [Query](#Query) to EOSIO.\n\nYou shouldn't need to construct a [Query](#Query) by hand. Instead, use functions\ngenerated by the CLI. They live in the Table.Query module.\n\nSome parameters of the query are defined when running the CLI (like `baseUrl`).\nOthers can be modified with functions like [withLimit](#withLimit) and\n[withBaseUrl](#withBaseUrl) (in case you need to override it).\n\nThis returns a [Response](#Response), since there may be pagination in the result.\nIf you want to paginate, keep the [Cursor](#Cursor) returned in the\n[Response](#Response) and use [withLowerBound](#withLowerBound) or\n[withUpperBound](#withUpperBound) in the next query.\n\n    import Eos.Query\n    import Http\n    import Table\n    import Table.Query\n\n    type Msg\n        = GotAccountData (Result Http.Error (Eos.Query.Response Table.Accounts))\n\n    queryAccounts : Cmd Msg\n    queryAccounts =\n        Table.Query.accounts { scope = \"henriquebuss\" }\n            |> Eos.Query.withLimit 20\n            |> Eos.Query.send GotAccountData\n\n","type":"(Result.Result Http.Error (Eos.Query.Response response) -> msg) -> Eos.Query.Query response -> Platform.Cmd.Cmd msg"},{"name":"withBaseUrl","comment":" Redefine the base url to [send](#send) a [Query](#Query). This is already\ndefined when running the CLI, so you shouldn't need this function often.\n","type":"String.String -> Eos.Query.Query response -> Eos.Query.Query response"},{"name":"withLimit","comment":" Set how many entries to fetch on [send](#send).\n","type":"Basics.Int -> Eos.Query.Query response -> Eos.Query.Query response"},{"name":"withLowerBound","comment":" Define the lower bound of a [Query](#Query). This is used to paginate the\nresults. You can get a [Cursor](#Cursor) from a [Response](#Response), which you\ncan get with [send](#send).\n","type":"Eos.Query.Cursor -> Eos.Query.Query response -> Eos.Query.Query response"},{"name":"withReverse","comment":" Define if the [Query](#Query) results should be reversed.\n","type":"Basics.Bool -> Eos.Query.Query response -> Eos.Query.Query response"},{"name":"withUpperBound","comment":" Define the upper bound of a [Query](#Query). This is used to paginate the\nresults. You can get a [Cursor](#Cursor) from a [Response](#Response), which you\ncan get with [send](#send).\n","type":"Eos.Query.Cursor -> Eos.Query.Query response -> Eos.Query.Query response"}],"binops":[]},{"name":"Eos.Signature","comment":"\n\n@docs Signature\n\n@docs encode, decoder\n\n@docs fromString, toString\n\n","unions":[{"name":"Signature","comment":" A Signature\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"decoder","comment":" Decode a Signature.\n","type":"Json.Decode.Decoder Eos.Signature.Signature"},{"name":"encode","comment":" Encode a [Signature](#Signature) into JSON.\n","type":"Eos.Signature.Signature -> Json.Encode.Value"},{"name":"fromString","comment":" Turn a String into a Signature\n","type":"String.String -> Eos.Signature.Signature"},{"name":"toString","comment":" Turn a Signature into a String\n","type":"Eos.Signature.Signature -> String.String"}],"binops":[]},{"name":"Eos.Symbol","comment":"\n\n@docs Symbol\n\n\n## Extracting information\n\n@docs precision, code\n\n\n## Converting from `String`s and `Int`s\n\n@docs fromPrecisionAndCodeString, fromPrecisionAndCode, Error, PrecisionError, errorToString\n\n\n## Dealing with JSON\n\n@docs encode, decoder\n\n","unions":[{"name":"Error","comment":" When creating a [Symbol](#Symbol), there are two things we validate: the\nprecision and the symbol code. This type represents that.\n","args":[],"cases":[["PrecisionError",["Eos.Symbol.PrecisionError"]],["SymbolCodeError",["Eos.SymbolCode.Error"]]]},{"name":"PrecisionError","comment":" Precisions must be >= 0. This type represents the error that can happen when\ntrying to create a [Symbol](#Symbol) with a negative precision.\n","args":[],"cases":[["NegativePrecision",[]]]},{"name":"Symbol","comment":" A Symbol is what identifies a currency, and is made of a `precision` and a\n[SymbolCode](Eos-SymbolCode). For example, the symbol `1,EOS` is a symbol with\nprecision 1, and a symbol code of `EOS`.\n\nThe precision number determines how many decimal digits can be used. In the\nexample above, someone can have 0.1 EOS, but not 0.01 EOS.\n\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"code","comment":" Get the [SymbolCode](Eos-SymbolCode) of a [Symbol](#Symbol)\n\n    import Eos.SymbolCode\n\n    fromPrecisionAndCodeString 1 \"EOS\"\n        |> Result.map (code >> Eos.SymbolCode.toString)\n    --> Ok \"EOS\"\n\n","type":"Eos.Symbol.Symbol -> Eos.SymbolCode.SymbolCode"},{"name":"decoder","comment":" Decode a [Symbol](#Symbol) from a JSON value.\n","type":"Json.Decode.Decoder Eos.Symbol.Symbol"},{"name":"encode","comment":" Encode a [Symbol](#Symbol) into a JSON value.\n","type":"Eos.Symbol.Symbol -> Json.Encode.Value"},{"name":"errorToString","comment":" You can use this function to convert an [Error](#Error) to a human-readable\n`String`.\n","type":"Eos.Symbol.Error -> String.String"},{"name":"fromPrecisionAndCode","comment":" Create a [Symbol](#Symbol) from a precision and a [SymbolCode](Eos-SymbolCode).\n","type":"Basics.Int -> Eos.SymbolCode.SymbolCode -> Result.Result Eos.Symbol.PrecisionError Eos.Symbol.Symbol"},{"name":"fromPrecisionAndCodeString","comment":" Create a [Symbol](#Symbol) from a precision and a `String` that represents a\n[SymbolCode](Eos-SymbolCode). If you already have a [SymbolCode](Eos-SymbolCode),\nuse [fromPrecisionAndCode](#fromPrecisionAndCode) instead.\n\n    import Eos.SymbolCode\n\n    fromPrecisionAndCodeString 1 \"EOS\"\n        |> Result.map\n            (\\symbol ->\n                { precision = precision symbol\n                , codeString = Eos.SymbolCode.toString (code symbol)\n                }\n            )\n    --> Ok { precision = 1, codeString = \"EOS\" }\n\n    fromPrecisionAndCodeString -1 \"EOS\"\n    --> Err (PrecisionError NegativePrecision)\n\n    fromPrecisionAndCodeString 1 \"eos\"\n    --> Err (SymbolCodeError (Eos.SymbolCode.InvalidCharacters ( 'e', [ 'o', 's' ] )))\n\n","type":"Basics.Int -> String.String -> Result.Result Eos.Symbol.Error Eos.Symbol.Symbol"},{"name":"precision","comment":" Get the precision of a [Symbol](#Symbol).\n\n    fromPrecisionAndCodeString 1 \"EOS\"\n        |> Result.map precision\n    --> Ok 1\n\n","type":"Eos.Symbol.Symbol -> Basics.Int"}],"binops":[]},{"name":"Eos.SymbolCode","comment":" A symbol code is usually used in a [Symbol](Eos-Symbol#Symbol), along with a precision.\n\n@docs SymbolCode\n\n\n## Converting to and from `String`\n\n@docs toString, fromString, Error, errorToString\n\n\n## Dealing with JSON\n\n@docs encode, decoder\n\n","unions":[{"name":"Error","comment":" Converting a `String` into a `SymbolCode` (with [fromString](#fromString))\ncan fail. This type represents all of the possible errors.\n\n    fromString \"Test\"\n    --> Err (InvalidCharacters ( 'e', [ 's', 't' ] ))\n\n    fromString \"VERYLONG\"\n    --> Err TooLong\n\n    fromString \"EOS\"\n        |> Result.map toString\n    --> Ok (\"EOS\")\n\n","args":[],"cases":[["InvalidCharacters",["( Char.Char, List.List Char.Char )"]],["TooLong",[]]]},{"name":"SymbolCode","comment":" The symbol code is the \"name\" of the symbol. For example, the symbol `0,ABC` has\nprecision `0` and symbol code `ABC`.\n\nA symbol code is a `String` of up to 7 characters, consisting of uppercase letters\nfrom A-Z.\n\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"decoder","comment":" Decode a [SymbolCode](#SymbolCode) from JSON. It already does all of the\nvalidation necessary to ensure the [SymbolCode](#SymbolCode) is valid.\n","type":"Json.Decode.Decoder Eos.SymbolCode.SymbolCode"},{"name":"encode","comment":" Encode a [SymbolCode](#SymbolCode) into JSON.\n","type":"Eos.SymbolCode.SymbolCode -> Json.Encode.Value"},{"name":"errorToString","comment":" You can use this function to convert an [Error](#Error) into a human-readable\n`String`.\n","type":"Eos.SymbolCode.Error -> String.String"},{"name":"fromString","comment":" Convert a `String` into a [SymbolCode](#SymbolCode). A SymbolCode must be\na `String` of up to 7 characters, all uppercase letters (A-Z).\n\n    fromString \"Test\"\n    --> Err (InvalidCharacters ( 'e', [ 's', 't' ] ))\n\n    fromString \"VERYLONG\"\n    --> Err TooLong\n\n    fromString \"EOS\"\n        |> Result.map toString\n    --> Ok (\"EOS\")\n\n","type":"String.String -> Result.Result Eos.SymbolCode.Error Eos.SymbolCode.SymbolCode"},{"name":"toString","comment":" Convert a [SymbolCode](#SymbolCode) to a `String`\n\n    fromString \"EOS\"\n        |> Result.map toString\n    --> Ok \"EOS\"\n\n","type":"Eos.SymbolCode.SymbolCode -> String.String"}],"binops":[]},{"name":"Eos.TimePoint","comment":" TimePoint encodes a point in time in microseconds.\n\n@docs TimePoint\n\n\n## Converting to and from microseconds\n\n@docs fromMicroseconds, toMicroseconds\n\n\n## Converting to and from `Time.Posix`\n\n@docs toPosix, fromPosix\n\n\n## Dealing with JSON\n\n@docs encode, decoder\n\n","unions":[{"name":"TimePoint","comment":" A point in time in microseconds.\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"decoder","comment":" Decode a [TimePoint](#TimePoint) from JSON. You can use this to receive a\n[TimePoint](#TimePoint) from the blockchain or some server.\n","type":"Json.Decode.Decoder Eos.TimePoint.TimePoint"},{"name":"encode","comment":" Encode a [TimePoint](#TimePoint) into JSON. You can use this to send a\n[TimePoint](#TimePoint) to the blockchain or some server.\n","type":"Eos.TimePoint.TimePoint -> Json.Encode.Value"},{"name":"fromMicroseconds","comment":" Convert microseconds to a `TimePoint`.\n","type":"Basics.Int -> Eos.TimePoint.TimePoint"},{"name":"fromPosix","comment":" Convert a `Time.Posix` to a `TimePoint`. Since `Time.Posix` uses milliseconds\nand EOSIO uses microseconds, you may lose some information.\n","type":"Time.Posix -> Eos.TimePoint.TimePoint"},{"name":"toMicroseconds","comment":" Convert a `TimePoint` to microseconds.\n","type":"Eos.TimePoint.TimePoint -> Basics.Int"},{"name":"toPosix","comment":" Convert a `TimePoint` to a `Time.Posix`. Since `Time.Posix` uses milliseconds\nand EOSIO uses microseconds, you may lose some information.\n","type":"Eos.TimePoint.TimePoint -> Time.Posix"}],"binops":[]},{"name":"Eos.TimePointSec","comment":" TimePointSec encodes a point in time in seconds.\n\n@docs TimePointSec\n\n\n## Converting to and from seconds\n\n@docs fromSeconds, toSeconds\n\n\n## Converting to and from `Time.Posix`\n\n@docs toPosix, fromPosix\n\n\n## Dealing with JSON\n\n@docs encode, decoder\n\n","unions":[{"name":"TimePointSec","comment":" A point in time in seconds.\n","args":[],"cases":[]}],"aliases":[],"values":[{"name":"decoder","comment":" Decode a [TimePointSec](#TimePointSec) from JSON. You can use this to receive a\n[TimePointSec](#TimePointSec) from the blockchain or some server.\n","type":"Json.Decode.Decoder Eos.TimePointSec.TimePointSec"},{"name":"encode","comment":" Encode a [TimePointSec](#TimePointSec) into JSON. You can use this to send a\n[TimePointSec](#TimePointSec) to the blockchain or some server.\n","type":"Eos.TimePointSec.TimePointSec -> Json.Encode.Value"},{"name":"fromPosix","comment":" Convert a `Time.Posix` to a `TimePointSec`.\n","type":"Time.Posix -> Eos.TimePointSec.TimePointSec"},{"name":"fromSeconds","comment":" Convert seconds to a `TimePointSec`.\n","type":"Basics.Int -> Eos.TimePointSec.TimePointSec"},{"name":"toPosix","comment":" Convert a `TimePointSec` to a `Time.Posix`.\n","type":"Eos.TimePointSec.TimePointSec -> Time.Posix"},{"name":"toSeconds","comment":" Convert a `TimePointSec` to seconds.\n","type":"Eos.TimePointSec.TimePointSec -> Basics.Int"}],"binops":[]}]