├── .github ├── FUNDING.yml └── workflows │ └── rust.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── assets └── y_icon.png ├── build_web.sh ├── check.sh ├── docs ├── README.md ├── eframe_template.js ├── eframe_template_bg.wasm ├── favicon.ico ├── icon-256.png ├── index.html ├── manifest.json └── sw.js ├── meta └── y-reader-demo.gif ├── setup_web.sh ├── src ├── app.rs ├── lib.rs └── main.rs └── start_server.sh /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [rektdeckard] 2 | -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | on: [push, pull_request] 2 | 3 | name: CI 4 | 5 | env: 6 | # This is required to enable the web_sys clipboard API which egui_web uses 7 | # https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html 8 | # https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html 9 | RUSTFLAGS: --cfg=web_sys_unstable_apis 10 | 11 | jobs: 12 | check: 13 | name: Check 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v2 17 | - uses: actions-rs/toolchain@v1 18 | with: 19 | profile: minimal 20 | toolchain: stable 21 | override: true 22 | - uses: actions-rs/cargo@v1 23 | with: 24 | command: check 25 | args: --all-features 26 | 27 | check_wasm: 28 | name: Check wasm32 29 | runs-on: ubuntu-latest 30 | steps: 31 | - uses: actions/checkout@v2 32 | - uses: actions-rs/toolchain@v1 33 | with: 34 | profile: minimal 35 | toolchain: stable 36 | override: true 37 | - run: rustup target add wasm32-unknown-unknown 38 | - uses: actions-rs/cargo@v1 39 | with: 40 | command: check 41 | args: --all-features --lib --target wasm32-unknown-unknown 42 | 43 | test: 44 | name: Test Suite 45 | runs-on: ubuntu-latest 46 | steps: 47 | - uses: actions/checkout@v2 48 | - uses: actions-rs/toolchain@v1 49 | with: 50 | profile: minimal 51 | toolchain: stable 52 | override: true 53 | - run: sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libspeechd-dev libxkbcommon-dev libssl-dev 54 | - uses: actions-rs/cargo@v1 55 | with: 56 | command: test 57 | args: --lib 58 | 59 | fmt: 60 | name: Rustfmt 61 | runs-on: ubuntu-latest 62 | steps: 63 | - uses: actions/checkout@v2 64 | - uses: actions-rs/toolchain@v1 65 | with: 66 | profile: minimal 67 | toolchain: stable 68 | override: true 69 | - run: rustup component add rustfmt 70 | - uses: actions-rs/cargo@v1 71 | with: 72 | command: fmt 73 | args: --all -- --check 74 | 75 | clippy: 76 | name: Clippy 77 | runs-on: ubuntu-latest 78 | steps: 79 | - uses: actions/checkout@v2 80 | - uses: actions-rs/toolchain@v1 81 | with: 82 | profile: minimal 83 | toolchain: stable 84 | override: true 85 | - run: rustup component add clippy 86 | - uses: actions-rs/cargo@v1 87 | with: 88 | command: clippy 89 | args: -- -D warnings 90 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ab_glyph" 7 | version = "0.2.12" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "20b228f2c198f98d4337ceb560333fb12cbb2f4948a953bf8c57d09deb219603" 10 | dependencies = [ 11 | "ab_glyph_rasterizer", 12 | "owned_ttf_parser", 13 | ] 14 | 15 | [[package]] 16 | name = "ab_glyph_rasterizer" 17 | version = "0.1.5" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "a13739d7177fbd22bb0ed28badfff9f372f8bef46c863db4e1c6248f6b223b6e" 20 | 21 | [[package]] 22 | name = "addr2line" 23 | version = "0.17.0" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" 26 | dependencies = [ 27 | "gimli", 28 | ] 29 | 30 | [[package]] 31 | name = "adler" 32 | version = "1.0.2" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 35 | 36 | [[package]] 37 | name = "adler32" 38 | version = "1.2.0" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" 41 | 42 | [[package]] 43 | name = "ahash" 44 | version = "0.7.6" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 47 | dependencies = [ 48 | "getrandom 0.2.3", 49 | "once_cell", 50 | "serde", 51 | "version_check", 52 | ] 53 | 54 | [[package]] 55 | name = "aho-corasick" 56 | version = "0.7.18" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 59 | dependencies = [ 60 | "memchr", 61 | ] 62 | 63 | [[package]] 64 | name = "android_glue" 65 | version = "0.2.3" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" 68 | 69 | [[package]] 70 | name = "ansi_term" 71 | version = "0.12.1" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 74 | dependencies = [ 75 | "winapi 0.3.9", 76 | ] 77 | 78 | [[package]] 79 | name = "atomic_refcell" 80 | version = "0.1.8" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "73b5e5f48b927f04e952dedc932f31995a65a0bf65ec971c74436e51bf6e970d" 83 | 84 | [[package]] 85 | name = "atty" 86 | version = "0.2.14" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 89 | dependencies = [ 90 | "hermit-abi", 91 | "libc", 92 | "winapi 0.3.9", 93 | ] 94 | 95 | [[package]] 96 | name = "autocfg" 97 | version = "1.0.1" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 100 | 101 | [[package]] 102 | name = "backtrace" 103 | version = "0.3.63" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "321629d8ba6513061f26707241fa9bc89524ff1cd7a915a97ef0c62c666ce1b6" 106 | dependencies = [ 107 | "addr2line", 108 | "cc", 109 | "cfg-if 1.0.0", 110 | "libc", 111 | "miniz_oxide 0.4.4", 112 | "object", 113 | "rustc-demangle", 114 | ] 115 | 116 | [[package]] 117 | name = "base-x" 118 | version = "0.2.8" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" 121 | 122 | [[package]] 123 | name = "base64" 124 | version = "0.13.0" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 127 | 128 | [[package]] 129 | name = "bitflags" 130 | version = "1.3.2" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 133 | 134 | [[package]] 135 | name = "block" 136 | version = "0.1.6" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 139 | 140 | [[package]] 141 | name = "bumpalo" 142 | version = "3.8.0" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" 145 | 146 | [[package]] 147 | name = "bytemuck" 148 | version = "1.7.3" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "439989e6b8c38d1b6570a384ef1e49c8848128f5a97f3914baef02920842712f" 151 | 152 | [[package]] 153 | name = "byteorder" 154 | version = "1.4.3" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 157 | 158 | [[package]] 159 | name = "bytes" 160 | version = "0.5.6" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" 163 | 164 | [[package]] 165 | name = "bytes" 166 | version = "1.1.0" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" 169 | 170 | [[package]] 171 | name = "calloop" 172 | version = "0.9.3" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" 175 | dependencies = [ 176 | "log", 177 | "nix", 178 | ] 179 | 180 | [[package]] 181 | name = "cc" 182 | version = "1.0.72" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" 185 | 186 | [[package]] 187 | name = "cfg-if" 188 | version = "0.1.10" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 191 | 192 | [[package]] 193 | name = "cfg-if" 194 | version = "1.0.0" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 197 | 198 | [[package]] 199 | name = "cgl" 200 | version = "0.3.2" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" 203 | dependencies = [ 204 | "libc", 205 | ] 206 | 207 | [[package]] 208 | name = "clap" 209 | version = "2.34.0" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" 212 | dependencies = [ 213 | "ansi_term", 214 | "atty", 215 | "bitflags", 216 | "strsim 0.8.0", 217 | "textwrap", 218 | "unicode-width", 219 | "vec_map", 220 | ] 221 | 222 | [[package]] 223 | name = "clipboard-win" 224 | version = "3.1.1" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342" 227 | dependencies = [ 228 | "lazy-bytes-cast", 229 | "winapi 0.3.9", 230 | ] 231 | 232 | [[package]] 233 | name = "cocoa" 234 | version = "0.24.0" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" 237 | dependencies = [ 238 | "bitflags", 239 | "block", 240 | "cocoa-foundation", 241 | "core-foundation 0.9.2", 242 | "core-graphics 0.22.3", 243 | "foreign-types", 244 | "libc", 245 | "objc", 246 | ] 247 | 248 | [[package]] 249 | name = "cocoa-foundation" 250 | version = "0.1.0" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" 253 | dependencies = [ 254 | "bitflags", 255 | "block", 256 | "core-foundation 0.9.2", 257 | "core-graphics-types", 258 | "foreign-types", 259 | "libc", 260 | "objc", 261 | ] 262 | 263 | [[package]] 264 | name = "color_quant" 265 | version = "1.1.0" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 268 | 269 | [[package]] 270 | name = "const_fn" 271 | version = "0.4.9" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" 274 | 275 | [[package]] 276 | name = "convert_case" 277 | version = "0.4.0" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 280 | 281 | [[package]] 282 | name = "cookie" 283 | version = "0.14.4" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" 286 | dependencies = [ 287 | "percent-encoding", 288 | "time", 289 | "version_check", 290 | ] 291 | 292 | [[package]] 293 | name = "cookie_store" 294 | version = "0.12.0" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "3818dfca4b0cb5211a659bbcbb94225b7127407b2b135e650d717bfb78ab10d3" 297 | dependencies = [ 298 | "cookie", 299 | "idna", 300 | "log", 301 | "publicsuffix", 302 | "serde", 303 | "serde_json", 304 | "time", 305 | "url", 306 | ] 307 | 308 | [[package]] 309 | name = "copypasta" 310 | version = "0.7.1" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "4423d79fed83ebd9ab81ec21fa97144300a961782158287dc9bf7eddac37ff0b" 313 | dependencies = [ 314 | "clipboard-win", 315 | "objc", 316 | "objc-foundation", 317 | "objc_id", 318 | "smithay-clipboard", 319 | "x11-clipboard", 320 | ] 321 | 322 | [[package]] 323 | name = "core-foundation" 324 | version = "0.7.0" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" 327 | dependencies = [ 328 | "core-foundation-sys 0.7.0", 329 | "libc", 330 | ] 331 | 332 | [[package]] 333 | name = "core-foundation" 334 | version = "0.9.2" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" 337 | dependencies = [ 338 | "core-foundation-sys 0.8.3", 339 | "libc", 340 | ] 341 | 342 | [[package]] 343 | name = "core-foundation-sys" 344 | version = "0.7.0" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" 347 | 348 | [[package]] 349 | name = "core-foundation-sys" 350 | version = "0.8.3" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 353 | 354 | [[package]] 355 | name = "core-graphics" 356 | version = "0.19.2" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" 359 | dependencies = [ 360 | "bitflags", 361 | "core-foundation 0.7.0", 362 | "foreign-types", 363 | "libc", 364 | ] 365 | 366 | [[package]] 367 | name = "core-graphics" 368 | version = "0.22.3" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" 371 | dependencies = [ 372 | "bitflags", 373 | "core-foundation 0.9.2", 374 | "core-graphics-types", 375 | "foreign-types", 376 | "libc", 377 | ] 378 | 379 | [[package]] 380 | name = "core-graphics-types" 381 | version = "0.1.1" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" 384 | dependencies = [ 385 | "bitflags", 386 | "core-foundation 0.9.2", 387 | "foreign-types", 388 | "libc", 389 | ] 390 | 391 | [[package]] 392 | name = "core-video-sys" 393 | version = "0.1.4" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" 396 | dependencies = [ 397 | "cfg-if 0.1.10", 398 | "core-foundation-sys 0.7.0", 399 | "core-graphics 0.19.2", 400 | "libc", 401 | "objc", 402 | ] 403 | 404 | [[package]] 405 | name = "crc32fast" 406 | version = "1.3.0" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836" 409 | dependencies = [ 410 | "cfg-if 1.0.0", 411 | ] 412 | 413 | [[package]] 414 | name = "crossbeam-channel" 415 | version = "0.5.2" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" 418 | dependencies = [ 419 | "cfg-if 1.0.0", 420 | "crossbeam-utils", 421 | ] 422 | 423 | [[package]] 424 | name = "crossbeam-deque" 425 | version = "0.8.1" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" 428 | dependencies = [ 429 | "cfg-if 1.0.0", 430 | "crossbeam-epoch", 431 | "crossbeam-utils", 432 | ] 433 | 434 | [[package]] 435 | name = "crossbeam-epoch" 436 | version = "0.9.6" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "97242a70df9b89a65d0b6df3c4bf5b9ce03c5b7309019777fbde37e7537f8762" 439 | dependencies = [ 440 | "cfg-if 1.0.0", 441 | "crossbeam-utils", 442 | "lazy_static", 443 | "memoffset", 444 | "scopeguard", 445 | ] 446 | 447 | [[package]] 448 | name = "crossbeam-utils" 449 | version = "0.8.6" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "cfcae03edb34f947e64acdb1c33ec169824e20657e9ecb61cef6c8c74dcb8120" 452 | dependencies = [ 453 | "cfg-if 1.0.0", 454 | "lazy_static", 455 | ] 456 | 457 | [[package]] 458 | name = "cssparser" 459 | version = "0.27.2" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" 462 | dependencies = [ 463 | "cssparser-macros", 464 | "dtoa-short", 465 | "itoa 0.4.8", 466 | "matches", 467 | "phf", 468 | "proc-macro2", 469 | "quote", 470 | "smallvec", 471 | "syn", 472 | ] 473 | 474 | [[package]] 475 | name = "cssparser-macros" 476 | version = "0.6.0" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" 479 | dependencies = [ 480 | "quote", 481 | "syn", 482 | ] 483 | 484 | [[package]] 485 | name = "cty" 486 | version = "0.2.2" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" 489 | 490 | [[package]] 491 | name = "darling" 492 | version = "0.13.1" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" 495 | dependencies = [ 496 | "darling_core", 497 | "darling_macro", 498 | ] 499 | 500 | [[package]] 501 | name = "darling_core" 502 | version = "0.13.1" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" 505 | dependencies = [ 506 | "fnv", 507 | "ident_case", 508 | "proc-macro2", 509 | "quote", 510 | "strsim 0.10.0", 511 | "syn", 512 | ] 513 | 514 | [[package]] 515 | name = "darling_macro" 516 | version = "0.13.1" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" 519 | dependencies = [ 520 | "darling_core", 521 | "quote", 522 | "syn", 523 | ] 524 | 525 | [[package]] 526 | name = "deflate" 527 | version = "0.8.6" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" 530 | dependencies = [ 531 | "adler32", 532 | "byteorder", 533 | ] 534 | 535 | [[package]] 536 | name = "derivative" 537 | version = "2.2.0" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 540 | dependencies = [ 541 | "proc-macro2", 542 | "quote", 543 | "syn", 544 | ] 545 | 546 | [[package]] 547 | name = "derive_more" 548 | version = "0.99.17" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 551 | dependencies = [ 552 | "convert_case", 553 | "proc-macro2", 554 | "quote", 555 | "rustc_version 0.4.0", 556 | "syn", 557 | ] 558 | 559 | [[package]] 560 | name = "directories-next" 561 | version = "2.0.0" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" 564 | dependencies = [ 565 | "cfg-if 1.0.0", 566 | "dirs-sys-next", 567 | ] 568 | 569 | [[package]] 570 | name = "dirs-sys-next" 571 | version = "0.1.2" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 574 | dependencies = [ 575 | "libc", 576 | "redox_users", 577 | "winapi 0.3.9", 578 | ] 579 | 580 | [[package]] 581 | name = "discard" 582 | version = "1.0.4" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" 585 | 586 | [[package]] 587 | name = "dispatch" 588 | version = "0.2.0" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 591 | 592 | [[package]] 593 | name = "dlib" 594 | version = "0.5.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" 597 | dependencies = [ 598 | "libloading", 599 | ] 600 | 601 | [[package]] 602 | name = "downcast-rs" 603 | version = "1.2.0" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" 606 | 607 | [[package]] 608 | name = "dtoa" 609 | version = "0.4.8" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" 612 | 613 | [[package]] 614 | name = "dtoa-short" 615 | version = "0.3.3" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" 618 | dependencies = [ 619 | "dtoa", 620 | ] 621 | 622 | [[package]] 623 | name = "eframe" 624 | version = "0.16.0" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "a8fd502d42c805bab4c2eccfaf3e28243fe3a5870ac0c13c4514470ea6d8fb19" 627 | dependencies = [ 628 | "egui", 629 | "egui-winit", 630 | "egui_glium", 631 | "egui_web", 632 | "epi", 633 | ] 634 | 635 | [[package]] 636 | name = "ego-tree" 637 | version = "0.6.2" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591" 640 | 641 | [[package]] 642 | name = "egui" 643 | version = "0.16.0" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "82e80e8014bfc292b411b3f4b25300f9082e4e76484d5bf67b77274d23a72607" 646 | dependencies = [ 647 | "ahash", 648 | "epaint", 649 | "nohash-hasher", 650 | "ron", 651 | "serde", 652 | ] 653 | 654 | [[package]] 655 | name = "egui-winit" 656 | version = "0.16.0" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "1d5469a6ffc609e9e41e647617c0480ea4af69a8563e6efc4e1d7df0d550b5ef" 659 | dependencies = [ 660 | "copypasta", 661 | "egui", 662 | "epi", 663 | "serde", 664 | "webbrowser", 665 | "winit", 666 | ] 667 | 668 | [[package]] 669 | name = "egui_glium" 670 | version = "0.16.0" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "652110ddd1da1da0aa66a52d68695d828f4ab55cdc5bc21d779bfe9e440b0ec7" 673 | dependencies = [ 674 | "egui", 675 | "egui-winit", 676 | "epi", 677 | "glium", 678 | ] 679 | 680 | [[package]] 681 | name = "egui_web" 682 | version = "0.16.0" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "0a717dbb0cc1909a4c7c0955cc0cf7c77a9eee2a88cca18fe96888c428a4c206" 685 | dependencies = [ 686 | "egui", 687 | "epi", 688 | "js-sys", 689 | "wasm-bindgen", 690 | "wasm-bindgen-futures", 691 | "web-sys", 692 | ] 693 | 694 | [[package]] 695 | name = "either" 696 | version = "1.6.1" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 699 | 700 | [[package]] 701 | name = "emath" 702 | version = "0.16.0" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "55673de2eb96660dde25ba7b2d36a7054beead1a2bec74dcfd5eb05a1e1ba76d" 705 | dependencies = [ 706 | "serde", 707 | ] 708 | 709 | [[package]] 710 | name = "encoding_rs" 711 | version = "0.8.30" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" 714 | dependencies = [ 715 | "cfg-if 1.0.0", 716 | ] 717 | 718 | [[package]] 719 | name = "env_logger" 720 | version = "0.7.1" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" 723 | dependencies = [ 724 | "atty", 725 | "humantime", 726 | "log", 727 | "regex", 728 | "termcolor", 729 | ] 730 | 731 | [[package]] 732 | name = "epaint" 733 | version = "0.16.0" 734 | source = "registry+https://github.com/rust-lang/crates.io-index" 735 | checksum = "adfd9296f7f92902e41c0e8e5deca6d2fb29f289c86d03a01ea01bd7498316c2" 736 | dependencies = [ 737 | "ab_glyph", 738 | "ahash", 739 | "atomic_refcell", 740 | "emath", 741 | "nohash-hasher", 742 | "serde", 743 | ] 744 | 745 | [[package]] 746 | name = "epi" 747 | version = "0.16.0" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | checksum = "b4ae4ce3271febeacc5b4afbd77e500316c6ba316561067acbdddf0c14268a7c" 750 | dependencies = [ 751 | "directories-next", 752 | "egui", 753 | "ron", 754 | "serde", 755 | ] 756 | 757 | [[package]] 758 | name = "fastrand" 759 | version = "1.6.0" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "779d043b6a0b90cc4c0ed7ee380a6504394cee7efd7db050e3774eee387324b2" 762 | dependencies = [ 763 | "instant", 764 | ] 765 | 766 | [[package]] 767 | name = "fnv" 768 | version = "1.0.7" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 771 | 772 | [[package]] 773 | name = "foreign-types" 774 | version = "0.3.2" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 777 | dependencies = [ 778 | "foreign-types-shared", 779 | ] 780 | 781 | [[package]] 782 | name = "foreign-types-shared" 783 | version = "0.1.1" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 786 | 787 | [[package]] 788 | name = "form_urlencoded" 789 | version = "1.0.1" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 792 | dependencies = [ 793 | "matches", 794 | "percent-encoding", 795 | ] 796 | 797 | [[package]] 798 | name = "fuchsia-zircon" 799 | version = "0.3.3" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 802 | dependencies = [ 803 | "bitflags", 804 | "fuchsia-zircon-sys", 805 | ] 806 | 807 | [[package]] 808 | name = "fuchsia-zircon-sys" 809 | version = "0.3.3" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 812 | 813 | [[package]] 814 | name = "futf" 815 | version = "0.1.4" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" 818 | dependencies = [ 819 | "mac", 820 | "new_debug_unreachable", 821 | ] 822 | 823 | [[package]] 824 | name = "futures-channel" 825 | version = "0.3.19" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" 828 | dependencies = [ 829 | "futures-core", 830 | ] 831 | 832 | [[package]] 833 | name = "futures-core" 834 | version = "0.3.19" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" 837 | 838 | [[package]] 839 | name = "futures-io" 840 | version = "0.3.19" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" 843 | 844 | [[package]] 845 | name = "futures-sink" 846 | version = "0.3.19" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" 849 | 850 | [[package]] 851 | name = "futures-task" 852 | version = "0.3.19" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" 855 | 856 | [[package]] 857 | name = "futures-util" 858 | version = "0.3.19" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" 861 | dependencies = [ 862 | "futures-core", 863 | "futures-io", 864 | "futures-task", 865 | "memchr", 866 | "pin-project-lite 0.2.8", 867 | "pin-utils", 868 | "slab", 869 | ] 870 | 871 | [[package]] 872 | name = "fxhash" 873 | version = "0.2.1" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 876 | dependencies = [ 877 | "byteorder", 878 | ] 879 | 880 | [[package]] 881 | name = "getopts" 882 | version = "0.2.21" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" 885 | dependencies = [ 886 | "unicode-width", 887 | ] 888 | 889 | [[package]] 890 | name = "getrandom" 891 | version = "0.1.16" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 894 | dependencies = [ 895 | "cfg-if 1.0.0", 896 | "libc", 897 | "wasi 0.9.0+wasi-snapshot-preview1", 898 | ] 899 | 900 | [[package]] 901 | name = "getrandom" 902 | version = "0.2.3" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" 905 | dependencies = [ 906 | "cfg-if 1.0.0", 907 | "libc", 908 | "wasi 0.10.2+wasi-snapshot-preview1", 909 | ] 910 | 911 | [[package]] 912 | name = "gif" 913 | version = "0.11.3" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "c3a7187e78088aead22ceedeee99779455b23fc231fe13ec443f99bb71694e5b" 916 | dependencies = [ 917 | "color_quant", 918 | "weezl", 919 | ] 920 | 921 | [[package]] 922 | name = "gimli" 923 | version = "0.26.1" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" 926 | 927 | [[package]] 928 | name = "gl_generator" 929 | version = "0.14.0" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 932 | dependencies = [ 933 | "khronos_api", 934 | "log", 935 | "xml-rs", 936 | ] 937 | 938 | [[package]] 939 | name = "glium" 940 | version = "0.31.0" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "0ab4f09b43d8ee427a700cb9ed3b20e0e858d62a509edded1a98ca5707d68e19" 943 | dependencies = [ 944 | "backtrace", 945 | "fnv", 946 | "gl_generator", 947 | "glutin", 948 | "lazy_static", 949 | "memoffset", 950 | "smallvec", 951 | "takeable-option", 952 | ] 953 | 954 | [[package]] 955 | name = "glutin" 956 | version = "0.28.0" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "00ea9dbe544bc8a657c4c4a798c2d16cd01b549820e47657297549d28371f6d2" 959 | dependencies = [ 960 | "android_glue", 961 | "cgl", 962 | "cocoa", 963 | "core-foundation 0.9.2", 964 | "glutin_egl_sys", 965 | "glutin_emscripten_sys", 966 | "glutin_gles2_sys", 967 | "glutin_glx_sys", 968 | "glutin_wgl_sys", 969 | "lazy_static", 970 | "libloading", 971 | "log", 972 | "objc", 973 | "osmesa-sys", 974 | "parking_lot", 975 | "wayland-client", 976 | "wayland-egl", 977 | "winapi 0.3.9", 978 | "winit", 979 | ] 980 | 981 | [[package]] 982 | name = "glutin_egl_sys" 983 | version = "0.1.5" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "2abb6aa55523480c4adc5a56bbaa249992e2dddb2fc63dc96e04a3355364c211" 986 | dependencies = [ 987 | "gl_generator", 988 | "winapi 0.3.9", 989 | ] 990 | 991 | [[package]] 992 | name = "glutin_emscripten_sys" 993 | version = "0.1.1" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1" 996 | 997 | [[package]] 998 | name = "glutin_gles2_sys" 999 | version = "0.1.5" 1000 | source = "registry+https://github.com/rust-lang/crates.io-index" 1001 | checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103" 1002 | dependencies = [ 1003 | "gl_generator", 1004 | "objc", 1005 | ] 1006 | 1007 | [[package]] 1008 | name = "glutin_glx_sys" 1009 | version = "0.1.7" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "7e393c8fc02b807459410429150e9c4faffdb312d59b8c038566173c81991351" 1012 | dependencies = [ 1013 | "gl_generator", 1014 | "x11-dl", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "glutin_wgl_sys" 1019 | version = "0.1.5" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "3da5951a1569dbab865c6f2a863efafff193a93caf05538d193e9e3816d21696" 1022 | dependencies = [ 1023 | "gl_generator", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "grid-printer" 1028 | version = "0.1.1" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "91dc23fa0c8da615e5eccdf1b7b282e32bdfc9ff7b55cb545f10120ee20a4b1b" 1031 | 1032 | [[package]] 1033 | name = "h2" 1034 | version = "0.2.7" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" 1037 | dependencies = [ 1038 | "bytes 0.5.6", 1039 | "fnv", 1040 | "futures-core", 1041 | "futures-sink", 1042 | "futures-util", 1043 | "http", 1044 | "indexmap", 1045 | "slab", 1046 | "tokio", 1047 | "tokio-util", 1048 | "tracing", 1049 | "tracing-futures", 1050 | ] 1051 | 1052 | [[package]] 1053 | name = "hacker-news" 1054 | version = "0.1.2" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | checksum = "74f23ff6955104a784928bf6d0a890f42745018ab5811775c5c9c138cf84b70e" 1057 | dependencies = [ 1058 | "clap", 1059 | "env_logger", 1060 | "grid-printer", 1061 | "lazy_static", 1062 | "log", 1063 | "regex", 1064 | "reqwest", 1065 | "scraper", 1066 | "selectors", 1067 | "serde", 1068 | "serde_json", 1069 | "serde_with", 1070 | ] 1071 | 1072 | [[package]] 1073 | name = "hashbrown" 1074 | version = "0.11.2" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" 1077 | 1078 | [[package]] 1079 | name = "hermit-abi" 1080 | version = "0.1.19" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 1083 | dependencies = [ 1084 | "libc", 1085 | ] 1086 | 1087 | [[package]] 1088 | name = "html-escape" 1089 | version = "0.2.9" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "816ea801a95538fc5f53c836697b3f8b64a9d664c4f0b91efe1fe7c92e4dbcb7" 1092 | dependencies = [ 1093 | "utf8-width", 1094 | ] 1095 | 1096 | [[package]] 1097 | name = "html5ever" 1098 | version = "0.25.1" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b" 1101 | dependencies = [ 1102 | "log", 1103 | "mac", 1104 | "markup5ever", 1105 | "proc-macro2", 1106 | "quote", 1107 | "syn", 1108 | ] 1109 | 1110 | [[package]] 1111 | name = "http" 1112 | version = "0.2.6" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" 1115 | dependencies = [ 1116 | "bytes 1.1.0", 1117 | "fnv", 1118 | "itoa 1.0.1", 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "http-body" 1123 | version = "0.3.1" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" 1126 | dependencies = [ 1127 | "bytes 0.5.6", 1128 | "http", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "httparse" 1133 | version = "1.5.1" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" 1136 | 1137 | [[package]] 1138 | name = "httpdate" 1139 | version = "0.3.2" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" 1142 | 1143 | [[package]] 1144 | name = "humantime" 1145 | version = "1.3.0" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" 1148 | dependencies = [ 1149 | "quick-error", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "hyper" 1154 | version = "0.13.10" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "8a6f157065790a3ed2f88679250419b5cdd96e714a0d65f7797fd337186e96bb" 1157 | dependencies = [ 1158 | "bytes 0.5.6", 1159 | "futures-channel", 1160 | "futures-core", 1161 | "futures-util", 1162 | "h2", 1163 | "http", 1164 | "http-body", 1165 | "httparse", 1166 | "httpdate", 1167 | "itoa 0.4.8", 1168 | "pin-project", 1169 | "socket2", 1170 | "tokio", 1171 | "tower-service", 1172 | "tracing", 1173 | "want", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "hyper-tls" 1178 | version = "0.4.3" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" 1181 | dependencies = [ 1182 | "bytes 0.5.6", 1183 | "hyper", 1184 | "native-tls", 1185 | "tokio", 1186 | "tokio-tls", 1187 | ] 1188 | 1189 | [[package]] 1190 | name = "ident_case" 1191 | version = "1.0.1" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1194 | 1195 | [[package]] 1196 | name = "idna" 1197 | version = "0.2.3" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 1200 | dependencies = [ 1201 | "matches", 1202 | "unicode-bidi", 1203 | "unicode-normalization", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "image" 1208 | version = "0.23.14" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" 1211 | dependencies = [ 1212 | "bytemuck", 1213 | "byteorder", 1214 | "color_quant", 1215 | "gif", 1216 | "jpeg-decoder", 1217 | "num-iter", 1218 | "num-rational", 1219 | "num-traits", 1220 | "png", 1221 | "scoped_threadpool", 1222 | "tiff", 1223 | ] 1224 | 1225 | [[package]] 1226 | name = "indexmap" 1227 | version = "1.8.0" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" 1230 | dependencies = [ 1231 | "autocfg", 1232 | "hashbrown", 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "instant" 1237 | version = "0.1.12" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1240 | dependencies = [ 1241 | "cfg-if 1.0.0", 1242 | "js-sys", 1243 | "wasm-bindgen", 1244 | "web-sys", 1245 | ] 1246 | 1247 | [[package]] 1248 | name = "iovec" 1249 | version = "0.1.4" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 1252 | dependencies = [ 1253 | "libc", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "ipnet" 1258 | version = "2.3.1" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" 1261 | 1262 | [[package]] 1263 | name = "itoa" 1264 | version = "0.4.8" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 1267 | 1268 | [[package]] 1269 | name = "itoa" 1270 | version = "1.0.1" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" 1273 | 1274 | [[package]] 1275 | name = "jni-sys" 1276 | version = "0.3.0" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1279 | 1280 | [[package]] 1281 | name = "jpeg-decoder" 1282 | version = "0.1.22" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" 1285 | dependencies = [ 1286 | "rayon", 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "js-sys" 1291 | version = "0.3.55" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" 1294 | dependencies = [ 1295 | "wasm-bindgen", 1296 | ] 1297 | 1298 | [[package]] 1299 | name = "kernel32-sys" 1300 | version = "0.2.2" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1303 | dependencies = [ 1304 | "winapi 0.2.8", 1305 | "winapi-build", 1306 | ] 1307 | 1308 | [[package]] 1309 | name = "khronos_api" 1310 | version = "3.1.0" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 1313 | 1314 | [[package]] 1315 | name = "lazy-bytes-cast" 1316 | version = "5.0.1" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" 1319 | 1320 | [[package]] 1321 | name = "lazy_static" 1322 | version = "1.4.0" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1325 | 1326 | [[package]] 1327 | name = "libc" 1328 | version = "0.2.112" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" 1331 | 1332 | [[package]] 1333 | name = "libloading" 1334 | version = "0.7.2" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "afe203d669ec979b7128619bae5a63b7b42e9203c1b29146079ee05e2f604b52" 1337 | dependencies = [ 1338 | "cfg-if 1.0.0", 1339 | "winapi 0.3.9", 1340 | ] 1341 | 1342 | [[package]] 1343 | name = "lock_api" 1344 | version = "0.4.5" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" 1347 | dependencies = [ 1348 | "scopeguard", 1349 | ] 1350 | 1351 | [[package]] 1352 | name = "log" 1353 | version = "0.4.14" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 1356 | dependencies = [ 1357 | "cfg-if 1.0.0", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "mac" 1362 | version = "0.1.1" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 1365 | 1366 | [[package]] 1367 | name = "malloc_buf" 1368 | version = "0.0.6" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1371 | dependencies = [ 1372 | "libc", 1373 | ] 1374 | 1375 | [[package]] 1376 | name = "markup5ever" 1377 | version = "0.10.1" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" 1380 | dependencies = [ 1381 | "log", 1382 | "phf", 1383 | "phf_codegen", 1384 | "string_cache", 1385 | "string_cache_codegen", 1386 | "tendril", 1387 | ] 1388 | 1389 | [[package]] 1390 | name = "matches" 1391 | version = "0.1.9" 1392 | source = "registry+https://github.com/rust-lang/crates.io-index" 1393 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 1394 | 1395 | [[package]] 1396 | name = "memchr" 1397 | version = "2.4.1" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" 1400 | 1401 | [[package]] 1402 | name = "memmap2" 1403 | version = "0.3.1" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" 1406 | dependencies = [ 1407 | "libc", 1408 | ] 1409 | 1410 | [[package]] 1411 | name = "memoffset" 1412 | version = "0.6.5" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1415 | dependencies = [ 1416 | "autocfg", 1417 | ] 1418 | 1419 | [[package]] 1420 | name = "mime" 1421 | version = "0.3.16" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1424 | 1425 | [[package]] 1426 | name = "mime_guess" 1427 | version = "2.0.3" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" 1430 | dependencies = [ 1431 | "mime", 1432 | "unicase", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "minimal-lexical" 1437 | version = "0.2.1" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1440 | 1441 | [[package]] 1442 | name = "miniz_oxide" 1443 | version = "0.3.7" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" 1446 | dependencies = [ 1447 | "adler32", 1448 | ] 1449 | 1450 | [[package]] 1451 | name = "miniz_oxide" 1452 | version = "0.4.4" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" 1455 | dependencies = [ 1456 | "adler", 1457 | "autocfg", 1458 | ] 1459 | 1460 | [[package]] 1461 | name = "mio" 1462 | version = "0.6.23" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" 1465 | dependencies = [ 1466 | "cfg-if 0.1.10", 1467 | "fuchsia-zircon", 1468 | "fuchsia-zircon-sys", 1469 | "iovec", 1470 | "kernel32-sys", 1471 | "libc", 1472 | "log", 1473 | "miow 0.2.2", 1474 | "net2", 1475 | "slab", 1476 | "winapi 0.2.8", 1477 | ] 1478 | 1479 | [[package]] 1480 | name = "mio" 1481 | version = "0.8.0" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" 1484 | dependencies = [ 1485 | "libc", 1486 | "log", 1487 | "miow 0.3.7", 1488 | "ntapi", 1489 | "winapi 0.3.9", 1490 | ] 1491 | 1492 | [[package]] 1493 | name = "miow" 1494 | version = "0.2.2" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" 1497 | dependencies = [ 1498 | "kernel32-sys", 1499 | "net2", 1500 | "winapi 0.2.8", 1501 | "ws2_32-sys", 1502 | ] 1503 | 1504 | [[package]] 1505 | name = "miow" 1506 | version = "0.3.7" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" 1509 | dependencies = [ 1510 | "winapi 0.3.9", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "native-tls" 1515 | version = "0.2.8" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" 1518 | dependencies = [ 1519 | "lazy_static", 1520 | "libc", 1521 | "log", 1522 | "openssl", 1523 | "openssl-probe", 1524 | "openssl-sys", 1525 | "schannel", 1526 | "security-framework", 1527 | "security-framework-sys", 1528 | "tempfile", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "ndk" 1533 | version = "0.5.0" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "96d868f654c72e75f8687572699cdabe755f03effbb62542768e995d5b8d699d" 1536 | dependencies = [ 1537 | "bitflags", 1538 | "jni-sys", 1539 | "ndk-sys", 1540 | "num_enum", 1541 | "thiserror", 1542 | ] 1543 | 1544 | [[package]] 1545 | name = "ndk-glue" 1546 | version = "0.5.0" 1547 | source = "registry+https://github.com/rust-lang/crates.io-index" 1548 | checksum = "fc291b8de2095cba8dab7cf381bf582ff4c17a09acf854c32e46545b08085d28" 1549 | dependencies = [ 1550 | "lazy_static", 1551 | "libc", 1552 | "log", 1553 | "ndk", 1554 | "ndk-macro", 1555 | "ndk-sys", 1556 | ] 1557 | 1558 | [[package]] 1559 | name = "ndk-macro" 1560 | version = "0.3.0" 1561 | source = "registry+https://github.com/rust-lang/crates.io-index" 1562 | checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" 1563 | dependencies = [ 1564 | "darling", 1565 | "proc-macro-crate", 1566 | "proc-macro2", 1567 | "quote", 1568 | "syn", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "ndk-sys" 1573 | version = "0.2.2" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" 1576 | 1577 | [[package]] 1578 | name = "net2" 1579 | version = "0.2.37" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" 1582 | dependencies = [ 1583 | "cfg-if 0.1.10", 1584 | "libc", 1585 | "winapi 0.3.9", 1586 | ] 1587 | 1588 | [[package]] 1589 | name = "new_debug_unreachable" 1590 | version = "1.0.4" 1591 | source = "registry+https://github.com/rust-lang/crates.io-index" 1592 | checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" 1593 | 1594 | [[package]] 1595 | name = "nix" 1596 | version = "0.22.0" 1597 | source = "registry+https://github.com/rust-lang/crates.io-index" 1598 | checksum = "cf1e25ee6b412c2a1e3fcb6a4499a5c1bfe7f43e014bdce9a6b6666e5aa2d187" 1599 | dependencies = [ 1600 | "bitflags", 1601 | "cc", 1602 | "cfg-if 1.0.0", 1603 | "libc", 1604 | "memoffset", 1605 | ] 1606 | 1607 | [[package]] 1608 | name = "nodrop" 1609 | version = "0.1.14" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 1612 | 1613 | [[package]] 1614 | name = "nohash-hasher" 1615 | version = "0.2.0" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 1618 | 1619 | [[package]] 1620 | name = "nom" 1621 | version = "7.1.0" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" 1624 | dependencies = [ 1625 | "memchr", 1626 | "minimal-lexical", 1627 | "version_check", 1628 | ] 1629 | 1630 | [[package]] 1631 | name = "ntapi" 1632 | version = "0.3.6" 1633 | source = "registry+https://github.com/rust-lang/crates.io-index" 1634 | checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" 1635 | dependencies = [ 1636 | "winapi 0.3.9", 1637 | ] 1638 | 1639 | [[package]] 1640 | name = "num-integer" 1641 | version = "0.1.44" 1642 | source = "registry+https://github.com/rust-lang/crates.io-index" 1643 | checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" 1644 | dependencies = [ 1645 | "autocfg", 1646 | "num-traits", 1647 | ] 1648 | 1649 | [[package]] 1650 | name = "num-iter" 1651 | version = "0.1.42" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" 1654 | dependencies = [ 1655 | "autocfg", 1656 | "num-integer", 1657 | "num-traits", 1658 | ] 1659 | 1660 | [[package]] 1661 | name = "num-rational" 1662 | version = "0.3.2" 1663 | source = "registry+https://github.com/rust-lang/crates.io-index" 1664 | checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" 1665 | dependencies = [ 1666 | "autocfg", 1667 | "num-integer", 1668 | "num-traits", 1669 | ] 1670 | 1671 | [[package]] 1672 | name = "num-traits" 1673 | version = "0.2.14" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 1676 | dependencies = [ 1677 | "autocfg", 1678 | ] 1679 | 1680 | [[package]] 1681 | name = "num_cpus" 1682 | version = "1.13.1" 1683 | source = "registry+https://github.com/rust-lang/crates.io-index" 1684 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1685 | dependencies = [ 1686 | "hermit-abi", 1687 | "libc", 1688 | ] 1689 | 1690 | [[package]] 1691 | name = "num_enum" 1692 | version = "0.5.5" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "085fe377a4b2805c0fbc09484415ec261174614b7f080b0e0d520456ac421a67" 1695 | dependencies = [ 1696 | "derivative", 1697 | "num_enum_derive", 1698 | ] 1699 | 1700 | [[package]] 1701 | name = "num_enum_derive" 1702 | version = "0.5.5" 1703 | source = "registry+https://github.com/rust-lang/crates.io-index" 1704 | checksum = "5249369707a1e07b39f78d98c8f34e00aca7dcb053812fdbb5ad7be82c1bba38" 1705 | dependencies = [ 1706 | "proc-macro-crate", 1707 | "proc-macro2", 1708 | "quote", 1709 | "syn", 1710 | ] 1711 | 1712 | [[package]] 1713 | name = "objc" 1714 | version = "0.2.7" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1717 | dependencies = [ 1718 | "malloc_buf", 1719 | ] 1720 | 1721 | [[package]] 1722 | name = "objc-foundation" 1723 | version = "0.1.1" 1724 | source = "registry+https://github.com/rust-lang/crates.io-index" 1725 | checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" 1726 | dependencies = [ 1727 | "block", 1728 | "objc", 1729 | "objc_id", 1730 | ] 1731 | 1732 | [[package]] 1733 | name = "objc_id" 1734 | version = "0.1.1" 1735 | source = "registry+https://github.com/rust-lang/crates.io-index" 1736 | checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" 1737 | dependencies = [ 1738 | "objc", 1739 | ] 1740 | 1741 | [[package]] 1742 | name = "object" 1743 | version = "0.27.1" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" 1746 | dependencies = [ 1747 | "memchr", 1748 | ] 1749 | 1750 | [[package]] 1751 | name = "once_cell" 1752 | version = "1.9.0" 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" 1754 | checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" 1755 | 1756 | [[package]] 1757 | name = "openssl" 1758 | version = "0.10.38" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" 1761 | dependencies = [ 1762 | "bitflags", 1763 | "cfg-if 1.0.0", 1764 | "foreign-types", 1765 | "libc", 1766 | "once_cell", 1767 | "openssl-sys", 1768 | ] 1769 | 1770 | [[package]] 1771 | name = "openssl-probe" 1772 | version = "0.1.5" 1773 | source = "registry+https://github.com/rust-lang/crates.io-index" 1774 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1775 | 1776 | [[package]] 1777 | name = "openssl-sys" 1778 | version = "0.9.72" 1779 | source = "registry+https://github.com/rust-lang/crates.io-index" 1780 | checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" 1781 | dependencies = [ 1782 | "autocfg", 1783 | "cc", 1784 | "libc", 1785 | "pkg-config", 1786 | "vcpkg", 1787 | ] 1788 | 1789 | [[package]] 1790 | name = "osmesa-sys" 1791 | version = "0.1.2" 1792 | source = "registry+https://github.com/rust-lang/crates.io-index" 1793 | checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" 1794 | dependencies = [ 1795 | "shared_library", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "owned_ttf_parser" 1800 | version = "0.13.2" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "65ee3f72636e6f164cc41c9f9057f4e58c4e13507699ea7f5e5242b64b8198ee" 1803 | dependencies = [ 1804 | "ttf-parser", 1805 | ] 1806 | 1807 | [[package]] 1808 | name = "parking_lot" 1809 | version = "0.11.2" 1810 | source = "registry+https://github.com/rust-lang/crates.io-index" 1811 | checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" 1812 | dependencies = [ 1813 | "instant", 1814 | "lock_api", 1815 | "parking_lot_core", 1816 | ] 1817 | 1818 | [[package]] 1819 | name = "parking_lot_core" 1820 | version = "0.8.5" 1821 | source = "registry+https://github.com/rust-lang/crates.io-index" 1822 | checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" 1823 | dependencies = [ 1824 | "cfg-if 1.0.0", 1825 | "instant", 1826 | "libc", 1827 | "redox_syscall", 1828 | "smallvec", 1829 | "winapi 0.3.9", 1830 | ] 1831 | 1832 | [[package]] 1833 | name = "percent-encoding" 1834 | version = "2.1.0" 1835 | source = "registry+https://github.com/rust-lang/crates.io-index" 1836 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1837 | 1838 | [[package]] 1839 | name = "phf" 1840 | version = "0.8.0" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" 1843 | dependencies = [ 1844 | "phf_macros", 1845 | "phf_shared", 1846 | "proc-macro-hack", 1847 | ] 1848 | 1849 | [[package]] 1850 | name = "phf_codegen" 1851 | version = "0.8.0" 1852 | source = "registry+https://github.com/rust-lang/crates.io-index" 1853 | checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" 1854 | dependencies = [ 1855 | "phf_generator", 1856 | "phf_shared", 1857 | ] 1858 | 1859 | [[package]] 1860 | name = "phf_generator" 1861 | version = "0.8.0" 1862 | source = "registry+https://github.com/rust-lang/crates.io-index" 1863 | checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" 1864 | dependencies = [ 1865 | "phf_shared", 1866 | "rand", 1867 | ] 1868 | 1869 | [[package]] 1870 | name = "phf_macros" 1871 | version = "0.8.0" 1872 | source = "registry+https://github.com/rust-lang/crates.io-index" 1873 | checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" 1874 | dependencies = [ 1875 | "phf_generator", 1876 | "phf_shared", 1877 | "proc-macro-hack", 1878 | "proc-macro2", 1879 | "quote", 1880 | "syn", 1881 | ] 1882 | 1883 | [[package]] 1884 | name = "phf_shared" 1885 | version = "0.8.0" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" 1888 | dependencies = [ 1889 | "siphasher", 1890 | ] 1891 | 1892 | [[package]] 1893 | name = "pin-project" 1894 | version = "1.0.10" 1895 | source = "registry+https://github.com/rust-lang/crates.io-index" 1896 | checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" 1897 | dependencies = [ 1898 | "pin-project-internal", 1899 | ] 1900 | 1901 | [[package]] 1902 | name = "pin-project-internal" 1903 | version = "1.0.10" 1904 | source = "registry+https://github.com/rust-lang/crates.io-index" 1905 | checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" 1906 | dependencies = [ 1907 | "proc-macro2", 1908 | "quote", 1909 | "syn", 1910 | ] 1911 | 1912 | [[package]] 1913 | name = "pin-project-lite" 1914 | version = "0.1.12" 1915 | source = "registry+https://github.com/rust-lang/crates.io-index" 1916 | checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" 1917 | 1918 | [[package]] 1919 | name = "pin-project-lite" 1920 | version = "0.2.8" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" 1923 | 1924 | [[package]] 1925 | name = "pin-utils" 1926 | version = "0.1.0" 1927 | source = "registry+https://github.com/rust-lang/crates.io-index" 1928 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1929 | 1930 | [[package]] 1931 | name = "pkg-config" 1932 | version = "0.3.24" 1933 | source = "registry+https://github.com/rust-lang/crates.io-index" 1934 | checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" 1935 | 1936 | [[package]] 1937 | name = "png" 1938 | version = "0.16.8" 1939 | source = "registry+https://github.com/rust-lang/crates.io-index" 1940 | checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" 1941 | dependencies = [ 1942 | "bitflags", 1943 | "crc32fast", 1944 | "deflate", 1945 | "miniz_oxide 0.3.7", 1946 | ] 1947 | 1948 | [[package]] 1949 | name = "ppv-lite86" 1950 | version = "0.2.16" 1951 | source = "registry+https://github.com/rust-lang/crates.io-index" 1952 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 1953 | 1954 | [[package]] 1955 | name = "precomputed-hash" 1956 | version = "0.1.1" 1957 | source = "registry+https://github.com/rust-lang/crates.io-index" 1958 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 1959 | 1960 | [[package]] 1961 | name = "proc-macro-crate" 1962 | version = "1.1.0" 1963 | source = "registry+https://github.com/rust-lang/crates.io-index" 1964 | checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" 1965 | dependencies = [ 1966 | "thiserror", 1967 | "toml", 1968 | ] 1969 | 1970 | [[package]] 1971 | name = "proc-macro-hack" 1972 | version = "0.5.19" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" 1975 | 1976 | [[package]] 1977 | name = "proc-macro2" 1978 | version = "1.0.36" 1979 | source = "registry+https://github.com/rust-lang/crates.io-index" 1980 | checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" 1981 | dependencies = [ 1982 | "unicode-xid", 1983 | ] 1984 | 1985 | [[package]] 1986 | name = "publicsuffix" 1987 | version = "1.5.6" 1988 | source = "registry+https://github.com/rust-lang/crates.io-index" 1989 | checksum = "95b4ce31ff0a27d93c8de1849cf58162283752f065a90d508f1105fa6c9a213f" 1990 | dependencies = [ 1991 | "idna", 1992 | "url", 1993 | ] 1994 | 1995 | [[package]] 1996 | name = "quick-error" 1997 | version = "1.2.3" 1998 | source = "registry+https://github.com/rust-lang/crates.io-index" 1999 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 2000 | 2001 | [[package]] 2002 | name = "quick-xml" 2003 | version = "0.22.0" 2004 | source = "registry+https://github.com/rust-lang/crates.io-index" 2005 | checksum = "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b" 2006 | dependencies = [ 2007 | "memchr", 2008 | ] 2009 | 2010 | [[package]] 2011 | name = "quote" 2012 | version = "1.0.14" 2013 | source = "registry+https://github.com/rust-lang/crates.io-index" 2014 | checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" 2015 | dependencies = [ 2016 | "proc-macro2", 2017 | ] 2018 | 2019 | [[package]] 2020 | name = "rand" 2021 | version = "0.7.3" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 2024 | dependencies = [ 2025 | "getrandom 0.1.16", 2026 | "libc", 2027 | "rand_chacha", 2028 | "rand_core", 2029 | "rand_hc", 2030 | "rand_pcg", 2031 | ] 2032 | 2033 | [[package]] 2034 | name = "rand_chacha" 2035 | version = "0.2.2" 2036 | source = "registry+https://github.com/rust-lang/crates.io-index" 2037 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 2038 | dependencies = [ 2039 | "ppv-lite86", 2040 | "rand_core", 2041 | ] 2042 | 2043 | [[package]] 2044 | name = "rand_core" 2045 | version = "0.5.1" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 2048 | dependencies = [ 2049 | "getrandom 0.1.16", 2050 | ] 2051 | 2052 | [[package]] 2053 | name = "rand_hc" 2054 | version = "0.2.0" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 2057 | dependencies = [ 2058 | "rand_core", 2059 | ] 2060 | 2061 | [[package]] 2062 | name = "rand_pcg" 2063 | version = "0.2.1" 2064 | source = "registry+https://github.com/rust-lang/crates.io-index" 2065 | checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" 2066 | dependencies = [ 2067 | "rand_core", 2068 | ] 2069 | 2070 | [[package]] 2071 | name = "raw-window-handle" 2072 | version = "0.4.2" 2073 | source = "registry+https://github.com/rust-lang/crates.io-index" 2074 | checksum = "fba75eee94a9d5273a68c9e1e105d9cffe1ef700532325788389e5a83e2522b7" 2075 | dependencies = [ 2076 | "cty", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "rayon" 2081 | version = "1.5.1" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" 2084 | dependencies = [ 2085 | "autocfg", 2086 | "crossbeam-deque", 2087 | "either", 2088 | "rayon-core", 2089 | ] 2090 | 2091 | [[package]] 2092 | name = "rayon-core" 2093 | version = "1.9.1" 2094 | source = "registry+https://github.com/rust-lang/crates.io-index" 2095 | checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" 2096 | dependencies = [ 2097 | "crossbeam-channel", 2098 | "crossbeam-deque", 2099 | "crossbeam-utils", 2100 | "lazy_static", 2101 | "num_cpus", 2102 | ] 2103 | 2104 | [[package]] 2105 | name = "redox_syscall" 2106 | version = "0.2.10" 2107 | source = "registry+https://github.com/rust-lang/crates.io-index" 2108 | checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" 2109 | dependencies = [ 2110 | "bitflags", 2111 | ] 2112 | 2113 | [[package]] 2114 | name = "redox_users" 2115 | version = "0.4.0" 2116 | source = "registry+https://github.com/rust-lang/crates.io-index" 2117 | checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" 2118 | dependencies = [ 2119 | "getrandom 0.2.3", 2120 | "redox_syscall", 2121 | ] 2122 | 2123 | [[package]] 2124 | name = "regex" 2125 | version = "1.5.4" 2126 | source = "registry+https://github.com/rust-lang/crates.io-index" 2127 | checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" 2128 | dependencies = [ 2129 | "aho-corasick", 2130 | "memchr", 2131 | "regex-syntax", 2132 | ] 2133 | 2134 | [[package]] 2135 | name = "regex-syntax" 2136 | version = "0.6.25" 2137 | source = "registry+https://github.com/rust-lang/crates.io-index" 2138 | checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" 2139 | 2140 | [[package]] 2141 | name = "remove_dir_all" 2142 | version = "0.5.3" 2143 | source = "registry+https://github.com/rust-lang/crates.io-index" 2144 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 2145 | dependencies = [ 2146 | "winapi 0.3.9", 2147 | ] 2148 | 2149 | [[package]] 2150 | name = "reqwest" 2151 | version = "0.10.10" 2152 | source = "registry+https://github.com/rust-lang/crates.io-index" 2153 | checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" 2154 | dependencies = [ 2155 | "base64", 2156 | "bytes 0.5.6", 2157 | "cookie", 2158 | "cookie_store", 2159 | "encoding_rs", 2160 | "futures-core", 2161 | "futures-util", 2162 | "http", 2163 | "http-body", 2164 | "hyper", 2165 | "hyper-tls", 2166 | "ipnet", 2167 | "js-sys", 2168 | "lazy_static", 2169 | "log", 2170 | "mime", 2171 | "mime_guess", 2172 | "native-tls", 2173 | "percent-encoding", 2174 | "pin-project-lite 0.2.8", 2175 | "serde", 2176 | "serde_json", 2177 | "serde_urlencoded", 2178 | "time", 2179 | "tokio", 2180 | "tokio-tls", 2181 | "url", 2182 | "wasm-bindgen", 2183 | "wasm-bindgen-futures", 2184 | "web-sys", 2185 | "winreg", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "ron" 2190 | version = "0.7.0" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "1b861ecaade43ac97886a512b360d01d66be9f41f3c61088b42cedf92e03d678" 2193 | dependencies = [ 2194 | "base64", 2195 | "bitflags", 2196 | "serde", 2197 | ] 2198 | 2199 | [[package]] 2200 | name = "rustc-demangle" 2201 | version = "0.1.21" 2202 | source = "registry+https://github.com/rust-lang/crates.io-index" 2203 | checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" 2204 | 2205 | [[package]] 2206 | name = "rustc_version" 2207 | version = "0.2.3" 2208 | source = "registry+https://github.com/rust-lang/crates.io-index" 2209 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 2210 | dependencies = [ 2211 | "semver 0.9.0", 2212 | ] 2213 | 2214 | [[package]] 2215 | name = "rustc_version" 2216 | version = "0.4.0" 2217 | source = "registry+https://github.com/rust-lang/crates.io-index" 2218 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2219 | dependencies = [ 2220 | "semver 1.0.4", 2221 | ] 2222 | 2223 | [[package]] 2224 | name = "rustversion" 2225 | version = "1.0.6" 2226 | source = "registry+https://github.com/rust-lang/crates.io-index" 2227 | checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" 2228 | 2229 | [[package]] 2230 | name = "ryu" 2231 | version = "1.0.9" 2232 | source = "registry+https://github.com/rust-lang/crates.io-index" 2233 | checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" 2234 | 2235 | [[package]] 2236 | name = "schannel" 2237 | version = "0.1.19" 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" 2239 | checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" 2240 | dependencies = [ 2241 | "lazy_static", 2242 | "winapi 0.3.9", 2243 | ] 2244 | 2245 | [[package]] 2246 | name = "scoped-tls" 2247 | version = "1.0.0" 2248 | source = "registry+https://github.com/rust-lang/crates.io-index" 2249 | checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" 2250 | 2251 | [[package]] 2252 | name = "scoped_threadpool" 2253 | version = "0.1.9" 2254 | source = "registry+https://github.com/rust-lang/crates.io-index" 2255 | checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" 2256 | 2257 | [[package]] 2258 | name = "scopeguard" 2259 | version = "1.1.0" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2262 | 2263 | [[package]] 2264 | name = "scraper" 2265 | version = "0.12.0" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "48e02aa790c80c2e494130dec6a522033b6a23603ffc06360e9fe6c611ea2c12" 2268 | dependencies = [ 2269 | "cssparser", 2270 | "ego-tree", 2271 | "getopts", 2272 | "html5ever", 2273 | "matches", 2274 | "selectors", 2275 | "smallvec", 2276 | "tendril", 2277 | ] 2278 | 2279 | [[package]] 2280 | name = "security-framework" 2281 | version = "2.4.2" 2282 | source = "registry+https://github.com/rust-lang/crates.io-index" 2283 | checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" 2284 | dependencies = [ 2285 | "bitflags", 2286 | "core-foundation 0.9.2", 2287 | "core-foundation-sys 0.8.3", 2288 | "libc", 2289 | "security-framework-sys", 2290 | ] 2291 | 2292 | [[package]] 2293 | name = "security-framework-sys" 2294 | version = "2.4.2" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" 2297 | dependencies = [ 2298 | "core-foundation-sys 0.8.3", 2299 | "libc", 2300 | ] 2301 | 2302 | [[package]] 2303 | name = "selectors" 2304 | version = "0.22.0" 2305 | source = "registry+https://github.com/rust-lang/crates.io-index" 2306 | checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" 2307 | dependencies = [ 2308 | "bitflags", 2309 | "cssparser", 2310 | "derive_more", 2311 | "fxhash", 2312 | "log", 2313 | "matches", 2314 | "phf", 2315 | "phf_codegen", 2316 | "precomputed-hash", 2317 | "servo_arc", 2318 | "smallvec", 2319 | "thin-slice", 2320 | ] 2321 | 2322 | [[package]] 2323 | name = "semver" 2324 | version = "0.9.0" 2325 | source = "registry+https://github.com/rust-lang/crates.io-index" 2326 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 2327 | dependencies = [ 2328 | "semver-parser", 2329 | ] 2330 | 2331 | [[package]] 2332 | name = "semver" 2333 | version = "1.0.4" 2334 | source = "registry+https://github.com/rust-lang/crates.io-index" 2335 | checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" 2336 | 2337 | [[package]] 2338 | name = "semver-parser" 2339 | version = "0.7.0" 2340 | source = "registry+https://github.com/rust-lang/crates.io-index" 2341 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 2342 | 2343 | [[package]] 2344 | name = "serde" 2345 | version = "1.0.132" 2346 | source = "registry+https://github.com/rust-lang/crates.io-index" 2347 | checksum = "8b9875c23cf305cd1fd7eb77234cbb705f21ea6a72c637a5c6db5fe4b8e7f008" 2348 | dependencies = [ 2349 | "serde_derive", 2350 | ] 2351 | 2352 | [[package]] 2353 | name = "serde_derive" 2354 | version = "1.0.132" 2355 | source = "registry+https://github.com/rust-lang/crates.io-index" 2356 | checksum = "ecc0db5cb2556c0e558887d9bbdcf6ac4471e83ff66cf696e5419024d1606276" 2357 | dependencies = [ 2358 | "proc-macro2", 2359 | "quote", 2360 | "syn", 2361 | ] 2362 | 2363 | [[package]] 2364 | name = "serde_json" 2365 | version = "1.0.74" 2366 | source = "registry+https://github.com/rust-lang/crates.io-index" 2367 | checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142" 2368 | dependencies = [ 2369 | "itoa 1.0.1", 2370 | "ryu", 2371 | "serde", 2372 | ] 2373 | 2374 | [[package]] 2375 | name = "serde_urlencoded" 2376 | version = "0.7.0" 2377 | source = "registry+https://github.com/rust-lang/crates.io-index" 2378 | checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" 2379 | dependencies = [ 2380 | "form_urlencoded", 2381 | "itoa 0.4.8", 2382 | "ryu", 2383 | "serde", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "serde_with" 2388 | version = "1.11.0" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "ad6056b4cb69b6e43e3a0f055def223380baecc99da683884f205bf347f7c4b3" 2391 | dependencies = [ 2392 | "rustversion", 2393 | "serde", 2394 | "serde_with_macros", 2395 | ] 2396 | 2397 | [[package]] 2398 | name = "serde_with_macros" 2399 | version = "1.5.1" 2400 | source = "registry+https://github.com/rust-lang/crates.io-index" 2401 | checksum = "12e47be9471c72889ebafb5e14d5ff930d89ae7a67bbdb5f8abb564f845a927e" 2402 | dependencies = [ 2403 | "darling", 2404 | "proc-macro2", 2405 | "quote", 2406 | "syn", 2407 | ] 2408 | 2409 | [[package]] 2410 | name = "servo_arc" 2411 | version = "0.1.1" 2412 | source = "registry+https://github.com/rust-lang/crates.io-index" 2413 | checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" 2414 | dependencies = [ 2415 | "nodrop", 2416 | "stable_deref_trait", 2417 | ] 2418 | 2419 | [[package]] 2420 | name = "sha1" 2421 | version = "0.6.0" 2422 | source = "registry+https://github.com/rust-lang/crates.io-index" 2423 | checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" 2424 | 2425 | [[package]] 2426 | name = "shared_library" 2427 | version = "0.1.9" 2428 | source = "registry+https://github.com/rust-lang/crates.io-index" 2429 | checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" 2430 | dependencies = [ 2431 | "lazy_static", 2432 | "libc", 2433 | ] 2434 | 2435 | [[package]] 2436 | name = "siphasher" 2437 | version = "0.3.7" 2438 | source = "registry+https://github.com/rust-lang/crates.io-index" 2439 | checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" 2440 | 2441 | [[package]] 2442 | name = "slab" 2443 | version = "0.4.5" 2444 | source = "registry+https://github.com/rust-lang/crates.io-index" 2445 | checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" 2446 | 2447 | [[package]] 2448 | name = "smallvec" 2449 | version = "1.7.0" 2450 | source = "registry+https://github.com/rust-lang/crates.io-index" 2451 | checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" 2452 | 2453 | [[package]] 2454 | name = "smithay-client-toolkit" 2455 | version = "0.15.3" 2456 | source = "registry+https://github.com/rust-lang/crates.io-index" 2457 | checksum = "1325f292209cee78d5035530932422a30aa4c8fda1a16593ac083c1de211e68a" 2458 | dependencies = [ 2459 | "bitflags", 2460 | "calloop", 2461 | "dlib", 2462 | "lazy_static", 2463 | "log", 2464 | "memmap2", 2465 | "nix", 2466 | "pkg-config", 2467 | "wayland-client", 2468 | "wayland-cursor", 2469 | "wayland-protocols", 2470 | ] 2471 | 2472 | [[package]] 2473 | name = "smithay-clipboard" 2474 | version = "0.6.5" 2475 | source = "registry+https://github.com/rust-lang/crates.io-index" 2476 | checksum = "610b551bd25378bfd2b8e7a0fcbd83d427e8f2f6a40c47ae0f70688e9949dd55" 2477 | dependencies = [ 2478 | "smithay-client-toolkit", 2479 | "wayland-client", 2480 | ] 2481 | 2482 | [[package]] 2483 | name = "socket2" 2484 | version = "0.3.19" 2485 | source = "registry+https://github.com/rust-lang/crates.io-index" 2486 | checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" 2487 | dependencies = [ 2488 | "cfg-if 1.0.0", 2489 | "libc", 2490 | "winapi 0.3.9", 2491 | ] 2492 | 2493 | [[package]] 2494 | name = "stable_deref_trait" 2495 | version = "1.2.0" 2496 | source = "registry+https://github.com/rust-lang/crates.io-index" 2497 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2498 | 2499 | [[package]] 2500 | name = "standback" 2501 | version = "0.2.17" 2502 | source = "registry+https://github.com/rust-lang/crates.io-index" 2503 | checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" 2504 | dependencies = [ 2505 | "version_check", 2506 | ] 2507 | 2508 | [[package]] 2509 | name = "stdweb" 2510 | version = "0.4.20" 2511 | source = "registry+https://github.com/rust-lang/crates.io-index" 2512 | checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" 2513 | dependencies = [ 2514 | "discard", 2515 | "rustc_version 0.2.3", 2516 | "stdweb-derive", 2517 | "stdweb-internal-macros", 2518 | "stdweb-internal-runtime", 2519 | "wasm-bindgen", 2520 | ] 2521 | 2522 | [[package]] 2523 | name = "stdweb-derive" 2524 | version = "0.5.3" 2525 | source = "registry+https://github.com/rust-lang/crates.io-index" 2526 | checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" 2527 | dependencies = [ 2528 | "proc-macro2", 2529 | "quote", 2530 | "serde", 2531 | "serde_derive", 2532 | "syn", 2533 | ] 2534 | 2535 | [[package]] 2536 | name = "stdweb-internal-macros" 2537 | version = "0.2.9" 2538 | source = "registry+https://github.com/rust-lang/crates.io-index" 2539 | checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" 2540 | dependencies = [ 2541 | "base-x", 2542 | "proc-macro2", 2543 | "quote", 2544 | "serde", 2545 | "serde_derive", 2546 | "serde_json", 2547 | "sha1", 2548 | "syn", 2549 | ] 2550 | 2551 | [[package]] 2552 | name = "stdweb-internal-runtime" 2553 | version = "0.1.5" 2554 | source = "registry+https://github.com/rust-lang/crates.io-index" 2555 | checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" 2556 | 2557 | [[package]] 2558 | name = "string_cache" 2559 | version = "0.8.2" 2560 | source = "registry+https://github.com/rust-lang/crates.io-index" 2561 | checksum = "923f0f39b6267d37d23ce71ae7235602134b250ace715dd2c90421998ddac0c6" 2562 | dependencies = [ 2563 | "lazy_static", 2564 | "new_debug_unreachable", 2565 | "parking_lot", 2566 | "phf_shared", 2567 | "precomputed-hash", 2568 | "serde", 2569 | ] 2570 | 2571 | [[package]] 2572 | name = "string_cache_codegen" 2573 | version = "0.5.1" 2574 | source = "registry+https://github.com/rust-lang/crates.io-index" 2575 | checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" 2576 | dependencies = [ 2577 | "phf_generator", 2578 | "phf_shared", 2579 | "proc-macro2", 2580 | "quote", 2581 | ] 2582 | 2583 | [[package]] 2584 | name = "strsim" 2585 | version = "0.8.0" 2586 | source = "registry+https://github.com/rust-lang/crates.io-index" 2587 | checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 2588 | 2589 | [[package]] 2590 | name = "strsim" 2591 | version = "0.10.0" 2592 | source = "registry+https://github.com/rust-lang/crates.io-index" 2593 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2594 | 2595 | [[package]] 2596 | name = "syn" 2597 | version = "1.0.84" 2598 | source = "registry+https://github.com/rust-lang/crates.io-index" 2599 | checksum = "ecb2e6da8ee5eb9a61068762a32fa9619cc591ceb055b3687f4cd4051ec2e06b" 2600 | dependencies = [ 2601 | "proc-macro2", 2602 | "quote", 2603 | "unicode-xid", 2604 | ] 2605 | 2606 | [[package]] 2607 | name = "takeable-option" 2608 | version = "0.5.0" 2609 | source = "registry+https://github.com/rust-lang/crates.io-index" 2610 | checksum = "36ae8932fcfea38b7d3883ae2ab357b0d57a02caaa18ebb4f5ece08beaec4aa0" 2611 | 2612 | [[package]] 2613 | name = "tempfile" 2614 | version = "3.3.0" 2615 | source = "registry+https://github.com/rust-lang/crates.io-index" 2616 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 2617 | dependencies = [ 2618 | "cfg-if 1.0.0", 2619 | "fastrand", 2620 | "libc", 2621 | "redox_syscall", 2622 | "remove_dir_all", 2623 | "winapi 0.3.9", 2624 | ] 2625 | 2626 | [[package]] 2627 | name = "tendril" 2628 | version = "0.4.2" 2629 | source = "registry+https://github.com/rust-lang/crates.io-index" 2630 | checksum = "a9ef557cb397a4f0a5a3a628f06515f78563f2209e64d47055d9dc6052bf5e33" 2631 | dependencies = [ 2632 | "futf", 2633 | "mac", 2634 | "utf-8", 2635 | ] 2636 | 2637 | [[package]] 2638 | name = "termcolor" 2639 | version = "1.1.2" 2640 | source = "registry+https://github.com/rust-lang/crates.io-index" 2641 | checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" 2642 | dependencies = [ 2643 | "winapi-util", 2644 | ] 2645 | 2646 | [[package]] 2647 | name = "textwrap" 2648 | version = "0.11.0" 2649 | source = "registry+https://github.com/rust-lang/crates.io-index" 2650 | checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 2651 | dependencies = [ 2652 | "unicode-width", 2653 | ] 2654 | 2655 | [[package]] 2656 | name = "thin-slice" 2657 | version = "0.1.1" 2658 | source = "registry+https://github.com/rust-lang/crates.io-index" 2659 | checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" 2660 | 2661 | [[package]] 2662 | name = "thiserror" 2663 | version = "1.0.30" 2664 | source = "registry+https://github.com/rust-lang/crates.io-index" 2665 | checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" 2666 | dependencies = [ 2667 | "thiserror-impl", 2668 | ] 2669 | 2670 | [[package]] 2671 | name = "thiserror-impl" 2672 | version = "1.0.30" 2673 | source = "registry+https://github.com/rust-lang/crates.io-index" 2674 | checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" 2675 | dependencies = [ 2676 | "proc-macro2", 2677 | "quote", 2678 | "syn", 2679 | ] 2680 | 2681 | [[package]] 2682 | name = "tiff" 2683 | version = "0.6.1" 2684 | source = "registry+https://github.com/rust-lang/crates.io-index" 2685 | checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" 2686 | dependencies = [ 2687 | "jpeg-decoder", 2688 | "miniz_oxide 0.4.4", 2689 | "weezl", 2690 | ] 2691 | 2692 | [[package]] 2693 | name = "time" 2694 | version = "0.2.27" 2695 | source = "registry+https://github.com/rust-lang/crates.io-index" 2696 | checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" 2697 | dependencies = [ 2698 | "const_fn", 2699 | "libc", 2700 | "standback", 2701 | "stdweb", 2702 | "time-macros", 2703 | "version_check", 2704 | "winapi 0.3.9", 2705 | ] 2706 | 2707 | [[package]] 2708 | name = "time-humanize" 2709 | version = "0.1.3" 2710 | source = "registry+https://github.com/rust-lang/crates.io-index" 2711 | checksum = "3e32d019b4f7c100bcd5494e40a27119d45b71fba2b07a4684153129279a4647" 2712 | 2713 | [[package]] 2714 | name = "time-macros" 2715 | version = "0.1.1" 2716 | source = "registry+https://github.com/rust-lang/crates.io-index" 2717 | checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" 2718 | dependencies = [ 2719 | "proc-macro-hack", 2720 | "time-macros-impl", 2721 | ] 2722 | 2723 | [[package]] 2724 | name = "time-macros-impl" 2725 | version = "0.1.2" 2726 | source = "registry+https://github.com/rust-lang/crates.io-index" 2727 | checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" 2728 | dependencies = [ 2729 | "proc-macro-hack", 2730 | "proc-macro2", 2731 | "quote", 2732 | "standback", 2733 | "syn", 2734 | ] 2735 | 2736 | [[package]] 2737 | name = "tinyvec" 2738 | version = "1.5.1" 2739 | source = "registry+https://github.com/rust-lang/crates.io-index" 2740 | checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" 2741 | dependencies = [ 2742 | "tinyvec_macros", 2743 | ] 2744 | 2745 | [[package]] 2746 | name = "tinyvec_macros" 2747 | version = "0.1.0" 2748 | source = "registry+https://github.com/rust-lang/crates.io-index" 2749 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 2750 | 2751 | [[package]] 2752 | name = "tokio" 2753 | version = "0.2.25" 2754 | source = "registry+https://github.com/rust-lang/crates.io-index" 2755 | checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" 2756 | dependencies = [ 2757 | "bytes 0.5.6", 2758 | "fnv", 2759 | "futures-core", 2760 | "iovec", 2761 | "lazy_static", 2762 | "memchr", 2763 | "mio 0.6.23", 2764 | "num_cpus", 2765 | "pin-project-lite 0.1.12", 2766 | "slab", 2767 | ] 2768 | 2769 | [[package]] 2770 | name = "tokio-tls" 2771 | version = "0.3.1" 2772 | source = "registry+https://github.com/rust-lang/crates.io-index" 2773 | checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" 2774 | dependencies = [ 2775 | "native-tls", 2776 | "tokio", 2777 | ] 2778 | 2779 | [[package]] 2780 | name = "tokio-util" 2781 | version = "0.3.1" 2782 | source = "registry+https://github.com/rust-lang/crates.io-index" 2783 | checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" 2784 | dependencies = [ 2785 | "bytes 0.5.6", 2786 | "futures-core", 2787 | "futures-sink", 2788 | "log", 2789 | "pin-project-lite 0.1.12", 2790 | "tokio", 2791 | ] 2792 | 2793 | [[package]] 2794 | name = "toml" 2795 | version = "0.5.8" 2796 | source = "registry+https://github.com/rust-lang/crates.io-index" 2797 | checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" 2798 | dependencies = [ 2799 | "serde", 2800 | ] 2801 | 2802 | [[package]] 2803 | name = "tower-service" 2804 | version = "0.3.1" 2805 | source = "registry+https://github.com/rust-lang/crates.io-index" 2806 | checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" 2807 | 2808 | [[package]] 2809 | name = "tracing" 2810 | version = "0.1.29" 2811 | source = "registry+https://github.com/rust-lang/crates.io-index" 2812 | checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" 2813 | dependencies = [ 2814 | "cfg-if 1.0.0", 2815 | "log", 2816 | "pin-project-lite 0.2.8", 2817 | "tracing-core", 2818 | ] 2819 | 2820 | [[package]] 2821 | name = "tracing-core" 2822 | version = "0.1.21" 2823 | source = "registry+https://github.com/rust-lang/crates.io-index" 2824 | checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" 2825 | dependencies = [ 2826 | "lazy_static", 2827 | ] 2828 | 2829 | [[package]] 2830 | name = "tracing-futures" 2831 | version = "0.2.5" 2832 | source = "registry+https://github.com/rust-lang/crates.io-index" 2833 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 2834 | dependencies = [ 2835 | "pin-project", 2836 | "tracing", 2837 | ] 2838 | 2839 | [[package]] 2840 | name = "try-lock" 2841 | version = "0.2.3" 2842 | source = "registry+https://github.com/rust-lang/crates.io-index" 2843 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 2844 | 2845 | [[package]] 2846 | name = "ttf-parser" 2847 | version = "0.13.4" 2848 | source = "registry+https://github.com/rust-lang/crates.io-index" 2849 | checksum = "76dacc724328b3d5e2ed67f9e30cdb56893a34ab239032502cc8f19f8dae4bbc" 2850 | 2851 | [[package]] 2852 | name = "unicase" 2853 | version = "2.6.0" 2854 | source = "registry+https://github.com/rust-lang/crates.io-index" 2855 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 2856 | dependencies = [ 2857 | "version_check", 2858 | ] 2859 | 2860 | [[package]] 2861 | name = "unicode-bidi" 2862 | version = "0.3.7" 2863 | source = "registry+https://github.com/rust-lang/crates.io-index" 2864 | checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" 2865 | 2866 | [[package]] 2867 | name = "unicode-normalization" 2868 | version = "0.1.19" 2869 | source = "registry+https://github.com/rust-lang/crates.io-index" 2870 | checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" 2871 | dependencies = [ 2872 | "tinyvec", 2873 | ] 2874 | 2875 | [[package]] 2876 | name = "unicode-width" 2877 | version = "0.1.9" 2878 | source = "registry+https://github.com/rust-lang/crates.io-index" 2879 | checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" 2880 | 2881 | [[package]] 2882 | name = "unicode-xid" 2883 | version = "0.2.2" 2884 | source = "registry+https://github.com/rust-lang/crates.io-index" 2885 | checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" 2886 | 2887 | [[package]] 2888 | name = "url" 2889 | version = "2.2.2" 2890 | source = "registry+https://github.com/rust-lang/crates.io-index" 2891 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 2892 | dependencies = [ 2893 | "form_urlencoded", 2894 | "idna", 2895 | "matches", 2896 | "percent-encoding", 2897 | ] 2898 | 2899 | [[package]] 2900 | name = "utf-8" 2901 | version = "0.7.6" 2902 | source = "registry+https://github.com/rust-lang/crates.io-index" 2903 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2904 | 2905 | [[package]] 2906 | name = "utf8-width" 2907 | version = "0.1.5" 2908 | source = "registry+https://github.com/rust-lang/crates.io-index" 2909 | checksum = "7cf7d77f457ef8dfa11e4cd5933c5ddb5dc52a94664071951219a97710f0a32b" 2910 | 2911 | [[package]] 2912 | name = "vcpkg" 2913 | version = "0.2.15" 2914 | source = "registry+https://github.com/rust-lang/crates.io-index" 2915 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2916 | 2917 | [[package]] 2918 | name = "vec_map" 2919 | version = "0.8.2" 2920 | source = "registry+https://github.com/rust-lang/crates.io-index" 2921 | checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 2922 | 2923 | [[package]] 2924 | name = "version_check" 2925 | version = "0.9.4" 2926 | source = "registry+https://github.com/rust-lang/crates.io-index" 2927 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2928 | 2929 | [[package]] 2930 | name = "want" 2931 | version = "0.3.0" 2932 | source = "registry+https://github.com/rust-lang/crates.io-index" 2933 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 2934 | dependencies = [ 2935 | "log", 2936 | "try-lock", 2937 | ] 2938 | 2939 | [[package]] 2940 | name = "wasi" 2941 | version = "0.9.0+wasi-snapshot-preview1" 2942 | source = "registry+https://github.com/rust-lang/crates.io-index" 2943 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 2944 | 2945 | [[package]] 2946 | name = "wasi" 2947 | version = "0.10.2+wasi-snapshot-preview1" 2948 | source = "registry+https://github.com/rust-lang/crates.io-index" 2949 | checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" 2950 | 2951 | [[package]] 2952 | name = "wasm-bindgen" 2953 | version = "0.2.78" 2954 | source = "registry+https://github.com/rust-lang/crates.io-index" 2955 | checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" 2956 | dependencies = [ 2957 | "cfg-if 1.0.0", 2958 | "serde", 2959 | "serde_json", 2960 | "wasm-bindgen-macro", 2961 | ] 2962 | 2963 | [[package]] 2964 | name = "wasm-bindgen-backend" 2965 | version = "0.2.78" 2966 | source = "registry+https://github.com/rust-lang/crates.io-index" 2967 | checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" 2968 | dependencies = [ 2969 | "bumpalo", 2970 | "lazy_static", 2971 | "log", 2972 | "proc-macro2", 2973 | "quote", 2974 | "syn", 2975 | "wasm-bindgen-shared", 2976 | ] 2977 | 2978 | [[package]] 2979 | name = "wasm-bindgen-futures" 2980 | version = "0.4.28" 2981 | source = "registry+https://github.com/rust-lang/crates.io-index" 2982 | checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" 2983 | dependencies = [ 2984 | "cfg-if 1.0.0", 2985 | "js-sys", 2986 | "wasm-bindgen", 2987 | "web-sys", 2988 | ] 2989 | 2990 | [[package]] 2991 | name = "wasm-bindgen-macro" 2992 | version = "0.2.78" 2993 | source = "registry+https://github.com/rust-lang/crates.io-index" 2994 | checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" 2995 | dependencies = [ 2996 | "quote", 2997 | "wasm-bindgen-macro-support", 2998 | ] 2999 | 3000 | [[package]] 3001 | name = "wasm-bindgen-macro-support" 3002 | version = "0.2.78" 3003 | source = "registry+https://github.com/rust-lang/crates.io-index" 3004 | checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" 3005 | dependencies = [ 3006 | "proc-macro2", 3007 | "quote", 3008 | "syn", 3009 | "wasm-bindgen-backend", 3010 | "wasm-bindgen-shared", 3011 | ] 3012 | 3013 | [[package]] 3014 | name = "wasm-bindgen-shared" 3015 | version = "0.2.78" 3016 | source = "registry+https://github.com/rust-lang/crates.io-index" 3017 | checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" 3018 | 3019 | [[package]] 3020 | name = "wayland-client" 3021 | version = "0.29.1" 3022 | source = "registry+https://github.com/rust-lang/crates.io-index" 3023 | checksum = "9108ec1c37f4774d0c2937ba1a6c23d1786b2152c4a13bd9fdb20e42d16e8841" 3024 | dependencies = [ 3025 | "bitflags", 3026 | "downcast-rs", 3027 | "libc", 3028 | "nix", 3029 | "scoped-tls", 3030 | "wayland-commons", 3031 | "wayland-scanner", 3032 | "wayland-sys", 3033 | ] 3034 | 3035 | [[package]] 3036 | name = "wayland-commons" 3037 | version = "0.29.1" 3038 | source = "registry+https://github.com/rust-lang/crates.io-index" 3039 | checksum = "265ef51b3b3e5c9ef098f10425c39624663f459c3821dcaacc4748be975f1beb" 3040 | dependencies = [ 3041 | "nix", 3042 | "once_cell", 3043 | "smallvec", 3044 | "wayland-sys", 3045 | ] 3046 | 3047 | [[package]] 3048 | name = "wayland-cursor" 3049 | version = "0.29.1" 3050 | source = "registry+https://github.com/rust-lang/crates.io-index" 3051 | checksum = "6c19bb6628daf4097e58b7911481e8371e13318d5a60894779901bd3267407a7" 3052 | dependencies = [ 3053 | "nix", 3054 | "wayland-client", 3055 | "xcursor", 3056 | ] 3057 | 3058 | [[package]] 3059 | name = "wayland-egl" 3060 | version = "0.29.1" 3061 | source = "registry+https://github.com/rust-lang/crates.io-index" 3062 | checksum = "accf27d1e5e1f64ba30b683fd926c2c916cc1014bea3376fb258e80abf622e40" 3063 | dependencies = [ 3064 | "wayland-client", 3065 | "wayland-sys", 3066 | ] 3067 | 3068 | [[package]] 3069 | name = "wayland-protocols" 3070 | version = "0.29.1" 3071 | source = "registry+https://github.com/rust-lang/crates.io-index" 3072 | checksum = "7b3b6f1dc0193072ef4eadcb144da30d58c1f2895516c063804d213310703c8e" 3073 | dependencies = [ 3074 | "bitflags", 3075 | "wayland-client", 3076 | "wayland-commons", 3077 | "wayland-scanner", 3078 | ] 3079 | 3080 | [[package]] 3081 | name = "wayland-scanner" 3082 | version = "0.29.1" 3083 | source = "registry+https://github.com/rust-lang/crates.io-index" 3084 | checksum = "eaaf2bc85e7b9143159af96bd23d954a5abe391c4376db712320643280fdc6f4" 3085 | dependencies = [ 3086 | "proc-macro2", 3087 | "quote", 3088 | "xml-rs", 3089 | ] 3090 | 3091 | [[package]] 3092 | name = "wayland-sys" 3093 | version = "0.29.1" 3094 | source = "registry+https://github.com/rust-lang/crates.io-index" 3095 | checksum = "ba9e06acb775b3007f8d3094438306979e572d1d3b844d7a71557a84b055d959" 3096 | dependencies = [ 3097 | "dlib", 3098 | "lazy_static", 3099 | "pkg-config", 3100 | ] 3101 | 3102 | [[package]] 3103 | name = "web-sys" 3104 | version = "0.3.55" 3105 | source = "registry+https://github.com/rust-lang/crates.io-index" 3106 | checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" 3107 | dependencies = [ 3108 | "js-sys", 3109 | "wasm-bindgen", 3110 | ] 3111 | 3112 | [[package]] 3113 | name = "webbrowser" 3114 | version = "0.5.5" 3115 | source = "registry+https://github.com/rust-lang/crates.io-index" 3116 | checksum = "ecad156490d6b620308ed411cfee90d280b3cbd13e189ea0d3fada8acc89158a" 3117 | dependencies = [ 3118 | "web-sys", 3119 | "widestring", 3120 | "winapi 0.3.9", 3121 | ] 3122 | 3123 | [[package]] 3124 | name = "weezl" 3125 | version = "0.1.5" 3126 | source = "registry+https://github.com/rust-lang/crates.io-index" 3127 | checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" 3128 | 3129 | [[package]] 3130 | name = "widestring" 3131 | version = "0.4.3" 3132 | source = "registry+https://github.com/rust-lang/crates.io-index" 3133 | checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" 3134 | 3135 | [[package]] 3136 | name = "winapi" 3137 | version = "0.2.8" 3138 | source = "registry+https://github.com/rust-lang/crates.io-index" 3139 | checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 3140 | 3141 | [[package]] 3142 | name = "winapi" 3143 | version = "0.3.9" 3144 | source = "registry+https://github.com/rust-lang/crates.io-index" 3145 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3146 | dependencies = [ 3147 | "winapi-i686-pc-windows-gnu", 3148 | "winapi-x86_64-pc-windows-gnu", 3149 | ] 3150 | 3151 | [[package]] 3152 | name = "winapi-build" 3153 | version = "0.1.1" 3154 | source = "registry+https://github.com/rust-lang/crates.io-index" 3155 | checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 3156 | 3157 | [[package]] 3158 | name = "winapi-i686-pc-windows-gnu" 3159 | version = "0.4.0" 3160 | source = "registry+https://github.com/rust-lang/crates.io-index" 3161 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3162 | 3163 | [[package]] 3164 | name = "winapi-util" 3165 | version = "0.1.5" 3166 | source = "registry+https://github.com/rust-lang/crates.io-index" 3167 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 3168 | dependencies = [ 3169 | "winapi 0.3.9", 3170 | ] 3171 | 3172 | [[package]] 3173 | name = "winapi-x86_64-pc-windows-gnu" 3174 | version = "0.4.0" 3175 | source = "registry+https://github.com/rust-lang/crates.io-index" 3176 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3177 | 3178 | [[package]] 3179 | name = "winit" 3180 | version = "0.26.0" 3181 | source = "registry+https://github.com/rust-lang/crates.io-index" 3182 | checksum = "70466a5f4825cc88c92963591b06dbc255420bffe19d847bfcda475e82d079c0" 3183 | dependencies = [ 3184 | "bitflags", 3185 | "block", 3186 | "cocoa", 3187 | "core-foundation 0.9.2", 3188 | "core-graphics 0.22.3", 3189 | "core-video-sys", 3190 | "dispatch", 3191 | "instant", 3192 | "lazy_static", 3193 | "libc", 3194 | "log", 3195 | "mio 0.8.0", 3196 | "ndk", 3197 | "ndk-glue", 3198 | "ndk-sys", 3199 | "objc", 3200 | "parking_lot", 3201 | "percent-encoding", 3202 | "raw-window-handle", 3203 | "smithay-client-toolkit", 3204 | "wasm-bindgen", 3205 | "wayland-client", 3206 | "wayland-protocols", 3207 | "web-sys", 3208 | "winapi 0.3.9", 3209 | "x11-dl", 3210 | ] 3211 | 3212 | [[package]] 3213 | name = "winreg" 3214 | version = "0.7.0" 3215 | source = "registry+https://github.com/rust-lang/crates.io-index" 3216 | checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" 3217 | dependencies = [ 3218 | "winapi 0.3.9", 3219 | ] 3220 | 3221 | [[package]] 3222 | name = "ws2_32-sys" 3223 | version = "0.2.1" 3224 | source = "registry+https://github.com/rust-lang/crates.io-index" 3225 | checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 3226 | dependencies = [ 3227 | "winapi 0.2.8", 3228 | "winapi-build", 3229 | ] 3230 | 3231 | [[package]] 3232 | name = "x11-clipboard" 3233 | version = "0.5.3" 3234 | source = "registry+https://github.com/rust-lang/crates.io-index" 3235 | checksum = "473068b7b80ac86a18328824f1054e5e007898c47b5bbc281bd7abe32bc3653c" 3236 | dependencies = [ 3237 | "xcb", 3238 | ] 3239 | 3240 | [[package]] 3241 | name = "x11-dl" 3242 | version = "2.19.1" 3243 | source = "registry+https://github.com/rust-lang/crates.io-index" 3244 | checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" 3245 | dependencies = [ 3246 | "lazy_static", 3247 | "libc", 3248 | "pkg-config", 3249 | ] 3250 | 3251 | [[package]] 3252 | name = "xcb" 3253 | version = "0.10.1" 3254 | source = "registry+https://github.com/rust-lang/crates.io-index" 3255 | checksum = "771e2b996df720cd1c6dd9ff90f62d91698fd3610cc078388d0564bdd6622a9c" 3256 | dependencies = [ 3257 | "libc", 3258 | "log", 3259 | "quick-xml", 3260 | ] 3261 | 3262 | [[package]] 3263 | name = "xcursor" 3264 | version = "0.3.4" 3265 | source = "registry+https://github.com/rust-lang/crates.io-index" 3266 | checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" 3267 | dependencies = [ 3268 | "nom", 3269 | ] 3270 | 3271 | [[package]] 3272 | name = "xml-rs" 3273 | version = "0.8.4" 3274 | source = "registry+https://github.com/rust-lang/crates.io-index" 3275 | checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" 3276 | 3277 | [[package]] 3278 | name = "y-reader" 3279 | version = "0.1.0" 3280 | dependencies = [ 3281 | "eframe", 3282 | "hacker-news", 3283 | "html-escape", 3284 | "image", 3285 | "lazy_static", 3286 | "regex", 3287 | "serde", 3288 | "time-humanize", 3289 | "url", 3290 | ] 3291 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "y-reader" 3 | version = "0.1.0" 4 | authors = ["Tobias Fried "] 5 | edition = "2021" 6 | rust-version = "1.56" 7 | 8 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 9 | 10 | [lib] 11 | crate-type = ["cdylib", "rlib"] 12 | 13 | [dependencies] 14 | eframe = "0.16.0" # Gives us egui, epi and web+native backends 15 | hacker-news = "0.1.2" 16 | html-escape = "0.2.9" 17 | image = "0.23.14" 18 | lazy_static = "1.4.0" 19 | regex = "1.5.4" 20 | serde = { version = "1", features = ["derive"], optional = true } 21 | time-humanize = "0.1.3" 22 | url = "2.2.2" 23 | 24 | [features] 25 | default = [] 26 | persistence = ["eframe/persistence", "serde"] # Enable if you want to persist app state on shutdown 27 | 28 | [profile.release] 29 | opt-level = 2 # fast and small wasm 30 | 31 | [patch.crates-io] 32 | 33 | # If you want to use the bleeding edge version of `egui`: 34 | # eframe = { git = "https://github.com/emilk/egui", branch = "master" } 35 | 36 | # If you fork https://github.com/emilk/egui you can test with: 37 | # eframe = { path = "../egui/eframe" } 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Tobias Fried 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # y-reader 2 | 3 | Y Reader is a simple Hacker News client built in Rust using the [egui](https://github.com/emilk/egui) immediate-mode GUI toolkit. It's very much a work-in-progress, but features periodic refresh, comment browsing, and excessive use of concurrency to deal with the terrible Hacker News API design :) 4 | 5 | 6 | 7 | ## Usage 8 | 9 | Clone the repo and run: 10 | 11 | ```rs 12 | cargo run --release 13 | ``` 14 | 15 | I plan to package some binaries once the project is a bit more stable! 16 | 17 | ## Planned Features 18 | 19 | - [ ] Infinite scroll, don't limit to 100 items per tab 20 | - [ ] Improved parsing of comment HTML 21 | - [ ] Persistent custom UI settings 22 | - [ ] Support `Ask` and `Jobs` 23 | - [ ] In-app views for users 24 | - [ ] Login, voting and commenting (no auth support yet from YC) 25 | 26 | ## License 27 | 28 | MIT © [Tobias Fried](https://tobiasfried.com) 29 | -------------------------------------------------------------------------------- /assets/y_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rektdeckard/y-reader/0e528828b20e1422940d2c84b4caabb84e80e398/assets/y_icon.png -------------------------------------------------------------------------------- /build_web.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -eu 3 | script_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) 4 | cd "$script_path" 5 | 6 | OPEN=false 7 | FAST=false 8 | 9 | while test $# -gt 0; do 10 | case "$1" in 11 | -h|--help) 12 | echo "build_web.sh [--fast] [--open]" 13 | echo " --fast: skip optimization step" 14 | echo " --open: open the result in a browser" 15 | exit 0 16 | ;; 17 | --fast) 18 | shift 19 | FAST=true 20 | ;; 21 | --open) 22 | shift 23 | OPEN=true 24 | ;; 25 | *) 26 | break 27 | ;; 28 | esac 29 | done 30 | 31 | # ./setup_web.sh # <- call this first! 32 | 33 | FOLDER_NAME=${PWD##*/} 34 | CRATE_NAME=$FOLDER_NAME # assume crate name is the same as the folder name 35 | CRATE_NAME_SNAKE_CASE="${CRATE_NAME//-/_}" # for those who name crates with-kebab-case 36 | 37 | # This is required to enable the web_sys clipboard API which egui_web uses 38 | # https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html 39 | # https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html 40 | export RUSTFLAGS=--cfg=web_sys_unstable_apis 41 | 42 | # Clear output from old stuff: 43 | rm -f docs/${CRATE_NAME_SNAKE_CASE}_bg.wasm 44 | 45 | echo "Building rust…" 46 | BUILD=release 47 | cargo build -p ${CRATE_NAME} --release --lib --target wasm32-unknown-unknown 48 | 49 | # Get the output directory (in the workspace it is in another location) 50 | TARGET=`cargo metadata --format-version=1 | jq --raw-output .target_directory` 51 | 52 | echo "Generating JS bindings for wasm…" 53 | TARGET_NAME="${CRATE_NAME_SNAKE_CASE}.wasm" 54 | wasm-bindgen "${TARGET}/wasm32-unknown-unknown/${BUILD}/${TARGET_NAME}" \ 55 | --out-dir docs --no-modules --no-typescript 56 | 57 | if [ "${FAST}" = false ]; then 58 | echo "Optimizing wasm…" 59 | # to get wasm-opt: apt/brew/dnf install binaryen 60 | wasm-opt docs/${CRATE_NAME}_bg.wasm -O2 --fast-math -o docs/${CRATE_NAME}_bg.wasm # add -g to get debug symbols 61 | fi 62 | 63 | echo "Finished: docs/${CRATE_NAME_SNAKE_CASE}.wasm" 64 | 65 | if [ "${OPEN}" = true ]; then 66 | if [[ "$OSTYPE" == "linux-gnu"* ]]; then 67 | # Linux, ex: Fedora 68 | xdg-open http://localhost:8080/index.html 69 | elif [[ "$OSTYPE" == "msys" ]]; then 70 | # Windows 71 | start http://localhost:8080/index.html 72 | else 73 | # Darwin/MacOS, or something else 74 | open http://localhost:8080/index.html 75 | fi 76 | fi 77 | -------------------------------------------------------------------------------- /check.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # This scripts runs various CI-like checks in a convenient way. 3 | set -eux 4 | 5 | cargo check --workspace --all-targets 6 | cargo check --workspace --all-features --lib --target wasm32-unknown-unknown 7 | cargo fmt --all -- --check 8 | cargo clippy --workspace --all-targets --all-features -- -D warnings -W clippy::all 9 | cargo test --workspace --all-targets --all-features 10 | cargo test --workspace --doc 11 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | This folder contains the files required for the web app. 2 | 3 | The reason the folder is called "docs" is because that is the name that GitHub requires in order to host a web page from the `master` branch of a repository. You can test the `eframe_template` at . 4 | -------------------------------------------------------------------------------- /docs/eframe_template.js: -------------------------------------------------------------------------------- 1 | let wasm_bindgen; 2 | (function() { 3 | const __exports = {}; 4 | let wasm; 5 | 6 | const heap = new Array(32).fill(undefined); 7 | 8 | heap.push(undefined, null, true, false); 9 | 10 | function getObject(idx) { return heap[idx]; } 11 | 12 | let heap_next = heap.length; 13 | 14 | function dropObject(idx) { 15 | if (idx < 36) return; 16 | heap[idx] = heap_next; 17 | heap_next = idx; 18 | } 19 | 20 | function takeObject(idx) { 21 | const ret = getObject(idx); 22 | dropObject(idx); 23 | return ret; 24 | } 25 | 26 | let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); 27 | 28 | cachedTextDecoder.decode(); 29 | 30 | let cachegetUint8Memory0 = null; 31 | function getUint8Memory0() { 32 | if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { 33 | cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); 34 | } 35 | return cachegetUint8Memory0; 36 | } 37 | 38 | function getStringFromWasm0(ptr, len) { 39 | return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); 40 | } 41 | 42 | function addHeapObject(obj) { 43 | if (heap_next === heap.length) heap.push(heap.length + 1); 44 | const idx = heap_next; 45 | heap_next = heap[idx]; 46 | 47 | heap[idx] = obj; 48 | return idx; 49 | } 50 | 51 | function isLikeNone(x) { 52 | return x === undefined || x === null; 53 | } 54 | 55 | let cachegetFloat64Memory0 = null; 56 | function getFloat64Memory0() { 57 | if (cachegetFloat64Memory0 === null || cachegetFloat64Memory0.buffer !== wasm.memory.buffer) { 58 | cachegetFloat64Memory0 = new Float64Array(wasm.memory.buffer); 59 | } 60 | return cachegetFloat64Memory0; 61 | } 62 | 63 | let cachegetInt32Memory0 = null; 64 | function getInt32Memory0() { 65 | if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) { 66 | cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer); 67 | } 68 | return cachegetInt32Memory0; 69 | } 70 | 71 | let WASM_VECTOR_LEN = 0; 72 | 73 | let cachedTextEncoder = new TextEncoder('utf-8'); 74 | 75 | const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' 76 | ? function (arg, view) { 77 | return cachedTextEncoder.encodeInto(arg, view); 78 | } 79 | : function (arg, view) { 80 | const buf = cachedTextEncoder.encode(arg); 81 | view.set(buf); 82 | return { 83 | read: arg.length, 84 | written: buf.length 85 | }; 86 | }); 87 | 88 | function passStringToWasm0(arg, malloc, realloc) { 89 | 90 | if (realloc === undefined) { 91 | const buf = cachedTextEncoder.encode(arg); 92 | const ptr = malloc(buf.length); 93 | getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); 94 | WASM_VECTOR_LEN = buf.length; 95 | return ptr; 96 | } 97 | 98 | let len = arg.length; 99 | let ptr = malloc(len); 100 | 101 | const mem = getUint8Memory0(); 102 | 103 | let offset = 0; 104 | 105 | for (; offset < len; offset++) { 106 | const code = arg.charCodeAt(offset); 107 | if (code > 0x7F) break; 108 | mem[ptr + offset] = code; 109 | } 110 | 111 | if (offset !== len) { 112 | if (offset !== 0) { 113 | arg = arg.slice(offset); 114 | } 115 | ptr = realloc(ptr, len, len = offset + arg.length * 3); 116 | const view = getUint8Memory0().subarray(ptr + offset, ptr + len); 117 | const ret = encodeString(arg, view); 118 | 119 | offset += ret.written; 120 | } 121 | 122 | WASM_VECTOR_LEN = offset; 123 | return ptr; 124 | } 125 | 126 | function debugString(val) { 127 | // primitive types 128 | const type = typeof val; 129 | if (type == 'number' || type == 'boolean' || val == null) { 130 | return `${val}`; 131 | } 132 | if (type == 'string') { 133 | return `"${val}"`; 134 | } 135 | if (type == 'symbol') { 136 | const description = val.description; 137 | if (description == null) { 138 | return 'Symbol'; 139 | } else { 140 | return `Symbol(${description})`; 141 | } 142 | } 143 | if (type == 'function') { 144 | const name = val.name; 145 | if (typeof name == 'string' && name.length > 0) { 146 | return `Function(${name})`; 147 | } else { 148 | return 'Function'; 149 | } 150 | } 151 | // objects 152 | if (Array.isArray(val)) { 153 | const length = val.length; 154 | let debug = '['; 155 | if (length > 0) { 156 | debug += debugString(val[0]); 157 | } 158 | for(let i = 1; i < length; i++) { 159 | debug += ', ' + debugString(val[i]); 160 | } 161 | debug += ']'; 162 | return debug; 163 | } 164 | // Test for built-in 165 | const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); 166 | let className; 167 | if (builtInMatches.length > 1) { 168 | className = builtInMatches[1]; 169 | } else { 170 | // Failed to match the standard '[object ClassName]' 171 | return toString.call(val); 172 | } 173 | if (className == 'Object') { 174 | // we're a user defined class or Object 175 | // JSON.stringify avoids problems with cycles, and is generally much 176 | // easier than looping through ownProperties of `val`. 177 | try { 178 | return 'Object(' + JSON.stringify(val) + ')'; 179 | } catch (_) { 180 | return 'Object'; 181 | } 182 | } 183 | // errors 184 | if (val instanceof Error) { 185 | return `${val.name}: ${val.message}\n${val.stack}`; 186 | } 187 | // TODO we could test for more things here, like `Set`s and `Map`s. 188 | return className; 189 | } 190 | 191 | function makeMutClosure(arg0, arg1, dtor, f) { 192 | const state = { a: arg0, b: arg1, cnt: 1, dtor }; 193 | const real = (...args) => { 194 | // First up with a closure we increment the internal reference 195 | // count. This ensures that the Rust closure environment won't 196 | // be deallocated while we're invoking it. 197 | state.cnt++; 198 | const a = state.a; 199 | state.a = 0; 200 | try { 201 | return f(a, state.b, ...args); 202 | } finally { 203 | if (--state.cnt === 0) { 204 | wasm.__wbindgen_export_2.get(state.dtor)(a, state.b); 205 | 206 | } else { 207 | state.a = a; 208 | } 209 | } 210 | }; 211 | real.original = state; 212 | 213 | return real; 214 | } 215 | function __wbg_adapter_26(arg0, arg1) { 216 | wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h82daea18f996a61e(arg0, arg1); 217 | } 218 | 219 | function __wbg_adapter_29(arg0, arg1, arg2) { 220 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h02380ceefaeb445c(arg0, arg1, addHeapObject(arg2)); 221 | } 222 | 223 | function __wbg_adapter_32(arg0, arg1, arg2) { 224 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h02380ceefaeb445c(arg0, arg1, addHeapObject(arg2)); 225 | } 226 | 227 | function __wbg_adapter_35(arg0, arg1, arg2) { 228 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h02380ceefaeb445c(arg0, arg1, addHeapObject(arg2)); 229 | } 230 | 231 | function __wbg_adapter_38(arg0, arg1, arg2) { 232 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h02380ceefaeb445c(arg0, arg1, addHeapObject(arg2)); 233 | } 234 | 235 | function __wbg_adapter_41(arg0, arg1, arg2) { 236 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h02380ceefaeb445c(arg0, arg1, addHeapObject(arg2)); 237 | } 238 | 239 | function __wbg_adapter_44(arg0, arg1, arg2) { 240 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h02380ceefaeb445c(arg0, arg1, addHeapObject(arg2)); 241 | } 242 | 243 | function __wbg_adapter_47(arg0, arg1, arg2) { 244 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h02380ceefaeb445c(arg0, arg1, addHeapObject(arg2)); 245 | } 246 | 247 | function __wbg_adapter_50(arg0, arg1) { 248 | wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__he8468c0457df91ee(arg0, arg1); 249 | } 250 | 251 | function __wbg_adapter_53(arg0, arg1, arg2) { 252 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h02380ceefaeb445c(arg0, arg1, addHeapObject(arg2)); 253 | } 254 | 255 | function __wbg_adapter_56(arg0, arg1, arg2) { 256 | wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__ha61e5578eca01976(arg0, arg1, addHeapObject(arg2)); 257 | } 258 | 259 | /** 260 | * This is the entry-point for all the web-assembly. 261 | * This is called once from the HTML. 262 | * It loads the app, installs some callbacks, then returns. 263 | * You can add more callbacks like this if you want to call in to your code. 264 | * @param {string} canvas_id 265 | */ 266 | __exports.start = function(canvas_id) { 267 | var ptr0 = passStringToWasm0(canvas_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 268 | var len0 = WASM_VECTOR_LEN; 269 | wasm.start(ptr0, len0); 270 | }; 271 | 272 | function getArrayU8FromWasm0(ptr, len) { 273 | return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); 274 | } 275 | 276 | function handleError(f, args) { 277 | try { 278 | return f.apply(this, args); 279 | } catch (e) { 280 | wasm.__wbindgen_exn_store(addHeapObject(e)); 281 | } 282 | } 283 | 284 | async function load(module, imports) { 285 | if (typeof Response === 'function' && module instanceof Response) { 286 | if (typeof WebAssembly.instantiateStreaming === 'function') { 287 | try { 288 | return await WebAssembly.instantiateStreaming(module, imports); 289 | 290 | } catch (e) { 291 | if (module.headers.get('Content-Type') != 'application/wasm') { 292 | console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); 293 | 294 | } else { 295 | throw e; 296 | } 297 | } 298 | } 299 | 300 | const bytes = await module.arrayBuffer(); 301 | return await WebAssembly.instantiate(bytes, imports); 302 | 303 | } else { 304 | const instance = await WebAssembly.instantiate(module, imports); 305 | 306 | if (instance instanceof WebAssembly.Instance) { 307 | return { instance, module }; 308 | 309 | } else { 310 | return instance; 311 | } 312 | } 313 | } 314 | 315 | async function init(input) { 316 | if (typeof input === 'undefined') { 317 | let src; 318 | if (typeof document === 'undefined') { 319 | src = location.href; 320 | } else { 321 | src = document.currentScript.src; 322 | } 323 | input = src.replace(/\.js$/, '_bg.wasm'); 324 | } 325 | const imports = {}; 326 | imports.wbg = {}; 327 | imports.wbg.__wbindgen_object_drop_ref = function(arg0) { 328 | takeObject(arg0); 329 | }; 330 | imports.wbg.__wbindgen_string_new = function(arg0, arg1) { 331 | var ret = getStringFromWasm0(arg0, arg1); 332 | return addHeapObject(ret); 333 | }; 334 | imports.wbg.__wbindgen_cb_drop = function(arg0) { 335 | const obj = takeObject(arg0).original; 336 | if (obj.cnt-- == 1) { 337 | obj.a = 0; 338 | return true; 339 | } 340 | var ret = false; 341 | return ret; 342 | }; 343 | imports.wbg.__wbindgen_number_get = function(arg0, arg1) { 344 | const obj = getObject(arg1); 345 | var ret = typeof(obj) === 'number' ? obj : undefined; 346 | getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; 347 | getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); 348 | }; 349 | imports.wbg.__wbindgen_object_clone_ref = function(arg0) { 350 | var ret = getObject(arg0); 351 | return addHeapObject(ret); 352 | }; 353 | imports.wbg.__wbindgen_string_get = function(arg0, arg1) { 354 | const obj = getObject(arg1); 355 | var ret = typeof(obj) === 'string' ? obj : undefined; 356 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 357 | var len0 = WASM_VECTOR_LEN; 358 | getInt32Memory0()[arg0 / 4 + 1] = len0; 359 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 360 | }; 361 | imports.wbg.__wbindgen_boolean_get = function(arg0) { 362 | const v = getObject(arg0); 363 | var ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; 364 | return ret; 365 | }; 366 | imports.wbg.__wbg_instanceof_WebGl2RenderingContext_56ad96bfac3f5531 = function(arg0) { 367 | var ret = getObject(arg0) instanceof WebGL2RenderingContext; 368 | return ret; 369 | }; 370 | imports.wbg.__wbg_drawingBufferWidth_561b8beaef3111f5 = function(arg0) { 371 | var ret = getObject(arg0).drawingBufferWidth; 372 | return ret; 373 | }; 374 | imports.wbg.__wbg_drawingBufferHeight_aa35759c7f962358 = function(arg0) { 375 | var ret = getObject(arg0).drawingBufferHeight; 376 | return ret; 377 | }; 378 | imports.wbg.__wbg_bindVertexArray_52b8b2f5fd93d81d = function(arg0, arg1) { 379 | getObject(arg0).bindVertexArray(getObject(arg1)); 380 | }; 381 | imports.wbg.__wbg_bufferData_bba22fbe5dd1f1d6 = function(arg0, arg1, arg2, arg3) { 382 | getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0); 383 | }; 384 | imports.wbg.__wbg_bufferData_794d61d3c392fafd = function(arg0, arg1, arg2, arg3, arg4) { 385 | getObject(arg0).bufferData(arg1 >>> 0, getArrayU8FromWasm0(arg2, arg3), arg4 >>> 0); 386 | }; 387 | imports.wbg.__wbg_createVertexArray_d59135c0a43c410b = function(arg0) { 388 | var ret = getObject(arg0).createVertexArray(); 389 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 390 | }; 391 | imports.wbg.__wbg_deleteVertexArray_385874f9e1499a3f = function(arg0, arg1) { 392 | getObject(arg0).deleteVertexArray(getObject(arg1)); 393 | }; 394 | imports.wbg.__wbg_texImage2D_29ea0a7f026e239b = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { 395 | getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10)); 396 | }, arguments) }; 397 | imports.wbg.__wbg_activeTexture_0092956fa2eefd8c = function(arg0, arg1) { 398 | getObject(arg0).activeTexture(arg1 >>> 0); 399 | }; 400 | imports.wbg.__wbg_attachShader_7faccaa7b5ac28a6 = function(arg0, arg1, arg2) { 401 | getObject(arg0).attachShader(getObject(arg1), getObject(arg2)); 402 | }; 403 | imports.wbg.__wbg_bindBuffer_4ece833dd10cac2f = function(arg0, arg1, arg2) { 404 | getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2)); 405 | }; 406 | imports.wbg.__wbg_bindFramebuffer_48c4bf8ff82bf7e9 = function(arg0, arg1, arg2) { 407 | getObject(arg0).bindFramebuffer(arg1 >>> 0, getObject(arg2)); 408 | }; 409 | imports.wbg.__wbg_bindTexture_9d8ed0fcd83eb0a9 = function(arg0, arg1, arg2) { 410 | getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2)); 411 | }; 412 | imports.wbg.__wbg_blendFunc_b254bb91838df1dd = function(arg0, arg1, arg2) { 413 | getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0); 414 | }; 415 | imports.wbg.__wbg_clear_4ce66c813d66e77d = function(arg0, arg1) { 416 | getObject(arg0).clear(arg1 >>> 0); 417 | }; 418 | imports.wbg.__wbg_clearColor_71f96fd72a7646a6 = function(arg0, arg1, arg2, arg3, arg4) { 419 | getObject(arg0).clearColor(arg1, arg2, arg3, arg4); 420 | }; 421 | imports.wbg.__wbg_compileShader_dd66d66a5a6481f3 = function(arg0, arg1) { 422 | getObject(arg0).compileShader(getObject(arg1)); 423 | }; 424 | imports.wbg.__wbg_createBuffer_5c5caa16032a81b7 = function(arg0) { 425 | var ret = getObject(arg0).createBuffer(); 426 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 427 | }; 428 | imports.wbg.__wbg_createFramebuffer_9818fc04b4a38c18 = function(arg0) { 429 | var ret = getObject(arg0).createFramebuffer(); 430 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 431 | }; 432 | imports.wbg.__wbg_createProgram_32d01a55e144b9fc = function(arg0) { 433 | var ret = getObject(arg0).createProgram(); 434 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 435 | }; 436 | imports.wbg.__wbg_createShader_6e8eed55567fe1a6 = function(arg0, arg1) { 437 | var ret = getObject(arg0).createShader(arg1 >>> 0); 438 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 439 | }; 440 | imports.wbg.__wbg_createTexture_8f31e7386e22fc37 = function(arg0) { 441 | var ret = getObject(arg0).createTexture(); 442 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 443 | }; 444 | imports.wbg.__wbg_deleteBuffer_de80b51d8166fddb = function(arg0, arg1) { 445 | getObject(arg0).deleteBuffer(getObject(arg1)); 446 | }; 447 | imports.wbg.__wbg_deleteFramebuffer_5f58ccb548438c57 = function(arg0, arg1) { 448 | getObject(arg0).deleteFramebuffer(getObject(arg1)); 449 | }; 450 | imports.wbg.__wbg_deleteProgram_3ec3c43f2cddde7f = function(arg0, arg1) { 451 | getObject(arg0).deleteProgram(getObject(arg1)); 452 | }; 453 | imports.wbg.__wbg_deleteTexture_a0632c71429795ac = function(arg0, arg1) { 454 | getObject(arg0).deleteTexture(getObject(arg1)); 455 | }; 456 | imports.wbg.__wbg_disable_b05e075ae54fa448 = function(arg0, arg1) { 457 | getObject(arg0).disable(arg1 >>> 0); 458 | }; 459 | imports.wbg.__wbg_drawElements_a41bb53d39cd6297 = function(arg0, arg1, arg2, arg3, arg4) { 460 | getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4); 461 | }; 462 | imports.wbg.__wbg_enable_766e546395da5a5d = function(arg0, arg1) { 463 | getObject(arg0).enable(arg1 >>> 0); 464 | }; 465 | imports.wbg.__wbg_enableVertexAttribArray_91da8d3cbe0c2bbd = function(arg0, arg1) { 466 | getObject(arg0).enableVertexAttribArray(arg1 >>> 0); 467 | }; 468 | imports.wbg.__wbg_framebufferTexture2D_3da41a7f38e2c523 = function(arg0, arg1, arg2, arg3, arg4, arg5) { 469 | getObject(arg0).framebufferTexture2D(arg1 >>> 0, arg2 >>> 0, arg3 >>> 0, getObject(arg4), arg5); 470 | }; 471 | imports.wbg.__wbg_getAttribLocation_5d304d390c7273f5 = function(arg0, arg1, arg2, arg3) { 472 | var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 473 | return ret; 474 | }; 475 | imports.wbg.__wbg_getProgramInfoLog_18c849a5fa54e7b1 = function(arg0, arg1, arg2) { 476 | var ret = getObject(arg1).getProgramInfoLog(getObject(arg2)); 477 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 478 | var len0 = WASM_VECTOR_LEN; 479 | getInt32Memory0()[arg0 / 4 + 1] = len0; 480 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 481 | }; 482 | imports.wbg.__wbg_getProgramParameter_80edd3cfbcf7cf1d = function(arg0, arg1, arg2) { 483 | var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0); 484 | return addHeapObject(ret); 485 | }; 486 | imports.wbg.__wbg_getShaderInfoLog_ba1de20c14b6fb63 = function(arg0, arg1, arg2) { 487 | var ret = getObject(arg1).getShaderInfoLog(getObject(arg2)); 488 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 489 | var len0 = WASM_VECTOR_LEN; 490 | getInt32Memory0()[arg0 / 4 + 1] = len0; 491 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 492 | }; 493 | imports.wbg.__wbg_getShaderParameter_264d9ab5c13ece4d = function(arg0, arg1, arg2) { 494 | var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0); 495 | return addHeapObject(ret); 496 | }; 497 | imports.wbg.__wbg_getUniformLocation_77b2d89291f84289 = function(arg0, arg1, arg2, arg3) { 498 | var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 499 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 500 | }; 501 | imports.wbg.__wbg_linkProgram_b84796e37364e5c9 = function(arg0, arg1) { 502 | getObject(arg0).linkProgram(getObject(arg1)); 503 | }; 504 | imports.wbg.__wbg_pixelStorei_a9b9b42ef01616b2 = function(arg0, arg1, arg2) { 505 | getObject(arg0).pixelStorei(arg1 >>> 0, arg2); 506 | }; 507 | imports.wbg.__wbg_scissor_5802aaee71f2eb0e = function(arg0, arg1, arg2, arg3, arg4) { 508 | getObject(arg0).scissor(arg1, arg2, arg3, arg4); 509 | }; 510 | imports.wbg.__wbg_shaderSource_18f45f93c05a8311 = function(arg0, arg1, arg2, arg3) { 511 | getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3)); 512 | }; 513 | imports.wbg.__wbg_texParameteri_c54aab65b2f8cf6d = function(arg0, arg1, arg2, arg3) { 514 | getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3); 515 | }; 516 | imports.wbg.__wbg_uniform1i_e287345af4468e22 = function(arg0, arg1, arg2) { 517 | getObject(arg0).uniform1i(getObject(arg1), arg2); 518 | }; 519 | imports.wbg.__wbg_uniform2f_f8d8e7662e0e0eb6 = function(arg0, arg1, arg2, arg3) { 520 | getObject(arg0).uniform2f(getObject(arg1), arg2, arg3); 521 | }; 522 | imports.wbg.__wbg_useProgram_c2fdf4a953d1128a = function(arg0, arg1) { 523 | getObject(arg0).useProgram(getObject(arg1)); 524 | }; 525 | imports.wbg.__wbg_vertexAttribPointer_76d558694fe81cd7 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) { 526 | getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6); 527 | }; 528 | imports.wbg.__wbg_viewport_da0901eee69b9909 = function(arg0, arg1, arg2, arg3, arg4) { 529 | getObject(arg0).viewport(arg1, arg2, arg3, arg4); 530 | }; 531 | imports.wbg.__wbg_instanceof_Window_c4b70662a0d2c5ec = function(arg0) { 532 | var ret = getObject(arg0) instanceof Window; 533 | return ret; 534 | }; 535 | imports.wbg.__wbg_document_1c64944725c0d81d = function(arg0) { 536 | var ret = getObject(arg0).document; 537 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 538 | }; 539 | imports.wbg.__wbg_location_f98ad02632f88c43 = function(arg0) { 540 | var ret = getObject(arg0).location; 541 | return addHeapObject(ret); 542 | }; 543 | imports.wbg.__wbg_navigator_480e592af6ad365b = function(arg0) { 544 | var ret = getObject(arg0).navigator; 545 | return addHeapObject(ret); 546 | }; 547 | imports.wbg.__wbg_innerWidth_ef25c730fca132cf = function() { return handleError(function (arg0) { 548 | var ret = getObject(arg0).innerWidth; 549 | return addHeapObject(ret); 550 | }, arguments) }; 551 | imports.wbg.__wbg_innerHeight_1b1217a63a77bf61 = function() { return handleError(function (arg0) { 552 | var ret = getObject(arg0).innerHeight; 553 | return addHeapObject(ret); 554 | }, arguments) }; 555 | imports.wbg.__wbg_devicePixelRatio_d8c3852bb37f76bf = function(arg0) { 556 | var ret = getObject(arg0).devicePixelRatio; 557 | return ret; 558 | }; 559 | imports.wbg.__wbg_performance_947628766699c5bb = function(arg0) { 560 | var ret = getObject(arg0).performance; 561 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 562 | }; 563 | imports.wbg.__wbg_localStorage_6775414303ab5085 = function() { return handleError(function (arg0) { 564 | var ret = getObject(arg0).localStorage; 565 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 566 | }, arguments) }; 567 | imports.wbg.__wbg_matchMedia_b95c474c6db67a60 = function() { return handleError(function (arg0, arg1, arg2) { 568 | var ret = getObject(arg0).matchMedia(getStringFromWasm0(arg1, arg2)); 569 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 570 | }, arguments) }; 571 | imports.wbg.__wbg_open_5416e4448a959cfa = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { 572 | var ret = getObject(arg0).open(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); 573 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 574 | }, arguments) }; 575 | imports.wbg.__wbg_requestAnimationFrame_71638ca922068239 = function() { return handleError(function (arg0, arg1) { 576 | var ret = getObject(arg0).requestAnimationFrame(getObject(arg1)); 577 | return ret; 578 | }, arguments) }; 579 | imports.wbg.__wbg_setInterval_ec2d9dc4a54a6566 = function() { return handleError(function (arg0, arg1, arg2) { 580 | var ret = getObject(arg0).setInterval(getObject(arg1), arg2); 581 | return ret; 582 | }, arguments) }; 583 | imports.wbg.__wbg_setTimeout_df66d951b1726b78 = function() { return handleError(function (arg0, arg1, arg2) { 584 | var ret = getObject(arg0).setTimeout(getObject(arg1), arg2); 585 | return ret; 586 | }, arguments) }; 587 | imports.wbg.__wbg_type_7a49279491e15d0a = function(arg0, arg1) { 588 | var ret = getObject(arg1).type; 589 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 590 | var len0 = WASM_VECTOR_LEN; 591 | getInt32Memory0()[arg0 / 4 + 1] = len0; 592 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 593 | }; 594 | imports.wbg.__wbg_preventDefault_9866c9fd51eecfb6 = function(arg0) { 595 | getObject(arg0).preventDefault(); 596 | }; 597 | imports.wbg.__wbg_stopPropagation_ae76be6b0f664ee8 = function(arg0) { 598 | getObject(arg0).stopPropagation(); 599 | }; 600 | imports.wbg.__wbg_length_a2870b8b80e120c3 = function(arg0) { 601 | var ret = getObject(arg0).length; 602 | return ret; 603 | }; 604 | imports.wbg.__wbg_get_b84d80d476cf15e4 = function(arg0, arg1) { 605 | var ret = getObject(arg0)[arg1 >>> 0]; 606 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 607 | }; 608 | imports.wbg.__wbg_keyCode_490ed69472addfdc = function(arg0) { 609 | var ret = getObject(arg0).keyCode; 610 | return ret; 611 | }; 612 | imports.wbg.__wbg_altKey_3dcb50d5afbc5036 = function(arg0) { 613 | var ret = getObject(arg0).altKey; 614 | return ret; 615 | }; 616 | imports.wbg.__wbg_ctrlKey_fb62ba10b63b34a4 = function(arg0) { 617 | var ret = getObject(arg0).ctrlKey; 618 | return ret; 619 | }; 620 | imports.wbg.__wbg_shiftKey_bd2875540e5db840 = function(arg0) { 621 | var ret = getObject(arg0).shiftKey; 622 | return ret; 623 | }; 624 | imports.wbg.__wbg_metaKey_94ca09e07f21f240 = function(arg0) { 625 | var ret = getObject(arg0).metaKey; 626 | return ret; 627 | }; 628 | imports.wbg.__wbg_isComposing_d05ebca75d81bc30 = function(arg0) { 629 | var ret = getObject(arg0).isComposing; 630 | return ret; 631 | }; 632 | imports.wbg.__wbg_key_10dcaa4bb6d5449f = function(arg0, arg1) { 633 | var ret = getObject(arg1).key; 634 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 635 | var len0 = WASM_VECTOR_LEN; 636 | getInt32Memory0()[arg0 / 4 + 1] = len0; 637 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 638 | }; 639 | imports.wbg.__wbg_length_1d27563e3515722e = function(arg0) { 640 | var ret = getObject(arg0).length; 641 | return ret; 642 | }; 643 | imports.wbg.__wbg_item_a23b382195352a8a = function(arg0, arg1) { 644 | var ret = getObject(arg0).item(arg1 >>> 0); 645 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 646 | }; 647 | imports.wbg.__wbg_get_20b719b18767c76e = function(arg0, arg1) { 648 | var ret = getObject(arg0)[arg1 >>> 0]; 649 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 650 | }; 651 | imports.wbg.__wbg_name_6af1a38f3edc1522 = function(arg0, arg1) { 652 | var ret = getObject(arg1).name; 653 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 654 | var len0 = WASM_VECTOR_LEN; 655 | getInt32Memory0()[arg0 / 4 + 1] = len0; 656 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 657 | }; 658 | imports.wbg.__wbg_lastModified_c61609c3c6a0bd88 = function(arg0) { 659 | var ret = getObject(arg0).lastModified; 660 | return ret; 661 | }; 662 | imports.wbg.__wbg_instanceof_HtmlCanvasElement_25d964a0dde6717e = function(arg0) { 663 | var ret = getObject(arg0) instanceof HTMLCanvasElement; 664 | return ret; 665 | }; 666 | imports.wbg.__wbg_width_555f63ab09ba7d3f = function(arg0) { 667 | var ret = getObject(arg0).width; 668 | return ret; 669 | }; 670 | imports.wbg.__wbg_setwidth_c1a7061891b71f25 = function(arg0, arg1) { 671 | getObject(arg0).width = arg1 >>> 0; 672 | }; 673 | imports.wbg.__wbg_height_7153faec70fbaf7b = function(arg0) { 674 | var ret = getObject(arg0).height; 675 | return ret; 676 | }; 677 | imports.wbg.__wbg_setheight_88894b05710ff752 = function(arg0, arg1) { 678 | getObject(arg0).height = arg1 >>> 0; 679 | }; 680 | imports.wbg.__wbg_getContext_f701d0231ae22393 = function() { return handleError(function (arg0, arg1, arg2) { 681 | var ret = getObject(arg0).getContext(getStringFromWasm0(arg1, arg2)); 682 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 683 | }, arguments) }; 684 | imports.wbg.__wbg_touches_3bcd168150040d19 = function(arg0) { 685 | var ret = getObject(arg0).touches; 686 | return addHeapObject(ret); 687 | }; 688 | imports.wbg.__wbg_changedTouches_d84714496e7f4712 = function(arg0) { 689 | var ret = getObject(arg0).changedTouches; 690 | return addHeapObject(ret); 691 | }; 692 | imports.wbg.__wbg_top_3946f8347860b55c = function(arg0) { 693 | var ret = getObject(arg0).top; 694 | return ret; 695 | }; 696 | imports.wbg.__wbg_left_31cce57341292712 = function(arg0) { 697 | var ret = getObject(arg0).left; 698 | return ret; 699 | }; 700 | imports.wbg.__wbg_clipboard_3dff7cff084c4be2 = function(arg0) { 701 | var ret = getObject(arg0).clipboard; 702 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 703 | }; 704 | imports.wbg.__wbg_userAgent_bdd46cceef222f52 = function() { return handleError(function (arg0, arg1) { 705 | var ret = getObject(arg1).userAgent; 706 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 707 | var len0 = WASM_VECTOR_LEN; 708 | getInt32Memory0()[arg0 / 4 + 1] = len0; 709 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 710 | }, arguments) }; 711 | imports.wbg.__wbg_width_d55d3698a2514ec1 = function(arg0) { 712 | var ret = getObject(arg0).width; 713 | return ret; 714 | }; 715 | imports.wbg.__wbg_height_df08a93b45ce76ec = function(arg0) { 716 | var ret = getObject(arg0).height; 717 | return ret; 718 | }; 719 | imports.wbg.__wbg_appendChild_d318db34c4559916 = function() { return handleError(function (arg0, arg1) { 720 | var ret = getObject(arg0).appendChild(getObject(arg1)); 721 | return addHeapObject(ret); 722 | }, arguments) }; 723 | imports.wbg.__wbg_size_3d49b94127cdd6ed = function(arg0) { 724 | var ret = getObject(arg0).size; 725 | return ret; 726 | }; 727 | imports.wbg.__wbg_arrayBuffer_e857fb358de5f814 = function(arg0) { 728 | var ret = getObject(arg0).arrayBuffer(); 729 | return addHeapObject(ret); 730 | }; 731 | imports.wbg.__wbg_hash_0fff5255cf3c317c = function() { return handleError(function (arg0, arg1) { 732 | var ret = getObject(arg1).hash; 733 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 734 | var len0 = WASM_VECTOR_LEN; 735 | getInt32Memory0()[arg0 / 4 + 1] = len0; 736 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 737 | }, arguments) }; 738 | imports.wbg.__wbg_data_dbff09eb89176161 = function(arg0, arg1) { 739 | var ret = getObject(arg1).data; 740 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 741 | var len0 = WASM_VECTOR_LEN; 742 | getInt32Memory0()[arg0 / 4 + 1] = len0; 743 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 744 | }; 745 | imports.wbg.__wbg_setProperty_1460c660bc329763 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { 746 | getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); 747 | }, arguments) }; 748 | imports.wbg.__wbg_type_a6fcda966902940d = function(arg0, arg1) { 749 | var ret = getObject(arg1).type; 750 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 751 | var len0 = WASM_VECTOR_LEN; 752 | getInt32Memory0()[arg0 / 4 + 1] = len0; 753 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 754 | }; 755 | imports.wbg.__wbg_clientX_97ff0f5c7b19e687 = function(arg0) { 756 | var ret = getObject(arg0).clientX; 757 | return ret; 758 | }; 759 | imports.wbg.__wbg_clientY_cacd4a7e44b9719b = function(arg0) { 760 | var ret = getObject(arg0).clientY; 761 | return ret; 762 | }; 763 | imports.wbg.__wbg_ctrlKey_9761d22fa42f09c0 = function(arg0) { 764 | var ret = getObject(arg0).ctrlKey; 765 | return ret; 766 | }; 767 | imports.wbg.__wbg_metaKey_e6b9e0aa35aa2974 = function(arg0) { 768 | var ret = getObject(arg0).metaKey; 769 | return ret; 770 | }; 771 | imports.wbg.__wbg_button_a02c0467d38e8338 = function(arg0) { 772 | var ret = getObject(arg0).button; 773 | return ret; 774 | }; 775 | imports.wbg.__wbg_getItem_77fb9d4666f3b93a = function() { return handleError(function (arg0, arg1, arg2, arg3) { 776 | var ret = getObject(arg1).getItem(getStringFromWasm0(arg2, arg3)); 777 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 778 | var len0 = WASM_VECTOR_LEN; 779 | getInt32Memory0()[arg0 / 4 + 1] = len0; 780 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 781 | }, arguments) }; 782 | imports.wbg.__wbg_setItem_b0c4561489dffecd = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { 783 | getObject(arg0).setItem(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); 784 | }, arguments) }; 785 | imports.wbg.__wbg_body_78ae4fd43b446013 = function(arg0) { 786 | var ret = getObject(arg0).body; 787 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 788 | }; 789 | imports.wbg.__wbg_createElement_86c152812a141a62 = function() { return handleError(function (arg0, arg1, arg2) { 790 | var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2)); 791 | return addHeapObject(ret); 792 | }, arguments) }; 793 | imports.wbg.__wbg_getElementById_f3e94458ce77f0d0 = function(arg0, arg1, arg2) { 794 | var ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2)); 795 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 796 | }; 797 | imports.wbg.__wbg_setid_681bb5a14c3d5850 = function(arg0, arg1, arg2) { 798 | getObject(arg0).id = getStringFromWasm0(arg1, arg2); 799 | }; 800 | imports.wbg.__wbg_scrollLeft_e79152b1f5d86671 = function(arg0) { 801 | var ret = getObject(arg0).scrollLeft; 802 | return ret; 803 | }; 804 | imports.wbg.__wbg_clientWidth_4d9e01af2b5b9f21 = function(arg0) { 805 | var ret = getObject(arg0).clientWidth; 806 | return ret; 807 | }; 808 | imports.wbg.__wbg_clientHeight_87c209f0cacf2e97 = function(arg0) { 809 | var ret = getObject(arg0).clientHeight; 810 | return ret; 811 | }; 812 | imports.wbg.__wbg_getBoundingClientRect_2fba0402ea2a6ec4 = function(arg0) { 813 | var ret = getObject(arg0).getBoundingClientRect(); 814 | return addHeapObject(ret); 815 | }; 816 | imports.wbg.__wbg_instanceof_WebGlRenderingContext_101b938bec1286a3 = function(arg0) { 817 | var ret = getObject(arg0) instanceof WebGLRenderingContext; 818 | return ret; 819 | }; 820 | imports.wbg.__wbg_drawingBufferWidth_8b0c2b31d9d6eee7 = function(arg0) { 821 | var ret = getObject(arg0).drawingBufferWidth; 822 | return ret; 823 | }; 824 | imports.wbg.__wbg_drawingBufferHeight_f62678018bab567c = function(arg0) { 825 | var ret = getObject(arg0).drawingBufferHeight; 826 | return ret; 827 | }; 828 | imports.wbg.__wbg_bufferData_6beb22ecb30c1316 = function(arg0, arg1, arg2, arg3) { 829 | getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0); 830 | }; 831 | imports.wbg.__wbg_bufferData_2f9be23b37e5a1a4 = function(arg0, arg1, arg2, arg3, arg4) { 832 | getObject(arg0).bufferData(arg1 >>> 0, getArrayU8FromWasm0(arg2, arg3), arg4 >>> 0); 833 | }; 834 | imports.wbg.__wbg_texImage2D_712c56fe5a9825ed = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { 835 | getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10)); 836 | }, arguments) }; 837 | imports.wbg.__wbg_activeTexture_b34aca0c2110966c = function(arg0, arg1) { 838 | getObject(arg0).activeTexture(arg1 >>> 0); 839 | }; 840 | imports.wbg.__wbg_attachShader_eaa824fd5b37a770 = function(arg0, arg1, arg2) { 841 | getObject(arg0).attachShader(getObject(arg1), getObject(arg2)); 842 | }; 843 | imports.wbg.__wbg_bindBuffer_2ca7e1c18819ecb2 = function(arg0, arg1, arg2) { 844 | getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2)); 845 | }; 846 | imports.wbg.__wbg_bindFramebuffer_c9f468afa9d42a5f = function(arg0, arg1, arg2) { 847 | getObject(arg0).bindFramebuffer(arg1 >>> 0, getObject(arg2)); 848 | }; 849 | imports.wbg.__wbg_bindTexture_edd827f3dba6038e = function(arg0, arg1, arg2) { 850 | getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2)); 851 | }; 852 | imports.wbg.__wbg_blendFunc_d5ab9f0ff5a40a48 = function(arg0, arg1, arg2) { 853 | getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0); 854 | }; 855 | imports.wbg.__wbg_clear_da26620d46f0a11a = function(arg0, arg1) { 856 | getObject(arg0).clear(arg1 >>> 0); 857 | }; 858 | imports.wbg.__wbg_clearColor_cbf22f8faa5a52c1 = function(arg0, arg1, arg2, arg3, arg4) { 859 | getObject(arg0).clearColor(arg1, arg2, arg3, arg4); 860 | }; 861 | imports.wbg.__wbg_compileShader_8fb70a472f32552c = function(arg0, arg1) { 862 | getObject(arg0).compileShader(getObject(arg1)); 863 | }; 864 | imports.wbg.__wbg_createBuffer_4802e2f0e1b1acdf = function(arg0) { 865 | var ret = getObject(arg0).createBuffer(); 866 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 867 | }; 868 | imports.wbg.__wbg_createFramebuffer_0157699cdc720b46 = function(arg0) { 869 | var ret = getObject(arg0).createFramebuffer(); 870 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 871 | }; 872 | imports.wbg.__wbg_createProgram_b1d94f4c7554d3a1 = function(arg0) { 873 | var ret = getObject(arg0).createProgram(); 874 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 875 | }; 876 | imports.wbg.__wbg_createShader_da09e167692f0dc7 = function(arg0, arg1) { 877 | var ret = getObject(arg0).createShader(arg1 >>> 0); 878 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 879 | }; 880 | imports.wbg.__wbg_createTexture_bafc7c08393ae59d = function(arg0) { 881 | var ret = getObject(arg0).createTexture(); 882 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 883 | }; 884 | imports.wbg.__wbg_deleteBuffer_9c31f3452ba32db1 = function(arg0, arg1) { 885 | getObject(arg0).deleteBuffer(getObject(arg1)); 886 | }; 887 | imports.wbg.__wbg_deleteFramebuffer_0f43513bd6c6d986 = function(arg0, arg1) { 888 | getObject(arg0).deleteFramebuffer(getObject(arg1)); 889 | }; 890 | imports.wbg.__wbg_deleteProgram_a2c849932f79e7af = function(arg0, arg1) { 891 | getObject(arg0).deleteProgram(getObject(arg1)); 892 | }; 893 | imports.wbg.__wbg_deleteTexture_82d755a5ac828346 = function(arg0, arg1) { 894 | getObject(arg0).deleteTexture(getObject(arg1)); 895 | }; 896 | imports.wbg.__wbg_disable_b07faddb7d04349f = function(arg0, arg1) { 897 | getObject(arg0).disable(arg1 >>> 0); 898 | }; 899 | imports.wbg.__wbg_drawElements_8e8af4b6757fedce = function(arg0, arg1, arg2, arg3, arg4) { 900 | getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4); 901 | }; 902 | imports.wbg.__wbg_enable_d3d210aeb08eff52 = function(arg0, arg1) { 903 | getObject(arg0).enable(arg1 >>> 0); 904 | }; 905 | imports.wbg.__wbg_enableVertexAttribArray_d539e547495bea44 = function(arg0, arg1) { 906 | getObject(arg0).enableVertexAttribArray(arg1 >>> 0); 907 | }; 908 | imports.wbg.__wbg_framebufferTexture2D_923c6fc6645661bc = function(arg0, arg1, arg2, arg3, arg4, arg5) { 909 | getObject(arg0).framebufferTexture2D(arg1 >>> 0, arg2 >>> 0, arg3 >>> 0, getObject(arg4), arg5); 910 | }; 911 | imports.wbg.__wbg_getAttribLocation_706a0beabcdaebcf = function(arg0, arg1, arg2, arg3) { 912 | var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 913 | return ret; 914 | }; 915 | imports.wbg.__wbg_getExtension_045789240c50a108 = function() { return handleError(function (arg0, arg1, arg2) { 916 | var ret = getObject(arg0).getExtension(getStringFromWasm0(arg1, arg2)); 917 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 918 | }, arguments) }; 919 | imports.wbg.__wbg_getParameter_6412bd2d0602696d = function() { return handleError(function (arg0, arg1) { 920 | var ret = getObject(arg0).getParameter(arg1 >>> 0); 921 | return addHeapObject(ret); 922 | }, arguments) }; 923 | imports.wbg.__wbg_getProgramInfoLog_b60e82d52c200cbd = function(arg0, arg1, arg2) { 924 | var ret = getObject(arg1).getProgramInfoLog(getObject(arg2)); 925 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 926 | var len0 = WASM_VECTOR_LEN; 927 | getInt32Memory0()[arg0 / 4 + 1] = len0; 928 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 929 | }; 930 | imports.wbg.__wbg_getProgramParameter_229c193895936bbe = function(arg0, arg1, arg2) { 931 | var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0); 932 | return addHeapObject(ret); 933 | }; 934 | imports.wbg.__wbg_getShaderInfoLog_ba51160c01b98360 = function(arg0, arg1, arg2) { 935 | var ret = getObject(arg1).getShaderInfoLog(getObject(arg2)); 936 | var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 937 | var len0 = WASM_VECTOR_LEN; 938 | getInt32Memory0()[arg0 / 4 + 1] = len0; 939 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 940 | }; 941 | imports.wbg.__wbg_getShaderParameter_dadc55c10928575d = function(arg0, arg1, arg2) { 942 | var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0); 943 | return addHeapObject(ret); 944 | }; 945 | imports.wbg.__wbg_getUniformLocation_c3b3570b4632cc5c = function(arg0, arg1, arg2, arg3) { 946 | var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); 947 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 948 | }; 949 | imports.wbg.__wbg_linkProgram_7080c84b0233cea2 = function(arg0, arg1) { 950 | getObject(arg0).linkProgram(getObject(arg1)); 951 | }; 952 | imports.wbg.__wbg_pixelStorei_3cd96723ae22a5c6 = function(arg0, arg1, arg2) { 953 | getObject(arg0).pixelStorei(arg1 >>> 0, arg2); 954 | }; 955 | imports.wbg.__wbg_scissor_35fe98c7da06091c = function(arg0, arg1, arg2, arg3, arg4) { 956 | getObject(arg0).scissor(arg1, arg2, arg3, arg4); 957 | }; 958 | imports.wbg.__wbg_shaderSource_67b991301db003d0 = function(arg0, arg1, arg2, arg3) { 959 | getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3)); 960 | }; 961 | imports.wbg.__wbg_texParameteri_bd724f6a5ad0cbbc = function(arg0, arg1, arg2, arg3) { 962 | getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3); 963 | }; 964 | imports.wbg.__wbg_uniform1i_0811c29c0eebe191 = function(arg0, arg1, arg2) { 965 | getObject(arg0).uniform1i(getObject(arg1), arg2); 966 | }; 967 | imports.wbg.__wbg_uniform2f_c4c110dee7f069e7 = function(arg0, arg1, arg2, arg3) { 968 | getObject(arg0).uniform2f(getObject(arg1), arg2, arg3); 969 | }; 970 | imports.wbg.__wbg_useProgram_b72b0bfcbc720fa9 = function(arg0, arg1) { 971 | getObject(arg0).useProgram(getObject(arg1)); 972 | }; 973 | imports.wbg.__wbg_vertexAttribPointer_b5cb524c6fe9eec8 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) { 974 | getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6); 975 | }; 976 | imports.wbg.__wbg_viewport_89af3aceb7036a2c = function(arg0, arg1, arg2, arg3, arg4) { 977 | getObject(arg0).viewport(arg1, arg2, arg3, arg4); 978 | }; 979 | imports.wbg.__wbg_error_cc38ce2b4b661e1d = function(arg0) { 980 | console.error(getObject(arg0)); 981 | }; 982 | imports.wbg.__wbg_log_3445347661d4505e = function(arg0) { 983 | console.log(getObject(arg0)); 984 | }; 985 | imports.wbg.__wbg_warn_5ec7c7c02d0b3841 = function(arg0) { 986 | console.warn(getObject(arg0)); 987 | }; 988 | imports.wbg.__wbg_scrollTop_14114fee3506489f = function(arg0) { 989 | var ret = getObject(arg0).scrollTop; 990 | return ret; 991 | }; 992 | imports.wbg.__wbg_hidden_cf2bd9859a26899c = function(arg0) { 993 | var ret = getObject(arg0).hidden; 994 | return ret; 995 | }; 996 | imports.wbg.__wbg_sethidden_8e35dd2030c5f20a = function(arg0, arg1) { 997 | getObject(arg0).hidden = arg1 !== 0; 998 | }; 999 | imports.wbg.__wbg_style_c88e323890d3a091 = function(arg0) { 1000 | var ret = getObject(arg0).style; 1001 | return addHeapObject(ret); 1002 | }; 1003 | imports.wbg.__wbg_offsetTop_83b2934370041fae = function(arg0) { 1004 | var ret = getObject(arg0).offsetTop; 1005 | return ret; 1006 | }; 1007 | imports.wbg.__wbg_offsetLeft_d6d050965faa87a8 = function(arg0) { 1008 | var ret = getObject(arg0).offsetLeft; 1009 | return ret; 1010 | }; 1011 | imports.wbg.__wbg_offsetWidth_69cd6669725b154f = function(arg0) { 1012 | var ret = getObject(arg0).offsetWidth; 1013 | return ret; 1014 | }; 1015 | imports.wbg.__wbg_blur_0bae1ed9ffb0b918 = function() { return handleError(function (arg0) { 1016 | getObject(arg0).blur(); 1017 | }, arguments) }; 1018 | imports.wbg.__wbg_focus_00530e359f44fc6e = function() { return handleError(function (arg0) { 1019 | getObject(arg0).focus(); 1020 | }, arguments) }; 1021 | imports.wbg.__wbg_clipboardData_d717f7cf398c0dd9 = function(arg0) { 1022 | var ret = getObject(arg0).clipboardData; 1023 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 1024 | }; 1025 | imports.wbg.__wbg_dataTransfer_ebba35c1049e694f = function(arg0) { 1026 | var ret = getObject(arg0).dataTransfer; 1027 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 1028 | }; 1029 | imports.wbg.__wbg_addEventListener_52721772cc0a7f30 = function() { return handleError(function (arg0, arg1, arg2, arg3) { 1030 | getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3)); 1031 | }, arguments) }; 1032 | imports.wbg.__wbg_deltaX_8cfc6cd15e97d97c = function(arg0) { 1033 | var ret = getObject(arg0).deltaX; 1034 | return ret; 1035 | }; 1036 | imports.wbg.__wbg_deltaY_080604c20160c0e8 = function(arg0) { 1037 | var ret = getObject(arg0).deltaY; 1038 | return ret; 1039 | }; 1040 | imports.wbg.__wbg_deltaMode_c5ec1ee518ea0a08 = function(arg0) { 1041 | var ret = getObject(arg0).deltaMode; 1042 | return ret; 1043 | }; 1044 | imports.wbg.__wbg_instanceof_HtmlInputElement_8cafe5f30dfdb6bc = function(arg0) { 1045 | var ret = getObject(arg0) instanceof HTMLInputElement; 1046 | return ret; 1047 | }; 1048 | imports.wbg.__wbg_setautofocus_5d3aec51de5021e2 = function(arg0, arg1) { 1049 | getObject(arg0).autofocus = arg1 !== 0; 1050 | }; 1051 | imports.wbg.__wbg_setsize_9ec16303ce038acb = function(arg0, arg1) { 1052 | getObject(arg0).size = arg1 >>> 0; 1053 | }; 1054 | imports.wbg.__wbg_value_0627d4b1c27534e6 = function(arg0, arg1) { 1055 | var ret = getObject(arg1).value; 1056 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 1057 | var len0 = WASM_VECTOR_LEN; 1058 | getInt32Memory0()[arg0 / 4 + 1] = len0; 1059 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 1060 | }; 1061 | imports.wbg.__wbg_setvalue_2459f62386b6967f = function(arg0, arg1, arg2) { 1062 | getObject(arg0).value = getStringFromWasm0(arg1, arg2); 1063 | }; 1064 | imports.wbg.__wbg_writeText_3b86a6dbc18b261b = function(arg0, arg1, arg2) { 1065 | var ret = getObject(arg0).writeText(getStringFromWasm0(arg1, arg2)); 1066 | return addHeapObject(ret); 1067 | }; 1068 | imports.wbg.__wbg_items_0e0d8664cb0c227c = function(arg0) { 1069 | var ret = getObject(arg0).items; 1070 | return addHeapObject(ret); 1071 | }; 1072 | imports.wbg.__wbg_files_d148fafe4f8ef096 = function(arg0) { 1073 | var ret = getObject(arg0).files; 1074 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 1075 | }; 1076 | imports.wbg.__wbg_getData_a4934f84b4074e8b = function() { return handleError(function (arg0, arg1, arg2, arg3) { 1077 | var ret = getObject(arg1).getData(getStringFromWasm0(arg2, arg3)); 1078 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 1079 | var len0 = WASM_VECTOR_LEN; 1080 | getInt32Memory0()[arg0 / 4 + 1] = len0; 1081 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 1082 | }, arguments) }; 1083 | imports.wbg.__wbg_length_b3892c671bcff0a9 = function(arg0) { 1084 | var ret = getObject(arg0).length; 1085 | return ret; 1086 | }; 1087 | imports.wbg.__wbg_get_eb708b1d3ad92ce5 = function(arg0, arg1) { 1088 | var ret = getObject(arg0)[arg1 >>> 0]; 1089 | return isLikeNone(ret) ? 0 : addHeapObject(ret); 1090 | }; 1091 | imports.wbg.__wbg_matches_76fae292b8cd60a6 = function(arg0) { 1092 | var ret = getObject(arg0).matches; 1093 | return ret; 1094 | }; 1095 | imports.wbg.__wbg_now_559193109055ebad = function(arg0) { 1096 | var ret = getObject(arg0).now(); 1097 | return ret; 1098 | }; 1099 | imports.wbg.__wbg_identifier_87ee1c4654593a75 = function(arg0) { 1100 | var ret = getObject(arg0).identifier; 1101 | return ret; 1102 | }; 1103 | imports.wbg.__wbg_pageX_e47dc88281930930 = function(arg0) { 1104 | var ret = getObject(arg0).pageX; 1105 | return ret; 1106 | }; 1107 | imports.wbg.__wbg_pageY_b6b579adcea2948f = function(arg0) { 1108 | var ret = getObject(arg0).pageY; 1109 | return ret; 1110 | }; 1111 | imports.wbg.__wbg_force_c47d39a3ad56c12f = function(arg0) { 1112 | var ret = getObject(arg0).force; 1113 | return ret; 1114 | }; 1115 | imports.wbg.__wbg_newnoargs_be86524d73f67598 = function(arg0, arg1) { 1116 | var ret = new Function(getStringFromWasm0(arg0, arg1)); 1117 | return addHeapObject(ret); 1118 | }; 1119 | imports.wbg.__wbg_call_888d259a5fefc347 = function() { return handleError(function (arg0, arg1) { 1120 | var ret = getObject(arg0).call(getObject(arg1)); 1121 | return addHeapObject(ret); 1122 | }, arguments) }; 1123 | imports.wbg.__wbg_resolve_d23068002f584f22 = function(arg0) { 1124 | var ret = Promise.resolve(getObject(arg0)); 1125 | return addHeapObject(ret); 1126 | }; 1127 | imports.wbg.__wbg_then_2fcac196782070cc = function(arg0, arg1) { 1128 | var ret = getObject(arg0).then(getObject(arg1)); 1129 | return addHeapObject(ret); 1130 | }; 1131 | imports.wbg.__wbg_then_8c2d62e8ae5978f7 = function(arg0, arg1, arg2) { 1132 | var ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); 1133 | return addHeapObject(ret); 1134 | }; 1135 | imports.wbg.__wbg_self_c6fbdfc2918d5e58 = function() { return handleError(function () { 1136 | var ret = self.self; 1137 | return addHeapObject(ret); 1138 | }, arguments) }; 1139 | imports.wbg.__wbg_window_baec038b5ab35c54 = function() { return handleError(function () { 1140 | var ret = window.window; 1141 | return addHeapObject(ret); 1142 | }, arguments) }; 1143 | imports.wbg.__wbg_globalThis_3f735a5746d41fbd = function() { return handleError(function () { 1144 | var ret = globalThis.globalThis; 1145 | return addHeapObject(ret); 1146 | }, arguments) }; 1147 | imports.wbg.__wbg_global_1bc0b39582740e95 = function() { return handleError(function () { 1148 | var ret = global.global; 1149 | return addHeapObject(ret); 1150 | }, arguments) }; 1151 | imports.wbg.__wbindgen_is_undefined = function(arg0) { 1152 | var ret = getObject(arg0) === undefined; 1153 | return ret; 1154 | }; 1155 | imports.wbg.__wbg_buffer_397eaa4d72ee94dd = function(arg0) { 1156 | var ret = getObject(arg0).buffer; 1157 | return addHeapObject(ret); 1158 | }; 1159 | imports.wbg.__wbg_new_99c38feff948285c = function(arg0) { 1160 | var ret = new Int16Array(getObject(arg0)); 1161 | return addHeapObject(ret); 1162 | }; 1163 | imports.wbg.__wbg_new_a7ce447f15ff496f = function(arg0) { 1164 | var ret = new Uint8Array(getObject(arg0)); 1165 | return addHeapObject(ret); 1166 | }; 1167 | imports.wbg.__wbg_set_969ad0a60e51d320 = function(arg0, arg1, arg2) { 1168 | getObject(arg0).set(getObject(arg1), arg2 >>> 0); 1169 | }; 1170 | imports.wbg.__wbg_length_1eb8fc608a0d4cdb = function(arg0) { 1171 | var ret = getObject(arg0).length; 1172 | return ret; 1173 | }; 1174 | imports.wbg.__wbg_new_8b45a9becdb89691 = function(arg0) { 1175 | var ret = new Float32Array(getObject(arg0)); 1176 | return addHeapObject(ret); 1177 | }; 1178 | imports.wbg.__wbg_subarray_5208d7c1876d9ee7 = function(arg0, arg1, arg2) { 1179 | var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); 1180 | return addHeapObject(ret); 1181 | }; 1182 | imports.wbg.__wbg_subarray_8b658422a224f479 = function(arg0, arg1, arg2) { 1183 | var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); 1184 | return addHeapObject(ret); 1185 | }; 1186 | imports.wbg.__wbg_subarray_9e3273b330900f8c = function(arg0, arg1, arg2) { 1187 | var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); 1188 | return addHeapObject(ret); 1189 | }; 1190 | imports.wbg.__wbg_instanceof_Memory_625744f21df3a5ec = function(arg0) { 1191 | var ret = getObject(arg0) instanceof WebAssembly.Memory; 1192 | return ret; 1193 | }; 1194 | imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { 1195 | var ret = debugString(getObject(arg1)); 1196 | var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); 1197 | var len0 = WASM_VECTOR_LEN; 1198 | getInt32Memory0()[arg0 / 4 + 1] = len0; 1199 | getInt32Memory0()[arg0 / 4 + 0] = ptr0; 1200 | }; 1201 | imports.wbg.__wbindgen_throw = function(arg0, arg1) { 1202 | throw new Error(getStringFromWasm0(arg0, arg1)); 1203 | }; 1204 | imports.wbg.__wbindgen_rethrow = function(arg0) { 1205 | throw takeObject(arg0); 1206 | }; 1207 | imports.wbg.__wbindgen_memory = function() { 1208 | var ret = wasm.memory; 1209 | return addHeapObject(ret); 1210 | }; 1211 | imports.wbg.__wbindgen_closure_wrapper565 = function(arg0, arg1, arg2) { 1212 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_26); 1213 | return addHeapObject(ret); 1214 | }; 1215 | imports.wbg.__wbindgen_closure_wrapper566 = function(arg0, arg1, arg2) { 1216 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_29); 1217 | return addHeapObject(ret); 1218 | }; 1219 | imports.wbg.__wbindgen_closure_wrapper568 = function(arg0, arg1, arg2) { 1220 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_32); 1221 | return addHeapObject(ret); 1222 | }; 1223 | imports.wbg.__wbindgen_closure_wrapper570 = function(arg0, arg1, arg2) { 1224 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_35); 1225 | return addHeapObject(ret); 1226 | }; 1227 | imports.wbg.__wbindgen_closure_wrapper573 = function(arg0, arg1, arg2) { 1228 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_38); 1229 | return addHeapObject(ret); 1230 | }; 1231 | imports.wbg.__wbindgen_closure_wrapper575 = function(arg0, arg1, arg2) { 1232 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_41); 1233 | return addHeapObject(ret); 1234 | }; 1235 | imports.wbg.__wbindgen_closure_wrapper577 = function(arg0, arg1, arg2) { 1236 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_44); 1237 | return addHeapObject(ret); 1238 | }; 1239 | imports.wbg.__wbindgen_closure_wrapper579 = function(arg0, arg1, arg2) { 1240 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_47); 1241 | return addHeapObject(ret); 1242 | }; 1243 | imports.wbg.__wbindgen_closure_wrapper581 = function(arg0, arg1, arg2) { 1244 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_50); 1245 | return addHeapObject(ret); 1246 | }; 1247 | imports.wbg.__wbindgen_closure_wrapper583 = function(arg0, arg1, arg2) { 1248 | var ret = makeMutClosure(arg0, arg1, 158, __wbg_adapter_53); 1249 | return addHeapObject(ret); 1250 | }; 1251 | imports.wbg.__wbindgen_closure_wrapper668 = function(arg0, arg1, arg2) { 1252 | var ret = makeMutClosure(arg0, arg1, 195, __wbg_adapter_56); 1253 | return addHeapObject(ret); 1254 | }; 1255 | 1256 | if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { 1257 | input = fetch(input); 1258 | } 1259 | 1260 | 1261 | 1262 | const { instance, module } = await load(await input, imports); 1263 | 1264 | wasm = instance.exports; 1265 | init.__wbindgen_wasm_module = module; 1266 | 1267 | return wasm; 1268 | } 1269 | 1270 | wasm_bindgen = Object.assign(init, __exports); 1271 | 1272 | })(); 1273 | -------------------------------------------------------------------------------- /docs/eframe_template_bg.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rektdeckard/y-reader/0e528828b20e1422940d2c84b4caabb84e80e398/docs/eframe_template_bg.wasm -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rektdeckard/y-reader/0e528828b20e1422940d2c84b4caabb84e80e398/docs/favicon.ico -------------------------------------------------------------------------------- /docs/icon-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rektdeckard/y-reader/0e528828b20e1422940d2c84b4caabb84e80e398/docs/icon-256.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | eframe template 10 | 92 | 93 | 104 | 105 | 106 | 107 | 108 | 109 |
110 | Loading…   111 |
112 |
113 | 114 | 126 | 127 | 128 | 129 | 130 | 148 | 149 | 150 | 151 | 152 | 153 | -------------------------------------------------------------------------------- /docs/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Egui Template PWA", 3 | "short_name": "egui-template-pwa", 4 | "icons": [{ 5 | "src": "./icon-256.png", 6 | "sizes": "256x256", 7 | "type": "image/png" 8 | }], 9 | "lang": "en-US", 10 | "start_url": "./index.html", 11 | "display": "standalone", 12 | "background_color": "white", 13 | "theme_color": "white" 14 | } 15 | -------------------------------------------------------------------------------- /docs/sw.js: -------------------------------------------------------------------------------- 1 | var cacheName = 'egui-template-pwa'; 2 | var filesToCache = [ 3 | './', 4 | './index.html', 5 | './eframe_template.js', 6 | './eframe_template_bg.wasm', 7 | ]; 8 | 9 | /* Start the service worker and cache all of the app's content */ 10 | self.addEventListener('install', function (e) { 11 | e.waitUntil( 12 | caches.open(cacheName).then(function (cache) { 13 | return cache.addAll(filesToCache); 14 | }) 15 | ); 16 | }); 17 | 18 | /* Serve cached content when offline */ 19 | self.addEventListener('fetch', function (e) { 20 | e.respondWith( 21 | caches.match(e.request).then(function (response) { 22 | return response || fetch(e.request); 23 | }) 24 | ); 25 | }); 26 | -------------------------------------------------------------------------------- /meta/y-reader-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rektdeckard/y-reader/0e528828b20e1422940d2c84b4caabb84e80e398/meta/y-reader-demo.gif -------------------------------------------------------------------------------- /setup_web.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -eu 3 | 4 | # Pre-requisites: 5 | rustup target add wasm32-unknown-unknown 6 | cargo install wasm-bindgen-cli 7 | cargo update -p wasm-bindgen 8 | 9 | # For local tests with `./start_server`: 10 | cargo install basic-http-server 11 | -------------------------------------------------------------------------------- /src/app.rs: -------------------------------------------------------------------------------- 1 | use eframe::{egui, epi}; 2 | use hacker_news::model::firebase::Comment; 3 | use hacker_news::{client::json_client::JsonClient, model::firebase::Item, model::firebase::Story}; 4 | use html_escape; 5 | use lazy_static::lazy_static; 6 | use regex::Regex; 7 | use std::collections::HashMap; 8 | use std::sync::{Arc, Mutex}; 9 | use std::thread; 10 | use std::time::{Duration, SystemTime, UNIX_EPOCH}; 11 | use time_humanize::HumanTime; 12 | use url::Url; 13 | 14 | const BASE_URL: &'static str = "https://news.ycombinator.com"; 15 | const REFETCH_DELAY_SECONDS: u64 = 60; 16 | const WINDOW: usize = 50; 17 | 18 | #[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))] 19 | struct Auth { 20 | username: String, 21 | password: String, 22 | } 23 | 24 | #[derive(PartialEq)] 25 | enum Tab { 26 | Top, 27 | New, 28 | Show, 29 | } 30 | 31 | #[derive(Debug)] 32 | #[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))] 33 | struct Data { 34 | top: HashMap, 35 | top_ids: Vec, 36 | top_page: usize, 37 | new: HashMap, 38 | new_ids: Vec, 39 | new_page: usize, 40 | show: HashMap, 41 | show_ids: Vec, 42 | show_page: usize, 43 | comments: HashMap, 44 | } 45 | 46 | impl Data { 47 | fn new() -> Self { 48 | Self { 49 | top: HashMap::new(), 50 | top_ids: Vec::new(), 51 | top_page: 0, 52 | new: HashMap::new(), 53 | new_ids: Vec::new(), 54 | new_page: 0, 55 | show: HashMap::new(), 56 | show_ids: Vec::new(), 57 | show_page: 0, 58 | comments: HashMap::new(), 59 | } 60 | } 61 | } 62 | 63 | #[derive(Debug, Clone)] 64 | #[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))] 65 | enum CommentState { 66 | Loading, 67 | Loaded(LocalComment), 68 | Errored, 69 | } 70 | 71 | #[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))] 72 | struct LocalStory { 73 | id: hacker_news::model::Id, 74 | by: Option, 75 | time: u64, 76 | kids: Option>, 77 | score: Option, 78 | title: Option, 79 | url: Option, 80 | } 81 | 82 | impl LocalStory { 83 | fn from_lib(story: &Story) -> Self { 84 | Self { 85 | id: story.id.clone(), 86 | by: story.by.clone(), 87 | time: story.time, 88 | kids: story.kids.clone(), 89 | score: story.score.clone(), 90 | title: story.title.clone(), 91 | url: story.url.clone(), 92 | } 93 | } 94 | } 95 | 96 | #[derive(Debug, Clone)] 97 | #[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))] 98 | struct LocalComment { 99 | id: hacker_news::model::Id, 100 | by: Option, 101 | time: u64, 102 | kids: Option>, 103 | // parent: Option, 104 | text: Option, 105 | } 106 | 107 | impl LocalComment { 108 | fn from_lib(comment: &Comment) -> Self { 109 | Self { 110 | id: comment.id.clone(), 111 | by: comment.by.clone(), 112 | time: comment.time, 113 | kids: comment.kids.clone(), 114 | // parent: comment.parent.clone(), 115 | text: comment.text.clone(), 116 | } 117 | } 118 | } 119 | 120 | /// We derive Deserialize/Serialize so we can persist app state on shutdown. 121 | #[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))] 122 | #[cfg_attr(feature = "persistence", serde(default))] // if we add new fields, give them default values when deserializing old state 123 | pub struct YReader { 124 | auth: Option, 125 | authed: bool, 126 | show_login: bool, 127 | show_settings: bool, 128 | // this how you opt-out of serialization of a member 129 | #[cfg_attr(feature = "persistence", serde(skip))] 130 | tab: Tab, 131 | data: Arc>, 132 | } 133 | 134 | impl YReader { 135 | fn init(&self) { 136 | let data_top = Arc::clone(&self.data); 137 | thread::spawn(move || loop { 138 | let client = JsonClient::new(); 139 | let ids = client.top_stories(); 140 | if let Ok(ids) = ids { 141 | let page; 142 | { 143 | let data = data_top.lock().unwrap(); 144 | page = data.top_page; 145 | } 146 | for (idx, id) in ids.iter().take(WINDOW * (page + 1)).enumerate() { 147 | if let Ok(item) = client.item(*id) { 148 | let mut data = data_top.lock().unwrap(); 149 | data.top.insert(idx, item); 150 | } 151 | } 152 | let mut data = data_top.lock().unwrap(); 153 | data.top_ids = ids; 154 | data.top_page = (data.top_page + 1) % 2; 155 | } 156 | thread::sleep(Duration::from_secs(REFETCH_DELAY_SECONDS)); 157 | }); 158 | 159 | let data_new = Arc::clone(&self.data); 160 | thread::spawn(move || loop { 161 | let client = JsonClient::new(); 162 | let ids = client.new_stories(); 163 | if let Ok(ids) = ids { 164 | let page; 165 | { 166 | let data = data_new.lock().unwrap(); 167 | page = data.new_page; 168 | } 169 | for (idx, id) in ids.iter().take(WINDOW * (page + 1)).enumerate() { 170 | if let Ok(item) = client.item(*id) { 171 | let mut data = data_new.lock().unwrap(); 172 | data.new.insert(idx, item); 173 | } 174 | } 175 | let mut data = data_new.lock().unwrap(); 176 | data.new_ids = ids; 177 | data.new_page = (data.new_page + 1) % 2; 178 | } 179 | thread::sleep(Duration::from_secs(REFETCH_DELAY_SECONDS)); 180 | }); 181 | 182 | let data_show = Arc::clone(&self.data); 183 | thread::spawn(move || loop { 184 | let client = JsonClient::new(); 185 | let ids = client.show_stories(); 186 | if let Ok(ids) = ids { 187 | let page; 188 | { 189 | let data = data_show.lock().unwrap(); 190 | page = data.show_page; 191 | } 192 | for (idx, id) in ids.iter().take(WINDOW * (page + 1)).enumerate() { 193 | if let Ok(item) = client.item(*id) { 194 | let mut data = data_show.lock().unwrap(); 195 | data.show.insert(idx, item); 196 | } 197 | } 198 | let mut data = data_show.lock().unwrap(); 199 | data.show_ids = ids; 200 | data.show_page = (data.show_page + 1) % 2; 201 | } 202 | thread::sleep(Duration::from_secs(REFETCH_DELAY_SECONDS)); 203 | }); 204 | } 205 | 206 | fn render_stories(&mut self, ui: &mut egui::Ui) { 207 | egui::containers::ScrollArea::vertical() 208 | .auto_shrink([false, false]) 209 | .show(ui, |ui| { 210 | let current = self.data.lock().unwrap(); 211 | let items = match self.tab { 212 | Tab::Top => ¤t.top, 213 | Tab::New => ¤t.new, 214 | Tab::Show => ¤t.show, 215 | }; 216 | 217 | let mut stories: Vec<(usize, LocalStory)> = items 218 | .iter() 219 | .filter_map(|(idx, i)| match i { 220 | Item::Story(s) => Some((*idx as usize, LocalStory::from_lib(s))), 221 | _ => None, 222 | }) 223 | .collect(); 224 | stories.sort_by(|(a, _), (b, _)| a.cmp(b)); 225 | std::mem::drop(current); 226 | 227 | stories.iter().for_each(|(idx, s)| { 228 | if let Some(title) = &s.title { 229 | if let Some(by) = &s.by { 230 | ui.horizontal_wrapped(|ui| { 231 | ui.label(egui::RichText::new(title).strong()); 232 | if let Some(url) = &s.url { 233 | if let Ok(u) = Url::parse(url) { 234 | ui.horizontal(|ui| { 235 | ui.spacing_mut().item_spacing.x = 0.0; 236 | ui.label("("); 237 | ui.hyperlink_to( 238 | u.domain() 239 | .and_then(|s| Some(s.to_string())) 240 | .unwrap_or(url.clone()), 241 | u.to_string(), 242 | ); 243 | ui.label(")"); 244 | }); 245 | } 246 | } 247 | }); 248 | 249 | ui.horizontal(|ui| { 250 | ui.spacing_mut().item_spacing.x = 2.5; 251 | ui.label(format!("{} points", &s.score.unwrap_or(0))); 252 | ui.add(egui::widgets::Separator::default().vertical()); 253 | ui.hyperlink_to(by, format!("{}/user?id={}", BASE_URL, by)); 254 | 255 | ui.add(egui::widgets::Separator::default().vertical()); 256 | 257 | let now = SystemTime::now() 258 | .duration_since(UNIX_EPOCH) 259 | .expect("oops") 260 | .as_secs(); 261 | 262 | ui.label(format!( 263 | "{}", 264 | HumanTime::from_seconds((s.time as i64) - (now as i64)) 265 | )); 266 | 267 | ui.hyperlink_to("↗", format!("{}/item?id={}", BASE_URL, s.id)); 268 | }); 269 | 270 | let kid_count = &s 271 | .kids 272 | .as_ref() 273 | .and_then(|k| Some(k.len())) 274 | .unwrap_or_default(); 275 | 276 | egui::containers::CollapsingHeader::new(format!( 277 | "{} Comment{}", 278 | kid_count, 279 | if *kid_count != 1 { "s" } else { "" } 280 | )) 281 | .enabled(*kid_count > 0) 282 | .id_source(format!("{}-{}", idx, s.id)) 283 | .show(ui, |ui| { 284 | if let Some(kids) = &s.kids { 285 | self.render_comments(ui, kids, by); 286 | } 287 | }); 288 | 289 | ui.separator(); 290 | } 291 | } 292 | }); 293 | 294 | // let margin = ui.visuals().clip_rect_margin; 295 | // let current_scroll = ui.clip_rect().top() - ui.min_rect().top() + margin; 296 | // let max_scroll = ui.min_rect().height() - ui.clip_rect().height() + 2.0 * margin; 297 | 298 | // if current_scroll == max_scroll { 299 | // println!("yuip"); 300 | // match self.tab { 301 | // Tab::Top => { 302 | // self.fetch_top(); 303 | // // DEADLOCK! 304 | // let mut data = self.data.lock().unwrap(); 305 | // data.top_page = (data.top_page + 1) % 4; 306 | // } 307 | // Tab::New => { 308 | // self.fetch_new(); 309 | // let mut data = self.data.lock().unwrap(); 310 | // data.new_page = (data.new_page + 1) % 4; 311 | // } 312 | // Tab::Show => {} 313 | // }; 314 | // } 315 | 316 | // ui.vertical_centered(|ui| { 317 | // let (page, count) = match self.tab { 318 | // Tab::Top => (self.top_page, self.top_ids.len()), 319 | // Tab::New => (self.new_page, self.new_ids.len()), 320 | // Tab::Show => (self.show_page, self.show_ids.len()), 321 | // }; 322 | // if count > 0 && WINDOW * page >= count { 323 | // ui.label("All done!"); 324 | // } else if ui.button("Load more").clicked() { 325 | // self.fetch_stories(); 326 | // } 327 | // }); 328 | }) 329 | } 330 | 331 | fn render_comments(&self, ui: &mut egui::Ui, kids: &Vec, op: &String) { 332 | let data = Arc::clone(&self.data); 333 | lazy_static! { 334 | static ref RE: Regex = 335 | Regex::new(r#"(.*?)"#).unwrap(); 336 | } 337 | 338 | for (i, k) in kids.iter().enumerate() { 339 | let comment: Option; 340 | { 341 | let data = data.lock().unwrap(); 342 | comment = data.comments.get(k).and_then(|c| Some(c.to_owned())); 343 | } 344 | 345 | match comment { 346 | Some(CommentState::Loading) => { 347 | ui.label("Loading..."); 348 | } 349 | Some(CommentState::Loaded(c)) => { 350 | ui.horizontal(|ui| { 351 | ui.spacing_mut().item_spacing.x = 2.5; 352 | if let Some(by) = &c.by { 353 | ui.spacing_mut().item_spacing.x = 4.; 354 | ui.hyperlink_to(by, format!("{}/user?id={}", BASE_URL, by)); 355 | 356 | if by.eq(op) { 357 | ui.code("op"); 358 | } 359 | } 360 | 361 | ui.add(egui::widgets::Separator::default().vertical()); 362 | 363 | let now = SystemTime::now() 364 | .duration_since(UNIX_EPOCH) 365 | .expect("oops") 366 | .as_secs(); 367 | 368 | ui.label(format!( 369 | "{}", 370 | HumanTime::from_seconds((c.time as i64) - (now as i64)) 371 | )); 372 | 373 | ui.hyperlink_to("↗", format!("{}/item?id={}", BASE_URL, c.id)); 374 | }); 375 | 376 | let text = c.text.to_owned().unwrap_or_default(); 377 | let decoded = html_escape::decode_html_entities(&text).to_string(); 378 | 379 | ui.horizontal_wrapped(|ui| { 380 | ui.spacing_mut().item_spacing.y = 10.; 381 | decoded.split("

").into_iter().for_each(|part| { 382 | if RE.is_match(part) { 383 | for piece in RE.captures_iter(part) { 384 | // TODO: include non-link text from this line 385 | if let Some(url) = &piece.get(1) { 386 | if let Some(label) = &piece.get(3) { 387 | ui.hyperlink_to(label.as_str(), url.as_str()); 388 | } else { 389 | ui.hyperlink(url.as_str()); 390 | } 391 | } 392 | } 393 | } else { 394 | ui.label(part); 395 | } 396 | 397 | ui.end_row(); 398 | }); 399 | }); 400 | 401 | let is_last = i == kids.len() - 1; 402 | if let Some(kids) = &c.kids { 403 | ui.add_space(2.); 404 | let kid_count = kids.len(); 405 | egui::containers::CollapsingHeader::new(format!( 406 | "{} Repl{}", 407 | kid_count, 408 | if kid_count == 1 { "y" } else { "ies" } 409 | )) 410 | .enabled(kid_count > 0) 411 | .id_source(c.id) 412 | .show(ui, |ui| { 413 | self.render_comments(ui, &kids, op); 414 | }); 415 | } 416 | 417 | ui.add_space(2.); 418 | if !is_last { 419 | ui.separator(); 420 | ui.add_space(2.); 421 | } 422 | } 423 | Some(CommentState::Errored) => { 424 | ui.label("Errored."); 425 | } 426 | _ => { 427 | ui.label("Starting load..."); 428 | let data = Arc::clone(&self.data); 429 | let id = k.clone(); 430 | 431 | { 432 | let mut data = data.lock().unwrap(); 433 | data.comments.insert(id, CommentState::Loading); 434 | } 435 | 436 | thread::spawn(move || { 437 | let client = JsonClient::new(); 438 | let comment = client.item(id); 439 | 440 | let mut data = data.lock().unwrap(); 441 | match comment { 442 | Ok(Item::Comment(c)) => { 443 | data.comments 444 | .insert(id, CommentState::Loaded(LocalComment::from_lib(&c))); 445 | } 446 | _ => { 447 | data.comments.insert(id, CommentState::Errored); 448 | } 449 | } 450 | }); 451 | } 452 | } 453 | } 454 | } 455 | 456 | // fn fetch_top(&self) { 457 | // let data_top = Arc::clone(&self.data); 458 | 459 | // thread::spawn(move || { 460 | // let client = JsonClient::new(); 461 | // let ids = client.top_stories(); 462 | // if let Ok(ids) = ids { 463 | // let page; 464 | // { 465 | // let data = data_top.lock().unwrap(); 466 | // page = data.top_page; 467 | // } 468 | // for (idx, id) in ids.iter().take(WINDOW * (page + 1)).enumerate() { 469 | // if let Ok(item) = client.item(*id) { 470 | // let mut data = data_top.lock().unwrap(); 471 | // data.top.insert(idx, item); 472 | // } 473 | // } 474 | // let mut data = data_top.lock().unwrap(); 475 | // data.top_ids = ids; 476 | // // data.top_page = (data.top_page + 1) % 4; 477 | // } 478 | // println!("Fetched top"); 479 | // }); 480 | // } 481 | 482 | // fn fetch_new(&self) { 483 | // let data_new = Arc::clone(&self.data); 484 | 485 | // thread::spawn(move || { 486 | // let client = JsonClient::new(); 487 | // let ids = client.new_stories(); 488 | // if let Ok(ids) = ids { 489 | // let page; 490 | // { 491 | // let data = data_new.lock().unwrap(); 492 | // page = data.new_page; 493 | // } 494 | // for (idx, id) in ids.iter().take(WINDOW * (page + 1)).enumerate() { 495 | // if let Ok(item) = client.item(*id) { 496 | // let mut data = data_new.lock().unwrap(); 497 | // data.new.insert(idx, item); 498 | // } 499 | // } 500 | // let mut data = data_new.lock().unwrap(); 501 | // data.new_ids = ids; 502 | // // data.new_page = (data.new_page + 1) % 4; 503 | // } 504 | // println!("Fetched new"); 505 | // }); 506 | // } 507 | } 508 | 509 | impl Default for YReader { 510 | fn default() -> Self { 511 | Self { 512 | auth: None, 513 | authed: false, 514 | show_login: false, 515 | show_settings: false, 516 | tab: Tab::Top, 517 | data: Arc::new(Mutex::new(Data::new())), 518 | } 519 | } 520 | } 521 | 522 | impl epi::App for YReader { 523 | fn name(&self) -> &str { 524 | "Y Reader" 525 | } 526 | 527 | /// Called once before the first frame. 528 | fn setup( 529 | &mut self, 530 | _ctx: &egui::CtxRef, 531 | _frame: &epi::Frame, 532 | _storage: Option<&dyn epi::Storage>, 533 | ) { 534 | // Load previous app state (if any). 535 | // Note that you must enable the `persistence` feature for this to work. 536 | #[cfg(feature = "persistence")] 537 | if let Some(storage) = _storage { 538 | *self = epi::get_value(storage, epi::APP_KEY).unwrap_or_default() 539 | } 540 | 541 | self.init(); 542 | } 543 | 544 | /// Called by the frame work to save state before shutdown. 545 | /// Note that you must enable the `persistence` feature for this to work. 546 | #[cfg(feature = "persistence")] 547 | fn save(&mut self, storage: &mut dyn epi::Storage) { 548 | epi::set_value(storage, epi::APP_KEY, self); 549 | } 550 | 551 | /// Called each time the UI needs repainting, which may be many times per second. 552 | /// Put your widgets into a `SidePanel`, `TopPanel`, `CentralPanel`, `Window` or `Area`. 553 | fn update(&mut self, ctx: &egui::CtxRef, _frame: &epi::Frame) { 554 | let Self { 555 | auth, 556 | authed, 557 | show_login, 558 | show_settings, 559 | tab, 560 | data: _, 561 | } = self; 562 | 563 | egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { 564 | lazy_static! { 565 | static ref SELECTION_STYLE: egui::style::Selection = egui::style::Selection { 566 | bg_fill: egui::Color32::from_rgb(215, 101, 46), 567 | stroke: egui::Stroke { 568 | width: 1., 569 | color: egui::Color32::WHITE, 570 | }, 571 | }; 572 | } 573 | ui.visuals_mut().selection = *SELECTION_STYLE; 574 | ui.spacing_mut().item_spacing.y = 4.; 575 | 576 | ui.horizontal_wrapped(|ui| { 577 | ui.heading("Y Reader"); 578 | 579 | ui.add(egui::widgets::Separator::default().vertical()); 580 | ui.selectable_value(tab, Tab::Top, "Top"); 581 | ui.selectable_value(tab, Tab::New, "New"); 582 | ui.selectable_value(tab, Tab::Show, "Show"); 583 | egui::widgets::global_dark_light_mode_switch(ui); 584 | 585 | ui.with_layout(egui::Layout::right_to_left(), |ui| { 586 | if ui.button("Settings").clicked() { 587 | *show_settings = true; 588 | } 589 | 590 | egui::Window::new("Settings") 591 | .open(show_settings) 592 | .vscroll(true) 593 | .show(ctx, |ui| { 594 | ctx.settings_ui(ui); 595 | }); 596 | 597 | if auth.is_none() || !*authed { 598 | if ui.button("Sign in").clicked() { 599 | *show_login = true; 600 | } 601 | } else { 602 | if let Some(a) = auth { 603 | let username = a.username.clone(); 604 | if ui.button("Sign out").clicked() { 605 | *auth = None; 606 | *authed = false; 607 | } 608 | ui.hyperlink_to( 609 | username.as_str(), 610 | format!("{}/user?id={}", BASE_URL, username), 611 | ); 612 | } 613 | } 614 | }); 615 | 616 | if *show_login { 617 | egui::Window::new("Sign in to Hacker News") 618 | .anchor(egui::Align2::CENTER_CENTER, egui::Vec2::default()) 619 | .auto_sized() 620 | .title_bar(false) 621 | .show(ctx, |ui| { 622 | if auth.is_none() { 623 | *auth = Some(Auth { 624 | username: Default::default(), 625 | password: Default::default(), 626 | }) 627 | } 628 | 629 | let Auth { username, password } = auth.as_mut().unwrap(); 630 | 631 | ui.add(egui::TextEdit::singleline(username).hint_text("Username")); 632 | ui.add( 633 | egui::TextEdit::singleline(password) 634 | .password(true) 635 | .hint_text("Password"), 636 | ); 637 | ui.horizontal(|ui| { 638 | if ui 639 | .add_enabled( 640 | !username.is_empty() && !password.is_empty(), 641 | egui::Button::new("Sign in"), 642 | ) 643 | .clicked() 644 | { 645 | *authed = true; 646 | *show_login = false; 647 | } 648 | if ui.button("Cancel").clicked() { 649 | *show_login = false; 650 | } 651 | }); 652 | }); 653 | } 654 | }); 655 | }); 656 | 657 | egui::TopBottomPanel::bottom("bottom_panel").show(ctx, |ui| { 658 | ui.centered_and_justified(|ui| { 659 | let data = &self.data.lock().unwrap(); 660 | let count = match self.tab { 661 | Tab::Top => data.top.len(), 662 | Tab::New => data.new.len(), 663 | Tab::Show => data.show.len(), 664 | }; 665 | ui.small(format!("{} items", count)); 666 | }); 667 | }); 668 | 669 | egui::CentralPanel::default().show(ctx, |ui| { 670 | // ui.visuals_mut().hyperlink_color = egui::Color32::from_rgb(255, 101, 0); 671 | ui.visuals_mut().hyperlink_color = egui::Color32::from_rgb(205, 91, 36); 672 | // The central panel the region left after adding TopPanel's and SidePanel's 673 | egui::warn_if_debug_build(ui); 674 | self.render_stories(ui); 675 | }); 676 | } 677 | } 678 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![forbid(unsafe_code)] 2 | #![cfg_attr(not(debug_assertions), deny(warnings))] // Forbid warnings in release builds 3 | #![warn(clippy::all, rust_2018_idioms)] 4 | 5 | mod app; 6 | pub use app::YReader; 7 | 8 | // ---------------------------------------------------------------------------- 9 | // When compiling for web: 10 | 11 | #[cfg(target_arch = "wasm32")] 12 | use eframe::wasm_bindgen::{self, prelude::*}; 13 | 14 | /// This is the entry-point for all the web-assembly. 15 | /// This is called once from the HTML. 16 | /// It loads the app, installs some callbacks, then returns. 17 | /// You can add more callbacks like this if you want to call in to your code. 18 | #[cfg(target_arch = "wasm32")] 19 | #[wasm_bindgen] 20 | pub fn start(canvas_id: &str) -> Result<(), eframe::wasm_bindgen::JsValue> { 21 | let app = YReader::default(); 22 | eframe::start_web(canvas_id, Box::new(app)) 23 | } 24 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![forbid(unsafe_code)] 2 | #![cfg_attr(not(debug_assertions), deny(warnings))] // Forbid warnings in release builds 3 | #![warn(clippy::all, rust_2018_idioms)] 4 | 5 | // When compiling natively: 6 | #[cfg(not(target_arch = "wasm32"))] 7 | fn main() { 8 | use eframe::egui::Vec2; 9 | 10 | let icon = image::open("assets/y_icon.png") 11 | .expect("Could not load icon") 12 | .to_rgba8(); 13 | let (icon_width, icon_height) = icon.dimensions(); 14 | 15 | let app = y_reader::YReader::default(); 16 | let mut native_options = eframe::NativeOptions::default(); 17 | native_options.initial_window_size = Some(Vec2::new(540., 960.)); 18 | // native_options.icon_data 19 | native_options.icon_data = Some(eframe::epi::IconData { 20 | width: icon_width, 21 | height: icon_height, 22 | rgba: icon.into_raw(), 23 | }); 24 | eframe::run_native(Box::new(app), native_options); 25 | } 26 | -------------------------------------------------------------------------------- /start_server.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -eu 3 | 4 | # Starts a local web-server that serves the contents of the `doc/` folder, 5 | # which is the folder to where the web version is compiled. 6 | 7 | cargo install basic-http-server 8 | 9 | echo "open http://localhost:8080" 10 | 11 | (cd docs && basic-http-server --addr 127.0.0.1:8080 .) 12 | # (cd docs && python3 -m http.server 8080 --bind 127.0.0.1) 13 | --------------------------------------------------------------------------------