~comcloudway/little_town

f2cfeb844dcb50af374e87791188ef8bb56f4e81 — Jakob Meier 1 year, 8 months ago c0dc549
Started working on p2p Multiplayer

Known problem: The Map messages are not being received
(when map is to big)
M .build.yml => .build.yml +1 -0
@@ 6,6 6,7 @@ packages:
  - wget
  - clang
  - alsa-lib-dev
  - protoc
artifacts:
  - ./LittleTown-amd64-musl
  - ./LittleTown-amd64-gnu

M Cargo.lock => Cargo.lock +3401 -209
@@ 9,17 9,260 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"

[[package]]
name = "aead"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877"
dependencies = [
 "generic-array",
]

[[package]]
name = "aes"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8"
dependencies = [
 "cfg-if",
 "cipher 0.3.0",
 "cpufeatures",
 "opaque-debug",
]

[[package]]
name = "aes-gcm"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6"
dependencies = [
 "aead",
 "aes",
 "cipher 0.3.0",
 "ctr",
 "ghash",
 "subtle",
]

[[package]]
name = "ahash"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
dependencies = [
 "getrandom",
 "getrandom 0.2.8",
 "once_cell",
 "version_check",
]

[[package]]
name = "aho-corasick"
version = "0.7.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
dependencies = [
 "memchr",
]

[[package]]
name = "anyhow"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800"

[[package]]
name = "arrayref"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"

[[package]]
name = "arrayvec"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"

[[package]]
name = "asn1_der"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e22d1f4b888c298a027c99dc9048015fac177587de20fc30232a057dfbe24a21"

[[package]]
name = "async-channel"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833"
dependencies = [
 "concurrent-queue",
 "event-listener",
 "futures-core",
]

[[package]]
name = "async-executor"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b"
dependencies = [
 "async-lock",
 "async-task",
 "concurrent-queue",
 "fastrand",
 "futures-lite",
 "slab",
]

[[package]]
name = "async-global-executor"
version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
dependencies = [
 "async-channel",
 "async-executor",
 "async-io",
 "async-lock",
 "blocking",
 "futures-lite",
 "once_cell",
]

[[package]]
name = "async-io"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794"
dependencies = [
 "async-lock",
 "autocfg",
 "concurrent-queue",
 "futures-lite",
 "libc",
 "log",
 "parking",
 "polling",
 "slab",
 "socket2",
 "waker-fn",
 "windows-sys 0.42.0",
]

[[package]]
name = "async-lock"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685"
dependencies = [
 "event-listener",
 "futures-lite",
]

[[package]]
name = "async-process"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6381ead98388605d0d9ff86371043b5aa922a3905824244de40dc263a14fcba4"
dependencies = [
 "async-io",
 "async-lock",
 "autocfg",
 "blocking",
 "cfg-if",
 "event-listener",
 "futures-lite",
 "libc",
 "signal-hook",
 "windows-sys 0.42.0",
]

[[package]]
name = "async-std"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d"
dependencies = [
 "async-channel",
 "async-global-executor",
 "async-io",
 "async-lock",
 "async-process",
 "crossbeam-utils",
 "futures-channel",
 "futures-core",
 "futures-io",
 "futures-lite",
 "gloo-timers",
 "kv-log-macro",
 "log",
 "memchr",
 "once_cell",
 "pin-project-lite 0.2.9",
 "pin-utils",
 "slab",
 "wasm-bindgen-futures",
]

[[package]]
name = "async-std-resolver"
version = "0.21.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f2f8a4a203be3325981310ab243a28e6e4ea55b6519bffce05d41ab60e09ad8"
dependencies = [
 "async-std",
 "async-trait",
 "futures-io",
 "futures-util",
 "pin-utils",
 "socket2",
 "trust-dns-resolver",
]

[[package]]
name = "async-task"
version = "4.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524"

[[package]]
name = "async-trait"
version = "0.1.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "asynchronous-codec"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182"
dependencies = [
 "bytes",
 "futures-sink",
 "futures-util",
 "memchr",
 "pin-project-lite 0.2.9",
]

[[package]]
name = "atomic"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c"
dependencies = [
 "autocfg",
]

[[package]]
name = "atomic-waker"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599"

[[package]]
name = "audir-sles"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 44,12 287,71 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"

[[package]]
name = "base64"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"

[[package]]
name = "bimap"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc0455254eb5c6964c4545d8bac815e1a1be4f3afe0ae695ea539c12d728d44b"

[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"

[[package]]
name = "blake2"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe"
dependencies = [
 "digest 0.10.6",
]

[[package]]
name = "block-buffer"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
dependencies = [
 "generic-array",
]

[[package]]
name = "block-buffer"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
dependencies = [
 "generic-array",
]

[[package]]
name = "blocking"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8"
dependencies = [
 "async-channel",
 "async-lock",
 "async-task",
 "atomic-waker",
 "fastrand",
 "futures-lite",
]

[[package]]
name = "bs58"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3"

[[package]]
name = "bumpalo"
version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 68,383 370,3273 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"

[[package]]
name = "bytes"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"

[[package]]
name = "cc"
version = "1.0.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"

[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"

[[package]]
name = "chacha20"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6"
dependencies = [
 "cfg-if",
 "cipher 0.3.0",
 "cpufeatures",
 "zeroize",
]

[[package]]
name = "chacha20poly1305"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5"
dependencies = [
 "aead",
 "chacha20",
 "cipher 0.3.0",
 "poly1305",
 "zeroize",
]

[[package]]
name = "cipher"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7"
dependencies = [
 "generic-array",
]

[[package]]
name = "cipher"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e"
dependencies = [
 "crypto-common",
 "inout",
]

[[package]]
name = "color_quant"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"

[[package]]
name = "concurrent-queue"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e"
dependencies = [
 "crossbeam-utils",
]

[[package]]
name = "core-foundation"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
dependencies = [
 "core-foundation-sys",
 "libc",
]

[[package]]
name = "core-foundation-sys"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"

[[package]]
name = "core2"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505"
dependencies = [
 "memchr",
]

[[package]]
name = "cpufeatures"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
dependencies = [
 "libc",
]

[[package]]
name = "crc32fast"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
dependencies = [
 "cfg-if",
 "cfg-if",
]

[[package]]
name = "crossbeam-utils"
version = "0.8.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
dependencies = [
 "cfg-if",
]

[[package]]
name = "crunchy"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"

[[package]]
name = "crypto-common"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
 "generic-array",
 "typenum",
]

[[package]]
name = "crypto-mac"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"
dependencies = [
 "generic-array",
 "subtle",
]

[[package]]
name = "ctor"
version = "0.1.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
dependencies = [
 "quote",
 "syn",
]

[[package]]
name = "ctr"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea"
dependencies = [
 "cipher 0.3.0",
]

[[package]]
name = "cuckoofilter"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b810a8449931679f64cd7eef1bbd0fa315801b6d5d9cdc1ace2804d6529eee18"
dependencies = [
 "byteorder",
 "fnv",
 "rand 0.7.3",
]

[[package]]
name = "curve25519-dalek"
version = "3.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0"
dependencies = [
 "byteorder",
 "digest 0.9.0",
 "rand_core 0.5.1",
 "subtle",
 "zeroize",
]

[[package]]
name = "curve25519-dalek"
version = "4.0.0-rc.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8da00a7a9a4eb92a0a0f8e75660926d48f0d0f3c537e455c457bcdaa1e16b1ac"
dependencies = [
 "cfg-if",
 "fiat-crypto",
 "packed_simd_2",
 "platforms",
 "subtle",
 "zeroize",
]

[[package]]
name = "dasp_frame"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2a3937f5fe2135702897535c8d4a5553f8b116f76c1529088797f2eee7c5cd6"
dependencies = [
 "dasp_sample",
]

[[package]]
name = "dasp_sample"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f"

[[package]]
name = "data-encoding"
version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb"

[[package]]
name = "digest"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
dependencies = [
 "generic-array",
]

[[package]]
name = "digest"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
dependencies = [
 "block-buffer 0.10.3",
 "crypto-common",
 "subtle",
]

[[package]]
name = "dns-parser"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea"
dependencies = [
 "byteorder",
 "quick-error",
]

[[package]]
name = "dtoa"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c00704156a7de8df8da0911424e30c2049957b0a714542a44e05fe693dd85313"

[[package]]
name = "ed25519"
version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7"
dependencies = [
 "signature",
]

[[package]]
name = "ed25519-dalek"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d"
dependencies = [
 "curve25519-dalek 3.2.1",
 "ed25519",
 "rand 0.7.3",
 "serde",
 "sha2 0.9.9",
 "zeroize",
]

[[package]]
name = "either"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"

[[package]]
name = "enum-as-inner"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73"
dependencies = [
 "heck 0.4.1",
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "errno"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
dependencies = [
 "errno-dragonfly",
 "libc",
 "winapi",
]

[[package]]
name = "errno-dragonfly"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
dependencies = [
 "cc",
 "libc",
]

[[package]]
name = "event-listener"
version = "2.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"

[[package]]
name = "fastrand"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
dependencies = [
 "instant",
]

[[package]]
name = "fiat-crypto"
version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a214f5bb88731d436478f3ae1f8a277b62124089ba9fb67f4f93fb100ef73c90"

[[package]]
name = "fixedbitset"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"

[[package]]
name = "flate2"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
dependencies = [
 "crc32fast",
 "libz-sys",
 "miniz_oxide",
]

[[package]]
name = "fnv"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"

[[package]]
name = "fontdue"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a62391ecb864cf12ed06b2af4eda2e609b97657950d6a8f06841b17726ab253"
dependencies = [
 "hashbrown 0.11.2",
 "ttf-parser",
]

[[package]]
name = "form_urlencoded"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
dependencies = [
 "percent-encoding",
]

[[package]]
name = "futures"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84"
dependencies = [
 "futures-channel",
 "futures-core",
 "futures-executor",
 "futures-io",
 "futures-sink",
 "futures-task",
 "futures-util",
]

[[package]]
name = "futures-channel"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5"
dependencies = [
 "futures-core",
 "futures-sink",
]

[[package]]
name = "futures-core"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608"

[[package]]
name = "futures-executor"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e"
dependencies = [
 "futures-core",
 "futures-task",
 "futures-util",
 "num_cpus",
]

[[package]]
name = "futures-io"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531"

[[package]]
name = "futures-lite"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48"
dependencies = [
 "fastrand",
 "futures-core",
 "futures-io",
 "memchr",
 "parking",
 "pin-project-lite 0.2.9",
 "waker-fn",
]

[[package]]
name = "futures-macro"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "futures-rustls"
version = "0.22.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd"
dependencies = [
 "futures-io",
 "rustls",
 "webpki",
]

[[package]]
name = "futures-sink"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364"

[[package]]
name = "futures-task"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366"

[[package]]
name = "futures-timer"
version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"

[[package]]
name = "futures-util"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1"
dependencies = [
 "futures-channel",
 "futures-core",
 "futures-io",
 "futures-macro",
 "futures-sink",
 "futures-task",
 "memchr",
 "pin-project-lite 0.2.9",
 "pin-utils",
 "slab",
]

[[package]]
name = "generic-array"
version = "0.14.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
dependencies = [
 "typenum",
 "version_check",
]

[[package]]
name = "getrandom"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
dependencies = [
 "cfg-if",
 "libc",
 "wasi 0.9.0+wasi-snapshot-preview1",
]

[[package]]
name = "getrandom"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
dependencies = [
 "cfg-if",
 "js-sys",
 "libc",
 "wasi 0.11.0+wasi-snapshot-preview1",
 "wasm-bindgen",
]

[[package]]
name = "ghash"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99"
dependencies = [
 "opaque-debug",
 "polyval",
]

[[package]]
name = "glam"
version = "0.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815"

[[package]]
name = "gloo-timers"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
dependencies = [
 "futures-channel",
 "futures-core",
 "js-sys",
 "wasm-bindgen",
]

[[package]]
name = "hashbrown"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
dependencies = [
 "ahash",
]

[[package]]
name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
dependencies = [
 "ahash",
]

[[package]]
name = "heck"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
dependencies = [
 "unicode-segmentation",
]

[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"

[[package]]
name = "hermit-abi"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
dependencies = [
 "libc",
]

[[package]]
name = "hex"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"

[[package]]
name = "hex_fmt"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f"

[[package]]
name = "hmac"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840"
dependencies = [
 "crypto-mac",
 "digest 0.9.0",
]

[[package]]
name = "hmac-drbg"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1"
dependencies = [
 "digest 0.9.0",
 "generic-array",
 "hmac",
]

[[package]]
name = "hostname"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867"
dependencies = [
 "libc",
 "match_cfg",
 "winapi",
]

[[package]]
name = "hound"
version = "3.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1"

[[package]]
name = "httparse"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"

[[package]]
name = "idna"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
dependencies = [
 "matches",
 "unicode-bidi",
 "unicode-normalization",
]

[[package]]
name = "idna"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
dependencies = [
 "unicode-bidi",
 "unicode-normalization",
]

[[package]]
name = "if-addrs"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9"
dependencies = [
 "libc",
 "winapi",
]

[[package]]
name = "if-watch"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "015a7df1eb6dda30df37f34b63ada9b7b352984b0e84de2a20ed526345000791"
dependencies = [
 "async-io",
 "core-foundation",
 "fnv",
 "futures",
 "if-addrs",
 "ipnet",
 "log",
 "rtnetlink",
 "system-configuration",
 "windows",
]

[[package]]
name = "image"
version = "0.24.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69b7ea949b537b0fd0af141fff8c77690f2ce96f4f41f042ccb6c69c6c965945"
dependencies = [
 "bytemuck",
 "byteorder",
 "color_quant",
 "num-rational",
 "num-traits",
 "png",
]

[[package]]
name = "indexmap"
version = "1.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
dependencies = [
 "autocfg",
 "hashbrown 0.12.3",
]

[[package]]
name = "inout"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
dependencies = [
 "generic-array",
]

[[package]]
name = "instant"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
dependencies = [
 "cfg-if",
]

[[package]]
name = "io-lifetimes"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3"
dependencies = [
 "libc",
 "windows-sys 0.45.0",
]

[[package]]
name = "ipconfig"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd302af1b90f2463a98fa5ad469fc212c8e3175a41c3068601bfa2727591c5be"
dependencies = [
 "socket2",
 "widestring",
 "winapi",
 "winreg",
]

[[package]]
name = "ipnet"
version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146"

[[package]]
name = "itertools"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
dependencies = [
 "either",
]

[[package]]
name = "itoa"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"

[[package]]
name = "js-sys"
version = "0.3.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
dependencies = [
 "wasm-bindgen",
]

[[package]]
name = "keccak"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768"
dependencies = [
 "cpufeatures",
]

[[package]]
name = "kv-log-macro"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
dependencies = [
 "log",
]

[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"

[[package]]
name = "lewton"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d542c1a317036c45c2aa1cf10cc9d403ca91eb2d333ef1a4917e5cb10628bd0"
dependencies = [
 "byteorder",
 "ogg",
 "smallvec 0.6.14",
]

[[package]]
name = "libc"
version = "0.2.139"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"

[[package]]
name = "libm"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"

[[package]]
name = "libp2p"
version = "0.44.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "475ce2ac4a9727e53a519f6ee05b38abfcba8f0d39c4d24f103d184e36fd5b0f"
dependencies = [
 "atomic",
 "bytes",
 "futures",
 "futures-timer",
 "getrandom 0.2.8",
 "instant",
 "lazy_static",
 "libp2p-autonat",
 "libp2p-core",
 "libp2p-deflate",
 "libp2p-dns",
 "libp2p-floodsub",
 "libp2p-gossipsub",
 "libp2p-identify",
 "libp2p-kad",
 "libp2p-mdns",
 "libp2p-metrics",
 "libp2p-mplex",
 "libp2p-noise",
 "libp2p-ping",
 "libp2p-plaintext",
 "libp2p-pnet",
 "libp2p-relay",
 "libp2p-rendezvous",
 "libp2p-request-response",
 "libp2p-swarm",
 "libp2p-swarm-derive",
 "libp2p-tcp",
 "libp2p-uds",
 "libp2p-wasm-ext",
 "libp2p-websocket",
 "libp2p-yamux",
 "multiaddr",
 "parking_lot 0.12.1",
 "pin-project 1.0.12",
 "rand 0.7.3",
 "smallvec 1.10.0",
]

[[package]]
name = "libp2p-autonat"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a13b690e65046af6a09c0b27bd9508fa1cab0efce889de74b0b643b9d2a98f9a"
dependencies = [
 "async-trait",
 "futures",
 "futures-timer",
 "instant",
 "libp2p-core",
 "libp2p-request-response",
 "libp2p-swarm",
 "log",
 "prost",
 "prost-build",
 "rand 0.8.5",
]

[[package]]
name = "libp2p-core"
version = "0.32.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db5b02602099fb75cb2d16f9ea860a320d6eb82ce41e95ab680912c454805cd5"
dependencies = [
 "asn1_der",
 "bs58",
 "ed25519-dalek",
 "either",
 "fnv",
 "futures",
 "futures-timer",
 "instant",
 "lazy_static",
 "libsecp256k1",
 "log",
 "multiaddr",
 "multihash",
 "multistream-select",
 "parking_lot 0.12.1",
 "pin-project 1.0.12",
 "prost",
 "prost-build",
 "rand 0.8.5",
 "ring",
 "rw-stream-sink",
 "sha2 0.10.6",
 "smallvec 1.10.0",
 "thiserror",
 "unsigned-varint",
 "void",
 "zeroize",
]

[[package]]
name = "libp2p-deflate"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b1d37f042f748e224f04785d0e987ae09a2aa518d6401d82d412dad83e360ed"
dependencies = [
 "flate2",
 "futures",
 "libp2p-core",
]

[[package]]
name = "libp2p-dns"
version = "0.32.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "066e33e854e10b5c93fc650458bf2179c7e0d143db260b0963e44a94859817f1"
dependencies = [
 "async-std-resolver",
 "futures",
 "libp2p-core",
 "log",
 "smallvec 1.10.0",
 "trust-dns-resolver",
]

[[package]]
name = "libp2p-floodsub"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "733d3ea6ebe7a7a85df2bc86678b93f24b015fae5fe3b3acc4c400e795a55d2d"
dependencies = [
 "cuckoofilter",
 "fnv",
 "futures",
 "libp2p-core",
 "libp2p-swarm",
 "log",
 "prost",
 "prost-build",
 "rand 0.7.3",
 "smallvec 1.10.0",
]

[[package]]
name = "libp2p-gossipsub"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a90c989a7c0969c2ab63e898da9bc735e3be53fb4f376e9c045ce516bcc9f928"
dependencies = [
 "asynchronous-codec",
 "base64",
 "byteorder",
 "bytes",
 "fnv",
 "futures",
 "hex_fmt",
 "instant",
 "libp2p-core",
 "libp2p-swarm",
 "log",
 "prometheus-client",
 "prost",
 "prost-build",
 "rand 0.7.3",
 "regex",
 "sha2 0.10.6",
 "smallvec 1.10.0",
 "unsigned-varint",
 "wasm-timer",
]

[[package]]
name = "libp2p-identify"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5ef5a5b57904c7c33d6713ef918d239dc6b7553458f3475d87f8a18e9c651c8"
dependencies = [
 "futures",
 "futures-timer",
 "libp2p-core",
 "libp2p-swarm",
 "log",
 "lru",
 "prost",
 "prost-build",
 "smallvec 1.10.0",
]

[[package]]
name = "libp2p-kad"
version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "564e6bd64d177446399ed835b9451a8825b07929d6daa6a94e6405592974725e"
dependencies = [
 "arrayvec",
 "asynchronous-codec",
 "bytes",
 "either",
 "fnv",
 "futures",
 "futures-timer",
 "instant",
 "libp2p-core",
 "libp2p-swarm",
 "log",
 "prost",
 "prost-build",
 "rand 0.7.3",
 "sha2 0.10.6",
 "smallvec 1.10.0",
 "thiserror",
 "uint",
 "unsigned-varint",
 "void",
]

[[package]]
name = "libp2p-mdns"
version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "611ae873c8e280ccfab0d57c7a13cac5644f364529e233114ff07863946058b0"
dependencies = [
 "async-io",
 "data-encoding",
 "dns-parser",
 "futures",
 "if-watch",
 "lazy_static",
 "libp2p-core",
 "libp2p-swarm",
 "log",
 "rand 0.8.5",
 "smallvec 1.10.0",
 "socket2",
 "void",
]

[[package]]
name = "libp2p-metrics"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "985be799bb3796e0c136c768208c3c06604a38430571906a13dcfeda225a3b9d"
dependencies = [
 "libp2p-core",
 "libp2p-gossipsub",
 "libp2p-identify",
 "libp2p-kad",
 "libp2p-ping",
 "libp2p-relay",
 "libp2p-swarm",
 "prometheus-client",
]

[[package]]
name = "libp2p-mplex"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "442eb0c9fff0bf22a34f015724b4143ce01877e079ed0963c722d94c07c72160"
dependencies = [
 "asynchronous-codec",
 "bytes",
 "futures",
 "libp2p-core",
 "log",
 "nohash-hasher",
 "parking_lot 0.12.1",
 "rand 0.7.3",
 "smallvec 1.10.0",
 "unsigned-varint",
]

[[package]]
name = "libp2p-noise"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dd7e0c94051cda67123be68cf6b65211ba3dde7277be9068412de3e7ffd63ef"
dependencies = [
 "bytes",
 "curve25519-dalek 3.2.1",
 "futures",
 "lazy_static",
 "libp2p-core",
 "log",
 "prost",
 "prost-build",
 "rand 0.8.5",
 "sha2 0.10.6",
 "snow",
 "static_assertions",
 "x25519-dalek",
 "zeroize",
]

[[package]]
name = "libp2p-ping"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf57a3c2e821331dda9fe612d4654d676ab6e33d18d9434a18cced72630df6ad"
dependencies = [
 "futures",
 "futures-timer",
 "instant",
 "libp2p-core",
 "libp2p-swarm",
 "log",
 "rand 0.7.3",
 "void",
]

[[package]]
name = "libp2p-plaintext"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "962c0fb0e7212fb96a69b87f2d09bcefd317935239bdc79cda900e7a8897a3fe"
dependencies = [
 "asynchronous-codec",
 "bytes",
 "futures",
 "libp2p-core",
 "log",
 "prost",
 "prost-build",
 "unsigned-varint",
 "void",
]

[[package]]
name = "libp2p-pnet"
version = "0.22.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de160c5631696cea22be326c19bd9d306e254c4964945263aea10f25f6e0864e"
dependencies = [
 "futures",
 "log",
 "pin-project 1.0.12",
 "rand 0.8.5",
 "salsa20",
 "sha3",
]

[[package]]
name = "libp2p-relay"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3aa754cb7bccef51ebc3c458c6bbcef89d83b578a9925438389be841527d408f"
dependencies = [
 "asynchronous-codec",
 "bytes",
 "either",
 "futures",
 "futures-timer",
 "instant",
 "libp2p-core",
 "libp2p-swarm",
 "log",
 "pin-project 1.0.12",
 "prost",
 "prost-build",
 "rand 0.8.5",
 "smallvec 1.10.0",
 "static_assertions",
 "thiserror",
 "unsigned-varint",
 "void",
]

[[package]]
name = "libp2p-rendezvous"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd0baab894c5b84da510b915d53264d566c3c35889f09931fe9edbd2a773bee"
dependencies = [
 "asynchronous-codec",
 "bimap",
 "futures",
 "futures-timer",
 "instant",
 "libp2p-core",
 "libp2p-swarm",
 "log",
 "prost",
 "prost-build",
 "rand 0.8.5",
 "sha2 0.10.6",
 "thiserror",
 "unsigned-varint",
 "void",
]

[[package]]
name = "libp2p-request-response"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e6a6fc6c9ad95661f46989473b34bd2993d14a4de497ff3b2668a910d4b869"
dependencies = [
 "async-trait",
 "bytes",
 "futures",
 "instant",
 "libp2p-core",
 "libp2p-swarm",
 "log",
 "rand 0.7.3",
 "smallvec 1.10.0",
 "unsigned-varint",
]

[[package]]
name = "libp2p-swarm"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f0c69ad9e8f7c5fc50ad5ad9c7c8b57f33716532a2b623197f69f93e374d14c"
dependencies = [
 "either",
 "fnv",
 "futures",
 "futures-timer",
 "instant",
 "libp2p-core",
 "log",
 "pin-project 1.0.12",
 "rand 0.7.3",
 "smallvec 1.10.0",
 "thiserror",
 "void",
]

[[package]]
name = "libp2p-swarm-derive"
version = "0.27.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f693c8c68213034d472cbb93a379c63f4f307d97c06f1c41e4985de481687a5"
dependencies = [
 "quote",
 "syn",
]

[[package]]
name = "libp2p-tcp"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "193447aa729c85aac2376828df76d171c1a589c9e6b58fcc7f9d9a020734122c"
dependencies = [
 "async-io",
 "futures",
 "futures-timer",
 "if-watch",
 "ipnet",
 "libc",
 "libp2p-core",
 "log",
 "socket2",
]

[[package]]
name = "libp2p-uds"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24bdab114f7f2701757d6541266e1131b429bbae382008f207f2114ee4222dcb"
dependencies = [
 "async-std",
 "futures",
 "libp2p-core",
 "log",
]

[[package]]
name = "libp2p-wasm-ext"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f6ea0f84a967ef59a16083f222c18115ae2e91db69809dce275df62e101b279"
dependencies = [
 "futures",
 "js-sys",
 "libp2p-core",
 "parity-send-wrapper",
 "wasm-bindgen",
 "wasm-bindgen-futures",
]

[[package]]
name = "libp2p-websocket"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c932834c3754501c368d1bf3d0fb458487a642b90fc25df082a3a2f3d3b32e37"
dependencies = [
 "either",
 "futures",
 "futures-rustls",
 "libp2p-core",
 "log",
 "quicksink",
 "rw-stream-sink",
 "soketto",
 "url",
 "webpki-roots",
]

[[package]]
name = "libp2p-yamux"
version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be902ebd89193cd020e89e89107726a38cfc0d16d18f613f4a37d046e92c7517"
dependencies = [
 "futures",
 "libp2p-core",
 "parking_lot 0.12.1",
 "thiserror",
 "yamux",
]

[[package]]
name = "libsecp256k1"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1"
dependencies = [
 "arrayref",
 "base64",
 "digest 0.9.0",
 "hmac-drbg",
 "libsecp256k1-core",
 "libsecp256k1-gen-ecmult",
 "libsecp256k1-gen-genmult",
 "rand 0.8.5",
 "serde",
 "sha2 0.9.9",
 "typenum",
]

[[package]]
name = "libsecp256k1-core"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451"
dependencies = [
 "crunchy",
 "digest 0.9.0",
 "subtle",
]

[[package]]
name = "libsecp256k1-gen-ecmult"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809"
dependencies = [
 "libsecp256k1-core",
]

[[package]]
name = "libsecp256k1-gen-genmult"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c"
dependencies = [
 "libsecp256k1-core",
]

[[package]]
name = "libz-sys"
version = "1.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf"
dependencies = [
 "cc",
 "pkg-config",
 "vcpkg",
]

[[package]]
name = "linked-hash-map"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"

[[package]]
name = "linux-raw-sys"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"

[[package]]
name = "little_town"
version = "0.0.1"
dependencies = [
 "async-std",
 "futures",
 "getrandom 0.2.8",
 "libp2p",
 "macroquad",
 "nanoserde",
 "quad-rand",
 "quad-storage",
]

[[package]]
name = "lock_api"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
dependencies = [
 "autocfg",
 "scopeguard",
]

[[package]]
name = "log"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
 "cfg-if",
 "value-bag",
]

[[package]]
name = "lru"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a"
dependencies = [
 "hashbrown 0.12.3",
]

[[package]]
name = "lru-cache"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c"
dependencies = [
 "linked-hash-map",
]

[[package]]
name = "macroquad"
version = "0.3.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3790f7fd2e4c480108cbfc86488f023b72e1e0bb6ffd5c6cba38049c7e2fbfc"
dependencies = [
 "bumpalo",
 "fontdue",
 "glam",
 "image",
 "macroquad_macro",
 "miniquad",
 "quad-rand",
 "quad-snd",
]

[[package]]
name = "macroquad_macro"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5cecfede1e530599c8686f7f2d609489101d3d63741a6dc423afc997ce3fcc8"

[[package]]
name = "malloc_buf"
version = "0.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
dependencies = [
 "libc",
]

[[package]]
name = "match_cfg"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4"

[[package]]
name = "matches"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"

[[package]]
name = "maybe-uninit"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"

[[package]]
name = "memchr"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"

[[package]]
name = "miniquad"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46381fe09fbf91bfa402a3e4fc26a104c9130562d51f89964c46adbc00591496"
dependencies = [
 "libc",
 "ndk-sys",
 "objc",
 "winapi",
]

[[package]]
name = "miniz_oxide"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
dependencies = [
 "adler",
]

[[package]]
name = "multiaddr"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c580bfdd8803cce319b047d239559a22f809094aaea4ac13902a1fdcfcd4261"
dependencies = [
 "arrayref",
 "bs58",
 "byteorder",
 "data-encoding",
 "multihash",
 "percent-encoding",
 "serde",
 "static_assertions",
 "unsigned-varint",
 "url",
]

[[package]]
name = "multihash"
version = "0.16.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc"
dependencies = [
 "core2",
 "digest 0.10.6",
 "multihash-derive",
 "sha2 0.10.6",
 "unsigned-varint",
]

[[package]]
name = "multihash-derive"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db"
dependencies = [
 "proc-macro-crate",
 "proc-macro-error",
 "proc-macro2",
 "quote",
 "syn",
 "synstructure",
]

[[package]]
name = "multimap"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"

[[package]]
name = "multistream-select"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "363a84be6453a70e63513660f4894ef815daf88e3356bffcda9ca27d810ce83b"
dependencies = [
 "bytes",
 "futures",
 "log",
 "pin-project 1.0.12",
 "smallvec 1.10.0",
 "unsigned-varint",
]

[[package]]
name = "nanoserde"
version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "755e7965536bc54d7c9fba2df5ada5bf835b0443fd613f0a53fa199a301839d3"
dependencies = [
 "nanoserde-derive",
]

[[package]]
name = "nanoserde-derive"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed7a94da6c6181c35d043fc61c43ac96d3a5d739e7b8027f77650ba41504d6ab"

[[package]]
name = "ndk-sys"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121"

[[package]]
name = "netlink-packet-core"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297"
dependencies = [
 "anyhow",
 "byteorder",
 "libc",
 "netlink-packet-utils",
]

[[package]]
name = "netlink-packet-route"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab"
dependencies = [
 "anyhow",
 "bitflags",
 "byteorder",
 "libc",
 "netlink-packet-core",
 "netlink-packet-utils",
]

[[package]]
name = "netlink-packet-utils"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34"
dependencies = [
 "anyhow",
 "byteorder",
 "paste",
 "thiserror",
]

[[package]]
name = "netlink-proto"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6"
dependencies = [
 "bytes",
 "futures",
 "log",
 "netlink-packet-core",
 "netlink-sys",
 "thiserror",
 "tokio",
]

[[package]]
name = "netlink-sys"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "260e21fbb6f3d253a14df90eb0000a6066780a15dd901a7519ce02d77a94985b"
dependencies = [
 "async-io",
 "bytes",
 "futures",
 "libc",
 "log",
]

[[package]]
name = "nix"
version = "0.24.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069"
dependencies = [
 "bitflags",
 "cfg-if",
 "libc",
]

[[package]]
name = "nohash-hasher"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"

[[package]]
name = "num-integer"
version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
dependencies = [
 "autocfg",
 "num-traits",
]

[[package]]
name = "num-rational"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
dependencies = [
 "autocfg",
 "num-integer",
 "num-traits",
]

[[package]]
name = "num-traits"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [
 "autocfg",
]

[[package]]
name = "num_cpus"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
dependencies = [
 "hermit-abi",
 "libc",
]

[[package]]
name = "objc"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
dependencies = [
 "malloc_buf",
]

[[package]]
name = "ogg"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13e571c3517af9e1729d4c63571a27edd660ade0667973bfc74a67c660c2b651"
dependencies = [
 "byteorder",
]

[[package]]
name = "once_cell"
version = "1.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"

[[package]]
name = "opaque-debug"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"

[[package]]
name = "owning_ref"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce"
dependencies = [
 "stable_deref_trait",
]

[[package]]
name = "packed_simd_2"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282"
dependencies = [
 "cfg-if",
 "libm",
]

[[package]]
name = "parity-send-wrapper"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f"

[[package]]
name = "parking"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"

[[package]]
name = "parking_lot"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
dependencies = [
 "instant",
 "lock_api",
 "parking_lot_core 0.8.6",
]

[[package]]
name = "parking_lot"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
 "lock_api",
 "parking_lot_core 0.9.7",
]

[[package]]
name = "parking_lot_core"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
dependencies = [
 "cfg-if",
 "instant",
 "libc",
 "redox_syscall",
 "smallvec 1.10.0",
 "winapi",
]

[[package]]
name = "parking_lot_core"
version = "0.9.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
dependencies = [
 "cfg-if",
 "libc",
 "redox_syscall",
 "smallvec 1.10.0",
 "windows-sys 0.45.0",
]

[[package]]
name = "paste"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba"

[[package]]
name = "percent-encoding"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"

[[package]]
name = "petgraph"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4"
dependencies = [
 "fixedbitset",
 "indexmap",
]

[[package]]
name = "pin-project"
version = "0.4.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ef0f924a5ee7ea9cbcea77529dba45f8a9ba9f622419fe3386ca581a3ae9d5a"
dependencies = [
 "pin-project-internal 0.4.30",
]

[[package]]
name = "pin-project"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
dependencies = [
 "pin-project-internal 1.0.12",
]

[[package]]
name = "pin-project-internal"
version = "0.4.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "851c8d0ce9bebe43790dedfc86614c23494ac9f423dd618d3a61fc693eafe61e"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "pin-project-internal"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "pin-project-lite"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777"

[[package]]
name = "pin-project-lite"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"

[[package]]
name = "pin-utils"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"

[[package]]
name = "pkg-config"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"

[[package]]
name = "platforms"
version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630"

[[package]]
name = "png"
version = "0.17.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638"
dependencies = [
 "bitflags",
 "crc32fast",
 "flate2",
 "miniz_oxide",
]

[[package]]
name = "polling"
version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6"
dependencies = [
 "autocfg",
 "cfg-if",
 "libc",
 "log",
 "wepoll-ffi",
 "windows-sys 0.42.0",
]

[[package]]
name = "poly1305"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede"
dependencies = [
 "cpufeatures",
 "opaque-debug",
 "universal-hash",
]

[[package]]
name = "polyval"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1"
dependencies = [
 "cfg-if",
 "cpufeatures",
 "opaque-debug",
 "universal-hash",
]

[[package]]
name = "ppv-lite86"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"

[[package]]
name = "proc-macro-crate"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a"
dependencies = [
 "thiserror",
 "toml",
]

[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
 "proc-macro-error-attr",
 "proc-macro2",
 "quote",
 "syn",
 "version_check",
]

[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
 "proc-macro2",
 "quote",
 "version_check",
]

[[package]]
name = "proc-macro2"
version = "1.0.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6"
dependencies = [
 "unicode-ident",
]

[[package]]
name = "prometheus-client"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9a896938cc6018c64f279888b8c7559d3725210d5db9a3a1ee6bc7188d51d34"
dependencies = [
 "dtoa",
 "itoa",
 "owning_ref",
 "prometheus-client-derive-text-encode",
]

[[package]]
name = "prometheus-client-derive-text-encode"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8e12d01b9d66ad9eb4529c57666b6263fc1993cb30261d83ead658fdd932652"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "prost"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001"
dependencies = [
 "bytes",
 "prost-derive",
]

[[package]]
name = "prost-build"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5"
dependencies = [
 "bytes",
 "heck 0.3.3",
 "itertools",
 "lazy_static",
 "log",
 "multimap",
 "petgraph",
 "prost",
 "prost-types",
 "regex",
 "tempfile",
 "which",
]

[[package]]
name = "prost-derive"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe"
dependencies = [
 "anyhow",
 "itertools",
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "prost-types"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a"
dependencies = [
 "bytes",
 "prost",
]

[[package]]
name = "quad-alsa-sys"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c66c2f04a6946293477973d85adc251d502da51c57b08cd9c997f0cfd8dcd4b5"
dependencies = [
 "libc",
]

[[package]]
name = "quad-rand"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "658fa1faf7a4cc5f057c9ee5ef560f717ad9d8dc66d975267f709624d6e1ab88"

[[package]]
name = "quad-snd"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53c954bb70493a2872775b74b663a767686e6d96d242e789d6a92cc4ebd2a64e"
dependencies = [
 "audir-sles",
 "audrey",
 "libc",
 "quad-alsa-sys",
 "winapi",
]

[[package]]
name = "quad-storage"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e73edba8c792f3b5a45c68a1086f6f8c1bbda34ab9399a7faabd7dc7d4e14a0e"
dependencies = [
 "lazy_static",
 "nanoserde",
 "quad-storage-sys",
]

[[package]]
name = "quad-storage-sys"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1187c77ced2cc6ae79bd6e35cc09e22159164a05c4d867e299bfbf1f801e9157"
dependencies = [
 "sapp-jsutils",
]

[[package]]
name = "quick-error"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0aad603e8d7fb67da22dbdf1f4b826ce8829e406124109e73cf1b2454b93a71c"

[[package]]
name = "quicksink"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858"
dependencies = [
 "futures-core",
 "futures-sink",
 "pin-project-lite 0.1.12",
]

[[package]]
name = "quote"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
dependencies = [
 "proc-macro2",
]

[[package]]
name = "rand"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
dependencies = [
 "getrandom 0.1.16",
 "libc",
 "rand_chacha 0.2.2",
 "rand_core 0.5.1",
 "rand_hc",
]

[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
 "libc",
 "rand_chacha 0.3.1",
 "rand_core 0.6.4",
]

[[package]]
name = "rand_chacha"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
dependencies = [
 "ppv-lite86",
 "rand_core 0.5.1",
]

[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
 "ppv-lite86",
 "rand_core 0.6.4",
]

[[package]]
name = "rand_core"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
dependencies = [
 "getrandom 0.1.16",
]

[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
 "getrandom 0.2.8",
]

[[package]]
name = "rand_hc"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
dependencies = [
 "rand_core 0.5.1",
]

[[package]]
name = "redox_syscall"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
 "bitflags",
]

[[package]]
name = "regex"
version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
dependencies = [
 "aho-corasick",
 "memchr",
 "regex-syntax",
]

[[package]]
name = "regex-syntax"
version = "0.6.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"

[[package]]
name = "resolv-conf"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00"
dependencies = [
 "hostname",
 "quick-error",
]

[[package]]
name = "ring"
version = "0.16.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
dependencies = [
 "cc",
 "libc",
 "once_cell",
 "spin",
 "untrusted",
 "web-sys",
 "winapi",
]

[[package]]
name = "rtnetlink"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0"
dependencies = [
 "async-global-executor",
 "futures",
 "log",
 "netlink-packet-route",
 "netlink-proto",
 "nix",
 "thiserror",
]

[[package]]
name = "rustc_version"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [
 "semver",
]

[[package]]
name = "rustix"
version = "0.36.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644"
dependencies = [
 "bitflags",
 "errno",
 "io-lifetimes",
 "libc",
 "linux-raw-sys",
 "windows-sys 0.45.0",
]

[[package]]
name = "rustls"
version = "0.20.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f"
dependencies = [
 "log",
 "ring",
 "sct",
 "webpki",
]

[[package]]
name = "rw-stream-sink"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020"
dependencies = [
 "futures",
 "pin-project 0.4.30",
 "static_assertions",
]

[[package]]
name = "salsa20"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213"
dependencies = [
 "cipher 0.4.3",
]

[[package]]
name = "sapp-jsutils"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb8ababa867431fa6c0a178248bfe7e77b5d1de357c9848883ba8e3946bb21d4"

[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"

[[package]]
name = "sct"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
dependencies = [
 "ring",
 "untrusted",
]

[[package]]
name = "semver"
version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a"

[[package]]
name = "serde"
version = "1.0.152"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
dependencies = [
 "serde_derive",
]

[[package]]
name = "serde_derive"
version = "1.0.152"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "sha-1"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6"
dependencies = [
 "block-buffer 0.9.0",
 "cfg-if",
 "cpufeatures",
 "digest 0.9.0",
 "opaque-debug",
]

[[package]]
name = "sha2"
version = "0.9.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
dependencies = [
 "block-buffer 0.9.0",
 "cfg-if",
 "cpufeatures",
 "digest 0.9.0",
 "opaque-debug",
]

[[package]]
name = "sha2"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
dependencies = [
 "cfg-if",
 "cpufeatures",
 "digest 0.10.6",
]

[[package]]
name = "sha3"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9"
dependencies = [
 "digest 0.10.6",
 "keccak",
]

[[package]]
name = "signal-hook"
version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9"
dependencies = [
 "libc",
 "signal-hook-registry",
]

[[package]]
name = "signal-hook-registry"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
dependencies = [
 "libc",
]

[[package]]
name = "signature"
version = "1.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"

[[package]]
name = "slab"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
dependencies = [
 "autocfg",
]

[[package]]
name = "smallvec"
version = "0.6.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0"
dependencies = [
 "maybe-uninit",
]

[[package]]
name = "smallvec"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"

[[package]]
name = "snow"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12ba5f4d4ff12bdb6a169ed51b7c48c0e0ac4b0b4b31012b2571e97d78d3201d"
dependencies = [
 "aes-gcm",
 "blake2",
 "chacha20poly1305",
 "curve25519-dalek 4.0.0-rc.0",
 "rand_core 0.6.4",
 "ring",
 "rustc_version",
 "sha2 0.10.6",
 "subtle",
]

[[package]]
name = "socket2"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
dependencies = [
 "libc",
 "winapi",
]

[[package]]
name = "soketto"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2"
dependencies = [
 "base64",
 "bytes",
 "flate2",
 "futures",
 "httparse",
 "log",
 "rand 0.8.5",
 "sha-1",
]

[[package]]
name = "spin"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"

[[package]]
name = "stable_deref_trait"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"

[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"

[[package]]
name = "subtle"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"

[[package]]
name = "syn"
version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
 "proc-macro2",
 "quote",
 "unicode-ident",
]

[[package]]
name = "synstructure"
version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
 "unicode-xid",
]

[[package]]
name = "system-configuration"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd"
dependencies = [
 "bitflags",
 "core-foundation",
 "system-configuration-sys",
]

[[package]]
name = "system-configuration-sys"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
dependencies = [
 "core-foundation-sys",
 "libc",
]

[[package]]
name = "tempfile"
version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
dependencies = [
 "cfg-if",
 "fastrand",
 "redox_syscall",
 "rustix",
 "windows-sys 0.42.0",
]

[[package]]
name = "thiserror"
version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0"
dependencies = [
 "thiserror-impl",
]

[[package]]
name = "thiserror-impl"
version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "tinyvec"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
dependencies = [
 "tinyvec_macros",
]

[[package]]
name = "tinyvec_macros"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"

[[package]]
name = "tokio"
version = "1.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af"
dependencies = [
 "autocfg",
 "bytes",
 "memchr",
 "pin-project-lite 0.2.9",
 "windows-sys 0.42.0",
]

[[package]]
name = "toml"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
dependencies = [
 "serde",
]

[[package]]
name = "trust-dns-proto"
version = "0.21.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d"
dependencies = [
 "async-trait",
 "cfg-if",
 "data-encoding",
 "enum-as-inner",
 "futures-channel",
 "futures-io",
 "futures-util",
 "idna 0.2.3",
 "ipnet",
 "lazy_static",
 "log",
 "rand 0.8.5",
 "smallvec 1.10.0",
 "thiserror",
 "tinyvec",
 "url",
]

[[package]]
name = "trust-dns-resolver"
version = "0.21.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558"
dependencies = [
 "cfg-if",
 "futures-util",
 "ipconfig",
 "lazy_static",
 "log",
 "lru-cache",
 "parking_lot 0.12.1",
 "resolv-conf",
 "smallvec 1.10.0",
 "thiserror",
 "trust-dns-proto",
]

[[package]]
name = "ttf-parser"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd"

[[package]]
name = "typenum"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"

[[package]]
name = "uint"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52"
dependencies = [
 "byteorder",
 "crunchy",
 "hex",
 "static_assertions",
]

[[package]]
name = "unicode-bidi"
version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58"

[[package]]
name = "unicode-ident"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"

[[package]]
name = "unicode-normalization"
version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
dependencies = [
 "tinyvec",
]

[[package]]
name = "unicode-segmentation"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"

[[package]]
name = "unicode-xid"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"

[[package]]
name = "universal-hash"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05"
dependencies = [
 "generic-array",
 "subtle",
]

[[package]]
name = "unsigned-varint"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836"
dependencies = [
 "asynchronous-codec",
 "bytes",
 "futures-io",
 "futures-util",
]

[[package]]
name = "untrusted"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"

[[package]]
name = "url"
version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
dependencies = [
 "form_urlencoded",
 "idna 0.3.0",
 "percent-encoding",
]

[[package]]
name = "dasp_frame"
version = "0.11.0"
name = "value-bag"
version = "1.0.0-alpha.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2a3937f5fe2135702897535c8d4a5553f8b116f76c1529088797f2eee7c5cd6"
checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55"
dependencies = [
 "dasp_sample",
 "ctor",
 "version_check",
]

[[package]]
name = "dasp_sample"
version = "0.11.0"
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"

[[package]]
name = "flate2"
version = "1.0.25"
name = "version_check"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
dependencies = [
 "crc32fast",
 "miniz_oxide",
]
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"

[[package]]
name = "fontdue"
version = "0.7.2"
name = "void"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a62391ecb864cf12ed06b2af4eda2e609b97657950d6a8f06841b17726ab253"
dependencies = [
 "hashbrown",
 "ttf-parser",
]
checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"

[[package]]
name = "getrandom"
version = "0.2.8"
name = "waker-fn"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
dependencies = [
 "cfg-if",
 "libc",
 "wasi",
]
checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"

[[package]]
name = "glam"
version = "0.21.3"
name = "wasi"
version = "0.9.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815"
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"

[[package]]
name = "hashbrown"
version = "0.11.2"
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"

[[package]]
name = "wasm-bindgen"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
dependencies = [
 "ahash",
 "cfg-if",
 "wasm-bindgen-macro",
]

[[package]]
name = "hound"
version = "3.5.0"
name = "wasm-bindgen-backend"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1"
checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
dependencies = [
 "bumpalo",
 "log",
 "once_cell",
 "proc-macro2",
 "quote",
 "syn",
 "wasm-bindgen-shared",
]

[[package]]
name = "image"
version = "0.24.5"
name = "wasm-bindgen-futures"
version = "0.4.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69b7ea949b537b0fd0af141fff8c77690f2ce96f4f41f042ccb6c69c6c965945"
checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454"
dependencies = [
 "bytemuck",
 "byteorder",
 "color_quant",
 "num-rational",
 "num-traits",
 "png",
 "cfg-if",
 "js-sys",
 "wasm-bindgen",
 "web-sys",
]

[[package]]
name = "lazy_static"
version = "1.4.0"
name = "wasm-bindgen-macro"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
dependencies = [
 "quote",
 "wasm-bindgen-macro-support",
]

[[package]]
name = "lewton"
version = "0.9.4"
name = "wasm-bindgen-macro-support"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d542c1a317036c45c2aa1cf10cc9d403ca91eb2d333ef1a4917e5cb10628bd0"
checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
dependencies = [
 "byteorder",
 "ogg",
 "smallvec",
 "proc-macro2",
 "quote",
 "syn",
 "wasm-bindgen-backend",
 "wasm-bindgen-shared",
]

[[package]]
name = "libc"
version = "0.2.139"
name = "wasm-bindgen-shared"
version = "0.2.84"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"

[[package]]
name = "little_town"
version = "0.0.1"
name = "wasm-timer"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f"
dependencies = [
 "macroquad",
 "nanoserde",
 "quad-storage",
 "futures",
 "js-sys",
 "parking_lot 0.11.2",
 "pin-utils",
 "wasm-bindgen",
 "wasm-bindgen-futures",
 "web-sys",
]

[[package]]
name = "macroquad"
version = "0.3.25"
name = "web-sys"
version = "0.3.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3790f7fd2e4c480108cbfc86488f023b72e1e0bb6ffd5c6cba38049c7e2fbfc"
checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97"
dependencies = [
 "bumpalo",
 "fontdue",
 "glam",
 "image",
 "macroquad_macro",
 "miniquad",
 "quad-rand",
 "quad-snd",
 "js-sys",
 "wasm-bindgen",
]

[[package]]
name = "macroquad_macro"
version = "0.1.7"
name = "webpki"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5cecfede1e530599c8686f7f2d609489101d3d63741a6dc423afc997ce3fcc8"
checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
dependencies = [
 "ring",
 "untrusted",
]

[[package]]
name = "malloc_buf"
version = "0.0.6"
name = "webpki-roots"
version = "0.22.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87"
dependencies = [
 "libc",
 "webpki",
]

[[package]]
name = "maybe-uninit"
version = "2.0.0"
name = "wepoll-ffi"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb"
dependencies = [
 "cc",
]

[[package]]
name = "miniquad"
version = "0.3.14"
name = "which"
version = "4.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46381fe09fbf91bfa402a3e4fc26a104c9130562d51f89964c46adbc00591496"
checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
dependencies = [
 "either",
 "libc",
 "ndk-sys",
 "objc",
 "winapi",
 "once_cell",
]

[[package]]
name = "miniz_oxide"
version = "0.6.2"
name = "widestring"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
dependencies = [
 "adler",
]
checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983"

[[package]]
name = "nanoserde"
version = "0.1.32"
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "755e7965536bc54d7c9fba2df5ada5bf835b0443fd613f0a53fa199a301839d3"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
 "nanoserde-derive",
 "winapi-i686-pc-windows-gnu",
 "winapi-x86_64-pc-windows-gnu",
]

[[package]]
name = "nanoserde-derive"
version = "0.1.19"
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed7a94da6c6181c35d043fc61c43ac96d3a5d739e7b8027f77650ba41504d6ab"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"

[[package]]
name = "ndk-sys"
version = "0.2.2"
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

[[package]]
name = "num-integer"
version = "0.1.45"
name = "windows"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f"
dependencies = [
 "autocfg",
 "num-traits",
 "windows_aarch64_msvc 0.34.0",
 "windows_i686_gnu 0.34.0",
 "windows_i686_msvc 0.34.0",
 "windows_x86_64_gnu 0.34.0",
 "windows_x86_64_msvc 0.34.0",
]

[[package]]
name = "num-rational"
version = "0.4.1"
name = "windows-sys"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
dependencies = [
 "autocfg",
 "num-integer",
 "num-traits",
 "windows_aarch64_gnullvm",
 "windows_aarch64_msvc 0.42.1",
 "windows_i686_gnu 0.42.1",
 "windows_i686_msvc 0.42.1",
 "windows_x86_64_gnu 0.42.1",
 "windows_x86_64_gnullvm",
 "windows_x86_64_msvc 0.42.1",
]

[[package]]
name = "num-traits"
version = "0.2.15"
name = "windows-sys"
version = "0.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
dependencies = [
 "autocfg",
 "windows-targets",
]

[[package]]
name = "objc"
version = "0.2.7"
name = "windows-targets"
version = "0.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
dependencies = [
 "malloc_buf",
 "windows_aarch64_gnullvm",
 "windows_aarch64_msvc 0.42.1",
 "windows_i686_gnu 0.42.1",
 "windows_i686_msvc 0.42.1",
 "windows_x86_64_gnu 0.42.1",
 "windows_x86_64_gnullvm",
 "windows_x86_64_msvc 0.42.1",
]

[[package]]
name = "ogg"
version = "0.7.1"
name = "windows_aarch64_gnullvm"
version = "0.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13e571c3517af9e1729d4c63571a27edd660ade0667973bfc74a67c660c2b651"
dependencies = [
 "byteorder",
]
checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"

[[package]]
name = "once_cell"
version = "1.17.1"
name = "windows_aarch64_msvc"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d"

[[package]]
name = "png"
version = "0.17.7"
name = "windows_aarch64_msvc"
version = "0.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638"
dependencies = [
 "bitflags",
 "crc32fast",
 "flate2",
 "miniz_oxide",
]
checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"

[[package]]
name = "quad-alsa-sys"
version = "0.3.2"
name = "windows_i686_gnu"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c66c2f04a6946293477973d85adc251d502da51c57b08cd9c997f0cfd8dcd4b5"
dependencies = [
 "libc",
]
checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed"

[[package]]
name = "quad-rand"
version = "0.2.1"
name = "windows_i686_gnu"
version = "0.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "658fa1faf7a4cc5f057c9ee5ef560f717ad9d8dc66d975267f709624d6e1ab88"
checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"

[[package]]
name = "quad-snd"
version = "0.2.7"
name = "windows_i686_msvc"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53c954bb70493a2872775b74b663a767686e6d96d242e789d6a92cc4ebd2a64e"
dependencies = [
 "audir-sles",
 "audrey",
 "libc",
 "quad-alsa-sys",
 "winapi",
]
checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956"

[[package]]
name = "quad-storage"
version = "0.1.3"
name = "windows_i686_msvc"
version = "0.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e73edba8c792f3b5a45c68a1086f6f8c1bbda34ab9399a7faabd7dc7d4e14a0e"
dependencies = [
 "lazy_static",
 "nanoserde",
 "quad-storage-sys",
]
checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"

[[package]]
name = "quad-storage-sys"
version = "0.1.0"
name = "windows_x86_64_gnu"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1187c77ced2cc6ae79bd6e35cc09e22159164a05c4d867e299bfbf1f801e9157"
dependencies = [
 "sapp-jsutils",
]
checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4"

[[package]]
name = "sapp-jsutils"
version = "0.1.5"
name = "windows_x86_64_gnu"
version = "0.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb8ababa867431fa6c0a178248bfe7e77b5d1de357c9848883ba8e3946bb21d4"
checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"

[[package]]
name = "smallvec"
version = "0.6.14"
name = "windows_x86_64_gnullvm"
version = "0.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0"
dependencies = [
 "maybe-uninit",
]
checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"

[[package]]
name = "ttf-parser"
version = "0.15.2"
name = "windows_x86_64_msvc"
version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd"
checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9"

[[package]]
name = "version_check"
version = "0.9.4"
name = "windows_x86_64_msvc"
version = "0.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"

[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
name = "winreg"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
dependencies = [
 "winapi",
]

[[package]]
name = "winapi"
version = "0.3.9"
name = "x25519-dalek"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
checksum = "2392b6b94a576b4e2bf3c5b2757d63f10ada8020a2e4d08ac849ebcf6ea8e077"
dependencies = [
 "winapi-i686-pc-windows-gnu",
 "winapi-x86_64-pc-windows-gnu",
 "curve25519-dalek 3.2.1",
 "rand_core 0.5.1",
 "zeroize",
]

[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
name = "yamux"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5"
dependencies = [
 "futures",
 "log",
 "nohash-hasher",
 "parking_lot 0.12.1",
 "rand 0.8.5",
 "static_assertions",
]

[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
name = "zeroize"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd"
dependencies = [
 "zeroize_derive",
]

[[package]]
name = "zeroize_derive"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
 "synstructure",
]

M Cargo.toml => Cargo.toml +11 -0
@@ 10,7 10,18 @@ repository = "https://codeberg.org/comcloudway/little_town"
license = "AGPL-3.0-or-later"
keywords = ["game", "isometric", "town", "macroquad"]

[features]
default = ["multiplayer"]
multiplayer = ["libp2p", "futures", "async-std", "getrandom"]

[dependencies]
macroquad = "0.3.25"
nanoserde = "0.1.32"
quad-storage = "0.1.3"

# p2p dependencies
libp2p = { version = "0.44.0", optional = true }
futures = { version = "0.3.21", optional = true }
async-std = { version = "1.11.0", optional = true }
getrandom = { version = "0.2", features = ["js"], optional = true }
quad-rand = "0.2.1"

M src/main.rs => src/main.rs +3 -0
@@ 11,6 11,9 @@ mod types;
mod blocks;
mod draw;

#[cfg(feature = "multiplayer")]
mod p2p;

use types::{
    GameComponent,
    GameEvent

A src/p2p.rs => src/p2p.rs +446 -0
@@ 0,0 1,446 @@
// templated from poemhub
// https://codeberg.org/comcloudway/poemhub/raw/branch/main/poemhub-peer/src/lib.rs
// licensed under AGPL-3.0

use async_std::task;
use futures::{
    prelude::stream::StreamExt,
    channel:: mpsc::{
        self,
        UnboundedSender,
    },
    select,
};
use libp2p::{
    floodsub::{self, Floodsub, FloodsubEvent},
    identity,
    kad::{
        Kademlia,
        KademliaConfig,
        KademliaEvent,
        record::store::MemoryStore
    },
    mdns::{Mdns, MdnsConfig, MdnsEvent},
    swarm::SwarmEvent,
    Multiaddr, NetworkBehaviour, PeerId, Swarm,
    ping, Transport
};
use std::{
    collections::HashMap,
    sync::{
        Arc,
        RwLock,
    },
    thread,
    time::{
        UNIX_EPOCH,
        SystemTime
    }
};
use nanoserde::{SerJson, DeJson};
use crate::blocks::Block;
use crate::types::{
    Pos3,
    Direction
};

/// a collection of a PeerId and a MultiAddress
/// used to connect to external servers
pub type Bootnode = (PeerId, Multiaddr);
/// a bootnode collection
pub type Bootnodes = Vec<Bootnode>;

/// A custom network behaviour that combines floodsub, ping and mDNS.
/// floodsub is used to broadcast messages and events
/// ping is used to keep the connection alive
/// mDNS is used for peer discovery
#[derive(NetworkBehaviour)]
#[behaviour(out_event = "PeerEvent")]
struct PeerBehaviour {
    /// for message broadcasting
    floodsub: Floodsub,
    /// for local peer discovery
    mdns: Mdns,
    /// to keep connection alive
    ping: ping::Behaviour,
    /// for bootnode based external peer discovery
    kademlia: Kademlia<MemoryStore>,

    // Struct fields which do not implement NetworkBehaviour need to be ignored
    #[behaviour(ignore)]
    #[allow(dead_code)]
    ignored_member: bool,
}
impl PeerBehaviour {
    pub fn new(local_peer_id: PeerId) -> Self {
        let mdns = task::block_on(Mdns::new(MdnsConfig::default())).expect("Failed to create mDNS config");
        let kademlia_config = KademliaConfig::default();

        Self {
            floodsub: Floodsub::new(local_peer_id),
            mdns,
            kademlia: Kademlia::with_config(local_peer_id, MemoryStore::new(local_peer_id), kademlia_config),
            ping: ping::Behaviour::new(ping::Config::new().with_keep_alive(true)),
            ignored_member: false,
        }
    }
}

#[derive(Debug)]
/// events that can be received by network Behaviour
enum PeerEvent {
    /// events from floodsub protocol
    /// used to communicate between the peers
    Floodsub(FloodsubEvent),
    /// events from mDNS protocol
    /// used for peer discovery in local network
    Mdns(MdnsEvent),
    /// events from ping protocol
    /// used to keep connection alive
    /// no real reson to actually store them
    Ping(ping::Event),
    Kademlia(KademliaEvent),
}
impl From<MdnsEvent> for PeerEvent {
    fn from(v: MdnsEvent) -> Self {
        Self::Mdns(v)
    }
}
impl From<FloodsubEvent> for PeerEvent {
    fn from(v: FloodsubEvent) -> Self {
        Self::Floodsub(v)
    }
}
impl From<ping::Event> for PeerEvent {
    fn from(v: ping::Event) -> Self {
        Self::Ping(v)
    }
}
impl From<KademliaEvent> for PeerEvent {
    fn from(v: KademliaEvent) -> Self {
        Self::Kademlia(v)
    }
}

/// the topic using which data is broadcasted
const FLOODSUB_TOPIC: &str = "little-town";

/// a GameEvent worth while broadcasting to peers
#[derive(DeJson, SerJson)]
pub enum GameAction {
    /// event send when a block has been placed
    /// contains the block, direction and position
    PlaceBlock(Pos3, Block, Direction),
    /// event send when a block has been removed
    /// contains block and position
    RemoveBlock(Pos3, Block),
    /// event send when a peer joins the map
    /// contains the inventory
    /// including blocks and their count
    /// the second argument is true
    /// if the user has an infinite amount of items
    TransmitInventory(HashMap<Block, usize>, bool),
    /// one of the peers requested an inventory transmission
    RequestInventory,
    /// event send when a peer joins the map
    /// contains the map
    /// including blocks, their direction and position
    TransmitMap(HashMap<Pos3, (Block, Direction)>),
    /// one of the peers requested a map transmission
    RequestMap,
}

enum ChannelEvent {
    /// process game action
    Action(GameAction),
    /// leave the p2p session
    Quit
}

/// struct to manage all relevant options for connection with poemhub p2p network
pub struct Peer {
    /// a list of known bootnodes,
    /// should be provided by the application
    /// NOTE: you might want to fetch a bootnode list from a file server
    bootnodes: Bootnodes,
    /// the local port to run on
    /// recommended for bootnodes to be able to do port forwarding
    /// NOTE: should only be used when running as bootnode
    port: Option<usize>,
    /// Sender
    /// to broadcast ChannelEvents
    bridge: Option<UnboundedSender<ChannelEvent>>,
    /// actions to perform by client
    /// should be processed by client in each iteration
    incoming: Arc<RwLock<Vec<GameAction>>>,
    /// only the host should respond to Request* actions
    /// the host should not change their local state
    /// when receiving Transmit* actions
    /// true if this client is the host
    is_host: bool
}
impl Peer {
    /// create a new peer
    /// in client mode
    pub fn client() -> Self {
        let mut this = Self {
            bridge: None,
            port: None,
            bootnodes: Vec::new(),
            incoming: Arc::new(RwLock::new(Vec::new())),
            is_host: false
        };
        this.connect();
        this
    }
    /// create a new peer
    /// in host mode
    pub fn host() -> Self {
        let mut this = Self {
            bridge: None,
            port: None,
            bootnodes: Vec::new(),
            incoming: Arc::new(RwLock::new(Vec::new())),
            is_host: true
        };
        this.connect();
        this
    }



    /// adds a specific port to the setup
    /// has to be called before connect() is being called
    pub fn with_port(mut self, port: usize) -> Self {
        self.port = Some(port);
        self
    }
    /// appends the given bootnode to the bootnodes list
    /// has to be called before connect() is being called
    pub fn with_bootnode(mut self, node: Bootnode) -> Self {
        self.bootnodes.push(node);
        self
    }

    /// closes the connection to the p2p network
    /// obviously requires you to connect beforehand
    /// if closing the connection fails, an error will be thrown
    pub fn close(&mut self) -> Option<()> {
        if let Some(tx) = &mut self.bridge {
            if tx.start_send(ChannelEvent::Quit).is_ok() {
                return Some(());
            }
        }
        None
    }

    /// attempts to broadcast an event
    /// requires you to connect to the network first
    /// NOTE: to be able to publish a poem you have to login first
    /// This function only redirects your data
    /// and thus wont throw an error as long as the data was transmitted to the second thread
    pub fn perform_action(&mut self, act: GameAction) -> Option<()> {
        let evt = ChannelEvent::Action(act);

        // send data on bridge
        if let Some(tx) = &mut self.bridge {
            if tx.unbounded_send(evt).is_ok() {
                return Some(());
            }
        }
        None
    }
    /// returns the next action to process
    /// if any
    pub fn get_next_task(&mut self) -> Option<GameAction> {
        if self.incoming.read().unwrap().is_empty() {
            None
        } else {
            Some(self.incoming.write().unwrap().remove(0))
        }
    }

    /// starts a new instance
    /// everytime you run connect a new local key will be generated
    /// NOTE: spawning multiple instances is possible - but if you do, you are not able to interact with them
    /// NOTE: Before running connect please make sure that the old instance has been stopped
    pub fn connect(&mut self) {
        let (tx, mut rx) = mpsc::unbounded::<ChannelEvent>();
        self.bridge=Some(tx);

        let bootnodes = self.bootnodes.clone();
        let port = self.port;
        let inbox = self.incoming.clone();
        let is_host = self.is_host.clone();

        thread::spawn(move ||async_std::task::block_on(async {
            let local_key = identity::Keypair::generate_ed25519();
            let local_peer_id = PeerId::from(local_key.public());

            // Set up an encrypted DNS-enabled TCP Transport over the Mplex and Yamux protocols
            let transport = libp2p::tcp::TcpConfig::new()
                .upgrade(libp2p::core::upgrade::Version::V1)
                .authenticate(libp2p::noise::NoiseConfig::xx(
                    libp2p::noise::Keypair::<libp2p::noise::X25519Spec>::new()
                        .into_authentic(&local_key)
                        .expect("Setting up noise encryption failed")
                ).into_authenticated())
                .multiplex(libp2p::mplex::MplexConfig::new())
                .boxed();

            // Create a Floodsub topic
            let floodsub_topic = floodsub::Topic::new(FLOODSUB_TOPIC);

            // Create a Swarm to manage peers and events
            let mut swarm = {
                let mut behaviour = PeerBehaviour::new(local_peer_id);

                behaviour.floodsub.subscribe(floodsub_topic.clone());
                Swarm::new(transport, behaviour, local_peer_id)
            };

            // Reach out to another node if specified
            let mut i = 0;
            while let Some(to_dial) = bootnodes.get(i) {
                i+=1;
                let (peer_id, addr) = to_dial;
                swarm
                    .behaviour_mut()
                    .kademlia
                    .add_address(
                        &peer_id,
                        addr.clone()
                    );
                swarm.behaviour_mut()
                     .floodsub
                     .add_node_to_partial_view(peer_id.clone());
            }

            swarm
                .behaviour_mut()
                .kademlia
                .get_closest_peers(local_peer_id);
            if !bootnodes.is_empty() {
                swarm
                    .behaviour_mut()
                    .kademlia
                    .bootstrap()
                    .expect("Failed to bootstrap kademlia");
            }

            // Listen on all interfaces and whatever port the OS assigns
            quad_rand::srand(SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs());
            let port = port.unwrap_or(quad_rand::gen_range(4000, 9999));
            println!("Setting up port {}", port);
            swarm.listen_on(
                format!(
                    "/ip4/0.0.0.0/tcp/{}",port)
                    .parse()
                    .expect("Failed to parse provided port"))
                 .expect("Failed to start p2p network");


            loop {
                select!{
                    bridge_event = rx.select_next_some() => match bridge_event {
                        ChannelEvent::Action(act) => {
                            let json = act.serialize_json();
                            println!("sending json: {}", json);
                            swarm
                                .behaviour_mut()
                                .floodsub
                                .publish_any(floodsub_topic.clone(), json.as_bytes())
                        },
                        ChannelEvent::Quit => break,
                    },

                    event = swarm.select_next_some() => match event {
                        SwarmEvent::NewListenAddr { address, .. } => {
                            println!("Listening on {:?}", address);
                        }
                        SwarmEvent::Behaviour(PeerEvent::Floodsub(
                            FloodsubEvent::Message(message)
                        )) => {
                            // parse incoming action
                            let text = String::from_utf8_lossy(&message.data);
                            println!("received: {}", text);
                            if let Ok(act) = GameAction::deserialize_json(&text) {
                                // hand on act to game instance
                                let may_process = if is_host {
                                    match act {
                                        GameAction::TransmitMap(_) | GameAction::TransmitInventory(_, _) => false,
                                        _ => true
                                    }
                                } else {
                                    match act {
                                        GameAction::RequestMap | GameAction::RequestInventory => false,
                                        _ => true
                                    }
                                };

                                if may_process {
                                    println!("Adding act to queue");
                                    inbox.write().unwrap().push(act);
                                }
                            }
                        },
                        SwarmEvent::Behaviour(PeerEvent::Floodsub(
                            FloodsubEvent::Subscribed {..}
                        )) => {
                            println!("Subscribed");
                            // ask game to broadcast world map and inventory
                            // game should then send ChannelEvent::Action as quickly as possible
                            if !is_host {
                                // request data
                                // in case host lost the request
                                for act in [ GameAction::RequestMap, GameAction::RequestInventory ] {
                                    let json = act.serialize_json();
                                    swarm
                                        .behaviour_mut()
                                        .floodsub
                                        .publish_any(floodsub_topic.clone(), json.as_bytes())
                                }
                            }
                        },
                        SwarmEvent::Behaviour(PeerEvent::Mdns(
                            MdnsEvent::Discovered(list)
                        )) => {
                            for (peer, a) in list {
                                println!("Discovered {:?}", peer);
                                swarm
                                    .behaviour_mut()
                                    .kademlia
                                    .add_address(
                                        &peer,
                                        a.clone()
                                    );
                                swarm
                                    .behaviour_mut()
                                    .floodsub
                                    .add_node_to_partial_view(peer);
                            }
                        }
                        SwarmEvent::Behaviour(PeerEvent::Mdns(MdnsEvent::Expired(
                            list
                        ))) => {
                            for (peer, _) in list {
                                println!("Disconnected {:?}", peer);
                                if !swarm.behaviour_mut().mdns.has_node(&peer) {
                                    swarm
                                        .behaviour_mut()
                                        .floodsub
                                        .remove_node_from_partial_view(&peer);
                                }
                            }
                        },
                        SwarmEvent::Behaviour(PeerEvent::Kademlia(e)) => {
                            println!("Kademlia: {:?}", e);
                        },
                        // ping events can be ignored
                        _ => {}
                    }
                }
            }
        }));
    }
}

M src/screens/build.rs => src/screens/build.rs +105 -4
@@ 11,6 11,12 @@ use crate::blocks::Block;
use super::inventory::Inventory;
use nanoserde::{DeJson, SerJson};

#[cfg(feature = "multiplayer")]
use crate::p2p::{
    Peer,
    GameAction
};

/// simple Vec2 implementation
/// because I need to derive Serialize and Deserialize
#[derive(Copy, Clone, SerJson, DeJson)]


@@ 64,7 70,10 @@ pub struct BuildScreen {
    cam: Camera,
    show_inv: bool,
    inv: Inventory,
    mouse_position: Option<(f32, f32)>
    mouse_position: Option<(f32, f32)>,
    #[cfg(feature="multiplayer")]
    #[nserde(skip)]
    multiplayer: Option<Peer>
}
impl BuildScreen {
    pub fn new() -> Self {


@@ 82,13 91,35 @@ impl BuildScreen {
            cam: Camera::new(),
            show_inv: false,
            inv: Inventory::new(),
            mouse_position: None
            mouse_position: None,
            #[cfg(feature="multiplayer")]
            multiplayer: None
        };

        this.grid.insert(Pos3::new(0, 0, 0), (Block::default(), Direction::North));

        this
    }
    /// creates a new BuildScreen instance
    /// and starts the p2p multiplayer listener
    #[cfg(feature="multiplayer")]
    pub fn multiplayer(is_host: bool) -> Self {
        if is_host {
            let mut this = Self::new();
            this.multiplayer = Some(Peer::host());
            return this;
        } else {
            Self {
                grid: HashMap::new(),
                cam: Camera::new(),
                show_inv: false,
                inv: Inventory::new(),
                mouse_position: None,
                #[cfg(feature="multiplayer")]
                multiplayer: Some(Peer::client())
            }
        }
    }
}

fn get_screen_coords(pos: &Pos3, scale: f32, center: CVec2) -> (f32, f32) {


@@ 350,7 381,13 @@ impl GameComponent for BuildScreen {

                            // destroy block
                            if let Some((block, _)) = self.grid.remove(&pos) {
                                self.inv.add(block);
                                self.inv.add(block.clone());

                                // transmit block destruction
                                // if multiplayer mode enabled
                                if let Some(mp) = &mut self.multiplayer {
                                    mp.perform_action(GameAction::RemoveBlock(pos.clone(), block));
                                }
                            }
                        }
                    }


@@ 373,7 410,13 @@ impl GameComponent for BuildScreen {
                        }

                        if let Some(block) = self.inv.place() {
                            self.grid.insert(pos, (block, self.inv.direction.clone()));
                            self.grid.insert(pos.clone(), (block.clone(), self.inv.direction.clone()));

                            // transmit block placement
                            // if multiplayer mode enabled
                            if let Some(mp) = &mut self.multiplayer {
                                mp.perform_action(GameAction::PlaceBlock(pos, block, self.inv.direction.clone()));
                            }
                        }
                    }
                }


@@ 450,11 493,69 @@ impl GameComponent for BuildScreen {
            storage.set("build-map", &json);

            if is_key_pressed(KeyCode::Q) {

                if let Some(mp) = &mut self.multiplayer {
                    mp.close();
                }

                // close game
                return GameEvent::Quit;
            }
        }

        if let Some(mp) = &mut self.multiplayer {
            if let Some(task) = mp.get_next_task() {
                // match action
                // and perform neccesarry action
                match task {
                    GameAction::RequestMap => {
                        println!("Sending map");
                        mp.perform_action(GameAction::TransmitMap(self.grid.clone()));
                    },
                    GameAction::RequestInventory => {
                        println!("Sending inv");
                        mp.perform_action(GameAction::TransmitInventory(self.inv.contents.clone(), self.inv.has_infinite_items()));
                    },
                    GameAction::PlaceBlock(pos, block, dir) => {
                        // remove block from inventory
                        if self.inv.has_infinite_items() {
                            if let Some(slot) = self.inv.contents.get_mut(&block) {
                                if *slot > 1 {
                                    *slot -=1;
                                } else if *slot == 0 {
                                    self.inv.contents.remove(&block);
                                }
                            }
                        }

                        self.grid.insert(pos, (block, dir));
                    },
                    GameAction::RemoveBlock(pos, block) => {
                        if self.inv.has_infinite_items() {
                            if let Some(slot) = self.inv.contents.get_mut(&block) {
                                *slot += 1;
                            } else {
                                self.inv.contents.insert(block, 1);
                            }
                        }

                        self.grid.remove(&pos);
                    },
                    GameAction::TransmitMap(grid) => {
                        self.grid = grid;
                    },
                    GameAction::TransmitInventory(inv, infty) => {
                        self.inv.contents = inv;
                        self.inv.toggle_infinite_items(infty);

                        if self.grid.len() == 0 {
                            mp.perform_action(GameAction::RequestMap);
                        }
                    }
                }
            }
        }

        GameEvent::None
    }
}

M src/screens/inventory.rs => src/screens/inventory.rs +7 -1
@@ 24,7 24,7 @@ pub struct Inventory {
    /// with their appropriate amount
    /// if amount is zero, the item should be removed
    /// if infinite_items is true, the amount wont decrease
    contents: HashMap<Block, usize>,
    pub contents: HashMap<Block, usize>,
    /// which block is currently selected
    pub selected: Option<Block>,
    /// in which direction the block should be facing


@@ 37,6 37,12 @@ pub struct Inventory {
    page: usize,
}
impl Inventory {
    pub fn has_infinite_items(&self) -> bool {
        self.infinite_items
    }
    pub fn toggle_infinite_items(&mut self, toggle: bool) {
        self.infinite_items = toggle;
    }
    pub fn new() -> Self {
        let mut cont = HashMap::new();
        let infinite_items = true;

M src/screens/welcome.rs => src/screens/welcome.rs +22 -8
@@ 21,17 21,25 @@ impl GameComponent for WelcomeScreen {
    async fn draw(&self, assets: &AssetStore) {
        draw_centered_text(
            "Welcome",
            screen_width()/2.0, screen_height()/2.0,
            screen_width()/2.0, screen_height()/2.0 - 60.0,
            Some(assets.font), 100, WHITE);

        draw_wide_button(
            "Build", false,
            screen_width()/2.0, screen_height()/2.0 + 0.0,
            &assets);
        draw_wide_button(
            "Host", false,
            screen_width()/2.0, screen_height()/2.0 + 60.0,
            &assets);
        draw_wide_button(
            "Join", false,
            screen_width()/2.0, screen_height()/2.0 + 120.0,
            &assets);

        draw_wide_button(
            "Quit", false,
            screen_width()/2.0, screen_height()/2.0 + 130.0,
            screen_width()/2.0, screen_height()/2.0 + 180.0,
            &assets);
    }
    fn ev_loop(&mut self) -> GameEvent {


@@ 44,14 52,20 @@ impl GameComponent for WelcomeScreen {

            if x >= btn_x_offset && x <= btn_x_offset + 190.0 {
                // might be pressing a button
                if y >= sh_2 + 60.0 && y <= sh_2 + 60.0 + btn_height {
                    // pressing first button
                    // launch build mode
                if y >= sh_2 + 00.0 && y <= sh_2 + 0.0 + btn_height {
                    // pressed build
                    return GameEvent::ChangeScreen(crate::Screen::Build(super::build::BuildScreen::new()));
                }
                if y >= sh_2 + 130.0 && y <= sh_2 + 130.0 + btn_height {
                    // pressing second button
                    // close game
                if y >= sh_2 + 60.0 && y <= sh_2 + 60.0 + btn_height {
                    // pressed host
                    return GameEvent::ChangeScreen(crate::Screen::Build(super::build::BuildScreen::multiplayer(true)));
                }
                if y >= sh_2 + 120.0 && y <= sh_2 + 120.0 + btn_height {
                    // pressed Join
                    return GameEvent::ChangeScreen(crate::Screen::Build(super::build::BuildScreen::multiplayer(false)));
                }
                if y >= sh_2 + 180.0 && y <= sh_2 + 180.0 + btn_height {
                    // pressed quit
                    return GameEvent::Quit;
                }
            }

M src/types.rs => src/types.rs +1 -1
@@ 9,7 9,7 @@ use nanoserde::{DeJson, SerJson};
///   /
///  /
/// x
#[derive(Debug,Eq,Hash,PartialEq, DeJson, SerJson)]
#[derive(Debug,Eq,Hash,PartialEq, DeJson, SerJson, Clone)]
pub struct Pos3 {
    pub x: i64,
    pub y: i64,